diff --git a/src/system/libiec/src/iec104.cpp b/src/system/libiec/src/iec104.cpp index 5a2003e..772baeb 100644 --- a/src/system/libiec/src/iec104.cpp +++ b/src/system/libiec/src/iec104.cpp @@ -149,7 +149,11 @@ LOCAL void ring_sem_init(bool *p_init, sem_t *p_sem) LOCAL int ring_count(uint16_t in_ptr, uint16_t out_ptr, int size) { - if (in_ptr >= out_ptr) return (int)(in_ptr - out_ptr); + if (in_ptr >= out_ptr) + { + return (int)(in_ptr - out_ptr); + } + return (int)(size - out_ptr + in_ptr); } @@ -161,7 +165,10 @@ LOCAL st_ring_out_ptr *ring_out_get(void *pv_param, std::vector for (idx = 0; idx < vec.size(); idx++) { - if (vec[idx].ch == ch && vec[idx].protocol == protocol) return &vec[idx]; + if (vec[idx].ch == ch && vec[idx].protocol == protocol) + { + return &vec[idx]; + } } st_ring_out_ptr new_ptr = { protocol, 0, ch }; @@ -194,7 +201,10 @@ LOCAL int cb_get_time(__CP56Time2a *p_time) struct tm st; uint16_t total_ms; - if (NULL == p_time) return 0; + if (NULL == p_time) + { + return 0; + } clock_gettime(CLOCK_REALTIME, &ts); gmtime_r(&ts.tv_sec, &st); @@ -217,7 +227,10 @@ LOCAL int cb_set_time(__CP56Time2a *p_time) uint16_t ms; struct timespec ts; - if (NULL == p_time) return 0; + if (NULL == p_time) + { + return 0; + } memset(&st, 0, sizeof(st)); st.tm_year = p_time->ucYear + 100; @@ -235,29 +248,43 @@ LOCAL int cb_set_time(__CP56Time2a *p_time) return 1; } -LOCAL uint8_t cb_coi_read(void) { return 0; } +LOCAL uint8_t cb_coi_read(void) +{ + return 0; +} -LOCAL void cb_coi_write(uint8_t coi) { (void)coi; } +LOCAL void cb_coi_write(uint8_t coi) +{ + (void)coi; +} /* =========================== YX (遥信) 回调 =========================== */ LOCAL int32_t cb_yx_count(uint16_t group, void *pv_param, uint32_t *p_start, uint32_t *p_end) { std::vector &vec = iec_cfg_ptr_get()->vec_st; - (void)group; (void)pv_param; + + (void)group; + (void)pv_param; + *p_start = YX_START_PORT; *p_end = *p_start + vec.size(); + return (int32_t)vec.size(); } LOCAL int32_t cb_yx_val(uint16_t group, uint16_t idx, Yx_Info *pst_info, void *pv_param) { - std::vector &vec = iec_cfg_ptr_get()->vec_st; + std::vector &vec = iec_cfg_ptr_get()->vec_st; stru_iec_sig *p_sig; stru_iec *p_iec; (void)group; - if (idx >= vec.size()) return 0; + + if (idx >= vec.size()) + { + return 0; + } p_iec = iec104_get_by_interface(*(uint32_t *)pv_param); p_sig = &vec[idx]; @@ -270,10 +297,17 @@ LOCAL int32_t cb_yx_val(uint16_t group, uint16_t idx, Yx_Info *pst_info, void *p if (NULL != p_iec && p_iec->cs10x.usYxType) { pst_info->ucStateType = 1; + if (p_sig->invert) { - if (pst_info->ucStatus == 2) pst_info->ucStatus = 1; - else if (pst_info->ucStatus == 1) pst_info->ucStatus = 2; + if (pst_info->ucStatus == 2) + { + pst_info->ucStatus = 1; + } + else if (pst_info->ucStatus == 1) + { + pst_info->ucStatus = 2; + } } } /* 单点遥信 + 取反 */ @@ -290,20 +324,29 @@ LOCAL int32_t cb_yx_val(uint16_t group, uint16_t idx, Yx_Info *pst_info, void *p LOCAL int32_t cb_yc_count(uint16_t group, void *pv_param, uint32_t *p_start, uint32_t *p_end) { std::vector &vec = iec_cfg_ptr_get()->vec_mx; - (void)group; (void)pv_param; + + (void)group; + (void)pv_param; + *p_start = YC_START_PORT; *p_end = *p_start + vec.size(); + return (int32_t)vec.size(); } LOCAL int32_t cb_yc_val(uint16_t group, uint16_t idx, Yc_Info *pst_info, void *pv_param) { - std::vector &vec = iec_cfg_ptr_get()->vec_mx; + std::vector &vec = iec_cfg_ptr_get()->vec_mx; stru_iec_sig *p_sig; float raw_val; - (void)group; (void)pv_param; - if (idx >= vec.size()) return 0; + (void)group; + (void)pv_param; + + if (idx >= vec.size()) + { + return 0; + } p_sig = &vec[idx]; raw_val = (NULL != p_sig->p_data) ? *(float *)p_sig->p_data : 0.0f; @@ -356,7 +399,9 @@ LOCAL int32_t cb_yc_disturb_num(void *pv_param) ring_sem_init(&g_yc_ring.init, &g_yc_ring.sem); sem_wait(&g_yc_ring.sem); + num = ring_count(g_yc_ring.in, p_out->out, DISTURB_YC_LEN); + sem_post(&g_yc_ring.sem); return num; } @@ -365,12 +410,17 @@ LOCAL int32_t cb_yc_disturb_upd(void *pv_param, uint32_t pos) { st_ring_out_ptr *p_out; - if (0 == pos || NULL == pv_param) return 0; + if (0 == pos || NULL == pv_param) + { + return 0; + } p_out = ring_out_get(pv_param, g_yc_ring.out_ptrs, 1); ring_sem_init(&g_yc_ring.init, &g_yc_ring.sem); sem_wait(&g_yc_ring.sem); + p_out->out = (p_out->out + pos) % DISTURB_YC_LEN; + sem_post(&g_yc_ring.sem); return 1; } @@ -404,6 +454,7 @@ LOCAL int32_t cb_soe_get(SOE_Info *pst_info, void *pv_param, uint32_t pos) sem_wait(&g_soe_ring.sem); read_idx = (pos + p_out->out) % SOE_LEN; + pst_info->uiInfoAddr = g_soe_ring.soe[read_idx].pot; pst_info->ucStatus = g_soe_ring.soe[read_idx].st; pst_info->ucStateType = g_soe_ring.soe[read_idx].ty; @@ -421,7 +472,9 @@ LOCAL int32_t cb_soe_num(void *pv_param) ring_sem_init(&g_soe_ring.init, &g_soe_ring.sem); sem_wait(&g_soe_ring.sem); + num = ring_count(g_soe_ring.in, p_out->out, SOE_LEN); + sem_post(&g_soe_ring.sem); return num; } @@ -430,12 +483,17 @@ LOCAL int32_t cb_soe_upd(void *pv_param, uint32_t pos) { st_ring_out_ptr *p_out; - if (0 == pos || NULL == pv_param) return 0; + if (0 == pos || NULL == pv_param) + { + return 0; + } p_out = ring_out_get(pv_param, g_soe_ring.out_ptrs, 2); ring_sem_init(&g_soe_ring.init, &g_soe_ring.sem); sem_wait(&g_soe_ring.sem); + p_out->out = (p_out->out + pos) % SOE_LEN; + sem_post(&g_soe_ring.sem); return 1; } @@ -452,24 +510,32 @@ LOCAL int32_t cb_dd_count(uint16_t group, void *pv_param, uint32_t *p_start, uin if (group == 0) { - if (time_en) return 0; + if (time_en) + { + return 0; + } + *p_start = DD_START_PORT; *p_end = *p_start + num; + return (int32_t)num; } /* group 1: 前 8 个不带时标, 其余带时标 */ split = 8; + if (time_en) { *p_start = DD_START_PORT + split; split = (int)num - split; *p_end = *p_start + split; + return (split > 0) ? split : 0; } *p_start = DD_START_PORT; *p_end = *p_start + split; + return split; } @@ -478,12 +544,20 @@ LOCAL int32_t cb_dd_val(uint16_t group, uint16_t idx, TimeDd_Info *pst_info, voi std::vector &vec = iec_cfg_ptr_get()->vec_dd; stru_iec_sig *p_sig; - (void)group; (void)time_en; (void)pv_param; - if (idx >= vec.size()) return 0; + (void)group; + (void)time_en; + (void)pv_param; + + if (idx >= vec.size()) + { + return 0; + } p_sig = &vec[idx]; + pst_info->uiInfoAddr = p_sig->inf; pst_info->fVal = (NULL != p_sig->p_data) ? *(float *)p_sig->p_data : 0.0f; + memset(&pst_info->stCTime, 0, sizeof(pst_info->stCTime)); return 1; @@ -519,6 +593,7 @@ LOCAL int32_t cb_dd_disturb_get(TimeDd_Info *pst_info, void *pv_param, uint32_t sem_wait(&g_dd_ring.sem); read_idx = (pos + p_out->out) % DD_LEN; + pst_info->uiInfoAddr = g_dd_ring.dd[read_idx].idx; pst_info->fVal = g_dd_ring.dd[read_idx].val; @@ -535,7 +610,9 @@ LOCAL int32_t cb_dd_disturb_num(void *pv_param) ring_sem_init(&g_dd_ring.init, &g_dd_ring.sem); sem_wait(&g_dd_ring.sem); + num = ring_count(g_dd_ring.in, p_out->out, DD_LEN); + sem_post(&g_dd_ring.sem); return num; } @@ -544,12 +621,17 @@ LOCAL int32_t cb_dd_disturb_upd(void *pv_param, uint32_t pos) { st_ring_out_ptr *p_out; - if (0 == pos || NULL == pv_param) return 0; + if (0 == pos || NULL == pv_param) + { + return 0; + } p_out = ring_out_get(pv_param, g_dd_ring.out_ptrs, 3); ring_sem_init(&g_dd_ring.init, &g_dd_ring.sem); sem_wait(&g_dd_ring.sem); + p_out->out = (p_out->out + pos) % DD_LEN; + sem_post(&g_dd_ring.sem); return 1; } @@ -560,14 +642,21 @@ int cb_fault_write(iec_soe_info_t *p_soe, uint8_t yx_n, iec_yc_info_t *p_yc, uin { uint8_t j; - if (NULL == p_soe) return 0; + if (NULL == p_soe) + { + return 0; + } ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem); sem_wait(&g_fault_ring.sem); g_fault_ring.fault[g_fault_ring.in].soe = *p_soe; - if (yc_n > FAULT_YC_NUM) yc_n = FAULT_YC_NUM; + if (yc_n > FAULT_YC_NUM) + { + yc_n = FAULT_YC_NUM; + } + g_fault_ring.fault[g_fault_ring.in].yc_n = yc_n; for (j = 0; NULL != p_yc && j < yc_n; j++) @@ -617,7 +706,9 @@ LOCAL int32_t cb_fault_num(void *pv_param) ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem); sem_wait(&g_fault_ring.sem); + num = ring_count(g_fault_ring.in, p_out->out, FAULT_EVENT_LEN); + sem_post(&g_fault_ring.sem); return num; } @@ -626,19 +717,28 @@ LOCAL int32_t cb_fault_upd(void *pv_param, uint32_t pos) { st_ring_out_ptr *p_out; - if (0 == pos || NULL == pv_param) return 0; + if (0 == pos || NULL == pv_param) + { + return 0; + } p_out = ring_out_get(pv_param, g_fault_ring.out_ptrs, 4); ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem); sem_wait(&g_fault_ring.sem); + p_out->out = (p_out->out + pos) % FAULT_EVENT_LEN; + sem_post(&g_fault_ring.sem); return 1; } /* =========================== YK (遥控) 回调 =========================== */ -LOCAL uint8_t cb_yk_verify(void *pv_param) { (void)pv_param; return 0; } +LOCAL uint8_t cb_yk_verify(void *pv_param) +{ + (void)pv_param; + return 0; +} LOCAL int cb_yk_set(Yk_Info *pst_info, void *pv_param) { @@ -649,7 +749,10 @@ LOCAL int cb_yk_set(Yk_Info *pst_info, void *pv_param) for (idx = 0; idx < vec.size(); idx++) { - if (vec[idx].inf != pst_info->uiInfoAddr || NULL == vec[idx].p_data) continue; + if (vec[idx].inf != pst_info->uiInfoAddr || NULL == vec[idx].p_data) + { + continue; + } /* 单点遥控: 状态值直接写入 */ if (0 == ((stru_iec *)pv_param)->cs10x.usYxType) @@ -659,9 +762,18 @@ LOCAL int cb_yk_set(Yk_Info *pst_info, void *pv_param) /* 双点遥控: 1→0, 2→1 */ else { - if (pst_info->ucStatus == 1) *(uint8_t *)vec[idx].p_data = 0; - else if (pst_info->ucStatus == 2) *(uint8_t *)vec[idx].p_data = 1; - else *(uint8_t *)vec[idx].p_data = pst_info->ucStatus; + if (pst_info->ucStatus == 1) + { + *(uint8_t *)vec[idx].p_data = 0; + } + else if (pst_info->ucStatus == 2) + { + *(uint8_t *)vec[idx].p_data = 1; + } + else + { + *(uint8_t *)vec[idx].p_data = pst_info->ucStatus; + } } } @@ -670,32 +782,65 @@ LOCAL int cb_yk_set(Yk_Info *pst_info, void *pv_param) /* =========================== Param (定值/参数) 回调 =========================== */ -LOCAL uint16_t cb_param_area(uint8_t type, void *p_handle) { (void)type; (void)p_handle; return 1; } -LOCAL uint16_t cb_param_set_area(uint16_t area, void *p_handle) { (void)p_handle; return area; } - -LOCAL uint8_t cb_param_add_iec(uint8_t all, uint8_t force, uint8_t type, IECPARAM_T *pst_val, void *p_param) +LOCAL uint16_t cb_param_area(uint8_t type, void *p_handle) { - (void)all; (void)force; (void)type; (void)pst_val; (void)p_param; + (void)type; + (void)p_handle; return 1; } -LOCAL uint8_t cb_param_rd_run(void *p_param) { (void)p_param; return 1; } -LOCAL uint8_t cb_param_wt_run(void *p_param) { (void)p_param; return 1; } +LOCAL uint16_t cb_param_set_area(uint16_t area, void *p_handle) +{ + (void)p_handle; + return area; +} + +LOCAL uint8_t cb_param_add_iec(uint8_t all, uint8_t force, uint8_t type, IECPARAM_T *pst_val, void *p_param) +{ + (void)all; + (void)force; + (void)type; + (void)pst_val; + (void)p_param; + return 1; +} + +LOCAL uint8_t cb_param_rd_run(void *p_param) +{ + (void)p_param; + return 1; +} + +LOCAL uint8_t cb_param_wt_run(void *p_param) +{ + (void)p_param; + return 1; +} LOCAL uint16_t cb_param_total(void *p_param) { std::vector &vec = iec_cfg_ptr_get()->vec_ao; + (void)p_param; + return (uint16_t)vec.size(); } LOCAL uint8_t cb_param_get(uint8_t type, uint16_t idx, IECPARAM_T *pst_val, void *p_param) { std::vector &vec = iec_cfg_ptr_get()->vec_ao; - (void)type; (void)p_param; - if (idx >= vec.size()) return 0; + + (void)type; + (void)p_param; + + if (idx >= vec.size()) + { + return 0; + } + pst_val->uiInfoAddr = vec[idx].inf; pst_val->ucLen = 1; + return 1; } @@ -703,33 +848,52 @@ LOCAL uint8_t cb_param_get(uint8_t type, uint16_t idx, IECPARAM_T *pst_val, void LOCAL bool cb_dir_get(tFILEDIR_RD_SET *pst_set, tDIR_FILE_INFO *pst_info, uint8_t type, uint16_t item, void *info) { - (void)pst_set; (void)pst_info; (void)type; (void)item; (void)info; + (void)pst_set; + (void)pst_info; + (void)type; + (void)item; + (void)info; return false; } -LOCAL int cb_dir_num(tFILEDIR_RD_SET *pst_set) { (void)pst_set; return 0; } +LOCAL int cb_dir_num(tFILEDIR_RD_SET *pst_set) +{ + (void)pst_set; + return 0; +} LOCAL int cb_file_read(uint32_t offset, uint8_t *p_buf, uint16_t len, void *pv_param) { - (void)offset; (void)p_buf; (void)len; (void)pv_param; + (void)offset; + (void)p_buf; + (void)len; + (void)pv_param; return 0; } LOCAL uint8_t cb_file_wr_check(tFILE_WD_SET *pst_set, void *p_param, void *p_user) { - (void)pst_set; (void)p_param; (void)p_user; + (void)pst_set; + (void)p_param; + (void)p_user; return 0; } LOCAL int cb_file_write(uint32_t offset, uint8_t *p_buf, uint16_t len, void *p_file, void *p_user) { - (void)offset; (void)p_buf; (void)len; (void)p_file; (void)p_user; + (void)offset; + (void)p_buf; + (void)len; + (void)p_file; + (void)p_user; return 0; } LOCAL int cb_file_wr_finish(uint8_t *p_md5, void *p_file, void *p_user) { - (void)p_md5; (void)p_file; (void)p_user; + (void)p_md5; + (void)p_file; + (void)p_user; return 0; } @@ -840,14 +1004,30 @@ LOCAL stru_iec *iec104_ptr_get(uint32_t interface, CS10x_Type type) if (g_iec[i].is_busy) { g_iec[i].tm_out = 0; - if (type == g_iec[i].iec_type) return &g_iec[i]; + + if (type == g_iec[i].iec_type) + { + return &g_iec[i]; + } + g_iec[i].is_busy = 0; } - else free_idx = i; + else + { + free_idx = i; + } } - if (max_tm < g_iec[i].tm_out) { max_tm = g_iec[i].tm_out; max_idx = i; } - if (!g_iec[i].is_busy && free_idx == MAX_IEC_NUM) free_idx = i; + if (max_tm < g_iec[i].tm_out) + { + max_tm = g_iec[i].tm_out; + max_idx = i; + } + + if (!g_iec[i].is_busy && free_idx == MAX_IEC_NUM) + { + free_idx = i; + } } /* 确定用哪个 slot */ @@ -882,7 +1062,10 @@ stru_iec *iec104_get_by_interface(uint32_t interface) for (i = 0; i < MAX_IEC_NUM; i++) { - if (interface == g_iec[i].interface && g_iec[i].is_busy) return &g_iec[i]; + if (interface == g_iec[i].interface && g_iec[i].is_busy) + { + return &g_iec[i]; + } } return NULL; @@ -908,7 +1091,12 @@ LOCAL int iec104_data_tx(uint8_t *p_tx, uint16_t tx_len, void *arg) interface = *(uint32_t *)arg; p_app = app_get_ptr(ENUM_APP_IEC); - if (NULL == p_app) { LOG_E("iec104: app_get_ptr(ENUM_APP_IEC) failed"); return -1; } + + if (NULL == p_app) + { + LOG_E("iec104: app_get_ptr(ENUM_APP_IEC) failed"); + return -1; + } /* 封装消息头 */ p_head = (stru_msg_head *)p_app->rtx.tx; @@ -918,7 +1106,12 @@ LOCAL int iec104_data_tx(uint8_t *p_tx, uint16_t tx_len, void *arg) /* 投递到 MQ_IEC_TO_COM */ p_mq = app_get_msg_queue_ptr(ENUM_MQ_IEC_TO_COM); - if (NULL == p_mq) { LOG_E("iec104: MQ_IEC_TO_COM not found"); return -1; } + + if (NULL == p_mq) + { + LOG_E("iec104: MQ_IEC_TO_COM not found"); + return -1; + } if (0 != task_msg_queue_send(p_mq->p_msg_queue, p_app->rtx.tx, p_mq->msg_size)) { @@ -930,7 +1123,10 @@ LOCAL int iec104_data_tx(uint8_t *p_tx, uint16_t tx_len, void *arg) target = app_get_mq_target(ENUM_MQ_IEC_TO_COM); p_target = app_get_ptr(target.app_id); - if (NULL != p_target && NULL != p_target->p_event) task_event_send(p_target->p_event, target.event); + if (NULL != p_target && NULL != p_target->p_event) + { + task_event_send(p_target->p_event, target.event); + } return 0; } @@ -943,19 +1139,29 @@ int iec104_data_rx(uint8_t *msg) uint8_t *p_rx; uint16_t len; - if (NULL == msg) return -1; + if (NULL == msg) + { + return -1; + } p_head = (stru_msg_head *)msg; interface = p_head->interface; p_rx = p_head->data; len = p_head->len; - if (NULL == p_rx || len < 2) return -1; + if (NULL == p_rx || len < 2) + { + return -1; + } /* 仅处理 IEC-104 帧 (0x68 开头) */ - if (p_rx[0] != 0x68) return -1; + if (p_rx[0] != 0x68) + { + return -1; + } p_iec = iec104_ptr_get(interface, CS104_TYPE_S); + if (NULL == p_iec) { LOG_E("iec104: no free slot for interface 0x%X", interface); @@ -976,7 +1182,10 @@ void iec104_task(uint16_t gap) for (i = 0; i < MAX_IEC_NUM; i++) { - if (!g_iec[i].is_busy) continue; + if (!g_iec[i].is_busy) + { + continue; + } g_iec[i].tm_out += gap; @@ -1001,22 +1210,32 @@ LOCAL void cmd_iec(int argc, char *argv[]) "iec reset 清除所有连接\n"; int i; - if (argc < 2) { printf("%s", help); return; } + if (argc < 2) + { + printf("%s", help); + return; + } if (0 == strcmp(argv[1], "info")) { printf("===== IEC-104 Status =====\n"); + for (i = 0; i < MAX_IEC_NUM; i++) { printf("slot[%d]: busy=%d type=%d if=0x%X tm_out=%u\n", i, g_iec[i].is_busy, g_iec[i].iec_type, g_iec[i].interface, g_iec[i].tm_out); } + printf("SOE: in=%d YC-disturb: in=%d DD-disturb: in=%d Fault: in=%d\n", g_soe_ring.in, g_yc_ring.in, g_dd_ring.in, g_fault_ring.in); } else if (0 == strcmp(argv[1], "reset")) { - for (i = 0; i < MAX_IEC_NUM; i++) memset(&g_iec[i], 0, sizeof(stru_iec)); + for (i = 0; i < MAX_IEC_NUM; i++) + { + memset(&g_iec[i], 0, sizeof(stru_iec)); + } + LOG_I("iec: all slots reset"); } else @@ -1046,6 +1265,7 @@ int app_iec_init1(void *arg) } std::string path = std::string(dir) + "config/IEC60870/iec1014.xml"; + if (0 != iec_cfg_parse(path.c_str())) { LOG_E("app_iec_init1: cfg parse failed: %s", path.c_str()); @@ -1062,7 +1282,13 @@ int app_iec_init1(void *arg) int app_iec_init2(void *arg) { (void)arg; - if (0 != iec104_point_init()) { LOG_E("app_iec_init2: iec104_point_init failed"); return -1; } + + if (0 != iec104_point_init()) + { + LOG_E("app_iec_init2: iec104_point_init failed"); + return -1; + } + LOG_I("app_iec_init2: ok"); return 0; } @@ -1073,7 +1299,11 @@ void *app_iec(void *arg) stru_app_msg_queue *p_mq; uint32_t event; - if (NULL == arg) { LOG_E("app_iec: NULL arg"); return NULL; } + if (NULL == arg) + { + LOG_E("app_iec: NULL arg"); + return NULL; + } p_app = (stru_app *)arg; @@ -1089,6 +1319,7 @@ void *app_iec(void *arg) if (event & EV_IEC_RX_COM) { p_mq = app_get_msg_queue_ptr(ENUM_MQ_COM_TO_IEC); + if (NULL != p_mq) { while (0 == task_msg_queue_try_recv(p_mq->p_msg_queue, p_app->rtx.rx, p_mq->msg_size)) @@ -1099,13 +1330,23 @@ void *app_iec(void *arg) } /* 10ms 定时器 */ - if (event & EV_TIMER1) iec104_task(10); + if (event & EV_TIMER1) + { + iec104_task(10); + } /* 1s 计数 */ - if (event & EV_TIMER3) p_app->run_cnt++; + if (event & EV_TIMER3) + { + p_app->run_cnt++; + } /* 停止信号 */ - if (event & EV_STOP) { LOG_I("app_iec: received EV_STOP, exiting"); break; } + if (event & EV_STOP) + { + LOG_I("app_iec: received EV_STOP, exiting"); + break; + } } return NULL; diff --git a/src/system/libiec/src/iec104_cfg.cpp b/src/system/libiec/src/iec104_cfg.cpp index e9f4968..229922f 100644 --- a/src/system/libiec/src/iec104_cfg.cpp +++ b/src/system/libiec/src/iec104_cfg.cpp @@ -65,9 +65,14 @@ LOCAL int parse_signals(XMLElement *p_root) for (rule_idx = 0; rule_idx < RULE_COUNT; rule_idx++) { XMLElement *p_parent = p_root->FirstChildElement(g_rules[rule_idx].xml_tag); - if (NULL == p_parent) continue; + + if (NULL == p_parent) + { + continue; + } XMLElement *p_sig = p_parent->FirstChildElement(xml_el_signal); + while (NULL != p_sig) { stru_iec_sig entry = {}; @@ -88,7 +93,10 @@ LOCAL int parse_signals(XMLElement *p_root) entry.offset = (NULL != p_attr_offset) ? (float)atof(p_attr_offset) : 0.0f; /* 如果 XML 未指定 type, 使用规则默认值 */ - if (0 == entry.type) entry.type = g_rules[rule_idx].default_type; + if (0 == entry.type) + { + entry.type = g_rules[rule_idx].default_type; + } g_rules[rule_idx].p_vec->push_back(entry); p_sig = p_sig->NextSiblingElement(xml_el_signal); @@ -110,7 +118,11 @@ int iec_cfg_parse(const char *xml_path) XMLDocument doc; XMLElement *p_root; - if (NULL == xml_path) { LOG_E("iec_cfg_parse: NULL path"); return -1; } + if (NULL == xml_path) + { + LOG_E("iec_cfg_parse: NULL path"); + return -1; + } if (XML_SUCCESS != doc.LoadFile(xml_path)) { @@ -119,9 +131,17 @@ int iec_cfg_parse(const char *xml_path) } p_root = doc.RootElement(); - if (NULL == p_root) { LOG_E("iec_cfg_parse: no root element"); return -1; } - if (0 != parse_signals(p_root)) return -1; + if (NULL == p_root) + { + LOG_E("iec_cfg_parse: no root element"); + return -1; + } + + if (0 != parse_signals(p_root)) + { + return -1; + } LOG_I("iec_cfg_parse: %s loaded — ST=%d MX=%d CO=%d DD=%d AO=%d Param=%d", xml_path, (int)g_cfg.vec_st.size(), (int)g_cfg.vec_mx.size(), diff --git a/src/system/libiec/src/iec104_point.cpp b/src/system/libiec/src/iec104_point.cpp index 284b7f1..63d168b 100644 --- a/src/system/libiec/src/iec104_point.cpp +++ b/src/system/libiec/src/iec104_point.cpp @@ -30,15 +30,24 @@ LOCAL void on_st_change(const char *p_saddr, uint8_t data_type, const void *p_va uint8_t last; (void)data_type; - if (NULL == p_saddr || NULL == p_val || NULL == p_prev) return; + + if (NULL == p_saddr || NULL == p_val || NULL == p_prev) + { + return; + } std::string link(p_saddr); + for (i = 0; i < vec.size(); i++) { - if (vec[i].link != link) continue; + if (vec[i].link != link) + { + continue; + } val = *(const uint8_t *)p_val; last = *(const uint8_t *)p_prev; + if (val != last) { cb_soe_write(i, val, (uint32_t)time(NULL), 0); @@ -55,16 +64,28 @@ LOCAL void on_mx_change(const char *p_saddr, uint8_t data_type, const void *p_va float last; (void)data_type; - if (NULL == p_saddr || NULL == p_val || NULL == p_prev) return; + + if (NULL == p_saddr || NULL == p_val || NULL == p_prev) + { + return; + } std::string link(p_saddr); + for (i = 0; i < vec.size(); i++) { - if (vec[i].link != link) continue; + if (vec[i].link != link) + { + continue; + } val = *(const float *)p_val; last = *(const float *)p_prev; - if (fabsf(val - last) > 0.1f) cb_yc_disturb_write(i, val); + + if (fabsf(val - last) > 0.1f) + { + cb_yc_disturb_write(i, val); + } } } @@ -76,15 +97,24 @@ LOCAL void on_dd_change(const char *p_saddr, uint8_t data_type, const void *p_va float last; (void)data_type; - if (NULL == p_saddr || NULL == p_val || NULL == p_prev) return; + + if (NULL == p_saddr || NULL == p_val || NULL == p_prev) + { + return; + } std::string link(p_saddr); + for (i = 0; i < vec.size(); i++) { - if (vec[i].link != link) continue; + if (vec[i].link != link) + { + continue; + } val = *(const float *)p_val; last = *(const float *)p_prev; + if (fabsf(val - last) > 0.1f) { cb_dd_disturb_write(i, val, (uint32_t)time(NULL), 0); @@ -96,13 +126,21 @@ LOCAL void on_dd_change(const char *p_saddr, uint8_t data_type, const void *p_va LOCAL void on_yk_change(const char *p_saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t zone, const void *p_val) { /* YK 由 CS10x SetYkInfor 回调直接写入 datacenter, 此处预留 */ - (void)p_saddr; (void)step; (void)data_type; (void)zone; (void)p_val; + (void)p_saddr; + (void)step; + (void)data_type; + (void)zone; + (void)p_val; } LOCAL void on_ao_change(const char *p_saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t zone, const void *p_val) { /* AO 由 CS10x 参数回调写入 datacenter, 此处预留 */ - (void)p_saddr; (void)step; (void)data_type; (void)zone; (void)p_val; + (void)p_saddr; + (void)step; + (void)data_type; + (void)zone; + (void)p_val; } /* =========================== 数据中心事件队列消费 =========================== */ @@ -113,7 +151,10 @@ LOCAL void on_dc_soe(void *p_data) std::vector &vec = iec_cfg_ptr_get()->vec_st; uint32_t i; - if (NULL == p_data) return; + if (NULL == p_data) + { + return; + } p_event = (dc_soe_event_t *)p_data; std::string link(p_event->saddr); @@ -135,16 +176,24 @@ LOCAL void on_dc_fault(void *p_data) iec_soe_info_t soe; uint32_t i; - if (NULL == p_data) return; + if (NULL == p_data) + { + return; + } p_event = (dc_fault_event_t *)p_data; std::string link(p_event->saddr); /* 查找对应 YX 在 vec_st 中的索引 */ memset(&soe, 0, sizeof(soe)); + for (i = 0; i < vec_st.size(); i++) { - if (vec_st[i].link == link) { soe.info_addr = i; break; } + if (vec_st[i].link == link) + { + soe.info_addr = i; + break; + } } soe.status = 1; @@ -160,7 +209,10 @@ LOCAL void on_dc_disturb_dd(void *p_data) std::vector &vec = iec_cfg_ptr_get()->vec_dd; uint32_t i; - if (NULL == p_data) return; + if (NULL == p_data) + { + return; + } p_event = (dc_disturb_event_t *)p_data; std::string link(p_event->saddr); @@ -197,6 +249,7 @@ int iec104_point_init(void) /* 2. 获取配置 */ p_cfg = iec_cfg_ptr_get(); + if (NULL == p_cfg) { LOG_E("iec104_point_init: cfg is NULL"); @@ -206,40 +259,35 @@ int iec104_point_init(void) /* 3. 注册信号 link & 变更回调 */ for (auto &sig : p_cfg->vec_st) { - dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, - on_st_change, IEC_MODULE_NAME); + dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_st_change, IEC_MODULE_NAME); } for (auto &sig : p_cfg->vec_mx) { - dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, - on_mx_change, IEC_MODULE_NAME); + dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_mx_change, IEC_MODULE_NAME); } for (auto &sig : p_cfg->vec_dd) { - dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, - on_dd_change, IEC_MODULE_NAME); + dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_dd_change, IEC_MODULE_NAME); } for (auto &sig : p_cfg->vec_co) { - dc_signal_yk_link_with_callback(sig.link.c_str(), &sig.p_data, - on_yk_change, IEC_MODULE_NAME); + dc_signal_yk_link_with_callback(sig.link.c_str(), &sig.p_data, on_yk_change, IEC_MODULE_NAME); } for (auto &sig : p_cfg->vec_ao) { - dc_signal_ao_link_with_callback(sig.link.c_str(), &sig.p_data, - on_ao_change, IEC_MODULE_NAME); + dc_signal_ao_link_with_callback(sig.link.c_str(), &sig.p_data, on_ao_change, IEC_MODULE_NAME); } /* Param: 无变更回调, 仅注册信号 */ p_dummy = NULL; + for (auto &sig : p_cfg->vec_param) { - dc_signal_param(sig.link.c_str(), sig.desc.c_str(), sig.type, - DC_CTRL_SBO, &p_dummy, 1, NULL, IEC_MODULE_NAME); + dc_signal_param(sig.link.c_str(), sig.desc.c_str(), sig.type, DC_CTRL_SBO, &p_dummy, 1, NULL, IEC_MODULE_NAME); } LOG_I("iec104_point_init: ST=%d MX=%d CO=%d DD=%d AO=%d Param=%d",