Thread UART
Dependencies: fsl_phy_mcr20a fsl_smac mbed-rtos mbed
Fork of mcr20_wireless_uart by
Diff: main.cpp
- Revision:
- 27:1eb29717bfd9
- Parent:
- 26:56ca40dcfae1
- Child:
- 29:104ca2835945
diff -r 56ca40dcfae1 -r 1eb29717bfd9 main.cpp --- a/main.cpp Tue Jun 23 11:49:16 2015 +0000 +++ b/main.cpp Mon Jun 29 05:50:47 2015 +0000 @@ -1,11 +1,35 @@ #include "mbed.h" #include "rtos.h" -#include "MemManager.h" #include "Phy.h" #include "SMAC_Interface.h" #include "SMAC_Config.h" +#include "MemManager.h" +#include "circular_buffer.h" +char * const cu8FreescaleLogo[]={ + "\f\r\n", + "\n\r\n\r\n\r #\n", + "\r ###\n", + "\r ### *\n", + "\r # ***\n", + "\r *** #\n", + "\r * ###\n", + "\r ###\n", + "\r * #\n", + "\r ***\n", + "\r *** #\n", + "\r # * ###\n", + "\r ### ###\n", + "\r ### * # F R E E S C A L E\n", + "\r # ***\n", + "\r *** S E M I C O N D U C T O R\n", + "\r # *\n", + "\r ### 2 0 1 5\n", + "\r ###\n", + "\r # Wireless Uart Demo\r\n\n", + NULL +}; #define gMcps_Cnf_EVENT_c (1<<1) #define gMcps_Ind_EVENT_c (1<<2) @@ -14,6 +38,11 @@ #define gMlme_TimeoutInd_EVENT_c (1<<5) #define gWUSelf_EVENT_c (1<<6) +#define gDefaultBaudRate_UART_c 115200UL + +Serial uart(USBTX, USBRX); +CircularBuffer uartBuf; + #ifdef VERBOSE static bool_t bCCAFailed; static bool_t bACKFailed; @@ -24,18 +53,34 @@ rxPacket_t *gAppRxPacket; static txContextConfig_t txConfigContext; + +void PrintMenu(char * const pu8Menu[]) +{ + uint8_t u8Index = 0; + while(pu8Menu[u8Index]){ + uart.printf(pu8Menu[u8Index]); + u8Index++; + } +} + + void InitProject(void); void InitApp(void); extern smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance); extern smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance); -DigitalOut led1(LED1); +DigitalOut led1(LED_GREEN); InterruptIn sw2(SW2); uint32_t button_pressed; Thread *thread2; Thread *eventsThread; +void uartSetBaudRate(uint32_t b) +{ + uart.baud(b); +} + void sw2_press(void) { thread2->signal_set(0x1); @@ -45,7 +90,7 @@ { while (true) { led1 = !led1; - Thread::wait(1000); + Thread::wait(200); } } @@ -59,19 +104,17 @@ void events_thread(void const *argument) { - uint8_t rcvd = 0; + uint8_t rcvd = 0, c = 0; while (true) { Thread::signal_wait(0x1); - if(gMcps_Cnf_EVENT_c == (gTaskEventFlags & gMcps_Cnf_EVENT_c)) { //get back in RX MLMERXEnableRequest(gAppRxPacket, 0); + //uart.printf("McpsDataCnf: Packet sent\r\n"); - //printf("McpsDataCnf: Packet sent\r\n"); - //fflush(stdout); } if(gMcps_Ind_EVENT_c == (gTaskEventFlags & gMcps_Ind_EVENT_c)) @@ -81,35 +124,38 @@ //get back in RX //gAppRxPacket = (rxPacket_t*)MEM_BufferAlloc(gMaxSmacSDULength_c + sizeof(rxPacket_t)); //gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + uart.printf("%c", rcvd); MLMERXEnableRequest(gAppRxPacket, 0); - printf("McpsDataInd: Received %d\r\n", rcvd); - fflush(stdout); + } if(gMlme_TimeoutInd_EVENT_c == (gTaskEventFlags & gMlme_TimeoutInd_EVENT_c)) { - printf("MlmeTimeoutInd: \r\n"); - fflush(stdout); + uart.printf("MlmeTimeoutInd: \r\n"); } if(gMlme_EdCnf_EVENT_c == (gTaskEventFlags & gMlme_EdCnf_EVENT_c)) { - printf("EdCnf: \r\n"); - fflush(stdout); + uart.printf("EdCnf: \r\n"); } if(gMlme_CcaCnf_EVENT_c == (gTaskEventFlags & gMlme_CcaCnf_EVENT_c)) { - printf("CcaCnf: \r\n"); - fflush(stdout); + uart.printf("CcaCnf: \r\n"); } if(gWUSelf_EVENT_c == (gTaskEventFlags & gWUSelf_EVENT_c)) { - + if (buffer_Ok_c == uartBuf.getFromBuffer(&c)) + { + gAppTxPacket->smacPdu.smacPdu[0] = c; + gAppTxPacket->u8DataLength = 1; + (void)MLMERXDisableRequest(); + (void)MCPSDataRequest(gAppTxPacket); + } } - + gTaskEventFlags = 0; } } @@ -120,28 +166,32 @@ Thread thread(led_thread); thread2 = new Thread(button_thread); eventsThread = new Thread(events_thread); - Phy_Init(); InitSmac(); - + + uartSetBaudRate(gDefaultBaudRate_UART_c); + //Tell SMAC who to call when it needs to pass a message to the application thread. Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0); InitApp(); + + PrintMenu(cu8FreescaleLogo); button_pressed = 0; sw2.fall(&sw2_press); - while (true) { - Thread::wait(5000); - - gAppTxPacket->smacPdu.smacPdu[0] = (uint8_t)button_pressed; - gAppTxPacket->u8DataLength = 1; - (void)MLMERXDisableRequest(); - (void)MCPSDataRequest(gAppTxPacket); - - printf("SW2 was pressed (last 5 seconds): %d \r\n", button_pressed); - fflush(stdout); - button_pressed = 0; + while (true) + { + if(uart.readable()) + { + (void)uartBuf.addToBuffer(uart.getc()); + } + if ( uartBuf.getCount() ) + { + gTaskEventFlags |= gWUSelf_EVENT_c; + eventsThread->signal_set(0x1); + } + Thread::yield(); } } @@ -217,7 +267,6 @@ default: break; } - eventsThread->signal_set(0x1); MEM_BufferFree(pMsg);