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