TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.

Dependencies:   mbed

Committer:
dflet
Date:
Fri Sep 11 15:38:33 2015 +0000
Revision:
1:e448e81c416f
Parent:
0:400d8e75a8d0
Removed some debud.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:400d8e75a8d0 1 //*****************************************************************************
dflet 0:400d8e75a8d0 2 // httpserver_app.c
dflet 0:400d8e75a8d0 3 //
dflet 0:400d8e75a8d0 4 // camera application macro & APIs
dflet 0:400d8e75a8d0 5 //
dflet 0:400d8e75a8d0 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:400d8e75a8d0 7 //
dflet 0:400d8e75a8d0 8 //
dflet 0:400d8e75a8d0 9 // Redistribution and use in source and binary forms, with or without
dflet 0:400d8e75a8d0 10 // modification, are permitted provided that the following conditions
dflet 0:400d8e75a8d0 11 // are met:
dflet 0:400d8e75a8d0 12 //
dflet 0:400d8e75a8d0 13 // Redistributions of source code must retain the above copyright
dflet 0:400d8e75a8d0 14 // notice, this list of conditions and the following disclaimer.
dflet 0:400d8e75a8d0 15 //
dflet 0:400d8e75a8d0 16 // Redistributions in binary form must reproduce the above copyright
dflet 0:400d8e75a8d0 17 // notice, this list of conditions and the following disclaimer in the
dflet 0:400d8e75a8d0 18 // documentation and/or other materials provided with the
dflet 0:400d8e75a8d0 19 // distribution.
dflet 0:400d8e75a8d0 20 //
dflet 0:400d8e75a8d0 21 // Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:400d8e75a8d0 22 // its contributors may be used to endorse or promote products derived
dflet 0:400d8e75a8d0 23 // from this software without specific prior written permission.
dflet 0:400d8e75a8d0 24 //
dflet 0:400d8e75a8d0 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:400d8e75a8d0 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:400d8e75a8d0 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:400d8e75a8d0 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:400d8e75a8d0 30 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:400d8e75a8d0 31 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:400d8e75a8d0 32 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:400d8e75a8d0 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:400d8e75a8d0 34 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:400d8e75a8d0 35 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:400d8e75a8d0 36 //
dflet 0:400d8e75a8d0 37 //*****************************************************************************
dflet 0:400d8e75a8d0 38 //*****************************************************************************
dflet 0:400d8e75a8d0 39 //
dflet 0:400d8e75a8d0 40 //! \addtogroup Httpserverapp
dflet 0:400d8e75a8d0 41 //! @{
dflet 0:400d8e75a8d0 42 //
dflet 0:400d8e75a8d0 43 //*****************************************************************************
dflet 0:400d8e75a8d0 44
dflet 0:400d8e75a8d0 45 #include <string.h>
dflet 0:400d8e75a8d0 46 #include <stdlib.h>
dflet 0:400d8e75a8d0 47
dflet 0:400d8e75a8d0 48 // SimpleLink include
dflet 0:400d8e75a8d0 49 #include "cc3100_simplelink.h"
dflet 0:400d8e75a8d0 50 #include "cc3100_sl_common.h"
dflet 0:400d8e75a8d0 51
dflet 0:400d8e75a8d0 52 // Free-RTOS/TI-RTOS include
dflet 0:400d8e75a8d0 53 #include "osi.h"
dflet 0:400d8e75a8d0 54
dflet 0:400d8e75a8d0 55 // HTTP lib includes
dflet 0:400d8e75a8d0 56 #include "HttpCore.h"
dflet 0:400d8e75a8d0 57 #include "HttpRequest.h"
dflet 0:400d8e75a8d0 58
dflet 0:400d8e75a8d0 59 #include "websocketapp.h"
dflet 0:400d8e75a8d0 60 #include "httpserverapp.h"
dflet 0:400d8e75a8d0 61 #include "camera_app.h"
dflet 0:400d8e75a8d0 62
dflet 0:400d8e75a8d0 63 #include "ArduCAM.h"
dflet 0:400d8e75a8d0 64 #include "cli_uart.h"
dflet 0:400d8e75a8d0 65 #include "app_config.h"
dflet 0:400d8e75a8d0 66 #include "myBoardInit.h"
dflet 0:400d8e75a8d0 67 #include "HttpDebug.h"
dflet 0:400d8e75a8d0 68
dflet 0:400d8e75a8d0 69 using namespace mbed_cc3100;
dflet 0:400d8e75a8d0 70
dflet 0:400d8e75a8d0 71 cc3100 _cc3100_Mod(NC, NC, p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck
dflet 0:400d8e75a8d0 72
dflet 0:400d8e75a8d0 73 ArduCAM CAM(OV5642, p14, SPI(p11, p12, p13), I2C(p28, p27));
dflet 0:400d8e75a8d0 74
dflet 0:400d8e75a8d0 75 /****************************************************************************/
dflet 0:400d8e75a8d0 76 /* MACROS */
dflet 0:400d8e75a8d0 77 /****************************************************************************/
dflet 0:400d8e75a8d0 78
dflet 0:400d8e75a8d0 79
dflet 0:400d8e75a8d0 80 /****************************************************************************
dflet 0:400d8e75a8d0 81 Global variables
dflet 0:400d8e75a8d0 82 ****************************************************************************/
dflet 0:400d8e75a8d0 83 char *g_Buffer;
dflet 0:400d8e75a8d0 84 UINT8 g_success = 0;
dflet 0:400d8e75a8d0 85 int g_close = 0;
dflet 0:400d8e75a8d0 86 UINT16 g_uConnection;
dflet 0:400d8e75a8d0 87 OsiTaskHandle g_iCameraTaskHdl = 0;
dflet 0:400d8e75a8d0 88
dflet 0:400d8e75a8d0 89
dflet 0:400d8e75a8d0 90 void WebSocketCloseSessionHandler()
dflet 0:400d8e75a8d0 91 {
dflet 0:400d8e75a8d0 92 g_close = 1;
dflet 0:400d8e75a8d0 93 }
dflet 0:400d8e75a8d0 94
dflet 0:400d8e75a8d0 95 void CameraAppTask(void *param)
dflet 0:400d8e75a8d0 96 {
dflet 0:400d8e75a8d0 97 UINT8 Opcode = 0x02;
dflet 0:400d8e75a8d0 98 struct HttpBlob Write;
dflet 0:400d8e75a8d0 99
dflet 0:400d8e75a8d0 100 /* Reset cam */
dflet 0:400d8e75a8d0 101 // CAM.set_bit(ARDUCHIP_GPIO,GPIO_RESET_MASK);
dflet 0:400d8e75a8d0 102 // wait_ms(50);
dflet 0:400d8e75a8d0 103 // CAM.clear_bit(ARDUCHIP_GPIO,GPIO_RESET_MASK);
dflet 0:400d8e75a8d0 104 // wait(1);
dflet 0:400d8e75a8d0 105 CAM.write_reg(ARDUCHIP_MODE, 0x00);
dflet 0:400d8e75a8d0 106
dflet 0:400d8e75a8d0 107
dflet 0:400d8e75a8d0 108 #ifdef ENABLE_JPEG
dflet 0:400d8e75a8d0 109 InitCameraComponents(320, 240);
dflet 0:400d8e75a8d0 110 #else
dflet 0:400d8e75a8d0 111 InitCameraComponents(240, 256);
dflet 0:400d8e75a8d0 112 #endif
dflet 0:400d8e75a8d0 113
dflet 0:400d8e75a8d0 114 while(1)
dflet 0:400d8e75a8d0 115 {
dflet 0:400d8e75a8d0 116 if(g_close == 0)
dflet 0:400d8e75a8d0 117 {
dflet 0:400d8e75a8d0 118 Write.uLength = StartCamera((char **)&Write.pData);
dflet 0:400d8e75a8d0 119 if(!sl_WebSocketSend(g_uConnection, Write, Opcode))
dflet 0:400d8e75a8d0 120 {
dflet 0:400d8e75a8d0 121 Uart_Write((uint8_t*)"sl_WebSocketSend failed.\n\r");
dflet 0:400d8e75a8d0 122 while(1);
dflet 0:400d8e75a8d0 123 }
dflet 0:400d8e75a8d0 124 }
dflet 0:400d8e75a8d0 125 }
dflet 0:400d8e75a8d0 126
dflet 0:400d8e75a8d0 127 }
dflet 0:400d8e75a8d0 128
dflet 0:400d8e75a8d0 129
dflet 0:400d8e75a8d0 130 /*!
dflet 0:400d8e75a8d0 131 * \brief This websocket Event is called when WebSocket Server receives data
dflet 0:400d8e75a8d0 132 * from client.
dflet 0:400d8e75a8d0 133 *
dflet 0:400d8e75a8d0 134 *
dflet 0:400d8e75a8d0 135 * \param[in] uConnection Websocket Client Id
dflet 0:400d8e75a8d0 136 * \param[in] *ReadBuffer Pointer to the buffer that holds the payload.
dflet 0:400d8e75a8d0 137 *
dflet 0:400d8e75a8d0 138 * \return none.
dflet 0:400d8e75a8d0 139 *
dflet 0:400d8e75a8d0 140 */
dflet 0:400d8e75a8d0 141 void WebSocketRecvEventHandler(UINT16 uConnection, char *ReadBuffer)
dflet 0:400d8e75a8d0 142 {
dflet 0:400d8e75a8d0 143 char *camera = "capture";
dflet 0:400d8e75a8d0 144
dflet 0:400d8e75a8d0 145 /*
dflet 0:400d8e75a8d0 146 * UINT8 Opcode;
dflet 0:400d8e75a8d0 147 * struct HttpBlob Write;
dflet 0:400d8e75a8d0 148 */
dflet 0:400d8e75a8d0 149
dflet 0:400d8e75a8d0 150 g_uConnection = uConnection;
dflet 0:400d8e75a8d0 151
dflet 0:400d8e75a8d0 152 g_Buffer = ReadBuffer;
dflet 0:400d8e75a8d0 153 g_close = 0;
dflet 0:400d8e75a8d0 154 if (!strcmp(ReadBuffer,camera))
dflet 0:400d8e75a8d0 155 {
dflet 0:400d8e75a8d0 156 if(!g_iCameraTaskHdl)
dflet 0:400d8e75a8d0 157 {
dflet 0:400d8e75a8d0 158 osi_TaskCreate(CameraAppTask,
dflet 0:400d8e75a8d0 159 "CameraApp",
dflet 0:400d8e75a8d0 160 1024,
dflet 0:400d8e75a8d0 161 NULL,
dflet 0:400d8e75a8d0 162 CAMERA_SERVICE_PRIORITY,
dflet 0:400d8e75a8d0 163 &g_iCameraTaskHdl);
dflet 0:400d8e75a8d0 164 }
dflet 0:400d8e75a8d0 165
dflet 0:400d8e75a8d0 166 }
dflet 0:400d8e75a8d0 167 //Free memory as we are not using anywhere later
dflet 0:400d8e75a8d0 168 free(g_Buffer);
dflet 0:400d8e75a8d0 169 g_Buffer = NULL;
dflet 0:400d8e75a8d0 170 /* Enter websocket application code here */
dflet 0:400d8e75a8d0 171 return;
dflet 0:400d8e75a8d0 172 }
dflet 0:400d8e75a8d0 173
dflet 0:400d8e75a8d0 174
dflet 0:400d8e75a8d0 175 /*!
dflet 0:400d8e75a8d0 176 * \brief This websocket Event indicates successful handshake with client
dflet 0:400d8e75a8d0 177 * Once this is called the server can start sending data packets over websocket using
dflet 0:400d8e75a8d0 178 * the sl_WebSocketSend API.
dflet 0:400d8e75a8d0 179 *
dflet 0:400d8e75a8d0 180 *
dflet 0:400d8e75a8d0 181 * \param[in] uConnection Websocket Client Id
dflet 0:400d8e75a8d0 182 *
dflet 0:400d8e75a8d0 183 * \return none
dflet 0:400d8e75a8d0 184 */
dflet 0:400d8e75a8d0 185 void WebSocketHandshakeEventHandler(UINT16 uConnection)
dflet 0:400d8e75a8d0 186 {
dflet 0:400d8e75a8d0 187 g_success = 1;
dflet 0:400d8e75a8d0 188 g_uConnection = uConnection;
dflet 0:400d8e75a8d0 189 }
dflet 0:400d8e75a8d0 190
dflet 0:400d8e75a8d0 191
dflet 0:400d8e75a8d0 192 //****************************************************************************
dflet 0:400d8e75a8d0 193 //
dflet 0:400d8e75a8d0 194 //! Task function start the device and crete a TCP server showcasing the smart
dflet 0:400d8e75a8d0 195 //! plug
dflet 0:400d8e75a8d0 196 //!
dflet 0:400d8e75a8d0 197 //****************************************************************************
dflet 0:400d8e75a8d0 198
dflet 0:400d8e75a8d0 199
dflet 0:400d8e75a8d0 200 void HttpServerAppTask(void * param)
dflet 0:400d8e75a8d0 201 {
dflet 0:400d8e75a8d0 202 int32_t lRetVal = -1;
dflet 0:400d8e75a8d0 203 Uart_Write((uint8_t*)"Start SimpleLink in AP Mode \n\r");
dflet 0:400d8e75a8d0 204 //Start SimpleLink in AP Mode
dflet 0:400d8e75a8d0 205 lRetVal = _cc3100_Mod.Network_IF_InitDriver(ROLE_AP);
dflet 0:400d8e75a8d0 206 if(lRetVal < 0)
dflet 0:400d8e75a8d0 207 {
dflet 0:400d8e75a8d0 208 Uart_Write((uint8_t*)"Start SimpleLink in AP Mode Failed \n\r");
dflet 0:400d8e75a8d0 209 LOOP_FOREVER();
dflet 0:400d8e75a8d0 210 }
dflet 0:400d8e75a8d0 211
dflet 0:400d8e75a8d0 212 //Stop Internal HTTP Server
dflet 0:400d8e75a8d0 213 lRetVal = _cc3100_Mod._netapp.sl_NetAppStop(SL_NET_APP_HTTP_SERVER_ID);
dflet 0:400d8e75a8d0 214 if(lRetVal < 0)
dflet 0:400d8e75a8d0 215 {
dflet 0:400d8e75a8d0 216 Uart_Write((uint8_t*)"Stop Internal HTTP Server Failed \n\r");
dflet 0:400d8e75a8d0 217 LOOP_FOREVER();
dflet 0:400d8e75a8d0 218 }
dflet 0:400d8e75a8d0 219 Uart_Write((uint8_t*)"HttpServerAppTask \n\r");
dflet 0:400d8e75a8d0 220 //Run APPS HTTP Server
dflet 0:400d8e75a8d0 221 HttpServerInitAndRun(NULL);
dflet 0:400d8e75a8d0 222
dflet 0:400d8e75a8d0 223 Uart_Write((uint8_t*)"HttpServerAppTask has returned for some reason\n\r");
dflet 0:400d8e75a8d0 224 LOOP_FOREVER();
dflet 0:400d8e75a8d0 225
dflet 0:400d8e75a8d0 226 }
dflet 0:400d8e75a8d0 227
dflet 0:400d8e75a8d0 228 //*****************************************************************************
dflet 0:400d8e75a8d0 229 //
dflet 0:400d8e75a8d0 230 // Close the Doxygen group.
dflet 0:400d8e75a8d0 231 //! @}
dflet 0:400d8e75a8d0 232 //
dflet 0:400d8e75a8d0 233 //*****************************************************************************
dflet 0:400d8e75a8d0 234
dflet 0:400d8e75a8d0 235
dflet 0:400d8e75a8d0 236
dflet 0:400d8e75a8d0 237