Simple LED control project using CC3100 as Access Point and socket
Fork of cc3100_Test_Demo by
Diff: main.cpp
- Revision:
- 0:e89ba455dbcf
- Child:
- 3:b89198ac2efe
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Feb 10 12:09:29 2015 +0000 @@ -0,0 +1,361 @@ +/* + * main.c - sample application to switch to AP mode and ping client + * + * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * Neither the name of Texas Instruments Incorporated nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * Application Name - Getting started with Wi-Fi Access-Point mode + * Application Overview - This sample application demonstrates how + * to configure CC3100 in Access-Point mode. Any + * WLAN station in its range can connect/communicate + * to/with it as per the standard networking protocols. + * On a successful connection, the device ping's the + * connected station. + * Application Details - http://processors.wiki.ti.com/index.php/CC31xx_Getting_Started_with_WLAN_AP + * doc\examples\getting_started_with_wlan_ap.pdf + */ + +#include "cc3100_simplelink.h" +#include "cc3100_sl_common.h" + +#include "fPtr_func.h" +#include "cc3100_spi.h" +#include "myBoardInit.h" + +using namespace mbed_cc3100; + +class cc3100_netcfg *_netcfg; + +#if (THIS_BOARD == MBED_BOARD_LPC1768) +//cc3100 _cc3100(p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck +cc3100 _cc3100(p9, p10, p8, SPI(p11, p12, p13));//LPC1768 irq, nHib, cs, mosi, miso, sck +Serial pc(USBTX, USBRX);//lpc1768 +#elif (THIS_BOARD == ST_MBED_NUCLEOF411) +cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF411 irq, nHib, cs, mosi, miso, sck +Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF411 +#elif (THIS_BOARD == ST_MBED_NUCLEOF401) +cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF401 irq, nHib, cs, mosi, miso, sck +Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF401 +#elif (THIS_BOARD == EA_MBED_LPC4088) +cc3100 _cc3100(p9, p10, p8, SPI(p5, p6, p7));//LPC4088 irq, nHib, cs, mosi, miso, sck +Serial pc(USBTX, USBRX);//EA_lpc4088 +#elif (THIS_BOARD == ST_MBED_NUCLEOF103) +cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF103 irq, nHib, cs, mosi, miso, sck +Serial pc(SERIAL_TX, SERIAL_RX); +#else + +#endif + +#define APPLICATION_VERSION "1.1.0" + +/* + * GLOBAL VARIABLES -- Start + */ +int32_t demo = 1; + +/* + * GLOBAL VARIABLES -- End + */ + + +/* + * STATIC FUNCTION DEFINITIONS -- Start + */ + +static void displayBanner(); +/* + * STATIC FUNCTION DEFINITIONS -- End + */ + +void station_app(void); +void AP_app(void); + +/* + * Application's entry point + */ + + +int main(void) { + + pc.baud(115200); + + int32_t retVal = -1; + + retVal = _cc3100.initializeAppVariables(); + ASSERT_ON_ERROR(retVal); + + displayBanner(); + + _cc3100.CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE); + g_PingPacketsRecv = 0; + + /* + * Following function configures the device to default state by cleaning + * the persistent settings stored in NVMEM (viz. connection profiles & + * policies, power policy etc) + * + * Applications may choose to skip this step if the developer is sure + * that the device is in its default state at start of application + * + * Note that all profiles and persistent settings that were done on the + * device will be lost + */ + retVal = _cc3100.configureSimpleLinkToDefaultState(); + + if(retVal < 0) { + if (DEVICE_NOT_IN_STATION_MODE == retVal) + printf(" Failed to configure the device to its default state \n\r"); + + LOOP_FOREVER(); + } + + printf(" Device is configured in it's default state \n\r"); + + /* + * Assumption is that the device is configured in station mode already + * and it is in its default state + */ + /* Initializing the CC3100 device */ + + if(!(demo ==1)){ + retVal = _cc3100.sl_Start(0, 0, 0); + + if ((retVal < 0) || (ROLE_STA != retVal) ){ + printf(" Failed to start the device \n\r"); + LOOP_FOREVER(); + } + + printf(" Device started as STATION \n\r"); + } + + if(demo == 0 ){ + station_app(); + }else{ + AP_app(); + } + return 0; +} + +/*! + \brief This function displays the application's banner + + \param None + + \return None +*/ +static void displayBanner() +{ + if(!demo){ + printf("\n\r\n\r"); + printf(" Getting started with WLAN access-point application - Version "); + printf("%s",APPLICATION_VERSION); + printf("\n\r*******************************************************************************\n\r"); + + }else{ + printf("\n\r\n\r"); + printf(" Getting started with station application - Version "); + printf(" %s", APPLICATION_VERSION); + printf("\n\r*******************************************************************************\n\r"); + } +} + +void AP_app(void){ + + SlPingStartCommand_t PingParams = {0}; + SlPingReport_t Report = {0}; + SlNetCfgIpV4Args_t ipV4 = {0}; + SlNetAppDhcpServerBasicOpt_t dhcpParams = {0}; + + uint8_t SecType = 0; + int32_t role = ROLE_STA; + int32_t retVal = -1; + + /* + * Assumption is that the device is configured in station mode already + * and it is in its default state + */ + role = _cc3100.sl_Start(0, 0, 0); + if (ROLE_AP == role) { + /* If the device is in AP mode, we need to wait for this event before doing anything */ + while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) { + _cc3100.SlNonOsMainLoopTask(); + } + } else { + /* Configure CC3100 to start in AP mode */ + retVal = _cc3100.WlanSetMode(ROLE_AP); + if(retVal < 0) + LOOP_FOREVER(); + + retVal = _cc3100.sl_Stop(SL_STOP_TIMEOUT); + if(retVal < 0) + LOOP_FOREVER(); + + _cc3100.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED); + + role = _cc3100.sl_Start(0, 0, 0); + if (ROLE_AP == role) { + /* If the device is in AP mode, we need to wait for this event before doing anything */ + while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) { + _cc3100.SlNonOsMainLoopTask(); + } + } else { + printf(" Device couldn't be configured in AP mode \n\r"); + LOOP_FOREVER(); + } + } + + printf(" Ready to configue SSID\r\n"); + + /* Configure the SSID of the CC3100 */ + retVal = _cc3100.WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(SSID_AP_MODE), (uint8_t *)SSID_AP_MODE); + if(retVal < 0) + LOOP_FOREVER(); + + SecType = SEC_TYPE_AP_MODE; + /* Configure the Security parameter the AP mode */ + retVal = _cc3100.WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (uint8_t *)&SecType); + if(retVal < 0) + LOOP_FOREVER(); + + retVal = _cc3100.WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, strlen(PASSWORD_AP_MODE), (uint8_t *)PASSWORD_AP_MODE); + if(retVal < 0){ + LOOP_FOREVER(); + } + + ipV4.ipV4 = _netcfg->SL_IPV4_VAL(192,168,0,1);//CONFIG_IP; + ipV4.ipV4Mask = _netcfg->SL_IPV4_VAL(255,255,255,0);//CONFIG_MASK; + ipV4.ipV4Gateway = _netcfg->SL_IPV4_VAL(192,168,0,1);//CONFIG_GATEWAY; + ipV4.ipV4DnsServer = _netcfg->SL_IPV4_VAL(192,168,0,1);//CONFIG_DNS; + + /* Configure the Static IP */ + retVal = _cc3100.NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE,1,sizeof(SlNetCfgIpV4Args_t), (uint8_t *)&ipV4); + if(retVal < 0) + LOOP_FOREVER(); + + dhcpParams.lease_time = IP_LEASE_TIME; + dhcpParams.ipv4_addr_start = _netcfg->SL_IPV4_VAL(192,168,0,100);//DHCP_START_IP; + dhcpParams.ipv4_addr_last = _netcfg->SL_IPV4_VAL(192,168,0,200);//DHCP_END_IP; + + retVal = _cc3100.NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT, sizeof(SlNetAppDhcpServerBasicOpt_t), (uint8_t*)&dhcpParams); + if(retVal < 0) + LOOP_FOREVER(); + + /* Restart the CC3100 */ + retVal = _cc3100.sl_Stop(SL_STOP_TIMEOUT); + if(retVal < 0) + LOOP_FOREVER(); + + g_Status = 0; + + role = _cc3100.sl_Start(0, 0, 0); + + if (ROLE_AP == role) { + /* If the device is in AP mode, we need to wait for this event before doing anything */ + while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) { + _cc3100.SlNonOsMainLoopTask(); + } + } else { + printf(" Device couldn't enter AP mode \n\r"); + LOOP_FOREVER(); + } + printf(" Device started as Access Point\n\r"); + + /* Wait */ + printf(" Waiting for clients to connect...!\n\r"); + while((!_cc3100.IS_IP_LEASED(g_Status,STATUS_BIT_IP_LEASED)) || (!_cc3100.IS_STA_CONNECTED(g_Status,STATUS_BIT_STA_CONNECTED))) { + _cc3100.SlNonOsMainLoopTask(); + } + printf(" Client connected to the device \n\r"); + printf(" Pinging...! \n\r"); + + /* Set the ping parameters */ + PingParams.PingIntervalTime = PING_INTERVAL; + PingParams.PingSize = PING_SIZE; + PingParams.PingRequestTimeout = PING_TIMEOUT; + PingParams.TotalNumberOfAttempts = PING_ATTEMPTS; + PingParams.Flags = 0; + PingParams.Ip = g_StationIP; /* Fill the station IP address connected to CC3100 */ + + /* Ping client connected to CC3100 */ + retVal = _cc3100.NetAppPingStart((SlPingStartCommand_t*)&PingParams, SL_AF_INET, (SlPingReport_t*)&Report, &SimpleLinkPingReport); + if(retVal < 0) + LOOP_FOREVER(); + + /* Wait */ + while(!_cc3100.IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { + _cc3100.SlNonOsMainLoopTask(); + } + + if (0 == g_PingPacketsRecv) { + printf(" A STATION couldn't connect to the device \n\r"); + //ASSERT_ON_ERROR(LAN_CONNECTION_FAILED); + printf(" ERROR code %d\n\r", LAN_CONNECTION_FAILED); + } + + printf(" Device and the station are successfully connected \n\r"); + //return SUCCESS; +} + +void station_app(void){ + + int32_t retVal = -1; + + /* Connecting to WLAN AP */ + retVal = _cc3100.establishConnectionWithAP(); + if(retVal < 0) + { + printf(" Failed to establish connection w/ an AP \n\r"); + LOOP_FOREVER(); + } + + printf(" Connection established w/ AP and IP is acquired \n\r"); + printf(" Pinging...! \n\r"); + retVal = _cc3100.checkLanConnection(); + if(retVal < 0) + { + printf(" Device couldn't connect to LAN \n\r"); + LOOP_FOREVER(); + } + + retVal = _cc3100.checkInternetConnection(); + if(retVal < 0) + { + printf(" Device couldn't connect to the internet \n\r"); + LOOP_FOREVER(); + } + + printf(" Device successfully connected to the LAN and internet \n\r"); +} + +