Freedman v2

Dependents:   Freedman_v2

Fork of WizFi250Interface by DongEun Koak

Revision:
0:f2039204c8f6
Child:
1:23e6f886c8f1
diff -r 000000000000 -r f2039204c8f6 WizFi250/WizFi250_at.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_at.cpp	Mon Jun 02 23:34:10 2014 +0000
@@ -0,0 +1,390 @@
+/*
+ /* Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+
+#include "WizFi250.h"
+
+
+
+void WizFi250::clearFlags()
+{
+    _state.ok = false;
+    _state.failure = false;
+    _state.res = RES_NULL;
+    _state.n = 0;
+}
+
+int WizFi250::sendCommand(const char * cmd, const char *ACK, char *res , int timeout, int opt)
+{
+    char read;
+    int i;
+    Timer t;
+    string checking;
+    size_t found = string::npos;
+
+
+    //attach_rx(false);
+    if (lockUart(timeout))  return -1;
+
+    // flush the buffer
+    while(_wizfi.readable())
+    {
+        printf("%c",_wizfi.getc());
+    }
+
+    clearFlags();
+
+    INFO("command: '%s'", cmd)
+    for (i=0; i< strlen(cmd); i++)
+    {
+        putUart(cmd[i]);
+    }
+
+    if(opt == 0)
+    {
+
+    }
+    else if(opt == 1)
+    {
+        putUart('\r');
+    }
+    else
+    {
+        putUart('\r');
+        putUart('\n');
+    }
+    unlockUart();
+
+    while(1)
+    {
+        if(t.read_ms() > timeout)
+        {
+            while(_wizfi.readable())
+                _wizfi.getc();
+
+            DBG("check: %s\r\n", checking.c_str());
+
+            attach_rx(true);
+            return -1;
+        }
+        else if(_wizfi.readable())
+        {
+            read = _wizfi.getc();
+            if(read != '\r' && read != '\n')
+            {
+                checking += read;
+                found = checking.find(ACK);
+                if (found != string::npos)
+                {
+                    wait(0.01);
+
+                    while(_wizfi.readable())
+                        _wizfi.getc();
+
+                    break;
+                }
+            }
+        }
+    }
+    DBG("check:%s\r\n", checking.c_str());
+
+//    attach_rx(true);
+
+    return 0;
+}
+
+
+
+int WizFi250::sendCommand(const char * cmd, Response res, int timeout, int opt)
+{
+    int i, cnt=0;
+    Timer t;
+
+  if (lockUart(timeout)) return -1;
+
+    clearFlags();
+    _state.res = res;
+
+    INFO("command: '%s'", cmd)
+    for (i=0; i< strlen(cmd); i++)
+    {
+        putUart(cmd[i]);
+    }
+
+    if(opt == 0)
+    {
+
+    }
+    else if(opt == 1)
+    {
+        putUart('\r');
+    }
+    else
+    {
+        putUart('\r');
+        putUart('\n');
+    }
+    unlockUart();
+
+    if(timeout)
+    {
+        t.start();
+        for(;;)
+        {
+            if (_state.ok && _state.res == RES_NULL){
+                break;
+            }
+            if (_state.failure || t.read_ms() > timeout)
+            {
+                WARN("failure of timeout[%d]ms\r\n",t.read_ms());
+                _state.res = RES_NULL;
+                return -1;
+            }
+        }
+
+        t.stop();
+    }
+
+    INFO("ok\r\n");
+    _state.res = RES_NULL;
+
+    return 0;
+}
+
+int WizFi250::cmdAT()
+{
+    int resp;
+
+    resp = sendCommand("AT");
+
+    DBG("%s",_state.dummyBuf);
+    memset(_state.dummyBuf,0,sizeof(_state.dummyBuf));
+
+    return resp;
+
+    //return sendCommand("AT");
+    //sendCommand("AT","[OK]");
+}
+
+int WizFi250::cmdMECHO(bool flg)
+{
+    int status;
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+MECHO=%d",flg);
+    status = sendCommand(cmd);
+
+    DBG("%s",_state.dbgRespBuf);
+    return status;
+}
+
+int WizFi250::cmdUSET(int baud, char *flow)
+{
+    int status;
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+USET=%d,N,8,1,%s",baud, flow);
+    status = sendCommand(cmd);
+
+    if(status == 0)
+    {
+        wait(1);
+        _state.buf->flush();
+    }
+
+    return status;
+}
+
+int WizFi250::cmdMMAC(const char *mac)
+{
+    int resp;
+    char cmd[CFG_CMD_SIZE];
+    const char xmac[] = "00:08:DC:00:00:00";
+
+    if (mac)
+    {
+        sprintf(cmd, "AT+MMAC=%s",mac);
+        resp = sendCommand(cmd);
+    }
+    else
+    {
+        sprintf(cmd, "AT+MMAC=?");
+        resp = sendCommand(cmd, RES_MACADDRESS);
+        if (!resp && strncmp(_state.mac, xmac, 17) == 0)
+        {
+            resp = -1;
+        }
+    }
+
+    return resp;
+}
+
+int WizFi250::cmdWSET(WiFiMode mode, const char *ssid, const char *bssid, int channel)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    if(*bssid == NULL)
+    {
+        sprintf(cmd, "AT+WSET=%d,%s",mode, ssid);
+    }
+    else
+    {
+        sprintf(cmd, "AT+WSET=%d,%s,%s,%d",mode, ssid, bssid, channel);
+    }
+
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWSEC(WiFiMode mode, const char *key, const char *sec)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    if(*sec == NULL)
+    {
+        sprintf(cmd, "AT+WSEC=%d,,%s",mode, key);
+    }
+    else
+    {
+        sprintf(cmd, "AT+WSEC=%d,%s,%s",mode, sec, key);
+    }
+
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWJOIN()
+{
+    sendCommand("AT+WJOIN", RES_WJOIN, CFG_TIMEOUT);
+
+    DBG("IP : %s",_state.ip);
+    DBG("Gateway : %s",_state.gateway);
+
+    return 0;
+}
+
+
+int WizFi250::cmdSCON ( const char *openType, const char *socketType, int localPort, const char *dataMode)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+SCON=%s,%s,,,%d,%s",openType, socketType, localPort, dataMode);
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdSCON ( const char *openType, const char *socketType, const char *remoteIp, int remotePort, int localPort, const char *dataMode)
+{
+    int resp;
+    char cmd[CFG_CMD_SIZE];
+
+    if(localPort == NULL)
+        sprintf(cmd,"AT+SCON=%s,%s,%s,%d,%s,%s",openType, socketType, remoteIp, remotePort, "", dataMode);
+    else
+        sprintf(cmd,"AT+SCON=%s,%s,%s,%d,%d,%s",openType, socketType, remoteIp, remotePort, localPort, dataMode);
+
+    resp = sendCommand(cmd, RES_CONNECT, 5000 );
+    DBG("Create CID : %s",_state.dummyBuf);
+
+    return resp;
+}
+
+int WizFi250::cmdSSEND ( const char *data, int cid, int sendSize, const char *remoteIp, int remotePort, int Timeout )
+{
+    int i, resp;
+    Timer t;
+    char cmd[CFG_CMD_SIZE];
+
+
+    if (lockUart(Timeout))    return -1;
+
+    clearFlags();
+    if(remotePort == NULL)
+    {
+        sprintf(cmd,"AT+SSEND=%d,%s,,%d",cid, remoteIp, sendSize);
+    }
+    else
+    {
+        sprintf(cmd,"AT+SSEND=%d,%s,%d,%d",cid, remoteIp, remotePort, sendSize);
+    }
+
+    _con[cid].send_length = sendSize;
+
+    resp = sendCommand(cmd, RES_SSEND, 2000, 1);
+    unlockUart();
+    if(resp){
+        DBG("Fail cmdSSEND")
+        return -1;
+    }
+
+    for(i=0; i<sendSize; i++)
+    {
+        putUart(data[i]);
+    }
+    unlockUart();
+
+    if(Timeout)
+    {
+        t.start();
+        for(;;)
+        {
+            if (_state.ok) break;
+            if (_state.failure || t.read_ms() > Timeout)
+            {
+                WARN("failure or timeout\r\n");
+                return -1;
+            }
+        }
+        t.stop();
+    }
+
+    //INFO("data: '%s' size : %d\r\n",data, sendSize);
+
+    return i;
+}
+
+
+int WizFi250::cmdCLOSE ( int cid )
+{
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+SMGMT=%d",cid);
+    return sendCommand(cmd);
+}
+
+
+int WizFi250::cmdFDNS (const char *host)
+{
+    char cmd[CFG_CMD_SIZE];
+    int resp;
+
+    sprintf(cmd,"AT+FDNS=%s,1000",host);
+    resp = sendCommand(cmd, RES_FDNS, CFG_TIMEOUT);
+
+    DBG("%s",_state.resolv);
+    return resp;
+}
+
+int WizFi250::cmdSMGMT ( int cid )
+{
+    int resp;
+
+    resp = sendCommand("AT+SMGMT=?", RES_SMGMT);
+    return resp;
+}