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:
Thu Oct 24 19:45:09 2013 +0000
Revision:
2:dac99c6c56d3
Parent:
1:99bfc8d68fd3
fixed runtime error

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 2:dac99c6c56d3 85
frankvnk 2:dac99c6c56d3 86
frankvnk 2:dac99c6c56d3 87
frankvnk 2:dac99c6c56d3 88
frankvnk 0:ebcd5ecff2cf 89
frankvnk 0:ebcd5ecff2cf 90 extern DigitalOut ledr;
frankvnk 0:ebcd5ecff2cf 91 extern DigitalOut ledg;
frankvnk 0:ebcd5ecff2cf 92 extern DigitalOut ledb;
frankvnk 0:ebcd5ecff2cf 93 extern DigitalOut led1;
frankvnk 0:ebcd5ecff2cf 94 extern DigitalOut led2;
frankvnk 0:ebcd5ecff2cf 95 extern DigitalOut led3;
frankvnk 0:ebcd5ecff2cf 96 extern TSISensor tsi;
frankvnk 0:ebcd5ecff2cf 97
frankvnk 0:ebcd5ecff2cf 98 // Setup the functions to handle our CGI parameters
frankvnk 0:ebcd5ecff2cf 99 cgi_handler pHandlers;
frankvnk 0:ebcd5ecff2cf 100 dyn_html_handler htmlHandlers;
frankvnk 0:ebcd5ecff2cf 101
frankvnk 0:ebcd5ecff2cf 102 extern tNetappIpconfigRetArgs ipinfo2;
frankvnk 0:ebcd5ecff2cf 103
frankvnk 0:ebcd5ecff2cf 104 extern axis6_t axis6;
frankvnk 0:ebcd5ecff2cf 105 extern int server_running;
frankvnk 0:ebcd5ecff2cf 106 extern unsigned char newData;
frankvnk 0:ebcd5ecff2cf 107 extern unsigned short adc_sample3;
frankvnk 0:ebcd5ecff2cf 108
frankvnk 0:ebcd5ecff2cf 109 /** \brief Pointer to the index HTML page */
frankvnk 0:ebcd5ecff2cf 110 char * indexPage;
frankvnk 0:ebcd5ecff2cf 111
frankvnk 0:ebcd5ecff2cf 112 /** \brief Pointer to CGI handler structure */
frankvnk 0:ebcd5ecff2cf 113 cgi_handler * chList;
frankvnk 0:ebcd5ecff2cf 114
frankvnk 0:ebcd5ecff2cf 115 /** \brief Pointer to Dynamic HTML handler structure */
frankvnk 0:ebcd5ecff2cf 116 dyn_html_handler * htmlList;
frankvnk 0:ebcd5ecff2cf 117
frankvnk 0:ebcd5ecff2cf 118 /** \brief Pointer to Dynamic HTML handler structure */
frankvnk 0:ebcd5ecff2cf 119 http_server_event_handler * eventHandlers = NULL;
frankvnk 0:ebcd5ecff2cf 120
frankvnk 0:ebcd5ecff2cf 121
frankvnk 0:ebcd5ecff2cf 122 /** \brief Page view counter */
frankvnk 0:ebcd5ecff2cf 123 int viewCounter = 1;
frankvnk 0:ebcd5ecff2cf 124 #define REQ_BUFFER_SIZE 400
frankvnk 0:ebcd5ecff2cf 125 #define HTTP_TX_BLOCK_SIZE 256
frankvnk 0:ebcd5ecff2cf 126 //#define HTTP_TX_BLOCK_SIZE 1024
frankvnk 0:ebcd5ecff2cf 127 //#define HTTP_TX_BLOCK_SIZE 512
frankvnk 0:ebcd5ecff2cf 128
frankvnk 0:ebcd5ecff2cf 129
frankvnk 0:ebcd5ecff2cf 130 // Setup the functions to handle our CGI parameters
frankvnk 0:ebcd5ecff2cf 131 char requestBuffer[REQ_BUFFER_SIZE];
frankvnk 0:ebcd5ecff2cf 132
frankvnk 0:ebcd5ecff2cf 133
frankvnk 0:ebcd5ecff2cf 134
frankvnk 0:ebcd5ecff2cf 135
frankvnk 0:ebcd5ecff2cf 136
frankvnk 0:ebcd5ecff2cf 137 /*
frankvnk 0:ebcd5ecff2cf 138 // ---------- HTML Webpage Content is defined here ----------
frankvnk 0:ebcd5ecff2cf 139 // Caution! Field labels and spaces in the HTML should not be edited without making corresponding changes in the C-code!
frankvnk 0:ebcd5ecff2cf 140 char index[] = {
frankvnk 0:ebcd5ecff2cf 141 "<!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 142 "<head>"
frankvnk 0:ebcd5ecff2cf 143 "<META content=\"text/html;charset=ISO-8859-1\" http-equiv=\"content-type\">"
frankvnk 0:ebcd5ecff2cf 144 "<title>Wi-Go WebServer</title>"
frankvnk 0:ebcd5ecff2cf 145 //"<META HTTP-EQUIV=\"refresh\" content=\"2\">" // Uncomment for auto-refresh every 2 seconds
frankvnk 0:ebcd5ecff2cf 146 "</head>"
frankvnk 0:ebcd5ecff2cf 147
frankvnk 0:ebcd5ecff2cf 148 "<body><div style=\"text-align: left\"><font size=\"6\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 149 "<b>Avnet Wi-Go Webserver</b></font>"
frankvnk 0:ebcd5ecff2cf 150 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 151 "<font size=\"5\" color=\"Red\" face=\"Tahoma\"><b>LED RGB color select...</b></font>"
frankvnk 0:ebcd5ecff2cf 152
frankvnk 0:ebcd5ecff2cf 153 //"<font size=\"5\" color=\"Black\" face=\"monospace\"></font>"
frankvnk 0:ebcd5ecff2cf 154 "<form method=\"get\" action=\"index.html\" name=\"server\">"
frankvnk 0:ebcd5ecff2cf 155 "<input name=\"ledCon\" type=\"submit\" value=\"-Red-\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
frankvnk 0:ebcd5ecff2cf 156 "<input name=\"ledCon\" type=\"submit\" value=\"Green\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
frankvnk 0:ebcd5ecff2cf 157 "<input name=\"ledCon\" type=\"submit\" value=\"Blue-\">"
frankvnk 0:ebcd5ecff2cf 158 "</form></div>"
frankvnk 0:ebcd5ecff2cf 159
frankvnk 0:ebcd5ecff2cf 160 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 161 "<div style=\"text-align: left\"><font size=\"5\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 162 "<b>Navigation Sensors</b></font></div>"
frankvnk 0:ebcd5ecff2cf 163
frankvnk 0:ebcd5ecff2cf 164 "<div style=\"text-align:left\"><font size=\"4\" color=\"Black\" face=\"monospace\"><b>"
frankvnk 0:ebcd5ecff2cf 165 "Acceleration(G).. <br>"
frankvnk 0:ebcd5ecff2cf 166 "Magnetometer(uT). <br>"
frankvnk 0:ebcd5ecff2cf 167 "eCompass......... <br>"
frankvnk 0:ebcd5ecff2cf 168 "Altitude......... <br></b></font></div>"
frankvnk 0:ebcd5ecff2cf 169
frankvnk 0:ebcd5ecff2cf 170 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 171 "<div style=\"text-align: left\"><font size=\"5\" color=\"Red\" face=\"Tahoma\">"
frankvnk 0:ebcd5ecff2cf 172 "<b>Status and Control</b></font></div>"
frankvnk 0:ebcd5ecff2cf 173
frankvnk 0:ebcd5ecff2cf 174 "<div style=\"text-align:left\"><font size=\"4\" color=\"Black\" face=\"monospace\"><b>"
frankvnk 0:ebcd5ecff2cf 175 "Battery Voltage.. <br>"
frankvnk 0:ebcd5ecff2cf 176 "Ambient Light.... <br>"
frankvnk 0:ebcd5ecff2cf 177 "Temperature...... <br>"
frankvnk 0:ebcd5ecff2cf 178 "Slider Position.. <br>"
frankvnk 0:ebcd5ecff2cf 179 "Page Views....... </b></font>"
frankvnk 0:ebcd5ecff2cf 180 "<hr size=3 width=600 align=left>"
frankvnk 0:ebcd5ecff2cf 181 "</body></html>"}; // delete this line if adding the SVG code below...
frankvnk 0:ebcd5ecff2cf 182 */
frankvnk 0:ebcd5ecff2cf 183 // 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 184 // Browsers supporting SVG: Chrome and FireFox (all versions), Android (3.0 onwards), Safari (5.0 onwards), IE (9.0 onwards?)
frankvnk 0:ebcd5ecff2cf 185 /*
frankvnk 0:ebcd5ecff2cf 186 "<!--[if !IE]><!-->" // This prevents SVG content being sent to Internet Explorer
frankvnk 0:ebcd5ecff2cf 187 "<svg>"
frankvnk 0:ebcd5ecff2cf 188 "xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"175.49\" width=\"400\""
frankvnk 0:ebcd5ecff2cf 189 "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
frankvnk 0:ebcd5ecff2cf 190 "xmlns:cc=\"http://creativecommons.org/ns#\""
frankvnk 0:ebcd5ecff2cf 191 "xmlns:dc=\"http://purl.org/dc/elements/1.1/\">"
frankvnk 0:ebcd5ecff2cf 192 "<defs></defs>"
frankvnk 0:ebcd5ecff2cf 193 "<metadata>"
frankvnk 0:ebcd5ecff2cf 194 "<rdf:RDF>"
frankvnk 0:ebcd5ecff2cf 195 "<cc:Work rdf:about=\"\">"
frankvnk 0:ebcd5ecff2cf 196 "<dc:format>image/svg+xml</dc:format>"
frankvnk 0:ebcd5ecff2cf 197 "<dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>"
frankvnk 0:ebcd5ecff2cf 198 "<dc:title/>"
frankvnk 0:ebcd5ecff2cf 199 "</cc:Work>"
frankvnk 0:ebcd5ecff2cf 200 "</rdf:RDF>"
frankvnk 0:ebcd5ecff2cf 201 "</metadata>"
frankvnk 0:ebcd5ecff2cf 202 "<g transform=\"translate(-309.85919,-343.20843)\">"
frankvnk 0:ebcd5ecff2cf 203 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,576.05074,474.82936)\">"
frankvnk 0:ebcd5ecff2cf 204 "<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 205 "</g>"
frankvnk 0:ebcd5ecff2cf 206 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,514.3818,441.01715)\">"
frankvnk 0:ebcd5ecff2cf 207 "<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 208 "</g>"
frankvnk 0:ebcd5ecff2cf 209 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,469.99257,451.60916)\">"
frankvnk 0:ebcd5ecff2cf 210 "<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 211 "</g>"
frankvnk 0:ebcd5ecff2cf 212 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,491.40819,416.23898)\">"
frankvnk 0:ebcd5ecff2cf 213 "<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 214 "</g>"
frankvnk 0:ebcd5ecff2cf 215 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,541.9845,418.05849)\">"
frankvnk 0:ebcd5ecff2cf 216 "<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 217 "</g>"
frankvnk 0:ebcd5ecff2cf 218 "<g transform=\"matrix(3.7361528,0,0,-3.7361528,580.44446,416.23898)\">"
frankvnk 0:ebcd5ecff2cf 219 "<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 220 "</g>"
frankvnk 0:ebcd5ecff2cf 221 "</g>"
frankvnk 0:ebcd5ecff2cf 222 "</svg>"
frankvnk 0:ebcd5ecff2cf 223 "<!--<![endif]-->"
frankvnk 0:ebcd5ecff2cf 224 */ // end of conditional inclusion of SVG graphic (excludes Internet Explorer browser)
frankvnk 0:ebcd5ecff2cf 225 // ---- End of Wi-Fi logo SVG image definition ----
frankvnk 0:ebcd5ecff2cf 226
frankvnk 0:ebcd5ecff2cf 227 // Optional section 2: Simple SVG graphic example: Uncomment this section to generate a filled circle in lower area of webpage
frankvnk 0:ebcd5ecff2cf 228 // eg. Could use to indicate RGB LED color (with addition of applicable C-code to dynamically update specified "fill=" color)
frankvnk 0:ebcd5ecff2cf 229 /*
frankvnk 0:ebcd5ecff2cf 230 "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">"
frankvnk 0:ebcd5ecff2cf 231 "<circle cx=\"155\" cy=\"22\" r=\"20\" stroke=\"DimGrey\" stroke-width=\"2\" fill=\"Red\"/>"
frankvnk 0:ebcd5ecff2cf 232 "</svg>"
frankvnk 0:ebcd5ecff2cf 233 "</body></html>"};
frankvnk 0:ebcd5ecff2cf 234 */
frankvnk 0:ebcd5ecff2cf 235
frankvnk 0:ebcd5ecff2cf 236 // ----------------------------------------------------------
frankvnk 0:ebcd5ecff2cf 237
frankvnk 0:ebcd5ecff2cf 238 //char ssid_name[] = SSID;
frankvnk 0:ebcd5ecff2cf 239 char testString[20];
frankvnk 0:ebcd5ecff2cf 240 //int vcc = 0;
frankvnk 0:ebcd5ecff2cf 241 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 242 //
frankvnk 0:ebcd5ecff2cf 243 //! demo_wi-fi_main
frankvnk 0:ebcd5ecff2cf 244 //!
frankvnk 0:ebcd5ecff2cf 245 //! \param None
frankvnk 0:ebcd5ecff2cf 246 //!
frankvnk 0:ebcd5ecff2cf 247 //! \return none
frankvnk 0:ebcd5ecff2cf 248 //!
frankvnk 0:ebcd5ecff2cf 249 //! \brief The main loop is executed here
frankvnk 0:ebcd5ecff2cf 250 //
frankvnk 0:ebcd5ecff2cf 251 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 252
frankvnk 0:ebcd5ecff2cf 253 int demo_wifi_main(void)
frankvnk 0:ebcd5ecff2cf 254 {
frankvnk 0:ebcd5ecff2cf 255 server_running = 1;
frankvnk 0:ebcd5ecff2cf 256 while(1)
frankvnk 0:ebcd5ecff2cf 257 {
frankvnk 0:ebcd5ecff2cf 258 /* Configure dynamic HTML string handlers
frankvnk 0:ebcd5ecff2cf 259 0 : Acceleration
frankvnk 0:ebcd5ecff2cf 260 1 : Magnetometer
frankvnk 0:ebcd5ecff2cf 261 2 : eCompass
frankvnk 0:ebcd5ecff2cf 262 3 : Altitude
frankvnk 0:ebcd5ecff2cf 263 -------------------
frankvnk 0:ebcd5ecff2cf 264 4 : Battery Voltage
frankvnk 0:ebcd5ecff2cf 265 5 : Ambient Light
frankvnk 0:ebcd5ecff2cf 266 6 : Temperature
frankvnk 0:ebcd5ecff2cf 267 7 : Slider Position
frankvnk 0:ebcd5ecff2cf 268 8 : Page Views
frankvnk 0:ebcd5ecff2cf 269 */
frankvnk 0:ebcd5ecff2cf 270 (htmlHandlers.dynHtmlFunc[0]) = getAccelXYZ_Str;
frankvnk 0:ebcd5ecff2cf 271 memcpy(htmlHandlers.dynHtmlParamName[0],"Acceleration(G).. ",strlen("Acceleration(G).. "));
frankvnk 0:ebcd5ecff2cf 272 htmlHandlers.dynHtmlParamName[0][strlen("Acceleration(G).. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 273
frankvnk 0:ebcd5ecff2cf 274 (htmlHandlers.dynHtmlFunc[1]) = getM3110Str;
frankvnk 0:ebcd5ecff2cf 275 memcpy(htmlHandlers.dynHtmlParamName[1],"Magnetometer(uT). ",strlen("Magnetometer(uT). "));
frankvnk 0:ebcd5ecff2cf 276 htmlHandlers.dynHtmlParamName[1][strlen("Magnetometer(uT). ")] ='\0';
frankvnk 0:ebcd5ecff2cf 277
frankvnk 0:ebcd5ecff2cf 278 (htmlHandlers.dynHtmlFunc[2]) = getCompassStr;
frankvnk 0:ebcd5ecff2cf 279 memcpy(htmlHandlers.dynHtmlParamName[2],"eCompass......... ",strlen("eCompass......... "));
frankvnk 0:ebcd5ecff2cf 280 htmlHandlers.dynHtmlParamName[2][strlen("eCompass......... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 281
frankvnk 0:ebcd5ecff2cf 282 (htmlHandlers.dynHtmlFunc[3]) = getAltitudeStr;
frankvnk 0:ebcd5ecff2cf 283 memcpy(htmlHandlers.dynHtmlParamName[3],"Altitude......... ",strlen("Altitude......... "));
frankvnk 0:ebcd5ecff2cf 284 htmlHandlers.dynHtmlParamName[3][strlen("Altitude......... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 285
frankvnk 0:ebcd5ecff2cf 286 (htmlHandlers.dynHtmlFunc[4]) = getBatteryVoltageStr;
frankvnk 0:ebcd5ecff2cf 287 memcpy(htmlHandlers.dynHtmlParamName[4],"Battery Voltage.. ",strlen("Battery Voltage.. "));
frankvnk 0:ebcd5ecff2cf 288 htmlHandlers.dynHtmlParamName[4][strlen("Battery Voltage.. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 289
frankvnk 0:ebcd5ecff2cf 290 (htmlHandlers.dynHtmlFunc[5]) = getLightVoltageStr;
frankvnk 0:ebcd5ecff2cf 291 memcpy(htmlHandlers.dynHtmlParamName[5],"Ambient Light.... ",strlen("Ambient Light.... "));
frankvnk 0:ebcd5ecff2cf 292 htmlHandlers.dynHtmlParamName[5][strlen("Ambient Light.... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 293
frankvnk 0:ebcd5ecff2cf 294 (htmlHandlers.dynHtmlFunc[6]) = getTemperatureStr;
frankvnk 0:ebcd5ecff2cf 295 memcpy(htmlHandlers.dynHtmlParamName[6],"Temperature...... ",strlen("Temperature...... "));
frankvnk 0:ebcd5ecff2cf 296 htmlHandlers.dynHtmlParamName[6][strlen("Temperature...... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 297
frankvnk 0:ebcd5ecff2cf 298 (htmlHandlers.dynHtmlFunc[7]) = getTSI_sliderStr;
frankvnk 0:ebcd5ecff2cf 299 memcpy(htmlHandlers.dynHtmlParamName[7],"Slider Position.. ",strlen("Slider Position.. "));
frankvnk 0:ebcd5ecff2cf 300 htmlHandlers.dynHtmlParamName[7][strlen("Slider Position.. ")] ='\0';
frankvnk 0:ebcd5ecff2cf 301
frankvnk 0:ebcd5ecff2cf 302 (htmlHandlers.dynHtmlFunc[8]) = getViewsNum;
frankvnk 0:ebcd5ecff2cf 303 memcpy(htmlHandlers.dynHtmlParamName[8],"Page Views....... ",strlen("Page Views....... "));
frankvnk 0:ebcd5ecff2cf 304 htmlHandlers.dynHtmlParamName[8][strlen("Page Views....... ")] ='\0';
frankvnk 0:ebcd5ecff2cf 305
frankvnk 0:ebcd5ecff2cf 306 // Configure CGI Handler
frankvnk 0:ebcd5ecff2cf 307 (pHandlers.cgiHandlerFunc[0]) = testFunc;
frankvnk 0:ebcd5ecff2cf 308
frankvnk 0:ebcd5ecff2cf 309 serverMain(HTTP_PORT,(char *)index, &pHandlers, &htmlHandlers);
frankvnk 0:ebcd5ecff2cf 310 }
frankvnk 0:ebcd5ecff2cf 311 }
frankvnk 0:ebcd5ecff2cf 312
frankvnk 0:ebcd5ecff2cf 313
frankvnk 0:ebcd5ecff2cf 314 void testFunc(char * str)
frankvnk 0:ebcd5ecff2cf 315 {
frankvnk 0:ebcd5ecff2cf 316 memcpy(testString,str,strlen(str));
frankvnk 0:ebcd5ecff2cf 317 if(strcmp(str, "-Red-") == 0)
frankvnk 0:ebcd5ecff2cf 318 {
frankvnk 0:ebcd5ecff2cf 319 RED_ON; GREEN_OFF; BLUE_OFF;
frankvnk 0:ebcd5ecff2cf 320 }
frankvnk 0:ebcd5ecff2cf 321 else if(strcmp(str, "Green") == 0)
frankvnk 0:ebcd5ecff2cf 322 {
frankvnk 0:ebcd5ecff2cf 323 RED_OFF; GREEN_ON; BLUE_OFF;
frankvnk 0:ebcd5ecff2cf 324 }
frankvnk 0:ebcd5ecff2cf 325 else if (strcmp(str, "Blue-") == 0)
frankvnk 0:ebcd5ecff2cf 326 {
frankvnk 0:ebcd5ecff2cf 327 RED_OFF; GREEN_OFF; BLUE_ON;
frankvnk 0:ebcd5ecff2cf 328 }
frankvnk 0:ebcd5ecff2cf 329 }
frankvnk 0:ebcd5ecff2cf 330
frankvnk 0:ebcd5ecff2cf 331 void getBatteryVoltageStr(char * str)
frankvnk 0:ebcd5ecff2cf 332 {
frankvnk 0:ebcd5ecff2cf 333 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 334 sprintf(str, "%d %%", adc_sample3);
frankvnk 0:ebcd5ecff2cf 335 }
frankvnk 0:ebcd5ecff2cf 336
frankvnk 0:ebcd5ecff2cf 337 void getLightVoltageStr(char * str)
frankvnk 0:ebcd5ecff2cf 338 {
frankvnk 0:ebcd5ecff2cf 339 int LightPercent = 0;
frankvnk 0:ebcd5ecff2cf 340 LightPercent = (axis6.light * 100) / 4096;
frankvnk 0:ebcd5ecff2cf 341 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 342 sprintf(str, "%d %%", LightPercent);
frankvnk 0:ebcd5ecff2cf 343 }
frankvnk 0:ebcd5ecff2cf 344
frankvnk 0:ebcd5ecff2cf 345 void getAccelXYZ_Str(char * str) // MMA8451Q accelerometer - report axis with highest value
frankvnk 0:ebcd5ecff2cf 346 {
frankvnk 0:ebcd5ecff2cf 347 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 348 sprintf(str, "X= %1.2f, Y= %1.2f, Z= %1.2f", axis6.fGax, axis6.fGay, axis6.fGaz);;
frankvnk 0:ebcd5ecff2cf 349 }
frankvnk 0:ebcd5ecff2cf 350
frankvnk 0:ebcd5ecff2cf 351 void getTemperatureStr(char * str) //
frankvnk 0:ebcd5ecff2cf 352 {
frankvnk 0:ebcd5ecff2cf 353 sprintf(str, "%+d C", axis6.temp);
frankvnk 0:ebcd5ecff2cf 354 }
frankvnk 0:ebcd5ecff2cf 355
frankvnk 0:ebcd5ecff2cf 356 void getTSI_sliderStr(char * str) // TSI Slider position
frankvnk 0:ebcd5ecff2cf 357 {
frankvnk 0:ebcd5ecff2cf 358 uint8_t slider_position;
frankvnk 0:ebcd5ecff2cf 359
frankvnk 0:ebcd5ecff2cf 360 slider_position = tsi.readPercentage() * 100; // Slider position as percentage
frankvnk 0:ebcd5ecff2cf 361 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 362 sprintf(str, "%d %%", slider_position);
frankvnk 0:ebcd5ecff2cf 363 }
frankvnk 0:ebcd5ecff2cf 364
frankvnk 0:ebcd5ecff2cf 365 void getCompassStr(char * str) // Mag3110 generated Compass bearing
frankvnk 0:ebcd5ecff2cf 366 {
frankvnk 0:ebcd5ecff2cf 367 char *compass_points[9] = {"North", "N-East", "East", "S-East", "South", "S-West", "West", "N-West", "North"};
frankvnk 0:ebcd5ecff2cf 368 signed short compass_bearing = (axis6.compass + 23) / 45;
frankvnk 0:ebcd5ecff2cf 369 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 370 sprintf(str, "Roll=%-d Pitch=%-d Yaw=%-d [%s]", axis6.roll, axis6.pitch, axis6.yaw, compass_points[compass_bearing]); //
frankvnk 0:ebcd5ecff2cf 371 }
frankvnk 0:ebcd5ecff2cf 372
frankvnk 0:ebcd5ecff2cf 373 void getM3110Str(char * str) // Mag3110 displayed in units of UT
frankvnk 0:ebcd5ecff2cf 374 {
frankvnk 0:ebcd5ecff2cf 375 sprintf(str," "); //clears field (needed if previous string had more characters)
frankvnk 0:ebcd5ecff2cf 376 sprintf(str, "X= %3.1f, Y= %3.1f, Z= %3.1f", axis6.fUTmx, axis6.fUTmy, axis6.fUTmz);
frankvnk 0:ebcd5ecff2cf 377 }
frankvnk 0:ebcd5ecff2cf 378
frankvnk 0:ebcd5ecff2cf 379 void getAltitudeStr(char * str) // Get Altitude
frankvnk 0:ebcd5ecff2cf 380 {
frankvnk 0:ebcd5ecff2cf 381 sprintf(str, "%+d meters", axis6.alt); // str = integer portion of result
frankvnk 0:ebcd5ecff2cf 382 }
frankvnk 0:ebcd5ecff2cf 383
frankvnk 0:ebcd5ecff2cf 384
frankvnk 0:ebcd5ecff2cf 385
frankvnk 0:ebcd5ecff2cf 386 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 387 //
frankvnk 0:ebcd5ecff2cf 388 //! \brief Main HTTP Server
frankvnk 0:ebcd5ecff2cf 389 //!
frankvnk 0:ebcd5ecff2cf 390 //! \param none
frankvnk 0:ebcd5ecff2cf 391 //!
frankvnk 0:ebcd5ecff2cf 392 //! \return none
frankvnk 0:ebcd5ecff2cf 393 //!
frankvnk 0:ebcd5ecff2cf 394 //
frankvnk 0:ebcd5ecff2cf 395 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 396 void serverMain(int port,
frankvnk 0:ebcd5ecff2cf 397 char * ipage,
frankvnk 0:ebcd5ecff2cf 398 cgi_handler * handleList,
frankvnk 0:ebcd5ecff2cf 399 dyn_html_handler * dhList)
frankvnk 0:ebcd5ecff2cf 400 {
frankvnk 2:dac99c6c56d3 401 static TCPSocketServer server;
frankvnk 2:dac99c6c56d3 402 static TCPSocketConnection client;
frankvnk 2:dac99c6c56d3 403
frankvnk 0:ebcd5ecff2cf 404 indexPage = ipage;
frankvnk 0:ebcd5ecff2cf 405 chList = handleList;
frankvnk 0:ebcd5ecff2cf 406 htmlList = dhList;
frankvnk 0:ebcd5ecff2cf 407
frankvnk 0:ebcd5ecff2cf 408 server.bind(port);
frankvnk 0:ebcd5ecff2cf 409
frankvnk 0:ebcd5ecff2cf 410 printf("Main HTTP server\r\n");
frankvnk 0:ebcd5ecff2cf 411
frankvnk 0:ebcd5ecff2cf 412 // Start Listening
frankvnk 0:ebcd5ecff2cf 413 if(server.listen() != 0);
frankvnk 0:ebcd5ecff2cf 414
frankvnk 0:ebcd5ecff2cf 415 // Handle Clients and Data
frankvnk 0:ebcd5ecff2cf 416 while(1)
frankvnk 0:ebcd5ecff2cf 417 {
frankvnk 0:ebcd5ecff2cf 418 int32_t status = server.accept(client);
frankvnk 0:ebcd5ecff2cf 419 if (status >= 0)
frankvnk 0:ebcd5ecff2cf 420 {
frankvnk 1:99bfc8d68fd3 421 LED_D2_ON;
frankvnk 0:ebcd5ecff2cf 422 // Connection Accepted, Send Data
frankvnk 0:ebcd5ecff2cf 423 // Wait for a data update
frankvnk 1:99bfc8d68fd3 424 client.set_blocking(true);
frankvnk 1:99bfc8d68fd3 425 printf("Connection\r\n");
frankvnk 1:99bfc8d68fd3 426 // printf("Connection from: %s \r\n", client.get_address());
frankvnk 2:dac99c6c56d3 427 if(newData) handleHTTPRequest(&client);
frankvnk 1:99bfc8d68fd3 428 newData = 0;
frankvnk 0:ebcd5ecff2cf 429 client.close();
frankvnk 1:99bfc8d68fd3 430 LED_D2_OFF;
frankvnk 0:ebcd5ecff2cf 431 }
frankvnk 0:ebcd5ecff2cf 432 else if(status == -57)
frankvnk 0:ebcd5ecff2cf 433 {
frankvnk 0:ebcd5ecff2cf 434 // BUG: Socket inactive so reopen socket
frankvnk 0:ebcd5ecff2cf 435 // Inactive Socket, close and reopen it
frankvnk 0:ebcd5ecff2cf 436 printf("Oops!!!\r\n");
frankvnk 0:ebcd5ecff2cf 437 server.close();
frankvnk 0:ebcd5ecff2cf 438 indexPage = ipage;
frankvnk 0:ebcd5ecff2cf 439 chList = handleList;
frankvnk 0:ebcd5ecff2cf 440 htmlList = dhList;
frankvnk 0:ebcd5ecff2cf 441 server.bind(port);
frankvnk 0:ebcd5ecff2cf 442
frankvnk 0:ebcd5ecff2cf 443 // Start Listening
frankvnk 0:ebcd5ecff2cf 444 if (server.listen() != 0);
frankvnk 0:ebcd5ecff2cf 445 }
frankvnk 0:ebcd5ecff2cf 446 }
frankvnk 0:ebcd5ecff2cf 447 }
frankvnk 0:ebcd5ecff2cf 448
frankvnk 0:ebcd5ecff2cf 449 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 450 //
frankvnk 0:ebcd5ecff2cf 451 //! \brief Handles HTTP Requests
frankvnk 0:ebcd5ecff2cf 452 //!
frankvnk 0:ebcd5ecff2cf 453 //! \param cnum is the client socket handle to be used
frankvnk 0:ebcd5ecff2cf 454 //!
frankvnk 0:ebcd5ecff2cf 455 //! \return none
frankvnk 0:ebcd5ecff2cf 456 //!
frankvnk 0:ebcd5ecff2cf 457 //
frankvnk 0:ebcd5ecff2cf 458 //*****************************************************************************
frankvnk 2:dac99c6c56d3 459 void handleHTTPRequest(TCPSocketConnection *client)
frankvnk 0:ebcd5ecff2cf 460 {
frankvnk 0:ebcd5ecff2cf 461 char * reqline[3];
frankvnk 0:ebcd5ecff2cf 462 char * cgiTok;
frankvnk 0:ebcd5ecff2cf 463
frankvnk 0:ebcd5ecff2cf 464 int i = 0;
frankvnk 0:ebcd5ecff2cf 465 char paramBuf[20];
frankvnk 0:ebcd5ecff2cf 466 int bytesRecvd;
frankvnk 0:ebcd5ecff2cf 467 char tempStr[40]; //PF was 26
frankvnk 0:ebcd5ecff2cf 468
frankvnk 0:ebcd5ecff2cf 469 memset(requestBuffer,0,sizeof (requestBuffer));
frankvnk 2:dac99c6c56d3 470 bytesRecvd = client->receive(requestBuffer, sizeof(requestBuffer));
frankvnk 0:ebcd5ecff2cf 471
frankvnk 1:99bfc8d68fd3 472 printf("handleHTTPRequest\r\n");
frankvnk 0:ebcd5ecff2cf 473
frankvnk 0:ebcd5ecff2cf 474 if(bytesRecvd > 0)
frankvnk 0:ebcd5ecff2cf 475 {
frankvnk 0:ebcd5ecff2cf 476 // Received some data, check it and send data back
frankvnk 0:ebcd5ecff2cf 477 reqline[0] = strstr(requestBuffer, "GET");
frankvnk 0:ebcd5ecff2cf 478 if ( reqline[0] != NULL )
frankvnk 0:ebcd5ecff2cf 479 {
frankvnk 0:ebcd5ecff2cf 480 if (strstr (requestBuffer, "HTTP/1.0") != NULL && strstr (requestBuffer, "HTTP/1.1") != NULL )
frankvnk 0:ebcd5ecff2cf 481 {
frankvnk 2:dac99c6c56d3 482 client->send_all("HTTP/1.0 400 Bad Request\n", 25);
frankvnk 0:ebcd5ecff2cf 483 }
frankvnk 0:ebcd5ecff2cf 484 else
frankvnk 0:ebcd5ecff2cf 485 {
frankvnk 0:ebcd5ecff2cf 486
frankvnk 0:ebcd5ecff2cf 487 #ifdef HTTP_CGI_ENABLED
frankvnk 0:ebcd5ecff2cf 488 // Do we have CGI parameters we need to parse?
frankvnk 0:ebcd5ecff2cf 489 if(strchr(requestBuffer, '?') != NULL)
frankvnk 0:ebcd5ecff2cf 490 {
frankvnk 0:ebcd5ecff2cf 491 // Decode URL and handle each parameter sequentially
frankvnk 0:ebcd5ecff2cf 492 // according to table previously setup.
frankvnk 0:ebcd5ecff2cf 493 cgiTok = strstr(requestBuffer,"=");
frankvnk 0:ebcd5ecff2cf 494 if(cgiTok != NULL)
frankvnk 0:ebcd5ecff2cf 495 {
frankvnk 0:ebcd5ecff2cf 496 memset(paramBuf,0,sizeof(paramBuf));
frankvnk 0:ebcd5ecff2cf 497 memcpy(paramBuf,cgiTok+1,5); // hard-coded for demo: 5 character parameter (-Red-/Green/Blue-)
frankvnk 0:ebcd5ecff2cf 498 chList->cgiHandlerFunc[0](paramBuf);
frankvnk 0:ebcd5ecff2cf 499
frankvnk 0:ebcd5ecff2cf 500 }
frankvnk 0:ebcd5ecff2cf 501 }
frankvnk 0:ebcd5ecff2cf 502 #endif
frankvnk 0:ebcd5ecff2cf 503
frankvnk 0:ebcd5ecff2cf 504 #ifdef HTTP_DYN_HTML_ENABLED
frankvnk 0:ebcd5ecff2cf 505 // The code below replaces data in the HTML page
frankvnk 0:ebcd5ecff2cf 506 // with that generated by the specified functions.
frankvnk 0:ebcd5ecff2cf 507 for(i = 0; i < 9; i++) // change the range here for more dynamic fields on webpage
frankvnk 0:ebcd5ecff2cf 508 {
frankvnk 0:ebcd5ecff2cf 509 memset(tempStr,0,sizeof(tempStr));
frankvnk 0:ebcd5ecff2cf 510 htmlList->dynHtmlFunc[i](tempStr);
frankvnk 0:ebcd5ecff2cf 511 tempStr[strlen(tempStr)]= ' ';
frankvnk 0:ebcd5ecff2cf 512 pageReplace((char *)indexPage,
frankvnk 0:ebcd5ecff2cf 513 (char *)htmlList->dynHtmlParamName[i],
frankvnk 0:ebcd5ecff2cf 514 (char *)tempStr);
frankvnk 0:ebcd5ecff2cf 515 }
frankvnk 0:ebcd5ecff2cf 516 #endif
frankvnk 0:ebcd5ecff2cf 517 viewCounter++;
frankvnk 2:dac99c6c56d3 518 sendHTTPData(HTTP_RESP, strlen(HTTP_RESP), client);
frankvnk 0:ebcd5ecff2cf 519
frankvnk 0:ebcd5ecff2cf 520 for(i = 0; i < strlen(indexPage); i += HTTP_TX_BLOCK_SIZE)
frankvnk 0:ebcd5ecff2cf 521 {
frankvnk 0:ebcd5ecff2cf 522 if(strlen(indexPage) - i < HTTP_TX_BLOCK_SIZE)
frankvnk 0:ebcd5ecff2cf 523 {
frankvnk 2:dac99c6c56d3 524 sendHTTPData(&indexPage[i], strlen(indexPage) - i, client);
frankvnk 0:ebcd5ecff2cf 525 }
frankvnk 0:ebcd5ecff2cf 526 else
frankvnk 0:ebcd5ecff2cf 527 {
frankvnk 2:dac99c6c56d3 528 sendHTTPData(&indexPage[i], HTTP_TX_BLOCK_SIZE, client);
frankvnk 0:ebcd5ecff2cf 529 }
frankvnk 0:ebcd5ecff2cf 530 }
frankvnk 0:ebcd5ecff2cf 531 }
frankvnk 0:ebcd5ecff2cf 532 }
frankvnk 0:ebcd5ecff2cf 533 }
frankvnk 0:ebcd5ecff2cf 534 }
frankvnk 0:ebcd5ecff2cf 535
frankvnk 0:ebcd5ecff2cf 536 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 537 //
frankvnk 0:ebcd5ecff2cf 538 //! \brief Inserts characters in page that appear after an indicator ind
frankvnk 0:ebcd5ecff2cf 539 //! with the value from val
frankvnk 0:ebcd5ecff2cf 540 //!
frankvnk 0:ebcd5ecff2cf 541 //! \param page is a pointer to the array holding the page's HTML code
frankvnk 0:ebcd5ecff2cf 542 //! \param ind is a pointer to a string that has the name of the parameter on the page to modify
frankvnk 0:ebcd5ecff2cf 543 //! \param val is the pointer to a string holding the string to insert in the XXX
frankvnk 0:ebcd5ecff2cf 544 //!
frankvnk 0:ebcd5ecff2cf 545 //! \return none
frankvnk 0:ebcd5ecff2cf 546 //!
frankvnk 0:ebcd5ecff2cf 547 //
frankvnk 0:ebcd5ecff2cf 548 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 549 void pageReplace(char * page, char * ind, char * val)
frankvnk 0:ebcd5ecff2cf 550 {
frankvnk 0:ebcd5ecff2cf 551 char * indicLoc;
frankvnk 0:ebcd5ecff2cf 552 indicLoc = strstr (page,ind);
frankvnk 0:ebcd5ecff2cf 553 memcpy(indicLoc+strlen(ind), val, strlen(val));
frankvnk 0:ebcd5ecff2cf 554 }
frankvnk 0:ebcd5ecff2cf 555
frankvnk 0:ebcd5ecff2cf 556 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 557 //
frankvnk 0:ebcd5ecff2cf 558 //! \brief Returns a string with the number of views of the page
frankvnk 0:ebcd5ecff2cf 559 //!
frankvnk 0:ebcd5ecff2cf 560 //! \param str is a pointer to the array where the number of views will be put
frankvnk 0:ebcd5ecff2cf 561 //!
frankvnk 0:ebcd5ecff2cf 562 //! \return none
frankvnk 0:ebcd5ecff2cf 563 //!
frankvnk 0:ebcd5ecff2cf 564 //
frankvnk 0:ebcd5ecff2cf 565 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 566 void getViewsNum(char * str)
frankvnk 0:ebcd5ecff2cf 567 {
frankvnk 0:ebcd5ecff2cf 568 sprintf(str, "%d", viewCounter);
frankvnk 0:ebcd5ecff2cf 569 }
frankvnk 0:ebcd5ecff2cf 570
frankvnk 0:ebcd5ecff2cf 571 //*****************************************************************************
frankvnk 0:ebcd5ecff2cf 572 //
frankvnk 0:ebcd5ecff2cf 573 //! \brief Sends HTTP Data
frankvnk 0:ebcd5ecff2cf 574 //!
frankvnk 0:ebcd5ecff2cf 575 //! \param sdesc is the socket descriptor of the socket used for sending data
frankvnk 0:ebcd5ecff2cf 576 //! \param buf is a pointer to the buffer with the data to be sent
frankvnk 0:ebcd5ecff2cf 577 //! \param len is the number of bytes to send
frankvnk 0:ebcd5ecff2cf 578 //!
frankvnk 0:ebcd5ecff2cf 579 //! \return none
frankvnk 0:ebcd5ecff2cf 580 //!
frankvnk 0:ebcd5ecff2cf 581 //
frankvnk 0:ebcd5ecff2cf 582 //*****************************************************************************
frankvnk 2:dac99c6c56d3 583 void sendHTTPData(char * buf, long len, TCPSocketConnection *client)
frankvnk 0:ebcd5ecff2cf 584 {
frankvnk 0:ebcd5ecff2cf 585 int bytesSent = -2;
frankvnk 2:dac99c6c56d3 586 while(bytesSent == -2) bytesSent = client->send_all(buf, len);
frankvnk 0:ebcd5ecff2cf 587 }
frankvnk 0:ebcd5ecff2cf 588