Files
kunlun/app/smart_grid/sta/iot_sg_ext_sta.c
2024-09-28 14:24:04 +08:00

334 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_sg_ext_sta_api.h"
#include "iot_sg_sta_gw.h"
#include "iot_sg_ext.h"
#include "iot_sg.h"
#include "iot_sg_sta.h"
#include "iot_sg_sta_gw.h"
#include "iot_sg_ext_sta.h"
#include "iot_sg_drv_api.h"
#if IOT_SG_EXT_SDK_ENABLE
void iot_sg_ext_sta_command_process(iot_sg_msg_t *p_msg)
{
uint16_t node_info_len;
iot_pkt_t *p_pkt;
iot_sg_ext_cus_same_tsfm_node_resp_t *node_info;
iot_sg_ext_cus_cfg_t *cfg;
iot_sg_ext_node_list_sync_t *sync_node_list;
if (NULL == p_msg) {
IOT_ASSERT(0);
return;
}
p_pkt = (iot_pkt_t *)(p_msg->data);
if (NULL == p_pkt) {
IOT_ASSERT(0);
return;
}
switch (p_msg->data2) {
case IOT_SG_EXT_SID_MR_CFG:
{
cfg = (iot_sg_ext_cus_cfg_t *)iot_pkt_data(p_pkt);
if (p_sg_glb->plc_state.role == IOT_PLC_DEV_ROLE_STA) {
iot_sg_sta_handle_cus_cfg(cfg);
}
break;
}
case IOT_SG_EXT_SID_SAME_TSFM_NODE_QUERY:
{
if (iot_sg_sta_get_proto_type() == IOT_SG_STA_APP_PROTO_GW) {
node_info =
(iot_sg_ext_cus_same_tsfm_node_resp_t *)iot_pkt_data(p_pkt);
node_info_len = (uint16_t)iot_pkt_data_len(p_pkt);
if (node_info_len < sizeof(*node_info)) {
break;
}
iot_sg_sta_gw_tsfm_result_send_pw(node_info->req_info.src_addr,
node_info->req_info.seq, node_info, node_info_len);
}
break;
}
case IOT_SG_EXT_SID_SYNC_NODE_LIST:
{
sync_node_list = (iot_sg_ext_node_list_sync_t *)iot_pkt_data(p_pkt);
iot_sg_sta_handle_cus_sync_node_list(sync_node_list);
break;
}
case IOT_SG_EXT_SID_MSDU_FWD_ENABLE:
{
iot_sg_ext_cus_msdu_fwd_enable_t *msdu_enable =
(iot_sg_ext_cus_msdu_fwd_enable_t *)iot_pkt_data(p_pkt);
iot_sg_enable_cus_msdu_fwd(msdu_enable->enable);
break;
}
case IOT_SG_EXT_SID_MR_CMD:
{
iot_sg_ext_cus_mr_req_t *mr_req =
(iot_sg_ext_cus_mr_req_t *)iot_pkt_data(p_pkt);
iot_pkt_set_data(p_pkt, mr_req->data);
iot_sg_sta_add_cus_mr_req(p_pkt, mr_req->sn, mr_req->proto_type,
mr_req->dev_timeout, mr_req->queue_front);
p_pkt = NULL;
break;
}
default:
break;
}
if (p_pkt != NULL) {
iot_pkt_free(p_pkt);
}
return;
}
void iot_sg_ext_sta_msdu_process(iot_sg_msg_t *p_msg)
{
iot_pkt_t *p_pkt;
if (NULL == p_msg) {
IOT_ASSERT(0);
return;
}
p_pkt = (iot_pkt_t *)(p_msg->data);
if (NULL == p_pkt) {
IOT_ASSERT(0);
return;
}
iot_plc_msdu_recv_t *msdu = (iot_plc_msdu_recv_t *)iot_pkt_data(p_pkt);
iot_sg_sta_handle_msdu_msg(p_pkt, msdu);
return;
}
void iot_sg_ext_sta_command_cancel(iot_sg_msg_t *p_msg)
{
iot_pkt_t *p_pkt;
if (NULL == p_msg) {
IOT_ASSERT(0);
return;
}
p_pkt = (iot_pkt_t *)(p_msg->data);
if (NULL == p_pkt) {
IOT_ASSERT(0);
return;
}
iot_pkt_free(p_pkt);
return;
}
void iot_sg_ext_sta_msdu_cancel(iot_sg_msg_t *p_msg)
{
iot_pkt_t *p_pkt;
if (NULL == p_msg) {
IOT_ASSERT(0);
return;
}
p_pkt = (iot_pkt_t *)(p_msg->data);
if (NULL == p_pkt) {
IOT_ASSERT(0);
return;
}
iot_pkt_free(p_pkt);
return;
}
void iot_sg_ext_sync_node_list_to_cus(iot_pkt_t *pkt)
{
iot_sg_ext_header_t *p_hdr;
p_hdr = (iot_sg_ext_header_t *)iot_pkt_push(pkt, sizeof(*p_hdr));
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_SYNC_NODE_LIST;
iot_sg_ext_ipc_send(pkt);
}
void iot_sg_ext_topo_rcv_cfg_to_cus(iot_sg_ext_cus_topo_rcv_cfg_t *cfg)
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *pkt;
pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*cfg), IOT_SMART_GRID_MID);
if (pkt == NULL) {
return;
}
p_hdr = (iot_sg_ext_header_t *)iot_pkt_put(pkt,
sizeof(*p_hdr) + sizeof(*cfg));
os_mem_cpy(p_hdr->data, cfg, sizeof(*cfg));
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_TOPO_RCV_CFG;
iot_sg_ext_ipc_send(pkt);
}
void iot_sg_ext_link_state_rpt_to_cusapp(uint8_t link_state)
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *p_tgt_pkt;
iot_sg_ext_link_state_t *p_state;
p_tgt_pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*p_state),
IOT_SMART_GRID_MID);
if (!p_tgt_pkt) {
IOT_ASSERT(0);
return;
}
p_hdr = (iot_sg_ext_header_t *)iot_pkt_data(p_tgt_pkt);
/* arg will be ignored. */
p_hdr->mid = IOT_SG_EXT_MID_LINK_STATE_FROM_SG;
p_state = (iot_sg_ext_link_state_t *)(p_hdr + 1);
p_state->link_state = link_state;
iot_pkt_put(p_tgt_pkt, sizeof(*p_hdr) + sizeof(*p_state));
iot_sg_ext_ipc_send(p_tgt_pkt);
return;
}
void iot_sg_ext_upgrade_state_rpt_to_cusapp(uint8_t upgrade_state)
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *p_tgt_pkt;
iot_sg_ext_upgrade_state_t *p_state;
p_tgt_pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*p_state),
IOT_SMART_GRID_MID);
if (!p_tgt_pkt) {
IOT_ASSERT(0);
return;
}
p_hdr = (iot_sg_ext_header_t *)iot_pkt_data(p_tgt_pkt);
p_hdr->mid = IOT_SG_EXT_MID_UPGRADE_STATE_FROM_SG;
p_state = (iot_sg_ext_upgrade_state_t *)(p_hdr + 1);
p_state->upgrade_state = upgrade_state;
iot_pkt_put(p_tgt_pkt, sizeof(*p_hdr) + sizeof(*p_state));
iot_sg_ext_ipc_send(p_tgt_pkt);
return;
}
void iot_sg_ext_dev_info_sync_to_cusapp(iot_sg_ext_dev_info_t *dev_info)
{
iot_sg_ext_header_t *p_hdr;
iot_pkt_t *pkt;
pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*dev_info), IOT_SMART_GRID_MID);
if (pkt == NULL) {
return;
}
p_hdr = (iot_sg_ext_header_t *)iot_pkt_put(pkt,
sizeof(*p_hdr) + sizeof(*dev_info));
os_mem_cpy(p_hdr->data, dev_info, sizeof(*dev_info));
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_DEV_INFO_SYNC;
iot_sg_ext_ipc_send(pkt);
}
uint32_t iot_sg_ext_cus_same_tsfm_node_query(uint8_t list_sn,
uint8_t *src_addr, uint16_t seq)
{
uint32_t ret = ERR_INVAL;
iot_pkt_t *p_pkt;
iot_sg_ext_header_t *p_hdr;
iot_sg_ext_cus_same_tsfm_node_req_t *req;
if (!src_addr) {
goto out;
}
p_pkt = iot_pkt_alloc(sizeof(*p_hdr) + sizeof(*req), IOT_SMART_GRID_MID);
if (!p_pkt) {
ret = ERR_NOMEM;
goto out;
}
p_hdr = (iot_sg_ext_header_t *)iot_pkt_put(p_pkt,
sizeof(*p_hdr) + sizeof(*req));
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_SAME_TSFM_NODE_QUERY;
req = (iot_sg_ext_cus_same_tsfm_node_req_t *)p_hdr->data;
req->list_sn = list_sn;
req->seq = seq;
iot_mac_addr_cpy(req->src_addr, src_addr);
iot_sg_ext_ipc_send(p_pkt);
ret = ERR_OK;
out:
return ret;
}
uint32_t iot_sg_ext_sta_mr_resp(uint8_t proto_type, uint8_t sn,
iot_pkt_t *pkt)
{
uint32_t ret = ERR_INVAL;
iot_sg_ext_header_t *p_hdr;
iot_sg_ext_cus_mr_resp_t *rsp;
uint16_t len;
if (!pkt) {
ret = ERR_NOMEM;
goto out;
}
len = iot_pkt_data_len(pkt);
p_hdr = (iot_sg_ext_header_t *)iot_pkt_push(pkt,
sizeof(*p_hdr) + sizeof(*rsp));
p_hdr->mid = IOT_SG_EXT_MID_COMMAND;
p_hdr->arg = IOT_SG_EXT_SID_MR_CMD;
rsp = (iot_sg_ext_cus_mr_resp_t *)p_hdr->data;
rsp->proto_type = proto_type;
rsp->sn = sn;
rsp->len = len;
iot_sg_ext_ipc_send(pkt);
ret = ERR_OK;
out:
return ret;
}
#else /* IOT_SG_EXT_SDK_ENABLE */
uint32_t iot_sg_ext_cus_same_tsfm_node_query(uint8_t list_sn,
uint8_t *src_addr, uint16_t seq)
{
(void)list_sn;
(void)src_addr;
(void)seq;
return ERR_FAIL;
}
void iot_sg_ext_upgrade_state_rpt_to_cusapp(uint8_t upgrade_state)
{
(void)upgrade_state;
}
#endif /* IOT_SG_EXT_SDK_ENABLE */