/**************************************************************************** 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 "os_utils_api.h" #include "iot_board.h" #include "iot_oem_api.h" #include "iot_io_api.h" #include "iot_cli.h" #include "iot_cli_host_interface.h" #include "iot_cli_plc_module.h" #include "iot_cli_common.h" #include "iot_cli_plc_tx_rx.h" #include "iot_cli_hw_ver.h" extern iot_plc_host_config_t *host_config; extern iot_cli_t cli; timer_id_t hw_ver_query_timer; /* report hw ver */ static void cli_report_hw_ver(uint8_t cco, uint8_t *src_mac) { (void)src_mac; cli_hw_ver_report report; report.hw_ver = iot_board_hw_version_hex(); report.user_type = iot_oem_get_user_type(); iot_mac_addr_cpy(report.dst, host_config->mac_addr); iot_printf("cli_report_hw_ver %d\n", cco); if (!cco) { iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST, CLI_MSGID_HW_VER_REPORT, host_config->cco_mac, (uint8_t*)&report, sizeof(cli_hw_ver_report)); } #if PLC_SUPPORT_CCO_ROLE else { iot_cli_send_to_host(CLI_MSGID_HW_VER_REPORT, (uint8_t *)&report, sizeof(report), src_mac); } #endif } #if PLC_SUPPORT_CCO_ROLE /* cli handle hw ver report */ void cli_cco_forward_hw_ver_report( uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) { (void)src_mac; uint8_t *addr = get_addr_from_mapping_table(host_config->cli_request_id); iot_cli_send_to_host(CLI_MSGID_HW_VER_REPORT, buffer, bufferlen, addr); } #endif /* cli query hw ver handler */ void cli_query_hw_ver( uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac) { (void)src_mac; cli_hw_ver_query *query = (cli_hw_ver_query *)buffer; if ((!query) || (bufferlen < sizeof(*query))) { iot_printf("cli_hw_ver_query, invalid para\n"); return; } iot_printf("cli_hw_ver_query enter\n"); if (host_config->dev_role != IOT_PLC_DEV_ROLE_CCO) { if (!os_is_timer_active(hw_ver_query_timer)) { uint16_t time = 0; if (query->report_window > CLI_HW_VER_QUERY_TIME_WINDOW) { query->report_window = CLI_HW_VER_QUERY_TIME_WINDOW; } time = (uint16_t)(CLI_HW_VER_QUERY_TIME_BASE + os_rand() % query->report_window); iot_printf("cli_hw_ver_query, %d %d\n", query->report_window, time); // sta start timer to report hw ver os_start_timer(hw_ver_query_timer, time); } } #if PLC_SUPPORT_CCO_ROLE else { if (iot_mac_addr_cmp(query->dst, host_config->mac_addr)) { cli_report_hw_ver(1, src_mac); } else { uint8_t send_type = IOT_PLC_MSG_TYPE_UNICAST; if (iot_mac_is_bcast(query->dst)) { send_type = IOT_PLC_MSG_TYPE_BCAST; // report cco hw ver cli_report_hw_ver(1, src_mac); } // store requet id for vendor report host_config->cli_request_id = add_addr_to_mapping_table(src_mac); iot_printf("cco forward set cmd stype %lu\n", send_type); iot_cli_host_send_data_plc( send_type, CLI_MSGID_QUEYR_HW_VER, query->dst, buffer, bufferlen); } } #endif } /* handle query timer msg */ void iot_cli_query_hw_ver_handle_timer_msg() { cli_report_hw_ver(0, NULL); } /* timer for query hw ver */ static void iot_cli_query_hw_ver_timer(timer_id_t timer_id, void *arg) { (void)timer_id; (void)arg; iot_task_msg_t *msg; msg = iot_cli_create_cli_msg(IOT_CLI_QUERY_HW_TIMER, NULL); if (msg) { iot_task_queue_msg(cli.cli_task_h, msg, IOT_CLI_QUEUE_TIMER); } } /* init query hw ver */ void iot_cli_query_hw_ver_init() { if (host_config->dev_role != IOT_PLC_DEV_ROLE_CCO) { hw_ver_query_timer = os_create_timer( IOT_CLI_MID, 0, iot_cli_query_hw_ver_timer, NULL); } }