Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of NySNICInterface by
Diff: YDwifi/YDwifi.cpp
- Revision:
- 2:0ba43344c814
- Parent:
- 0:61c402886fbb
- Child:
- 3:9f90024d7fb2
--- a/YDwifi/YDwifi.cpp Fri Mar 07 02:13:09 2014 +0000
+++ b/YDwifi/YDwifi.cpp Tue Mar 11 10:38:36 2014 +0000
@@ -4,6 +4,17 @@
#include <string>
//#include <algorithm>
+using namespace murata_wifi;
+
+#define UART_RECVBUF_SIZE 2048
+typedef struct
+{
+ unsigned char buf[UART_RECVBUF_SIZE];
+ unsigned int size;
+ bool is_receive;
+}tagUART_RECVBUF_T;
+tagUART_RECVBUF_T gUART_RCVBUF;
+
C_YDwifi *C_YDwifi::mInstance_p;
C_YDwifi::C_YDwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud):
@@ -13,8 +24,11 @@
mInstance_p = this;
mUartRequestSeq = 0;
- printf("baud:%d\r\n", baud);
- mUart.baud( baud );
+ // Initialize uart
+ gUART_RCVBUF.is_receive = false;
+ gUART_RCVBUF.size = 0;
+ mUart.baud( 115200 );
+ mUart.format(8, SerialBase::None, 1);
}
int C_YDwifi::initUart()
@@ -26,26 +40,31 @@
printf("[C_YDwifi::initUart] thread cread failed\r\n");
return -1;
}
-
- // set intr callback function
- mUart.attach( this, &C_YDwifi::uartIntr_callback, Serial::RxIrq );
-
+
return 0;
}
-void C_YDwifi::uartIntr_callback( void )
+int C_YDwifi::sendUart( unsigned int len, unsigned char *data )
{
-#if 0
- C_YDwifi *instance = C_YDwifi::getInstance();
- instance->mUart.putc('G');
- instance->mUartRecvThread_p->signal_set(1);
-#else
- mUart.putc('G');
- mUartRecvThread_p->signal_set(1);
-#endif
+ int ret = 0;
+
+ mUartMutex.lock();
+ for( int i = 0; i < len; i++ )
+ {
+ // Write to UART
+ ret = mUart.putc( data[i] );
+ if( ret == -1 )
+ {
+ ret = -1;
+ break;
+ }
+ }
+ mUartMutex.unlock();
+ return ret;
}
void C_YDwifi::uartRecvThread (void const *args_p) {
+
C_YDwifi *instance_p = C_YDwifi::getInstance();
if ( instance_p == NULL )
{
@@ -53,15 +72,75 @@
}
int recvdata = 0;
- printf("uartRecvThread\r\n");
-
+ int i;
+
/* UART recv thread main loop */
for (;;)
{
- Thread::signal_wait(1);
-// wait(0.1);
- recvdata = instance_p->mUart.getc();
- printf( "[thread]%02x\r\n", recvdata );
+ while( instance_p->mUart.readable() )
+ {
+ // Receive data from UART.
+ instance_p->mUartMutex.lock();
+ recvdata = instance_p->mUart.getc();
+ instance_p->mUartMutex.unlock();
+
+ // Check UART receiving flg
+ if( gUART_RCVBUF.is_receive )
+ {
+ gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
+ gUART_RCVBUF.size++;
+ // Check received data is EOM.
+ if( recvdata == UART_CMD_EOM )
+ {
+ printf("[recv]\r\n");
+ for( i = 0; i < gUART_RCVBUF.size; i++ )
+ {
+ printf("%02x ", gUART_RCVBUF.buf[i]);
+ }
+ printf("\r\n");
+
+ // Get buffer for payload data
+ unsigned char *payload_buf_p = instance_p->mUartCommand.getResponseBuf();
+ unsigned char command_id;
+
+ if( payload_buf_p != NULL )
+ {
+ // Get payload from received data from UART.
+ int payload_len = C_YD_UartMsg::getResponsePayload( gUART_RCVBUF.size, gUART_RCVBUF.buf
+ , &command_id, payload_buf_p );
+ printf("[payload]\r\n");
+ for( i = 0; i < payload_len; i++ )
+ {
+ printf("%02x ", payload_buf_p[i]);
+ }
+ printf("\r\n");
+
+ // Checks in the command which is waiting.
+ if( instance_p->mUartCommand.isWaitingCommand(command_id, payload_buf_p) )
+ {
+ // Set status
+ instance_p->mUartCommand.setCommandStatus( payload_buf_p[2] );
+ // Set signal for command response wait.
+ instance_p->mUartCommand.signal();
+ }
+ }
+ gUART_RCVBUF.size = 0;
+ gUART_RCVBUF.is_receive = false;
+ }
+ }
+ else
+ {
+ // Check received data is SOM.
+ if( recvdata == UART_CMD_SOM )
+ {
+ gUART_RCVBUF.size = 0;
+ gUART_RCVBUF.buf[ gUART_RCVBUF.size ] = (unsigned char)recvdata;
+ gUART_RCVBUF.size++;
+ gUART_RCVBUF.is_receive = true;
+ }
+ }
+ }
+ Thread::yield();
}
}
