495 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			495 lines
		
	
	
		
			14 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.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "os_lock.h"
							 | 
						||
| 
								 | 
							
								#include "os_mem.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io_api.h"
							 | 
						||
| 
								 | 
							
								/*plc include*/
							 | 
						||
| 
								 | 
							
								#include "iot_errno.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								#include "iot_utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_dbglog.h"
							 | 
						||
| 
								 | 
							
								#include "iot_dbglog_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_string.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_log_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_dbglog_def.h"
							 | 
						||
| 
								 | 
							
								#include "iot_mtd.h"
							 | 
						||
| 
								 | 
							
								#include "flash.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_cli_type_definition.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM == HW_PLATFORM_SIMU
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DBGLOG_DEFAULT_LEVEL        DBGLOG_INFO_LVL_2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* HW_PLATFORM == HW_PLATFORM_SIMU */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DBGLOG_DEFAULT_LEVEL        DBGLOG_ERR
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* HW_PLATFORM == HW_PLATFORM_SIMU */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !IOT_DBGLOG_DEBUG_DISABLE
							 | 
						||
| 
								 | 
							
								static uint32_t upload_dbglog(dbglog_buf_context_t *logbuf);
							 | 
						||
| 
								 | 
							
								static void dbglog_add_argument(dbglog_buf_context_t *dbuf,
							 | 
						||
| 
								 | 
							
								    uint32_t index, uint32_t arg);
							 | 
						||
| 
								 | 
							
								static int32_t dbglog_buf_get_offset(dbglog_buf_context_t *logbuf,
							 | 
						||
| 
								 | 
							
								    uint32_t *write_offset, uint32_t len);
							 | 
						||
| 
								 | 
							
								/* static void manage_dbglog_buf(dbglog_buf_context_t *logbuf); */
							 | 
						||
| 
								 | 
							
								static void dbglog_add_string_argument(dbglog_buf_context_t *dbuf,
							 | 
						||
| 
								 | 
							
								    uint32_t index, uint8_t* arg);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								static uint32_t iot_get_time_offset();
							 | 
						||
| 
								 | 
							
								static void iot_dbglog_timer_routine(timer_id_t timerid, void* arg);
							 | 
						||
| 
								 | 
							
								static dbglog_info_t dbglogentry;
							 | 
						||
| 
								 | 
							
								static uint32_t timestamp_offset;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern module_group_config config_module[];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t iot_dbglog_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret = 0;
							 | 
						||
| 
								 | 
							
								    BUILD_BUG_ON(DBG_LOG_MINIMUM_LEVEL <= DBGLOG_DEFAULT_LEVEL);
							 | 
						||
| 
								 | 
							
								    dbglogentry.debuglog_lock = os_create_mutex(IOT_DBGLOG_MID);
							 | 
						||
| 
								 | 
							
								    if (dbglogentry.debuglog_lock == NULL) {
							 | 
						||
| 
								 | 
							
								        ret = ERR_NOMEM;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (uint16_t i = 0; i < MODULE_GROUP_NUM; i++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        dbglogentry.module_info[i].module_id = i;
							 | 
						||
| 
								 | 
							
								        dbglogentry.module_info[i].level = DBGLOG_DEFAULT_LEVEL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    DBGLOG_SET_DBUF_INFO(dbglogentry.debuglog, NULL, DBGLOG_MAX_BUFFER_SIZE, 0);
							 | 
						||
| 
								 | 
							
								    dbglogentry.seq = 0;
							 | 
						||
| 
								 | 
							
								    dbglogentry.timestamp_start = os_boot_time32();
							 | 
						||
| 
								 | 
							
								    dbglogentry.level = DBGLOG_DEFAULT_LEVEL;
							 | 
						||
| 
								 | 
							
								#if (HW_PLATFORM > HW_PLATFORM_SIMU && IOT_LOG_TO_FLASH_ENABLE)
							 | 
						||
| 
								 | 
							
								    dbglogentry.upload_interval = iot_log_get_save_freq()*60000;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    dbglogentry.upload_interval = DBGLOG_DEFAULT_UPLOAD_TIME_PERIOD;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    dbglogentry.upload_timer = os_create_timer(IOT_DBGLOG_MID, false,
							 | 
						||
| 
								 | 
							
								        iot_dbglog_timer_routine, NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_start_timer(dbglogentry.upload_timer, dbglogentry.upload_interval);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbglogentry.is_initialized = true;
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    if (dbglogentry.debuglog_lock)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        os_delete_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t iot_dbglog_deinit()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (dbglogentry.debuglog_lock)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        os_delete_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    dbglogentry.is_initialized = false;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t register_dbglog_callback(DBGLOG_DEBUG_LOG_EVENT_CB callback)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    dbglogentry.dbglog_send_debug_logs_cb = callback;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !IOT_DBGLOG_DEBUG_DISABLE
							 | 
						||
| 
								 | 
							
								#if IOT_FLASH_SIZE > 2
							 | 
						||
| 
								 | 
							
								int32_t iot_dbglog_input_ex(uint16_t mod_id,
							 | 
						||
| 
								 | 
							
								    uint8_t log_lvl, uint16_t msg_id, uint8_t arg_cnt, ...)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								int32_t iot_dbglog_input_ex(uint16_t mod_id,
							 | 
						||
| 
								 | 
							
								    uint16_t msg_id, uint8_t arg_cnt, ...)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (!dbglogentry.is_initialized) {
							 | 
						||
| 
								 | 
							
								        return ERR_INVAL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM != HW_PLATFORM_SIMU
							 | 
						||
| 
								 | 
							
								    if (mtd_get_flash_size() == FLASH_1M) {
							 | 
						||
| 
								 | 
							
								        /* disable flash log for 1M flash chip to avoid flash failure */
							 | 
						||
| 
								 | 
							
								        return ERR_INVAL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint32_t ret = 0, seq = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t payload_len;
							 | 
						||
| 
								 | 
							
								    va_list arg_list;
							 | 
						||
| 
								 | 
							
								    uint32_t record_length, write_offset;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_acquire_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								    dbglog_buf_context_t *logbuf = &dbglogentry.debuglog;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint32_t fw_version = 1;
							 | 
						||
| 
								 | 
							
								    uint8_t *arg = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if IOT_FLASH_SIZE > 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint8_t global_level = dbglogentry.level;
							 | 
						||
| 
								 | 
							
								    uint8_t module_level = DBGLOG_DEFAULT_LEVEL;
							 | 
						||
| 
								 | 
							
								    for (int i = 0; i < MODULE_GROUP_NUM; i++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ((mod_id >= config_module[i].group_start_module_id) &&
							 | 
						||
| 
								 | 
							
								            (mod_id <= config_module[i].group_end_module_id)) {
							 | 
						||
| 
								 | 
							
								            module_level = dbglogentry.module_info[i].level;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (log_lvl < module_level)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ret = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (log_lvl < global_level)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ret = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* IOT_FLASH_SIZE > 2 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if ((msg_id != RAW_DATA_MSG_ID) && (arg_cnt > DBGLOG_MAX_ARGUMENT_NUM))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ret = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    va_start(arg_list, arg_cnt);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /*Add argument in order
							 | 
						||
| 
								 | 
							
								    * timestamp offset: 4 Byte
							 | 
						||
| 
								 | 
							
								    * sequence_number(per module): 4 Byte
							 | 
						||
| 
								 | 
							
								    * module_id: 2 Byte
							 | 
						||
| 
								 | 
							
								    * Message ID: 2 Byte
							 | 
						||
| 
								 | 
							
								    * Payload Len: 2 Byte
							 | 
						||
| 
								 | 
							
								    * Resvd: 2 Byte
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* total record length is (4byte fw version) +
							 | 
						||
| 
								 | 
							
								    (4byte timestamp offset)+
							 | 
						||
| 
								 | 
							
								    (4byte sequence number) +
							 | 
						||
| 
								 | 
							
								    (4byte moduleid + messageid)+
							 | 
						||
| 
								 | 
							
								    (4byte payloadlen+reserved) + (arg *4) */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    record_length = 4 + 4 + 4 + 4 + 4 + arg_cnt * 4;
							 | 
						||
| 
								 | 
							
								    payload_len = arg_cnt * 4;
							 | 
						||
| 
								 | 
							
								    if (msg_id == RAW_DATA_MSG_ID)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								#if SUPPORT_RAW_DATA_LOG
							 | 
						||
| 
								 | 
							
								        arg = va_arg(arg_list, uint8_t*);
							 | 
						||
| 
								 | 
							
								        payload_len = arg_cnt;
							 | 
						||
| 
								 | 
							
								        if (payload_len > MAX_RAW_DATA_MSG_LEN)
							 | 
						||
| 
								 | 
							
								            payload_len = MAX_RAW_DATA_MSG_LEN;
							 | 
						||
| 
								 | 
							
								        //padding payload_len as multiple of 4
							 | 
						||
| 
								 | 
							
								        if (payload_len % 4) {
							 | 
						||
| 
								 | 
							
								            payload_len += (4 - payload_len % 4);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        record_length = 4 + 4 + 4 + 4 + 4 + payload_len;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								        //if not SUPPORT_RAW_DATA_LOG, RAW_DATA_MSG_ID will not be accepted
							 | 
						||
| 
								 | 
							
								        goto end_write;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (dbglog_buf_get_offset(logbuf, &write_offset, record_length))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ret = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (write_offset == 0)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        dbglog_add_argument(logbuf, write_offset, fw_version);
							 | 
						||
| 
								 | 
							
								        write_offset += 4;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        //decrease the offset for fw version
							 | 
						||
| 
								 | 
							
								        logbuf->write_offset -= 4;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    timestamp_offset = iot_get_time_offset();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbglog_add_argument(logbuf, write_offset, timestamp_offset);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    seq = DBGLOG_UPDATE_SEQ((&dbglogentry));
							 | 
						||
| 
								 | 
							
								    dbglog_add_argument(logbuf, write_offset, seq);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbglog_add_argument(logbuf, write_offset,
							 | 
						||
| 
								 | 
							
								        DBGLOG_SET_MSG_ID(mod_id, msg_id));
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbglog_add_argument(logbuf, write_offset,
							 | 
						||
| 
								 | 
							
								        DBGLOG_SET_MSG_HDR(payload_len, 0));
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								#if SUPPORT_RAW_DATA_LOG
							 | 
						||
| 
								 | 
							
								    if (msg_id == RAW_DATA_MSG_ID)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        dbglog_add_string_argument(logbuf, write_offset, arg);
							 | 
						||
| 
								 | 
							
								        goto end_write;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    for (uint32_t i = 0; i < arg_cnt; i++) {
							 | 
						||
| 
								 | 
							
								        dbglog_add_argument(logbuf, write_offset, va_arg(arg_list, uint32_t));
							 | 
						||
| 
								 | 
							
								        write_offset += 4;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								end_write:
							 | 
						||
| 
								 | 
							
								    va_end(arg_list);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    os_release_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_crash_dbglog_input(uint16_t mod_id, uint16_t msg_id, 
							 | 
						||
| 
								 | 
							
								    uint8_t* data, uint32_t datalen)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (!data || datalen == 0) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!dbglogentry.dbglog_send_debug_logs_cb) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    dbglog_buf_context_t *logbuf = &dbglogentry.debuglog;
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *buffer = logbuf->buffer;
							 | 
						||
| 
								 | 
							
								    uint8_t*tail = iot_pkt_data(buffer) + logbuf->write_offset;
							 | 
						||
| 
								 | 
							
								    if (logbuf->write_offset && buffer &&
							 | 
						||
| 
								 | 
							
								        (tail <= iot_pkt_block_ptr(buffer, IOT_PKT_BLOCK_END))) {
							 | 
						||
| 
								 | 
							
								        iot_pkt_set_tail(buffer, tail);
							 | 
						||
| 
								 | 
							
								        iot_pkt_push(buffer, sizeof(cli_msg_hdr_t)+ MAX_FRAME_CODE_LEN);
							 | 
						||
| 
								 | 
							
								        dbglogentry.dbglog_send_debug_logs_cb(iot_pkt_data(buffer), 1,
							 | 
						||
| 
								 | 
							
								            logbuf->write_offset);
							 | 
						||
| 
								 | 
							
								        logbuf->write_offset = 0;
							 | 
						||
| 
								 | 
							
								        logbuf->buffer = NULL;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (datalen % 4) {
							 | 
						||
| 
								 | 
							
								        datalen += (4 - datalen % 4);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    timestamp_offset = iot_get_time_offset();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    (void)msg_id;
							 | 
						||
| 
								 | 
							
								    uint32_t fw_version = 1;
							 | 
						||
| 
								 | 
							
								    uint32_t timestamp = timestamp_offset+1;
							 | 
						||
| 
								 | 
							
								    uint32_t seq = DBGLOG_UPDATE_SEQ((&dbglogentry));
							 | 
						||
| 
								 | 
							
								    uint32_t mod_msg = DBGLOG_SET_MSG_ID(mod_id, RAW_DATA_MSG_ID);
							 | 
						||
| 
								 | 
							
								    uint32_t payload_len = DBGLOG_SET_MSG_HDR(datalen, 0);
							 | 
						||
| 
								 | 
							
								    uint32_t write_offset = 0;
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(fw_version,
							 | 
						||
| 
								 | 
							
								        (uint8_t*)&data[MAX_FRAME_CODE_LEN + sizeof(cli_msg_hdr_t) + write_offset],
							 | 
						||
| 
								 | 
							
								        0);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(timestamp,
							 | 
						||
| 
								 | 
							
								        (uint8_t*)&data[MAX_FRAME_CODE_LEN + sizeof(cli_msg_hdr_t) + write_offset],
							 | 
						||
| 
								 | 
							
								        0);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(seq,
							 | 
						||
| 
								 | 
							
								        (uint8_t*)&data[MAX_FRAME_CODE_LEN + sizeof(cli_msg_hdr_t) + write_offset],
							 | 
						||
| 
								 | 
							
								        0);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(mod_msg,
							 | 
						||
| 
								 | 
							
								        (uint8_t*)&data[MAX_FRAME_CODE_LEN + sizeof(cli_msg_hdr_t) + write_offset],
							 | 
						||
| 
								 | 
							
								        0);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(payload_len,
							 | 
						||
| 
								 | 
							
								        (uint8_t*)&data[MAX_FRAME_CODE_LEN + sizeof(cli_msg_hdr_t) + write_offset],
							 | 
						||
| 
								 | 
							
								        0);
							 | 
						||
| 
								 | 
							
								    write_offset += 4;
							 | 
						||
| 
								 | 
							
								    write_offset += datalen;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dbglogentry.dbglog_send_debug_logs_cb(data, 1, write_offset);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !IOT_DBGLOG_DEBUG_DISABLE
							 | 
						||
| 
								 | 
							
								static void dbglog_add_string_argument(dbglog_buf_context_t *dbuf,
							 | 
						||
| 
								 | 
							
								    uint32_t index, uint8_t* arg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t * buffer;
							 | 
						||
| 
								 | 
							
								    buffer = iot_pkt_data(dbuf->buffer);
							 | 
						||
| 
								 | 
							
								    uint32_t arglen = iot_strlen((char*)arg);
							 | 
						||
| 
								 | 
							
								    if (arglen > MAX_RAW_DATA_MSG_LEN)
							 | 
						||
| 
								 | 
							
								        arglen = MAX_RAW_DATA_MSG_LEN;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (uint32_t i = 0; i < arglen; i++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        buffer[index + i] = arg[i];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								static void dbglog_add_argument(dbglog_buf_context_t *dbuf,
							 | 
						||
| 
								 | 
							
								    uint32_t index, uint32_t arg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t * buffer = iot_pkt_data(dbuf->buffer);
							 | 
						||
| 
								 | 
							
								    iot_uint32_to_bytes(arg, (uint8_t*)&buffer[index], 0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static int32_t malloc_dbglog_buf(dbglog_buf_context_t *dbuf)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    dbuf->buffer = iot_pkt_alloc(DBGLOG_MAX_RAW_BUFFER_SIZE, IOT_DBGLOG_MID);
							 | 
						||
| 
								 | 
							
								    if (!dbuf->buffer) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s no pkt with len %d\n", __FUNCTION__, \
							 | 
						||
| 
								 | 
							
								            DBGLOG_MAX_RAW_BUFFER_SIZE);
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_pkt_reserve(dbuf->buffer, MAX_CLI_FRAME_HEAD + sizeof(cli_msg_hdr_t));
							 | 
						||
| 
								 | 
							
								    dbuf->write_offset = 0;
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static int32_t dbglog_buf_get_offset(
							 | 
						||
| 
								 | 
							
								    dbglog_buf_context_t *logbuf, uint32_t *write_offset, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    dbglog_buf_context_t *dbuf = logbuf;
							 | 
						||
| 
								 | 
							
								    if (DEBUGLOG_BUFFER_IS_EMPTY(dbuf))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (malloc_dbglog_buf(dbuf) != 0) {
							 | 
						||
| 
								 | 
							
								            return -1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (DBGLOG_BUFFER_SPACE_AVAILABLE(dbuf, len / 4))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        *write_offset = dbuf->write_offset;
							 | 
						||
| 
								 | 
							
								        dbuf->write_offset += len;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        upload_dbglog(dbuf);
							 | 
						||
| 
								 | 
							
								        if (malloc_dbglog_buf(dbuf) != 0) {
							 | 
						||
| 
								 | 
							
								            return -1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        *write_offset = dbuf->write_offset;
							 | 
						||
| 
								 | 
							
								        dbuf->write_offset += len;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint32_t iot_get_time_offset()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t now = os_boot_time32();
							 | 
						||
| 
								 | 
							
								    uint32_t start = dbglogentry.timestamp_start;
							 | 
						||
| 
								 | 
							
								    uint32_t offset = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (now >= start)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        offset = now - start;
							 | 
						||
| 
								 | 
							
								    } else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        offset = ((uint32_t)(-1) - (start - now));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return offset;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_dbglog_config_module_level(uint16_t module_id, uint8_t level)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if ((level >= DBGLOG_VERBOSE) && (level <= DBGLOG_LVL_MAX)) {
							 | 
						||
| 
								 | 
							
								        if (module_id < MODULE_GROUP_NUM) {
							 | 
						||
| 
								 | 
							
								            dbglogentry.module_info[module_id].level = level;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_dbglog_config_level(uint8_t level)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if ((level >= DBGLOG_VERBOSE) && (level <= DBGLOG_LVL_MAX)) {
							 | 
						||
| 
								 | 
							
								        dbglogentry.level = level;
							 | 
						||
| 
								 | 
							
								        iot_printf("set level as:%d\n", level);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t iot_dbglog_get_level()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t level = dbglogentry.level;
							 | 
						||
| 
								 | 
							
								    iot_printf("get level as:%d\n", level);
							 | 
						||
| 
								 | 
							
								    return dbglogentry.level;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t iot_dbglog_get_module_level(uint16_t module_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t level = 0;
							 | 
						||
| 
								 | 
							
								    if (module_id < MODULE_GROUP_NUM) {
							 | 
						||
| 
								 | 
							
								        level = dbglogentry.module_info[module_id].level;
							 | 
						||
| 
								 | 
							
								        iot_printf("get module %d level as:%d\n", module_id, level);
							 | 
						||
| 
								 | 
							
								        return level;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return DBGLOG_DEFAULT_LEVEL;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_dbglog_start_stop_live_capture(uint8_t enable, uint8_t* log_receiver)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    dbglogentry.live_capture = enable;
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(dbglogentry.live_log_receiver, log_receiver, IOT_MAC_ADDR_LEN);
							 | 
						||
| 
								 | 
							
								    iot_printf("start_stop live capture:%d, receiver:%s\n", enable, log_receiver);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t iot_dbglog_live_capture_enabled()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return dbglogentry.live_capture;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t *iot_dbglog_live_log_receiver()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return dbglogentry.live_log_receiver;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint32_t upload_dbglog(dbglog_buf_context_t *logbuf)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *buffer = logbuf->buffer;
							 | 
						||
| 
								 | 
							
								    if (dbglogentry.dbglog_send_debug_logs_cb && logbuf->write_offset)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (iot_pkt_set_tail(buffer, iot_pkt_data(buffer)
							 | 
						||
| 
								 | 
							
								            + logbuf->write_offset) == NULL) {
							 | 
						||
| 
								 | 
							
								            IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								            return 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        logbuf->write_offset = 0;
							 | 
						||
| 
								 | 
							
								        logbuf->buffer = NULL;
							 | 
						||
| 
								 | 
							
								        dbglogentry.dbglog_send_debug_logs_cb(buffer, 0, 0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    os_start_timer(dbglogentry.upload_timer, dbglogentry.upload_interval);
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								dbglog_info_t *get_dbglog_instance()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return &dbglogentry;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void iot_dbglog_timer_routine(timer_id_t timerid, void* arg)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)timerid;
							 | 
						||
| 
								 | 
							
								    (void)arg;
							 | 
						||
| 
								 | 
							
								    os_acquire_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								    upload_dbglog(&dbglogentry.debuglog);    
							 | 
						||
| 
								 | 
							
								    os_release_mutex(dbglogentry.debuglog_lock);
							 | 
						||
| 
								 | 
							
								}
							 |