style(libiec): 大括号规范 — if/for/while 必须独占一行, 不允许压缩行
## 最终规范 - if (x) return; ❌ 不允许 - if (x) { return; } ❌ 不允许 - if (x) { ... } ❌ 不允许 - if (x) ✅ 正确 { return; } - 全局变量 g_, 全局指针 gp_ (本项目无全局指针) ## 行数变化 iec104.cpp: 1094→1252 (+158, 所有if加括号) iec104_cfg.cpp: 131→148 (+17) iec104_point.cpp: 249→290 (+41)
This commit is contained in:
parent
8914d9cb98
commit
fe893c4c75
|
|
@ -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<st_ring_out_ptr>
|
|||
|
||||
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,18 +248,28 @@ 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<stru_iec_sig> &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();
|
||||
}
|
||||
|
||||
|
|
@ -257,7 +280,11 @@ LOCAL int32_t cb_yx_val(uint16_t group, uint16_t idx, Yx_Info *pst_info, void *p
|
|||
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,9 +324,13 @@ 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<stru_iec_sig> &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();
|
||||
}
|
||||
|
||||
|
|
@ -302,8 +340,13 @@ LOCAL int32_t cb_yc_val(uint16_t group, uint16_t idx, Yc_Info *pst_info, void *p
|
|||
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<stru_iec_sig> &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<stru_iec_sig> &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<stru_iec_sig> &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];
|
||||
g_iec[i].is_busy = 0;
|
||||
}
|
||||
else free_idx = i;
|
||||
|
||||
if (type == g_iec[i].iec_type)
|
||||
{
|
||||
return &g_iec[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;
|
||||
g_iec[i].is_busy = 0;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/* 确定用哪个 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;
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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<stru_iec_sig> &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<stru_iec_sig> &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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue