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:
ypc 2026-07-10 12:07:54 +08:00
parent 8914d9cb98
commit fe893c4c75
3 changed files with 402 additions and 93 deletions

View File

@ -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) 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); 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++) 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 }; st_ring_out_ptr new_ptr = { protocol, 0, ch };
@ -194,7 +201,10 @@ LOCAL int cb_get_time(__CP56Time2a *p_time)
struct tm st; struct tm st;
uint16_t total_ms; uint16_t total_ms;
if (NULL == p_time) return 0; if (NULL == p_time)
{
return 0;
}
clock_gettime(CLOCK_REALTIME, &ts); clock_gettime(CLOCK_REALTIME, &ts);
gmtime_r(&ts.tv_sec, &st); gmtime_r(&ts.tv_sec, &st);
@ -217,7 +227,10 @@ LOCAL int cb_set_time(__CP56Time2a *p_time)
uint16_t ms; uint16_t ms;
struct timespec ts; struct timespec ts;
if (NULL == p_time) return 0; if (NULL == p_time)
{
return 0;
}
memset(&st, 0, sizeof(st)); memset(&st, 0, sizeof(st));
st.tm_year = p_time->ucYear + 100; st.tm_year = p_time->ucYear + 100;
@ -235,18 +248,28 @@ LOCAL int cb_set_time(__CP56Time2a *p_time)
return 1; 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 (遥信) 回调 =========================== */ /* =========================== YX (遥信) 回调 =========================== */
LOCAL int32_t cb_yx_count(uint16_t group, void *pv_param, uint32_t *p_start, uint32_t *p_end) 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; 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_start = YX_START_PORT;
*p_end = *p_start + vec.size(); *p_end = *p_start + vec.size();
return (int32_t)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; stru_iec *p_iec;
(void)group; (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_iec = iec104_get_by_interface(*(uint32_t *)pv_param);
p_sig = &vec[idx]; 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) if (NULL != p_iec && p_iec->cs10x.usYxType)
{ {
pst_info->ucStateType = 1; pst_info->ucStateType = 1;
if (p_sig->invert) if (p_sig->invert)
{ {
if (pst_info->ucStatus == 2) pst_info->ucStatus = 1; if (pst_info->ucStatus == 2)
else if (pst_info->ucStatus == 1) 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) 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; 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_start = YC_START_PORT;
*p_end = *p_start + vec.size(); *p_end = *p_start + vec.size();
return (int32_t)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; stru_iec_sig *p_sig;
float raw_val; float raw_val;
(void)group; (void)pv_param; (void)group;
if (idx >= vec.size()) return 0; (void)pv_param;
if (idx >= vec.size())
{
return 0;
}
p_sig = &vec[idx]; p_sig = &vec[idx];
raw_val = (NULL != p_sig->p_data) ? *(float *)p_sig->p_data : 0.0f; 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); ring_sem_init(&g_yc_ring.init, &g_yc_ring.sem);
sem_wait(&g_yc_ring.sem); sem_wait(&g_yc_ring.sem);
num = ring_count(g_yc_ring.in, p_out->out, DISTURB_YC_LEN); num = ring_count(g_yc_ring.in, p_out->out, DISTURB_YC_LEN);
sem_post(&g_yc_ring.sem); sem_post(&g_yc_ring.sem);
return num; 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; 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); p_out = ring_out_get(pv_param, g_yc_ring.out_ptrs, 1);
ring_sem_init(&g_yc_ring.init, &g_yc_ring.sem); ring_sem_init(&g_yc_ring.init, &g_yc_ring.sem);
sem_wait(&g_yc_ring.sem); sem_wait(&g_yc_ring.sem);
p_out->out = (p_out->out + pos) % DISTURB_YC_LEN; p_out->out = (p_out->out + pos) % DISTURB_YC_LEN;
sem_post(&g_yc_ring.sem); sem_post(&g_yc_ring.sem);
return 1; 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); sem_wait(&g_soe_ring.sem);
read_idx = (pos + p_out->out) % SOE_LEN; read_idx = (pos + p_out->out) % SOE_LEN;
pst_info->uiInfoAddr = g_soe_ring.soe[read_idx].pot; pst_info->uiInfoAddr = g_soe_ring.soe[read_idx].pot;
pst_info->ucStatus = g_soe_ring.soe[read_idx].st; pst_info->ucStatus = g_soe_ring.soe[read_idx].st;
pst_info->ucStateType = g_soe_ring.soe[read_idx].ty; 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); ring_sem_init(&g_soe_ring.init, &g_soe_ring.sem);
sem_wait(&g_soe_ring.sem); sem_wait(&g_soe_ring.sem);
num = ring_count(g_soe_ring.in, p_out->out, SOE_LEN); num = ring_count(g_soe_ring.in, p_out->out, SOE_LEN);
sem_post(&g_soe_ring.sem); sem_post(&g_soe_ring.sem);
return num; return num;
} }
@ -430,12 +483,17 @@ LOCAL int32_t cb_soe_upd(void *pv_param, uint32_t pos)
{ {
st_ring_out_ptr *p_out; 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); p_out = ring_out_get(pv_param, g_soe_ring.out_ptrs, 2);
ring_sem_init(&g_soe_ring.init, &g_soe_ring.sem); ring_sem_init(&g_soe_ring.init, &g_soe_ring.sem);
sem_wait(&g_soe_ring.sem); sem_wait(&g_soe_ring.sem);
p_out->out = (p_out->out + pos) % SOE_LEN; p_out->out = (p_out->out + pos) % SOE_LEN;
sem_post(&g_soe_ring.sem); sem_post(&g_soe_ring.sem);
return 1; 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 (group == 0)
{ {
if (time_en) return 0; if (time_en)
{
return 0;
}
*p_start = DD_START_PORT; *p_start = DD_START_PORT;
*p_end = *p_start + num; *p_end = *p_start + num;
return (int32_t)num; return (int32_t)num;
} }
/* group 1: 前 8 个不带时标, 其余带时标 */ /* group 1: 前 8 个不带时标, 其余带时标 */
split = 8; split = 8;
if (time_en) if (time_en)
{ {
*p_start = DD_START_PORT + split; *p_start = DD_START_PORT + split;
split = (int)num - split; split = (int)num - split;
*p_end = *p_start + split; *p_end = *p_start + split;
return (split > 0) ? split : 0; return (split > 0) ? split : 0;
} }
*p_start = DD_START_PORT; *p_start = DD_START_PORT;
*p_end = *p_start + split; *p_end = *p_start + split;
return 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; std::vector<stru_iec_sig> &vec = iec_cfg_ptr_get()->vec_dd;
stru_iec_sig *p_sig; stru_iec_sig *p_sig;
(void)group; (void)time_en; (void)pv_param; (void)group;
if (idx >= vec.size()) return 0; (void)time_en;
(void)pv_param;
if (idx >= vec.size())
{
return 0;
}
p_sig = &vec[idx]; p_sig = &vec[idx];
pst_info->uiInfoAddr = p_sig->inf; pst_info->uiInfoAddr = p_sig->inf;
pst_info->fVal = (NULL != p_sig->p_data) ? *(float *)p_sig->p_data : 0.0f; pst_info->fVal = (NULL != p_sig->p_data) ? *(float *)p_sig->p_data : 0.0f;
memset(&pst_info->stCTime, 0, sizeof(pst_info->stCTime)); memset(&pst_info->stCTime, 0, sizeof(pst_info->stCTime));
return 1; 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); sem_wait(&g_dd_ring.sem);
read_idx = (pos + p_out->out) % DD_LEN; read_idx = (pos + p_out->out) % DD_LEN;
pst_info->uiInfoAddr = g_dd_ring.dd[read_idx].idx; pst_info->uiInfoAddr = g_dd_ring.dd[read_idx].idx;
pst_info->fVal = g_dd_ring.dd[read_idx].val; 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); ring_sem_init(&g_dd_ring.init, &g_dd_ring.sem);
sem_wait(&g_dd_ring.sem); sem_wait(&g_dd_ring.sem);
num = ring_count(g_dd_ring.in, p_out->out, DD_LEN); num = ring_count(g_dd_ring.in, p_out->out, DD_LEN);
sem_post(&g_dd_ring.sem); sem_post(&g_dd_ring.sem);
return num; 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; 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); p_out = ring_out_get(pv_param, g_dd_ring.out_ptrs, 3);
ring_sem_init(&g_dd_ring.init, &g_dd_ring.sem); ring_sem_init(&g_dd_ring.init, &g_dd_ring.sem);
sem_wait(&g_dd_ring.sem); sem_wait(&g_dd_ring.sem);
p_out->out = (p_out->out + pos) % DD_LEN; p_out->out = (p_out->out + pos) % DD_LEN;
sem_post(&g_dd_ring.sem); sem_post(&g_dd_ring.sem);
return 1; 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; 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); ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem);
sem_wait(&g_fault_ring.sem); sem_wait(&g_fault_ring.sem);
g_fault_ring.fault[g_fault_ring.in].soe = *p_soe; 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; g_fault_ring.fault[g_fault_ring.in].yc_n = yc_n;
for (j = 0; NULL != p_yc && j < yc_n; j++) 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); ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem);
sem_wait(&g_fault_ring.sem); sem_wait(&g_fault_ring.sem);
num = ring_count(g_fault_ring.in, p_out->out, FAULT_EVENT_LEN); num = ring_count(g_fault_ring.in, p_out->out, FAULT_EVENT_LEN);
sem_post(&g_fault_ring.sem); sem_post(&g_fault_ring.sem);
return num; return num;
} }
@ -626,19 +717,28 @@ LOCAL int32_t cb_fault_upd(void *pv_param, uint32_t pos)
{ {
st_ring_out_ptr *p_out; 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); p_out = ring_out_get(pv_param, g_fault_ring.out_ptrs, 4);
ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem); ring_sem_init(&g_fault_ring.init, &g_fault_ring.sem);
sem_wait(&g_fault_ring.sem); sem_wait(&g_fault_ring.sem);
p_out->out = (p_out->out + pos) % FAULT_EVENT_LEN; p_out->out = (p_out->out + pos) % FAULT_EVENT_LEN;
sem_post(&g_fault_ring.sem); sem_post(&g_fault_ring.sem);
return 1; return 1;
} }
/* =========================== YK (遥控) 回调 =========================== */ /* =========================== 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) 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++) 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) 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 */ /* 双点遥控: 1→0, 2→1 */
else else
{ {
if (pst_info->ucStatus == 1) *(uint8_t *)vec[idx].p_data = 0; if (pst_info->ucStatus == 1)
else if (pst_info->ucStatus == 2) *(uint8_t *)vec[idx].p_data = 1; {
else *(uint8_t *)vec[idx].p_data = pst_info->ucStatus; *(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 (定值/参数) 回调 =========================== */ /* =========================== 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_area(uint8_t type, void *p_handle)
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; (void)type;
(void)p_handle;
return 1; return 1;
} }
LOCAL uint8_t cb_param_rd_run(void *p_param) { (void)p_param; return 1; } LOCAL uint16_t cb_param_set_area(uint16_t area, void *p_handle)
LOCAL uint8_t cb_param_wt_run(void *p_param) { (void)p_param; return 1; } {
(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) LOCAL uint16_t cb_param_total(void *p_param)
{ {
std::vector<stru_iec_sig> &vec = iec_cfg_ptr_get()->vec_ao; std::vector<stru_iec_sig> &vec = iec_cfg_ptr_get()->vec_ao;
(void)p_param; (void)p_param;
return (uint16_t)vec.size(); return (uint16_t)vec.size();
} }
LOCAL uint8_t cb_param_get(uint8_t type, uint16_t idx, IECPARAM_T *pst_val, void *p_param) 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; 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->uiInfoAddr = vec[idx].inf;
pst_val->ucLen = 1; pst_val->ucLen = 1;
return 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) 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; 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) 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; return 0;
} }
LOCAL uint8_t cb_file_wr_check(tFILE_WD_SET *pst_set, void *p_param, void *p_user) 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; return 0;
} }
LOCAL int cb_file_write(uint32_t offset, uint8_t *p_buf, uint16_t len, void *p_file, void *p_user) 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; return 0;
} }
LOCAL int cb_file_wr_finish(uint8_t *p_md5, void *p_file, void *p_user) 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; return 0;
} }
@ -840,14 +1004,30 @@ LOCAL stru_iec *iec104_ptr_get(uint32_t interface, CS10x_Type type)
if (g_iec[i].is_busy) if (g_iec[i].is_busy)
{ {
g_iec[i].tm_out = 0; g_iec[i].tm_out = 0;
if (type == g_iec[i].iec_type) return &g_iec[i];
g_iec[i].is_busy = 0; if (type == g_iec[i].iec_type)
} {
else free_idx = i; return &g_iec[i];
} }
if (max_tm < g_iec[i].tm_out) { max_tm = g_iec[i].tm_out; max_idx = i; } g_iec[i].is_busy = 0;
if (!g_iec[i].is_busy && free_idx == MAX_IEC_NUM) 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;
}
} }
/* 确定用哪个 slot */ /* 确定用哪个 slot */
@ -882,7 +1062,10 @@ stru_iec *iec104_get_by_interface(uint32_t interface)
for (i = 0; i < MAX_IEC_NUM; i++) 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; 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; interface = *(uint32_t *)arg;
p_app = app_get_ptr(ENUM_APP_IEC); 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; 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 */ /* 投递到 MQ_IEC_TO_COM */
p_mq = app_get_msg_queue_ptr(ENUM_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)) 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); target = app_get_mq_target(ENUM_MQ_IEC_TO_COM);
p_target = app_get_ptr(target.app_id); 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; return 0;
} }
@ -943,19 +1139,29 @@ int iec104_data_rx(uint8_t *msg)
uint8_t *p_rx; uint8_t *p_rx;
uint16_t len; uint16_t len;
if (NULL == msg) return -1; if (NULL == msg)
{
return -1;
}
p_head = (stru_msg_head *)msg; p_head = (stru_msg_head *)msg;
interface = p_head->interface; interface = p_head->interface;
p_rx = p_head->data; p_rx = p_head->data;
len = p_head->len; len = p_head->len;
if (NULL == p_rx || len < 2) return -1; if (NULL == p_rx || len < 2)
{
return -1;
}
/* 仅处理 IEC-104 帧 (0x68 开头) */ /* 仅处理 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); p_iec = iec104_ptr_get(interface, CS104_TYPE_S);
if (NULL == p_iec) if (NULL == p_iec)
{ {
LOG_E("iec104: no free slot for interface 0x%X", interface); 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++) 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; g_iec[i].tm_out += gap;
@ -1001,22 +1210,32 @@ LOCAL void cmd_iec(int argc, char *argv[])
"iec reset 清除所有连接\n"; "iec reset 清除所有连接\n";
int i; int i;
if (argc < 2) { printf("%s", help); return; } if (argc < 2)
{
printf("%s", help);
return;
}
if (0 == strcmp(argv[1], "info")) if (0 == strcmp(argv[1], "info"))
{ {
printf("===== IEC-104 Status =====\n"); printf("===== IEC-104 Status =====\n");
for (i = 0; i < MAX_IEC_NUM; i++) for (i = 0; i < MAX_IEC_NUM; i++)
{ {
printf("slot[%d]: busy=%d type=%d if=0x%X tm_out=%u\n", 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); 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", 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); g_soe_ring.in, g_yc_ring.in, g_dd_ring.in, g_fault_ring.in);
} }
else if (0 == strcmp(argv[1], "reset")) 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"); LOG_I("iec: all slots reset");
} }
else else
@ -1046,6 +1265,7 @@ int app_iec_init1(void *arg)
} }
std::string path = std::string(dir) + "config/IEC60870/iec1014.xml"; std::string path = std::string(dir) + "config/IEC60870/iec1014.xml";
if (0 != iec_cfg_parse(path.c_str())) if (0 != iec_cfg_parse(path.c_str()))
{ {
LOG_E("app_iec_init1: cfg parse failed: %s", 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) int app_iec_init2(void *arg)
{ {
(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"); LOG_I("app_iec_init2: ok");
return 0; return 0;
} }
@ -1073,7 +1299,11 @@ void *app_iec(void *arg)
stru_app_msg_queue *p_mq; stru_app_msg_queue *p_mq;
uint32_t event; 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; p_app = (stru_app *)arg;
@ -1089,6 +1319,7 @@ void *app_iec(void *arg)
if (event & EV_IEC_RX_COM) if (event & EV_IEC_RX_COM)
{ {
p_mq = app_get_msg_queue_ptr(ENUM_MQ_COM_TO_IEC); p_mq = app_get_msg_queue_ptr(ENUM_MQ_COM_TO_IEC);
if (NULL != p_mq) if (NULL != p_mq)
{ {
while (0 == task_msg_queue_try_recv(p_mq->p_msg_queue, p_app->rtx.rx, p_mq->msg_size)) 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 定时器 */ /* 10ms 定时器 */
if (event & EV_TIMER1) iec104_task(10); if (event & EV_TIMER1)
{
iec104_task(10);
}
/* 1s 计数 */ /* 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; return NULL;

View File

@ -65,9 +65,14 @@ LOCAL int parse_signals(XMLElement *p_root)
for (rule_idx = 0; rule_idx < RULE_COUNT; rule_idx++) for (rule_idx = 0; rule_idx < RULE_COUNT; rule_idx++)
{ {
XMLElement *p_parent = p_root->FirstChildElement(g_rules[rule_idx].xml_tag); 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); XMLElement *p_sig = p_parent->FirstChildElement(xml_el_signal);
while (NULL != p_sig) while (NULL != p_sig)
{ {
stru_iec_sig entry = {}; 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; entry.offset = (NULL != p_attr_offset) ? (float)atof(p_attr_offset) : 0.0f;
/* 如果 XML 未指定 type, 使用规则默认值 */ /* 如果 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); g_rules[rule_idx].p_vec->push_back(entry);
p_sig = p_sig->NextSiblingElement(xml_el_signal); p_sig = p_sig->NextSiblingElement(xml_el_signal);
@ -110,7 +118,11 @@ int iec_cfg_parse(const char *xml_path)
XMLDocument doc; XMLDocument doc;
XMLElement *p_root; 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)) if (XML_SUCCESS != doc.LoadFile(xml_path))
{ {
@ -119,9 +131,17 @@ int iec_cfg_parse(const char *xml_path)
} }
p_root = doc.RootElement(); 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", 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(), xml_path, (int)g_cfg.vec_st.size(), (int)g_cfg.vec_mx.size(),

View File

@ -30,15 +30,24 @@ LOCAL void on_st_change(const char *p_saddr, uint8_t data_type, const void *p_va
uint8_t last; uint8_t last;
(void)data_type; (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); std::string link(p_saddr);
for (i = 0; i < vec.size(); i++) 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; val = *(const uint8_t *)p_val;
last = *(const uint8_t *)p_prev; last = *(const uint8_t *)p_prev;
if (val != last) if (val != last)
{ {
cb_soe_write(i, val, (uint32_t)time(NULL), 0); 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; float last;
(void)data_type; (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); std::string link(p_saddr);
for (i = 0; i < vec.size(); i++) for (i = 0; i < vec.size(); i++)
{ {
if (vec[i].link != link) continue; if (vec[i].link != link)
{
continue;
}
val = *(const float *)p_val; val = *(const float *)p_val;
last = *(const float *)p_prev; 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; float last;
(void)data_type; (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); std::string link(p_saddr);
for (i = 0; i < vec.size(); i++) for (i = 0; i < vec.size(); i++)
{ {
if (vec[i].link != link) continue; if (vec[i].link != link)
{
continue;
}
val = *(const float *)p_val; val = *(const float *)p_val;
last = *(const float *)p_prev; last = *(const float *)p_prev;
if (fabsf(val - last) > 0.1f) if (fabsf(val - last) > 0.1f)
{ {
cb_dd_disturb_write(i, val, (uint32_t)time(NULL), 0); 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) 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, 此处预留 */ /* 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) 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, 此处预留 */ /* 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; std::vector<stru_iec_sig> &vec = iec_cfg_ptr_get()->vec_st;
uint32_t i; uint32_t i;
if (NULL == p_data) return; if (NULL == p_data)
{
return;
}
p_event = (dc_soe_event_t *)p_data; p_event = (dc_soe_event_t *)p_data;
std::string link(p_event->saddr); std::string link(p_event->saddr);
@ -135,16 +176,24 @@ LOCAL void on_dc_fault(void *p_data)
iec_soe_info_t soe; iec_soe_info_t soe;
uint32_t i; uint32_t i;
if (NULL == p_data) return; if (NULL == p_data)
{
return;
}
p_event = (dc_fault_event_t *)p_data; p_event = (dc_fault_event_t *)p_data;
std::string link(p_event->saddr); std::string link(p_event->saddr);
/* 查找对应 YX 在 vec_st 中的索引 */ /* 查找对应 YX 在 vec_st 中的索引 */
memset(&soe, 0, sizeof(soe)); memset(&soe, 0, sizeof(soe));
for (i = 0; i < vec_st.size(); i++) 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; 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; std::vector<stru_iec_sig> &vec = iec_cfg_ptr_get()->vec_dd;
uint32_t i; uint32_t i;
if (NULL == p_data) return; if (NULL == p_data)
{
return;
}
p_event = (dc_disturb_event_t *)p_data; p_event = (dc_disturb_event_t *)p_data;
std::string link(p_event->saddr); std::string link(p_event->saddr);
@ -197,6 +249,7 @@ int iec104_point_init(void)
/* 2. 获取配置 */ /* 2. 获取配置 */
p_cfg = iec_cfg_ptr_get(); p_cfg = iec_cfg_ptr_get();
if (NULL == p_cfg) if (NULL == p_cfg)
{ {
LOG_E("iec104_point_init: cfg is NULL"); LOG_E("iec104_point_init: cfg is NULL");
@ -206,40 +259,35 @@ int iec104_point_init(void)
/* 3. 注册信号 link & 变更回调 */ /* 3. 注册信号 link & 变更回调 */
for (auto &sig : p_cfg->vec_st) for (auto &sig : p_cfg->vec_st)
{ {
dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_st_change, IEC_MODULE_NAME);
on_st_change, IEC_MODULE_NAME);
} }
for (auto &sig : p_cfg->vec_mx) for (auto &sig : p_cfg->vec_mx)
{ {
dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_mx_change, IEC_MODULE_NAME);
on_mx_change, IEC_MODULE_NAME);
} }
for (auto &sig : p_cfg->vec_dd) for (auto &sig : p_cfg->vec_dd)
{ {
dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, dc_signal_out_link_with_callback(sig.link.c_str(), &sig.p_data, on_dd_change, IEC_MODULE_NAME);
on_dd_change, IEC_MODULE_NAME);
} }
for (auto &sig : p_cfg->vec_co) for (auto &sig : p_cfg->vec_co)
{ {
dc_signal_yk_link_with_callback(sig.link.c_str(), &sig.p_data, dc_signal_yk_link_with_callback(sig.link.c_str(), &sig.p_data, on_yk_change, IEC_MODULE_NAME);
on_yk_change, IEC_MODULE_NAME);
} }
for (auto &sig : p_cfg->vec_ao) for (auto &sig : p_cfg->vec_ao)
{ {
dc_signal_ao_link_with_callback(sig.link.c_str(), &sig.p_data, dc_signal_ao_link_with_callback(sig.link.c_str(), &sig.p_data, on_ao_change, IEC_MODULE_NAME);
on_ao_change, IEC_MODULE_NAME);
} }
/* Param: 无变更回调, 仅注册信号 */ /* Param: 无变更回调, 仅注册信号 */
p_dummy = NULL; p_dummy = NULL;
for (auto &sig : p_cfg->vec_param) for (auto &sig : p_cfg->vec_param)
{ {
dc_signal_param(sig.link.c_str(), sig.desc.c_str(), sig.type, dc_signal_param(sig.link.c_str(), sig.desc.c_str(), sig.type, DC_CTRL_SBO, &p_dummy, 1, NULL, IEC_MODULE_NAME);
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", LOG_I("iec104_point_init: ST=%d MX=%d CO=%d DD=%d AO=%d Param=%d",