David Fletcher
/
CC3000WebServer
A Port of TI's Webserver for the CC3000
WebServer/WebServerApp.cpp
- Committer:
- dflet
- Date:
- 2013-09-16
- Revision:
- 2:e6a185df9e4c
- Parent:
- 0:6ad60d78b315
File content as of revision 2:e6a185df9e4c:
/***************************************************************************** * * WebServerApp.c - CC3000 Slim Driver Implementation. * Copyright (C) 2011 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. * *****************************************************************************/ #include "mbed.h" #include "wlan.h" #include "evnt_handler.h" // callback function declaration #include "nvmem.h" #include "socket.h" #include "netapp.h" #include "host_driver_version.h" #include "cc3000.h" #include "Common.h" #include "demo_config.h" #include "HttpString.h" //#include <msp430.h> #include "Board.h" #include "HttpCore.h" #include "Wheel.h" #include "dispatcher.h" #define FALSE 0 #define SERVERAPPVERSION "v1.10.11.6.8.1" //ADC pin is pin20 volatile unsigned long ulCC3000Connected,ulCC3000DHCP,OkToDoShutDown; unsigned char obtainIpInfoFlag = FALSE; unsigned char ConnectUsingSmartConfig; tNetappIpconfigRetArgs *ipconfig; char DevServname[] = {'C','C','3','0','0','0'}; volatile char runSmartConfig = 0; unsigned char mDNSValid, skipCount, mDNSSend; int8_t isInitialized = FALSE; void ManualConnect(void); int String_utoa(int uNum, char *pString) { char digits[] = "0123456789"; char* ptr; int uLength; int uTemp = uNum; // value 0 is a special format if (uNum == 0) { uLength = 1; *pString = '0'; return uLength; } // Find out the length of the number, in decimal base uLength = 0; while (uTemp > 0) { uTemp /= 10; uLength++; } // Do the actual formatting, right to left uTemp = uNum; ptr = (char*)pString + uLength; while (uTemp > 0) { --ptr; *ptr = digits[uTemp % 10]; uTemp /= 10; } return uLength; } int iptostring(unsigned char *ip, char *ipstring) { int temp,i, length, uLength; char *ptr; ip =ip +3; ptr = ipstring; uLength = 0; for (i=0; i<4; i++) { temp = *ip; length = String_utoa((unsigned long) temp, ptr); ptr = ptr + length; uLength += length; *ptr = '.'; ptr++; uLength++; ip--; } return (uLength-1); } //***************************************************************************** // //! main //! //! \param None //! //! \return none //! //! \brief The main loop is executed here // //***************************************************************************** int main() { char ipvalue[15]; int length; runSmartConfig = 0; obtainIpInfoFlag = 0; skipCount = 0; mDNSValid = 0; mDNSSend =0; unsigned char buff[5]; int rval; //Stop watch dog timer, In IAR this is done in low_level_init.c file //#ifdef __CCS__ // WDTCTL = WDTPW + WDTHOLD; //#endif // Start CC3000 State Machine resetCC3000StateMachine(); // // Board Initialization start // initDriver(); isInitialized = TRUE; // For manual connect Wheel_init(); Wheel_enable(); //__enable_interrupt(); DispatcherUartSendPacket("\r\n\r\n--Initializing Application--",32); DispatcherUartSendPacket("\r\nWeb Server App Version=",25); DispatcherUartSendPacket(SERVERAPPVERSION,14); DispatcherUartSendPacket("\r\n", 2); if (nvmem_read_sp_version(buff)!=0){ printf("nvmem_read_sp_version failed...\r\n"); } else { printf("Firmware version: %d.%d\r\n",buff[0], buff[1]); } while(1) { // Perform Smart Config if button pressed if(runSmartConfig == 1) { mDNSValid = 0; // Turn Off PAD LED's turnLedOff(ind1); turnLedOff(ind2); turnLedOff(ind3); turnLedOff(ind4); turnLedOff(LED8); // Start the Smart Config Process StartSmartConfig(); runSmartConfig = 0; } if(!(currentCC3000State() & CC3000_ASSOC)) { //Connect via profile (unsol connect) or :- // ManualConnect(); // Wait until connection is finished while (!(currentCC3000State() & CC3000_ASSOC)) { wait_us(5); //__delay_cycles(100); // Check if user pressed button to do Smart Config if(runSmartConfig == 1) break; } } // Print out connection status if(currentCC3000State() & CC3000_IP_ALLOC && obtainIpInfoFlag == FALSE) { // Set flag so we don't constantly obtain the IP info obtainIpInfoFlag = TRUE; turnLedOn(CC3000_IP_ALLOC_IND); } if(currentCC3000State() & CC3000_IP_ALLOC && obtainIpInfoFlag == TRUE) { //If smart config was done was broadcast mdns signal if (ConnectUsingSmartConfig==1) { mdnsAdvertiser(1,DevServname, sizeof(DevServname)); ConnectUsingSmartConfig = 0; } mDNSValid =1; skipCount =0; ipconfig = getCC3000Info(); length = iptostring(ipconfig->aucIP, ipvalue); DispatcherUartSendPacket("\r\nIP = ", 7); DispatcherUartSendPacket(ipvalue, length); DispatcherUartSendPacket("\r\n", 2); //Initialize and start the HTTP server HttpServerInitAndRun(); } } return 1; } /************************************************************************************ // This is an example of how you'd connect the CC3000 to an AP without using // Smart Config or a stored profile. // // All the code above wlan_connect() is just for this demo program; if you're // always going to connect to your network this way you wouldn't need it. ************************************************************************************/ void ManualConnect() { char ssidName[] = "*********"; //char AP_KEY[] = "********";//Refer to demo_config.h int8_t rval; if (!isInitialized) { printf("CC3000 not initialized; can't run manual connect.\r\n"); return; } printf("Starting manual connect...\r\n"); printf((" Disabling auto-connect policy...\r\n")); rval = wlan_ioctl_set_connection_policy(0, 0, 0); printf(" Deleting all existing profiles...\r\n"); rval = wlan_ioctl_del_profile(255); printf(" Waiting until disconnected...\r\n"); while (ulCC3000Connected == 1) { wait_ms(100); } printf(" Manually connecting...\r\n"); // Parameter 1 is the security type: WLAN_SEC_UNSEC, WLAN_SEC_WEP, // WLAN_SEC_WPA or WLAN_SEC_WPA2 // Parameter 3 is the MAC adddress of the AP. All the TI examples // use NULL. I suppose you would want to specify this // if you were security paranoid. rval = wlan_connect(WLAN_SEC_WPA2, ssidName, strlen(ssidName), NULL, (unsigned char *)AP_KEY, strlen(AP_KEY)); if (rval==0) { printf(" Manual connect success.\r\n"); } else { printf(" Unusual return value: "); printf("%d\r\n",rval); } return; }