ADD 1.添加调试工具;

main
wangbo 1 month ago
parent 1936bbe858
commit 2a270426a1

@ -54,26 +54,17 @@
enum DebugCommand
{
DEBUG_CONFIG_FACTORY_GET = 1, // 获取配置
DEBUG_CONFIG_FACTORY_SET = 2, // 设置配置
DEBUG_CONFIG_GLOBAL_SET = 3, /* 设备全局参数设置 */
DEBUG_CONFIG_GLOBAL_GET = 4, /* 设备全局参数获取 */
DEBUG_CONFIG_PORT_SET = 5, /* 设备端口参数设置 */
DEBUG_CONFIG_PORT_GET = 6, /* 设备端口参数获取 */
DEBUG_REBOOT = 7, // 重启
DEBUG_TIME_SET = 8, // 对时
DEBUG_CONFIG_FACTORY_GET = 1, /* 获取配置 */
DEBUG_CONFIG_FACTORY_SET = 2, /* 设置配置 */
DEBUG_CONFIG_GLOBAL_GET = 3, /* 设备全局参数获取 */
DEBUG_CONFIG_GLOBAL_SET = 4, /* 设备全局参数设置 */
DEBUG_CONFIG_PORT_GET = 5, /* 设备端口参数获取 */
DEBUG_CONFIG_PORT_SET = 6, /* 设备端口参数设置 */
DEBUG_UPGRADE_DATA = 7, /* 固件升级 */
DEBUG_DEVICE_STATUS = 8, /* 查询设备状态 */
DEBUG_TIME_SET = 9, /* 对时 */
DEBUG_REBOOT = 10, /* 重启 */
DEBUG_ADJSUT_COEFFICIENT_GET = 9, // 获取校准系数
DEBUG_ADJSUT_COEFFICIENT_SET = 10, // 设置校准系数
DEBUG_NOISE_POST = 11, // 自动获取采样值
DEBUG_NOISE_CAREFOR = 12, // 使能自动获取采样值功能
DEBUG_DEVICE_STATUS = 13, // 查询设备状态后台连接、4G连接
DEBUG_ARM_UPGRADE = 0x0050, // ARM 升级
DEBUG_FPGA1_UPGRADE = 0x0051, // FPGA 板卡升级
DEBUG_UPGRADE_ALL = 0x0056 // ARM 和 FPGA 板卡升级
};
#define BITMAP_SAVE_FILE (1 << 0)
@ -81,27 +72,15 @@ enum DebugCommand
#define DEBUG_MANAGE_TOOL_PORT (10050)
/* Exported types ------------------------------------------------------------*/
/* 设备状态. */
typedef struct {
uint32_t idx; // 编号.
uint32_t UTC_TimeScale; // UTC 时标
float F50Hz_Frequency; // 同步 50Hz 频率.
uint8_t F50Hz_SynStatus; // 同步状态.
uint8_t dau_status; // 插件状态.
uint16_t sensor_status; // 传感器断线状态.
uint16_t is_server_link; // 是否连接上后台.
uint16_t version; // 软件版本
uint32_t communication_time; // 上一次通讯的时间
uint32_t run_time; // 设备运行时间
} debug_pkt_status_t;
/* 报文头. */
typedef struct{
uint16_t head; // 0x55aa.
uint16_t cmd; // 命令.
uint32_t len; // 包长.
} debug_pkt_head_t;
/* 设备状态 */
typedef struct
{
uint32_t utc; // 系统当前时间
uint32_t run_time; // 运行时间
uint8_t is_server_link; // 后台连接状态
uint8_t reserved[7];
} debug_pkt_status_t;
/* 调试工具全局结构 */
typedef struct{
@ -113,9 +92,9 @@ typedef struct{
} debug_ctrl_t;
/* 报文头结构. */
#pragma pack(push, 1)
typedef struct{
uint16_t head; // 0x55aa.
uint32_t len;
uint8_t dev_type_m;
uint8_t dev_type_s;
@ -125,7 +104,7 @@ typedef struct{
uint16_t pkt_id;
uint8_t reserve[18];
} dbg_pkt_head_t;
#pragma pack(pop)
/* 基础信息 */
typedef struct{
@ -142,61 +121,67 @@ typedef struct{
uint8_t FPGA_version[32]; // fpga版本
uint32_t ip; // 本机(服务器) IP.
uint32_t mask; // 本机(服务器) MASK.
uint32_t gw; // 本机(服务器)网关
uint8_t mac[6]; // MAC地址.
uint16_t csg_port; // 后台端口号.
uint32_t csg_ipv4; // 后台 IP.
uint32_t running_time; //运行时间
} dbg_device_info_t;
/* 全局配置 */
#pragma pack(push, 1)
typedef struct{
uint16_t power_frequency; // 工频频率, 单位: 0.1Hz
uint16_t trend_period; // 趋势数据上送周期, 单位: 秒.
uint8_t sync_mode; // 同步方式 1: PT 同步 2: 内同步(默认) 3: 外接信号同步.
uint8_t heartbeat_period; // 心跳包周期, 单位: 分钟.
uint8_t pps_mode; // pps 主从模式 PD_PPS_XXX.
uint8_t reserved[1];
uint16_t trend_storage; // 趋势存储文件数量阈值.
uint16_t event_storage; // 事件存储文件数量阈值
} dbg_global_config_t;
#pragma pack(pop)
uint32_t sample_frequency; //采样频率 MHz
uint32_t trigger_sample_numbers; //触发采样长度 us
uint32_t pre_trigger_percent; //预触发百分比 0-100%
uint32_t trigLevel; //触发电平 mv
uint32_t trend_up_period; //趋势上升周期
uint16_t heartbeat_period; //心跳包周期 s
uint8_t ch_en_mask; //通道使能 bit0-7对应ch1-ch8
uint8_t sync_mode; //同步模式 0-外同步 1-内同步
uint32_t pt_internal_period; //内同步频率 40~300
uint8_t reserved[8]; //预留
} dbg_global_config_t;
/* 端口配置. */
typedef struct {
uint8_t vport; // 通道编号.
uint8_t port_type; // 采集通道类型 , 1 表示特高频局放 2 表示超声局放 3 表示 TEV 4 表示高频.
uint8_t filter; // 滤波器类型 1: 低频段 2: 全频段 3: 窄频段 4: 高频段
uint8_t sensor_type; // 0: 无配置; 1: UHF信号传感器; 2: UHF噪声传感器 ; 3: UHF信号传感器, 关联噪声降噪.
uint8_t is_auto_noise; // 是否自动调整降噪等级.
uint8_t denoise_type; // 0-无配置 1-自动 2-手动降噪
uint16_t denoise_variance; // 方差降噪系数, 单位: 1%
uint32_t event_counter_h; // 事件次数阀值高.
uint16_t event_sec_h; // 事件每秒次数阀值高.
uint16_t event_thr_h; // 事件值阈值高.
uint32_t event_counter_thr_h; // 事件值阈值高的次数.
uint32_t event_counter_l; // 事件次数阀值低.
uint16_t event_sec_l; // 事件每秒次数阀值低.
uint16_t event_thr_l; // 事件值阈值低.
uint32_t event_counter_thr_l; // 事件值阈值低的次数.
uint8_t burst_time; // 事件突发计算时间
uint8_t reserved1[1];
uint16_t burst_thr; // 事件突发阈值
int16_t denoise_manual; // 手动底噪等级
int16_t denoise_auto; // 自动降噪水平
}dbg_port_config_t;
/* 设备状态. */
typedef struct {
uint8_t csg_connect_status; // 后台连接状态.
uint8_t ec20_connect_status; // 4g模块连接状态
} debug_pkt_dev_connect_status_t;
typedef struct{
uint8_t vport; // 通道编号.
uint8_t channel_type; // 通道类型.
uint8_t reserved1[2];
uint32_t filter_frequency; // 过滤频率(32位按位设置)
int16_t rise_time; // 上升时间(10%到90%峰值)
int16_t peak_time; // 峰值时间
int16_t fall_time; // 下降时间(90%到10%峰值)
int16_t pulse_width; // 脉冲宽度
int16_t peak_count; // 波峰数量
int16_t reserved2; // 保留字段(2字节)
int32_t signal_envelope; // 信号包络面
float signal_mean; // 信号平均值
float signal_variance; // 信号方差值
int32_t primary_frequency; // 第一主频
int16_t primary_freq_peak; // 第一主频峰值
int16_t spectral_peak_count; // 谱峰个数
float spectrum_mean; // 频谱均值
float spectrum_variance; // 频谱方差值
uint8_t reserved3[32]; // 预留字段(32字节)
} dbg_config_port_t;
/* 升级文件包结构体 */
typedef struct
{
uint8_t type; // 升级类型
uint8_t resverd[3];
uint16_t index; // 报文索引
uint16_t sum; // 总包数.
uint32_t len; // 数据包长度.
} dbg_upgrade_data_t;
/* 应答升级结构体 */
typedef struct
{
uint16_t index; // 应答包序号.
} dbg_upgrade_ack_t;
/* Exported macro ------------------------------------------------------------*/
@ -206,7 +191,7 @@ extern debug_ctrl_t debug_ctrl;
/* Extern functions ----------------------------------------------------------*/
extern int32_t debug_handle_init(void);
extern int32_t debug_handle_init_after(void);
extern int32_t debug_pkt_port_state_post(void);
extern int32_t debug_pkt_state_post(void);
extern void debug_upgrade_result_send(int32_t rv, char *buf);
#endif
#endif

@ -74,7 +74,7 @@
debug_ctrl_t debug_ctrl;
dbg_device_info_t dbg_base_config;
dbg_global_config_t dbg_global_config;
dbg_port_config_t dbg_port_config;
dbg_config_port_t dbg_port_config;
static char buf_cmd[DEBUG_CMD_LEN];
@ -114,14 +114,13 @@ int32_t _debug_pkt_common_send(char *buf, uint16_t cmd, uint32_t data_len)
/* 获取配置报文处理. */
int32_t _debug_pkt_factory_cfg_get(char *buf, int len)
{
uint16_t len_pkt = 0;
dbg_device_info_t *info = (dbg_device_info_t *)(buf+sizeof(dbg_pkt_head_t));
memset(info, 0, sizeof(dbg_device_info_t));
info->type_m = device_info.type_m;
info->type_s = device_info.type_s;
info->dev_id = device_info.dev_id;
snprintf((char*)info->hostname, PD_DEV_NUM_LEN, "%s", device_info.hostname);
snprintf((char*)info->hostname, FILE_NAME_LEN, "%s", device_info.hostname);
info->factory_date = device_info.factory_date;
info->deployment_date = device_info.deployment_date;
info->ip = device_info.ip;
@ -138,10 +137,8 @@ int32_t _debug_pkt_factory_cfg_get(char *buf, int len)
info->csg_port = csg.server_port;
info->csg_ipv4 = csg.server_ip;
info->running_time = start_time;
len_pkt += sizeof(dbg_device_info_t);
int32_t ret = _debug_pkt_common_send(buf, DEBUG_CONFIG_FACTORY_GET, len_pkt);
int32_t ret = _debug_pkt_common_send(buf, DEBUG_CONFIG_FACTORY_GET, sizeof(dbg_device_info_t));
/* 发送数据. */
return ret;
}
@ -161,7 +158,7 @@ int32_t _debug_pkt_factory_cfg_set(char *buf, int len)
device_info.dev_id = info->dev_id;
boottype = REBOOT_LOCAL_HOST_NAME_CHANGE;
}
snprintf(device_info.hostname, PD_DEV_NUM_LEN, "%s", (const char*)info->hostname);
snprintf(device_info.hostname, FILE_NAME_LEN, "%s", (const char*)info->hostname);
device_info.factory_date = info->factory_date;
device_info.deployment_date = info->deployment_date;
@ -227,19 +224,24 @@ int32_t _debug_pkt_factory_cfg_set(char *buf, int len)
/* 设置报文处理. */
int32_t _debug_pkt_global_cfg_set(char *pkt, int len)
{
dbg_global_config_t *pnet = (dbg_global_config_t *)(pkt + sizeof(dbg_pkt_head_t));
//pd_config.config.power_frequency = pnet->power_frequency * 10;
//pd_config.config.trend_period = pnet->trend_period * 60;
//pd_config.config.sync_mode = pnet->sync_mode;
//pd_config.config.heartbeat_period = pnet->heartbeat_period;
//pd_config.config.pps_mode = pnet->pps_mode;
//pd_config.config.trend_storage = pnet->trend_storage;
//pd_config.config.event_storage = pnet->event_storage;
//pd_config.config.is_4G_enable = pnet->is_4G_enable;
dbg_global_config_t *config = (dbg_global_config_t *)(pkt + sizeof(csg_pkt_head_t));
pd_config.config.sample_frequency = config->sample_frequency;
pd_config.config.trigger_sample_nums = config->trigger_sample_numbers;
pd_config.config.trig_location = (config->pre_trigger_percent << 4) / 100.00;
pd_config.config.trig_threshold = config->trigLevel;
pd_config.config.trend_up_period = config->trend_up_period;
pd_config.config.heartbeat_period = config->heartbeat_period;
pd_config.config.ch_en_mask = config->ch_en_mask;
if (config->sync_mode == 0)
{
BITMAP_RESET(pd_config.config.pt_B_sync_mode, PD_BIT_PT);
}
else
{
BITMAP_SET(pd_config.config.pt_B_sync_mode, PD_BIT_PT);
}
pd_config.config.pt_internal_period = 1000000000UL / config->pt_internal_period;
vtysh_config_save();
return _debug_pkt_common_send(pkt, DEBUG_CONFIG_GLOBAL_SET, 0);
}
@ -248,11 +250,24 @@ int32_t _debug_pkt_global_cfg_set(char *pkt, int len)
/* 查询用户参数查询报文处理. */
int32_t _debug_pkt_global_cfg_get(char *pkt, int len)
{
uint16_t len_pkt = 0;
dbg_global_config_t *pnet = (dbg_global_config_t *)(pkt + sizeof(dbg_pkt_head_t));
_debug_pkt_common_send(pkt, DEBUG_CONFIG_GLOBAL_GET, len_pkt);
dbg_global_config_t *pconfig = (dbg_global_config_t *)(pkt + sizeof(dbg_pkt_head_t));
pconfig->sample_frequency = pd_config.config.sample_frequency;
pconfig->trigger_sample_numbers = pd_config.config.trigger_sample_nums;
pconfig->pre_trigger_percent = (uint32_t)(pd_config.config.trig_location * 100 / 16.00 + 0.5);
pconfig->trigLevel = pd_config.config.trig_threshold;
pconfig->trend_up_period = pd_config.config.trend_up_period;
pconfig->heartbeat_period = pd_config.config.heartbeat_period;
pconfig->ch_en_mask = pd_config.config.ch_en_mask;
if (IS_BITMAP_SET(pd_config.config.pt_B_sync_mode, PD_BIT_PT))
{
pconfig->sync_mode = 1;
}
else
{
pconfig->sync_mode = 0;
}
pconfig->pt_internal_period = 1000000000UL / pd_config.config.pt_internal_period;
_debug_pkt_common_send(pkt, DEBUG_CONFIG_GLOBAL_GET, sizeof(dbg_global_config_t));
return E_NONE;
}
@ -260,15 +275,75 @@ int32_t _debug_pkt_global_cfg_get(char *pkt, int len)
/* 设置报文处理. */
int32_t _debug_pkt_port_cfg_set(char *pkt, int len)
{
uint8_t unit = 0;
uint8_t port = 0;
dbg_config_port_t *pnet = (dbg_config_port_t *)(pkt + sizeof(dbg_pkt_head_t));
if (dau_vport_to_port(pnet->vport, &unit, &port) != E_NONE)
{
DBG(DBG_M_DEBUG, "Pkt port %d error!\r\n", pnet->vport);
return E_ERROR;
}
pd_config.config_port[unit][port].vport = pnet->vport;
pd_config.config_port[unit][port].type = pnet->channel_type;
pd_config.config_port[unit][port].filter_frequency = pnet->filter_frequency;
pd_config.config_port[unit][port].rise_time = pnet->rise_time;
pd_config.config_port[unit][port].peak_time = pnet->peak_time;
pd_config.config_port[unit][port].fall_time = pnet->fall_time;
pd_config.config_port[unit][port].pulse_width = pnet->pulse_width;
pd_config.config_port[unit][port].peak_count = pnet->peak_count;
pd_config.config_port[unit][port].signal_envelope = pnet->signal_envelope;
pd_config.config_port[unit][port].signal_mean = pnet->signal_mean;
pd_config.config_port[unit][port].signal_variance = pnet->signal_variance;
pd_config.config_port[unit][port].primary_frequency = pnet->primary_frequency;
pd_config.config_port[unit][port].primary_freq_peak = pnet->primary_freq_peak;
pd_config.config_port[unit][port].spectral_peak_count = pnet->spectral_peak_count;
pd_config.config_port[unit][port].spectrum_mean = pnet->spectrum_mean;
pd_config.config_port[unit][port].spectrum_variance = pnet->spectrum_variance;
vtysh_config_save();
_debug_pkt_common_send(pkt, DEBUG_CONFIG_PORT_SET, 0);
return E_NONE;
}
/* 查询用户参数查询报文处理. */
int32_t _debug_pkt_port_cfg_get(char *pkt, int len)
{
dbg_config_port_t *pnet = (dbg_config_port_t *)(pkt + sizeof(dbg_pkt_head_t));
uint8_t unit = 0;
uint8_t port = 0;
if (dau_vport_to_port(pnet->vport, &unit, &port) != E_NONE)
{
DBG(DBG_M_DEBUG, "Pkt port %d error!\r\n", pnet->vport);
return E_ERROR;
}
pnet->vport = pd_config.config_port[unit][port].vport;
pnet->channel_type = pd_config.config_port[unit][port].type;
pnet->vport = pd_config.config_port[unit][port].vport;
pnet->channel_type = pd_config.config_port[unit][port].type;
pnet->filter_frequency = pd_config.config_port[unit][port].filter_frequency;
pnet->rise_time = pd_config.config_port[unit][port].rise_time;
pnet->peak_time = pd_config.config_port[unit][port].peak_time;
pnet->fall_time = pd_config.config_port[unit][port].fall_time;
pnet->pulse_width = pd_config.config_port[unit][port].pulse_width;
pnet->peak_count = pd_config.config_port[unit][port].peak_count;
pnet->signal_envelope = pd_config.config_port[unit][port].signal_envelope;
pnet->signal_mean = pd_config.config_port[unit][port].signal_mean;
pnet->signal_variance = pd_config.config_port[unit][port].signal_variance;
pnet->primary_frequency = pd_config.config_port[unit][port].primary_frequency;
pnet->primary_freq_peak = pd_config.config_port[unit][port].primary_freq_peak;
pnet->spectral_peak_count = pd_config.config_port[unit][port].spectral_peak_count;
pnet->spectrum_mean = pd_config.config_port[unit][port].spectrum_mean;
pnet->spectrum_variance = pd_config.config_port[unit][port].spectrum_variance;
_debug_pkt_common_send(pkt, DEBUG_CONFIG_PORT_GET, sizeof(dbg_config_port_t));
return E_NONE;
}
/* 重启报文处理. */
int32_t _debug_pkt_reboot(char *buf, int len)
{
@ -295,198 +370,98 @@ int32_t _debug_pkt_time_set(char *buf, int len)
return E_NONE;
}
/* 数据手动设置报文处理. */
int32_t _debug_pkt_manual_col(char *buf, int len)
{
char *flag = buf + sizeof(dbg_pkt_head_t);
DBG(DBG_M_DEBUG, " 手动采集 flag : %d\r\n", (*flag) ? TRUE : FALSE);
/* 修改标志位. */
debug_ctrl.is_manual_col = (*flag) ? TRUE : FALSE;
/* 发送数据. */
return _debug_pkt_common_send(buf, DEBUG_NOISE_CAREFOR, 0);
}
/* 获取校准系数报文处理. */
int32_t _debug_pkt_adj_get(char *buf, int len)
{}
/* 获取校准系数报文处理. */
int32_t _debug_pkt_adj_set(char *buf, int len)
{}
/* 获取运行状态报文处理. */
int32_t _debug_pkt_status_get(char *buf, int len)
{
debug_pkt_status_t *status = (debug_pkt_status_t*)(buf + sizeof(debug_pkt_head_t));
status->idx = 0;
status->UTC_TimeScale = time(NULL);
//status->F50Hz_Frequency = dau_power_frequency_get();
status->F50Hz_SynStatus = pd_state.sync;
status->dau_status = dau_connect_get();
status->sensor_status = 0;
status->is_server_link = csg.is_connect;
status->version = version_hex;
status->communication_time = csg.communication_time;
debug_pkt_status_t *status = (debug_pkt_status_t*)(buf + sizeof(dbg_pkt_head_t));
status->utc = time(NULL);
status->run_time = start_time;
status->is_server_link = csg.is_connect;
_debug_pkt_common_send(buf, DEBUG_DEVICE_STATUS, sizeof(debug_pkt_status_t));
/* 发送数据. */
//return _debug_pkt_common_send(buf, DEBUG_RUN_STATUS_GET, sizeof(debug_pkt_status_t));
return E_NONE;
}
/* 获取运行状态报文处理. */
int32_t _debug_pkt_dev_connect_status_get(char *buf, int len)
{
debug_pkt_dev_connect_status_t *status = (debug_pkt_dev_connect_status_t*)(buf + sizeof(dbg_pkt_head_t));
status->csg_connect_status = csg.is_connect;
DBG(DBG_M_DEBUG, " ec20_connect_status %d\r\n", status->ec20_connect_status);
DBG(DBG_M_DEBUG, " csg_connect_status %d\r\n", status->csg_connect_status);
/* 发送数据. */
return _debug_pkt_common_send(buf, DEBUG_DEVICE_STATUS, sizeof(debug_pkt_dev_connect_status_t));
}
/* CMU 升级报文处理. */
int32_t _debug_pkt_mcu_upgrade(char *buf, int len)
int32_t _debug_pkt_upgrade(char *pkt, int len)
{
dbg_pkt_head_t *head = (dbg_pkt_head_t*)buf;
char *type = buf + sizeof(dbg_pkt_head_t);
DBG(DBG_M_DEBUG, "upgrade type is %d\r\n", type[0]);
char *data = buf + sizeof(dbg_pkt_head_t) + 1;
int fd = 0;
/* 保存文件. */
fd = open(DEBUG_CMU_FILE_UPGRADE, O_WRONLY | O_CREAT | O_TRUNC, 0777);
if (fd <= 0)
{
DBG(DBG_M_PD_ERR, "Open " DEBUG_CMU_FILE_UPGRADE " ERROR\r\n");
return E_SYS_CALL;
}
static int fd = -1;
static uint32_t fix_len = 0;
dbg_upgrade_data_t *head_msg = (dbg_upgrade_data_t*)(pkt + sizeof(dbg_pkt_head_t));
char *pdata = pkt + sizeof(dbg_pkt_head_t) + sizeof(dbg_upgrade_data_t);
dbg_upgrade_ack_t *pack = (dbg_upgrade_ack_t*)(pkt + sizeof(dbg_pkt_head_t));
int32_t size = 0;
int32_t len_wr = 0;
uint32_t offset = 0;
csg.is_connect = FALSE; //关闭主动上传
/* 首保处理, 打开文件描述符, 初始化变量 */
if (head_msg->index == 0)
{
if (fd > 0)
{
close(fd);
fd = -1;
}
if (write(fd, data, head->len) != head->len)
{
DBG(DBG_M_PD_ERR, "Write " DEBUG_CMU_FILE_UPGRADE " ERROR\r\n");
return E_SYS_CALL;
fd = open(PD_UPG_SOFTWARE, O_WRONLY | O_CREAT | O_TRUNC, 0777);
if (fd < 0)
{
DBG(DBG_M_DEBUG, "Open file " PD_UPG_SOFTWARE " error!\r\n");
return E_SYS_CALL;
}
fix_len = head_msg->len;
DBG(DBG_M_DEBUG, "Receive upgrade file start.\r\n");
}
close(fd);
DBG(DBG_M_DEBUG,"type=%d,sum=%d,index=%d,len=%d,fix_len=%d\r\n", head_msg->type, head_msg->sum, head_msg->index, head_msg->len, fix_len);
//保存旧文件
if (rename(DEBUG_CMU_FILE, DEBUG_CMU_FILE_BAK) < 0)
{
DBG(DBG_M_PD_ERR, "Rename " DEBUG_CMU_FILE_BAK " ERROR\r\n");
return E_SYS_CALL;
}
// 升级新文件
if (rename(DEBUG_CMU_FILE_UPGRADE, DEBUG_CMU_FILE) < 0)
/* 收包流程 */
size = head_msg->len;
offset = head_msg->index * fix_len;
if (lseek(fd, offset, SEEK_SET) < 0)
{
DBG(DBG_M_PD_ERR, "Rename " DEBUG_CMU_FILE_UPGRADE " ERROR\r\n");
int error = errno;
DBG(DBG_M_PD_CSG_ERR, "lseek file " PD_UPG_SOFTWARE " error: %s, fd=%d, offset=%ld\r\n",
strerror(error), fd, offset);
// 检查具体错误类型
switch(error) {
case EBADF: // 无效文件描述符
DBG(DBG_M_DEBUG, "Invalid file descriptor\r\n");
break;
case EINVAL: // 无效的 whence 或 offset
DBG(DBG_M_DEBUG, "Invalid offset or whence\r\n");
break;
case EOVERFLOW: // offset 过大
DBG(DBG_M_DEBUG, "Offset overflow\r\n");
break;
}
return E_SYS_CALL;
}
/* 发送回复. */
_debug_pkt_common_send(buf, DEBUG_ARM_UPGRADE, 0);
DBG(DBG_M_DEBUG, "reboot_system arm upgrade\r\n");
reboot_system(LOG_DEBUG, REBOOT_LOCAL_ARM_UPGRADE);
return E_NONE;
}
/* DAU 升级报文处理. */
int32_t _debug_pkt_dau_upgrade(char *buf, int len, uint8_t bitmap)
{
dbg_pkt_head_t *head = (dbg_pkt_head_t*)buf;
char *type = buf + sizeof(dbg_pkt_head_t);
DBG(DBG_M_DEBUG, "upgrade type is %d\r\n", type[0]);
char *data = buf + sizeof(dbg_pkt_head_t) + 1;
int fd = 0;
fd = open(DEBUG_DAU_FILE_UPGRADE, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd <= 0)
len_wr = write(fd, pdata, size);
if (len_wr != size)
{
DBG(DBG_M_DEBUG, "Open " DEBUG_DAU_FILE_UPGRADE " ERROR\r\n");
DBG(DBG_M_DEBUG, "Write file " PD_UPG_SOFTWARE " error!\r\n");
return E_SYS_CALL;
}
if (write(fd, data, head->len) != head->len)
{
DBG(DBG_M_DEBUG, "Write " DEBUG_DAU_FILE_UPGRADE " ERROR\r\n");
return E_SYS_CALL;
}
close(fd);
//保存旧文件
if (rename(DEBUG_DAU_FILE, DEBUG_DAU_FILE_BAK) < 0)
{
DBG(DBG_M_PD_ERR, "Rename " DEBUG_CMU_FILE_BAK " ERROR\r\n");
return E_SYS_CALL;
}
// 升级新文件
if (rename(DEBUG_DAU_FILE_UPGRADE, DEBUG_DAU_FILE) < 0)
/* 最后一个报文处理 */
if (head_msg->sum - 1 == head_msg->index)
{
DBG(DBG_M_PD_ERR, "Rename " DEBUG_CMU_FILE_UPGRADE " ERROR\r\n");
return E_SYS_CALL;
close(fd);
fd = -1;
DBG(DBG_M_DEBUG, "Receive upgrade file end.\r\n");
pd_upg_start(PD_UPG_FROM_CSG, head_msg->type);
}
DBG(DBG_M_DEBUG, "reboot_system dau upgrade\r\n");
_debug_pkt_common_send(buf, head->cmd, 1);
pack->index = head_msg->index;
reboot_system(LOG_DEBUG, REBOOT_LOCAL_ARM_UPGRADE);
/* 发送应答 */
_debug_pkt_common_send(pkt, DEBUG_UPGRADE_DATA, sizeof(dbg_upgrade_ack_t));
return E_NONE;
}
int32_t _debug_all_upgrade(char *buf, int len)
{
dbg_pkt_head_t *head = (dbg_pkt_head_t*)buf;
char *data = buf + sizeof(dbg_pkt_head_t);
uint8_t type = 0;
int32_t *rt = (int32_t*)data;
int fd = 0;
int32_t rv = 0;
if (buf == NULL)
{
return E_BAD_PARAM;
}
/* 获取升级类型, 更新数据指针 */
type = *data;
data++;
/* 保存文件 */
fd = open(PD_UPG_SOFTWARE, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd <= 0)
{
DBG(DBG_M_DEBUG, "Open " PD_UPG_SOFTWARE " ERROR\r\n");
return E_SYS_CALL;
}
if (write(fd, data, head->len - 1) != (head->len - 1))
{
DBG(DBG_M_DEBUG, "Write " PD_UPG_SOFTWARE " ERROR\r\n");
return E_SYS_CALL;
}
close(fd);
/* 升级 */
rv = pd_upg_start(PD_UPG_FROM_DBG, type);
if (rv != E_NONE)
{
DBG(DBG_M_DEBUG, "Write " PD_UPG_SOFTWARE " ERROR\r\n");
*rt = 1;
_debug_pkt_common_send(buf, head->cmd, 4);
}
return rv;
}
/* 报文校验. */
@ -545,10 +520,6 @@ int32_t _debug_pkt_process(char *buf, int32_t len)
DBG(DBG_M_DEBUG, "set DEBUG_CONFIG_GLOBAL_SET data!\r\n");
_debug_pkt_port_cfg_set(buf, len);
break;
case DEBUG_NOISE_CAREFOR:
_debug_pkt_manual_col(buf, len);
break;
case DEBUG_REBOOT:
_debug_pkt_reboot(buf, len);
@ -557,26 +528,12 @@ int32_t _debug_pkt_process(char *buf, int32_t len)
_debug_pkt_time_set(buf, len);
break;
case DEBUG_ADJSUT_COEFFICIENT_GET:
_debug_pkt_adj_get(buf, len);
break;
case DEBUG_ADJSUT_COEFFICIENT_SET:
_debug_pkt_adj_set(buf, len);
break;
case DEBUG_DEVICE_STATUS:
_debug_pkt_dev_connect_status_get(buf, len);
break;
case DEBUG_ARM_UPGRADE:
_debug_pkt_mcu_upgrade(buf, len);
break;
case DEBUG_FPGA1_UPGRADE:
_debug_pkt_dau_upgrade(buf, len, 0x01);
_debug_pkt_status_get(buf, len);
break;
case DEBUG_UPGRADE_ALL:
_debug_all_upgrade(buf, len);
case DEBUG_UPGRADE_DATA:
_debug_pkt_upgrade(buf, len);
break;
default:
DBG(DBG_M_DEBUG, "Debug not support cmd:%x\n", head->cmd);
break;
@ -611,7 +568,7 @@ int32_t _debug_pkt_recv_adhesion(char *buf, int len, int *len_recv)
state = 1;
/* 计算剩余报文长度, 复制数据, 并计算收包总长度. */
len_pkt = head->len + 10 - len;
len_pkt = head->len + 32 - len;
memcpy(buf_cmd + bytes_cnt, buf, len);
bytes_cnt += len;
@ -648,6 +605,7 @@ int32_t _debug_pkt_recv_adhesion(char *buf, int len, int *len_recv)
{
*len_recv = len_pkt;
}
printf("@2len_pkt=%d\n", len_pkt);
}
/* 报文没有收全, 继续等待数据. */
@ -711,7 +669,6 @@ void *_debug_pkt_recv_handle(void *arg)
{
/* 连接中断, 关闭 socket 和手动采样. */
DBG(DBG_M_DEBUG, "Read len %d, close fd!\r\n", len);
debug_ctrl.is_manual_col = FALSE;
close(debug_ctrl.fd_client);
debug_ctrl.fd_client = -1;
break;
@ -791,9 +748,9 @@ void *_debug_accept_connect_handle()
}
char buf[20] = {0};
DBG(DBG_M_DEBUG, "new client: %s, port: %d\n",
DBG(DBG_M_DEBUG, "new client: %s, port: %d fd_client=%d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, buf, sizeof(buf)),
ntohs(cliaddr.sin_port));
ntohs(cliaddr.sin_port), debug_ctrl.fd_client);
if (debug_ctrl.fd_client < 0)
{
@ -811,20 +768,6 @@ void *_debug_accept_connect_handle()
return NULL;
}
/* 用于定时将端口的状态发送给调试软件. */
void* _debug_port_state_get(void *arg)
{
/* 如果手动采样开启, 则发送数据. */
if (debug_ctrl.is_manual_col)
{
debug_pkt_port_state_post();
}
/* 重新加入定时器. */
mtimer_add(_debug_port_state_get, NULL, 1, "DEBUG_PORT_STATE_GET");
return NULL;
}
/* Interface functions -------------------------------------------------------*/
/* 调试工具初始化. */
int32_t debug_handle_init(void)
@ -886,25 +829,17 @@ int32_t debug_handle_init_after(void)
thread_m_add("PD_DEBUG_ACCEPT", pid);
}
pthread_attr_destroy(&attr);
/* 每秒上传 DAU 状态寄存器. */
mtimer_add(_debug_port_state_get, NULL, 1, "DEBUG_PORT_STATE_GET");
return E_NONE;
}
/* 数据手动上传报文处理. */
int32_t debug_pkt_port_state_post(void)
{}
/* 升级结果回复处理 */
void debug_upgrade_result_send(int32_t rv, char *buf)
{
char buffer[32] = {0};
int32_t *rt = (int32_t*)(buffer + sizeof(debug_pkt_head_t));
int32_t *rt = (int32_t*)(buffer + sizeof(dbg_pkt_head_t));
*rt = rv;
_debug_pkt_common_send(buffer, DEBUG_UPGRADE_ALL, 4);
_debug_pkt_common_send(buffer, 0, 4);
}
#endif
/************************ (C) COPYRIGHT LandPower ***** END OF FILE ****************/

@ -50,6 +50,7 @@
#include "pd_dau.h"
#include "pd_csg.h"
#include "pd_main.h"
#include "pd_dbg.h"
/* Private typedef -----------------------------------------------------------*/

Loading…
Cancel
Save