summaryrefslogtreecommitdiff
path: root/examples/log_trace/memlog.c
blob: a94e77fe7ee3739b3c42702f751300768fb31e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <rtthread.h>
#include <rtdevice.h>
#include <log_trace.h>

#define PIPE_SZ    2048
#define PIPE_NAME  "lgpipe"

static rt_uint8_t pipebuf[PIPE_SZ];
static struct rt_pipe_device pipedev;

static rt_uint8_t outbuf[1024];
void memlog_flush(void)
{
    rt_size_t remainsz, readsz;
    rt_device_t console;

    console = rt_console_get_device();

    if (!console)
        return;

    rt_device_control((rt_device_t)&pipedev, PIPE_CTRL_GET_SPACE, &remainsz);
    if (remainsz == 0)
    {
        rt_kprintf("logtrace pipe "PIPE_NAME" is full, some log may lost\n");
    }

    readsz = rt_device_read((rt_device_t)&pipedev, 0, outbuf, sizeof(outbuf));
    if (readsz)
        rt_device_write(console, 0, outbuf, readsz);
}

void memlog_init(void)
{
    rt_err_t res;

    /* make sure the RT_PIPE_FLAG_BLOCK_RD is not set. The Idle should not be
     * blocked. RT_PIPE_FLAG_FORCE_WR will let the pipe discard some old data
     * when pipe is full. */
    res = rt_pipe_init(&pipedev, PIPE_NAME, RT_PIPE_FLAG_FORCE_WR,
                       pipebuf, sizeof(pipebuf));
    if (res != RT_EOK)
    {
        rt_kprintf("init pipe device failed: %d\n", res);
        return;
    }

    log_trace_set_device(PIPE_NAME);

    rt_thread_idle_sethook(memlog_flush);
}