Files
kunlun/app/smart_grid_extend/sta/iot_cusapp_sta.c

481 lines
14 KiB
C
Raw Permalink Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
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.
****************************************************************************/
/* iot common header files */
#include "iot_io_api.h"
#include "iot_module_api.h"
#include "iot_errno_api.h"
#include "iot_task_api.h"
#include "iot_pkt_api.h"
#include "iot_ipc_api.h"
#include "iot_sg_ext_api.h"
#include "iot_board_api.h"
#include "iot_cusapp.h"
#include "iot_socket_api.h"
#include "iot_plc_msg_api.h"
#include "iot_plc_api.h"
#include "iot_app_api.h"
#include "iot_plc_msg_sta_api.h"
#include "iot_sg_ext_sta_api.h"
extern iot_cusapp_t g_iot_cus_lib;
extern iot_ipc_addr_t iot_cusapp_ext_sgapp_addr;
/* read meter command reserved length */
#define IOT_CUSAPP_MR_CMD_RSVD_LEN (40)
void iot_cusapp_send_mr_cmd_to_sg(uint8_t proto_type, uint8_t timeout,
uint8_t sn, uint8_t queue_front, uint16_t len, uint8_t *data)
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *pkt;
iot_sg_ext_cus_mr_req_t *req;
pkt = iot_pkt_alloc(IOT_CUSAPP_MR_CMD_RSVD_LEN + sizeof(*p_hdr) +
sizeof(*req) + len, IOT_SMART_GRID_MID);
IOT_ASSERT(pkt);
p_hdr = (iot_sg_ext_header_t *)iot_pkt_reserve(pkt,
IOT_CUSAPP_MR_CMD_RSVD_LEN);
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_MR_CMD;
req = (iot_sg_ext_cus_mr_req_t *)(p_hdr + 1);
req->proto_type = proto_type;
req->dev_timeout = timeout;
req->sn = sn;
req->queue_front = !!queue_front;
req->len = len;
os_mem_cpy(req->data, data, len);
iot_pkt_put(pkt, sizeof(*p_hdr) + sizeof(*req) + len);
iot_ipc_send(g_iot_cus_lib.ipc_h, &iot_cusapp_ext_sgapp_addr, pkt);
return;
}
void iot_cusapp_sta_send_expand_stop_cmd_to_sg()
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *pkt;
iot_sg_ext_cus_cfg_t *cfg;
iot_sg_ext_cus_cfg_param_t *param;
pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*cfg) + sizeof(*param),
IOT_SMART_GRID_MID);
IOT_ASSERT(pkt);
p_hdr = (iot_sg_ext_header_t *)iot_pkt_data(pkt);
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_MR_CFG;
cfg = (iot_sg_ext_cus_cfg_t *)(p_hdr + 1);
cfg->cfg_id = IOT_SG_EXT_CFG_ID_PARAM;
os_mem_set(cfg->data, 0, sizeof(*param));
param = (iot_sg_ext_cus_cfg_param_t *)cfg->data;
param->stop_flag_valid = 1;
param->stop_flag = 1;
iot_pkt_put(pkt, sizeof(*p_hdr) + sizeof(*cfg) + sizeof(*param));
iot_ipc_send(g_iot_cus_lib.ipc_h, &iot_cusapp_ext_sgapp_addr, pkt);
return;
}
/**
* @brief iot_cusapp_sta_plc_msg_process() - process data from plc.
* @param p_cus_msg: message received from plc. p_cus_msg->data
* will be freed by this handle but p_cus_msg will not.
*/
static void iot_cusapp_sta_plc_msg_process(iot_cusapp_msg_t *p_cus_msg)
{
iot_pkt_t *p_pkt = (iot_pkt_t *)p_cus_msg->data;
IOT_ASSERT(p_pkt);
iot_plc_msg_header_t *hdr = NULL;
hdr = (iot_plc_msg_header_t*)iot_pkt_block_ptr(p_pkt, IOT_PKT_BLOCK_DATA);
iot_plc_app_t *host_app = g_iot_cus_lib.app_handle;
uint8_t consumed = 0;
iot_cus_printf("%s recv plc msg, app id:%lu, msg id:%lu, req id:%lu\n",
__FUNCTION__, hdr->app_id, hdr->msg_id, hdr->req_id);
if (hdr->app_id != IOT_PLC_APP_ID_BCAST &&
host_app->app_id != hdr->app_id) {
iot_pkt_free(p_pkt);
return;
}
switch (hdr->msg_id) {
case IOT_PLC_MSG_DEV_STATE_CHANGE_RPT:
{
iot_plc_dev_state_change_rpt_t *dev_state;
dev_state = (iot_plc_dev_state_change_rpt_t*)(hdr + 1);
iot_cus_printf("dev state change, local_mac:"
"[%02X:%02X:%02X:%02X:%02X:%02X], cco_mac:"
"[%02X:%02X:%02X:%02X:%02X:%02X] \n", dev_state->local_mac[0],
dev_state->local_mac[1], dev_state->local_mac[2],
dev_state->local_mac[3], dev_state->local_mac[4],
dev_state->local_mac[5], dev_state->cco_mac[0],
dev_state->cco_mac[1], dev_state->cco_mac[2],
dev_state->cco_mac[3], dev_state->cco_mac[4],
dev_state->cco_mac[5]);
break;
}
case IOT_PLC_MSG_PHASE_RPT:
{
iot_plc_phase_rpt_t *phase;
phase = (iot_plc_phase_rpt_t*)(hdr + 1);
iot_cus_printf("phase info, phy_phase:%lu, opposite:%lu, opposite_3p"
":%lu \n", phase->phy_phase, phase->opposite_phase,
phase->opposite_3p);
break;
}
case IOT_PLC_MSG_DISCOVERY_NODE_RPT:
{
iot_plc_discovery_node_rpt_t *dis_node;
dis_node = (iot_plc_discovery_node_rpt_t*)(hdr + 1);
iot_cus_printf("discovery node, addr[%02X:%02X:%02X:%02X:%02X:%02X]"
" cco_addr[%02X:%02X:%02X:%02X:%02X:%02X] \n",
dis_node->addr[0], dis_node->addr[1], dis_node->addr[2],
dis_node->addr[3], dis_node->addr[4], dis_node->addr[5],
dis_node->cco_addr[0], dis_node->cco_addr[1],
dis_node->cco_addr[2], dis_node->cco_addr[3],
dis_node->cco_addr[4], dis_node->cco_addr[5]);
break;
}
case IOT_PLC_MSG_RTC_UPDATE_RPT:
{
iot_plc_rtc_update_rpt_t *rtc_update;
rtc_update = (iot_plc_rtc_update_rpt_t*)(hdr + 1);
iot_cus_printf("rtc update, cco_date:%lu, cco_ntb:%lu \n",
rtc_update->cco_date, rtc_update->cco_ntb);
break;
}
case IOT_PLC_MSG_INVALID_MAC_RPT:
{
iot_plc_invalid_mac_rpt_t *invalid_mac;
invalid_mac = (iot_plc_invalid_mac_rpt_t*)(hdr + 1);
iot_cus_printf("invalid mac, reason:%lu,"
"mac[%02X:%02X:%02X:%02X:%02X:%02X],"
"cco_mac[%02X:%02X:%02X:%02X:%02X:%02X] \n", invalid_mac->reason,
invalid_mac->mac[0], invalid_mac->mac[1], invalid_mac->mac[2],
invalid_mac->mac[3], invalid_mac->mac[4], invalid_mac->mac[5],
invalid_mac->cco_mac[0], invalid_mac->cco_mac[1],
invalid_mac->cco_mac[2], invalid_mac->cco_mac[3],
invalid_mac->cco_mac[4], invalid_mac->cco_mac[5]);
break;
}
default:
break;
}
/* TODO: cost in this module or give to other module. */
if (!consumed) {
iot_pkt_free(p_pkt);
}
return;
}
/**
* @brief iot_cusapp_sta_wl_msg_process() - process data from wireless device.
* @param p_cus_msg: message received from wireless device. p_cus_msg->data
* will be freed by this handle but p_cus_msg will not.
*/
static void iot_cusapp_sta_wl_msg_process(iot_cusapp_msg_t *p_cus_msg)
{
/* TODO: cost in this module or give to other module. */
iot_pkt_free((iot_pkt_t *)p_cus_msg->data);
return;
}
/**
* @brief iot_cusapp_sta_cmd_handle_msdu_data() - handle msdu data.
* @param data: msdu data.
*/
static void iot_cusapp_sta_cmd_handle_msdu_data(iot_pkt_t *pkt)
{
iot_plc_msdu_recv_t *msdu;
if (pkt == NULL) {
return;
}
msdu = (iot_plc_msdu_recv_t *)iot_pkt_data(pkt);
(void)msdu;
/* modify condition according to actual demand, and return unwanted msdu
* data to sg.
*/
if (0) {
/* handle msdu data deal with cusapp's demand */
} else {
iot_cusapp_send_msdu_to_sg(pkt);
}
}
/**
* @brief iot_cusapp_sta_command_exe() - command execute top function.
* @param sid: id of command.
* @param data: data for this command.
*/
static void iot_cusapp_sta_command_exe(uint32_t sid, void *data)
{
iot_sg_ext_dev_info_t *dev_info;
switch(sid)
{
case IOT_SG_EXT_SID_UART_CFG:
{
iot_cusapp_cmd_uart_config(data);
break;
}
case IOT_SG_EXT_SID_DEV_INFO_SYNC:
{
dev_info = (iot_sg_ext_dev_info_t*)data;
iot_cus_printf("pm addr: %02X:%02X:%02X:%02X:%02X:%02X\n",
dev_info->addr[0], dev_info->addr[1], dev_info->addr[2],
dev_info->addr[3], dev_info->addr[4], dev_info->addr[5]);
break;
}
case IOT_SG_EXT_SID_MR_CMD:
{
iot_sg_ext_cus_mr_resp_t *rsp =
(iot_sg_ext_cus_mr_resp_t *)data;
(void)rsp;
break;
}
default:
{
IOT_ASSERT(0);
break;
}
}
return;
}
/**
* @brief iot_cusapp_sta_sg_msg_process() - process the data from sg-app.
* @param p_cus_msg: message received from sg-app. p_cus_msg->data
* will be freed by this handle but p_cus_msg will not.
*/
static void iot_cusapp_sta_sg_msg_process(iot_cusapp_msg_t *p_cus_msg)
{
iot_pkt_t *p_pkt = (iot_pkt_t *)p_cus_msg->data;
iot_sg_ext_header_t *p_header;
iot_sg_ext_upgrade_state_t *upgrade_state;
p_header = (iot_sg_ext_header_t *)iot_pkt_data(p_pkt);
switch (p_header->mid)
{
case IOT_SG_EXT_MID_UART_DATA_FROM_SG:
{
/* Pull header out of packet. */
iot_pkt_pull(p_pkt, sizeof(*p_header));
#if !IOT_CUSAPP_SOCKET_TO_CCTT_ENABLE
/* Send to uart port. */
iot_cusapp_uart_send(p_pkt);
#else
/* Send data by eth socket */
iot_socket_udp_send(g_iot_cus_lib.socket_h, iot_pkt_data(p_pkt),
iot_pkt_data_len(p_pkt), 0, IOT_CUSAPP_SOCKET_REMOTE_IP,
IOT_CUSAPP_SOCKET_REMOTE_PORT);
iot_pkt_free(p_pkt);
#endif
/* Set p_pkt as NULL avoid of free() repeatly. */
p_pkt = NULL;
break;
}
case IOT_SG_EXT_MID_LINK_STATE_FROM_SG:
{
/* TODO */
break;
}
case IOT_SG_EXT_MID_COMMAND:
{
iot_cusapp_sta_command_exe(((uint32_t)p_header->arg) & 0xFF,
p_header->data);
break;
}
case IOT_SG_EXT_MID_UPGRADE_STATE_FROM_SG:
{
upgrade_state = (iot_sg_ext_upgrade_state_t *)p_header->data;
iot_cus_printf("upgrade state:%d\n", upgrade_state->upgrade_state);
break;
}
case IOT_SG_EXT_MID_TRANS_MSDU_FROM_SG:
{
/* Pull header out of packet. */
iot_pkt_pull(p_pkt, sizeof(*p_header));
iot_cusapp_sta_cmd_handle_msdu_data(p_pkt);
/* Set p_pkt as NULL avoid of free() repeatly. */
p_pkt = NULL;
break;
}
default:
{
IOT_ASSERT(0);
break;
}
}
if (NULL != p_pkt)
{
iot_pkt_free(p_pkt);
}
return;
}
/**
* @brief iot_cusapp_sta_uart_msg_process() - process the data from uart.
* @param p_cus_msg: message received from uart. p_cus_msg->data will be
* freed by this handle but p_cus_msg will not.
*/
static void iot_cusapp_sta_uart_msg_process(iot_cusapp_msg_t *p_cus_msg)
{
uint32_t path;
iot_pkt_t *p_pkt = (iot_pkt_t *)p_cus_msg->data;
iot_sg_ext_header_t *p_header;
path = iot_cusapp_data_path_get();
if ((CUSAPP_PT_MAX <= path)
|| (NULL == g_iot_cus_lib.path[path]))
{
/* drop this packet. */
iot_pkt_free(p_pkt);
}
switch (path)
{
case CUSAPP_PT_PLC:
{
p_header = (iot_sg_ext_header_t *)iot_pkt_push(p_pkt,
sizeof(*p_header));
p_header->mid = IOT_SG_EXT_MID_UART_DATA_FROM_CUS;
p_header->arg = (p_cus_msg->data2) ? IOT_SG_EXT_DF_FULL :
IOT_SG_EXT_DF_PART;
g_iot_cus_lib.path[CUSAPP_PT_PLC](p_pkt, 0);
break;
}
case CUSAPP_PT_WIERLESS:
{
/* TODO */
g_iot_cus_lib.path[CUSAPP_PT_WIERLESS](p_pkt, 0);
break;
}
default:
{
iot_pkt_free(p_pkt);
IOT_ASSERT(0);
break;
}
}
return;
}
static void iot_cusapp_sta_msg_exe_func(iot_cusapp_msg_t *msg)
{
switch (msg->task_msg.type) {
#if !IOT_CUSAPP_SOCKET_TO_CCTT_ENABLE
case IOT_CUSAPP_MT_UART:
{
iot_cusapp_sta_uart_msg_process(msg);
break;
}
#else
case IOT_CUSAPP_MT_SOCKET:
{
iot_cusapp_sta_uart_msg_process(msg);
break;
}
#endif /* !IOT_CUSAPP_SOCKET_TO_CCTT_ENABLE */
case IOT_CUSAPP_MT_SG:
{
iot_cusapp_sta_sg_msg_process(msg);
break;
}
case IOT_CUSAPP_MT_WL:
{
iot_cusapp_sta_wl_msg_process(msg);
break;
}
case IOT_CUSAPP_MT_PLC:
{
iot_cusapp_sta_plc_msg_process(msg);
break;
}
default:
{
iot_pkt_free(msg->data);
IOT_ASSERT(0);
break;
}
}
iot_task_free_msg(g_iot_cus_lib.task_h, &msg->task_msg);
}
static void iot_cusapp_sta_msg_cancel_func(iot_cusapp_msg_t *msg)
{
switch(msg->task_msg.type)
{
#if IOT_CUSAPP_SOCKET_TO_CCTT_ENABLE
case IOT_CUSAPP_MT_SOCKET:
#else
case IOT_CUSAPP_MT_UART:
#endif
case IOT_CUSAPP_MT_SG:
case IOT_CUSAPP_MT_WL:
case IOT_CUSAPP_MT_PLC:
{
iot_pkt_free(msg->data);
break;
}
default:
{
IOT_ASSERT(0);
break;
}
}
iot_task_free_msg(g_iot_cus_lib.task_h, &msg->task_msg);
return;
}
uint32_t iot_cusapp_sta_init()
{
uint32_t ret = ERR_OK;
g_iot_cus_lib.msg_exe_func = iot_cusapp_sta_msg_exe_func;
g_iot_cus_lib.msg_cancel_func = iot_cusapp_sta_msg_cancel_func;
return ret;
}
void iot_cusapp_sta_deinit()
{
return;
}