224 lines
6.0 KiB
C
224 lines
6.0 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_cli.h"
|
|
#include "iot_cli_host_interface.h"
|
|
#include "iot_cli_plc_module.h"
|
|
#include "iot_cli_ckb.h"
|
|
|
|
extern iot_cli_host_info_t *host_info;
|
|
extern iot_plc_host_config_t *host_config;
|
|
|
|
uint8_t is_local_mac(uint8_t* mac)
|
|
{
|
|
//check if mac is local or not
|
|
uint8_t is_local = 1;
|
|
is_local = ((!mac) || MAC_IS_EMPTY(mac) ||
|
|
iot_mac_addr_cmp(mac, host_config->mac_addr));
|
|
return is_local;
|
|
}
|
|
|
|
#if IOT_CLI_CKB_ADDR_MAPPING
|
|
|
|
void remove_addr_from_mapping_table(uint8_t* mac)
|
|
{
|
|
if (host_config->cmd_mapping_table == NULL) {
|
|
return;
|
|
}
|
|
|
|
os_acquire_mutex(host_config->m_mapping_table_lock);
|
|
|
|
for (uint8_t i = 1; i < CMD_MAPPING_TABLE_CNT; i++) {
|
|
if (host_config->cmd_mapping_table[i].is_used &&
|
|
iot_mac_addr_cmp(mac,
|
|
host_config->cmd_mapping_table[i].mac)) {
|
|
host_config->cmd_mapping_table[i].is_used = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
os_release_mutex(host_config->m_mapping_table_lock);
|
|
}
|
|
|
|
//return 0 mean cco, otherwise return index
|
|
uint8_t add_addr_to_mapping_table(uint8_t* mac)
|
|
{
|
|
uint8_t i = 1;
|
|
|
|
if ((host_config->cmd_mapping_table == NULL) ||
|
|
(mac == NULL) || is_local_mac(mac)) {
|
|
return 0;
|
|
}
|
|
|
|
os_acquire_mutex(host_config->m_mapping_table_lock);
|
|
|
|
// find mac in cmd mapping table
|
|
for (i = 1; i < CMD_MAPPING_TABLE_CNT; i++) {
|
|
if (host_config->cmd_mapping_table[i].is_used) {
|
|
if (iot_mac_addr_cmp(mac,
|
|
host_config->cmd_mapping_table[i].mac)) {
|
|
os_release_mutex(
|
|
host_config->m_mapping_table_lock);
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i = 1; i < CMD_MAPPING_TABLE_CNT; i++) {
|
|
if (!host_config->cmd_mapping_table[i].is_used) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i < CMD_MAPPING_TABLE_CNT) {
|
|
iot_mac_addr_cpy(
|
|
host_config->cmd_mapping_table[i].mac, mac);
|
|
host_config->cmd_mapping_table[i].is_used = 1;
|
|
|
|
if ((i + 1) < CMD_MAPPING_TABLE_CNT) {
|
|
host_config->cmd_mapping_table[i + 1].is_used = 0;
|
|
}
|
|
} else {
|
|
i = 1;
|
|
iot_mac_addr_cpy(
|
|
host_config->cmd_mapping_table[i].mac, mac);
|
|
host_config->cmd_mapping_table[i].is_used = 1;
|
|
|
|
if ((i + 1) < CMD_MAPPING_TABLE_CNT) {
|
|
host_config->cmd_mapping_table[i + 1].is_used = 0;
|
|
}
|
|
}
|
|
|
|
os_release_mutex(host_config->m_mapping_table_lock);
|
|
iot_printf("add_addr_to_mapping_table"
|
|
" fail count(%d)\n", CMD_MAPPING_TABLE_CNT);
|
|
return i;
|
|
}
|
|
|
|
uint8_t *get_first_ckb_addr_from_mapping_table()
|
|
{
|
|
uint8_t *addr = NULL;
|
|
|
|
if (host_config->cmd_mapping_table == NULL) {
|
|
return addr;
|
|
}
|
|
|
|
for (uint8_t i = 1; i < CMD_MAPPING_TABLE_CNT; i++) {
|
|
if (host_config->cmd_mapping_table[i].is_used) {
|
|
addr = host_config->cmd_mapping_table[i].mac;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return addr;
|
|
}
|
|
|
|
uint8_t *get_addr_from_mapping_table(uint8_t index)
|
|
{
|
|
uint8_t *addr = NULL;
|
|
cli_app_cmd_mapping_item *cmd = NULL;
|
|
|
|
cmd = get_cmd_from_mapping_table(index);
|
|
if (cmd) {
|
|
addr = cmd->mac;
|
|
}
|
|
|
|
return addr;
|
|
}
|
|
|
|
cli_app_cmd_mapping_item *get_cmd_from_mapping_table(uint8_t index)
|
|
{
|
|
cli_app_cmd_mapping_item *p_cmd_item = NULL;
|
|
|
|
if ((host_config->cmd_mapping_table == NULL) ||
|
|
(index >= CMD_MAPPING_TABLE_CNT)) {
|
|
return NULL;
|
|
}
|
|
|
|
os_acquire_mutex(host_config->m_mapping_table_lock);
|
|
p_cmd_item = host_config->cmd_mapping_table + index;
|
|
os_release_mutex(host_config->m_mapping_table_lock);
|
|
return p_cmd_item;
|
|
}
|
|
|
|
void iot_cli_addr_mapping_init()
|
|
{
|
|
if (host_config->m_mapping_table_lock) {
|
|
return;
|
|
}
|
|
host_config->m_mapping_table_lock = os_create_mutex(IOT_CLI_MID);
|
|
host_config->cmd_mapping_table =
|
|
(cli_app_cmd_mapping_item*)os_mem_malloc(IOT_CLI_MID,
|
|
CMD_MAPPING_TABLE_CNT * sizeof(cli_app_cmd_mapping_item));
|
|
if (host_config->cmd_mapping_table) {
|
|
os_mem_set(host_config->cmd_mapping_table, 0,
|
|
CMD_MAPPING_TABLE_CNT * sizeof(cli_app_cmd_mapping_item));
|
|
// reserved for cco
|
|
host_config->cmd_mapping_table[0].is_used = 1;
|
|
}
|
|
}
|
|
|
|
void iot_cli_addr_mapping_deinit()
|
|
{
|
|
if (host_config->cmd_mapping_table) {
|
|
os_mem_free(host_config->cmd_mapping_table);
|
|
host_config->cmd_mapping_table = NULL;
|
|
}
|
|
if (host_config->m_mapping_table_lock) {
|
|
os_delete_mutex(host_config->m_mapping_table_lock);
|
|
host_config->m_mapping_table_lock = NULL;
|
|
}
|
|
}
|
|
#else
|
|
|
|
uint8_t add_addr_to_mapping_table(uint8_t* mac)
|
|
{
|
|
(void)mac;
|
|
return 0;
|
|
}
|
|
|
|
#endif /* IOT_CLI_CKB_ADDR_MAPPING */
|
|
|
|
#if PLC_SUPPORT_CCO_ROLE
|
|
|
|
void iot_cli_ckb_init()
|
|
{
|
|
iot_cli_addr_mapping_init();
|
|
}
|
|
|
|
void iot_cli_ckb_deinit()
|
|
{
|
|
iot_cli_addr_mapping_deinit();
|
|
}
|
|
|
|
#endif /* PLC_SUPPORT_CCO_ROLE */
|
|
|
|
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
|
|
void iot_cli_host_set_ckb_dev_type()
|
|
{
|
|
iot_plc_cfg_set_req_t cfg = { 0 };
|
|
|
|
iot_printf("sta control mode, set dev type to meter controller\n");
|
|
|
|
cfg.dev_type_valid = 1;
|
|
cfg.dev_type = IOT_PLC_DEV_TYPE_METER_CONTROLLER;
|
|
|
|
iot_plc_set_cfg(host_config->app_handle,
|
|
IOT_PLC_API_REQ_ID_DEFAULT, &cfg);
|
|
}
|
|
#endif
|