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
 |