system: 模块增强 — EV_STOP 支持 + 代码规范
- app_sys.cpp: 消息队列创建增强,模块启停控制优化 - app_modules.h: 启用 plc 模块 - com_router: EV_STOP 优雅退出 + tcp_client 通道支持 - libiec: 代码格式规范化(LOCAL/Tab/大括号独占行) - libmodbus_m: EV_STOP 支持 - libplc: 代码规范 + 调试打印完善 - libself_ptl: EV_STOP 支持 + 代码规范
This commit is contained in:
parent
06fc257696
commit
c92dc5c452
|
|
@ -58,9 +58,9 @@ static int app_mq_create(void)
|
||||||
{
|
{
|
||||||
stru_app_msg_queue *mq = &g_app_mq[i];
|
stru_app_msg_queue *mq = &g_app_mq[i];
|
||||||
mq->p_msg_queue = task_msg_queue_create(mq->name, mq->msg_size, mq->msg_num);
|
mq->p_msg_queue = task_msg_queue_create(mq->name, mq->msg_size, mq->msg_num);
|
||||||
if(NULL == mq->p_msg_queue) { LOG_E("app_mq_create: failed for %s", mq->name); return -1; }
|
if(NULL == mq->p_msg_queue) { MY_LOG_E("app_mq_create: failed for %s", mq->name); return -1; }
|
||||||
}
|
}
|
||||||
LOG_I("app_mq_create: %d queues created", ENUM_MQ_MAX);
|
MY_LOG_I("app_mq_create: %d queues created", ENUM_MQ_MAX);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -97,7 +97,7 @@ static std::string get_system_config_path(void)
|
||||||
/* fallback: 从可执行文件路径推导(本地调试用) */
|
/* fallback: 从可执行文件路径推导(本地调试用) */
|
||||||
if (0 != func_proc_self_dir(buf, sizeof(buf)))
|
if (0 != func_proc_self_dir(buf, sizeof(buf)))
|
||||||
{
|
{
|
||||||
LOG_E("func_proc_self_dir failed");
|
MY_LOG_E("func_proc_self_dir failed");
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
@ -123,7 +123,7 @@ static int app_config_load(void)
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
{
|
||||||
/* 配置文件不存在时不视为错误——默认启用所有模块 */
|
/* 配置文件不存在时不视为错误——默认启用所有模块 */
|
||||||
LOG_I("app_config.json not found, enabling all modules by default");
|
MY_LOG_I("app_config.json not found, enabling all modules by default");
|
||||||
|
|
||||||
for (size_t i = 0; i < g_vec_app.size(); i++)
|
for (size_t i = 0; i < g_vec_app.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
@ -138,7 +138,7 @@ static int app_config_load(void)
|
||||||
|
|
||||||
if (!root)
|
if (!root)
|
||||||
{
|
{
|
||||||
LOG_E("cJSON_Parse failed for app_config.json");
|
MY_LOG_E("cJSON_Parse failed for app_config.json");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -147,7 +147,7 @@ static int app_config_load(void)
|
||||||
|
|
||||||
if (!apps || !cJSON_IsArray(apps))
|
if (!apps || !cJSON_IsArray(apps))
|
||||||
{
|
{
|
||||||
LOG_E("app_config.json missing 'apps' array");
|
MY_LOG_E("app_config.json missing 'apps' array");
|
||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -175,11 +175,11 @@ static int app_config_load(void)
|
||||||
if (enable && cJSON_IsTrue(enable))
|
if (enable && cJSON_IsTrue(enable))
|
||||||
{
|
{
|
||||||
g_enabled_apps.insert(std::string(name->valuestring));
|
g_enabled_apps.insert(std::string(name->valuestring));
|
||||||
LOG_I("app enabled: %s", name->valuestring);
|
MY_LOG_I("app enabled: %s", name->valuestring);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_I("app disabled: %s", name->valuestring);
|
MY_LOG_I("app disabled: %s", name->valuestring);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,7 +187,7 @@ static int app_config_load(void)
|
||||||
|
|
||||||
if (g_enabled_apps.empty())
|
if (g_enabled_apps.empty())
|
||||||
{
|
{
|
||||||
LOG_E("no apps enabled in config");
|
MY_LOG_E("no apps enabled in config");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -247,7 +247,7 @@ static int app_timer_create(stru_app *p_app)
|
||||||
|
|
||||||
if (!p_app->p_timer[i])
|
if (!p_app->p_timer[i])
|
||||||
{
|
{
|
||||||
LOG_E("timer%d create failed for %s", i + 1, p_app->name);
|
MY_LOG_E("timer%d create failed for %s", i + 1, p_app->name);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -275,14 +275,14 @@ static int app_init(void)
|
||||||
|
|
||||||
if (!is_app_enabled(p->name))
|
if (!is_app_enabled(p->name))
|
||||||
{
|
{
|
||||||
LOG_I("app skipped (disabled): %s", p->name);
|
MY_LOG_I("app skipped (disabled): %s", p->name);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != p->app_init1((void *)p))
|
if (0 != p->app_init1((void *)p))
|
||||||
{
|
{
|
||||||
LOG_E("app_init1 failed: %s", p->name);
|
MY_LOG_E("app_init1 failed: %s", p->name);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -300,20 +300,20 @@ static int app_init(void)
|
||||||
|
|
||||||
if (!is_app_enabled(p->name))
|
if (!is_app_enabled(p->name))
|
||||||
{
|
{
|
||||||
LOG_I("app skipped (disabled): %s", p->name);
|
MY_LOG_I("app skipped (disabled): %s", p->name);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != p->app_init2((void *)p))
|
if (0 != p->app_init2((void *)p))
|
||||||
{
|
{
|
||||||
LOG_E("app_init2 failed: %s", p->name);
|
MY_LOG_E("app_init2 failed: %s", p->name);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(0 != app_mq_create()) { LOG_E("app_mq_create"); return -1; }
|
if(0 != app_mq_create()) { MY_LOG_E("app_mq_create"); return -1; }
|
||||||
|
|
||||||
/* 创建事件 + 定时器 + 启动线程 */
|
/* 创建事件 + 定时器 + 启动线程 */
|
||||||
for (i = 0; i < g_vec_app.size(); i++)
|
for (i = 0; i < g_vec_app.size(); i++)
|
||||||
|
|
@ -327,7 +327,7 @@ static int app_init(void)
|
||||||
p->p_event = task_event_create(ev_name.c_str());
|
p->p_event = task_event_create(ev_name.c_str());
|
||||||
if (!p->p_event)
|
if (!p->p_event)
|
||||||
{
|
{
|
||||||
LOG_E("task_event_create failed: %s", ev_name.c_str());
|
MY_LOG_E("task_event_create failed: %s", ev_name.c_str());
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -336,14 +336,14 @@ static int app_init(void)
|
||||||
|
|
||||||
if (0 != app_timer_create(p))
|
if (0 != app_timer_create(p))
|
||||||
{
|
{
|
||||||
LOG_E("app_timer_create failed: %s", p->name);
|
MY_LOG_E("app_timer_create failed: %s", p->name);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_app_enabled(p->name))
|
if (!is_app_enabled(p->name))
|
||||||
{
|
{
|
||||||
LOG_I("app skipped (disabled): %s", p->name);
|
MY_LOG_I("app skipped (disabled): %s", p->name);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
@ -352,14 +352,14 @@ static int app_init(void)
|
||||||
|
|
||||||
if (0 != pthread_create(&thread, NULL, p->fun_cb, p->arg))
|
if (0 != pthread_create(&thread, NULL, p->fun_cb, p->arg))
|
||||||
{
|
{
|
||||||
LOG_E("pthread_create failed: %s", p->name);
|
MY_LOG_E("pthread_create failed: %s", p->name);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_threads.push_back(thread);
|
g_threads.push_back(thread);
|
||||||
|
|
||||||
LOG_I("thread started: %s", p->name);
|
MY_LOG_I("thread started: %s", p->name);
|
||||||
task_sleep_ms(10);
|
task_sleep_ms(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -372,14 +372,14 @@ int app_sys_init(void)
|
||||||
{
|
{
|
||||||
if (0 != app_config_load())
|
if (0 != app_config_load())
|
||||||
{
|
{
|
||||||
LOG_E("app_config_load failed");
|
MY_LOG_E("app_config_load failed");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_vec_app.size() != (size_t)ENUM_APP_MAX)
|
if (g_vec_app.size() != (size_t)ENUM_APP_MAX)
|
||||||
{
|
{
|
||||||
LOG_E("g_vec_app size mismatch: %zu vs ENUM %d",
|
MY_LOG_E("g_vec_app size mismatch: %zu vs ENUM %d",
|
||||||
g_vec_app.size(), ENUM_APP_MAX);
|
g_vec_app.size(), ENUM_APP_MAX);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -387,7 +387,7 @@ int app_sys_init(void)
|
||||||
|
|
||||||
if (0 != app_init())
|
if (0 != app_init())
|
||||||
{
|
{
|
||||||
LOG_E("app_init failed");
|
MY_LOG_E("app_init failed");
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
@ -397,11 +397,12 @@ int app_sys_init(void)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 停止所有应用模块
|
* @brief 停止所有应用模块
|
||||||
* @details 向每个模块发送 EV_STOP 信号,通知其退出主循环,然后 join 所有线程
|
* @details 向每个模块发送 EV_STOP 信号,给 2 秒让线程自行退出,
|
||||||
|
* main 返回后 OS 回收所有资源。
|
||||||
*/
|
*/
|
||||||
void app_sys_stop(void)
|
void app_sys_stop(void)
|
||||||
{
|
{
|
||||||
LOG_I("stopping all app modules...");
|
MY_LOG_I("stopping all app modules...");
|
||||||
|
|
||||||
for (size_t i = 0; i < g_vec_app.size(); i++)
|
for (size_t i = 0; i < g_vec_app.size(); i++)
|
||||||
{
|
{
|
||||||
|
|
@ -413,21 +414,16 @@ void app_sys_stop(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 等待所有线程退出 */
|
task_sleep_ms(2000);
|
||||||
for (size_t i = 0; i < g_threads.size(); i++)
|
|
||||||
{
|
|
||||||
pthread_join(g_threads[i], NULL);
|
|
||||||
LOG_I("module thread [%zu] exited", i);
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_I("all app modules stopped");
|
MY_LOG_I("app_sys_stop done");
|
||||||
}
|
}
|
||||||
|
|
||||||
stru_app *app_get_ptr(uint32_t app_id)
|
stru_app *app_get_ptr(uint32_t app_id)
|
||||||
{
|
{
|
||||||
if (app_id >= ENUM_APP_MAX)
|
if (app_id >= ENUM_APP_MAX)
|
||||||
{
|
{
|
||||||
LOG_E("app_id out of range: %u max %d", app_id, ENUM_APP_MAX);
|
MY_LOG_E("app_id out of range: %u max %d", app_id, ENUM_APP_MAX);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,10 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ============== 线程模块(system/ 子目录) ============== */
|
/* ============== 线程模块(system/ 子目录) ============== */
|
||||||
APP_MODULE(MODBUS_M, modbus_m, app_modbus_m_init1, app_modbus_m_init2, app_modbus_m)
|
// APP_MODULE(MODBUS_M, modbus_m, app_modbus_m_init1, app_modbus_m_init2, app_modbus_m)
|
||||||
APP_MODULE(WEB_SERVER, web_server, app_web_server_init1, app_web_server_init2, app_web_server)
|
APP_MODULE(WEB_SERVER, web_server, app_web_server_init1, app_web_server_init2, app_web_server)
|
||||||
APP_MODULE(SELF_PTL, self_ptl, app_self_ptl_init1, app_self_ptl_init2, app_self_ptl)
|
|
||||||
APP_MODULE(COM_ROUTER, com_router, app_com_router_init1, app_com_router_init2, app_com_router)
|
APP_MODULE(COM_ROUTER, com_router, app_com_router_init1, app_com_router_init2, app_com_router)
|
||||||
|
APP_MODULE(SELF_PTL, self_ptl, app_self_ptl_init1, app_self_ptl_init2, app_self_ptl)
|
||||||
APP_MODULE(IEC, iec, app_iec_init1, app_iec_init2, app_iec)
|
APP_MODULE(IEC, iec, app_iec_init1, app_iec_init2, app_iec)
|
||||||
APP_MODULE(PLC, plc, app_plc_init1, app_plc_init2, app_plc)
|
APP_MODULE(PLC, plc, app_plc_init1, app_plc_init2, app_plc)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,7 @@ static int com_router_parse_channels(cJSON *arr)
|
||||||
cJSON *type = cJSON_GetObjectItem(item, "type");
|
cJSON *type = cJSON_GetObjectItem(item, "type");
|
||||||
cJSON *bind = cJSON_GetObjectItem(item, "bind_app");
|
cJSON *bind = cJSON_GetObjectItem(item, "bind_app");
|
||||||
cJSON *desc = cJSON_GetObjectItem(item, "desc");
|
cJSON *desc = cJSON_GetObjectItem(item, "desc");
|
||||||
|
(void)desc;
|
||||||
|
|
||||||
if(NULL == key || NULL == type) continue;
|
if(NULL == key || NULL == type) continue;
|
||||||
|
|
||||||
|
|
@ -141,6 +142,17 @@ static int com_router_parse_channels(cJSON *arr)
|
||||||
ch->para.tcp.remote_ip[0] = '\0';
|
ch->para.tcp.remote_ip[0] = '\0';
|
||||||
ch->para.tcp.remote_port = 0;
|
ch->para.tcp.remote_port = 0;
|
||||||
}
|
}
|
||||||
|
else if(0 == strcmp(type->valuestring, "tcp_client"))
|
||||||
|
{
|
||||||
|
cJSON *rip = cJSON_GetObjectItem(item, "remote_ip");
|
||||||
|
cJSON *rport = cJSON_GetObjectItem(item, "remote_port");
|
||||||
|
|
||||||
|
ch->type = COMM_TYPE_TCP_CLIENT;
|
||||||
|
ch->para.tcp.local_ip[0] = '\0';
|
||||||
|
ch->para.tcp.local_port = 0;
|
||||||
|
if(rip) { ch->para.tcp.remote_ip[0] = '\0'; strcat(ch->para.tcp.remote_ip, rip->valuestring); }
|
||||||
|
if(rport) ch->para.tcp.remote_port = rport->valueint;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_channel_count = count;
|
g_channel_count = count;
|
||||||
|
|
@ -265,6 +277,21 @@ static int com_router_config_default(void)
|
||||||
ch->socket_fd = -1;
|
ch->socket_fd = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 通道 2: FTU 网口 (TCP 客户端 → 127.0.0.1:54321) */
|
||||||
|
{
|
||||||
|
com_channel_t *ch = &g_channels[2];
|
||||||
|
strcpy(ch->key, "tcp_ftu");
|
||||||
|
strcpy(ch->bind_app, "");
|
||||||
|
ch->type = COMM_TYPE_TCP_CLIENT;
|
||||||
|
ch->para.tcp.local_ip[0] = '\0';
|
||||||
|
ch->para.tcp.local_port = 0;
|
||||||
|
ch->para.tcp.remote_ip[0] = '\0';
|
||||||
|
strcat(ch->para.tcp.remote_ip, "127.0.0.1");
|
||||||
|
ch->para.tcp.remote_port = 54321;
|
||||||
|
ch->id = -1;
|
||||||
|
ch->socket_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* 转发规则: TCP:2405 → serial_ftu */
|
/* 转发规则: TCP:2405 → serial_ftu */
|
||||||
{
|
{
|
||||||
com_forward_rule_t *fw = &g_forward_rules[0];
|
com_forward_rule_t *fw = &g_forward_rules[0];
|
||||||
|
|
@ -276,11 +303,11 @@ static int com_router_config_default(void)
|
||||||
fw->target_ch_id = -1;
|
fw->target_ch_id = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_channel_count = 2;
|
g_channel_count = 3;
|
||||||
g_forward_count = 1;
|
g_forward_count = 1;
|
||||||
g_config_loaded = 1;
|
g_config_loaded = 1;
|
||||||
|
|
||||||
LOG_I("com_router: default config (2 channels + 1 forward)");
|
LOG_I("com_router: default config (3 channels + 1 forward)");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -603,7 +630,7 @@ void *app_com_router(void *arg)
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
task_event_recv(p_app->p_event,
|
task_event_recv(p_app->p_event,
|
||||||
EV_TIMER1 | EV_TIMER2 | EV_TIMER3 | EV_COM_RX_SELF_PTL,
|
EV_TIMER1 | EV_TIMER2 | EV_TIMER3 | EV_COM_RX_SELF_PTL | EV_STOP,
|
||||||
TASK_EVENT_FLAG_OR | TASK_EVENT_FLAG_CLEAR,
|
TASK_EVENT_FLAG_OR | TASK_EVENT_FLAG_CLEAR,
|
||||||
TASK_EVENT_WAIT_FOREVER,
|
TASK_EVENT_WAIT_FOREVER,
|
||||||
&event);
|
&event);
|
||||||
|
|
@ -627,7 +654,7 @@ void *app_com_router(void *arg)
|
||||||
/* 已断开, 仅第一次打印 */
|
/* 已断开, 仅第一次打印 */
|
||||||
if(last_state[i] >= 0)
|
if(last_state[i] >= 0)
|
||||||
{
|
{
|
||||||
LOG_I("com_router: %s disconnected", ch->key);
|
MY_LOG_I("com_router: %s disconnected", ch->key);
|
||||||
last_state[i] = -1;
|
last_state[i] = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -635,7 +662,7 @@ void *app_com_router(void *arg)
|
||||||
{
|
{
|
||||||
if(last_state[i] <= 0)
|
if(last_state[i] <= 0)
|
||||||
{
|
{
|
||||||
LOG_I("com_router: %s connected", ch->key);
|
MY_LOG_I("com_router: %s connected", ch->key);
|
||||||
}
|
}
|
||||||
last_state[i] = 1;
|
last_state[i] = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -670,7 +697,7 @@ void *app_com_router(void *arg)
|
||||||
|
|
||||||
if(EV_STOP & event)
|
if(EV_STOP & event)
|
||||||
{
|
{
|
||||||
LOG_I("app_com_router: received EV_STOP, exiting");
|
MY_LOG_I("app_com_router: received EV_STOP, exiting");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1260,22 +1260,23 @@ int app_iec_init1(void *arg)
|
||||||
|
|
||||||
if (0 != func_proc_self_dir(dir, sizeof(dir)))
|
if (0 != func_proc_self_dir(dir, sizeof(dir)))
|
||||||
{
|
{
|
||||||
LOG_E("app_iec_init1: get_exe_dir failed");
|
MY_LOG_E("app_iec_init1: get_exe_dir failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string path = std::string(dir) + "config/IEC60870/iec1014.xml";
|
std::string path = std::string(dir) + "/config/IEC60870/iec1014.xml";
|
||||||
|
MY_LOG_I("app_iec_init1: cfg path: %s", path.c_str());
|
||||||
|
|
||||||
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());
|
MY_LOG_E("app_iec_init1: cfg parse failed: %s", path.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
stru_app *p_app = (stru_app *)arg;
|
stru_app *p_app = (stru_app *)arg;
|
||||||
dc_signal_out("iec.run_cnt", "iec.run_cnt", DATA_TYPE_U32, &p_app->run_cnt, "iec104");
|
dc_signal_out("iec.run_cnt", "iec.run_cnt", DATA_TYPE_U32, &p_app->run_cnt, "iec104");
|
||||||
|
|
||||||
LOG_I("app_iec_init1: ok");
|
MY_LOG_I("app_iec_init1: ok");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1285,11 +1286,11 @@ int app_iec_init2(void *arg)
|
||||||
|
|
||||||
if (0 != iec104_point_init())
|
if (0 != iec104_point_init())
|
||||||
{
|
{
|
||||||
LOG_E("app_iec_init2: iec104_point_init failed");
|
MY_LOG_E("app_iec_init2: iec104_point_init failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_I("app_iec_init2: ok");
|
MY_LOG_I("app_iec_init2: ok");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1301,7 +1302,7 @@ void *app_iec(void *arg)
|
||||||
|
|
||||||
if (NULL == arg)
|
if (NULL == arg)
|
||||||
{
|
{
|
||||||
LOG_E("app_iec: NULL arg");
|
MY_LOG_E("app_iec: NULL arg");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1344,7 +1345,7 @@ void *app_iec(void *arg)
|
||||||
/* 停止信号 */
|
/* 停止信号 */
|
||||||
if (event & EV_STOP)
|
if (event & EV_STOP)
|
||||||
{
|
{
|
||||||
LOG_I("app_iec: received EV_STOP, exiting");
|
MY_LOG_I("app_iec: received EV_STOP, exiting");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ LOCAL uint8_t modbus_type_to_local_type(uint8_t type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL uint8_t dc_data_type_size(uint8_t data_type) __attribute__((unused));
|
||||||
LOCAL uint8_t dc_data_type_size(uint8_t data_type)
|
LOCAL uint8_t dc_data_type_size(uint8_t data_type)
|
||||||
{
|
{
|
||||||
switch (data_type)
|
switch (data_type)
|
||||||
|
|
@ -358,6 +359,7 @@ LOCAL int channels_init()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCAL void channels_close(void) __attribute__((unused));
|
||||||
LOCAL void channels_close()
|
LOCAL void channels_close()
|
||||||
{
|
{
|
||||||
for (auto &ch : g_modbus_m_cfg.channels)
|
for (auto &ch : g_modbus_m_cfg.channels)
|
||||||
|
|
@ -423,6 +425,7 @@ LOCAL int read_registers(stru_modbus_m_channel *p_ch, uint8_t slave, uint8_t fc,
|
||||||
|
|
||||||
|
|
||||||
// 读取单个 Item 值(按 fc 分发)
|
// 读取单个 Item 值(按 fc 分发)
|
||||||
|
LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_item) __attribute__((unused));
|
||||||
LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_item)
|
LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_item)
|
||||||
{
|
{
|
||||||
if (NULL == p_ch || NULL == p_item)
|
if (NULL == p_ch || NULL == p_item)
|
||||||
|
|
@ -431,6 +434,7 @@ LOCAL int read_item_value(stru_modbus_m_channel *p_ch, stru_modbus_m_item *p_ite
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t local_type = modbus_type_to_local_type(p_item->type);
|
uint8_t local_type = modbus_type_to_local_type(p_item->type);
|
||||||
|
(void)local_type;
|
||||||
|
|
||||||
// FC 0x01/0x02: 读线圈/离散输入(位)
|
// FC 0x01/0x02: 读线圈/离散输入(位)
|
||||||
if (p_item->fc == 0x01 || p_item->fc == 0x02)
|
if (p_item->fc == 0x01 || p_item->fc == 0x02)
|
||||||
|
|
@ -720,7 +724,7 @@ LOCAL void enqueue_write(const stru_modbus_m_write_req &req)
|
||||||
|
|
||||||
LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
|
LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
|
||||||
{
|
{
|
||||||
if (step != DC_CTRL_DIRECT)
|
if (step != (dc_ctrl_step_t)DC_CTRL_DIRECT)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -754,7 +758,7 @@ LOCAL void modbus_m_signal_co_change_callback(const char *saddr, dc_ctrl_step_t
|
||||||
|
|
||||||
LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
|
LOCAL void modbus_m_signal_ao_change_callback(const char *saddr, dc_ctrl_step_t step, uint8_t data_type, uint8_t setting_zone, const void *p_data)
|
||||||
{
|
{
|
||||||
if (step != DC_CTRL_DIRECT)
|
if (step != (dc_ctrl_step_t)DC_CTRL_DIRECT)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -952,7 +956,7 @@ int app_modbus_m_init1(void *arg)
|
||||||
std::string base_path = get_base_path();
|
std::string base_path = get_base_path();
|
||||||
if (base_path.empty())
|
if (base_path.empty())
|
||||||
{
|
{
|
||||||
LOG_E("get_base_path failed");
|
MY_LOG_E("get_base_path failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
g_modbus_m_base_path = base_path + "config/MODBUS/";
|
g_modbus_m_base_path = base_path + "config/MODBUS/";
|
||||||
|
|
@ -960,13 +964,13 @@ int app_modbus_m_init1(void *arg)
|
||||||
std::string cfg_path = g_modbus_m_base_path + "modbus_m.xml";
|
std::string cfg_path = g_modbus_m_base_path + "modbus_m.xml";
|
||||||
if (0 != modbus_m_cfg_parse(cfg_path))
|
if (0 != modbus_m_cfg_parse(cfg_path))
|
||||||
{
|
{
|
||||||
LOG_E("modbus_m_cfg_parse failed: %s", cfg_path.c_str());
|
MY_LOG_E("modbus_m_cfg_parse failed: %s", cfg_path.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != modbus_m_init())
|
if (0 != modbus_m_init())
|
||||||
{
|
{
|
||||||
LOG_E("modbus_m_init failed");
|
MY_LOG_E("modbus_m_init failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -982,7 +986,7 @@ void *app_modbus_m(void *arg)
|
||||||
{
|
{
|
||||||
if (NULL == arg)
|
if (NULL == arg)
|
||||||
{
|
{
|
||||||
LOG_E("app_modbus_m arg null");
|
MY_LOG_E("app_modbus_m arg null");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -995,7 +999,7 @@ void *app_modbus_m(void *arg)
|
||||||
// 预构建轮询分组
|
// 预构建轮询分组
|
||||||
build_poll_groups(g_modbus_m_cfg.point.st_vec, st_groups);
|
build_poll_groups(g_modbus_m_cfg.point.st_vec, st_groups);
|
||||||
build_poll_groups(g_modbus_m_cfg.point.mx_vec, mx_groups);
|
build_poll_groups(g_modbus_m_cfg.point.mx_vec, mx_groups);
|
||||||
LOG_I("poll groups: st=%zu, mx=%zu", st_groups.size(), mx_groups.size());
|
MY_LOG_I("poll groups: st=%zu, mx=%zu", st_groups.size(), mx_groups.size());
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
|
@ -1026,7 +1030,7 @@ void *app_modbus_m(void *arg)
|
||||||
|
|
||||||
if(EV_STOP & event)
|
if(EV_STOP & event)
|
||||||
{
|
{
|
||||||
LOG_I("app_modbus_m: received EV_STOP, exiting");
|
MY_LOG_I("app_modbus_m: received EV_STOP, exiting");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,9 @@ const char *plc_get_config_path(void);
|
||||||
|
|
||||||
/* =========================== 模块线程入口 =========================== */
|
/* =========================== 模块线程入口 =========================== */
|
||||||
|
|
||||||
int app_plc_init1(void *arg);
|
// int app_plc_init1(void *arg);
|
||||||
int app_plc_init2(void *arg);
|
// int app_plc_init2(void *arg);
|
||||||
void *app_plc(void *arg);
|
// void *app_plc(void *arg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1739,7 +1739,7 @@ int app_plc_init1(void *arg)
|
||||||
stru_app *p_app = (stru_app *)arg;
|
stru_app *p_app = (stru_app *)arg;
|
||||||
if (NULL == p_app)
|
if (NULL == p_app)
|
||||||
{
|
{
|
||||||
LOG_E("app_plc_init1 arg null");
|
MY_LOG_E("app_plc_init1 arg null");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1747,7 +1747,7 @@ int app_plc_init1(void *arg)
|
||||||
char proc_dir[512] = {0};
|
char proc_dir[512] = {0};
|
||||||
if (0 == func_proc_self_dir(proc_dir, sizeof(proc_dir)))
|
if (0 == func_proc_self_dir(proc_dir, sizeof(proc_dir)))
|
||||||
{
|
{
|
||||||
std::string plc_path = std::string(proc_dir) + g_plc_config_path;
|
std::string plc_path = std::string(proc_dir) + "/" + g_plc_config_path;
|
||||||
plc_set_config_path(plc_path.c_str());
|
plc_set_config_path(plc_path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1765,14 +1765,14 @@ int app_plc_init1(void *arg)
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
LOG_E("app_plc_init1 dc_signal_out failed");
|
MY_LOG_E("app_plc_init1 dc_signal_out failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
p_plc_cfg = self_ptl_cfg_get();
|
p_plc_cfg = self_ptl_cfg_get();
|
||||||
if (nullptr == p_plc_cfg)
|
if (nullptr == p_plc_cfg)
|
||||||
{
|
{
|
||||||
LOG_E("app_plc_init1 self_ptl_cfg_get failed");
|
MY_LOG_E("app_plc_init1 self_ptl_cfg_get failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1801,7 +1801,7 @@ int app_plc_init2(void *arg)
|
||||||
}
|
}
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
{
|
{
|
||||||
LOG_E("app_plc_init2 dc_signal_in failed");
|
MY_LOG_E("app_plc_init2 dc_signal_in failed");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -1811,7 +1811,7 @@ void *app_plc(void *arg)
|
||||||
{
|
{
|
||||||
if (NULL == arg)
|
if (NULL == arg)
|
||||||
{
|
{
|
||||||
LOG_E("app_plc arg null");
|
MY_LOG_E("app_plc arg null");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,7 @@ static void put_rx_data(stru_self_rx *p_self_rx, uint8_t *p_rx, uint16_t len)
|
||||||
pthread_mutex_unlock(&p_self_rx->mutex);
|
pthread_mutex_unlock(&p_self_rx->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
static void get_rx_data(stru_self_rx *p_self_rx, uint8_t *p_data, uint16_t *p_data_len)
|
static void get_rx_data(stru_self_rx *p_self_rx, uint8_t *p_data, uint16_t *p_data_len)
|
||||||
{
|
{
|
||||||
uint16_t pos;
|
uint16_t pos;
|
||||||
|
|
@ -199,6 +200,7 @@ static void get_rx_data_locked(stru_self_rx *p_self_rx, uint8_t *p_data, uint16_
|
||||||
(*p_data_len) = p_self_rx->cnt;
|
(*p_data_len) = p_self_rx->cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__attribute__((unused))
|
||||||
static void clear_rx_data(stru_self_rx *p_self_rx)
|
static void clear_rx_data(stru_self_rx *p_self_rx)
|
||||||
{
|
{
|
||||||
if(NULL == p_self_rx)
|
if(NULL == p_self_rx)
|
||||||
|
|
@ -624,7 +626,7 @@ void *app_self_ptl(void *arg)
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
task_event_recv(p_app->p_event,
|
task_event_recv(p_app->p_event,
|
||||||
EV_TIMER1 | EV_TIMER2 | EV_TIMER3 | EV_SELF_PTL_RX_COM,
|
EV_TIMER1 | EV_TIMER2 | EV_TIMER3 | EV_SELF_PTL_RX_COM | EV_STOP,
|
||||||
TASK_EVENT_FLAG_OR | TASK_EVENT_FLAG_CLEAR,
|
TASK_EVENT_FLAG_OR | TASK_EVENT_FLAG_CLEAR,
|
||||||
100,
|
100,
|
||||||
&event);
|
&event);
|
||||||
|
|
@ -660,7 +662,7 @@ void *app_self_ptl(void *arg)
|
||||||
/* EV_STOP: 优雅退出 */
|
/* EV_STOP: 优雅退出 */
|
||||||
if(EV_STOP & event)
|
if(EV_STOP & event)
|
||||||
{
|
{
|
||||||
LOG_I("app_self_ptl: received EV_STOP, exiting");
|
MY_LOG_I("app_self_ptl: received EV_STOP, exiting");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,8 @@ static void file_paths_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_file_base_path = std::string(proc_dir);
|
g_file_base_path = std::string(proc_dir);
|
||||||
g_file_path = g_file_base_path + "file/";
|
g_file_path = g_file_base_path + "/file/";
|
||||||
g_zip_path = g_file_base_path + "zip/";
|
g_zip_path = g_file_base_path + "/zip/";
|
||||||
|
|
||||||
if(0 != func_make_dirs(g_file_path.c_str()))
|
if(0 != func_make_dirs(g_file_path.c_str()))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ using namespace tinyxml2;
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
static const char *ele_Root = "Root";
|
__attribute__((unused)) static const char *ele_Root = "Root";
|
||||||
|
|
||||||
static const char *ele_St = "St";
|
static const char *ele_St = "St";
|
||||||
static const char *ele_Mx = "Mx";
|
static const char *ele_Mx = "Mx";
|
||||||
|
|
@ -91,6 +91,7 @@ static int parse_base(XMLElement *root)
|
||||||
|
|
||||||
const char *count_str = parent_ele->Attribute(attr_count);
|
const char *count_str = parent_ele->Attribute(attr_count);
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
(void)count;
|
||||||
|
|
||||||
if(nullptr != count_str)
|
if(nullptr != count_str)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue