Martin Kojtal / Mbed 2 deprecated cc3000_simple_socket_demo

Dependencies:   NVIC_set_all_priorities cc3000_hostdriver_mbedsocket mbed

doTCPIP.cpp

Committer:
Kojto
Date:
2013-09-08
Revision:
0:ce33c63eefe5

File content as of revision 0:ce33c63eefe5:

#include "doTCPIP.h"
#include "cc3000.h"
#include "main.h"

using namespace mbed_cc3000;

extern cc3000 wigo;

//volatile uint8_t newData;
// int32_t server_running;
//uint8_t ForceFixedSSID;
//int8_t runSmartConfig;            // Flag indicating whether user requested to perform Smart Config
//volatile uint32_t ulCC3000Connected;
uint8_t ConnectUsingSmartConfig;
uint8_t myMAC[8];
tUserFS userFS;

int8_t requestBuffer[REQ_BUFFER_SIZE];
//int32_t LAN_Connected = 0;

uint8_t SmartConfigProfilestored = 0xff;

#ifndef CC3000_UNENCRYPTED_SMART_CONFIG
  const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
#else
  const uint8_t smartconfigkey = NULL;
#endif

/** \brief Flag indicating whether to print CC3000 Connection info */

//Device name - used for Smart config in order to stop the Smart phone configuration process
uint8_t DevServname[] = "CC3000";
//volatile uint32_t SendmDNSAdvertisment;


/* TODO */
void create_tcp_connection(int32_t port)
{
    const char python_msg[] = "Hello Python\n";
    int32_t stat;
    int32_t sock;
    //new TCP socket descriptor
    int32_t newsock;
    //destination address
    sockaddr destAddr;
    //local address
    sockaddr LocalAddr;
    socklen_t addrlen;
    memset(&LocalAddr, 0, 8);
    LocalAddr.family = AF_INET;
    LocalAddr.data[0] = (port >> 8) & 0xff;
    LocalAddr.data[1] = port & 0xff;
    memset (&LocalAddr.data[2], 0, 4);
    sock = wigo._socket.socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    while(sock == -1) sock = wigo._socket.socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);
    wigo._socket.bind(sock,&LocalAddr,sizeof(sockaddr));
    wigo._socket.listen(sock, 1);
    addrlen = sizeof(destAddr);
    while(1)
    {
        newsock = -2;
        printf("Server waiting for connection to Python\n");
        LED_D2_ON;
        while((newsock == -1) || (newsock == -2))
        {
            newsock = wigo._socket.accept(sock,&destAddr, &addrlen);
        }
        printf("Connected\n");
        //receive TCP data
        if(newsock >= 0)
        {
            wigo._socket.recv(newsock, requestBuffer,20,0);
            printf("Input = %s\n", requestBuffer);
            stat = -2;
            stat = wigo._socket.send(newsock, python_msg, strlen(python_msg), 0);
            printf("status= %d\n", stat);
            LED_D2_OFF;
        } else printf("bad socket= %d\n", newsock);
        wigo._socket.closesocket(newsock);
        printf("Done, press any key to repeat\n");
        getchar();
//        printf("\x1B[2J");    //VT100 erase screen
//        printf("\x1B[H");     //VT100 home
    }
}

void start_smart_config() {
    wigo.start_smart_config(smartconfigkey);
}

void init_tcp(void)
{
    int t;
    tNetappIpconfigRetArgs ipinfo2;

    check_dhcp();
    //while(checkWiFiConnected() == false);
    // If connectivity is good, run the primary functionality
     // while(1)
     // {
     //     if (checkWiFiConnected()) break;
     //     wait(1);
     // }
//     printf("Connected\n");
    // If we're not blocked by accept or others, obtain the latest status
    wigo.get_ip_config(&ipinfo2);                  // data is returned in the ipinfo2 structure
    printf("\n*** Wi-Go board DHCP assigned IP Address = %d.%d.%d.%d\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);
    LED_D3_ON;

    t = wigo._socket.mdnsAdvertiser(1, DevServname, sizeof(DevServname));
    printf("mDNS Status= %x\n", t);
}

void run_tcp_server(void)
{
    LED_D3_OFF;
    LED_D2_OFF;
    printf("\n\nStarting TCP/IP Server\n");
    init_tcp();
    create_tcp_connection(TCPIP_PORT);
}

bool check_dhcp(void)
{
    int32_t t;
    //static uint8_t obtainIpInfoFlag = FALSE;

    // Wait until for dhcp
    while (wigo.is_dhcp_configured() == false)
    {
         wait_ms(500);
         printf("waiting\n");
    }

    // Check if we are in a connected state.  If so, set flags and LED
    //if (wigo.is_connected() == true)
    //{
        //if (obtainIpInfoFlag == FALSE)
        //{
        //    obtainIpInfoFlag = TRUE;             // Set flag so we don't constantly turn the LED on
            //LED_D3_ON;
            //If Smart Config was performed, we need to send complete notification to the configure (Smart Phone App)
            // if (ConnectUsingSmartConfig==1)
            // {
            //     ConnectUsingSmartConfig = 0;
            //     SmartConfigProfilestored = SMART_CONFIG_SET;
            // }

        //}
        t = wigo._socket.mdnsAdvertiser(1, DevServname, sizeof(DevServname));
        printf("mDNS Status= %x\n", t);
        return true;
    //}
    //return FALSE;
}

void do_FTC(void)
{
    printf("Running First Time Configuration\n");
    // server_running = 1;
    //runSmartConfig = 1;
    start_smart_config();
    init_tcp();
    RED_OFF;
    GREEN_OFF;
    BLUE_OFF;
    userFS.FTC = 1;
    wigo._nvmem.write( NVMEM_USER_FILE_1_FILEID, sizeof(userFS), 0, (uint8_t *) &userFS);
    //runSmartConfig = 0;
    SmartConfigProfilestored = SMART_CONFIG_SET;
    wigo._wlan.stop();
    printf("FTC finished\n");
}