Port from Avnet's Internet Of Things full WiGo demo: SmartConfig - WebServer - Exosite - Android sensor Fusion App

Dependencies:   NVIC_set_all_priorities mbed cc3000_hostdriver_mbedsocket TEMT6200 TSI Wi-Go_eCompass_Lib_V3 WiGo_BattCharger

Wi-Go Reference Design Overview


For additional information on Wi-Go, please visit http://www.em.avnet.com/wi-go
For additional information on Freescale eCompass, please visit
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=E-Compass
Ported from Avnet's Wi-Go KEIL code.
Special thanks to Jim Carver from Avnet for providing the Wi-Go board and for his assistance.


Multiple Wi-Fi applications are provided within the latest version of Wi-Go software:

  • SmartConfig App for auto-setup of Wi-Go network parameters.
  • WebServer display of live sensor data.
  • Exosite portal sensor data feed by Wi-Go.
  • Freescale's Sensor Fusion App data feed by Wi-Go.

Wi-Go is intended for "untethered" portable operation (using it's high-capacity Lithium-Polymer battery). The serial terminal text interface is only required for initial setup, thereafter selection of an application from those available is via finger position on the Touch Slider during the initial 6 second startup period.

Running the Wi-Go Demo Suite

Warning

The on-board Firmware must be updated to mbed enable a Wi-Go system.
Goto the Component page to get the FirmwareUpdate tool (scroll down to the FirmwareUpdate topic).

MAG3110 sensor and eCompass Calibration!

As with the other sensor applications, the eCompass function requires quality calibration data to achieve best accuracy.
For the first 15 seconds after power-up it is recommended that "Figure 8" movements with Wi-Go be done in a smooth, repetitive pattern. Don't touch the slider pad during calibration.

Startup
The RGB LED blinks in a GREEN-ORANGE sequence to inform the user the module is waiting for input.
The RGB LED color designates which of the following Apps to launch.

RGB LED ColorApplication to Launch
OrangeErase all wireless profiles
PurpleSmartConfig
BlueWebServer
RedExosite Data Client
GreenAndroid Server

Swipe your index finger across the slider pad, the RGB LED color will change at approximately 20% intervals.
Removing your finger latches the last color displayed. After about 3 seconds, the selected app will start.
Another app can be selected when the slider pad is touched again within the 3 seconds timeout.

After launch of Exosite or Android Server Apps, the eCompass function then controls the RGB LED.
(not in WebServer mode where RGB LEDs are manually controlled by the User).

RGB LED ColorDirection Indication
BlueNear to North
GreenNorth
RedEast / West
PurpleSouth

__Note!__ The D1, D2 and D3 User LEDs on Wi-Go adhere to the following convention for the different Apps

User LED#Description of function controlling the LED
D1is the board heartbeat, derived from the timer interrupt
D2indicates network activity as follows:
Web Server Wi-Go webpage is being served.
Exosite Client Wi-Go is sending data.
Android App Wi-Go is sending data
D3WLAN Network is Connected

Detail of Wi-Go Applications

App #1: SmartConfig
See TI's pages on how to use the SmartConfig tool:

  • Preferred method : Configuration using the SmartConfig tool
  • SmartConfig download: Smart Config and Home Automation
    • iOS app : available at Apple app store.
    • Android app : download and install the Android SmartConfig Application on a PC.
      This file contains the source code as well as the compiled APK file.
      The APK file is stored in ti\CC3000AndroidApp\SmartConfigCC3X\bin.

App #2: WebServer display of live sensor data
__Note!__
When using the WebServer for the first time on a Wi-Fi network you will need to determine the IP address that's assigned to Wi-Go by the DHCP Server. To do this, it is recommended you use one of the following two methods:

  • While Wi-Go is initially tethered to a laptop via USB, launch of the WebServer Application and note the IP address that is reported on the terminal screen immediately after selection of this App.
  • Alternatively, use a 3rd party LAN SCAN type tool to view Wi-Go's IP address.
    eg. FING, - available for free download from Google Play or iTunes App Stores…

Wi-Go's WebServer Application is selected as follows:

  • Press RESET, followed by the eCompass Calibration (mentioned at the top of this page).
    Then use index finger on slider to select the WebServer App (RGB LED = BLUE).
    At end of the 3 second selection period the WebServer App shall launch.
  • If you are tethered to a laptop and have a terminal open the Wi-Fi network connection confirmation will be seen, eg.

'*** Wi-Go board DHCP assigned IP Address = 192.168.43.102
  • Once you have noted Wi-Go's reported IP address, the USB cable may be disconnected and Wi-Go then used as intended, running on it's own battery power.
  • Use an Internet Browser on SmartPhone/Tablet/Laptop (connected to same Hot-Spot/Wireless Router subnet), to now connect to the noted Wi-Go IP address and view the WebServer output: /media/uploads/frankvnk/wi-go_webserver.png
  • the Webserver sensor data is auto-updated every 2 seconds a manual refresh (F5 on laptop).
  • In the event of an error, press refresh to regenerate the screen.
  • Use the mouse (or touch-screen) to exercise the RGB LED output.

App #3: Exosite Data Client
Wi-Go's sensor data gets transmitted via Wi-Fi to a cloud-based Exosite portal where the sensor measurements are displayed graphically on a "dashboard". Users can create unique customized dashboards using drag and drop GUI widgets from the library provided on the Exosite website.
__Note!__ For the Exosite application a "live" connection to the Internet is required !!!

  • Press RESET, followed by the eCompass Calibration (mentioned at the top of this page).
    Then use index finger on slider to select the Exosite Client App (RGB LED = RED)
  • On launching this App, note Wi-Go's MAC address displayed on your terminal
    (if not running a terminal use FING or other WLAN Scan tool to determine Wi-Go's MAC address) /media/uploads/frankvnk/mac_address.png
  • Using your computer's internet browser, go to avnet.exosite.com and sign-up for a free Avnet Trial Exosite Account: /media/uploads/frankvnk/avnet_trial_exosite.png
  • On the next screen, click on the Sign-Up Now button in the displayed Avnet Trial account option.
  • Complete the Account Info and Contact Info then click on Create Account (make sure to use a valid email address!).
  • Check for new incoming email from avnet.exosite.com to the address you provided and click on the link in this email to activate your new Exosite account.
  • Once activated, login using the email address and password that you chose in your registration. Your Exosite Portal and Dashboard should now display. The first time you log-in to your new account, the default Home dashboard will be displayed, pre-configured with two widgets. On the left is the Welcome widget for tips and information. On the right is the Device List widget.
    Dashboards are configurable, so at any time this default dashboard can be changed, widgets deleted and added (Clicking the upside-down triangle icon in a widget's Title bar will allow you to edit it).
  • Before going further with the Dashboard, you need to connect your Wi-Go device to your Exosite account. Do this by going to the left sidebar and selecting Devices followed by selecting the +Add Device link (on right of screen). /media/uploads/frankvnk/add_device.png
  • In the Setup screens that follow, enter the following
Select a supported deviceWi-Go
Enter device MAC Addressnn:nn:nn:nn:nn:nn [your Wi-Go's MAC address including colons]
Enter device Name[choose a descriptive name]
Enter device Location[description of your location]
  • Once completed, under Devices the name chosen for the added Wi-Go device should now be listed.
  • Click on this new Wi-Go device to examine (and edit if necessary) it's Device Information screen.
    /media/uploads/frankvnk/device_information.png
  • Click the CLOSE button to exit the Device Information screen.
  • On your Wi-Go kit now press RESET, followed by the eCompass Calibration (mentioned at the top of this page)
    and again select the Exosite Client App (RGB LED = RED) using your index finger.
  • Refresh your browser (press F5) a couple've times until the Active indicator changes to On (Green).
    /media/uploads/frankvnk/active_indicator.png
  • From the left sidebar click on Home and click on the recently named Wi-Go device which is located under the Device List.
    This will bring-up a default dashboard display similar to what's shown below.
    (Dashboards are typically accessed via the Dashboards menu entry). Check the dashboard is updating with live data by moving your Wi-Go Kit through different orientations.
    /media/uploads/frankvnk/dashboard.png
  • To create a custom dashboard, select Dashboards from the sidebar menu, followed by +Add Dashboard (on right side of Your Dashboards title bar). After completion of the initial configuration screen you will then be able to add Widgets to display the various Wi-Go data sources as well as pictures and text to support your application.
  • More guidance on the creation, editing and sharing of custom dashboards is available under the Exosite support pages

App #4: Android Sensor Fusion App

  • Press RESET, followed by the eCompass Calibration (mentioned at the top of this page)
    , then use index finger on slider to select the Android App (RGB LED = GREEN)
  • Freescale's ''Xtrinsic Sensor Fusion Toolbox'" will run on Android 3.0 or above phone or tablet. Free to download from Google Play, type Sensor fusion in the search box to find it. freescale.sensors.sfusion /media/uploads/frankvnk/sensor_fusion_toolbox.png
  • The Freescale App is well documented. To access the built-in documentation, press the NAV button at top of screen followed by Documentation from the scroll-down menu:
    /media/uploads/frankvnk/sensor_fusion_doc.png
  • Freescale's sensors site provides additional resources such as this overview: free-android-app-teaches-sensor-fusion-basics
  • Go to the Options Menu and select Preferences… /media/uploads/frankvnk/sensor_fusion_preferences.png
  • The following items need to be taken care of:
Enter WiGo's IP address
Enter the SSID (of the Hot-Spot or Wireless Access Point used by Wi-Go)
  • Press Save and Exit!
    /media/uploads/frankvnk/sensor_fusion_save_and_exit.png
  • Exit the Application completely then re-launch the Sensor Fusion Application.
  • Select the ''Source/Algorithm'" menu and change the data source to Wi-Go mag/accel /media/uploads/frankvnk/sensor_fusion_wigo_mag_accel.png
  • The Android App should now be displaying a 3-D image of Wi-Go that you can rotate and flip-over by moving the Wi-Go board accordingly…
  • Use NAV > Device View to display if this view does not come-up by default. /media/uploads/frankvnk/sensor_fusion_nav_device_view.png
  • A Serial Terminal connection is not necessary but if you happen to have one open you should see the following messages as Wi-Go connects to the Android App:
    "Server waiting for connection" followed by
    "connected, transmit buffer size= 96", and then
    "input = 0123456789"
    at which time Wi-Go starts streaming data to the Android App.
Committer:
frankvnk
Date:
Wed Oct 23 12:01:30 2013 +0000
Revision:
1:99bfc8d68fd3
Parent:
0:ebcd5ecff2cf
Child:
2:dac99c6c56d3
Webserver functional using ProcessWlanInterrupt flag instead of NVIC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:ebcd5ecff2cf 1
frankvnk 0:ebcd5ecff2cf 2 /*****************************************************************************
frankvnk 0:ebcd5ecff2cf 3 * Dynamic HTML string handlers:
frankvnk 0:ebcd5ecff2cf 4 * Nine dynamic HTML fields are updated on browser refresh or button press:
frankvnk 0:ebcd5ecff2cf 5 * Acceleration
frankvnk 0:ebcd5ecff2cf 6 * Magnetometer
frankvnk 0:ebcd5ecff2cf 7 * eCompass
frankvnk 0:ebcd5ecff2cf 8 * Altitude
frankvnk 0:ebcd5ecff2cf 9 * Battery Voltage
frankvnk 0:ebcd5ecff2cf 10 * Ambient Light
frankvnk 0:ebcd5ecff2cf 11 * Temperature
frankvnk 0:ebcd5ecff2cf 12 * Slider Position
frankvnk 0:ebcd5ecff2cf 13 * Page Views
frankvnk 0:ebcd5ecff2cf 14 *
frankvnk 0:ebcd5ecff2cf 15 * CGI HTML forms:
frankvnk 0:ebcd5ecff2cf 16 * Three CGI form inputs are used to submit data from browser to the Server:
frankvnk 0:ebcd5ecff2cf 17 * On screen buttons: -Red-, Green, Blue (for control of RGB LED output color)
frankvnk 0:ebcd5ecff2cf 18 *
frankvnk 0:ebcd5ecff2cf 19 * myindex[] contains the HTML string that defines the webpage that is served
frankvnk 0:ebcd5ecff2cf 20 * Use an online HTML validator to verify HTML code before running it on the MCU
frankvnk 0:ebcd5ecff2cf 21 * eg.
frankvnk 0:ebcd5ecff2cf 22 * www.w3schools.com/tags/tryit.asp?filename=tryhtml_div_test
frankvnk 0:ebcd5ecff2cf 23 * www.onlinewebcheck.com/check.php?adv=1
frankvnk 0:ebcd5ecff2cf 24 * Note: Before checking the HTML in one of these validators,
frankvnk 0:ebcd5ecff2cf 25 * strip-out all “\” backslash characters (using search & replace)
frankvnk 0:ebcd5ecff2cf 26 *
frankvnk 0:ebcd5ecff2cf 27 * Webserver code is based on TI's CC3000 Simple HTTP Webserver:
frankvnk 0:ebcd5ecff2cf 28 * http://processors.wiki.ti.com/index.php/CC3000_Wi-Fi_for_MCU
frankvnk 0:ebcd5ecff2cf 29 *
frankvnk 0:ebcd5ecff2cf 30 * More detail on implementation of this Webserver App is available here:
frankvnk 0:ebcd5ecff2cf 31 * http://processors.wiki.ti.com/index.php/CC3000_HTTP_Server_Demo_Session
frankvnk 0:ebcd5ecff2cf 32 *
frankvnk 0:ebcd5ecff2cf 33 * A more advanced Webserver and Client App is also available from TI for the CC3000:
frankvnk 0:ebcd5ecff2cf 34 * http://processors.wiki.ti.com/index.php/CC3000_Web_Server_Client_Application
frankvnk 0:ebcd5ecff2cf 35 * (at this time not yet ported to Kinetis-L as the host processor)
frankvnk 0:ebcd5ecff2cf 36 *
frankvnk 0:ebcd5ecff2cf 37 ******************************************************************************
frankvnk 0:ebcd5ecff2cf 38 *
frankvnk 0:ebcd5ecff2cf 39 * demo.c - CC3000 Main Demo Application
frankvnk 0:ebcd5ecff2cf 40 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
frankvnk 0:ebcd5ecff2cf 41 *
frankvnk 0:ebcd5ecff2cf 42 * Redistribution and use in source and binary forms, with or without
frankvnk 0:ebcd5ecff2cf 43 * modification, are permitted provided that the following conditions
frankvnk 0:ebcd5ecff2cf 44 * are met:
frankvnk 0:ebcd5ecff2cf 45 *
frankvnk 0:ebcd5ecff2cf 46 * Redistributions of source code must retain the above copyright
frankvnk 0:ebcd5ecff2cf 47 * notice, this list of conditions and the following disclaimer.
frankvnk 0:ebcd5ecff2cf 48 *
frankvnk 0:ebcd5ecff2cf 49 * Redistributions in binary form must reproduce the above copyright
frankvnk 0:ebcd5ecff2cf 50 * notice, this list of conditions and the following disclaimer in the
frankvnk 0:ebcd5ecff2cf 51 * documentation and/or other materials provided with the
frankvnk 0:ebcd5ecff2cf 52 * distribution.
frankvnk 0:ebcd5ecff2cf 53 *
frankvnk 0:ebcd5ecff2cf 54 * Neither the name of Texas Instruments Incorporated nor the names of
frankvnk 0:ebcd5ecff2cf 55 * its contributors may be used to endorse or promote products derived
frankvnk 0:ebcd5ecff2cf 56 * from this software without specific prior written permission.
frankvnk 0:ebcd5ecff2cf 57 *
frankvnk 0:ebcd5ecff2cf 58 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
frankvnk 0:ebcd5ecff2cf 59 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
frankvnk 0:ebcd5ecff2cf 60 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
frankvnk 0:ebcd5ecff2cf 61 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
frankvnk 0:ebcd5ecff2cf 62 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
frankvnk 0:ebcd5ecff2cf 63 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
frankvnk 0:ebcd5ecff2cf 64 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
frankvnk 0:ebcd5ecff2cf 65 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
frankvnk 0:ebcd5ecff2cf 66 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
frankvnk 0:ebcd5ecff2cf 67 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
frankvnk 0:ebcd5ecff2cf 68 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
frankvnk 0:ebcd5ecff2cf 69 *
frankvnk 0:ebcd5ecff2cf 70 *****************************************************************************/
frankvnk 0:ebcd5ecff2cf 71
frankvnk 0:ebcd5ecff2cf 72 #include "mbed.h"
frankvnk 0:ebcd5ecff2cf 73 #include "defLED.h"
frankvnk 0:ebcd5ecff2cf 74 #include "demo.h"
frankvnk 0:ebcd5ecff2cf 75 //#include "doTCPIP.h"
frankvnk 0:ebcd5ecff2cf 76 //#include "httpserver.h"
frankvnk 0:ebcd5ecff2cf 77 #include "TCPSocketConnection.h"
frankvnk 0:ebcd5ecff2cf 78 #include "TCPSocketServer.h"
frankvnk 0:ebcd5ecff2cf 79
frankvnk 0:ebcd5ecff2cf 80 #include "AvnetHTML.h"
frankvnk 0:ebcd5ecff2cf 81 #include "TSISensor.h"
frankvnk 0:ebcd5ecff2cf 82 #include "Wi-Go_eCompass_Lib_V3.h"
frankvnk 0:ebcd5ecff2cf 83
frankvnk 0:ebcd5ecff2cf 84
frankvnk 0:ebcd5ecff2cf 85 TCPSocketServer server;
frankvnk 0:ebcd5ecff2cf 86 TCPSocketConnection client;
frankvnk 0:ebcd5ecff2cf 87
frankvnk 0:ebcd5ecff2cf 88 extern DigitalOut ledr;
frankvnk 0:ebcd5ecff2cf 89 extern DigitalOut ledg;
frankvnk 0:ebcd5ecff2cf 90 extern DigitalOut ledb;
frankvnk 0:ebcd5ecff2cf 91 extern DigitalOut led1;
frankvnk 0:ebcd5ecff2cf 92 extern DigitalOut led2;
frankvnk 0:ebcd5ecff2cf 93 extern DigitalOut led3;
frankvnk 0:ebcd5ecff2cf 94 extern TSISensor tsi;
frankvnk 0:ebcd5ecff2cf 95
frankvnk 0:ebcd5ecff2cf 96 // Setup the functions to handle our CGI parameters
frankvnk 0:ebcd5ecff2cf 97 cgi_handler pHandlers;
frankvnk 0:ebcd5ecff2cf 98 dyn_html_handler htmlHandlers;
frankvnk 0:ebcd5ecff2cf 99
frankvnk 0:ebcd5ecff2cf 100 extern tNetappIpconfigRetArgs ipinfo2;
frankvnk 0:ebcd5ecff2cf 101
frankvnk 0:ebcd5ecff2cf 102 extern axis6_t axis6;
frankvnk 0:ebcd5ecff2cf 103 extern int server_running;
frankvnk 0:ebcd5ecff2cf 104 extern unsigned char newData;
frankvnk 0:ebcd5ecff2cf 105 extern unsigned short adc_sample3;
frankvnk 0:ebcd5ecff2cf 106
frankvnk 0:ebcd5ecff2cf 107 /** \brief Pointer to the index HTML page */
frankvnk 0:ebcd5ecff2cf 108 char * indexPage;
frankvnk 0:ebcd5ecff2cf 109
frankvnk 0:ebcd5ecff2cf 110 /** \brief Pointer to CGI handler structure */
frankvnk 0:ebcd5ecff2cf 111 cgi_handler * chList;
frankvnk 0:ebcd5ecff2cf 112
frankvnk 0:ebcd5ecff2cf 113 /** \brief Pointer to Dynamic HTML handler structure */
frankvnk 0:ebcd5ecff2cf 114 dyn_html_handler * htmlList;
frankvnk 0:ebcd5ecff2cf 115
frankvnk 0:ebcd5ecff2cf 116 /** \brief Pointer to Dynamic HTML handler structure */
frankvnk 0:ebcd5ecff2cf 117 http_server_event_handler * eventHandlers = NULL;
frankvnk 0:ebcd5ecff2cf 118
frankvnk 0:ebcd5ecff2cf 119
frankvnk 0:ebcd5ecff2cf 120 /** \brief Page view counter */
frankvnk 0:ebcd5ecff2cf 121 int viewCounter = 1;
frankvnk 0:ebcd5ecff2cf 122 #define REQ_BUFFER_SIZE 400
frankvnk 0:ebcd5ecff2cf 123 #define HTTP_TX_BLOCK_SIZE 256
frankvnk 0:ebcd5ecff2cf 124 //#define HTTP_TX_BLOCK_SIZE 1024
frankvnk 0:ebcd5ecff2cf 125 //#define HTTP_TX_BLOCK_SIZE 512
frankvnk 0:ebcd5ecff2cf 126
frankvnk 0:ebcd5ecff2cf 127
frankvnk 0:ebcd5ecff2cf 128 // Setup the functions to handle our CGI parameters
frankvnk 0:ebcd5ecff2cf 129 char requestBuffer[REQ_BUFFER_SIZE];
frankvnk 0:ebcd5ecff2cf 130
frankvnk 0:ebcd5ecff2cf 131
frankvnk 0:ebcd5ecff2cf 132
frankvnk 0:ebcd5ecff2cf 133
frankvnk 0:ebcd5ecff2cf 134
frankvnk 0:ebcd5ecff2cf 135 /*
frankvnk 0:ebcd5ecff2cf 136 // ---------- HTML Webpage Content is defined here ----------
frankvnk 0:ebcd5ecff2cf 137 // Caution! Field labels and spaces in the HTML should not be edited without making corresponding changes in the C-code!
frankvnk 0:ebcd5ecff2cf 138 char index[] = {
frankvnk 0:ebcd5ecff2cf 139 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"><html lang=\"en-US\">"
frankvnk 0:ebcd5ecff2cf 140 "<head>"
frankvnk 0:ebcd5ecff2cf 141 "<META content=\"text/html;charset=ISO-8859-1\" http-equiv=\"content-type\">"
frankvnk 0:ebcd5ecff2cf 142 "<title>Wi-Go WebServer</title>"
frankvnk 0:ebcd5ecff2cf 143 //"<META HTTP-EQUIV=\"refresh\" content=\"2\">" // Uncomment for auto-refresh every 2 seconds
frankvnk 0:ebcd5ecff2cf 144 "</head>"
frankvnk 0:ebcd5ecff2cf 145
frankvnk 0:ebcd5ecff2cf 146 "<body><div style=\"text-align: left\"><font size=\"6\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 147 "<b>Avnet Wi-Go Webserver</b></font>"
frankvnk 0:ebcd5ecff2cf 148 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 149 "<font size=\"5\" color=\"Red\" face=\"Tahoma\"><b>LED RGB color select...</b></font>"
frankvnk 0:ebcd5ecff2cf 150
frankvnk 0:ebcd5ecff2cf 151 //"<font size=\"5\" color=\"Black\" face=\"monospace\"></font>"
frankvnk 0:ebcd5ecff2cf 152 "<form method=\"get\" action=\"index.html\" name=\"server\">"
frankvnk 0:ebcd5ecff2cf 153 "<input name=\"ledCon\" type=\"submit\" value=\"-Red-\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
frankvnk 0:ebcd5ecff2cf 154 "<input name=\"ledCon\" type=\"submit\" value=\"Green\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
frankvnk 0:ebcd5ecff2cf 155 "<input name=\"ledCon\" type=\"submit\" value=\"Blue-\">"
frankvnk 0:ebcd5ecff2cf 156 "</form></div>"
frankvnk 0:ebcd5ecff2cf 157
frankvnk 0:ebcd5ecff2cf 158 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 159 "<div style=\"text-align: left\"><font size=\"5\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 160 "<b>Navigation Sensors</b></font></div>"
frankvnk 0:ebcd5ecff2cf 161
frankvnk 0:ebcd5ecff2cf 162 "<div style=\"text-align:left\"><font size=\"4\" color=\"Black\" face=\"monospace\"><b>"
frankvnk 0:ebcd5ecff2cf 163 "Acceleration(G).. <br>"
frankvnk 0:ebcd5ecff2cf 164 "Magnetometer(uT). <br>"
frankvnk 0:ebcd5ecff2cf 165 "eCompass......... <br>"
frankvnk 0:ebcd5ecff2cf 166 "Altitude......... <br></b></font></div>"
frankvnk 0:ebcd5ecff2cf 167
frankvnk 0:ebcd5ecff2cf 168 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 169 "<div style=\"text-align: left\"><font size=\"5\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 170 "<b>Status and Control</b></font></div>"
frankvnk 0:ebcd5ecff2cf 171
frankvnk 0:ebcd5ecff2cf 172 "<div style=\"text-align:left\"><font size=\"4\" color=\"Black\" face=\"monospace\"><b>"
frankvnk 0:ebcd5ecff2cf 173 "Battery Voltage.. <br>"
frankvnk 0:ebcd5ecff2cf 174 "Ambient Light.... <br>"
frankvnk 0:ebcd5ecff2cf 175 "Temperature...... <br>"
frankvnk 0:ebcd5ecff2cf 176 "Slider Position.. <br>"
frankvnk 0:ebcd5ecff2cf 177 "Page Views....... </b></font>"
frankvnk 0:ebcd5ecff2cf 178 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 179 "</body></html>"}; // delete this line if adding the SVG code below...
frankvnk 0:ebcd5ecff2cf 180 */
frankvnk 0:ebcd5ecff2cf 181 // Optional section 1: Full SVG graphic example: Uncomment this section to display the standard Wi-Fi logo in lower area of webpage
frankvnk 0:ebcd5ecff2cf 182 // Browsers supporting SVG: Chrome and FireFox (all versions), Android (3.0 onwards), Safari (5.0 onwards), IE (9.0 onwards?)
frankvnk 0:ebcd5ecff2cf 183 /*
frankvnk 0:ebcd5ecff2cf 184 "<!--[if !IE]><!-->" // This prevents SVG content being sent to Internet Explorer
frankvnk 0:ebcd5ecff2cf 185 "<svg>"
frankvnk 0:ebcd5ecff2cf 186 "xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"175.49\" width=\"400\""
frankvnk 0:ebcd5ecff2cf 187 "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
frankvnk 0:ebcd5ecff2cf 188 "xmlns:cc=\"http://creativecommons.org/ns#\""
frankvnk 0:ebcd5ecff2cf 189 "xmlns:dc=\"http://purl.org/dc/elements/1.1/\">"
frankvnk 0:ebcd5ecff2cf 190 "<defs></defs>"
frankvnk 0:ebcd5ecff2cf 191 "<metadata>"
frankvnk 0:ebcd5ecff2cf 192 "<rdf:RDF>"
frankvnk 0:ebcd5ecff2cf 193 "<cc:Work rdf:about=\"\">"
frankvnk 0:ebcd5ecff2cf 194 "<dc:format>image/svg+xml</dc:format>"
frankvnk 0:ebcd5ecff2cf 195 "<dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>"
frankvnk 0:ebcd5ecff2cf 196 "<dc:title/>"
frankvnk 0:ebcd5ecff2cf 197 "</cc:Work>"
frankvnk 0:ebcd5ecff2cf 198 "</rdf:RDF>"
frankvnk 0:ebcd5ecff2cf 199 "</metadata>"
frankvnk 0:ebcd5ecff2cf 200 "<g transform=\"translate(-309.85919,-343.20843)\">"
frankvnk 0:ebcd5ecff2cf 201 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,576.05074,474.82936)\">"
frankvnk 0:ebcd5ecff2cf 202 "<path fill-rule=\"nonzero\" fill=\"#231f20\" d=\"m0,0c4.977,0,9.049,4.077,9.049,9.049v5.389c0,4.973-4.072,9.048-9.049,9.048h-35.433c-4.973,0-9.049-4.075-9.049-9.048v-5.389c0-4.972,4.076-9.049,9.049-9.049\"/>"
frankvnk 0:ebcd5ecff2cf 203 "</g>"
frankvnk 0:ebcd5ecff2cf 204 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,514.3818,441.01715)\">"
frankvnk 0:ebcd5ecff2cf 205 "<path fill-rule=\"nonzero\" fill=\"#FFF\" d=\"m0,0,0,5.389c0,4.072,3.314,7.32,7.32,7.32h9.187c4.007,0,7.253-3.248,7.253-7.32v-5.389c0-4.005-3.246-7.32-7.253-7.32h-20.239c2.281,1.656,3.732,4.284,3.732,7.32\"/>"
frankvnk 0:ebcd5ecff2cf 206 "</g>"
frankvnk 0:ebcd5ecff2cf 207 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,469.99257,451.60916)\">"
frankvnk 0:ebcd5ecff2cf 208 "<path fill-rule=\"nonzero\" fill=\"#FFF\" d=\"m0,0-3.043,0-0.55,2.56c-0.345,1.794-0.692,4.005-0.761,4.833-0.069-0.828-0.416-3.039-0.825-4.833l-0.555-2.56h-2.968l-2.767,11.748h3.317l0.343-2.004c0.276-1.66,0.556-3.659,0.695-5.044,0.136,1.385,0.481,3.384,0.896,5.044l0.412,2.004h2.972l0.413-2.004c0.348-1.66,0.693-3.659,0.833-5.044,0.136,1.385,0.482,3.384,0.757,5.044l0.278,2.004h3.313\"/>"
frankvnk 0:ebcd5ecff2cf 209 "</g>"
frankvnk 0:ebcd5ecff2cf 210 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,491.40819,416.23898)\">"
frankvnk 0:ebcd5ecff2cf 211 "<path fill-rule=\"nonzero\" fill=\"#FFF\" d=\"m0,0c-0.968,0-1.727,0.553-1.727,1.451,0,0.899,0.759,1.45,1.727,1.45,1.036,0,1.796-0.551,1.796-1.45,0-0.898-0.76-1.451-1.796-1.451m-1.521-0.968,3.0401,0,0-8.4984-3.0401,0,0,8.4984z\"/>"
frankvnk 0:ebcd5ecff2cf 212 "</g>"
frankvnk 0:ebcd5ecff2cf 213 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,541.9845,418.05849)\">"
frankvnk 0:ebcd5ecff2cf 214 "<path fill-rule=\"nonzero\" fill=\"#231f20\" d=\"m0,0,0-2.618,6.22,0,0-2.767-6.22,0,0-3.593-3.247,0,0,11.748,10.156,0,0-2.77\"/>"
frankvnk 0:ebcd5ecff2cf 215 "</g>"
frankvnk 0:ebcd5ecff2cf 216 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,580.44446,416.23898)\">"
frankvnk 0:ebcd5ecff2cf 217 "<path fill-rule=\"nonzero\" fill=\"#231f20\" d=\"m0,0c-0.97,0-1.727,0.553-1.727,1.451,0,0.899,0.757,1.45,1.727,1.45,1.035,0,1.797-0.551,1.797-1.45,0-0.898-0.762-1.451-1.797-1.451m-1.521-0.968,3.0371,0,0-8.4984-3.0371,0,0,8.4984z\"/>"
frankvnk 0:ebcd5ecff2cf 218 "</g>"
frankvnk 0:ebcd5ecff2cf 219 "</g>"
frankvnk 0:ebcd5ecff2cf 220 "</svg>"
frankvnk 0:ebcd5ecff2cf 221 "<!--<![endif]-->"
frankvnk 0:ebcd5ecff2cf 222 */ // end of conditional inclusion of SVG graphic (excludes Internet Explorer browser)
frankvnk 0:ebcd5ecff2cf 223 // ---- End of Wi-Fi logo SVG image definition ----
frankvnk 0:ebcd5ecff2cf 224
frankvnk 0:ebcd5ecff2cf 225 // Optional section 2: Simple SVG graphic example: Uncomment this section to generate a filled circle in lower area of webpage
frankvnk 0:ebcd5ecff2cf 226 // eg. Could use to indicate RGB LED color (with addition of applicable C-code to dynamically update specified "fill=" color)
frankvnk 0:ebcd5ecff2cf 227 /*
frankvnk 0:ebcd5ecff2cf 228 "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">"
frankvnk 0:ebcd5ecff2cf 229 "<circle cx=\"155\" cy=\"22\" r=\"20\" stroke=\"DimGrey\" stroke-width=\"2\" fill=\"Red\"/>"
frankvnk 0:ebcd5ecff2cf 230 "</svg>"
frankvnk 0:ebcd5ecff2cf 231 "</body></html>"};
frankvnk 0:ebcd5ecff2cf 232 */
frankvnk 0:ebcd5ecff2cf 233
frankvnk 0:ebcd5ecff2cf 234 // ----------------------------------------------------------
frankvnk 0:ebcd5ecff2cf 235
frankvnk 0:ebcd5ecff2cf 236 //char ssid_name[] = SSID;
frankvnk 0:ebcd5ecff2cf 237 char testString[20];
frankvnk 0:ebcd5ecff2cf 238 //int vcc = 0;
frankvnk 0:ebcd5ecff2cf 239 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 240 //
frankvnk 0:ebcd5ecff2cf 241 //! demo_wi-fi_main
frankvnk 0:ebcd5ecff2cf 242 //!
frankvnk 0:ebcd5ecff2cf 243 //! \param None
frankvnk 0:ebcd5ecff2cf 244 //!
frankvnk 0:ebcd5ecff2cf 245 //! \return none
frankvnk 0:ebcd5ecff2cf 246 //!
frankvnk 0:ebcd5ecff2cf 247 //! \brief The main loop is executed here
frankvnk 0:ebcd5ecff2cf 248 //
frankvnk 0:ebcd5ecff2cf 249 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 250
frankvnk 0:ebcd5ecff2cf 251 int demo_wifi_main(void)
frankvnk 0:ebcd5ecff2cf 252 {
frankvnk 0:ebcd5ecff2cf 253 server_running = 1;
frankvnk 0:ebcd5ecff2cf 254 while(1)
frankvnk 0:ebcd5ecff2cf 255 {
frankvnk 0:ebcd5ecff2cf 256 /* Configure dynamic HTML string handlers
frankvnk 0:ebcd5ecff2cf 257 0 : Acceleration
frankvnk 0:ebcd5ecff2cf 258 1 : Magnetometer
frankvnk 0:ebcd5ecff2cf 259 2 : eCompass
frankvnk 0:ebcd5ecff2cf 260 3 : Altitude
frankvnk 0:ebcd5ecff2cf 261 -------------------
frankvnk 0:ebcd5ecff2cf 262 4 : Battery Voltage
frankvnk 0:ebcd5ecff2cf 263 5 : Ambient Light
frankvnk 0:ebcd5ecff2cf 264 6 : Temperature
frankvnk 0:ebcd5ecff2cf 265 7 : Slider Position
frankvnk 0:ebcd5ecff2cf 266 8 : Page Views
frankvnk 0:ebcd5ecff2cf 267 */
frankvnk 0:ebcd5ecff2cf 268 (htmlHandlers.dynHtmlFunc[0]) = getAccelXYZ_Str;
frankvnk 0:ebcd5ecff2cf 269 memcpy(htmlHandlers.dynHtmlParamName[0],"Acceleration(G).. ",strlen("Acceleration(G).. "));
frankvnk 0:ebcd5ecff2cf 270 htmlHandlers.dynHtmlParamName[0][strlen("Acceleration(G).. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 271
frankvnk 0:ebcd5ecff2cf 272 (htmlHandlers.dynHtmlFunc[1]) = getM3110Str;
frankvnk 0:ebcd5ecff2cf 273 memcpy(htmlHandlers.dynHtmlParamName[1],"Magnetometer(uT). ",strlen("Magnetometer(uT). "));
frankvnk 0:ebcd5ecff2cf 274 htmlHandlers.dynHtmlParamName[1][strlen("Magnetometer(uT). ")] ='\0';
frankvnk 0:ebcd5ecff2cf 275
frankvnk 0:ebcd5ecff2cf 276 (htmlHandlers.dynHtmlFunc[2]) = getCompassStr;
frankvnk 0:ebcd5ecff2cf 277 memcpy(htmlHandlers.dynHtmlParamName[2],"eCompass......... ",strlen("eCompass......... "));
frankvnk 0:ebcd5ecff2cf 278 htmlHandlers.dynHtmlParamName[2][strlen("eCompass......... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 279
frankvnk 0:ebcd5ecff2cf 280 (htmlHandlers.dynHtmlFunc[3]) = getAltitudeStr;
frankvnk 0:ebcd5ecff2cf 281 memcpy(htmlHandlers.dynHtmlParamName[3],"Altitude......... ",strlen("Altitude......... "));
frankvnk 0:ebcd5ecff2cf 282 htmlHandlers.dynHtmlParamName[3][strlen("Altitude......... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 283
frankvnk 0:ebcd5ecff2cf 284 (htmlHandlers.dynHtmlFunc[4]) = getBatteryVoltageStr;
frankvnk 0:ebcd5ecff2cf 285 memcpy(htmlHandlers.dynHtmlParamName[4],"Battery Voltage.. ",strlen("Battery Voltage.. "));
frankvnk 0:ebcd5ecff2cf 286 htmlHandlers.dynHtmlParamName[4][strlen("Battery Voltage.. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 287
frankvnk 0:ebcd5ecff2cf 288 (htmlHandlers.dynHtmlFunc[5]) = getLightVoltageStr;
frankvnk 0:ebcd5ecff2cf 289 memcpy(htmlHandlers.dynHtmlParamName[5],"Ambient Light.... ",strlen("Ambient Light.... "));
frankvnk 0:ebcd5ecff2cf 290 htmlHandlers.dynHtmlParamName[5][strlen("Ambient Light.... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 291
frankvnk 0:ebcd5ecff2cf 292 (htmlHandlers.dynHtmlFunc[6]) = getTemperatureStr;
frankvnk 0:ebcd5ecff2cf 293 memcpy(htmlHandlers.dynHtmlParamName[6],"Temperature...... ",strlen("Temperature...... "));
frankvnk 0:ebcd5ecff2cf 294 htmlHandlers.dynHtmlParamName[6][strlen("Temperature...... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 295
frankvnk 0:ebcd5ecff2cf 296 (htmlHandlers.dynHtmlFunc[7]) = getTSI_sliderStr;
frankvnk 0:ebcd5ecff2cf 297 memcpy(htmlHandlers.dynHtmlParamName[7],"Slider Position.. ",strlen("Slider Position.. "));
frankvnk 0:ebcd5ecff2cf 298 htmlHandlers.dynHtmlParamName[7][strlen("Slider Position.. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 299
frankvnk 0:ebcd5ecff2cf 300 (htmlHandlers.dynHtmlFunc[8]) = getViewsNum;
frankvnk 0:ebcd5ecff2cf 301 memcpy(htmlHandlers.dynHtmlParamName[8],"Page Views....... ",strlen("Page Views....... "));
frankvnk 0:ebcd5ecff2cf 302 htmlHandlers.dynHtmlParamName[8][strlen("Page Views....... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 303
frankvnk 0:ebcd5ecff2cf 304 // Configure CGI Handler
frankvnk 0:ebcd5ecff2cf 305 (pHandlers.cgiHandlerFunc[0]) = testFunc;
frankvnk 0:ebcd5ecff2cf 306
frankvnk 0:ebcd5ecff2cf 307 serverMain(HTTP_PORT,(char *)index, &pHandlers, &htmlHandlers);
frankvnk 0:ebcd5ecff2cf 308 }
frankvnk 0:ebcd5ecff2cf 309 }
frankvnk 0:ebcd5ecff2cf 310
frankvnk 0:ebcd5ecff2cf 311
frankvnk 0:ebcd5ecff2cf 312 void testFunc(char * str)
frankvnk 0:ebcd5ecff2cf 313 {
frankvnk 0:ebcd5ecff2cf 314 memcpy(testString,str,strlen(str));
frankvnk 0:ebcd5ecff2cf 315 if(strcmp(str, "-Red-") == 0)
frankvnk 0:ebcd5ecff2cf 316 {
frankvnk 0:ebcd5ecff2cf 317 RED_ON; GREEN_OFF; BLUE_OFF;
frankvnk 0:ebcd5ecff2cf 318 }
frankvnk 0:ebcd5ecff2cf 319 else if(strcmp(str, "Green") == 0)
frankvnk 0:ebcd5ecff2cf 320 {
frankvnk 0:ebcd5ecff2cf 321 RED_OFF; GREEN_ON; BLUE_OFF;
frankvnk 0:ebcd5ecff2cf 322 }
frankvnk 0:ebcd5ecff2cf 323 else if (strcmp(str, "Blue-") == 0)
frankvnk 0:ebcd5ecff2cf 324 {
frankvnk 0:ebcd5ecff2cf 325 RED_OFF; GREEN_OFF; BLUE_ON;
frankvnk 0:ebcd5ecff2cf 326 }
frankvnk 0:ebcd5ecff2cf 327 }
frankvnk 0:ebcd5ecff2cf 328
frankvnk 0:ebcd5ecff2cf 329 void getBatteryVoltageStr(char * str)
frankvnk 0:ebcd5ecff2cf 330 {
frankvnk 0:ebcd5ecff2cf 331 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 332 sprintf(str, "%d %%", adc_sample3);
frankvnk 0:ebcd5ecff2cf 333 }
frankvnk 0:ebcd5ecff2cf 334
frankvnk 0:ebcd5ecff2cf 335 void getLightVoltageStr(char * str)
frankvnk 0:ebcd5ecff2cf 336 {
frankvnk 0:ebcd5ecff2cf 337 int LightPercent = 0;
frankvnk 0:ebcd5ecff2cf 338 LightPercent = (axis6.light * 100) / 4096;
frankvnk 0:ebcd5ecff2cf 339 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 340 sprintf(str, "%d %%", LightPercent);
frankvnk 0:ebcd5ecff2cf 341 }
frankvnk 0:ebcd5ecff2cf 342
frankvnk 0:ebcd5ecff2cf 343 void getAccelXYZ_Str(char * str) // MMA8451Q accelerometer - report axis with highest value
frankvnk 0:ebcd5ecff2cf 344 {
frankvnk 0:ebcd5ecff2cf 345 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 346 sprintf(str, "X= %1.2f, Y= %1.2f, Z= %1.2f", axis6.fGax, axis6.fGay, axis6.fGaz);;
frankvnk 0:ebcd5ecff2cf 347 }
frankvnk 0:ebcd5ecff2cf 348
frankvnk 0:ebcd5ecff2cf 349 void getTemperatureStr(char * str) //
frankvnk 0:ebcd5ecff2cf 350 {
frankvnk 0:ebcd5ecff2cf 351 sprintf(str, "%+d C", axis6.temp);
frankvnk 0:ebcd5ecff2cf 352 }
frankvnk 0:ebcd5ecff2cf 353
frankvnk 0:ebcd5ecff2cf 354 void getTSI_sliderStr(char * str) // TSI Slider position
frankvnk 0:ebcd5ecff2cf 355 {
frankvnk 0:ebcd5ecff2cf 356 uint8_t slider_position;
frankvnk 0:ebcd5ecff2cf 357
frankvnk 0:ebcd5ecff2cf 358 slider_position = tsi.readPercentage() * 100; // Slider position as percentage
frankvnk 0:ebcd5ecff2cf 359 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 360 sprintf(str, "%d %%", slider_position);
frankvnk 0:ebcd5ecff2cf 361 }
frankvnk 0:ebcd5ecff2cf 362
frankvnk 0:ebcd5ecff2cf 363 void getCompassStr(char * str) // Mag3110 generated Compass bearing
frankvnk 0:ebcd5ecff2cf 364 {
frankvnk 0:ebcd5ecff2cf 365 char *compass_points[9] = {"North", "N-East", "East", "S-East", "South", "S-West", "West", "N-West", "North"};
frankvnk 0:ebcd5ecff2cf 366 signed short compass_bearing = (axis6.compass + 23) / 45;
frankvnk 0:ebcd5ecff2cf 367 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 368 sprintf(str, "Roll=%-d Pitch=%-d Yaw=%-d [%s]", axis6.roll, axis6.pitch, axis6.yaw, compass_points[compass_bearing]); //
frankvnk 0:ebcd5ecff2cf 369 }
frankvnk 0:ebcd5ecff2cf 370
frankvnk 0:ebcd5ecff2cf 371 void getM3110Str(char * str) // Mag3110 displayed in units of UT
frankvnk 0:ebcd5ecff2cf 372 {
frankvnk 0:ebcd5ecff2cf 373 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 374 sprintf(str, "X= %3.1f, Y= %3.1f, Z= %3.1f", axis6.fUTmx, axis6.fUTmy, axis6.fUTmz);
frankvnk 0:ebcd5ecff2cf 375 }
frankvnk 0:ebcd5ecff2cf 376
frankvnk 0:ebcd5ecff2cf 377 void getAltitudeStr(char * str) // Get Altitude
frankvnk 0:ebcd5ecff2cf 378 {
frankvnk 0:ebcd5ecff2cf 379 sprintf(str, "%+d meters", axis6.alt); // str = integer portion of result
frankvnk 0:ebcd5ecff2cf 380 }
frankvnk 0:ebcd5ecff2cf 381
frankvnk 0:ebcd5ecff2cf 382
frankvnk 0:ebcd5ecff2cf 383
frankvnk 0:ebcd5ecff2cf 384 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 385 //
frankvnk 0:ebcd5ecff2cf 386 //! \brief Main HTTP Server
frankvnk 0:ebcd5ecff2cf 387 //!
frankvnk 0:ebcd5ecff2cf 388 //! \param none
frankvnk 0:ebcd5ecff2cf 389 //!
frankvnk 0:ebcd5ecff2cf 390 //! \return none
frankvnk 0:ebcd5ecff2cf 391 //!
frankvnk 0:ebcd5ecff2cf 392 //
frankvnk 0:ebcd5ecff2cf 393 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 394 void serverMain(int port,
frankvnk 0:ebcd5ecff2cf 395 char * ipage,
frankvnk 0:ebcd5ecff2cf 396 cgi_handler * handleList,
frankvnk 0:ebcd5ecff2cf 397 dyn_html_handler * dhList)
frankvnk 0:ebcd5ecff2cf 398 {
frankvnk 0:ebcd5ecff2cf 399 indexPage = ipage;
frankvnk 0:ebcd5ecff2cf 400 chList = handleList;
frankvnk 0:ebcd5ecff2cf 401 htmlList = dhList;
frankvnk 0:ebcd5ecff2cf 402
frankvnk 0:ebcd5ecff2cf 403 server.bind(port);
frankvnk 0:ebcd5ecff2cf 404
frankvnk 0:ebcd5ecff2cf 405 printf("Main HTTP server\r\n");
frankvnk 0:ebcd5ecff2cf 406
frankvnk 0:ebcd5ecff2cf 407 // Start Listening
frankvnk 0:ebcd5ecff2cf 408 if(server.listen() != 0);
frankvnk 0:ebcd5ecff2cf 409
frankvnk 0:ebcd5ecff2cf 410 // Handle Clients and Data
frankvnk 0:ebcd5ecff2cf 411 while(1)
frankvnk 0:ebcd5ecff2cf 412 {
frankvnk 0:ebcd5ecff2cf 413 int32_t status = server.accept(client);
frankvnk 0:ebcd5ecff2cf 414 if (status >= 0)
frankvnk 0:ebcd5ecff2cf 415 {
frankvnk 1:99bfc8d68fd3 416 LED_D2_ON;
frankvnk 0:ebcd5ecff2cf 417 // Connection Accepted, Send Data
frankvnk 0:ebcd5ecff2cf 418 // Wait for a data update
frankvnk 1:99bfc8d68fd3 419 client.set_blocking(true);
frankvnk 1:99bfc8d68fd3 420 printf("Connection\r\n");
frankvnk 1:99bfc8d68fd3 421 // printf("Connection from: %s \r\n", client.get_address());
frankvnk 1:99bfc8d68fd3 422 if(newData) handleHTTPRequest();
frankvnk 1:99bfc8d68fd3 423 newData = 0;
frankvnk 0:ebcd5ecff2cf 424 client.close();
frankvnk 1:99bfc8d68fd3 425 LED_D2_OFF;
frankvnk 0:ebcd5ecff2cf 426 }
frankvnk 0:ebcd5ecff2cf 427 else if(status == -57)
frankvnk 0:ebcd5ecff2cf 428 {
frankvnk 0:ebcd5ecff2cf 429 // BUG: Socket inactive so reopen socket
frankvnk 0:ebcd5ecff2cf 430 // Inactive Socket, close and reopen it
frankvnk 0:ebcd5ecff2cf 431 printf("Oops!!!\r\n");
frankvnk 0:ebcd5ecff2cf 432 server.close();
frankvnk 0:ebcd5ecff2cf 433 indexPage = ipage;
frankvnk 0:ebcd5ecff2cf 434 chList = handleList;
frankvnk 0:ebcd5ecff2cf 435 htmlList = dhList;
frankvnk 0:ebcd5ecff2cf 436 server.bind(port);
frankvnk 0:ebcd5ecff2cf 437
frankvnk 0:ebcd5ecff2cf 438 // Start Listening
frankvnk 0:ebcd5ecff2cf 439 if (server.listen() != 0);
frankvnk 0:ebcd5ecff2cf 440 }
frankvnk 0:ebcd5ecff2cf 441 }
frankvnk 0:ebcd5ecff2cf 442 }
frankvnk 0:ebcd5ecff2cf 443
frankvnk 0:ebcd5ecff2cf 444 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 445 //
frankvnk 0:ebcd5ecff2cf 446 //! \brief Handles HTTP Requests
frankvnk 0:ebcd5ecff2cf 447 //!
frankvnk 0:ebcd5ecff2cf 448 //! \param cnum is the client socket handle to be used
frankvnk 0:ebcd5ecff2cf 449 //!
frankvnk 0:ebcd5ecff2cf 450 //! \return none
frankvnk 0:ebcd5ecff2cf 451 //!
frankvnk 0:ebcd5ecff2cf 452 //
frankvnk 0:ebcd5ecff2cf 453 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 454 void handleHTTPRequest(void)
frankvnk 0:ebcd5ecff2cf 455 {
frankvnk 0:ebcd5ecff2cf 456 char * reqline[3];
frankvnk 0:ebcd5ecff2cf 457 char * cgiTok;
frankvnk 0:ebcd5ecff2cf 458
frankvnk 0:ebcd5ecff2cf 459 int i = 0;
frankvnk 0:ebcd5ecff2cf 460 char paramBuf[20];
frankvnk 0:ebcd5ecff2cf 461 int bytesRecvd;
frankvnk 0:ebcd5ecff2cf 462 char tempStr[40]; //PF was 26
frankvnk 0:ebcd5ecff2cf 463
frankvnk 0:ebcd5ecff2cf 464 memset(requestBuffer,0,sizeof (requestBuffer));
frankvnk 0:ebcd5ecff2cf 465 bytesRecvd = client.receive(requestBuffer, sizeof(requestBuffer));
frankvnk 0:ebcd5ecff2cf 466
frankvnk 1:99bfc8d68fd3 467 printf("handleHTTPRequest\r\n");
frankvnk 0:ebcd5ecff2cf 468
frankvnk 0:ebcd5ecff2cf 469 if(bytesRecvd > 0)
frankvnk 0:ebcd5ecff2cf 470 {
frankvnk 0:ebcd5ecff2cf 471 // Received some data, check it and send data back
frankvnk 0:ebcd5ecff2cf 472 reqline[0] = strstr(requestBuffer, "GET");
frankvnk 0:ebcd5ecff2cf 473 if ( reqline[0] != NULL )
frankvnk 0:ebcd5ecff2cf 474 {
frankvnk 0:ebcd5ecff2cf 475 if (strstr (requestBuffer, "HTTP/1.0") != NULL && strstr (requestBuffer, "HTTP/1.1") != NULL )
frankvnk 0:ebcd5ecff2cf 476 {
frankvnk 0:ebcd5ecff2cf 477 client.send_all("HTTP/1.0 400 Bad Request\n", 25);
frankvnk 0:ebcd5ecff2cf 478 }
frankvnk 0:ebcd5ecff2cf 479 else
frankvnk 0:ebcd5ecff2cf 480 {
frankvnk 0:ebcd5ecff2cf 481
frankvnk 0:ebcd5ecff2cf 482 #ifdef HTTP_CGI_ENABLED
frankvnk 0:ebcd5ecff2cf 483 // Do we have CGI parameters we need to parse?
frankvnk 0:ebcd5ecff2cf 484 if(strchr(requestBuffer, '?') != NULL)
frankvnk 0:ebcd5ecff2cf 485 {
frankvnk 0:ebcd5ecff2cf 486 // Decode URL and handle each parameter sequentially
frankvnk 0:ebcd5ecff2cf 487 // according to table previously setup.
frankvnk 0:ebcd5ecff2cf 488 cgiTok = strstr(requestBuffer,"=");
frankvnk 0:ebcd5ecff2cf 489 if(cgiTok != NULL)
frankvnk 0:ebcd5ecff2cf 490 {
frankvnk 0:ebcd5ecff2cf 491 memset(paramBuf,0,sizeof(paramBuf));
frankvnk 0:ebcd5ecff2cf 492 memcpy(paramBuf,cgiTok+1,5); // hard-coded for demo: 5 character parameter (-Red-/Green/Blue-)
frankvnk 0:ebcd5ecff2cf 493 chList->cgiHandlerFunc[0](paramBuf);
frankvnk 0:ebcd5ecff2cf 494
frankvnk 0:ebcd5ecff2cf 495 }
frankvnk 0:ebcd5ecff2cf 496 }
frankvnk 0:ebcd5ecff2cf 497 #endif
frankvnk 0:ebcd5ecff2cf 498
frankvnk 0:ebcd5ecff2cf 499 #ifdef HTTP_DYN_HTML_ENABLED
frankvnk 0:ebcd5ecff2cf 500 // The code below replaces data in the HTML page
frankvnk 0:ebcd5ecff2cf 501 // with that generated by the specified functions.
frankvnk 0:ebcd5ecff2cf 502 for(i = 0; i < 9; i++) // change the range here for more dynamic fields on webpage
frankvnk 0:ebcd5ecff2cf 503 {
frankvnk 0:ebcd5ecff2cf 504 memset(tempStr,0,sizeof(tempStr));
frankvnk 0:ebcd5ecff2cf 505 htmlList->dynHtmlFunc[i](tempStr);
frankvnk 0:ebcd5ecff2cf 506 tempStr[strlen(tempStr)]= ' ';
frankvnk 0:ebcd5ecff2cf 507 pageReplace((char *)indexPage,
frankvnk 0:ebcd5ecff2cf 508 (char *)htmlList->dynHtmlParamName[i],
frankvnk 0:ebcd5ecff2cf 509 (char *)tempStr);
frankvnk 0:ebcd5ecff2cf 510 }
frankvnk 0:ebcd5ecff2cf 511 #endif
frankvnk 0:ebcd5ecff2cf 512 viewCounter++;
frankvnk 0:ebcd5ecff2cf 513 sendHTTPData(HTTP_RESP, strlen(HTTP_RESP));
frankvnk 0:ebcd5ecff2cf 514
frankvnk 0:ebcd5ecff2cf 515 for(i = 0; i < strlen(indexPage); i += HTTP_TX_BLOCK_SIZE)
frankvnk 0:ebcd5ecff2cf 516 {
frankvnk 0:ebcd5ecff2cf 517 if(strlen(indexPage) - i < HTTP_TX_BLOCK_SIZE)
frankvnk 0:ebcd5ecff2cf 518 {
frankvnk 0:ebcd5ecff2cf 519 sendHTTPData(&indexPage[i], strlen(indexPage) - i);
frankvnk 0:ebcd5ecff2cf 520 }
frankvnk 0:ebcd5ecff2cf 521 else
frankvnk 0:ebcd5ecff2cf 522 {
frankvnk 0:ebcd5ecff2cf 523 sendHTTPData(&indexPage[i], HTTP_TX_BLOCK_SIZE);
frankvnk 0:ebcd5ecff2cf 524 }
frankvnk 0:ebcd5ecff2cf 525 }
frankvnk 0:ebcd5ecff2cf 526 }
frankvnk 0:ebcd5ecff2cf 527 }
frankvnk 0:ebcd5ecff2cf 528 }
frankvnk 0:ebcd5ecff2cf 529 }
frankvnk 0:ebcd5ecff2cf 530
frankvnk 0:ebcd5ecff2cf 531 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 532 //
frankvnk 0:ebcd5ecff2cf 533 //! \brief Inserts characters in page that appear after an indicator ind
frankvnk 0:ebcd5ecff2cf 534 //! with the value from val
frankvnk 0:ebcd5ecff2cf 535 //!
frankvnk 0:ebcd5ecff2cf 536 //! \param page is a pointer to the array holding the page's HTML code
frankvnk 0:ebcd5ecff2cf 537 //! \param ind is a pointer to a string that has the name of the parameter on the page to modify
frankvnk 0:ebcd5ecff2cf 538 //! \param val is the pointer to a string holding the string to insert in the XXX
frankvnk 0:ebcd5ecff2cf 539 //!
frankvnk 0:ebcd5ecff2cf 540 //! \return none
frankvnk 0:ebcd5ecff2cf 541 //!
frankvnk 0:ebcd5ecff2cf 542 //
frankvnk 0:ebcd5ecff2cf 543 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 544 void pageReplace(char * page, char * ind, char * val)
frankvnk 0:ebcd5ecff2cf 545 {
frankvnk 0:ebcd5ecff2cf 546 char * indicLoc;
frankvnk 0:ebcd5ecff2cf 547 indicLoc = strstr (page,ind);
frankvnk 0:ebcd5ecff2cf 548 memcpy(indicLoc+strlen(ind), val, strlen(val));
frankvnk 0:ebcd5ecff2cf 549 }
frankvnk 0:ebcd5ecff2cf 550
frankvnk 0:ebcd5ecff2cf 551 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 552 //
frankvnk 0:ebcd5ecff2cf 553 //! \brief Returns a string with the number of views of the page
frankvnk 0:ebcd5ecff2cf 554 //!
frankvnk 0:ebcd5ecff2cf 555 //! \param str is a pointer to the array where the number of views will be put
frankvnk 0:ebcd5ecff2cf 556 //!
frankvnk 0:ebcd5ecff2cf 557 //! \return none
frankvnk 0:ebcd5ecff2cf 558 //!
frankvnk 0:ebcd5ecff2cf 559 //
frankvnk 0:ebcd5ecff2cf 560 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 561 void getViewsNum(char * str)
frankvnk 0:ebcd5ecff2cf 562 {
frankvnk 0:ebcd5ecff2cf 563 sprintf(str, "%d", viewCounter);
frankvnk 0:ebcd5ecff2cf 564 }
frankvnk 0:ebcd5ecff2cf 565
frankvnk 0:ebcd5ecff2cf 566 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 567 //
frankvnk 0:ebcd5ecff2cf 568 //! \brief Sends HTTP Data
frankvnk 0:ebcd5ecff2cf 569 //!
frankvnk 0:ebcd5ecff2cf 570 //! \param sdesc is the socket descriptor of the socket used for sending data
frankvnk 0:ebcd5ecff2cf 571 //! \param buf is a pointer to the buffer with the data to be sent
frankvnk 0:ebcd5ecff2cf 572 //! \param len is the number of bytes to send
frankvnk 0:ebcd5ecff2cf 573 //!
frankvnk 0:ebcd5ecff2cf 574 //! \return none
frankvnk 0:ebcd5ecff2cf 575 //!
frankvnk 0:ebcd5ecff2cf 576 //
frankvnk 0:ebcd5ecff2cf 577 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 578 void sendHTTPData(char * buf, long len)
frankvnk 0:ebcd5ecff2cf 579 {
frankvnk 0:ebcd5ecff2cf 580 int bytesSent = -2;
frankvnk 0:ebcd5ecff2cf 581 while(bytesSent == -2) bytesSent = client.send_all(buf, len);
frankvnk 0:ebcd5ecff2cf 582 }
frankvnk 0:ebcd5ecff2cf 583