Files
kunlun/cli/host_interface/plc/iot_cli_plc_module.c
2024-09-28 14:24:04 +08:00

311 lines
8.6 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#include "iot_errno.h"
#include "iot_io.h"
#include "iot_app.h"
#include "iot_config.h"
#include "iot_system.h"
#include "iot_oem_api.h"
#include "iot_board_api.h"
#include "iot_cli_host_interface.h"
#include "iot_cli_plc_module.h"
#include "iot_cli_plc_tx_rx.h"
#include "iot_cli_plc_nw.h"
#include "iot_cli_host_upgrade.h"
#include "iot_cli_ckb.h"
#include "iot_cli_dbg_log.h"
#include "iot_cli_ada_dump.h"
#include "iot_cli_ul_buf.h"
#include "iot_cli_discovery.h"
#include "iot_cli_rate_test.h"
#include "iot_cli_set_info.h"
#include "iot_cli_plc_mgr_alive.h"
#include "iot_cli_hw_ver.h"
#if PLC_SUPPORT_CCO_ROLE
extern CLI_MSG_ENTRY
all_cli_cco_msg_entry[];
#endif
extern CLI_MSG_ENTRY
all_cli_sta_msg_entry[];
extern iot_cli_host_info_t *host_info;
extern iot_cli_t cli;
extern uint8_t cli_ftm_mode;
extern uint32_t cli_module_type;
iot_plc_host_config_t *host_config = NULL;
#if PLC_COMM_ENABLE
static uint8_t iot_cli_register()
{
iot_plc_app_t host_app;
host_app.app_id = IOT_PLC_APP_HOST_INTERFACE;
host_app.param = NULL;
host_app.prio = 3;
host_app.recv = iot_cli_plc_recv;
host_config->app_handle = iot_plc_register_app(&host_app);
if (host_config->app_handle == NULL) {
iot_printf("App handle NULL (%s)\n", __FUNCTION__);
return ERR_INVAL;
}
return ERR_OK;
}
#else
static uint8_t iot_cli_register()
{
host_config->app_handle = NULL;
return ERR_OK;
}
#endif /* PLC_COMM_ENABLE */
uint8_t iot_cli_module_handle_msg(
cli_moduleid_t moduleid, uint32_t msgid, iot_cli_msg_t *msg)
{
#if PLC_SUPPORT_CCO_ROLE
if (iot_plc_is_client_mode())
{
if (cli_execute_msg_entry(moduleid, msgid, all_cli_sta_msg_entry, msg)) {
return 1;
}
} else {
if (cli_execute_msg_entry(moduleid, msgid, all_cli_cco_msg_entry, msg)) {
return 1;
}
}
#else
if (cli_execute_msg_entry(moduleid, msgid, all_cli_sta_msg_entry, msg)) {
return 1;
}
#endif
return 0;
}
uint8_t iot_cli_module_handle_task_msg(iot_cli_msg_t *cli_msg, uint16_t id)
{
uint8_t handled = 1;
switch (id) {
case IOT_CLI_HOST_MSG:
cli_handle_plc_msg(cli_msg->data);
break;
case IOT_CLI_UPGRADE_TIMER:
iot_cli_upgrade_handle_timer_msg();
break;
case IOT_CLI_RATE_TEST_TIMER:
iot_cli_rate_test_handle_timer_msg();
break;
case IOT_CLI_SG_MSG:
iot_cli_sg_handle_msg(cli_msg->data);
break;
case IOT_CLI_SET_TIMER:
iot_cli_set_info_handle_timer_msg();
break;
case IOT_CLI_QUERY_HW_TIMER:
iot_cli_query_hw_ver_handle_timer_msg();
break;
#if PLC_SUPPORT_CCO_ROLE
case IOT_CLI_RPT_TOPO_TIMER:
iot_plc_query_nw_topo(host_config->app_handle,
host_config->cli_request_id, host_config->topo_ver,
IOT_PLC_QUERY_TOPO_START_AS_TEI,
host_config->topo_query_start_index,
host_config->topo_count_in_packet);
break;
case IOT_CLI_BCAST_TX_DONE:
cli_remote_upgrade_bcast_tx_done();
break;
#endif
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
case IOT_CLI_ADA_MSG:
iot_cli_handle_ada_msg(cli_msg->data);
break;
case IOT_CLI_DUMP_TIMER:
iot_cli_ada_dump_handle_timer_msg();
break;
#endif
#if IOT_TPUT_APP_ENABLE
case IOT_CLI_TPUT_MSG:
iot_cli_tput_handle_msg(cli_msg->data);
break;
#endif
default:
handled = 0;
break;
}
return handled;
}
uint8_t iot_cli_module_cancel_task_msg(
iot_cli_msg_t *cli_msg, uint16_t id)
{
switch (id) {
case IOT_CLI_HOST_MSG:
case IOT_CLI_UPGRADE_TIMER:
case IOT_CLI_RATE_TEST_TIMER:
case IOT_CLI_SG_MSG:
case IOT_CLI_SET_TIMER:
case IOT_CLI_QUERY_HW_TIMER:
case IOT_CLI_RPT_TOPO_TIMER:
case IOT_CLI_BCAST_TX_DONE:
#if IOT_TPUT_APP_ENABLE
case IOT_CLI_TPUT_MSG:
#endif
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
case IOT_CLI_ADA_MSG:
case IOT_CLI_DUMP_TIMER:
#endif
if (cli_msg->data) {
iot_pkt_free(cli_msg->data);
}
break;
default:
break;
}
return 1;
}
void iot_cli_module_init_uart(commnucator_t * com, uint8_t interface_type)
{
if (com && (com->is_initiated == 0)) {
#if (HW_PLATFORM != HW_PLATFORM_SIMU) && (!IOT_STA_CONTROL_MODE)
if ((MODULE_TYPE_CCO == cli_module_type) || cli_ftm_mode) {
#endif
com->type = interface_type;
if (com->type == COMMUNICATOR_UART)
{
os_mem_set(&(com->uart_frame), 0, sizeof(iot_frame_fmt));
com->uart_frame.preamble_codelen = 2;
os_mem_cpy(com->uart_frame.preamble_code, "##", 2);
com->uart_frame.backcode_len = 2;
os_mem_cpy(com->uart_frame.backcode, "@@", 2);
com->uart_frame.datalen_offset = 20;
com->uart_frame.datalen_size = 4;
com->uart_frame.backcode_offset = 0;
com->uart_frame.frame_timeout = 200;
}
#if IOT_STA_CONTROL_MODE > IOT_STA_CONTROL_TYPE_PPM_DETECT
// TODO: reserved for config depending on GPIO
IOT_ASSERT(0);
#else
#if HW_PLATFORM == HW_PLATFORM_SIMU
com->com_num = UART_CLI_PORT;
#else
com->com_num = iot_board_get_uart(UART_CLI_PORT);
#endif
#endif
commnunicator_init(com, &cli, CALLER_PLC_CLI, 1);
#if (HW_PLATFORM != HW_PLATFORM_SIMU) && (!IOT_STA_CONTROL_MODE)
}
#endif
cli.commu.is_initiated = 1;
}
}
/* timer for rpt topo data */
void iot_cli_rpt_topo_data_timer(timer_id_t timer_id, void *arg)
{
(void)timer_id;
(void)arg;
iot_task_msg_t *msg;
msg = iot_cli_create_cli_msg(IOT_CLI_RPT_TOPO_TIMER, NULL);
if (msg) {
iot_task_queue_msg(cli.cli_task_h, msg, IOT_CLI_QUEUE_TIMER);
}
}
uint8_t iot_cli_proto_module_init()
{
uint8_t ret = ERR_OK;
host_config = (iot_plc_host_config_t*)
os_mem_malloc(IOT_CLI_MID, sizeof(iot_plc_host_config_t));
if (host_config == NULL) {
ret = ERR_NOMEM;
goto label_failed1;
}
os_mem_set(host_config, 0, sizeof(host_config));
// resiter cli app to plc lib
ret = iot_cli_register();
if (ret != ERR_OK) {
goto label_failed1;
}
host_config->dev_role = IOT_PLC_DEV_ROLE_INVALID;
host_config->dev_type = IOT_PLC_DEV_TYPE_INVAL;
#if PLC_SUPPORT_CCO_ROLE
host_config->topo_data_timer = os_create_timer(IOT_CLI_MID, 0,
iot_cli_rpt_topo_data_timer, NULL);
iot_cli_ckb_init();
#endif
#if IOT_CLI_CKB_ADDR_MAPPING
iot_cli_addr_mapping_init();
#endif /* IOT_CLI_CKB_ADDR_MAPPING */
#if (PLC_SUPPORT_CCO_ROLE || (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA))
iot_cli_plc_mgr_alive_init();
#endif
iot_cli_rate_test_init();
iot_cli_set_info_init();
iot_cli_dbg_log_init();
iot_cli_query_hw_ver_init();
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
iot_cli_ada_dump_init();
#endif
#if PLC_SUPPORT_CCO_ROLE
iot_cli_ul_buf_init();
#endif
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
iot_cli_host_set_ckb_dev_type();
iot_plc_wdg_set(host_config->app_handle, 0, 0);
iot_plc_set_whitelist(host_config->app_handle,
IOT_PLC_API_REQ_ID_DEFAULT, IOT_PLC_WL_ENABLE, 0, NULL);
cli_discovery_init();
#endif
return ERR_OK;
label_failed1:
iot_cli_proto_module_deinit();
return ret;
}
void iot_cli_proto_module_deinit()
{
#if PLC_SUPPORT_CCO_ROLE
iot_cli_ckb_deinit();
#endif /* PLC_SUPPORT_CCO_ROLE */
#if IOT_CLI_CKB_ADDR_MAPPING
iot_cli_addr_mapping_deinit();
#endif /* IOT_CLI_CKB_ADDR_MAPPING */
iot_cli_rate_test_deinit();
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
cli_discovery_deinit();
#endif
if (host_config) {
os_mem_free(host_config);
host_config = NULL;
}
}