ban4jp - / SNICInterface_PullReq

Dependents:   SNIC-httpclient-example SNIC-ntpclient-example

Fork of SNICInterface by muRata

Committer:
kishino
Date:
Fri Mar 14 08:48:12 2014 +0000
Revision:
7:e88ccbe0225f
Parent:
6:70f522934032
Scan handler interface modify

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kishino 0:61c402886fbb 1 #include "mbed.h"
kishino 0:61c402886fbb 2 #include "YDwifi.h"
kishino 0:61c402886fbb 3 #include "YDwifi_uartmsg.h"
kishino 0:61c402886fbb 4 #include <string>
kishino 0:61c402886fbb 5 //#include <algorithm>
kishino 0:61c402886fbb 6
kishino 2:0ba43344c814 7 using namespace murata_wifi;
kishino 2:0ba43344c814 8
kishino 2:0ba43344c814 9 #define UART_RECVBUF_SIZE 2048
kishino 2:0ba43344c814 10 typedef struct
kishino 2:0ba43344c814 11 {
kishino 2:0ba43344c814 12 unsigned char buf[UART_RECVBUF_SIZE];
kishino 2:0ba43344c814 13 unsigned int size;
kishino 2:0ba43344c814 14 bool is_receive;
kishino 2:0ba43344c814 15 }tagUART_RECVBUF_T;
kishino 2:0ba43344c814 16 tagUART_RECVBUF_T gUART_RCVBUF;
kishino 3:9f90024d7fb2 17 unsigned char gUART_TEMP_BUF[UART_RECVBUF_SIZE];
kishino 2:0ba43344c814 18
kishino 0:61c402886fbb 19 C_YDwifi *C_YDwifi::mInstance_p;
kishino 0:61c402886fbb 20
kishino 0:61c402886fbb 21 C_YDwifi::C_YDwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
kishino 6:70f522934032 22 mUart(tx, rx)
kishino 0:61c402886fbb 23 {
kishino 0:61c402886fbb 24 mUartRecvThread_p = NULL;
kishino 0:61c402886fbb 25 mInstance_p = this;
kishino 0:61c402886fbb 26 mUartRequestSeq = 0;
kishino 0:61c402886fbb 27
kishino 2:0ba43344c814 28 // Initialize uart
kishino 2:0ba43344c814 29 gUART_RCVBUF.is_receive = false;
kishino 2:0ba43344c814 30 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 31 mUart.baud( 115200 );
kishino 2:0ba43344c814 32 mUart.format(8, SerialBase::None, 1);
kishino 0:61c402886fbb 33 }
kishino 0:61c402886fbb 34
kishino 0:61c402886fbb 35 int C_YDwifi::initUart()
kishino 0:61c402886fbb 36 {
kishino 0:61c402886fbb 37 // Create UART recv thread
kishino 0:61c402886fbb 38 mUartRecvThread_p = new Thread( C_YDwifi::uartRecvThread );
kishino 0:61c402886fbb 39 if( mUartRecvThread_p == NULL )
kishino 0:61c402886fbb 40 {
kishino 0:61c402886fbb 41 printf("[C_YDwifi::initUart] thread cread failed\r\n");
kishino 0:61c402886fbb 42 return -1;
kishino 0:61c402886fbb 43 }
kishino 2:0ba43344c814 44
kishino 0:61c402886fbb 45 return 0;
kishino 0:61c402886fbb 46 }
kishino 0:61c402886fbb 47
kishino 2:0ba43344c814 48 int C_YDwifi::sendUart( unsigned int len, unsigned char *data )
kishino 0:61c402886fbb 49 {
kishino 2:0ba43344c814 50 int ret = 0;
kishino 2:0ba43344c814 51
kishino 2:0ba43344c814 52 mUartMutex.lock();
kishino 2:0ba43344c814 53 for( int i = 0; i < len; i++ )
kishino 2:0ba43344c814 54 {
kishino 2:0ba43344c814 55 // Write to UART
kishino 2:0ba43344c814 56 ret = mUart.putc( data[i] );
kishino 2:0ba43344c814 57 if( ret == -1 )
kishino 2:0ba43344c814 58 {
kishino 2:0ba43344c814 59 ret = -1;
kishino 2:0ba43344c814 60 break;
kishino 2:0ba43344c814 61 }
kishino 2:0ba43344c814 62 }
kishino 2:0ba43344c814 63 mUartMutex.unlock();
kishino 2:0ba43344c814 64 return ret;
kishino 0:61c402886fbb 65 }
kishino 0:61c402886fbb 66
kishino 0:61c402886fbb 67 void C_YDwifi::uartRecvThread (void const *args_p) {
kishino 2:0ba43344c814 68
kishino 0:61c402886fbb 69 C_YDwifi *instance_p = C_YDwifi::getInstance();
kishino 0:61c402886fbb 70 if ( instance_p == NULL )
kishino 0:61c402886fbb 71 {
kishino 0:61c402886fbb 72 printf("Socket constructor error: no wifly instance available!\r\n");
kishino 0:61c402886fbb 73 }
kishino 0:61c402886fbb 74
kishino 0:61c402886fbb 75 int recvdata = 0;
kishino 2:0ba43344c814 76 int i;
kishino 2:0ba43344c814 77
kishino 0:61c402886fbb 78 /* UART recv thread main loop */
kishino 0:61c402886fbb 79 for (;;)
kishino 0:61c402886fbb 80 {
kishino 2:0ba43344c814 81 while( instance_p->mUart.readable() )
kishino 2:0ba43344c814 82 {
kishino 2:0ba43344c814 83 // Receive data from UART.
kishino 2:0ba43344c814 84 instance_p->mUartMutex.lock();
kishino 2:0ba43344c814 85 recvdata = instance_p->mUart.getc();
kishino 2:0ba43344c814 86 instance_p->mUartMutex.unlock();
kishino 7:e88ccbe0225f 87
kishino 2:0ba43344c814 88 // Check UART receiving flg
kishino 2:0ba43344c814 89 if( gUART_RCVBUF.is_receive )
kishino 2:0ba43344c814 90 {
kishino 2:0ba43344c814 91 gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
kishino 2:0ba43344c814 92 gUART_RCVBUF.size++;
kishino 2:0ba43344c814 93 // Check received data is EOM.
kishino 2:0ba43344c814 94 if( recvdata == UART_CMD_EOM )
kishino 2:0ba43344c814 95 {
kishino 3:9f90024d7fb2 96 /*
kishino 2:0ba43344c814 97 printf("[recv]\r\n");
kishino 2:0ba43344c814 98 for( i = 0; i < gUART_RCVBUF.size; i++ )
kishino 2:0ba43344c814 99 {
kishino 2:0ba43344c814 100 printf("%02x ", gUART_RCVBUF.buf[i]);
kishino 2:0ba43344c814 101 }
kishino 2:0ba43344c814 102 printf("\r\n");
kishino 5:ef3befe3edad 103 */
kishino 2:0ba43344c814 104 unsigned char command_id;
kishino 3:9f90024d7fb2 105 // Get payload from received data from UART.
kishino 3:9f90024d7fb2 106 int payload_len = C_YD_UartMsg::getResponsePayload( gUART_RCVBUF.size, gUART_RCVBUF.buf
kishino 3:9f90024d7fb2 107 , &command_id, gUART_TEMP_BUF );
kishino 3:9f90024d7fb2 108 /*
kishino 3:9f90024d7fb2 109 printf("[payload]\r\n");
kishino 3:9f90024d7fb2 110 for( i = 0; i < payload_len; i++ )
kishino 3:9f90024d7fb2 111 {
kishino 3:9f90024d7fb2 112 printf("%02x ", gUART_TEMP_BUF[i]);
kishino 3:9f90024d7fb2 113 }
kishino 3:9f90024d7fb2 114 printf("\r\n");
kishino 5:ef3befe3edad 115 */
kishino 3:9f90024d7fb2 116 // Check scan results indication
kishino 3:9f90024d7fb2 117 if( (command_id == UART_CMD_ID_WIFI) || (gUART_TEMP_BUF[0] == UART_CMD_SID_WIFI_SCAN_RESULT_IND) )
kishino 3:9f90024d7fb2 118 {
kishino 3:9f90024d7fb2 119 // Scan result indicate
kishino 3:9f90024d7fb2 120 instance_p->mUartCommand.scanResultIndicate( gUART_TEMP_BUF, payload_len );
kishino 3:9f90024d7fb2 121 }
kishino 2:0ba43344c814 122
kishino 3:9f90024d7fb2 123 // Checks in the command which is waiting.
kishino 3:9f90024d7fb2 124 if( instance_p->mUartCommand.isWaitingCommand(command_id, gUART_TEMP_BUF) )
kishino 2:0ba43344c814 125 {
kishino 3:9f90024d7fb2 126 // Get buffer for payload data
kishino 3:9f90024d7fb2 127 unsigned char *payload_buf_p = instance_p->mUartCommand.getResponseBuf();
kishino 3:9f90024d7fb2 128 if( payload_buf_p != NULL )
kishino 2:0ba43344c814 129 {
kishino 3:9f90024d7fb2 130 memcpy( payload_buf_p, gUART_TEMP_BUF, payload_len );
kishino 3:9f90024d7fb2 131 instance_p->mUartCommand.setResponseBuf( NULL );
kishino 2:0ba43344c814 132 }
kishino 3:9f90024d7fb2 133 // Set status
kishino 3:9f90024d7fb2 134 instance_p->mUartCommand.setCommandStatus( gUART_TEMP_BUF[2] );
kishino 3:9f90024d7fb2 135 // Set signal for command response wait.
kishino 3:9f90024d7fb2 136 instance_p->mUartCommand.signal();
kishino 2:0ba43344c814 137 }
kishino 3:9f90024d7fb2 138
kishino 2:0ba43344c814 139 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 140 gUART_RCVBUF.is_receive = false;
kishino 2:0ba43344c814 141 }
kishino 2:0ba43344c814 142 }
kishino 2:0ba43344c814 143 else
kishino 2:0ba43344c814 144 {
kishino 2:0ba43344c814 145 // Check received data is SOM.
kishino 2:0ba43344c814 146 if( recvdata == UART_CMD_SOM )
kishino 2:0ba43344c814 147 {
kishino 2:0ba43344c814 148 gUART_RCVBUF.size = 0;
kishino 2:0ba43344c814 149 gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
kishino 2:0ba43344c814 150 gUART_RCVBUF.size++;
kishino 2:0ba43344c814 151 gUART_RCVBUF.is_receive = true;
kishino 2:0ba43344c814 152 }
kishino 2:0ba43344c814 153 }
kishino 7:e88ccbe0225f 154 // Thread::yield();
kishino 2:0ba43344c814 155 }
kishino 2:0ba43344c814 156 Thread::yield();
kishino 0:61c402886fbb 157 }
kishino 0:61c402886fbb 158 }
kishino 0:61c402886fbb 159