eConais EC19D Wi-Fi module

EC19_cmd.cpp

Committer:
ecfan
Date:
2015-02-19
Revision:
0:4425e1b86f65

File content as of revision 0:4425e1b86f65:

#include "EC19.h"

void EC19::clearFlags () {
    _state.ok = false;
    _state.failure = false;
    _state.ready = false;
    _state.dwait = false;
    _state.n = 0;
}
 
int EC19::sendCommand (int cmd, const char *data, int length, int timeout) {
    int i;
    Timer t;

    INFO("command: 'AT%d' %d\r\n", cmd, length);
    setRts(false);
    t.reset();
    t.start();
    while (! _state.ready) {
        if (t.read_ms() > timeout) {
            setRts(true);
            WARN("timeout r\r\n");
            return -1;
        }
    }
    t.stop();

    clearFlags();
    putUart(cmd);
    putUart(length & 0xff);
    putUart((length >> 8) & 0xff);

    if (length) {
        t.reset();
        t.start();
        while (! _state.dwait) {
            if (t.read_ms() > timeout) {
                setRts(true);
                WARN("timeout d\r\n");
                return -1;
            }
        }
        for (i = 0; i < length; i ++) {
            putUart(data[i]);
        }
    }
    setRts(true);

    if (timeout) {
        t.reset();
        t.start();
        for (;;) {
            if (_state.ok) break;
            if (_state.failure) {
                WARN("failure\r\n");
                return -1;
            }
            if (t.read_ms() > timeout) {
                WARN("timeout\r\n");
                return -1;
            }
        }
        t.stop();
    }
    INFO("ok\r\n");

    return 0;
}



int EC19::cmdBaud (int baud) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%d", baud);
    return sendCommand(5, cmd, strlen(cmd));
}

int EC19::cmdAssociate (Security sec, const char *ssid, const char *phrase, int key) {
    char cmd[CFG_CMD_SIZE];

    if (!ssid && !phrase) {
        return sendCommand(10, "?", 1);
    }

    switch (sec) {
    case SEC_OPEN:
    case SEC_WPA_PSK:
        if (phrase) {
            sprintf(cmd, "%s,%s", ssid, phrase);
        } else {
            sprintf(cmd, "%s", ssid);
        }
        return sendCommand(10, cmd, strlen(cmd), CFG_TIMEOUT);
    case SEC_WEP:
        sprintf(cmd, "%s,%s,%d", ssid, phrase, key);
        return sendCommand(10, cmd, strlen(cmd), CFG_TIMEOUT);
    }
    return -1;
}

int EC19::cmdDissociate () {
    return sendCommand(116, NULL, 0, CFG_TIMEOUT);
}

int EC19::cmdMac (const char *mac) {
    char cmd[CFG_CMD_SIZE];
    int r;
    const char xmac[] = "00:1D:C9:01:99:99";

    if (mac) {
        sprintf(cmd, "1,%s", mac);
        r = sendCommand(13, cmd, strlen(cmd));
    } else {
        r = sendCommand(13, "0", 1);
        if (!r && strncmp(_state.mac, xmac, 17) == 0) {
            r = -1;
        }
    }
    return r;
}

int EC19::cmdWps (Security sec, const char *pin) {
    char cmd[CFG_CMD_SIZE];

    switch (sec) {
    case SEC_WPS_BUTTON:
        return sendCommand(20, "0", 1, CFG_TIMEOUT);
    case SEC_WPS_PIN:
        sprintf(cmd, "1,%s", pin);
        return sendCommand(20, cmd, strlen(cmd), CFG_TIMEOUT);
    }
    return -1;
}

int EC19::cmdPowerMode (int mode, int interval) {
    char cmd[CFG_CMD_SIZE];

    switch (mode) {
    case 0:
        return sendCommand(23, "0", 1);
    case 1:
    case 2:
        if (interval) {
            sprintf(cmd, "%d,0,%d", mode, interval);
        } else {
            sprintf(cmd, "%d,1", mode);
        }
        return sendCommand(23, cmd, strlen(cmd));
    case 3:
    }
    return -1;
}

int EC19::cmdRssi () {
    return sendCommand(24, NULL, 0);
}

int EC19::cmdSoftAp (Security sec, const char *ssid, const char *phrase, int ch) {
    char cmd[CFG_CMD_SIZE];

    if (!ssid && !phrase) {
        return sendCommand(40, "?", 1);
    }

    switch (sec) {
    case SEC_OPEN:
        return sendCommand(40, ssid, strlen(ssid), CFG_TIMEOUT);
    case SEC_WPA_PSK:
        if (ch) {
            sprintf(cmd, "%s,%s,%d", ssid, phrase, ch);
        } else {
            sprintf(cmd, "%s,%s", ssid, phrase);
        }
        return sendCommand(40, cmd, strlen(cmd), CFG_TIMEOUT);
    }
    return -1;
}

int EC19::cmdTcpClient (const char *remote, int port) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%s,%d", remote, port);
    return sendCommand(63, cmd, strlen(cmd));
}

int EC19::cmdTcpServer (int port) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%d", port);
    return sendCommand(65, cmd, strlen(cmd));
}

int EC19::cmdUdpClient (const char *remote, int port) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%s,%d", remote, port);
    return sendCommand(70, cmd, strlen(cmd));
}

int EC19::cmdUdpServer (int port) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%d", port);
    return sendCommand(73, cmd, strlen(cmd));
}

int EC19::cmdClose (int cid) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%d", cid);
    return sendCommand(72, cmd, strlen(cmd));
}

int EC19::cmdLookup (const char *name) {
    return sendCommand(76, name, strlen(name));
}

int EC19::cmdCreateProfile (int pid, Security sec, const char *ssid, const char *phrase,
  char *ip, char *netmask, char *gateway, char *dns, int ap, int ch) {
    char cmd[CFG_CMD_SIZE];

    switch (sec) {
    case SEC_WPS_BUTTON:
        sprintf(cmd, "%d,enc,%d,role,%d", pid, sec, ap ? 1 : 0);
        break;
    case SEC_WPS_PIN:
        sprintf(cmd, "%d,pin,%s,enc,%d,role,%d", pid, phrase, sec, ap ? 1 : 0);
        break;
    default:
        sprintf(cmd, "%d,ssid,%s,pass,%s,enc,%d,role,%d", pid, ssid, phrase, sec, ap ? 1 : 0);
        break;
    }
    if (ip) {
        sprintf(&cmd[strlen(cmd)], "ipstat,1,ip,%s,nm,%s,gw,%s,dns,%s", ip, netmask, gateway, dns);
    }
    if (ch) {
        sprintf(&cmd[strlen(cmd)], ",chan,%d", ch);
    }
    return sendCommand(110, cmd, strlen(cmd));
}

int EC19::cmdEnableProfile (int pid) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "%d", pid);
    return sendCommand(111, cmd, strlen(cmd));
}

int EC19::cmdAutoProfile (int retry, int num) {
    char cmd[CFG_CMD_SIZE];

    sprintf(cmd, "1,%d,%d", retry, num);
    return sendCommand(112, cmd, strlen(cmd));
}