Files
kunlun/cli/host_interface/plc/iot_cli_hw_ver.c
2024-09-28 14:24:04 +08:00

156 lines
4.7 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 "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);
}
}