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

320 lines
9.3 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_io_api.h"
#include "iot_upgrade_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_set_info.h"
extern iot_plc_host_config_t *host_config;
extern iot_cli_t cli;
timer_id_t set_info_timer;
uint8_t set_id;
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
static void cli_set_vendor_local_ack(uint8_t *src_mac)
{
cli_vendor_report report;
report.set_id = set_id;
iot_mac_addr_cpy(report.dst, host_config->mac_addr);
iot_cli_send_to_host(CLI_MSGID_SET_VENDOR_ACK,
(uint8_t*)&report, sizeof(cli_vendor_report), src_mac);
}
#endif
/* cli set vendor handler */
void cli_set_vendor(
uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
{
(void)src_mac;
cli_vendor_info *vendor_info =
(cli_vendor_info *)buffer;
if ((!vendor_info) || (bufferlen < sizeof(*vendor_info))) {
iot_printf("dev save vendor, invalid para\n");
return;
}
if (host_config->dev_role != IOT_PLC_DEV_ROLE_CCO) {
if (set_id != vendor_info->set_id)
{
iot_printf("sta set vendor %lu %lu\n",
set_id, vendor_info->set_id);
iot_board_save_user_vendor_id(vendor_info->vendor);
set_id = vendor_info->set_id;
} else {
iot_printf("sta vendor already set\n");
}
#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
cli_set_vendor_local_ack(src_mac);
#else
if (!os_is_timer_active(set_info_timer) &&
vendor_info->control) {
if (vendor_info->report_window >
CLI_SET_VENDOR_TIME_WINDOW) {
vendor_info->report_window =
CLI_SET_VENDOR_TIME_WINDOW;
}
os_start_timer(set_info_timer,
os_rand() % vendor_info->report_window);
}
#endif
}
#if PLC_SUPPORT_CCO_ROLE
else {
cli_set_vendor_ack ack;
ack.result = 0;
iot_cli_send_to_host(CLI_MSGID_SET_VENDOR_ACK,
(uint8_t *)&ack, sizeof(ack), src_mac);
if (iot_mac_addr_cmp(host_config->mac_addr, vendor_info->dst))
{
// set cco
if (set_id != vendor_info->set_id) {
iot_printf("cco set vendor %lu %lu\n",
set_id, vendor_info->set_id);
iot_board_save_user_vendor_id(vendor_info->vendor);
set_id = vendor_info->set_id;
} else {
iot_printf("cco vendor already set\n");
}
} else {
// set sta
uint8_t send_type = IOT_PLC_MSG_TYPE_UNICAST;
// store requet id for vendor report
host_config->cli_request_id =
add_addr_to_mapping_table(src_mac);
// check if broadcast
if (iot_mac_is_bcast(vendor_info->dst)) {
send_type = IOT_PLC_MSG_TYPE_BCAST;
}
iot_printf("cco forward set cmd stype %lu\n", send_type);
iot_cli_host_send_data_plc(
send_type, CLI_MSGID_SET_VENDOR,
vendor_info->dst, buffer, bufferlen);
}
}
#endif
}
/* dev save build info func */
static void cli_dev_save_build_info(cli_build_info *build_info)
{
iot_build_info_t iot_build_info;
if (!build_info) {
iot_printf("dev save build info, invalid para\n");
return;
}
iot_build_info.sw_ver = build_info->sw_ver;
iot_build_info.year = build_info->year;
iot_build_info.month = build_info->month;
iot_build_info.day = build_info->day;
iot_build_info.hour = build_info->hour;
iot_build_info.min = build_info->min;
iot_build_info.sec = build_info->sec;
iot_board_save_user_build_info(&iot_build_info);
}
/* cli set build info handler */
void cli_set_build_info(
uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
{
(void)src_mac;
cli_build_info *build_info =
(cli_build_info *)buffer;
if ((!build_info) || (bufferlen < sizeof(*build_info))) {
return;
}
if (host_config->dev_role != IOT_PLC_DEV_ROLE_CCO) {
if (set_id != build_info->set_id)
{
iot_printf("sta set build info %lu %lu %lu\n",
set_id, build_info->set_id, build_info->sw_ver);
cli_dev_save_build_info(build_info);
set_id = build_info->set_id;
} else {
iot_printf("sta build info already set\n");
}
if (!os_is_timer_active(set_info_timer) &&
build_info->control) {
if (build_info->report_window >
CLI_SET_VENDOR_TIME_WINDOW) {
build_info->report_window =
CLI_SET_VENDOR_TIME_WINDOW;
}
os_start_timer(
set_info_timer,
os_rand() % build_info->report_window);
}
}
#if PLC_SUPPORT_CCO_ROLE
else {
cli_set_build_info_ack ack;
ack.result = 0;
iot_cli_send_to_host(CLI_MSGID_SET_BUILD_INFO_ACK,
(uint8_t *)&ack, sizeof(ack), src_mac);
if (iot_mac_addr_cmp(host_config->mac_addr, build_info->dst))
{
// set cco
if (set_id != build_info->set_id) {
iot_printf("cco set build info %lu %lu\n",
set_id, build_info->set_id);
cli_dev_save_build_info(build_info);
set_id = build_info->set_id;
} else {
iot_printf("cco build info already set\n");
}
}
else {
// set sta
uint8_t send_type = IOT_PLC_MSG_TYPE_UNICAST;
// store requet id for vendor report
host_config->cli_request_id = add_addr_to_mapping_table(src_mac);
// check if broadcast
if (iot_mac_is_bcast(build_info->dst)) {
send_type = IOT_PLC_MSG_TYPE_BCAST;
}
iot_printf("cco forward set cmd stype %lu\n", send_type);
iot_cli_host_send_data_plc(send_type, CLI_MSGID_SET_BUILD_INFO,
build_info->dst, buffer, bufferlen);
}
}
#endif
}
#if PLC_SUPPORT_CCO_ROLE
/* cco handle venfor report from sta */
void cli_set_vendor_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_VENDOR_REPORT,
buffer, bufferlen, addr);
}
/* cco handle build info from sta */
void cli_set_build_info_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_BUILD_INFO_REPORT,
buffer, bufferlen, addr);
}
#endif
/* timer for set info */
static void iot_cli_set_info_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_SET_TIMER, NULL);
if (msg) {
iot_task_queue_msg(cli.cli_task_h, msg, IOT_CLI_QUEUE_TIMER);
}
}
/* check if set venfor */
static uint8_t iot_cli_is_set_vendor()
{
if (set_id <= CLI_SET_VENDOR_ID_MAX)
{
return 1;
}
return 0;
}
static void iot_cli_info_reset_report()
{
if (iot_cli_is_set_vendor()) {
cli_vendor_report report;
report.set_id = set_id;
iot_mac_addr_cpy(report.dst, host_config->mac_addr);
iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST,
CLI_MSGID_VENDOR_REPORT, host_config->cco_mac,
(uint8_t*)&report, sizeof(cli_vendor_report));
} else {
cli_build_info_report report;
report.set_id = set_id;
iot_mac_addr_cpy(report.dst, host_config->mac_addr);
iot_cli_host_send_data_plc(IOT_PLC_MSG_TYPE_UNICAST,
CLI_MSGID_BUILD_INFO_REPORT, host_config->cco_mac,
(uint8_t*)&report, sizeof(cli_build_info_report));
}
}
/* handle set timer msg */
void iot_cli_set_info_handle_timer_msg()
{
iot_cli_info_reset_report();
// stop timer
os_stop_timer(set_info_timer);
}
/* init cli set info */
void iot_cli_set_info_init()
{
set_id = 0;
if (host_config->dev_role != IOT_PLC_DEV_ROLE_CCO)
{
set_info_timer = os_create_timer(IOT_CLI_MID, 1,
iot_cli_set_info_timer, NULL);
}
}
/* sta handle leave when ver change */
void iot_cli_user_ver_change_reset()
{
if (set_id > 0) {
iot_upgrade_reset();
}
}