Murata RF modules are designed to simplify wireless development and certification by minimizing the amount of RF expertise you need to wirelessly enable a wide range of applications.

Revision:
9:0ce800923eda
Parent:
8:5856c23794b1
--- a/MuRata.cpp	Mon Feb 15 15:17:50 2016 +0000
+++ b/MuRata.cpp	Wed Mar 16 15:04:46 2016 +0000
@@ -3,6 +3,9 @@
 using namespace SmartLabMuRata;
 
 MuRata::MuRata(PinName tx, PinName rx)
+    : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
+      _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
+      _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
 {
     serial = new Serial(tx,rx);
     serial->format();
@@ -10,10 +13,13 @@
 }
 
 MuRata::MuRata(PinName tx, PinName rx, int baudrate ,int bits, Serial::Parity parity, int stop_bits)
+    : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
+      _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
+      _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
 {
     serial = new Serial(tx,rx);
     serial->format(bits, parity, stop_bits);
-    serial->baud(baudrate );
+    serial->baud(baudrate);
 }
 
 SSIDRecordIndication * MuRata::Get_ScanResultIndication()
@@ -21,8 +27,10 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_WIFI
-                && _payload.GetSubCommandID() == WIFI_SCAN_RESULT_IND)
-            return new SSIDRecordIndication(&_payload);
+                && _payload.GetSubCommandID() == WIFI_SCAN_RESULT_IND) {
+            _SSIDRecordIndication.SetPayload(&_payload);
+            return &_SSIDRecordIndication;
+        }
 
     return NULL;
 }
@@ -32,21 +40,23 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_WIFI
-                && _payload.GetSubCommandID() == WIFI_NETWORK_STATUS_IND)
-            return new WIFIConnectionIndication(&_payload);
+                && _payload.GetSubCommandID() == WIFI_NETWORK_STATUS_IND) {
+            _WIFIConnectionIndication.SetPayload(&_payload);
+            return &_WIFIConnectionIndication;
+        }
 
     return NULL;
 }
 
-PowerUpIndication * MuRata::Get_PowerUpIndication()
+ResetCode MuRata::Get_PowerUpIndication()
 {
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_GEN
                 && _payload.GetSubCommandID() == GEN_PWR_UP_IND)
-            return new PowerUpIndication(&_payload);
+            return (ResetCode)(_payload.GetData()[2] << 8 | _payload.GetData()[3]);
 
-    return NULL;
+    return N0_Indication;
 }
 
 TCPStatusIndication * MuRata::Get_TcpConnectionStatusIndication()
@@ -54,8 +64,10 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_SNIC
-                && _payload.GetSubCommandID() == SNIC_TCP_CONNECTION_STATUS_IND)
-            return new TCPStatusIndication(&_payload);
+                && _payload.GetSubCommandID() == SNIC_TCP_CONNECTION_STATUS_IND) {
+            _TCPStatusIndication.SetPayload(&_payload);
+            return &_TCPStatusIndication;
+        }
 
     return NULL;
 }
@@ -65,8 +77,10 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_SNIC
-                && _payload.GetSubCommandID() == SNIC_CONNECTION_RECV_IND)
-            return new SocketReceiveInidcation(&_payload);
+                && _payload.GetSubCommandID() == SNIC_CONNECTION_RECV_IND) {
+            _SocketReceiveInidcation.SetPayload(&_payload);
+            return &_SocketReceiveInidcation;
+        }
 
     return NULL;
 }
@@ -76,8 +90,10 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_SNIC
-                && _payload.GetSubCommandID() == SNIC_UDP_RECV_IND)
-            return new UDPReceivedIndication(&_payload);
+                && _payload.GetSubCommandID() == SNIC_UDP_RECV_IND) {
+            _UDPReceivedIndication.SetPayload(&_payload);
+            return &_UDPReceivedIndication;
+        }
 
     return NULL;
 }
@@ -87,8 +103,10 @@
     if (FrameReceive())
         if (_payload.GetResponseFlag() == Request_Indication
                 && _frame.GetCommandID() == CMD_ID_SNIC
-                && _payload.GetSubCommandID() == SNIC_HTTP_RSP_IND)
-            return new HTTPResponseIndication(&_payload);
+                && _payload.GetSubCommandID() == SNIC_HTTP_RSP_IND) {
+            _HTTPResponseIndication.SetPayload(&_payload);
+            return &_HTTPResponseIndication;
+        }
 
     return NULL;
 }
@@ -116,20 +134,16 @@
 {
     timer.reset();
     timer.start();
-    
-    while (serial->readable() <= 0)
-    {
-        if (timer.read_ms() > 1000)
-        {
+
+    while (serial->readable() <= 0) {
+        if (timer.read_ms() > 1000) {
             timer.stop();
             return false;
         }
     }
-    
     timer.stop();
-        
+
     int value = serial->getc();
-
     while (value != UARTFrame::SOM)
         value = serial->getc();
 
@@ -151,7 +165,7 @@
     else return false;
 }
 
-VersionInfoResponse * MuRata::GEN_GetFirmwareVersionInfo()
+const char * MuRata::GEN_GetFirmwareVersionInfo()
 {
     _payload.Rewind();
     _payload.SetSubCommandID(GEN_FW_VER_GET_REQ);
@@ -162,10 +176,15 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_FW_VER_GET_REQ)
-            return new VersionInfoResponse(&_payload);
-
+    while (FrameReceive()) {
+        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_FW_VER_GET_REQ) {
+            if (_payload.GetData()[2] == GEN_SUCCESS) {
+                // set the null for the string
+                _payload.GetData()[4 + _payload.GetData()[3]] = 0x00;
+                return _payload.GetData() + 4;
+            }
+        }
+    }
     return NULL;
 }
 
@@ -180,7 +199,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESTORE_REQ)
             return (CMDCode)_payload.GetData()[2];
 
@@ -198,26 +217,26 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESET_REQ)
             return (CMDCode)_payload.GetData()[2];
 
     return GEN_NORESPONSE;
 }
 
-CMDCode MuRata::GEN_UARTConfiguration(UARTConfig & config)
+CMDCode MuRata::GEN_UARTConfiguration(UARTConfig * config)
 {
     _payload.Rewind();
     _payload.SetSubCommandID(GEN_UART_CFG_REQ);
     _payload.SetFrameID(_payload.GetFrameID() + 1);
-    _payload.SetContent(config.GetValue(), 0, 6);
+    _payload.SetContent(config->GetValue(), 0, 6);
 
     _frame.SetCommandID(CMD_ID_GEN);
     _frame.SetPayload(&_payload);
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_UART_CFG_REQ)
             return (CMDCode)_payload.GetData()[2];
 
@@ -241,7 +260,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_ON_REQ)
             return (WIFICode)_payload.GetData()[2];
 
@@ -259,13 +278,28 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_OFF_REQ)
             return (WIFICode)_payload.GetData()[2];
 
     return WIFI_NORESPONSE;
 }
 
+/*
+ * Parameters are as follows:
+ * UINT8 Request Sequence
+ * UINT8 Onoff
+ * UINT8 Persistency
+ * UINT8 SSID [up to 33]
+ * UINT8 Channel
+ * UINT8 Security mode
+ * UINT8 Security key length (0-64)
+ * … Security key [ ]
+ * OnOff = 0 indicates AP is to be turned off. The rest of the parameters are ignored.
+ * OnOff = 1 indicates turning on soft AP using existing NVM parameters,
+ * OnOff = 2 indicates turning on AP with the parameters provided. If the soft AP is already on, it is first turned off.
+ * Persistency=1 indicates the soft AP’s on/off state and parameters (if OnOff = 2) will be saved in NVM. For example, if OnOff =0 and Persistency=1, the soft AP will not be turned on after a reset.
+ */
 WIFICode MuRata::WIFI_SoftAPControl(SoftAPConfig * config)
 {
     _payload.Rewind();
@@ -274,25 +308,30 @@
 
     _payload.SetContent(config->GetOnOffStatus());
     _payload.SetContent(config->GetPersistency());
-    if (config->GetOnOffStatus() == 0x02) {
-        int length = strlen(config->GetSSID());
-        _payload.SetContent(config->GetSSID(), 0 , length);
+    if (config->GetOnOffStatus() == SoftAPConfig::ON_PARAMETERS) {
+        const char * ssid = config->GetSSID();
+        int length = strlen(ssid);
+        _payload.SetContent(ssid, 0 , length);
         _payload.SetContent(0x00);
     }
     _payload.SetContent(config->GetChannel());
     _payload.SetContent(config->GetSecurityMode());
 
-    int keyLength = strlen(config->GetSecurityKey());
+    const char * key = config->GetSecurityKey();
+    int keyLength = 0;
+    if (key != NULL)
+        keyLength = strlen(key);
+
     _payload.SetContent(keyLength);
     if (config->GetSecurityMode() != WIFI_SECURITY_OPEN && keyLength > 0)
-        _payload.SetContent(config->GetSecurityKey(), 0 , keyLength);
+        _payload.SetContent(key, 0 , keyLength);
 
     _frame.SetCommandID(CMD_ID_WIFI);
     _frame.SetPayload(&_payload);
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_AP_CTRL_REQ)
             return (WIFICode)_payload.GetData()[2];
 
@@ -324,7 +363,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_JOIN_REQ)
             return (WIFICode)_payload.GetData()[2];
 
@@ -342,7 +381,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_DISCONNECT_REQ)
             return (WIFICode)_payload.GetData()[2];
 
@@ -360,14 +399,16 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STATUS_REQ)
-            return new WIFIStatusResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STATUS_REQ) {
+            _WIFIStatusResponse.SetPayload(&_payload);
+            return &_WIFIStatusResponse;
+        }
 
     return NULL;
 }
 
-int MuRata::WIFI_GetRSSI()
+int8_t MuRata::WIFI_GetRSSI()
 {
     _payload.Rewind();
     _payload.SetSubCommandID(WIFI_GET_STA_RSSI_REQ);
@@ -378,15 +419,9 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STA_RSSI_REQ) {
-            char value = _payload.GetData()[2];
-
-            if (value >> 7 == 0x01)
-                return (~(_payload.GetData()[2] - 1) & 0x7F) * -1;
-
-            return value;
-        }
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STA_RSSI_REQ)
+            return _payload.GetData()[2];
 
     return 127;
 }
@@ -411,7 +446,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_WPS_REQ)
             return (WIFICode)_payload.GetData()[2];
 
@@ -470,9 +505,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_INIT_REQ)
-            return new InitializationResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_INIT_REQ) {
+            _InitializationResponse.SetPayload(&_payload);
+            return &_InitializationResponse;
+        }
 
     return NULL;
 }
@@ -488,7 +525,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLEANUP_REQ)
             return (SNICCode)_payload.GetData()[2];
 
@@ -513,9 +550,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_SEND_FROM_SOCKET_REQ)
-            return new SendFromSocketResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_SEND_FROM_SOCKET_REQ) {
+            _SendFromSocketResponse.SetPayload(&_payload);
+            return &_SendFromSocketResponse;
+        }
 
     return NULL;
 }
@@ -532,7 +571,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLOSE_SOCKET_REQ)
             return (SNICCode)_payload.GetData()[2];
 
@@ -551,14 +590,16 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_GET_DHCP_INFO_REQ)
-            return new DHCPInfoResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_GET_DHCP_INFO_REQ) {
+            _DHCPInfoResponse.SetPayload(&_payload);
+            return &_DHCPInfoResponse;
+        }
 
     return NULL;
 }
 
-bool MuRata::SNIC_ResolveHostName(const char * host, IPAddress * ip)
+IPAddress * MuRata::SNIC_ResolveHostName(const char * host)
 {
     int hostLength = strlen(host);
 
@@ -574,14 +615,14 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_RESOLVE_NAME_REQ)
             if ((SNICCode)_payload.GetData()[2] == SNIC_SUCCESS) {
-                ip->SetValue(_payload.GetData(), 3);
-                return true;
+                ip.SetValue(_payload.GetData(), 3);
+                return &ip;
             }
 
-    return false;
+    return NULL;
 }
 
 SNICCode MuRata::SNIC_ConfigureDHCPorStaticIP(DHCPConfig * config)
@@ -608,7 +649,7 @@
 
     Send();
 
-    if (FrameReceive())
+    while (FrameReceive())
         if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_IP_CONFIG_REQ)
             return (SNICCode)_payload.GetData()[2];
 
@@ -633,9 +674,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_TCP_CONNECT_TO_SERVER_REQ)
-            return new SocketStartReceiveResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_TCP_CONNECT_TO_SERVER_REQ) {
+            _SocketStartReceiveResponse.SetPayload(&_payload);
+            return &_SocketStartReceiveResponse;
+        }
 
     return NULL;
 }
@@ -676,9 +719,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == subID)
-            return new CreateSocketResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == subID) {
+            _CreateSocketResponse.SetPayload(&_payload);
+            return &_CreateSocketResponse;
+        }
 
     return NULL;
 }
@@ -697,9 +742,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_START_RECV_REQ)
-            return new SocketStartReceiveResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_START_RECV_REQ) {
+            _SocketStartReceiveResponse.SetPayload(&_payload);
+            return &_SocketStartReceiveResponse;
+        }
 
     return NULL;
 }
@@ -721,9 +768,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SIMPLE_SEND_REQ)
-            return new SendFromSocketResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SIMPLE_SEND_REQ) {
+            _SendFromSocketResponse.SetPayload(&_payload);
+            return &_SendFromSocketResponse;
+        }
 
     return NULL;
 }
@@ -747,9 +796,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SEND_FROM_SOCKET_REQ)
-            return new SendFromSocketResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SEND_FROM_SOCKET_REQ) {
+            _SendFromSocketResponse.SetPayload(&_payload);
+            return &_SendFromSocketResponse;
+        }
 
     return NULL;
 }
@@ -780,7 +831,7 @@
     _payload.SetContent(_others.c_str(), 0, _others.length());
     _payload.SetContent(0x00);
 
-    if (content->GetMethod() == POST) {
+    while (content->GetMethod() == POST) {
         int length = content->GetContentLength();
 
         char msb = length >> 8;
@@ -800,9 +851,11 @@
 
     Send();
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == _id)
-            return new HTTPResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == _id) {
+            _HTTPResponse.SetPayload(&_payload);
+            return &_HTTPResponse;
+        }
 
     return NULL;
 }
@@ -833,9 +886,11 @@
     if (chunked)
         return NULL;
 
-    if (FrameReceive())
-        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_HTTP_MORE_REQ)
-            return new HTTPResponse(&_payload);
+    while (FrameReceive())
+        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_HTTP_MORE_REQ) {
+            _HTTPResponse.SetPayload(&_payload);
+            return &_HTTPResponse;
+        }
 
     return NULL;
 }