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
|