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 // Copyright (C) 2014 Texas Instruments Incorporated
dflet 0:400d8e75a8d0 3 //
dflet 0:400d8e75a8d0 4 // All rights reserved. Property of Texas Instruments Incorporated.
dflet 0:400d8e75a8d0 5 // Restricted rights to use, duplicate or disclose this code are
dflet 0:400d8e75a8d0 6 // granted through contract.
dflet 0:400d8e75a8d0 7 // The program may not be used without the written permission of
dflet 0:400d8e75a8d0 8 // Texas Instruments Incorporated or against the terms and conditions
dflet 0:400d8e75a8d0 9 // stipulated in the agreement under which this program has been supplied,
dflet 0:400d8e75a8d0 10 // and under no circumstances can it be used with non-TI connectivity device.
dflet 0:400d8e75a8d0 11 //
dflet 0:400d8e75a8d0 12 //*****************************************************************************
dflet 0:400d8e75a8d0 13
dflet 0:400d8e75a8d0 14 #include "HttpStatic.h"
dflet 0:400d8e75a8d0 15 #include <stdlib.h>
dflet 0:400d8e75a8d0 16
dflet 0:400d8e75a8d0 17 #ifdef HTTP_CORE_ENABLE_STATIC
dflet 0:400d8e75a8d0 18
dflet 0:400d8e75a8d0 19 #include "HttpRequest.h"
dflet 0:400d8e75a8d0 20 #include "HttpResponse.h"
dflet 0:400d8e75a8d0 21 #include "HttpCore.h"
dflet 0:400d8e75a8d0 22 #include "cc3100.h"
dflet 0:400d8e75a8d0 23 #include "cc3100_fs.h"
dflet 0:400d8e75a8d0 24 #include "HttpDebug.h"
dflet 0:400d8e75a8d0 25 #include "myBoardInit.h"
dflet 0:400d8e75a8d0 26 #include "osi.h"
dflet 0:400d8e75a8d0 27
dflet 0:400d8e75a8d0 28 using namespace mbed_cc3100;
dflet 0:400d8e75a8d0 29
dflet 0:400d8e75a8d0 30 cc3100 _cc3100Module(NC, NC, p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck
dflet 0:400d8e75a8d0 31
dflet 0:400d8e75a8d0 32
dflet 0:400d8e75a8d0 33 /**
dflet 0:400d8e75a8d0 34 * @addtogroup HttpStatic
dflet 0:400d8e75a8d0 35 * @{
dflet 0:400d8e75a8d0 36 */
dflet 0:400d8e75a8d0 37
dflet 0:400d8e75a8d0 38 /**
dflet 0:400d8e75a8d0 39 * @defgroup HttpStatic Static request handler module
dflet 0:400d8e75a8d0 40 * This module implements static content processing for HTTP requests.
dflet 0:400d8e75a8d0 41 * All requests are handled by looking up the URL's resource in the flash database, and returning the content in the response.
dflet 0:400d8e75a8d0 42 * Note this module is only compiled if HTTP_CORE_ENABLE_STATIC is defined in HttpConfig.h
dflet 0:400d8e75a8d0 43 *
dflet 0:400d8e75a8d0 44 * @{
dflet 0:400d8e75a8d0 45 */
dflet 0:400d8e75a8d0 46
dflet 0:400d8e75a8d0 47 #define FILE_NAME_SIZE_MAX (40)
dflet 0:400d8e75a8d0 48
dflet 0:400d8e75a8d0 49 //Store File Name from HTTP Header
dflet 0:400d8e75a8d0 50 char g_cFileName[FILE_NAME_SIZE_MAX]; //String storing filename
dflet 0:400d8e75a8d0 51 int32_t glFileHandle; // file handle
dflet 0:400d8e75a8d0 52
dflet 0:400d8e75a8d0 53 /**
dflet 0:400d8e75a8d0 54 * Initialize HttpStatic module state for a new request, and identify the request
dflet 0:400d8e75a8d0 55 * This function examines the specified resource string, and looks it up in the Flash Database.
dflet 0:400d8e75a8d0 56 * If found, it commits to process this request by returning nonzero. Otherwise it returns zero.
dflet 0:400d8e75a8d0 57 * @param uConnection The number of the connection. This value is guaranteed to satisfy: 0 <= uConnection < HTTP_CORE_MAX_CONNECTIONS
dflet 0:400d8e75a8d0 58 * @param resource The resource part of the URL, as specified by the browser in the request, including any query string (and hash).
dflet 0:400d8e75a8d0 59 * Note: The resource string exists ONLY during the call to this function. The string pointer should not be copied by this function.
dflet 0:400d8e75a8d0 60 * @return nonzero if request is to be handled by this module. zero if not.
dflet 0:400d8e75a8d0 61 */
dflet 0:400d8e75a8d0 62 int HttpStatic_InitRequest(UINT16 uConnection, struct HttpBlob resource)
dflet 0:400d8e75a8d0 63 {
dflet 0:400d8e75a8d0 64 char *pcWWWFsDir = "www";
dflet 0:400d8e75a8d0 65 memset(g_cFileName,'\0',40);
dflet 0:400d8e75a8d0 66
dflet 0:400d8e75a8d0 67 if(resource.uLength ==1 && *(resource.pData)=='/')
dflet 0:400d8e75a8d0 68 {
dflet 0:400d8e75a8d0 69 strcpy(g_cFileName,"www/main.html");
dflet 0:400d8e75a8d0 70 }
dflet 0:400d8e75a8d0 71 else
dflet 0:400d8e75a8d0 72 {
dflet 0:400d8e75a8d0 73 strcpy(g_cFileName,pcWWWFsDir);
dflet 0:400d8e75a8d0 74 strncat(g_cFileName,(char*)resource.pData,resource.uLength);
dflet 0:400d8e75a8d0 75 }
dflet 0:400d8e75a8d0 76
dflet 0:400d8e75a8d0 77 if(_cc3100Module._fs.sl_FsOpen((unsigned char*)g_cFileName,FS_MODE_OPEN_READ,NULL,&glFileHandle)<0)
dflet 0:400d8e75a8d0 78 return 0;
dflet 0:400d8e75a8d0 79 else
dflet 0:400d8e75a8d0 80 {
dflet 0:400d8e75a8d0 81 return 1;
dflet 0:400d8e75a8d0 82 }
dflet 0:400d8e75a8d0 83 }
dflet 0:400d8e75a8d0 84
dflet 0:400d8e75a8d0 85 /**
dflet 0:400d8e75a8d0 86 * Process a static-content HTTP request
dflet 0:400d8e75a8d0 87 * This function is called after a request was already initialized, and a Flash content entry was identified during a call to HttpStatic_InitRequest()
dflet 0:400d8e75a8d0 88 * This function calls HttpResponse_*() to send the content data to the browser.
dflet 0:400d8e75a8d0 89 * @param request Pointer to all data available about the request
dflet 0:400d8e75a8d0 90 * @return nonzero if request was handled. zero if not.
dflet 0:400d8e75a8d0 91 */
dflet 0:400d8e75a8d0 92 int HttpStatic_ProcessRequest(struct HttpRequest* request)
dflet 0:400d8e75a8d0 93 {
dflet 0:400d8e75a8d0 94 struct HttpBlob location,contentType;
dflet 0:400d8e75a8d0 95 struct HttpBlob* content = (struct HttpBlob*)malloc(sizeof(struct HttpBlob));
dflet 0:400d8e75a8d0 96 unsigned int Offset = 0;
dflet 0:400d8e75a8d0 97 SlFsFileInfo_t pFsFileInfo;
dflet 0:400d8e75a8d0 98 UINT32 TotalLength;
dflet 0:400d8e75a8d0 99 UINT8 HeaderFlag =0;
dflet 0:400d8e75a8d0 100 UINT8 bRetVal = 1;
dflet 0:400d8e75a8d0 101 UINT8 *buffer1 = NULL;
dflet 0:400d8e75a8d0 102
dflet 0:400d8e75a8d0 103
dflet 0:400d8e75a8d0 104 if(content == NULL)
dflet 0:400d8e75a8d0 105 {
dflet 0:400d8e75a8d0 106 HttpDebug("content = NULL error\n\r");
dflet 0:400d8e75a8d0 107 return 0;
dflet 0:400d8e75a8d0 108 }
dflet 0:400d8e75a8d0 109 location.pData = NULL;
dflet 0:400d8e75a8d0 110 location.uLength = 0;
dflet 0:400d8e75a8d0 111 contentType = location;
dflet 0:400d8e75a8d0 112
dflet 0:400d8e75a8d0 113 /* if HTTP_REQUEST_FLAG_METHOD_POST==1 (i.e. it is POST)
dflet 0:400d8e75a8d0 114 HttpResponse_CannedError() responds to client with status HTTP_STATUS_ERROR_INTERNAL
dflet 0:400d8e75a8d0 115 POST method is not supported for static pages */
dflet 0:400d8e75a8d0 116 if (request->uFlags & HTTP_REQUEST_FLAG_METHOD_POST)
dflet 0:400d8e75a8d0 117 {
dflet 0:400d8e75a8d0 118 /* HttpResponse_CannedError responds to client with 500 ERROR_INTERNAL */
dflet 0:400d8e75a8d0 119 if(!HttpResponse_CannedError(request->uConnection, HTTP_STATUS_ERROR_INTERNAL))
dflet 0:400d8e75a8d0 120 {
dflet 0:400d8e75a8d0 121 HttpDebug("HttpResponse_CannedError \n\r");
dflet 0:400d8e75a8d0 122 bRetVal = 0;
dflet 0:400d8e75a8d0 123 goto end;
dflet 0:400d8e75a8d0 124 }
dflet 0:400d8e75a8d0 125 else
dflet 0:400d8e75a8d0 126 {
dflet 0:400d8e75a8d0 127 bRetVal = 1;
dflet 0:400d8e75a8d0 128 goto end;
dflet 0:400d8e75a8d0 129 }
dflet 0:400d8e75a8d0 130 }
dflet 0:400d8e75a8d0 131
dflet 0:400d8e75a8d0 132 _cc3100Module._fs.sl_FsGetInfo((unsigned char *)g_cFileName, NULL, &pFsFileInfo);
dflet 0:400d8e75a8d0 133 TotalLength = (&pFsFileInfo)->FileLen;
dflet 0:400d8e75a8d0 134
dflet 0:400d8e75a8d0 135 while(TotalLength > 0)
dflet 0:400d8e75a8d0 136 {
dflet 0:400d8e75a8d0 137
dflet 0:400d8e75a8d0 138 // HttpDebug("TotalLength = %d\n\r",TotalLength);
dflet 0:400d8e75a8d0 139 content->uLength = ((TotalLength < 1000) ? (TotalLength):(1000));
dflet 0:400d8e75a8d0 140 buffer1 = (uint8_t*)realloc(buffer1, content->uLength);
dflet 0:400d8e75a8d0 141 if(buffer1 == NULL)
dflet 0:400d8e75a8d0 142 {
dflet 0:400d8e75a8d0 143 HttpDebug("buffer1 = NULL Error \n\r");
dflet 0:400d8e75a8d0 144 bRetVal = 0;
dflet 0:400d8e75a8d0 145 goto end;
dflet 0:400d8e75a8d0 146 }
dflet 0:400d8e75a8d0 147 content->pData = buffer1;
dflet 0:400d8e75a8d0 148
dflet 0:400d8e75a8d0 149 /* if got here than it is a GET method
dflet 0:400d8e75a8d0 150 HttpResponse_Headers() responds to client with status HTTP_STATUS_OK */
dflet 0:400d8e75a8d0 151 if(_cc3100Module._fs.sl_FsRead(glFileHandle, Offset, (unsigned char *) content->pData, content->uLength) < 0)
dflet 0:400d8e75a8d0 152 {
dflet 0:400d8e75a8d0 153 /* call HttpResponse_CannedError responds to client with 500 ERROR_INTERNAL */
dflet 0:400d8e75a8d0 154 if(!HttpResponse_CannedError(request->uConnection, HTTP_STATUS_ERROR_NOT_ACCEPTED))
dflet 0:400d8e75a8d0 155 {
dflet 0:400d8e75a8d0 156 HttpDebug("500 ERROR_INTERNAL Error \n\r");
dflet 0:400d8e75a8d0 157 bRetVal = 0;
dflet 0:400d8e75a8d0 158 goto end;
dflet 0:400d8e75a8d0 159 }
dflet 0:400d8e75a8d0 160 else
dflet 0:400d8e75a8d0 161 {
dflet 0:400d8e75a8d0 162 bRetVal = 1;
dflet 0:400d8e75a8d0 163 goto end;
dflet 0:400d8e75a8d0 164 }
dflet 0:400d8e75a8d0 165 }
dflet 0:400d8e75a8d0 166 else
dflet 0:400d8e75a8d0 167 {
dflet 0:400d8e75a8d0 168 if(!HeaderFlag)
dflet 0:400d8e75a8d0 169 {
dflet 0:400d8e75a8d0 170 if(!HttpResponse_Headers(request->uConnection, (uint16_t)HTTP_STATUS_OK, NULL,TotalLength, contentType, location))
dflet 0:400d8e75a8d0 171 {
dflet 0:400d8e75a8d0 172 HttpDebug("HeaderFlag Error \n\r");
dflet 0:400d8e75a8d0 173 bRetVal = 0;
dflet 0:400d8e75a8d0 174 goto end;
dflet 0:400d8e75a8d0 175 }
dflet 0:400d8e75a8d0 176 HeaderFlag = 1;
dflet 0:400d8e75a8d0 177 }
dflet 0:400d8e75a8d0 178
dflet 0:400d8e75a8d0 179 /* HttpResponse_Content() sends requested page to the client */
dflet 0:400d8e75a8d0 180 if(!HttpResponse_Content(request->uConnection, *content))
dflet 0:400d8e75a8d0 181 {
dflet 0:400d8e75a8d0 182 HttpDebug("HttpResponse_Content Error \n\r");
dflet 0:400d8e75a8d0 183 bRetVal = 0;
dflet 0:400d8e75a8d0 184 goto end;
dflet 0:400d8e75a8d0 185 }
dflet 0:400d8e75a8d0 186 }
dflet 0:400d8e75a8d0 187
dflet 0:400d8e75a8d0 188 TotalLength -= content->uLength;
dflet 0:400d8e75a8d0 189 Offset += content->uLength;
dflet 0:400d8e75a8d0 190 }
dflet 0:400d8e75a8d0 191
dflet 0:400d8e75a8d0 192 _cc3100Module._fs.sl_FsClose(glFileHandle,0,0,0);
dflet 0:400d8e75a8d0 193 end:
dflet 0:400d8e75a8d0 194 if(buffer1 != NULL)
dflet 0:400d8e75a8d0 195 {
dflet 0:400d8e75a8d0 196 free(buffer1);
dflet 0:400d8e75a8d0 197 }
dflet 0:400d8e75a8d0 198 free(content);
dflet 0:400d8e75a8d0 199
dflet 0:400d8e75a8d0 200 return bRetVal;
dflet 0:400d8e75a8d0 201 }
dflet 0:400d8e75a8d0 202
dflet 0:400d8e75a8d0 203 /// @}
dflet 0:400d8e75a8d0 204
dflet 0:400d8e75a8d0 205 #endif // HTTP_CORE_ENABLE_STATIC
dflet 0:400d8e75a8d0 206
dflet 0:400d8e75a8d0 207
dflet 0:400d8e75a8d0 208