FIX | 后台联调修改.

master
yuliang 8 months ago
parent b2e06f30e1
commit ba020c0d55

@ -206,7 +206,7 @@ enum DEBUG_CM_CMD
DEBUG_PRV_DEV_STATE = 10,
DEBUG_PRV_WAVE_COL = 11,
DEBUG_PRV_WAVE_CAL = 12,
DEBUG_PRV_WAVE_MAX = 13,
DEBUG_PRV_WAVE_FORCE = 13,
DEBUG_PRV_LOG = 14,
DEBUG_PRV_HISTORY_DATA = 15,
DEBUG_PRV_ADJ_MANUAL = 16,

@ -69,6 +69,7 @@ typedef enum
DAU_COL_FLAG_REG_DEFECT, // 寄存器触发缺陷波形有效
DAU_COL_FLAG_REG_POWER, // 寄存器触发工频波形有效
DAU_COL_FLAG_REG_CMP, // 寄存器触发波形上传完成
DAU_COL_FLAG_WAVE_FORCE, // 强制录波
} DAU_COL_FLAG_E;
/* DAU 全局寄存器. */

@ -45,7 +45,7 @@
/* Define --------------------------------------------------------------------*/
/* 版本信息. */
#define VERSION_MAJOR 128
#define VERSION_MINOR 25
#define VERSION_MINOR 40
#define COMPILE_TIME (__DATE__" "__TIME__)
#define DEV_CAPABILITY_LEN 16
@ -185,7 +185,7 @@ typedef struct
uint32_t keepalive; //保活间隔 ms
/* 采样间隔配置. 4byte */
uint16_t collect_interval;
uint16_t reserve1;
uint16_t fault_threshold;
/* ADCi 电压校准配置. 2byte */
uint16_t vin;
/* 工作模式配置. 2byte */

@ -50,7 +50,7 @@ void MX_USART2_UART_Init(void);
void MX_USART3_UART_Init(void);
/* USER CODE BEGIN Prototypes */
void MX_USART3_UART_Init_WL(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus

@ -75,6 +75,7 @@ typedef struct
uint8_t dma_tx_buf_recv[WL_DMA_TX_BUF_LEN];
uint32_t time_send;
uint32_t mul_idx;
uint32_t time_update;
uint8_t state;
uint8_t err_cnt;
uint8_t send_cnt;

@ -168,7 +168,7 @@ void _debug_pkt_head_init(uint16_t len, uint8_t cmdType)
void _debug_pkt_send(uint16_t len, uint8_t debug_len)
{
/* 发送报文 */
HAL_UART_Transmit_DMA(debug_uart, debug_buf.buf, len);
HAL_UART_Transmit_IT(debug_uart, debug_buf.buf, len);
/* 调试打印. */
DBG(DBG_M_RS485_DEBUG, "Send(%d):\r\n", len);
if (dbg_stat_get(DBG_M_RS485_DEBUG))

@ -584,10 +584,11 @@ static BaseType_t _cli_show(const char *string)
vty_print("Normal sleep: %d\r\n", dev_config.normal_sleep);
vty_print("Force sleep up: %d\r\n", st_data.force_sleep_up);
vty_print("BAT charge: %d\r\n", HAL_GPIO_ReadPin(BAT_CHECK_GPIO_Port, BAT_CHECK_Pin));
vty_print("Collect interval: %d min\r\n", dev_config.collect_interval);
vty_print("Collect threshold: %d A\r\n", dev_config.threshold);
vty_print("Wave interval: %d hour\r\n", dev_config.keepalive);
vty_print("Wave threshold: %d mV\r\n", dev_config.wave_threshold);
vty_print("Collect interval: %dmin\r\n", dev_config.collect_interval);
vty_print("Collect threshold: %dA\r\n", dev_config.threshold);
vty_print("Defect threshold: %dmV\r\n", dev_config.wave_threshold);
vty_print("Fault threshold: %dA\r\n", dev_config.fault_threshold);
vty_print("Keepalive: %dms\r\n", dev_config.keepalive);
vty_print("Mian cable: %d\r\n", dev_config.main_cable);
vty_print("Voltage col: %d\r\n", dev_config.is_voltage_col);
vty_print("Temp col: %d\r\n", dev_config.is_temp_col);
@ -859,6 +860,7 @@ void cli_start(void const * argument)
/* 配置系统初始化. */
dev_config_init();
dev_config_flag_set(DEV_FLAG_CLI);
//dev_config_flag_unset(DEV_FLAG_CLI);
dev_config.keepalive = 300000;
flash_log_init();
st_init();
@ -866,6 +868,7 @@ void cli_start(void const * argument)
common_sys_init();
/* 默认开启的 debug. */
//dbg_cmd_hander(DBG_CMD_ON, DBG_M_DAU);
//dbg_cmd_hander(DBG_CMD_ON, DBG_M_GPS);
dbg_cmd_hander(DBG_CMD_ON, DBG_M_4G);
/* 初始化 ADC 采样任务. */
ADC_init();

@ -168,7 +168,6 @@ static void _common_sys_start(void *argument)
HAL_GPIO_WritePin(WDG_GPIO_Port, WDG_Pin, GPIO_PIN_SET);
osDelay(1);
HAL_GPIO_WritePin(WDG_GPIO_Port, WDG_Pin, GPIO_PIN_RESET);
vty_print("WDG %d\r\n", HAL_GetTick());
}
count++;

@ -376,11 +376,11 @@ int32_t _dau_wave_col_start(void)
return: HAL_xxx */
int32_t _dau_wave_col_fault(void)
{
#if 0
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint8_t i = 0;
uint8_t j = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 读取触发电流值 */
E_RETURN(_dau_reg_read_port_state());
@ -401,7 +401,7 @@ int32_t _dau_wave_col_fault(void)
{
if (j >= DAU_WAVE_WAIT_MAX)
{
DBG(DBG_M_DAU, "DAU fault wave err\r\n", rv);
DBG(DBG_M_DAU, "DAU fault wave err\r\n");
return HAL_TIMEOUT;
}
osDelay(10);
@ -423,6 +423,28 @@ int32_t _dau_wave_col_fault(void)
}
}
return HAL_OK;
#endif
uint8_t i = 0;
uint8_t j = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 读取故障数据 */
addr = dau_ctrl.addr_fault;
for(i = 0; i < DAU_PORT_FAULT_CNT; i++)
{
dau_ctrl.fault_trig[i] = 100 + i;
memset(&dau_ctrl.buf_dau_rx[2], i, DAU_PKT_FAULT_BYTE_CNT);
for(j = 0; j < DAU_PKT_FAULT_CNT; j++)
{
E_RETURN(spi_flash_write(addr, &dau_ctrl.buf_dau_rx[2], DAU_PKT_FAULT_BYTE_CNT));
addr += DAU_PKT_FAULT_BYTE_CNT;
}
}
vty_print("#D2 %x\r\n", addr);
return rv;
}
@ -431,6 +453,7 @@ int32_t _dau_wave_col_fault(void)
return: HAL_xxx */
int32_t _dau_wave_col_defect(void)
{
#if 0
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
uint8_t i = 0;
uint8_t j = 0;
@ -500,6 +523,55 @@ int32_t _dau_wave_col_defect(void)
}
}
return rv;
#endif
uint8_t i = 0;
uint8_t j = 0;
uint8_t is_exceed = FALSE;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 比较缺陷波形是否超过阈值 */
//E_RETURN(_dau_reg_read_port_state());
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
dau_ctrl.reg_defect_max[i] = 100 +i;
if (dau_ctrl.reg_defect_max[i] > dev_config.wave_threshold)
{
is_exceed = TRUE;
}
}
/* 没有超过阈值并没有强制录波直接返回 */
if (!is_exceed && !IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE))
{
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
return HAL_OK;
}
/* 擦除 flash */
addr = dau_ctrl.addr_reg;
vty_print("#D3 %x\r\n", addr);
for(i = 0; i < 2; i++)
{
E_RETURN(spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE));
addr += SPI_FLASH_BLOCK64_SIZE;
}
/* 数据地址应该是被擦除过的地址 (当前地址向前偏移 128k). */
addr = dau_ctrl.addr_reg;
/* 读取缺陷数据 */
for(i = 0; i < DAU_PORT_DEFECT_CNT; i++)
{
memset(&dau_ctrl.buf_dau_rx[2], i, DAU_PKT_FAULT_BYTE_CNT);
for(j = 0; j < DAU_PKT_DEFECT_CNT; j++)
{
E_RETURN(spi_flash_write(addr, &dau_ctrl.buf_dau_rx[2], DAU_PKT_DEFECT_BYTE_CNT));
addr += DAU_PKT_DEFECT_BYTE_CNT;
}
}
vty_print("#D4 %x\r\n", addr);
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_DEFECT);
return rv;
}
@ -508,11 +580,11 @@ int32_t _dau_wave_col_defect(void)
return: HAL_xxx */
int32_t _dau_wave_col_power(DAU_SOURCE_E source)
{
#if 0
uint16_t *reg = (uint16_t*)&dau_ctrl.buf_dau_tx[2];
int16_t *power = NULL;
uint8_t i = 0;
uint8_t j = 0;
int32_t rv = HAL_ERROR;
/* 读取工频数据 */
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
@ -534,7 +606,7 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
{
if (j >= DAU_WAVE_WAIT_MAX)
{
DBG(DBG_M_DAU, "DAU power wave err\r\n", rv);
DBG(DBG_M_DAU, "DAU power wave err\r\n");
return HAL_TIMEOUT;
}
osDelay(10);
@ -568,7 +640,27 @@ int32_t _dau_wave_col_power(DAU_SOURCE_E source)
}
}
return rv;
return HAL_OK;
#endif
int16_t *power = NULL;
uint8_t i = 0;
uint8_t j = 0;
/* 读取工频数据 */
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
/* 选择存储位置, 读取数据 */
power = (DAU_SOURCE_FAULT == source) ? dau_ctrl.fault_power[i] : dau_ctrl.reg_power[i];
memset(&dau_ctrl.buf_dau_rx[2], i, DAU_PKT_POWER_BYTE_CNT);
for(j = 0; j < DAU_PKT_POWER_CNT; j++)
{
memcpy(power, &dau_ctrl.buf_dau_rx[2], DAU_PKT_POWER_BYTE_CNT);
power += DAU_PKT_POWER_BYTE_CNT >> 1;
}
}
return HAL_OK;
}
/* description: DAU 工频电流计算
@ -632,23 +724,29 @@ void _dau_power_calculate(DAU_SOURCE_E source)
}
if (DAU_PORT_GROUND_CNT == ch)
{
/* 没有超过阈值, 不传输波形 */
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_POWER);
return;
}
}
/* 计算工频录波每个点的电流值 */
if (DAU_SOURCE_FAULT == source
|| IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_POWER))
{
for(ch = 0; ch < DAU_PORT_POWER_CNT; ch++)
{
for(i = 0; i < DAU_POWER_DATE_LEN; i++)
if (IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE))
{
val[ch][i] = (int64_t)val[ch][i] * 7257 * dev_config.ADC_ratio[ch] / 3276800;
}
/* 强制录波, 传输波形 */
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_POWER);
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE);
}
}
/* 计算工频录波每个点的电流值 */
//if (DAU_SOURCE_FAULT == source
// || IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_POWER))
//{
// for(ch = 0; ch < DAU_PORT_POWER_CNT; ch++)
// {
// for(i = 0; i < DAU_POWER_DATE_LEN; i++)
// {
// val[ch][i] = (int64_t)val[ch][i] * 7257 * dev_config.ADC_ratio[ch] / 3276800;
// }
// }
//}
}
/* description: 故障触发波形采集
@ -656,9 +754,9 @@ void _dau_power_calculate(DAU_SOURCE_E source)
return: HAL_xxx */
int32_t _dau_wave_col_trigger_by_fault(void)
{
#if 0
uint8_t i = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 上次触发没有完成直接退出 */
if (!IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP))
@ -690,6 +788,42 @@ int32_t _dau_wave_col_trigger_by_fault(void)
/* 置标志位 */
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP);
return HAL_OK;
#endif
static uint8_t temp = FALSE;
if (temp)
{
return HAL_OK;
}
osDelay(30000);
temp = TRUE;
uint8_t i = 0;
uint32_t addr = 0;
int32_t rv = HAL_ERROR;
/* 没有触发直接退出 */
dau_ctrl.fault_utc = dau_ctrl.utc;
dau_ctrl.fault_ns = 123456789;
/* 擦除 flash */
addr = dau_ctrl.addr_fault;
vty_print("#D1 %x\r\n", addr);
for(i = 0; i < 2; i++)
{
E_RETURN(spi_flash_erase(addr, SPI_CMD_BLOCK64_ERASE));
addr += SPI_FLASH_BLOCK64_SIZE;
}
/* 采集波形 */
E_RETURN(_dau_wave_col_fault());
E_RETURN(_dau_wave_col_power(DAU_SOURCE_FAULT));
_dau_power_calculate(DAU_SOURCE_FAULT);
/* 置标志位 */
MONITOR_BITMAP_RESET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP);
return rv;
}
@ -709,12 +843,13 @@ int32_t _dau_wave_col_trigger_by_reg(void)
/* 定时开始采集 */
tick = HAL_GetTick();
if ((tick - dau_ctrl.col_time) < (dev_config.collect_interval * 60000))
if ((tick - dau_ctrl.col_time) < (dev_config.collect_interval * 600000)
&& !IS_MONITOR_BIT_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE))
{
return HAL_OK;
}
E_RETURN(_dau_wave_col_start());
//E_RETURN(_dau_wave_col_start());
E_RETURN(_dau_wave_col_defect());
E_RETURN(_dau_wave_col_power(DAU_SOURCE_REG));
_dau_power_calculate(DAU_SOURCE_REG);
@ -736,6 +871,7 @@ static void _dau_init(void)
dau_ctrl.spi = &hspi1;
vty_print("#D7 %x\r\n", st_data.addr_fault);
if (st_data.addr_fault >= WARE_FAULT_ADDRESS && st_data.addr_fault < WARE_FAULT_ADDRESS_END
&& 0 == (st_data.addr_fault & 0x1ffff))
{
@ -746,6 +882,7 @@ static void _dau_init(void)
dau_ctrl.addr_fault = WARE_FAULT_ADDRESS;
}
vty_print("#D8 %x\r\n", st_data.addr_reg);
if (st_data.addr_reg >= WARE_REG_ADDRESS && st_data.addr_reg < WARE_REG_ADDRESS_END
&& 0 == (st_data.addr_reg & 0x1ffff))
{
@ -782,7 +919,7 @@ static void _dau_init(void)
return: */
static void _dau_start(void *argument)
{
int32_t rv = HAL_ERROR;
//int32_t rv = HAL_ERROR;
/* 状态初始化 */
_dau_init();
@ -792,17 +929,17 @@ static void _dau_start(void *argument)
osDelay(5000);
common_watchdog_set(COM_WDG_DAU);
rv = _dau_reg_read_global_state();
if (rv != HAL_OK)
{
continue;
}
//rv = _dau_reg_read_global_state();
//if (rv != HAL_OK)
//{
// continue;
//}
/* utc 对时处理 */
_dau_utc();
//_dau_utc();
/* 故障电流采集 */
_dau_wave_col_trigger_by_fault();
//_dau_wave_col_trigger_by_fault();
/* 循环工频缺陷电流采集 */
_dau_wave_col_trigger_by_reg();

@ -758,6 +758,7 @@ void st_show(uint32_t num)
/* 初始化设备状态. */
void st_init(void)
{
vty_print("#F1 %lld\r\n", st_id);
if (st_read(st_id, &st_data) != HAL_OK)
{
_st_default();

@ -94,7 +94,6 @@ int main(void)
MX_GPIO_Init();
MX_DMA_Init();
MX_UART4_Init();
MX_USART3_UART_Init();
MX_TIM7_Init();
MX_ADC1_Init();
MX_RTC_Init();

@ -485,6 +485,24 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
}
/* USER CODE BEGIN 1 */
void MX_USART3_UART_Init_WL(void)
{
huart3.Instance = USART3;
huart3.Init.BaudRate = 230400;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
uint16_t len = 0;
@ -506,7 +524,7 @@ void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
/* calc pkt len */
len = Size - wl_buf_list_rx.buf_addr;
/* refr recv buf */
if (0 == len)
if (0 == len || 1088 == len)
{
return;
}
@ -572,6 +590,7 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(USART2 == huart->Instance)
{
vty_print_usart("#U12\r\n");
HAL_UART_Abort(huart);
dau_ctrl.len_buf_gps = 0;
dau_ctrl.is_half_buf_gps = FALSE;
@ -579,12 +598,14 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
}
if(USART3 == huart->Instance)
{
vty_print_usart("#U13\r\n");
HAL_UART_Abort(huart);
HAL_GPIO_WritePin(RS485_B_DE_GPIO_Port, RS485_B_DE_Pin, GPIO_PIN_RESET);
HAL_UARTEx_ReceiveToIdle_DMA(huart, wl_ctrl.dma_rx_buf, WL_DMA_RX_BUF_LEN);
}
else if(UART4 == huart->Instance)
{
vty_print_usart("#U14\r\n");
if (IS_MONITOR_BIT_SET(dev_config.flag, DEV_FLAG_CLI))
{
cli_buf.end = 0;

@ -69,6 +69,7 @@ typedef enum
{
WL_STATE_SOFT = 0,
WL_STATE_AT_ATE,
WL_STATE_AT_IPR,
WL_STATE_AT_QICSGP,
WL_STATE_AT_QIACT,
WL_STATE_AT_CSQ,
@ -84,6 +85,7 @@ typedef enum
WL_STATE_REALDATA_FAULT,
WL_STATE_POWER_FAULT,
WL_STATE_FAULT,
WL_STATE_UPDATE,
WL_STATE_KEEPALIVE,
WL_STATE_END = 255
} WL_STATE_E;
@ -138,6 +140,7 @@ typedef struct
uint32_t utc; // 故障时间
uint32_t ns; // 故障时间纳秒
uint16_t fault_trig[DAU_PORT_FAULT_MAX];// 故障电流触发值 A
uint32_t elec[DAU_PORT_POWER_CNT]; // 工频电流有效值 mA
} wl_proto_realdata_fault_t;
typedef struct
@ -155,7 +158,6 @@ typedef struct
uint32_t utc; // gps 对时时间
} wl_proto_state_t;
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
const osThreadAttr_t WL_attributes =
@ -176,6 +178,7 @@ static void _wl_4G_send_update(void);
static void _wl_4G_send_cfg_set(void);
static void _wl_4G_send_update_rt(void);
static void _wl_4G_send_time(void);
static void _wl_4G_send_wave_force(void);
/* Internal functions --------------------------------------------------------*/
/* 4G 模块发送数据. */
@ -185,7 +188,7 @@ static int32_t _wl_4G_transmit(uint8_t *data, uint16_t len)
if (wl_ctrl.state < WL_STATE_CONTACT)
{
DBG(DBG_M_4G, "Send: %s\r\n", data);
DBG(DBG_M_4G, "Send: %s", data);
}
else
{
@ -269,6 +272,15 @@ static void _wl_4G_AT_process(uint8_t *cmd)
else if (0 == strncmp((char*)cmd, "OK", 2))
{
/* 命令执行成功. */
if (WL_STATE_AT_IPR == wl_ctrl.state)
{
HAL_UART_Abort(wl_ctrl.uart);
HAL_UART_DeInit(wl_ctrl.uart);
memset(&wl_buf_list_rx, 0, sizeof(wl_buf_list_t));
MX_USART3_UART_Init_WL();
HAL_UARTEx_ReceiveToIdle_DMA(wl_ctrl.uart, wl_ctrl.dma_rx_buf, WL_DMA_RX_BUF_LEN);
osDelay(1000);
}
if (wl_ctrl.state < WL_STATE_AT_QIOPEN)
{
wl_ctrl.state++;
@ -396,7 +408,7 @@ static int32_t _wl_4G_pkt_check(uint8_t *cmd, uint32_t len)
/* pkt_id 验证 */
if (head->pkt_id != wl_ctrl.pkt_id
|| head->pkt_id >= 0x8000)
&& head->pkt_id < 0x8000)
{
DBG(DBG_M_4G, "@4: %d %d\r\n", head->pkt_id, wl_ctrl.pkt_id);
return HAL_ERROR;
@ -429,6 +441,12 @@ static void _wl_4G_recv_contect(uint8_t *cmd, uint32_t len)
dev_config.wave_threshold = cfg->threshold_defect;
}
if (cfg->threshold_fault != dev_config.fault_threshold)
{
is_cfg_save = TRUE;
dev_config.fault_threshold = cfg->threshold_fault;
}
if (is_cfg_save)
{
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
@ -469,6 +487,8 @@ static void _wl_4G_recv_update(uint8_t *cmd, uint32_t len)
{
/* 开始时置升级结果为错误. */
wl_ctrl.update_rt = HAL_ERROR;
wl_ctrl.state = WL_STATE_UPDATE;
wl_ctrl.time_update = HAL_GetTick();
while(addr != TFTP_APP_ADDRESS_END)
{
@ -521,6 +541,7 @@ static void _wl_4G_recv_update(uint8_t *cmd, uint32_t len)
{
wl_ctrl.mul_idx = 0;
wl_ctrl.update_len = 0;
wl_ctrl.state = WL_STATE_END;
}
}
@ -549,6 +570,12 @@ static void _wl_4G_recv_cfg_set(uint8_t *cmd, uint32_t len)
dev_config.wave_threshold = cfg->threshold_defect;
}
if (cfg->threshold_fault != dev_config.fault_threshold)
{
is_cfg_save = TRUE;
dev_config.fault_threshold = cfg->threshold_fault;
}
if (is_cfg_save)
{
common_sys_set(COM_SYS_SAVE_CONFIG, 0);
@ -668,6 +695,7 @@ static void _wl_4G_recv_defect(uint8_t *cmd, uint32_t len)
{
dau_ctrl.addr_reg = WARE_REG_ADDRESS;
}
st_data.addr_reg = dau_ctrl.addr_reg;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_CMP);
wl_ctrl.state = WL_STATE_END;
@ -729,6 +757,7 @@ static void _wl_4G_recv_fault(uint8_t *cmd, uint32_t len)
{
dau_ctrl.addr_fault = WARE_FAULT_ADDRESS;
}
st_data.addr_fault = dau_ctrl.addr_fault;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP);
wl_ctrl.state = WL_STATE_END;
@ -745,6 +774,16 @@ static void _wl_4G_recv_fault(uint8_t *cmd, uint32_t len)
_wl_4G_pkt_id_update();
}
/* 强制录波 */
static void _wl_4G_recv_wave_force(uint8_t *cmd, uint32_t len)
{
proto_head_t *head = (proto_head_t*)cmd;
wl_ctrl.pkt_id_recv = head->pkt_id;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_WAVE_FORCE);
_wl_4G_send_wave_force();
}
/* 数据回复处理. */
static void _wl_4G_data_process(uint8_t *cmd, uint32_t len)
{
@ -810,6 +849,9 @@ static void _wl_4G_data_process(uint8_t *cmd, uint32_t len)
case DEBUG_PRV_FAULT:
_wl_4G_recv_fault(cmd, len);
break;
case DEBUG_PRV_WAVE_COL:
_wl_4G_recv_wave_force(cmd, len);
break;
default:
break;
}
@ -846,10 +888,8 @@ void _wl_4G_data_recv(void)
buf_l->current = 0;
}
/* 如果收包大于协议报文长度或者大于 buf 长度, 认为报文错误. */
len_pkt = head->len + WL_CRC32_LEN;
if (wl_ctrl.cmd_buf_index + len > WL_CMD_BUF_LEN
|| (wl_ctrl.cmd_buf_index >= 2 && (len_pkt > WL_DMA_RX_BUF_LEN)))
/* 如果收包大于协议报文长度, 认为报文错误. */
if (wl_ctrl.cmd_buf_index + len > WL_CMD_BUF_LEN)
{
wl_ctrl.cmd_buf_index = 0;
continue;
@ -858,6 +898,15 @@ void _wl_4G_data_recv(void)
/* 将 buf 中的数据解析成命令. */
memcpy(&wl_ctrl.cmd_buf[wl_ctrl.cmd_buf_index], buf, len);
wl_ctrl.cmd_buf_index += len;
len_pkt = head->len + WL_CRC32_LEN;
/* 如果收包大于 buf 长度, 认为报文错误. */
if (wl_ctrl.cmd_buf_index >= 2
&& len_pkt > WL_DMA_RX_BUF_LEN)
{
wl_ctrl.cmd_buf_index = 0;
continue;
}
/* 报文头长度都不够, 不进行处理 */
if (wl_ctrl.cmd_buf_index < 2)
@ -926,7 +975,7 @@ static void _wl_4G_head_init(uint16_t len, uint8_t cmdType, uint8_t cmd, uint16_
head->pkt_id = pkt_id;
}
/* 初始化报文头. */
/* 初始化报文头, 后台出动发送的报文. */
static void _wl_4G_head_init_recv(uint16_t len, uint8_t cmdType, uint8_t cmd, uint16_t pkt_id)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf_recv;
@ -1037,9 +1086,8 @@ static void _wl_4G_send_update_rt(void)
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init_recv(sizeof(proto_head_t), DEBUG_CT_REPLY, DEBUG_C_UPDATE_APP_RT, wl_ctrl.pkt_id_recv);
_wl_4G_head_init_recv(sizeof(proto_head_t) + sizeof(int32_t), DEBUG_CT_REPLY, DEBUG_C_UPDATE_APP_RT, wl_ctrl.pkt_id_recv);
head->len = sizeof(proto_head_t) + sizeof(int32_t);
*rt = wl_ctrl.update_rt;
/* 计算校验和. */
@ -1054,10 +1102,14 @@ static void _wl_4G_send_update_rt(void)
static void _wl_4G_send_keepalive(void)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf;
wl_proto_state_t *data = (wl_proto_state_t*)(wl_ctrl.dma_tx_buf + sizeof(proto_head_t));
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init(sizeof(proto_head_t), DEBUG_CT_REPLY, DEBUG_C_KEEPALIVE, wl_ctrl.pkt_id);
_wl_4G_head_init(sizeof(proto_head_t) + sizeof(wl_proto_state_t), DEBUG_CT_REPLY, DEBUG_C_KEEPALIVE, wl_ctrl.pkt_id);
data->is_utc_valid = dau_ctrl.is_utc_valid;
data->utc = dau_ctrl.utc;
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf + head->len);
@ -1121,7 +1173,7 @@ static void _wl_4G_send_realdata(void)
wl_tm.tm_min = wl_time.Minutes;
wl_tm.tm_sec = wl_time.Seconds;
temp = mktime(&wl_tm);
vty_print("tm %d %d\r\n", temp, time(NULL));
vty_print("tm %d\r\n", temp);
data->utc = temp;
data->run_time = HAL_GetTick() / 1000;
@ -1187,7 +1239,7 @@ static void _wl_4G_send_power(void)
if (m_head->len > 0)
{
memcpy(data, (&dau_ctrl.reg_power[0][0]) + m_head->index * DEBUG_DATA_SIZE, m_head->len);
memcpy(data, (char*)(&dau_ctrl.reg_power[0][0]) + m_head->index * DEBUG_DATA_SIZE, m_head->len);
}
/* 计算校验和. */
@ -1284,6 +1336,11 @@ static void _wl_4G_send_realdata_fault(void)
data->fault_trig[i] = dau_ctrl.fault_trig[i];
}
for(i = 0; i < DAU_PORT_POWER_CNT; i++)
{
data->elec[i] = dau_ctrl.fault_elec[i];
}
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf, head->len);
@ -1333,7 +1390,7 @@ static void _wl_4G_send_power_fault(void)
if (m_head->len > 0)
{
memcpy(data, (&dau_ctrl.fault_power[0][0]) + m_head->index * DEBUG_DATA_SIZE, m_head->len);
memcpy(data, (char*)(&dau_ctrl.fault_power[0][0]) + m_head->index * DEBUG_DATA_SIZE, m_head->len);
}
/* 计算校验和. */
@ -1410,6 +1467,23 @@ static void _wl_4G_send_fault(void)
}
}
/* 强制录波报文回复 */
static void _wl_4G_send_wave_force(void)
{
proto_head_t *head = (proto_head_t*)wl_ctrl.dma_tx_buf_recv;
uint32_t *crc = NULL;
/* 封装报文头. */
_wl_4G_head_init_recv(sizeof(proto_head_t), DEBUG_CT_PRV_REPLY, DEBUG_PRV_WAVE_COL, wl_ctrl.pkt_id_recv);
/* 计算校验和. */
crc = (uint32_t*)(wl_ctrl.dma_tx_buf_recv + head->len);
*crc = crc32(wl_ctrl.dma_tx_buf_recv, head->len);
/* 发送报文 */
_wl_4G_transmit(wl_ctrl.dma_tx_buf_recv, head->len + 4);
}
/* 数据发送 */
void _wl_4G_send(void)
{
@ -1488,7 +1562,7 @@ void _wl_4G_state_chg(void)
else if(wl_ctrl.keepalive < HAL_GetTick())
{
wl_ctrl.state = WL_STATE_KEEPALIVE;
wl_ctrl.keepalive += dev_config.keepalive;
wl_ctrl.keepalive = dev_config.keepalive + HAL_GetTick();
}
}
@ -1528,6 +1602,12 @@ void _wl_4G_init_soft(void)
_wl_4G_init_cmd_send("ATE0\r\n", 1100);
wl_ctrl.send_cnt++;
}
else if ((WL_STATE_AT_IPR == wl_ctrl.state) && is_timeout)
{
/* 修改波特率. */
_wl_4G_init_cmd_send("AT+IPR=230400\r\n", 1100);
wl_ctrl.send_cnt++;
}
else if ((WL_STATE_AT_QICSGP == wl_ctrl.state) && is_timeout)
{
/* 创建场景. */
@ -1585,6 +1665,13 @@ void _wl_4G_init_soft(void)
wl_ctrl.time_send = 0;
wl_ctrl.send_cnt = 0;
}
else if (wl_ctrl.state > WL_STATE_AT_COMP)
{
vty_print("#W4 %d\r\n", wl_ctrl.state);
wl_ctrl.state = WL_STATE_AT_ATE;
wl_ctrl.time_send = 0;
wl_ctrl.send_cnt = 0;
}
}
/* 初始化 4G 模块硬件 */
@ -1606,12 +1693,13 @@ static void _wl_4G_hw_restart(void)
DBG(DBG_M_4G, "4G restart(%d)\r\n", wl_ctrl.err_cnt);
/* 初始化 4G 模块硬件. */
HAL_GPIO_WritePin(POWER_4G_GPIO_Port, POWER_4G_Pin, GPIO_PIN_RESET);
HAL_UART_Abort(wl_ctrl.uart);
HAL_UART_DeInit(wl_ctrl.uart);
memset(&wl_buf_list_rx, 0, sizeof(wl_buf_list_t));
HAL_GPIO_WritePin(POWER_4G_GPIO_Port, POWER_4G_Pin, GPIO_PIN_RESET);
_wl_4G_hw_init();
MX_USART3_UART_Init();
HAL_UARTEx_ReceiveToIdle_DMA(wl_ctrl.uart, wl_ctrl.dma_rx_buf, WL_DMA_RX_BUF_LEN);
osDelay(10000);
/* 20s 内要收到 4G 模块发出的 RDY. */
wl_ctrl.state = 0;
wl_ctrl.send_cnt = 0;
@ -1619,6 +1707,7 @@ static void _wl_4G_hw_restart(void)
wl_ctrl.cmd_buf_index = 0;
wl_ctrl.time_send = HAL_GetTick() + 20000;
wl_ctrl.err_cnt++;
_wl_4G_hw_init();
/* 4G 掉线后不能阻止波形采集, 掉线后默认上传完成 */
if (!MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_CMP))
@ -1632,6 +1721,7 @@ static void _wl_4G_hw_restart(void)
st_data.addr_reg = dau_ctrl.addr_reg;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_REG_CMP);
}
#if 0
if (!MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP))
{
/* 更新 flash 地址 */
@ -1643,6 +1733,7 @@ static void _wl_4G_hw_restart(void)
st_data.addr_fault = dau_ctrl.addr_fault;
MONITOR_BITMAP_SET(dau_ctrl.col_flag, DAU_COL_FLAG_FAULT_CMP);
}
#endif
}
/* 无线模块主任务循环. */
@ -1661,6 +1752,7 @@ static void _wl_4G_start(void *argument)
}
/* 初始化 4G 模块硬件. */
MX_USART3_UART_Init();
_wl_4G_hw_init();
/* 开启串口空闲中断收包. */
@ -1685,7 +1777,15 @@ static void _wl_4G_start(void *argument)
}
else
{
if (WL_STATE_END == wl_ctrl.state)
if (WL_STATE_UPDATE == wl_ctrl.state
&& wl_ctrl.time_update + 10000 < HAL_GetTick())
{
/* 升级超时处理 10s */
wl_ctrl.mul_idx = 0;
wl_ctrl.update_len = 0;
wl_ctrl.state = WL_STATE_END;
}
else if (WL_STATE_END == wl_ctrl.state)
{
/* 计算状态机 */
_wl_4G_state_chg();
@ -1716,7 +1816,6 @@ static void _wl_4G_start(void *argument)
void wl_init(void)
{
wl_ctrl.uart = &huart3;
wl_ctrl.keepalive += dev_config.keepalive;
wl_ctrl.handle = osThreadNew(_wl_4G_start, NULL, &WL_attributes);
}

File diff suppressed because it is too large Load Diff

@ -50,7 +50,7 @@
<item>33054</item>
<item>0</item>
<item>33035</item>
<item>33037</item>
<item>33036</item>
<item>34399</item>
<item>0</item>
<item>33038</item>
@ -86,11 +86,11 @@
<RecentlyUsedMenus>1</RecentlyUsedMenus>
<MenuShadows>1</MenuShadows>
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay>
<CommandsUsage>A80800000E0040E10000020000005984000002000000568400000200000010860000100000000F810000010000005F860000030000000C8100007108000055840000020000000E810000060000000B8100000E0000000584000003000000108400001100000046810000010000000D81000006000000</CommandsUsage>
<CommandsUsage>060900000E00598400000200000040E1000002000000108600001000000056840000020000005F860000030000000F810000010000000C810000CF08000055840000020000000E810000060000000B8100000E0000000584000003000000468100000100000010840000110000000D81000006000000</CommandsUsage>
</MFCToolBarParameters>
<CommandManager>
<CommandsWithoutImages>36000D8400000F84000008840000FFFFFFFF54840000328100001C810000098400007784000007840000808C000044D50000538400000088000001880000028800000388000004880000058800001C8F00001D8F00001F8F0000208F0000218F00002AE10000118F000055840000568400005984000001B0000002B0000003B0000004B0000005B0000006B0000007B0000008B0000009B000000AB000000BB000000CB000000DB000000EB0000000B000002481000040E100000C840000338400007884000011840000008200001C8200000182000067860000</CommandsWithoutImages>
<MenuUserImages>2200048400004C000000268100002D000000048100001C0000002CE100004300000031840000530000000F81000023000000208100002B0000005F860000340000000C8100002000000023E100003D0000001982000015000000068400004E0000004A810000470000001682000013000000038400004B0000002BE10000420000000E8400005000000030840000520000000E810000220000001F8100002A00000025E100003F0000002F820000160000000B8100001F00000022E100003C000000D18400000C0000001882000014000000058400004D000000058100001D0000004981000046000000028400004A000000328400005400000010840000510000000D810000210000000A8400004F000000</MenuUserImages>
<MenuUserImages>2200048400004C0000002CE1000043000000048100001C000000268100002D00000031840000530000005F86000034000000208100002B0000000F8100002300000023E100003D0000000C81000020000000068400004E0000001982000015000000038400004B00000016820000130000004A810000470000002BE100004200000030840000520000000E840000500000002F8200001600000025E100003F0000001F8100002A0000000E8100002200000022E100003C0000000B8100001F000000058400004D0000001882000014000000D18400000C000000028400004A0000004981000046000000058100001D000000108400005100000032840000540000000A8400004F0000000D81000021000000</MenuUserImages>
</CommandManager>
<Pane-59393>
<ID>0</ID>
@ -381,12 +381,12 @@
</BasePane-34049>
<MFCToolBar-34050>
<Name>Main</Name>
<Buttons>00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000000038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000000003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0001000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000000003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000000041000000FFFEFF000000000000000000000000000100000001000000018002810000000000001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000000030000000FFFEFF000000000000000000000000000100000001000000018027810000000000002E000000FFFEFF000000000000000000000000000100000001000000018028810000000000002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800D8100000000020021000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000</Buttons>
<Buttons>00200000010000002000FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000035000000FFFEFF000000000000000000000000000100000001000000018001E100000000000036000000FFFEFF000000000000000000000000000100000001000000018003E100000000000038000000FFFEFF0000000000000000000000000001000000010000000180008100000000000019000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018007E10000000000003B000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000018023E10000000004003D000000FFFEFF000000000000000000000000000100000001000000018022E10000000004003C000000FFFEFF000000000000000000000000000100000001000000018025E10000000000003F000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001802BE100000000040042000000FFFEFF00000000000000000000000000010000000100000001802CE100000000040043000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6E4281000000000000FFFFFFFFFFFEFF0000000000000000000100000000000000010000007800000002002050FFFFFFFFFFFEFF0096000000000000000000018021810000000004002C000000FFFEFF000000000000000000000000000100000001000000018024E10000000000003E000000FFFEFF000000000000000000000000000100000001000000018028E100000000040040000000FFFEFF000000000000000000000000000100000001000000018029E100000000000041000000FFFEFF000000000000000000000000000100000001000000018002810000000000001B000000FFFEFF0000000000000000000000000001000000010000000180298100000000000030000000FFFEFF000000000000000000000000000100000001000000018027810000000000002E000000FFFEFF000000000000000000000000000100000001000000018028810000000000002F000000FFFEFF00000000000000000000000000010000000100000001801D8100000000040028000000FFFEFF00000000000000000000000000010000000100000001801E8100000000040029000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800B810000000004001F000000FFFEFF00000000000000000000000000010000000100000001800C8100000000000020000000FFFEFF00000000000000000000000000010000000100000001805F8600000000000034000000FFFEFF00000000000000000000000000010000000100000001800000000001000000FFFFFFFFFFFEFF00000000000000000000000000010000000100000001800E8100000000000022000000FFFEFF00000000000000000000000000010000000100000001800F8100000000000023000000FFFEFF00000000000000000000000000010000000100000000000000FFFEFF044D00610069006E00E8020000</Buttons>
</MFCToolBar-34050>
<Pane-34050>
<ID>34050</ID>
<RectRecentFloat>0A0000000A0000006E0000006E000000</RectRecentFloat>
<RectRecentDocked>0200000000000000000300001A000000</RectRecentDocked>
<RectRecentDocked>0100000000000000FF0200001A000000</RectRecentDocked>
<RecentFrameAlignment>8192</RecentFrameAlignment>
<RecentRowIndex>0</RecentRowIndex>
<IsFloating>0</IsFloating>
@ -419,7 +419,7 @@
</ChildIdMap>
<MDIWindows>
<MDIClientArea-0>
<MDITabsState>010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000010000000000000001000000FFFEFF3D2400570053005F0044004900520024005C004300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032005C004C006900730074005C004300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032002E006D006100700001000000FFFF010014004966436F6E74656E7453746F72616765496D706CFFFEFF00FFFEFFFF23013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0031003500300036003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF194300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032002E006D006100700000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000001000000020000004E0100004900000080070000CC020000</MDITabsState>
<MDITabsState>010000000300000001000000000000000000000001000000010000000200000000000000010000000100000000000000280000002800000001000000010000000000000001000000FFFEFF3D2400570053005F0044004900520024005C004300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032005C004C006900730074005C004300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032002E006D006100700001000000FFFF010014004966436F6E74656E7453746F72616765496D706CFFFEFF00FFFEFFFF23013C003F0078006D006C002000760065007200730069006F006E003D00220031002E0030002200200065006E0063006F00640069006E0067003D0022005500540046002D00380022003F003E000A003C0052006F006F0074003E000A0020002000200020003C004E0075006D0052006F00770073003E0031003C002F004E0075006D0052006F00770073003E000A0020002000200020003C004E0075006D0043006F006C0073003E0031003C002F004E0075006D0043006F006C0073003E000A0020002000200020003C00580050006F0073003E0030003C002F00580050006F0073003E000A0020002000200020003C00590050006F0073003E0030003C002F00590050006F0073003E000A0020002000200020003C00530065006C00530074006100720074003E0030003C002F00530065006C00530074006100720074003E000A0020002000200020003C00530065006C0045006E0064003E0030003C002F00530065006C0045006E0064003E000A0020002000200020003C00580050006F00730032003E0030003C002F00580050006F00730032003E000A0020002000200020003C00590050006F00730032003E0031003400360039003C002F00590050006F00730032003E000A0020002000200020003C00530065006C005300740061007200740032003E0030003C002F00530065006C005300740061007200740032003E000A0020002000200020003C00530065006C0045006E00640032003E0030003C002F00530065006C0045006E00640032003E000A003C002F0052006F006F0074003E000A00FFFEFF194300610062006C0065004D006F006E00690074006F0072005F004100500050005F00560033002E0032002E006D006100700000000000FFFFFFFFFFFFFFFF0000000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000001000000020000004E0100004900000080070000CC020000</MDITabsState>
</MDIClientArea-0>
</MDIWindows>
</WindowStorage>

Loading…
Cancel
Save