Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers d7a_sys.cpp Source File

d7a_sys.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "dbg.h"
00004 #include "d7a_com.h"
00005 #include "d7a_common.h"
00006 #include "d7a_fs.h"
00007 #include "d7a_sys.h"
00008 #include "d7a.h"
00009 #include "d7a_typedefs.h"
00010 
00011 #if 0
00012     #define SYS_DPRINT(...)         DPRINT(__VA_ARGS__)
00013     #define SYS_DPRINT_DATA(...)    DPRINT_DATA(__VA_ARGS__)
00014     #define SYS_FPRINT(...)         FPRINT(__VA_ARGS__)
00015 #else
00016     #define SYS_DPRINT(...);
00017     #define SYS_DPRINT_DATA(...);
00018     #define SYS_FPRINT(...);
00019 #endif
00020 
00021 static OS_Thread                         g_sys_thread(osPriorityHigh, 512, NULL);
00022 static OS_Queue<d7a_com_rx_msg_t, 8>   g_sys_pkt_queue;
00023 static OS_Queue<bool, 1>               g_sys_wait_pong;
00024 
00025 void d7a_sys_thread();
00026 
00027 d7a_errors_t d7a_sys_open(void)
00028 {
00029     SYS_FPRINT("\r\n");
00030     
00031     osStatus err = g_sys_thread.start(d7a_sys_thread);
00032     ASSERT(err == osOK, "Failed to start d7a_sys_thread (err: %d)\r\n", err);
00033     
00034     return D7A_ERR_NONE;
00035 }
00036 
00037 d7a_errors_t d7a_sys_close(void)
00038 {
00039     SYS_FPRINT("\r\n");
00040 
00041     g_sys_thread.terminate();
00042     
00043     return D7A_ERR_NONE;
00044 }
00045 
00046 void d7a_sys_new_pkt(d7a_com_rx_msg_t* pkt)
00047 {
00048     SYS_FPRINT("\r\n");
00049     ASSERT(g_sys_pkt_queue.put(pkt) == osOK, "SYS queue full!\r\n");
00050 }
00051 
00052 d7a_com_rx_msg_t* d7a_sys_wait_pkt( uint32_t millisec )
00053 {
00054     SYS_FPRINT("\r\n");
00055     osEvent evt = g_sys_pkt_queue.get(millisec);
00056     return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
00057 }
00058 
00059 void d7a_sys_tlev(uint8_t mod, uint16_t lev)
00060 {
00061     SYS_FPRINT("\r\n");
00062     uint8_t buf[3];
00063     
00064     buf[0] = mod;
00065     buf[1] = (uint8_t)(lev << 8);
00066     buf[2] = (uint8_t)(lev & 0x00FF);
00067     
00068     d7a_com_dump(buf, 3, KAL_COM_FLOW_SYS_TLEV);
00069 }
00070 
00071 bool d7a_sys_ping_modem(uint32_t millisec)
00072 {
00073     SYS_FPRINT("\r\n");
00074     uint8_t buf[5] = "PING";
00075     
00076     d7a_com_dump(buf, 4, KAL_COM_FLOW_SYS_PING);
00077     
00078     osEvent evt = g_sys_wait_pong.get(millisec);
00079     
00080     return (evt.status == osEventMessage)? true: false;
00081 }
00082 
00083 void d7a_sys_software_reset(void)
00084 {
00085     SYS_FPRINT("\r\n");
00086     uint8_t buf[4] = "RST";
00087 
00088     d7a_com_dump(buf, 3, KAL_COM_FLOW_SYS_RST);
00089 }
00090 
00091 void d7a_sys_button(uint8_t button)
00092 {
00093     SYS_FPRINT("\r\n");
00094     button += '0';
00095     
00096     d7a_com_dump(&button, 1, KAL_COM_FLOW_SYS_BUTTON);
00097 }
00098 
00099 void d7a_sys_xack(void)
00100 {
00101     uint8_t buf[] = "X";
00102     d7a_com_dump(buf, 1, KAL_COM_FLOW_SYS_XACK);
00103 }
00104 
00105 void d7a_sys_thread()
00106 {
00107     SYS_FPRINT("(id:0x%08x)\r\n", osThreadGetId());
00108     d7a_com_rx_msg_t* pkt;
00109     
00110     while (true)
00111     {
00112         pkt = d7a_sys_wait_pkt();
00113         ASSERT(pkt != NULL, "SYS NULL pkt\r\n");
00114 
00115         switch(pkt->id)
00116         {
00117             case KAL_COM_FLOW_SYS_RST:
00118                 SYS_DPRINT("KAL_COM_FLOW_SYS_RST\r\n");
00119                 FLUSH();
00120                 NVIC_SystemReset();
00121                 break;
00122             case KAL_COM_FLOW_SYS_BUTTON:
00123                 SYS_DPRINT("KAL_COM_FLOW_SYS_BUTTON\r\n");
00124                 break;
00125             case KAL_COM_FLOW_SYS_INFO:
00126                 SYS_DPRINT("KAL_COM_FLOW_SYS_INFO\r\n");
00127                 break;
00128             case KAL_COM_FLOW_SYS_CUP:
00129                 SYS_DPRINT("KAL_COM_FLOW_SYS_CUP\r\n");
00130                 break;
00131             case KAL_COM_FLOW_SYS_PING:
00132                 SYS_DPRINT("KAL_COM_FLOW_SYS_PING\r\n");
00133                 uint8_t buf[5] = "PONG";
00134                 d7a_com_dump(buf, 4, KAL_COM_FLOW_SYS_PONG);
00135                 break;
00136             case KAL_COM_FLOW_SYS_PONG:
00137                 SYS_DPRINT("KAL_COM_FLOW_SYS_PONG\r\n");
00138                 g_sys_wait_pong.put(NULL);
00139                 break;
00140             case KAL_COM_FLOW_SYS_CFG:
00141                 SYS_DPRINT("KAL_COM_FLOW_SYS_CFG\r\n");
00142                 break;
00143             case KAL_COM_FLOW_SYS_TLEV:
00144                 SYS_DPRINT("KAL_COM_FLOW_SYS_TLEV\r\n");
00145                 break;
00146             case KAL_COM_FLOW_SYS_REDIR:
00147                 SYS_DPRINT("KAL_COM_FLOW_SYS_REDIR\r\n");
00148                 break;
00149             default:
00150                 EPRINT("SYS Unknown Flow ID 0x%02X\r\n", pkt->id);
00151                 break;
00152         }
00153         
00154         FREE(pkt);
00155     }
00156 }