This program opens a socket and wait connection through Wi-Fi. When the socket is connected, print out received characters to LCD.

Dependencies:   TextLCD mbed

WifiTerminalMode.h

Committer:
nakata
Date:
2012-10-24
Revision:
2:f5754fb90f07

File content as of revision 2:f5754fb90f07:

#include "private.h"
#include <string.h>

/*
 * common constants
 */
#define BAUD_RATE 115200
//#define BAUD_RATE 9600
#define CR  13
#define LF  10
#define READ_BUFF_LEN       4096
#define IPADDRESS_LENGTH    16
#define PORT_NUM    "1080"

/*
 * mbed pin settings
 */
Serial wifi(p13, p14);
DigitalOut PRST(p15);

class WifiTerminalMode {
private:
    unsigned char buff[READ_BUFF_LEN];
    unsigned char myIPAddress[IPADDRESS_LENGTH];

private:
    void putc(int c)
    {
        while (!wifi.writeable())
            ;   // empty loop body
        wifi.putc(c);
    }

    int getc()
    {
        return wifi.getc();
    }

    void delayedPutc(unsigned char c)
    {
        wait(0.00032);
        putc(c);
    }

    void write(const unsigned char *data)
    {
        const unsigned char *p;
        for ( p = data; *p != '\0'; p++ ) {
            delayedPutc(*p);
        }
    }

    int readToPrompt()
    {
        int len;
        unsigned char *p = buff;
        for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) {
            *p = getc();
            if ( *p == '#' ) {
                break;
            }
        }
        *p = '\0';

        return len;
    }

    void waitPrompt()
    {
        while (getc() != '#')
            ;   // empty loop body
    }

public:
    unsigned char *readBlock()
    {
        int len;
        unsigned char *p = buff;
        for ( len = 0; len < READ_BUFF_LEN - 1; len++ ) {
            *p++ = getc();
            if ( !wifi.readable() ) {
                break;
            }
        }
        *p = '\0';

        return buff;
    }

    unsigned char *readLine()
    {
        int len;
        unsigned char *p = buff;
        
        for ( len = 0; len < READ_BUFF_LEN - 1; len++, p++ ) {
            *p = getc();
            if ( *p == CR || *p == LF ) {
                p++;
                break;
            }
        }
        *p = '\0';

        return buff;
    }
private:
    int command(const unsigned char *data)
    {
        int len = 0;
        unsigned char *p2 = buff;
        const unsigned char *p;
    
        for ( p = data; *p != '\0'; p++ ) {
            while (wifi.readable()) {
                *p2++ = getc();
                len++;
            }
            delayedPutc(*p);
        }
        for (; len < READ_BUFF_LEN - 1; len++, p2++ ) {
            *p2 = getc();
            if ( *p2 == '#') {
                break;
            }
        }
        *p2 = '\0';

        return len;
    }

public:
    void reset()
    {
        wifi.baud(BAUD_RATE);
        wifi.format(8, Serial::None, 1);
    
        PRST = 0;       // activate reset line
        wait(1.0);    // perhaps needs 1 sec
        PRST = 1;       // deactivate reset line
    }

    void serialInit()
    {
        int i;
        int c = 0;

        while (true) {
            if (wifi.writeable())
                putc('A');
            if (wifi.readable()) {
                if ( c == '*' ) {
                    c = getc();
                    if ( c == CR ) {
                        break;
                    }
                } else {
                    c = getc();
                }
            }
            wait(0.00032);  // this wait is important
        }
        // flush buffer
        while (wifi.readable())
            getc();
        // change to config mode
        for ( i = 0; i < 8; i++ ) {
            delayedPutc(' ');
        }
        c = 0;
        while (true) {
            if (wifi.readable()) {
                if ( c == '*' ) {
                    c = getc();
                    if ( c == CR ) {
                        break;
                    }
                } else {
                    c = getc();
                }
            }
        }
    }

    void portSetup()
    {
        command("wlan_type set infra\r");
        command("wlan_ssid set " SSID "\r");
        command("wlan_wps set stop\r");
        command("wlan_crdl set off\r");
#ifdef  WEP40_KEY
        command("wlan_sec set wep40\r");
        command("wlan_wep set " WEP40_KEY "\r");
#endif
#ifdef  WEP104_KEY
        command("wlan_sec set wep104\r");
        command("wlan_wep set " WEP104_KEY "\r");
#endif
#ifdef  TKIP_KEY
        command("wlan_sec set wpa-tkip\r");
        command("wlan_psk set " TKIP_KEY "\r");
#endif
#ifdef  AES_KEY
        command("wlan_sec set wpa2-aes\r");
        command("wlan_psk set " AES_KEY "\r");
#endif
#ifdef  MIX_KEY
        command("wlan_sec set wpa-mix\r");
        command("wlan_psk set " MIX_KEY "\r");
#endif
        command("ip_dhcp set on\r");
        command("ip_term_prot set tcps\r");
        command("ip_term_hp set " PORT_NUM "\r");
        command("save permit\r");
    }
    
    unsigned char *getAddr()
    {
        int len;
        int i = 0;
        const char *p;
    
        waitPrompt();
        while (true) {
            len = command("wlan_con get\r");
            if (len > 0 && strstr((const char *)buff, (const char *)"= Connect") != 0 ) {
                break;
            }
            setLeds(4 | i);
            i ^= 1;
            wait(1.0);
        }
        do {
            setLeds(6 | i);
            i ^= 1;
            wait(1.0);
            len = command("ip_current get\r");
            if ( len <= 0 ) {
                p = (const char *)buff;
                buff[0] = '\0';
                continue;
            }
            p = strstr((const char *)buff, (const char *)"IP");
            if ( p == NULL )
                continue;
            p = strstr(p, (const char *)" = ");
            if ( p == NULL )
                continue;
        } while ( strncmp(p, " = 0.0.0.0", 10) == 0 );
        p += 3;
        for ( i = 0; i < IPADDRESS_LENGTH - 1; i++, p++ ) {
            if ( *p == '\r' )
                break;
            myIPAddress[i] = *p;
        }
        myIPAddress[i] = '\0';
        command("run permit\r");
    
        return myIPAddress;
    }
};