1066 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1066 lines
		
	
	
		
			32 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 "app_uart.h"
 | |
| #include "app_main_task.h"
 | |
| #include "iot_app_meta_api.h"
 | |
| #include "iot_plc_sync_api.h"
 | |
| #include "app_proto_dlt645.h"
 | |
| #include "app_cus_task.h"
 | |
| #include "iot_app_pib_cco_api.h"
 | |
| #include "iot_app_pib_sta_api.h"
 | |
| #include "iot_plc_led_api.h"
 | |
| #include "app_main_dlt645.h"
 | |
| 
 | |
| extern void iot_print_config(uint8_t enable);
 | |
| 
 | |
| /* app entry of iot dlt645 app */
 | |
| static app_entity_t g_iot_dlt645app_entry;
 | |
| 
 | |
| /* timer for dump pkt infomation */
 | |
| static timer_id_t g_pkt_info_timer;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_data_from_plc_handle() - handle network data from plc layer.
 | |
|  * @param [in] pkt : pkt with plc network data .
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_data_from_plc_handle(iot_pkt_t *pkt)
 | |
| {
 | |
|     iot_plc_msg_header_t *hdr = (iot_plc_msg_header_t*)iot_pkt_data(pkt);
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     /* Check if this packet belongs to me. */
 | |
|     if ((IOT_PLC_APP_ID_BCAST != hdr->app_id)
 | |
|         && (IOT_PLC_APP_DEMO_ID != hdr->app_id)) {
 | |
|         APP_PRINTF("[ERR] INVALID PACKET FROM MAC,APP ID#%d.", hdr->app_id);
 | |
|         iot_pkt_free(pkt);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     /* Check if I'm registerd before handling msg. */
 | |
|     if ((!app_entry->app_reg) &&
 | |
|         (IOT_PLC_MSG_APP_REG_CONF != hdr->msg_id)) {
 | |
|         APP_PRINTF("[ERR] INVALID PACKET FROM MAC,MSG ID#%d.", hdr->msg_id);
 | |
|         iot_pkt_free(pkt);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     switch (hdr->msg_id) {
 | |
|         case IOT_PLC_MSG_APP_REG_CONF :
 | |
|         {
 | |
|             iot_plc_app_reg_conf_t* rpt = (iot_plc_app_reg_conf_t*)(hdr + 1);
 | |
| 
 | |
|             if ((IOT_PLC_SUCCESS == rpt->result) ||
 | |
|                 (IOT_PLC_SUCCESS_MODIFIED == rpt->result)) {
 | |
|                 app_entry->app_reg = true;
 | |
|                 iot_plc_query_dev_info(app_entry->app_hdl,
 | |
|                     IOT_PLC_API_REQ_ID_DEFAULT);
 | |
|                 APP_PRINTF("[INF] APP REGISTERED SUCCESSFULLY.");
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|         case IOT_PLC_MSG_DEV_STATE_CHANGE_RPT :
 | |
|         {
 | |
|             iot_plc_dev_state_change_rpt_t* rpt =
 | |
|                 (iot_plc_dev_state_change_rpt_t*)(hdr + 1);
 | |
| 
 | |
|             if (rpt->is_ready) {
 | |
|                 APP_PRINTF(
 | |
|                     "[INF] STATE CHANGE REPORT MAC GET READY, MY ROLE TYPE#%d.",
 | |
|                     rpt->dev_role);
 | |
|                 APP_PRINTF("CCO MAC "MAC_FMT, MAC_ARG(rpt->cco_mac));
 | |
| 
 | |
|                 APP_PRINTF("LOCAL MAC "MAC_FMT, MAC_ARG(rpt->local_mac));
 | |
| 
 | |
|                 if (IOT_PLC_DEV_ROLE_STA == rpt->dev_role) {
 | |
|                     /* Notify Online Event (local) */
 | |
|                     iot_cus_task_onoffline_report(rpt->cco_mac,
 | |
|                         STA_ONLINE_EVENT);
 | |
|                 }
 | |
| 
 | |
|                 app_entry->dev.dev_ready  = true;
 | |
|                 app_entry->dev.dev_role   = rpt->dev_role;
 | |
|                 app_entry->dev.nid        = rpt->nid;
 | |
| 
 | |
|                 iot_mac_addr_cpy(app_entry->dev.mac_addr, rpt->local_mac);
 | |
|                 iot_mac_addr_cpy(app_entry->dev.cco_addr, rpt->cco_mac);
 | |
|             } else {
 | |
|                 APP_PRINTF("[INF] MAC IS NOT READY #%d.", hdr->msg_id);
 | |
|                 app_entry->dev.dev_ready  = false;
 | |
| 
 | |
|                 if (IOT_PLC_DEV_ROLE_STA == rpt->dev_role) {
 | |
|                     /* Notify Offline Event (local) */
 | |
|                     if (iot_mac_addr_valid(rpt->cco_mac)) {
 | |
|                         iot_cus_task_onoffline_report(rpt->cco_mac,
 | |
|                             STA_OFFLINE_EVENT);
 | |
|                     } else if (iot_mac_addr_valid(app_entry->dev.cco_addr)) {
 | |
|                         iot_cus_task_onoffline_report(app_entry->dev.cco_addr,
 | |
|                             STA_OFFLINE_EVENT);
 | |
|                         os_mem_set(app_entry->dev.cco_addr, 0, IOT_MAC_ADDR_LEN);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             break;
 | |
|         }
 | |
|         case IOT_PLC_MSG_DEV_INFO_RPT :
 | |
|         {
 | |
|             iot_plc_dev_info_rpt_t* rpt =
 | |
|                 (iot_plc_dev_info_rpt_t*)(hdr + 1);
 | |
|             app_entry->dev.dev_ready  = rpt->is_ready;
 | |
|             app_entry->u_snr          = rpt->snr;
 | |
|             iot_mac_addr_cpy(app_entry->dev.mac_addr, rpt->local_mac);
 | |
|             if (rpt->is_ready) {
 | |
|                 APP_PRINTF(
 | |
|                     "[INF] DEVICE INFO REPORT MAC GET READY, MY ROLE TYPE#%d.",
 | |
|                     rpt->dev_role);
 | |
|                 APP_PRINTF("CCO MAC "MAC_FMT, MAC_ARG(rpt->cco_mac));
 | |
|                 APP_PRINTF("LOCAL MAC "MAC_FMT, MAC_ARG(rpt->local_mac));
 | |
| 
 | |
|                 app_entry->dev.dev_role   = rpt->dev_role;
 | |
| 
 | |
|                 iot_mac_addr_cpy(app_entry->dev.cco_addr, rpt->cco_mac);
 | |
|             } else {
 | |
|                 APP_PRINTF("[INF] MAC IS NOT READY #%d.", hdr->msg_id);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|         case IOT_PLC_MSG_STA_JOIN_INFO :
 | |
|         {
 | |
|             iot_plc_sta_join_info_t* rpt = (iot_plc_sta_join_info_t*)(hdr + 1);
 | |
|             APP_PRINTF("STA JOINED : MAC#"MAC_FMT, MAC_ARG(rpt->sta_info.addr));
 | |
| 
 | |
|             if (IOT_PLC_DEV_ROLE_CCO == app_entry->dev.dev_role) {
 | |
|                 iot_plc_led_request(IOT_PLC_LED_ASSOCIATED);
 | |
| 
 | |
|                 /* Notify Online Event */
 | |
|                 iot_cus_task_onoffline_report(rpt->sta_info.addr,
 | |
|                     STA_ONLINE_EVENT);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|         case IOT_PLC_MSG_STA_LEAVE_INFO :
 | |
|         {
 | |
|             uint32_t cnt;
 | |
|             iot_plc_sta_leave_info_t* rpt =
 | |
|                 (iot_plc_sta_leave_info_t*)(hdr + 1);
 | |
| 
 | |
|             for (cnt = 0; cnt < rpt->sta_count; cnt++) {
 | |
|                 APP_PRINTF("STA LEAVED : MAC#"MAC_FMT,
 | |
|                     MAC_ARG(rpt->sta[cnt].mac_addr));
 | |
| 
 | |
|                 if (IOT_PLC_DEV_ROLE_CCO == app_entry->dev.dev_role) {
 | |
|                     iot_plc_led_request(IOT_PLC_LED_DIS_ASSOCIATED);
 | |
|                     /* Notify Offline Event */
 | |
|                     iot_cus_task_onoffline_report(rpt->sta[cnt].mac_addr,
 | |
|                         STA_OFFLINE_EVENT);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|         case IOT_PLC_MSG_CONN_LESS_RECV :
 | |
|         case IOT_PLC_MSG_MSDU_RECV :
 | |
|         {
 | |
|             iot_plc_msdu_recv_t *msdu = (iot_plc_msdu_recv_t*)(hdr + 1);
 | |
|             app_entry->u_snr = (int8_t)msdu->snr;
 | |
|             APP_PRINTF("MSDU RECEIVED FROM MAC#"MAC_FMT, MAC_ARG(msdu->src));
 | |
|             iot_check_meta_data(pkt);
 | |
|             if (iot_plc_is_client_mode()) {
 | |
|                 iot_meta_rcd_app_msdu_info(msdu,
 | |
|                     hdr->msg_id == IOT_PLC_MSG_MSDU_RECV);
 | |
|             }
 | |
|             if (iot_mac_addr_cmp(msdu->dst, app_entry->dev.mac_addr) ||
 | |
|                 iot_mac_is_bcast(msdu->dst)) {
 | |
|                 iot_main_task_msg_post(E_MAIN_MSG_FROM_PLCMAC,
 | |
|                     E_MAIN_MSG_ID_645PKT_RECV, (void*)pkt);
 | |
|                 /* Packet will not be freed here. */
 | |
|                 pkt = NULL;
 | |
|             }
 | |
|             break;
 | |
|         }
 | |
|         default :
 | |
|         {
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (pkt) {
 | |
|         iot_pkt_free(pkt);
 | |
|     }
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_645pkt_from_plc_handle() - handle 645pkt from plc layer.
 | |
|  * @param [in] pkt : pkt with dlt645 frame.
 | |
|  * @return None.
 | |
|  */
 | |
| static uint16_t iot_main_645pkt_from_plc_handle(iot_pkt_t *pkt)
 | |
| {
 | |
|     iot_plc_msdu_recv_t *msdu;
 | |
|     uint16_t ret = ERR_FAIL;
 | |
|     uint8_t *frame;
 | |
|     uint32_t frame_len = 0;
 | |
|     bool_t is_frame = false;
 | |
|     app_entity_t *app_entry = NULL;
 | |
|     app_custom_data *app_data = NULL;
 | |
|     iot_pkt_t *pkt_ack = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
|     app_entry->receivetime = iot_plc_get_ntb(app_entry->app_hdl);
 | |
|     msdu = (iot_plc_msdu_recv_t*)(iot_pkt_data(pkt) +
 | |
|         sizeof(iot_plc_msg_header_t));
 | |
|     APP_PRINTF("msdu->len=%d pkt_len=%d", msdu->len, iot_pkt_data_len(pkt));
 | |
| 
 | |
|     app_data = (app_custom_data*)msdu->data;
 | |
|     frame = (uint8_t *)(app_data + 1);
 | |
|     frame_len = msdu->len - sizeof(app_custom_data);
 | |
|     APP_PRINT_BUF("[INF] BINARY DATA FROM PLC: ", frame, frame_len);
 | |
|     APP_PRINTF("plc_id = %x ",app_data->id);
 | |
| 
 | |
|     /* data format check, only 645 frames are supported. */
 | |
|     proto_645_check_frame_handler(frame, frame_len, &is_frame);
 | |
|     if (!is_frame) {
 | |
|         ret = ERR_FAIL;
 | |
|         goto out;
 | |
|     }
 | |
| 
 | |
|     ret = app_dlt645_local_handle(APP_TASK_MAIN, (proto_645_header_t *)frame,
 | |
|         frame_len, &pkt_ack);
 | |
|     if (ERR_OK == ret) {
 | |
|         /* ack frame, send back to plc. */
 | |
|         app_plc_tx(iot_pkt_data(pkt_ack), iot_pkt_data_len(pkt_ack), msdu->src,
 | |
|             ID_PLC_DLT645_DATA, NULL);
 | |
|         iot_pkt_free(pkt_ack);
 | |
|         goto out;
 | |
|     } else {
 | |
|         /* unhandled frame, send to customer task. */
 | |
|         iot_pkt_pull(pkt, (size_t)(frame - iot_pkt_data(pkt)));
 | |
|         iot_cus_task_msg_post(E_CUS_MSG_FROM_MAINTASK, E_CUS_MSG_ID_645PKT_RECV,
 | |
|             pkt);
 | |
|         return ERR_OK;
 | |
|     }
 | |
| 
 | |
| out:
 | |
|     iot_pkt_free(pkt);
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_from_plcmac_handle() - handle message from plc layer.
 | |
|  * @param [in] id : message id.
 | |
|  * @param [in] data : message data.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_from_plcmac_handle(uint16_t id, void *data)
 | |
| {
 | |
| 
 | |
|     iot_pkt_t *pkt = (iot_pkt_t *)data;
 | |
| 
 | |
|     if ((NULL == pkt) || (0 == iot_pkt_data_len(pkt))) {
 | |
|         APP_PRINTF("[ERR] %s Packet is NULL !!", __FUNCTION__);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     switch (id)
 | |
|     {
 | |
|         /* main task receive data from plc layer */
 | |
|         case E_MAIN_MSG_ID_PLCMAC_RECV:
 | |
|         {
 | |
|             iot_main_data_from_plc_handle(pkt);
 | |
|             break;
 | |
|         }
 | |
|         /* main task receive dlt645 frame form plc layer */
 | |
|         case E_MAIN_MSG_ID_645PKT_RECV:
 | |
|         {
 | |
|             iot_main_645pkt_from_plc_handle(pkt);
 | |
|             break;
 | |
|         }
 | |
|         default:
 | |
|         {
 | |
|             iot_pkt_free(pkt);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_645pkt_from_custask_handle() - handle 645pkt from customer task.
 | |
|  * @param [in] pkt : pkt with dlt645 frame.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_645pkt_from_custask_handle(iot_pkt_t *pkt)
 | |
| {
 | |
|     uint32_t ret = ERR_FAIL;
 | |
|     iot_pkt_t *pkt_ack = NULL;
 | |
|     proto_645_header_t *frame = (proto_645_header_t *)iot_pkt_data(pkt);
 | |
|     uint16_t frame_len = iot_pkt_data_len(pkt);
 | |
|     uint8_t dst_addr[IOT_MAC_ADDR_LEN] = {0};
 | |
| 
 | |
|     ret = app_dlt645_local_handle(APP_TASK_MAIN, frame, frame_len, &pkt_ack);
 | |
|     if (ERR_OK == ret) {
 | |
|         /* ack frame, send back to customer task. */
 | |
|         iot_cus_task_msg_post(E_CUS_MSG_FROM_MAINTASK,
 | |
|             E_CUS_MSG_ID_645PKT_RECV, pkt_ack);
 | |
|     } else {
 | |
|         /* unhandled frame, send to plc. */
 | |
|         if (iot_plc_is_client_mode()) {
 | |
|             iot_mac_addr_cpy(dst_addr, app_get_cco_mac_addr());
 | |
|             iot_mac_addr_reverse(dst_addr);
 | |
|         } else {
 | |
|             iot_mac_addr_cpy(dst_addr, frame->addr);
 | |
|         }
 | |
|         app_plc_tx(iot_pkt_data(pkt), iot_pkt_data_len(pkt), dst_addr,
 | |
|             ID_PLC_DLT645_DATA, NULL);
 | |
|     }
 | |
|     iot_pkt_free(pkt);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_from_custask_handle() - handle message from customer task.
 | |
|  * @param [in] id : message id.
 | |
|  * @param [in] data : message data.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_from_custask_handle(uint16_t id, void *data)
 | |
| {
 | |
|     iot_pkt_t *pkt = (iot_pkt_t *)data;
 | |
| 
 | |
|     if ((NULL == pkt) || (0 == iot_pkt_data_len(pkt))) {
 | |
|         APP_PRINTF("[ERR] %s Packet is NULL !!", __FUNCTION__);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     switch (id)
 | |
|     {
 | |
|         /* main task receive dlt645 frame form customer task */
 | |
|         case E_MAIN_MSG_ID_645PKT_RECV:
 | |
|         {
 | |
|             iot_main_645pkt_from_custask_handle(pkt);
 | |
|             break;
 | |
|         }
 | |
|         default:
 | |
|         {
 | |
|             iot_pkt_free(pkt);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_645pkt_from_custask_handle() - handle 645pkt send to plc.
 | |
|  * @param [in] pkt : pkt with dlt645 frame.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_send_plc_pkt_handle(iot_pkt_t *pkt)
 | |
| {
 | |
|     iot_pkt_t *msdu_pkt;
 | |
|     uint8_t *ptr;
 | |
|     app_custom_data *app_data;
 | |
|     append_tx_info_t *tx_info;
 | |
|     uint8_t msg_type = IOT_PLC_MSG_TYPE_BCAST;
 | |
|     uint16_t data_len;
 | |
|     uint16_t msdu_len;
 | |
|     uint16_t meta_len = 0;
 | |
|     uint8_t is_connless = false;
 | |
|     uint8_t is_sta = false;
 | |
|     uint8_t is_bcast = false;
 | |
|     iot_plc_topo_info * topo_info = NULL;
 | |
|     iot_plc_app_h app_handle;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
|     app_handle = app_entry->app_hdl;
 | |
| 
 | |
|     data_len = iot_pkt_data_len(pkt) - sizeof(append_tx_info_t);
 | |
| 
 | |
|     tx_info = (append_tx_info_t *)iot_pkt_data(pkt);
 | |
|     app_data = (app_custom_data *)(tx_info + 1);
 | |
| 
 | |
|     if (app_entry->dev.dev_role != IOT_PLC_DEV_ROLE_CCO) {
 | |
|         is_sta = true;
 | |
|     }
 | |
| 
 | |
|     is_bcast = iot_mac_is_bcast(app_data->mac);
 | |
|     if (tx_info->force_connless) {
 | |
|         /* custom force send connless */
 | |
|         is_connless = true;
 | |
|     } else {
 | |
|         if ((!is_sta) && (is_bcast)) {
 | |
|             /* the cco bcast, if sta num is 0 should offline bcast */
 | |
|             iot_plc_cco_query_nw_topo(&topo_info, 0, 2);
 | |
|             if (topo_info->total_cnt <= 1) {
 | |
|                 is_connless = true;
 | |
|             }
 | |
|         } else if ((!is_sta) && (!iot_plc_sta_is_online(app_data->mac))) {
 | |
|             /* if the sta is offline, send conncet_less msdu pkt */
 | |
|             is_connless = true;
 | |
|         } else if (is_sta && is_bcast) {
 | |
|             /* sta send broadcast, need send connless */
 | |
|             is_connless = true;
 | |
|         } else if (is_sta && (!app_entry->dev.dev_ready)) {
 | |
|             /* sta not joined network, need send connless*/
 | |
|             is_connless = true;
 | |
|         } else if (is_sta && app_entry->dev.dev_ready &&
 | |
|             !iot_mac_addr_cmp(app_data->mac, app_entry->dev.cco_addr)) {
 | |
|             /* joined network sta not send data to cco, need send connless */
 | |
|             is_connless = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (!is_bcast) {
 | |
|         msg_type = IOT_PLC_MSG_TYPE_UNICAST;
 | |
|     }
 | |
| 
 | |
|     msdu_len = iot_plc_calc_msdu_len_with_pad_info(data_len, is_connless,
 | |
|         &meta_len);
 | |
| 
 | |
|     if (is_connless) {
 | |
|         /* if the sta is offline, send conncet_less msdu pkt */
 | |
|         if (is_sta || (!is_bcast)) {
 | |
|             msg_type = IOT_PLC_MSG_TYPE_CONN_LESS_DATA;
 | |
|         } else {
 | |
|             msg_type = IOT_PLC_MSG_TYPE_CONN_LESS_DATA_ALL;
 | |
|         }
 | |
| 
 | |
|         APP_PRINTF("Broadcast pkt type %d sent by offline sta " MAC_FMT,
 | |
|             msg_type, MAC_ARG(app_entry->dev.mac_addr));
 | |
|         msdu_pkt = iot_plc_alloc_conn_less_msdu(app_handle,
 | |
|             msg_type, app_data->mac, app_entry->dev.mac_addr,
 | |
|             app_entry->dev.link_id, msdu_len, 0);
 | |
|     } else {
 | |
|         msdu_pkt = iot_plc_alloc_msdu(app_handle,
 | |
|             msg_type, IOT_PLC_ACK_TYPE_NONE,
 | |
|             app_data->mac,
 | |
|             app_entry->dev.mac_addr,
 | |
|             app_entry->dev.link_id, msdu_len, 0);
 | |
|     }
 | |
| 
 | |
|     if (NULL == msdu_pkt) {
 | |
|         iot_pkt_free(pkt);
 | |
|         APP_PRINTF("[ERR] %s Alloc Packet Failed !!", __FUNCTION__);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     ptr = iot_pkt_block_ptr(msdu_pkt, IOT_PKT_BLOCK_TAIL);
 | |
| 
 | |
|     os_mem_cpy(ptr, app_data, data_len);
 | |
| 
 | |
|     iot_pkt_put(msdu_pkt, data_len);
 | |
| 
 | |
|     iot_pkt_free(pkt);
 | |
| 
 | |
|     iot_plc_add_meta_info(msdu_pkt, meta_len);
 | |
| 
 | |
|     APP_PRINT_BUF("[INF] BINARY DATA FORWORD TO PLC:",
 | |
|         iot_pkt_data(msdu_pkt), iot_pkt_data_len(msdu_pkt));
 | |
| 
 | |
|     /* Forword to PLC. */
 | |
|     iot_plc_send_msdu(app_handle, msdu_pkt);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_from_maintask_handle() - handle message from main task.
 | |
|  * @param [in] id : message id.
 | |
|  * @param [in] data : message data.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_from_maintask_handle(uint16_t id, void *data)
 | |
| {
 | |
|     iot_pkt_t *pkt = (iot_pkt_t *)data;
 | |
| 
 | |
|     if ((NULL == pkt) ||
 | |
|         ((0 == iot_pkt_data_len(pkt)) && (E_MAIN_MSG_ID_CLIAPP_RECV != id))) {
 | |
|         APP_PRINTF("[ERR] %s Packet is NULL !!", __FUNCTION__);
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     switch (id)
 | |
|     {
 | |
|         /* main task receive data from cli app*/
 | |
|         case E_MAIN_MSG_ID_CLIAPP_RECV:
 | |
|         {
 | |
|             iot_app_handle_cli_msg(pkt);
 | |
|             break;
 | |
|         }
 | |
|         /* main task send dlt645 frame to plc layer */
 | |
|         case E_MAIN_MSG_ID_645PKT_TO_PLC:
 | |
|         {
 | |
|             iot_main_send_plc_pkt_handle(pkt);
 | |
|             break;
 | |
|         }
 | |
|         default:
 | |
|         {
 | |
|             iot_pkt_free(pkt);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_sta_signal_led_timer_handle() - STA handle signal led timer
 | |
|  * @param None.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_sta_signal_led_timer_handle(void)
 | |
| {
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     if (app_entry->u_snr >= IOT_SNR_STRONG_MIN_THR) {
 | |
|         iot_plc_led_request(IOT_PLC_LED_SIGNAL_STRONG);
 | |
|     } else if (app_entry->u_snr >= IOT_SNR_GOOD_MIN_THR) {
 | |
|         iot_plc_led_request(IOT_PLC_LED_SIGNAL_GOOD);
 | |
|     } else {
 | |
|         iot_plc_led_request(IOT_PLC_LED_SIGNAL_WEAK);
 | |
|     }
 | |
| 
 | |
|     iot_plc_query_dev_info(app_entry->app_hdl, IOT_PLC_API_REQ_ID_DEFAULT);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_cco_net_done_check_handle() - CCO handle net done check
 | |
|  * @param None.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_cco_net_done_check_handle(void)
 | |
| {
 | |
|     uint8_t wl_state;
 | |
|     uint16_t topo_num;
 | |
|     uint16_t wl_cnt;
 | |
|     iot_plc_topo_info *topo = NULL;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     /* check and change cco network done state */
 | |
|     if (IOT_PLC_DEV_ROLE_CCO == app_entry->dev.dev_role) {
 | |
|         wl_state = iot_plc_cco_get_whiltlist_state_func();
 | |
|         iot_plc_cco_query_nw_topo(&topo, 0, 5);
 | |
|         if (NULL == topo) {
 | |
|             return;
 | |
|         }
 | |
|         topo_num = topo->total_cnt;
 | |
|         wl_cnt = iot_app_get_wl_cnt();
 | |
| 
 | |
|         if (wl_state && (topo_num > 1) && (topo_num -1 == wl_cnt)) {
 | |
|             if (app_entry->dev.cco_net_done == 0) {
 | |
|                 app_entry->dev.cco_net_done = 1;
 | |
|                 iot_plc_led_request(IOT_PLC_LED_NET_FORMAT_DONE);
 | |
|                 APP_PRINTF("[info]%s network done !", __FUNCTION__);
 | |
|             }
 | |
|         } else {
 | |
|             if (app_entry->dev.cco_net_done == 1) {
 | |
|                 app_entry->dev.cco_net_done = 0;
 | |
|                 iot_plc_led_request(IOT_PLC_LED_DIS_ASSOCIATED);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_from_timer_handle() - handle message from timer.
 | |
|  * @param [in] id : message id.
 | |
|  * @param [in] data : message data.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_from_timer_handle(app_timer_id_e id, void *data)
 | |
| {
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     switch (id) {
 | |
|         /* app timer for reboot local device. */
 | |
|         case APP_TIMER_ID_REBOOT:
 | |
|             iot_system_restart(IOT_SYS_RST_REASON_APP_REQ);
 | |
|             break;
 | |
|         /* app timer for set mac address. */
 | |
|         case APP_TIMER_ID_SET_MAC:
 | |
|             app_set_mac_addr(app_entry->dev.mac_addr);
 | |
|             break;
 | |
|         /* app timer for signal led show. */
 | |
|         case APP_TIMER_ID_SIGNAL_LED:
 | |
|             iot_main_sta_signal_led_timer_handle();
 | |
|             break;
 | |
|         /* app timer for check if network done. */
 | |
|         case APP_TIMER_ID_NET_DONE_CHECK:
 | |
|             iot_main_cco_net_done_check_handle();
 | |
|             break;
 | |
|         default:
 | |
|             break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_event_handle() - handle task event.
 | |
|  * @param [in] task_h : iot task handle, not used.
 | |
|  * @param [in] event : task event.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_event_handle(iot_task_h task_h, uint32_t event)
 | |
| {
 | |
|     (void)task_h;
 | |
|     (void)event;
 | |
| 
 | |
|     APP_PRINTF("[INF] %s", __FUNCTION__);
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_handle() - handle message by type.
 | |
|  * @param [in] task_h : iot task handle, not used.
 | |
|  * @param [in] msg : message.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_handle(iot_task_h task_h, iot_task_msg_t *msg)
 | |
| {
 | |
|     app_msg_t *dm_msg = (app_msg_t *)msg;
 | |
| 
 | |
|     (void)task_h;
 | |
| 
 | |
|     if ((NULL == dm_msg) || (!APP_MAIN_MSG_VALID(dm_msg->msg.type))) {
 | |
|         /* Maybe this can cause memory overflow! */
 | |
|         APP_PRINTF("[ERR] %s Invalid MSG !!", __FUNCTION__);
 | |
|         return;
 | |
|     }
 | |
|     switch (dm_msg->msg.type)
 | |
|     {
 | |
|         case E_MAIN_MSG_FROM_PLCMAC:
 | |
|         {
 | |
|             iot_main_msg_from_plcmac_handle(dm_msg->msg.id, dm_msg->data);
 | |
|             break;
 | |
|         }
 | |
|         case E_MAIN_MSG_FROM_CUSTASK:
 | |
|         {
 | |
|             iot_main_msg_from_custask_handle(dm_msg->msg.id, dm_msg->data);
 | |
|             break;
 | |
|         }
 | |
|         case E_MAIN_MSG_FROM_MAINTASK:
 | |
|         {
 | |
|             iot_main_msg_from_maintask_handle(dm_msg->msg.id, dm_msg->data);
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         case E_MAIN_MSG_FROM_TIMER:
 | |
|         {
 | |
|             iot_main_msg_from_timer_handle(dm_msg->msg.id, dm_msg->data);
 | |
|             break;
 | |
|         }
 | |
|         default:
 | |
|             break;
 | |
|     }
 | |
| 
 | |
|     iot_task_free_msg(task_h, &(dm_msg->msg));
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_msg_cancel() - handle message canceling.
 | |
|  * @param [in] task_h : iot task handle, not used.
 | |
|  * @param [in] msg : message.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_msg_cancel(iot_task_h task_h, iot_task_msg_t *msg)
 | |
| {
 | |
|     app_msg_t *dm_msg = (app_msg_t *)msg;
 | |
| 
 | |
|     (void)task_h;
 | |
| 
 | |
|     if ((NULL == dm_msg) || (!APP_MAIN_MSG_VALID(dm_msg->msg.type))) {
 | |
|         /* Maybe this can cause memory overflow! */
 | |
|         APP_PRINTF("[ERR] CANCEL AN INVALID MSG !!");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if ( (E_MAIN_MSG_FROM_PLCMAC == dm_msg->msg.type)
 | |
|         || (E_MAIN_MSG_FROM_MAINTASK == dm_msg->msg.type)
 | |
|         || (E_MAIN_MSG_FROM_CUSTASK == dm_msg->msg.type)
 | |
|         || (E_MAIN_MSG_FROM_TIMER == dm_msg->msg.type)) {
 | |
|             iot_pkt_t *pkt = (iot_pkt_t *)dm_msg->data;
 | |
|             if (pkt) {
 | |
|                 iot_pkt_free(pkt);
 | |
|             }
 | |
|     }
 | |
| 
 | |
|     iot_task_free_msg(task_h, &(dm_msg->msg));
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_task_init() - Initialize main task.
 | |
|  * @param None.
 | |
|  * @return ERR_OK : Initialize done;
 | |
|  * @return ERR_FAIL : Initialize failed;
 | |
|  */
 | |
| static uint32_t iot_main_task_init(void)
 | |
| {
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
|     app_msg_task_h *msg_task = &(app_entry->msg_task);
 | |
|     iot_task_config_t *t_cfg = &(msg_task->cfg);
 | |
| 
 | |
|     t_cfg->stack_size = 0;
 | |
|     t_cfg->task_prio = APP_MSG_HANDLE_TASK_PRIO;
 | |
|     t_cfg->msg_size = sizeof(app_msg_t);
 | |
|     t_cfg->msg_cnt = APP_MSG_PENDING_LIMIT;
 | |
|     t_cfg->queue_cnt = APP_MSG_TASK_PRIO_QUE;
 | |
|     t_cfg->queue_cfg[0].quota = 0;
 | |
|     t_cfg->task_event_func = iot_main_event_handle;
 | |
|     t_cfg->msg_exe_func = iot_main_msg_handle;
 | |
|     t_cfg->msg_cancel_func = iot_main_msg_cancel;
 | |
| 
 | |
|     msg_task->handle = iot_task_create(IOT_APP_DL645_MID, t_cfg);
 | |
|     if (NULL == msg_task->handle) {
 | |
|         APP_PRINTF("[ERR] %s Create Task Failed !!", __FUNCTION__);
 | |
|         return ERR_FAIL;
 | |
|     }
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_cli_msg_callback() - handle data from cli.
 | |
|  * @param [in] data: cli data.
 | |
|  * @return ERR_OK : handle done;
 | |
|  */
 | |
| static uint32_t iot_main_cli_msg_callback(void *data)
 | |
| {
 | |
|     iot_main_task_msg_post(E_MAIN_MSG_FROM_MAINTASK, E_MAIN_MSG_ID_CLIAPP_RECV,
 | |
|         data);
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_plc_recv_callback() - handle data from plc layer.
 | |
|  * @param [in] param: not used.
 | |
|  * @param [in] pkt: pkt with plc data.
 | |
|  * @return None;
 | |
|  */
 | |
| static void iot_main_plc_recv_callback(void *param, iot_pkt_t *pkt)
 | |
| {
 | |
|     (void)param;
 | |
| 
 | |
|     if (false == sync_api_msg_from_mac_handle(pkt)) {
 | |
|         iot_main_task_msg_post(E_MAIN_MSG_FROM_PLCMAC,
 | |
|             E_MAIN_MSG_ID_PLCMAC_RECV, (void *)pkt);
 | |
|     }
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_app_plc_reg() - register this app to plc layer,
 | |
|  *          so we can transmit or receive packet from it
 | |
|  * @param None.
 | |
|  * @return ERR_OK : register done;
 | |
|  * @return ERR_FAIL : register failed;
 | |
|  */
 | |
| static uint32_t iot_main_app_plc_reg(void)
 | |
| {
 | |
|     iot_plc_app_t app;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
|     app.app_id = IOT_PLC_APP_DEMO_ID;
 | |
|     app.param   = NULL;
 | |
|     app.prio    = APP_PLC_CMD_PRIO;
 | |
|     app.recv    = iot_main_plc_recv_callback;
 | |
| 
 | |
|     app_entry->app_hdl = iot_plc_register_app(&app);
 | |
| 
 | |
|     if (NULL == app_entry->app_hdl) {
 | |
|         APP_PRINTF("[ERR] REGISTER APP FAILED !!");
 | |
|         return ERR_FAIL;
 | |
|     }
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_band_init() - app band set up.
 | |
|  * @param None.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_band_init(void)
 | |
| {
 | |
|     uint8_t band = 0;
 | |
|     uint8_t fb_bitmap[IOT_PLC_BAND_BITMAP_SIZE] = { 0 };
 | |
|     uint8_t *p_fb_bitmap;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     if (iot_plc_is_client_mode()) {
 | |
|         if (0 == iot_app_get_scan_band_in_pib(&p_fb_bitmap)) {
 | |
|             /* default set sta only scan band 1, freq: 2.4M to 5.6M */
 | |
|             fb_bitmap[APP_DEFAULT_FREQ_BAND / 8] |=
 | |
|                 1 << (APP_DEFAULT_FREQ_BAND % 8);
 | |
|             iot_plc_set_scan_band_bitmap(app_entry->app_hdl,
 | |
|                 IOT_PLC_API_REQ_ID_DEFAULT, fb_bitmap, IOT_PLC_BAND_BITMAP_SIZE);
 | |
|             iot_app_save_scan_band_to_pib(fb_bitmap, IOT_PLC_BAND_BITMAP_SIZE);
 | |
|         } else {
 | |
|             iot_plc_set_scan_band_bitmap(app_entry->app_hdl,
 | |
|                 IOT_PLC_API_REQ_ID_DEFAULT, p_fb_bitmap,
 | |
|                 IOT_PLC_BAND_BITMAP_SIZE);
 | |
|         }
 | |
|     }
 | |
|     /* set frequency band, default set band 1 */
 | |
|     band = iot_app_get_work_band_in_pib();
 | |
|     if (0 == band) {
 | |
|         app_set_freq_band(APP_DEFAULT_FREQ_BAND);
 | |
|         iot_app_save_work_band_to_pib(APP_DEFAULT_FREQ_BAND);
 | |
|     } else {
 | |
|         app_set_freq_band(band - 1);
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_board_info_report() - Report basic information of this board.
 | |
|  * @param None.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_board_info_report(void)
 | |
| {
 | |
|     uint32_t size;
 | |
|     iot_oem_base_cfg_t * oem_cfg;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     size = custom_dev_query_rw_size();
 | |
| 
 | |
|     (void)iot_oem_get_base_cfg(&oem_cfg);
 | |
| 
 | |
|     iot_cus_printf("\r\n************************** INFORMATION ****************"
 | |
|         "*******");
 | |
|     iot_cus_printf("\r\n* This application is designed by Aerospace C.Power");
 | |
|     iot_cus_printf("\r\n* And it's a guide to show how to use PLC-communication"
 | |
|         " module");
 | |
|     iot_cus_printf("\r\n* and periphera devices.");
 | |
|     iot_cus_printf("\r\n* MAC ADDRS : "MAC_FMT, MAC_ARG(oem_cfg->module_mac));
 | |
|     iot_cus_printf("\r\n* USER FLASH SIZE : %dbytes.(Size is optional.)", size);
 | |
|     iot_cus_printf("\r\n* FREE MEM SIZE : %dbytes.", os_mem_free_get());
 | |
|     iot_cus_printf("\r\n*******************************************************"
 | |
|         "*******");
 | |
| 
 | |
|     /* Init Local MAC */
 | |
|     os_mem_cpy(app_entry->dev.mac_addr, oem_cfg->module_mac, IOT_MAC_ADDR_LEN);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| #if APP_ENABLE_DUMP_PKT_INFO
 | |
| /**
 | |
|  * @brief iot_main_pkt_info_timer_callback() - timer callback for pkt inf dump.
 | |
|  * @param [in] timer_id: timer id.
 | |
|  * @param [in] arg: not used.
 | |
|  * @return None.
 | |
|  */
 | |
| static void iot_main_pkt_info_timer_callback(timer_id_t timer_id, void * arg)
 | |
| {
 | |
|     uint8_t i;
 | |
|     uint32_t bufsz, freenum, totalnum;
 | |
|     (void)arg;
 | |
| 
 | |
|     if (timer_id == g_pkt_info_timer) {
 | |
|         APP_PRINTF("pkt info:");
 | |
|         for (i = 0; i < 8; i++) {
 | |
|             iot_pkt_pktpool_status(i, &bufsz, &freenum, &totalnum);
 | |
|             if (bufsz == 0) {
 | |
|                 break;
 | |
|             }
 | |
|             iot_cus_printf("pkt size(%4lu) free_n:%2lu total_n:%2lu\n",
 | |
|                 bufsz, freenum, totalnum);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|  * @brief iot_main_module_init() - Initialize dlt645 app resource.
 | |
|  * @param None.
 | |
|  * @return ERR_OK : register done;
 | |
|  * @return ERR_FAIL : register failed;
 | |
|  */
 | |
| static uint32_t iot_main_module_init(void)
 | |
| {
 | |
|     uint16_t ret = ERR_FAIL;
 | |
|     app_dev_info *dev;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
|     os_mem_set(app_entry, 0x0, sizeof(*app_entry));
 | |
| 
 | |
|     /* Enable the customer-printf(). */
 | |
|     iot_cus_print_config(true);
 | |
|     iot_print_config(ENABLE_PLC_LIB_LOG);
 | |
| 
 | |
|     iot_main_board_info_report();
 | |
| 
 | |
|     APP_PRINTF("\r\n    MODULE INITIALIZING...");
 | |
| 
 | |
|     /* load custom config */
 | |
|     app_load_nv_conf();
 | |
| 
 | |
|     do {
 | |
|         app_entry->app_hdl = NULL;
 | |
|         app_entry->app_reg = false;
 | |
| 
 | |
|         dev = &(app_entry->dev);
 | |
| 
 | |
|         dev->link_id    = APP_LINK_ID;
 | |
|         dev->nid        = 1;
 | |
|         dev->dev_role   = IOT_PLC_DEV_ROLE_INVALID;
 | |
|         dev->dev_ready  = false;
 | |
| 
 | |
|         APP_PRINTF("    MESSAGE TASK INITIALIZING...");
 | |
|         if (ERR_OK != (ret = iot_main_task_init())) {
 | |
|             APP_PRINTF("[ERR] MSG TASK INIT FAILED !!");
 | |
|             break;
 | |
|         }
 | |
|         APP_PRINTF("    DLT645 APP REGISTERING...");
 | |
|         if (ERR_OK != (ret = iot_main_app_plc_reg())) {
 | |
|             APP_PRINTF("[ERR] APP REGISTER FAILED !!");
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|         iot_sync_api_init_app_hdl(app_entry->app_hdl, IOT_APP_DL645_MID,
 | |
|             iot_main_cli_msg_callback);
 | |
| 
 | |
|         /* initialize pib config */
 | |
|         app_pib_conf_init();
 | |
| 
 | |
|         /* sub system initialize */
 | |
|         app_dlt645_init();
 | |
|         iot_main_dlt645_local_handle_register();
 | |
| 
 | |
|         APP_PRINTF("    USER TASK INITIALIZING...");
 | |
|         if (ERR_OK != (ret = iot_cus_task_init())) {
 | |
|             APP_PRINTF("[ERR] USER TASK INIT FAILED !!");
 | |
|             break;
 | |
|         }
 | |
| 
 | |
|     #if APP_ENABLE_DUMP_PKT_INFO
 | |
|         g_pkt_info_timer = os_create_timer(IOT_APP_DL645_MID, true,
 | |
|             iot_main_pkt_info_timer_callback, NULL);
 | |
|         if (0 == g_pkt_info_timer) {
 | |
|             iot_cus_printf("[cus_task]create cmd timer failed.\n");
 | |
|             break;
 | |
|         }
 | |
|         os_start_timer(g_pkt_info_timer, APP_PKT_INFO_TIMER_PERIOD);
 | |
|     #endif
 | |
| 
 | |
|         if (iot_plc_is_client_mode()) {
 | |
|             /* creat and start a timer for signal led show */
 | |
|             if (0 == app_timer_start(APP_TIMER_ID_SIGNAL_LED,
 | |
|                 IOT_PLC_SIGNAL_LED_SHOW_INTVAL, TIMER_TYPE_PERIOD)) {
 | |
|                     APP_PRINTF("[ERR] CREATE SIGNAL LED TIMER FAILED !!");
 | |
|                     break;
 | |
|             }
 | |
|         } else {
 | |
|             /* creat and start a timer to check if network done */
 | |
|             if (0 == app_timer_start(APP_TIMER_ID_NET_DONE_CHECK,
 | |
|                 IOT_PLC_NET_DONE_CHECK_INTVAL, TIMER_TYPE_PERIOD)) {
 | |
|                     APP_PRINTF("[ERR] CREATE NET DONE TIMER FAILED !!");
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         if (iot_plc_is_client_mode()) {
 | |
|             /* close watchdog */
 | |
|             iot_plc_wdg_set(app_entry->app_hdl, 0, 0);
 | |
|         }
 | |
| 
 | |
|         /* band initialize */
 | |
|         iot_main_band_init();
 | |
| 
 | |
|         if (iot_plc_is_client_mode()) {
 | |
|             /* initialize meta information */
 | |
|             iot_meta_init(IOT_APP_SELECTION, IOT_APP_DL645_MID);
 | |
|         }
 | |
| 
 | |
|         /* todo: add upgrade */
 | |
|         // app_proto_upgrd_contxt_init();
 | |
| 
 | |
|         ret = ERR_OK;
 | |
|     }while(0);
 | |
| 
 | |
|     APP_PRINTF("MODULE INITIALIZED %s.", ret ? "WITH ERROR" : "SUCCESSFULLY");
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| uint32_t iot_main_task_msg_post(uint16_t msg_type, uint16_t msg_id, void *data)
 | |
| {
 | |
|     iot_task_msg_t *msg;
 | |
|     app_msg_t *task_msg;
 | |
|     app_entity_t *app_entry = NULL;
 | |
| 
 | |
|     app_entry = iot_main_get_app_entry();
 | |
| 
 | |
|     msg = iot_task_alloc_msg_with_reserved(app_entry->msg_task.handle, 0);
 | |
|     if (NULL == msg) {
 | |
|         APP_PRINTF("[ERR] %s Alloc MSG Buffer Failed !!", __FUNCTION__);
 | |
|         return ERR_FAIL;
 | |
|     }
 | |
| 
 | |
|     task_msg = (app_msg_t *)msg;
 | |
|     task_msg->msg.type = msg_type;
 | |
|     task_msg->msg.id = msg_id;
 | |
|     task_msg->data = data;
 | |
| 
 | |
|     iot_task_queue_msg(app_entry->msg_task.handle, &task_msg->msg,
 | |
|         APP_TASK_MSG_PRIO);
 | |
| 
 | |
|     return ERR_OK;
 | |
| }
 | |
| 
 | |
| inline app_entity_t *iot_main_get_app_entry(void)
 | |
| {
 | |
|     return &g_iot_dlt645app_entry;
 | |
| }
 | |
| 
 | |
| uint32_t app_iot_dl645_entry(void)
 | |
| {
 | |
|     uint32_t ret = ERR_FAIL;
 | |
| 
 | |
|     iot_cus_printf("\r\n APP ENTRY IOT_DLT645...\r\n");
 | |
|     ret = iot_main_module_init();
 | |
| 
 | |
|     if (ERR_OK != ret) {
 | |
|         ret = ERR_PENDING;
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
| }
 |