/**************************************************************************** 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 */