229 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
		
			6.6 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_tx_rx.h"
 | |
| #include "iot_cli_host_interface.h"
 | |
| #include "iot_cli_dbg_log.h"
 | |
| #include "iot_cli_flash_log.h"
 | |
| #include "iot_cli_ckb.h"
 | |
| 
 | |
| extern module_group_config config_module[MODULE_GROUP_NUM];
 | |
| extern iot_cli_host_info_t *host_info;
 | |
| extern iot_cli_t cli;
 | |
| 
 | |
| CLI_REGULAR_LOG cli_regular_log_list[4] = { 0 };
 | |
| 
 | |
| void cli_config_dbglog_level(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)src_mac;
 | |
| 
 | |
|     cli_host_set_dbglog_level *level =
 | |
|         (cli_host_set_dbglog_level *)buffer;
 | |
|     cli_host_set_dbglog_level_ack ack;
 | |
| 
 | |
|     if ((!level) || (bufferlen < sizeof(*level))) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     iot_dbglog_config_level(level->general_level);
 | |
| 
 | |
|     for (uint16_t i = 0; i < level->group_cnt; i++)
 | |
|     {
 | |
|         iot_dbglog_config_module_level(
 | |
|             level->module_level[i].module_id,
 | |
|             level->module_level[i].level);
 | |
|     }
 | |
| 
 | |
|     iot_dbglog_start_stop_live_capture(1, src_mac);
 | |
| 
 | |
|     ack.result = 0;
 | |
|     iot_cli_send_to_host(CLI_MSGID_SET_DEBUG_LOG_LEVEL_ACK,
 | |
|         (uint8_t*)&ack, sizeof(ack), src_mac);
 | |
| }
 | |
| 
 | |
| void cli_get_dbglog_level(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)src_mac;
 | |
|     (void)buffer;
 | |
|     (void)bufferlen;
 | |
| 
 | |
|     cli_host_dbglog_level dbglog_level;
 | |
|     dbglog_level.level = iot_dbglog_get_level();
 | |
|     dbglog_level.max_level = DBGLOG_LVL_MAX;
 | |
| 
 | |
|     dbglog_level.group_cnt = MODULE_GROUP_NUM;
 | |
|     for (uint16_t i = 0; i < MODULE_GROUP_NUM; i++)
 | |
|     {
 | |
|         os_mem_cpy(
 | |
|             dbglog_level.module[i].group_name,
 | |
|             config_module[i].group_name,
 | |
|             DBGLOG_MODULE_GROUP_NAME_LEN);
 | |
|         dbglog_level.module[i].module_id = i;
 | |
|         dbglog_level.module[i].level = iot_dbglog_get_module_level(i);
 | |
|     }
 | |
|     add_addr_to_mapping_table(src_mac);
 | |
|     iot_cli_send_to_host(CLI_MSGID_GET_DBGLOG_LEVEL_RESP,
 | |
|         (uint8_t*)&dbglog_level, sizeof(dbglog_level), src_mac);
 | |
| }
 | |
| 
 | |
| void cli_start_stop_dbglog_live_capture(
 | |
|     uint8_t *buffer, uint32_t bufferlen, uint8_t *src_mac)
 | |
| {
 | |
|     (void)src_mac;
 | |
| 
 | |
|     cli_host_enable_dbglog *enable =
 | |
|         (cli_host_enable_dbglog *)buffer;
 | |
|     cli_host_enable_dbglog_ack ack;
 | |
| 
 | |
|     if ((!enable) || (bufferlen < sizeof(*enable))) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     iot_printf("start live log (%d)\n", enable->enabled);
 | |
| 
 | |
|     iot_dbglog_start_stop_live_capture(enable->enabled, src_mac);
 | |
| 
 | |
|     ack.result = 0;
 | |
|     add_addr_to_mapping_table(src_mac);
 | |
|     iot_cli_send_to_host(CLI_MSGID_START_STOP_LIVE_LOG_CAPTURE_ACK,
 | |
|         (uint8_t*)&ack, sizeof(ack), src_mac);
 | |
| }
 | |
| 
 | |
| void cli_send_live_log_to_plc(
 | |
|     uint8_t *buffer, uint32_t bufferlen)
 | |
| {
 | |
|     uint8_t* receiver = iot_dbglog_live_log_receiver();
 | |
|     if (receiver != NULL) {
 | |
|         iot_cli_send_to_host(
 | |
|             CLI_MSGID_SEND_LIVE_LOG,
 | |
|             buffer, bufferlen, receiver);
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void iot_cli_log_timer_func(timer_id_t timer_id, void *arg)
 | |
| {
 | |
|     (void)arg;
 | |
|     (void)timer_id;
 | |
|     iot_task_msg_t *t_msg;
 | |
| 
 | |
|     t_msg = iot_cli_create_cli_msg(IOT_CLI_LOG_TIMER, NULL);
 | |
|     if (t_msg) {
 | |
|         iot_task_queue_msg(host_info->host_task_h,
 | |
|             t_msg, IOT_CLI_QUEUE_TIMER);
 | |
|     }
 | |
| }
 | |
| 
 | |
| void iot_cli_dbg_log_init()
 | |
| {
 | |
| #if (HW_PLATFORM != HW_PLATFORM_SIMU)
 | |
|     host_info->log_timer = os_create_timer(IOT_CLI_MID, 1,
 | |
|         iot_cli_log_timer_func, NULL);
 | |
|     if (host_info->log_timer) {
 | |
|         os_start_timer(host_info->log_timer, CLI_LOG_TIMER_PERIOD);
 | |
|     }
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void iot_cli_handle_timer_log()
 | |
| {
 | |
|     iot_printf("iot_cli_log_timer_func\n");
 | |
|     for (int i = 0; i < (sizeof(cli_regular_log_list) /
 | |
|         sizeof(cli_regular_log_list[0])); i++) {
 | |
|         if (cli_regular_log_list[i] != NULL) {
 | |
|             cli_regular_log_list[i]();
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| void register_regular_log(CLI_REGULAR_LOG cb)
 | |
| {
 | |
|     for (int i = 0; i < (sizeof(cli_regular_log_list) /
 | |
|         sizeof(cli_regular_log_list[0])); i++) {
 | |
|         if (cli_regular_log_list[i] == cb) {
 | |
|             return;
 | |
|         } else if (cli_regular_log_list[i] == NULL) {
 | |
|             cli_regular_log_list[i] = cb;
 | |
|             return;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| static void send_crash_dbglog(uint8_t* data, uint32_t datalen)
 | |
| {
 | |
|     uint32_t write_offset = add_flashlog_tag_preamble(data);
 | |
|     cli_msg_hdr_t *msg = (cli_msg_hdr_t *)(data + write_offset);
 | |
|     msg->module_id = CLI_MODULEID_DEBUGLOG;
 | |
|     msg->msg_id = CLI_MSGID_DEBUG_LOG_REPORT;
 | |
|     msg->msg_len = (uint16_t)datalen;
 | |
|     iot_mac_addr_cpy(msg->src_mac, host_info->mac_addr);
 | |
|     write_offset += sizeof(cli_msg_hdr_t);
 | |
|     write_offset += datalen;
 | |
|     write_offset += add_flashlog_tag_backcode(data + write_offset);
 | |
|     write_log_nolock(data, write_offset);
 | |
| }
 | |
| 
 | |
| void send_live_dbglog(iot_pkt_t* data)
 | |
| {
 | |
|     uint32_t datalen = iot_pkt_data_len(data);
 | |
| 
 | |
|     uint8_t* clihdr = iot_pkt_push(data, sizeof(cli_msg_hdr_t));
 | |
|     if (clihdr) {
 | |
|         cli_msg_hdr_t *msg = (cli_msg_hdr_t *)clihdr;
 | |
|         msg->module_id = CLI_MODULEID_DEBUGLOG;
 | |
|         msg->msg_id = CLI_MSGID_DEBUG_LOG_REPORT;
 | |
|         msg->msg_len = (uint16_t)datalen;
 | |
|         iot_mac_addr_cpy(msg->src_mac, host_info->mac_addr);
 | |
|     }
 | |
|     if (iot_dbglog_live_capture_enabled()) {
 | |
|         uint32_t len = add_flashlog_tag(data);
 | |
|         cli_send_live_log_to_plc(iot_pkt_data(data), len);
 | |
|         iot_pkt_free(data);
 | |
|         return;
 | |
|     }
 | |
| #if IOT_LOG_TO_FLASH_ENABLE
 | |
|     if (cli.need_download_cli_to_flash) {
 | |
|         download_log_to_flash(data);
 | |
|     }
 | |
|     else {
 | |
|         send_tx_msg_to_cli_task(data);
 | |
|     }
 | |
| #else
 | |
|     send_tx_msg_to_cli_task(data);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void cli_send_dbglog(void* buffer, uint8_t crash_log, uint32_t buffer_len)
 | |
| {
 | |
|     if (buffer == NULL) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (crash_log == 0) {
 | |
|         iot_pkt_t* data = (iot_pkt_t*)buffer;
 | |
|         send_live_dbglog(data);
 | |
|     }
 | |
|     else {
 | |
|         uint8_t* data = (uint8_t*)buffer;
 | |
|         if (buffer_len == 0) {
 | |
|             return;
 | |
|         }
 | |
|         send_crash_dbglog(data, buffer_len);
 | |
|     }
 | |
| }
 |