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);
|
|
}
|
|
}
|