281 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			281 lines
		
	
	
		
			8.1 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_io_api.h"
 | |
| #include "iot_version.h"
 | |
| #include "iot_board_api.h"
 | |
| 
 | |
| #include "iot_cli_host_interface.h"
 | |
| #include "iot_cli_plc_module.h"
 | |
| #include "iot_cli_discovery.h"
 | |
| #include "iot_cli_plc_tx_rx.h"
 | |
| #include "iot_cli_sg_ctrl_api.h"
 | |
| #include "iot_cli_sg.h"
 | |
| 
 | |
| #if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
 | |
| 
 | |
| extern iot_cli_host_info_t *host_info;
 | |
| extern iot_plc_host_config_t *host_config;
 | |
| cli_dis_node_info dis_nod_info;
 | |
| static uint8_t band_id = CLI_JOIN_NODE_DEFAULT_BAND;
 | |
| static uint16_t query_times = 0;
 | |
| 
 | |
| static void cli_scan_band_bitmap_init()
 | |
| {
 | |
|     uint8_t fb_bitmap[IOT_PLC_BAND_BITMAP_SIZE] = { 0 };
 | |
|     /* default bitmap 0~3
 | |
|      * assign to mac band in customer range:
 | |
|      * PLC_LIB_FREQ_BAND_0     = 0, //2M to 12M
 | |
|      * PLC_LIB_FREQ_BAND_1     = 1, //2.4M to 5.6M
 | |
|      * PLC_LIB_FREQ_BAND_2     = 2, //700K to 3M
 | |
|      * PLC_LIB_FREQ_BAND_3     = 3, //1.7M to 3M
 | |
|      * PLC_LIB_FREQ_BAND_4     = 4, //5.6M to 12M
 | |
|      * PLC_LIB_FREQ_BAND_8     = 8, //5.8M to 9M
 | |
|      * PLC_LIB_FREQ_BAND_9     = 9, //4.9M to 24.4M
 | |
|      * PLC_LIB_FREQ_BAND_10    = 10,//28.3M to 34.5M
 | |
|      * PLC_LIB_FREQ_BAND_11    = 11,//4.9M to 12.2M
 | |
|      */
 | |
|     fb_bitmap[0] |= 1 << PLC_LIB_FREQ_BAND_0;
 | |
|     fb_bitmap[0] |= 1 << PLC_LIB_FREQ_BAND_1;
 | |
|     fb_bitmap[0] |= 1 << PLC_LIB_FREQ_BAND_2;
 | |
|     fb_bitmap[0] |= 1 << PLC_LIB_FREQ_BAND_3;
 | |
| 
 | |
| #if (IOT_SMART_CONFIG)
 | |
|     fb_bitmap[PLC_LIB_FREQ_BAND_9 / 8] |= 1 << (PLC_LIB_FREQ_BAND_9 % 8);
 | |
| #endif
 | |
| 
 | |
|     iot_plc_set_scan_band_bitmap(host_config->app_handle,
 | |
|         CLI_HOST_USE_API_BY_PLCM, fb_bitmap, IOT_PLC_BAND_BITMAP_SIZE);
 | |
| }
 | |
| 
 | |
| void cli_enable_discovery_mode(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)src_mac;
 | |
|     cli_enable_discovery_mode_dl *enable =
 | |
|         (cli_enable_discovery_mode_dl *)buffer;
 | |
| 
 | |
|     if ((!enable) || (bufferlen < sizeof(*enable))) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (!enable->enabled) {
 | |
|         goto out;
 | |
|     }
 | |
| 
 | |
|     // set scan band
 | |
|     cli_scan_band_bitmap_init();
 | |
| 
 | |
|     iot_plc_set_whitelist(
 | |
|         host_config->app_handle,
 | |
|         CLI_HOST_USE_API_BY_PLCM,
 | |
|         IOT_PLC_WL_DEL, 1,
 | |
|         host_config->cco_mac);
 | |
| 
 | |
|     // enable whitelist
 | |
|     iot_plc_set_whitelist(
 | |
|         host_config->app_handle,
 | |
|         CLI_HOST_USE_API_BY_PLCM,
 | |
|         IOT_PLC_WL_ENABLE, 0, NULL);
 | |
| 
 | |
|     // start nw fmt
 | |
|     iot_plc_start_nw_fmt(
 | |
|         host_config->app_handle, 0);
 | |
| 
 | |
| out:
 | |
|     // set discovery mode
 | |
|     iot_plc_set_discovery_mode(
 | |
|         host_config->app_handle,
 | |
|         CLI_HOST_USE_API_BY_PLCM,
 | |
|         enable->enabled);
 | |
| }
 | |
| 
 | |
| void cli_disable_discovery_mode()
 | |
| {
 | |
|     iot_plc_set_discovery_mode(
 | |
|         host_config->app_handle,
 | |
|         CLI_HOST_USE_API_BY_PLCM, 0);
 | |
| }
 | |
| 
 | |
| void cli_join_node(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     iot_cli_sg_ctrl_join_node_dl *join =
 | |
|         (iot_cli_sg_ctrl_join_node_dl *)buffer;
 | |
|     iot_cli_sg_ctrl_join_node_ack ack;
 | |
| 
 | |
|     if ((!join) || (bufferlen < sizeof(*join))) {
 | |
|         return;
 | |
|     }
 | |
|     if (join->ckq) {
 | |
|         iot_sg_cli_send_cmd(0, IOT_CLI_SG_CTRL_MSG_REQ_JOIN_NODE, buffer,
 | |
|             bufferlen);
 | |
|         goto out;
 | |
|     }
 | |
| 
 | |
|     if (join->band_id == CLI_JOIN_STA) {
 | |
|         query_times = 0;
 | |
|         band_id = join->band_id;
 | |
|         iot_plc_ctrl_proto_connect(
 | |
|             host_config->app_handle,
 | |
|             CLI_HOST_USE_API_BY_PLCM,
 | |
|             join->node
 | |
|         );
 | |
|     } else {
 | |
|         iot_plc_set_whitelist(
 | |
|             host_config->app_handle,
 | |
|             CLI_HOST_USE_API_BY_PLCM,
 | |
|             IOT_PLC_WL_DEL, 1,
 | |
|             host_config->cco_mac);
 | |
| 
 | |
|         iot_plc_set_whitelist(
 | |
|             host_config->app_handle,
 | |
|             CLI_HOST_USE_API_BY_PLCM,
 | |
|             IOT_PLC_WL_ADD, 1, join->node);
 | |
| 
 | |
|         iot_mac_addr_cpy(
 | |
|             host_config->cco_mac, join->node);
 | |
|         query_times = 0;
 | |
|         band_id = join->band_id;
 | |
| 
 | |
|         iot_printf("cli_join_node set band %d\n", band_id);
 | |
|         iot_plc_start_nw_fmt(
 | |
|             host_config->app_handle, 1);
 | |
|         iot_plc_set_freq_band(
 | |
|             host_config->app_handle,
 | |
|             CLI_HOST_USE_API_BY_PLCM,
 | |
|             band_id);
 | |
|     }
 | |
| out:
 | |
|     ack.result = 0;
 | |
|     iot_cli_send_to_host(
 | |
|         CLI_MSGID_JOIN_NODE_ACK,
 | |
|         (uint8_t *)&ack, sizeof(ack), src_mac);
 | |
| }
 | |
| 
 | |
| void cli_node_is_ready(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)buffer;
 | |
|     (void)bufferlen;
 | |
| 
 | |
|     uint8_t ready = (!!host_info->is_ready);
 | |
| 
 | |
|     iot_printf("cli_node_is_ready %lu\n", ready);
 | |
| 
 | |
|     query_times++;
 | |
| 
 | |
|     if ((!ready) && (band_id != CLI_JOIN_STA) &&
 | |
|         (0 == (query_times % CLI_JOIN_NODE_SET_BAND_INYERVAL)))
 | |
|     {
 | |
|         iot_printf("ckb join, start nw fmt and set band %d\n", band_id);
 | |
|         iot_plc_start_nw_fmt(
 | |
|             host_config->app_handle, 1);
 | |
|         iot_plc_set_freq_band(
 | |
|             host_config->app_handle,
 | |
|             CLI_HOST_USE_API_BY_PLCM,
 | |
|             band_id);
 | |
|     }
 | |
| 
 | |
|     iot_cli_send_to_host(
 | |
|         CLI_MSGID_NODE_IS_READY_RESPONSE,
 | |
|         (uint8_t *)&ready, sizeof(uint8_t), src_mac);
 | |
| }
 | |
| 
 | |
| static void cli_discovery_node_notify_timeout(timer_id_t timer_id, void *arg)
 | |
| {
 | |
|     (void)timer_id;
 | |
|     (void)arg;
 | |
|     upload_dis_nod_info_list();
 | |
| }
 | |
| 
 | |
| void cli_discovery_node_notify(
 | |
|     iot_plc_discovery_node_rpt_t *info)
 | |
| {
 | |
|     if (!info) {
 | |
|         iot_printf("discovery node notify, invalid data\n");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     uint32_t num = dis_nod_info.dis_node_num %
 | |
|         CLI_DISCOVERY_MAX_DIS_NODE;
 | |
|     dis_nod_info.nodelist[num].tei = (uint16_t)info->tei;
 | |
|     dis_nod_info.nodelist[num].nid = info->nid;
 | |
|     dis_nod_info.nodelist[num].phase = info->phase;
 | |
|     dis_nod_info.nodelist[num].role = (uint8_t)info->role;
 | |
|     dis_nod_info.nodelist[num].rx_snr = info->rx_snr;
 | |
|     dis_nod_info.nodelist[num].band_id = info->band_id;
 | |
|     iot_mac_addr_cpy(dis_nod_info.nodelist[num].addr,
 | |
|         info->addr);
 | |
|     iot_mac_addr_cpy(dis_nod_info.nodelist[num].cco_addr,
 | |
|         info->cco_addr);
 | |
|     dis_nod_info.dis_node_num++;
 | |
| 
 | |
|     if (dis_nod_info.dis_node_num >= CLI_DISCOVERY_MAX_DIS_NODE) {
 | |
|         os_stop_timer(dis_nod_info.rpt_timer);
 | |
|         upload_dis_nod_info_list();
 | |
|     } else if (!os_is_timer_active(dis_nod_info.rpt_timer)) {
 | |
|         os_start_timer(dis_nod_info.rpt_timer, CLI_DISCOVERY_MAX_INTERVAL_TM);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void cli_local_device_info(uint8_t *buffer, uint32_t bufferlen,
 | |
|     uint8_t *src_mac)
 | |
| {
 | |
|     (void)buffer;
 | |
|     (void)bufferlen;
 | |
|     cli_sg_device_info_ul_t device_info = { 0 };
 | |
|     iot_build_info_t build_info;
 | |
| 
 | |
|     iot_version_get_user_build_info(&build_info);
 | |
|     device_info.sw_ver = build_info.sw_ver;
 | |
|     device_info.vendor_id = iot_board_load_user_vendor_id();
 | |
|     iot_cli_send_to_host(CLI_MSGID_GET_DEVICE_INFO_RESP,
 | |
|         (uint8_t *)&device_info, sizeof(device_info), src_mac);
 | |
| }
 | |
| 
 | |
| void upload_dis_nod_info_list()
 | |
| {
 | |
|     if (!dis_nod_info.dis_node_num) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     iot_cli_send_to_host(CLI_MSGID_DISCOVERY_NODE_RESP,
 | |
|         (uint8_t*)&dis_nod_info, sizeof(cli_discovery_node_rpt) *
 | |
|         dis_nod_info.dis_node_num + sizeof(dis_nod_info.dis_node_num),
 | |
|         NULL);
 | |
| 
 | |
|     dis_nod_info.dis_node_num = 0;
 | |
| }
 | |
| 
 | |
| void cli_discovery_init()
 | |
| {
 | |
|     os_mem_set(&dis_nod_info, 0, sizeof(dis_nod_info));
 | |
|     dis_nod_info.rpt_timer = os_create_timer(IOT_CLI_MID, false,
 | |
|         cli_discovery_node_notify_timeout, NULL);
 | |
|     if (dis_nod_info.rpt_timer == 0) {
 | |
|         IOT_ASSERT(0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void cli_discovery_deinit()
 | |
| {
 | |
|     if (dis_nod_info.rpt_timer) {
 | |
|         os_delete_timer(dis_nod_info.rpt_timer);
 | |
|         dis_nod_info.rpt_timer = 0;
 | |
|     }
 | |
| }
 | |
| 
 | |
| #endif |