Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

src/d7a_sys.cpp

Committer:
Jeej
Date:
2016-05-03
Revision:
29:8e7c5c1e9aab
Parent:
28:0376b97b4b55
Child:
30:d775c1409849

File content as of revision 29:8e7c5c1e9aab:

#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"


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, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
}

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");
    d7a_com_tx_msg_t msg;
    uint8_t buf[3];
    buf[0] = mod;
    buf[1] = (uint8_t)(lev << 8);
    buf[2] = (uint8_t)(lev & 0x00FF);
    msg.id = KAL_COM_FLOW_SYS_TLEV;
    msg.pbuf = buf;
    msg.plen = 3;
    msg.alen = 0;
    d7a_com_send_msg(&msg);
}

bool d7a_sys_ping_modem(void)
{
    FPRINT("\r\n");
    d7a_com_tx_msg_t msg;
    uint8_t buf[5] = "PING";
    msg.id = KAL_COM_FLOW_SYS_PING;
    msg.pbuf = buf;
    msg.plen = 4;
    msg.alen = 0;
    d7a_com_send_msg(&msg);
    
    osEvent evt = g_sys_ctx.wait_pong.get(100);
    
    return (evt.status == osEventMessage)? true: false;
}
    

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:
                DPRINT("KAL_COM_FLOW_SYS_RST\r\n");
                FLUSH();
                NVIC_SystemReset();
                break;
            case KAL_COM_FLOW_SYS_BUTTON:
                DPRINT("KAL_COM_FLOW_SYS_BUTTON\r\n");
                break;
            case KAL_COM_FLOW_SYS_INFO:
                DPRINT("KAL_COM_FLOW_SYS_INFO\r\n");
                break;
            case KAL_COM_FLOW_SYS_CUP:
                DPRINT("KAL_COM_FLOW_SYS_CUP\r\n");
                break;
            case KAL_COM_FLOW_SYS_PING:
                DPRINT("KAL_COM_FLOW_SYS_PING\r\n");
                d7a_com_tx_msg_t msg;
                uint8_t buf[5] = "PONG";
                msg.id = KAL_COM_FLOW_SYS_PONG;
                msg.pbuf = buf;
                msg.plen = 4;
                msg.alen = 0;
                d7a_com_send_msg(&msg);
                break;
            case KAL_COM_FLOW_SYS_PONG:
                DPRINT("KAL_COM_FLOW_SYS_PONG\r\n");
                g_sys_ctx.wait_pong.put(NULL);
                break;
            case KAL_COM_FLOW_SYS_CFG:
                DPRINT("KAL_COM_FLOW_SYS_CFG\r\n");
                break;
            case KAL_COM_FLOW_SYS_TLEV:
                DPRINT("KAL_COM_FLOW_SYS_TLEV\r\n");
                break;
            case KAL_COM_FLOW_SYS_REDIR:
                DPRINT("KAL_COM_FLOW_SYS_REDIR\r\n");
                break;
            default:
                EPRINT("SYS Unknown Flow ID 0x%02X\r\n", pkt->id);
                break;
        }
        
        FREE(pkt);
    }
}