Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

src/d7a_sys.cpp

Committer:
Jeej
Date:
2016-08-30
Revision:
44:8ebe6b70f932
Parent:
43:28202405094d
Parent:
40:b4df548bd9d8
Child:
49:81d5bddb02f0

File content as of revision 44:8ebe6b70f932:

#include "mbed.h"
#include "rtos.h"
#include "dbg.h"
#include "d7a_com.h"
#include "d7a_common.h"
#include "d7a_fs.h"
#include "d7a_sys.h"
#include "d7a.h"


typedef struct {
    Thread* thread;
    Queue<d7a_com_rx_msg_t, 16> pkt_queue;
    Queue<bool, 1> wait_pong;
} d7a_sys_ctx_t;

d7a_sys_ctx_t g_sys_ctx;

void d7a_sys_thread(const void *p);

void d7a_sys_open( void )
{
    FPRINT("\r\n");

    g_sys_ctx.thread = new Thread(d7a_sys_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
}

void d7a_sys_new_pkt(d7a_com_rx_msg_t* pkt)
{
    FPRINT("\r\n");
    ASSERT(g_sys_ctx.pkt_queue.put(pkt) == osOK, "SYS queue full!\r\n");
}

d7a_com_rx_msg_t* d7a_sys_wait_pkt( uint32_t millisec )
{
    FPRINT("\r\n");
    osEvent evt = g_sys_ctx.pkt_queue.get(millisec);
    return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
}

void d7a_sys_tlev(uint8_t mod, uint16_t lev)
{
    FPRINT("\r\n");
    uint8_t buf[3];
    
    buf[0] = mod;
    buf[1] = (uint8_t)(lev << 8);
    buf[2] = (uint8_t)(lev & 0x00FF);
    
    d7a_com_dump(buf, 3, KAL_COM_FLOW_SYS_TLEV);
}

bool d7a_sys_ping_modem(uint32_t millisec)
{
    FPRINT("\r\n");
    uint8_t buf[5] = "PING";
    
    d7a_com_dump(buf, 4, KAL_COM_FLOW_SYS_PING);
    
    osEvent evt = g_sys_ctx.wait_pong.get(millisec);
    
    return (evt.status == osEventMessage)? true: false;
}

void d7a_sys_software_reset(void)
{
    FPRINT("\r\n");
    uint8_t buf[4] = "RST";

    d7a_com_dump(buf, 3, KAL_COM_FLOW_SYS_RST);
}

void d7a_sys_button(uint8_t button)
{
    FPRINT("\r\n");
    button += '0';
    
    d7a_com_dump(&button, 1, KAL_COM_FLOW_SYS_BUTTON);
}

void d7a_sys_xack(void)
{
    uint8_t buf[] = "X";
    d7a_com_dump(buf, 1, KAL_COM_FLOW_SYS_XACK);
}

void d7a_sys_thread(const void *p)
{
    FPRINT("\r\n");
    d7a_com_rx_msg_t* pkt;
    
    while (true)
    {
        pkt = d7a_sys_wait_pkt();
        ASSERT(pkt != NULL, "SYS NULL pkt\r\n");

        switch(pkt->id)
        {
            case KAL_COM_FLOW_SYS_RST:
                IPRINT("KAL_COM_FLOW_SYS_RST\r\n");
                FLUSH();
                NVIC_SystemReset();
                break;
            case KAL_COM_FLOW_SYS_BUTTON:
                IPRINT("KAL_COM_FLOW_SYS_BUTTON\r\n");
                break;
            case KAL_COM_FLOW_SYS_INFO:
                IPRINT("KAL_COM_FLOW_SYS_INFO\r\n");
                break;
            case KAL_COM_FLOW_SYS_CUP:
                IPRINT("KAL_COM_FLOW_SYS_CUP\r\n");
                break;
            case KAL_COM_FLOW_SYS_PING:
                IPRINT("KAL_COM_FLOW_SYS_PING\r\n");
                uint8_t buf[5] = "PONG";
                d7a_com_dump(buf, 4, KAL_COM_FLOW_SYS_PONG);
                break;
            case KAL_COM_FLOW_SYS_PONG:
                //IPRINT("KAL_COM_FLOW_SYS_PONG\r\n");
                g_sys_ctx.wait_pong.put(NULL);
                break;
            case KAL_COM_FLOW_SYS_CFG:
                IPRINT("KAL_COM_FLOW_SYS_CFG\r\n");
                break;
            case KAL_COM_FLOW_SYS_TLEV:
                IPRINT("KAL_COM_FLOW_SYS_TLEV\r\n");
                break;
            case KAL_COM_FLOW_SYS_REDIR:
                IPRINT("KAL_COM_FLOW_SYS_REDIR\r\n");
                break;
            default:
                EPRINT("SYS Unknown Flow ID 0x%02X\r\n", pkt->id);
                break;
        }
        
        FREE(pkt);
    }
}