280 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			280 lines
		
	
	
		
			8.5 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_common.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli_plc_tx_rx.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli_host_interface.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli_plc_module.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli_ada_dump.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (IOT_STA_CONTROL_MODE == IOT_STA_CONTROL_TYPE_STA)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "plc_chn_est.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern iot_plc_host_config_t *host_config;
							 | 
						||
| 
								 | 
							
								extern iot_cli_host_info_t *host_info;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								iot_ipc_addr_t dump_mac_addr = { IOT_IPC_FID_ADA, IOT_IPC_CID_ADA_MAC };
							 | 
						||
| 
								 | 
							
								iot_cli_ada_dump_info dump_info;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void cli_send_ada_dump_ack(
							 | 
						||
| 
								 | 
							
								    uint32_t msgid, uint8_t errorCode, uint8_t *src_mac)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_ada_dump_param_ack ack;
							 | 
						||
| 
								 | 
							
								    ack.result = errorCode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_cli_send_to_host(msgid, (uint8_t *)&ack, sizeof(ack), src_mac);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_set_ada_dump_param(
							 | 
						||
| 
								 | 
							
								    uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *buf;
							 | 
						||
| 
								 | 
							
								    iot_phy_chn_dump_rt_typ_t dumpt_type;
							 | 
						||
| 
								 | 
							
								    uint32_t data_size = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ((!buffer) || (bufferlen < sizeof(iot_phy_chn_dump_rt_typ_t))) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // if there is one active dump, stop it
							 | 
						||
| 
								 | 
							
								    if (os_is_timer_active(dump_info.dump_timer))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        os_stop_timer(dump_info.dump_timer);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dumpt_type = *((iot_phy_chn_dump_rt_typ_t *)buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("%s %lu\n", __FUNCTION__, dumpt_type);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (dumpt_type == IOT_PHY_CHN_DUMP_NOISE)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        data_size = sizeof(iot_phy_chn_dump_rt_typ_t) +
							 | 
						||
| 
								 | 
							
								            sizeof(iot_phy_chn_dump_rt_param_t);
							 | 
						||
| 
								 | 
							
								    } else if (dumpt_type == IOT_PHY_CHN_DUMP_TRIG_THD) {
							 | 
						||
| 
								 | 
							
								        data_size = sizeof(iot_phy_chn_dump_rt_typ_t) +
							 | 
						||
| 
								 | 
							
								            sizeof(iot_phy_chn_dump_trig_thd_param_t);
							 | 
						||
| 
								 | 
							
								    } else if (dumpt_type == IOT_PHY_CHN_DUMP_TRIG_FC) {
							 | 
						||
| 
								 | 
							
								        data_size = sizeof(iot_phy_chn_dump_rt_typ_t) +
							 | 
						||
| 
								 | 
							
								            sizeof(iot_phy_chn_dump_trig_phy_param_t);
							 | 
						||
| 
								 | 
							
								    } else if (dumpt_type == IOT_PHY_CHN_DUMP_RF) {
							 | 
						||
| 
								 | 
							
								        data_size = sizeof(iot_phy_chn_dump_rt_typ_t) +
							 | 
						||
| 
								 | 
							
								            sizeof(iot_phy_chn_dump_rf_param_t);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s failed, type nosupp\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								        cli_send_ada_dump_ack(CLI_MSGID_SET_ADA_DUMP_PARAM_ACK,
							 | 
						||
| 
								 | 
							
								            CLI_ADA_DUMP_PARAM_ACK_FAILED, src_mac);
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (bufferlen < data_size) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s failed, param len\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								        cli_send_ada_dump_ack(CLI_MSGID_SET_ADA_DUMP_PARAM_ACK,
							 | 
						||
| 
								 | 
							
								            CLI_ADA_DUMP_PARAM_ACK_FAILED, src_mac);
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // store requet id for ada dump
							 | 
						||
| 
								 | 
							
								    cli_send_ada_dump_ack(CLI_MSGID_SET_ADA_DUMP_PARAM_ACK,
							 | 
						||
| 
								 | 
							
								        CLI_ADA_DUMP_PARAM_ACK_SUCCESS, src_mac);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    buf = iot_ipc_pkt_alloc(CLI_IPC_MSG_SHORT_BUF_SIZE, IOT_PLC_LIB_MID);
							 | 
						||
| 
								 | 
							
								    if (buf) {
							 | 
						||
| 
								 | 
							
								        uint8_t *data =
							 | 
						||
| 
								 | 
							
								            iot_pkt_block_ptr(buf, IOT_PKT_BLOCK_DATA);
							 | 
						||
| 
								 | 
							
								        iot_channel_test_msg *msg = (iot_channel_test_msg *)data;
							 | 
						||
| 
								 | 
							
								        msg->msg_id = IOT_CHANNEL_DUMP_TEST_START;
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(msg->data, buffer, data_size);
							 | 
						||
| 
								 | 
							
								        iot_pkt_put(buf, data_size + sizeof(msg->msg_id));
							 | 
						||
| 
								 | 
							
								        iot_ipc_send(host_config->ipc_h, &dump_mac_addr, buf);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void cli_ada_dump_report_result(uint16_t index)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint16_t data_size = CLI_ADA_DUMP_DATA_SIZE;
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *dump_pkt = NULL;
							 | 
						||
| 
								 | 
							
								    cli_ada_dump_data *dump_data = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("cli_ada_dump_report_result idx %lu total_num %lu\n",
							 | 
						||
| 
								 | 
							
								        index, dump_info.total_cnt);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (index <= (dump_info.total_cnt - 1)) {
							 | 
						||
| 
								 | 
							
								        if (index == (dump_info.total_cnt - 1)) {
							 | 
						||
| 
								 | 
							
								            data_size = (uint16_t)(dump_info.len -
							 | 
						||
| 
								 | 
							
								                index * CLI_ADA_DUMP_DATA_SIZE);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        iot_printf("cli_ada_dump_report_result size %lu\n", data_size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (!data_size) {
							 | 
						||
| 
								 | 
							
								            iot_printf("dump report result, data_size 0\n");
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        dump_pkt = iot_pkt_alloc(sizeof(cli_ada_dump_data), IOT_CLI_MID);
							 | 
						||
| 
								 | 
							
								        if (!dump_pkt) {
							 | 
						||
| 
								 | 
							
								            iot_printf("dump report result, dumpdata NULL\n");
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        dump_data = (cli_ada_dump_data *)iot_pkt_data(dump_pkt);
							 | 
						||
| 
								 | 
							
								        dump_data->cnt = dump_info.total_cnt;
							 | 
						||
| 
								 | 
							
								        dump_data->idx = index;
							 | 
						||
| 
								 | 
							
								        dump_data->len = data_size;
							 | 
						||
| 
								 | 
							
								        dump_data->gain = dump_info.gain;
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(dump_data->data,
							 | 
						||
| 
								 | 
							
								            dump_info.data + index * CLI_ADA_DUMP_DATA_SIZE,
							 | 
						||
| 
								 | 
							
								            data_size);
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(dump_data->reserved, dump_info.reserved,
							 | 
						||
| 
								 | 
							
								            CLI_ADA_DUMP_RESERVED_DATA_SIZE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        iot_pkt_put(dump_pkt, sizeof(cli_ada_dump_data));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        cli_ul_send_with_retry(CLI_MSGID_SET_ADA_DUMP_RESULT,
							 | 
						||
| 
								 | 
							
								            (uint8_t*)dump_data, sizeof(cli_ada_dump_data), NULL);
							 | 
						||
| 
								 | 
							
								        cli_ul_send_with_retry(CLI_MSGID_SET_ADA_DUMP_RESULT,
							 | 
						||
| 
								 | 
							
								            (uint8_t*)dump_data, sizeof(cli_ada_dump_data), NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        iot_pkt_free(dump_pkt);
							 | 
						||
| 
								 | 
							
								        dump_info.idx++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (index >= (dump_info.total_cnt - 1) &&
							 | 
						||
| 
								 | 
							
								        os_is_timer_active(dump_info.dump_timer)) {
							 | 
						||
| 
								 | 
							
								        os_stop_timer(dump_info.dump_timer);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_query_ada_dump_data(
							 | 
						||
| 
								 | 
							
								    uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)src_mac;
							 | 
						||
| 
								 | 
							
								    cli_ada_dump_query_result *query =
							 | 
						||
| 
								 | 
							
								        (cli_ada_dump_query_result *)buffer;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ((!query) || (bufferlen < sizeof(cli_ada_dump_query_result))) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_ada_dump_report_result(query->idx);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_cli_ada_dump_handle_timer_msg()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_ada_dump_report_result(dump_info.idx);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void iot_cli_report_dump_msg(
							 | 
						||
| 
								 | 
							
								    iot_phy_chn_dump_result *dump_result)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (dump_result && dump_result->len) {
							 | 
						||
| 
								 | 
							
								        dump_info.data = dump_result->start_ptr;
							 | 
						||
| 
								 | 
							
								        dump_info.len = dump_result->len;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        iot_printf("iot_cli_report_dump_msg len %lu\n", dump_info.len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        dump_info.total_cnt = (uint16_t)
							 | 
						||
| 
								 | 
							
								            ((dump_result->len + CLI_ADA_DUMP_DATA_SIZE - 1) /
							 | 
						||
| 
								 | 
							
								            CLI_ADA_DUMP_DATA_SIZE);
							 | 
						||
| 
								 | 
							
								        dump_info.gain = dump_result->gain;
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(dump_info.reserved, (uint8_t*)(&(dump_result->report)),
							 | 
						||
| 
								 | 
							
								            CLI_ADA_DUMP_RESERVED_DATA_SIZE);
							 | 
						||
| 
								 | 
							
								        dump_info.idx = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        cli_ada_dump_report_result(dump_info.idx);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (os_is_timer_active(dump_info.dump_timer))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            os_stop_timer(dump_info.dump_timer);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        os_start_timer(dump_info.dump_timer, CLI_ADA_DUMP_TIMER);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_cli_handle_ada_msg(iot_pkt_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_printf("iot_cli_handle_ada_msg\n");
							 | 
						||
| 
								 | 
							
								    if (pkt) {
							 | 
						||
| 
								 | 
							
								        iot_channel_test_msg *msg =
							 | 
						||
| 
								 | 
							
								            (iot_channel_test_msg*)iot_pkt_data(pkt);
							 | 
						||
| 
								 | 
							
								        switch (msg->msg_id) {
							 | 
						||
| 
								 | 
							
								        case IOT_CHANNEL_DUMP_TEST_DONE:
							 | 
						||
| 
								 | 
							
								            iot_cli_report_dump_msg((iot_phy_chn_dump_result *)msg->data);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        default:
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        iot_pkt_free(pkt);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        iot_printf("iot_cli_handle_ada_msg invalid para\n");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_cli_ipc_recv(void *param, iot_ipc_addr_t *addr,
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)addr;
							 | 
						||
| 
								 | 
							
								    (void)param;
							 | 
						||
| 
								 | 
							
								    iot_task_msg_t *ipc_msg =
							 | 
						||
| 
								 | 
							
								        iot_cli_create_cli_msg(IOT_CLI_ADA_MSG, pkt);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (ipc_msg) {
							 | 
						||
| 
								 | 
							
								        iot_task_queue_msg(
							 | 
						||
| 
								 | 
							
								            host_info->host_task_h, ipc_msg, IOT_CLI_QUEUE_HOST);
							 | 
						||
| 
								 | 
							
								    } else if (pkt) {
							 | 
						||
| 
								 | 
							
								        iot_pkt_free(pkt);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* timer for set info */
							 | 
						||
| 
								 | 
							
								static void iot_cli_dump_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_DUMP_TIMER, NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (msg) {
							 | 
						||
| 
								 | 
							
								        iot_task_queue_msg(
							 | 
						||
| 
								 | 
							
								            host_info->host_task_h, msg, IOT_CLI_QUEUE_TIMER);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void iot_cli_ipc_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_ipc_client_t client;
							 | 
						||
| 
								 | 
							
								    /* register ipc to communicate with  */
							 | 
						||
| 
								 | 
							
								    client.addr.f_id = IOT_IPC_FID_ADA;
							 | 
						||
| 
								 | 
							
								    client.addr.c_id = IOT_IPC_CID_ADA_CLI;
							 | 
						||
| 
								 | 
							
								    client.recv = iot_cli_ipc_recv;
							 | 
						||
| 
								 | 
							
								    client.param = NULL;
							 | 
						||
| 
								 | 
							
								    host_config->ipc_h = iot_ipc_register_client(&client);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_cli_ada_dump_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_cli_ipc_init();
							 | 
						||
| 
								 | 
							
								    os_mem_set((uint8_t *)(&dump_info), 0, sizeof(dump_info));
							 | 
						||
| 
								 | 
							
								    dump_info.dump_timer = os_create_timer(IOT_CLI_MID, 1,
							 | 
						||
| 
								 | 
							
								        iot_cli_dump_timer, NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |