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 Takao Kishino

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();
     }
 }