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
 |