SNIC UART Interface library: Serial to Wi-Fi library for Murata TypeYD Wi-Fi module. For more information about TypeYD: http://www.murata.co.jp/products/microwave/module/lbwb1zzydz/index.html
Dependents: SNIC-xively-jumpstart-demo SNIC-FluentLogger-example TCPEchoServer murataDemo ... more
Fork of YDwifiInterface 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();
}
}
muRata

Murata TypeYD