334 lines
8.6 KiB
C
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 */
|