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
 |