MMEx with SPI Slave to allow legacy devices to communicate with modern media such as USB, SD cards, the internet and all of the mbed\'s other interfaces

Dependencies:   NetServices MSCUsbHost mbed TMP102 SDFileSystem

Committer:
DeMein
Date:
Sun Feb 27 18:54:40 2011 +0000
Revision:
0:67a55a82ce06
Version as submitted to the NXP Design Challenge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DeMein 0:67a55a82ce06 1 /* MMEx for MBED - Network Command processing
DeMein 0:67a55a82ce06 2 * Copyright (c) 2011 MK
DeMein 0:67a55a82ce06 3 *
DeMein 0:67a55a82ce06 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
DeMein 0:67a55a82ce06 5 * of this software and associated documentation files (the "Software"), to deal
DeMein 0:67a55a82ce06 6 * in the Software without restriction, including without limitation the rights
DeMein 0:67a55a82ce06 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
DeMein 0:67a55a82ce06 8 * copies of the Software, and to permit persons to whom the Software is
DeMein 0:67a55a82ce06 9 * furnished to do so, subject to the following conditions:
DeMein 0:67a55a82ce06 10 *
DeMein 0:67a55a82ce06 11 * The above copyright notice and this permission notice shall be included in
DeMein 0:67a55a82ce06 12 * all copies or substantial portions of the Software.
DeMein 0:67a55a82ce06 13 *
DeMein 0:67a55a82ce06 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
DeMein 0:67a55a82ce06 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
DeMein 0:67a55a82ce06 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
DeMein 0:67a55a82ce06 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
DeMein 0:67a55a82ce06 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
DeMein 0:67a55a82ce06 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
DeMein 0:67a55a82ce06 20 * THE SOFTWARE.
DeMein 0:67a55a82ce06 21 */
DeMein 0:67a55a82ce06 22
DeMein 0:67a55a82ce06 23 /**
DeMein 0:67a55a82ce06 24 \file nfuncs.cpp
DeMein 0:67a55a82ce06 25 \brief Commands starting with N for Networking commands
DeMein 0:67a55a82ce06 26 */
DeMein 0:67a55a82ce06 27
DeMein 0:67a55a82ce06 28 #include "nfuncs.h"
DeMein 0:67a55a82ce06 29
DeMein 0:67a55a82ce06 30 EthernetNetIf *eth;
DeMein 0:67a55a82ce06 31 HTTPClient http;
DeMein 0:67a55a82ce06 32 HTTPResult result;
DeMein 0:67a55a82ce06 33 HTTPServer *server;
DeMein 0:67a55a82ce06 34 bool completed = false;
DeMein 0:67a55a82ce06 35
DeMein 0:67a55a82ce06 36 /**
DeMein 0:67a55a82ce06 37 * Global variable to indicate if network is running
DeMein 0:67a55a82ce06 38 */
DeMein 0:67a55a82ce06 39 bool network_enabled = false;
DeMein 0:67a55a82ce06 40
DeMein 0:67a55a82ce06 41 /**
DeMein 0:67a55a82ce06 42 * Global variable to indicate if HTTP Server is running
DeMein 0:67a55a82ce06 43 */
DeMein 0:67a55a82ce06 44 bool httpserver_enabled = false;
DeMein 0:67a55a82ce06 45
DeMein 0:67a55a82ce06 46 /**
DeMein 0:67a55a82ce06 47 * Poll the network (must be called periodically while server is active)
DeMein 0:67a55a82ce06 48 */
DeMein 0:67a55a82ce06 49 void netpoll()
DeMein 0:67a55a82ce06 50 {
DeMein 0:67a55a82ce06 51 if (network_enabled) {
DeMein 0:67a55a82ce06 52 _led3 = 1;
DeMein 0:67a55a82ce06 53 Net::poll();
DeMein 0:67a55a82ce06 54 _led3 = 0;
DeMein 0:67a55a82ce06 55 }
DeMein 0:67a55a82ce06 56 }
DeMein 0:67a55a82ce06 57
DeMein 0:67a55a82ce06 58 /** main entry for parsing C-commands
DeMein 0:67a55a82ce06 59 *
DeMein 0:67a55a82ce06 60 */
DeMein 0:67a55a82ce06 61 void parse_N() {
DeMein 0:67a55a82ce06 62 // process parameters
DeMein 0:67a55a82ce06 63 DBG_msg("parse_N", inbuf);
DeMein 0:67a55a82ce06 64 err_num = noerror;
DeMein 0:67a55a82ce06 65
DeMein 0:67a55a82ce06 66 wipesp(inbuf); // remove all spaces from string
DeMein 0:67a55a82ce06 67
DeMein 0:67a55a82ce06 68 if (inbuf[1] != NULL) {
DeMein 0:67a55a82ce06 69 switch (inbuf[1]) {
DeMein 0:67a55a82ce06 70 case ninit : do_ninit();
DeMein 0:67a55a82ce06 71 break;
DeMein 0:67a55a82ce06 72 case nstop : do_nstop();
DeMein 0:67a55a82ce06 73 break;
DeMein 0:67a55a82ce06 74 case ntime : do_ntime();
DeMein 0:67a55a82ce06 75 break;
DeMein 0:67a55a82ce06 76 case nget : do_nget();
DeMein 0:67a55a82ce06 77 break;
DeMein 0:67a55a82ce06 78 case nhttp : do_nhttp();
DeMein 0:67a55a82ce06 79 break;
DeMein 0:67a55a82ce06 80 default : do_ndefault(); // command not recognized
DeMein 0:67a55a82ce06 81 break;
DeMein 0:67a55a82ce06 82 }
DeMein 0:67a55a82ce06 83 } else { do_ndefault(); }
DeMein 0:67a55a82ce06 84 }
DeMein 0:67a55a82ce06 85
DeMein 0:67a55a82ce06 86 /** initialize the network interface
DeMein 0:67a55a82ce06 87 *
DeMein 0:67a55a82ce06 88 * syntax: NI
DeMein 0:67a55a82ce06 89 */
DeMein 0:67a55a82ce06 90 void do_ninit() {
DeMein 0:67a55a82ce06 91 char * hostname;
DeMein 0:67a55a82ce06 92 char * ipnums;
DeMein 0:67a55a82ce06 93 char s[50];
DeMein 0:67a55a82ce06 94 char ips[4][25];
DeMein 0:67a55a82ce06 95
DeMein 0:67a55a82ce06 96 DBG_msg("do_ninit", "Network initialisation\n");
DeMein 0:67a55a82ce06 97
DeMein 0:67a55a82ce06 98 EthernetErr ethErr;
DeMein 0:67a55a82ce06 99
DeMein 0:67a55a82ce06 100 // check for alternate hostname in parameters
DeMein 0:67a55a82ce06 101 hostname = new char [param[par_H_].size() + 1]; // Host parameter
DeMein 0:67a55a82ce06 102 strcpy (hostname, param[par_H_].c_str());
DeMein 0:67a55a82ce06 103 if (hostname == NULL) hostname = MMEx_Hostname;
DeMein 0:67a55a82ce06 104
DeMein 0:67a55a82ce06 105 // check for DCHP or not
DeMein 0:67a55a82ce06 106 // Parameter J is the fixed IP address in the following format:
DeMein 0:67a55a82ce06 107 // ip netmask gateway dns
DeMein 0:67a55a82ce06 108 // each ip address is in the format x.y.z.t, separated by spaces
DeMein 0:67a55a82ce06 109 // When Param J is empty, DHCP will be used
DeMein 0:67a55a82ce06 110 ipnums = new char [param[par_J_].size() + 1]; // Host parameter
DeMein 0:67a55a82ce06 111 strcpy (ipnums, param[par_J_].c_str());
DeMein 0:67a55a82ce06 112
DeMein 0:67a55a82ce06 113
DeMein 0:67a55a82ce06 114 if (param[par_J_].size()< 10) {
DeMein 0:67a55a82ce06 115 DBG_msg("do_ninit", "DHCP config");
DeMein 0:67a55a82ce06 116 // DHCP chosen, initialize network
DeMein 0:67a55a82ce06 117 eth = new EthernetNetIf(hostname);
DeMein 0:67a55a82ce06 118
DeMein 0:67a55a82ce06 119 // eth->setup();
DeMein 0:67a55a82ce06 120 } else {
DeMein 0:67a55a82ce06 121 // process fixed IP adresses
DeMein 0:67a55a82ce06 122 DBG_msg("do_ninit", "fixed IP");
DeMein 0:67a55a82ce06 123 DBG_msg("IP adresses", ipnums);
DeMein 0:67a55a82ce06 124
DeMein 0:67a55a82ce06 125 IpAddr *ipparam[4];
DeMein 0:67a55a82ce06 126 sscanf(ipnums, "%s %s %s %s", ips[0], ips[1], ips[2], ips[3]);
DeMein 0:67a55a82ce06 127 DBG_msg("IP number", ips[0]);
DeMein 0:67a55a82ce06 128 DBG_msg("netmask ", ips[1]);
DeMein 0:67a55a82ce06 129 DBG_msg("gateway ", ips[2]);
DeMein 0:67a55a82ce06 130 DBG_msg("dns ", ips[3]);
DeMein 0:67a55a82ce06 131
DeMein 0:67a55a82ce06 132 for ( int i = 0; i < 4; ++i ) {
DeMein 0:67a55a82ce06 133 int ip1, ip2, ip3, ip4;
DeMein 0:67a55a82ce06 134 sscanf(ips[i], "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
DeMein 0:67a55a82ce06 135 ipparam[i] = new IpAddr(ip1, ip2, ip3, ip4);
DeMein 0:67a55a82ce06 136 }
DeMein 0:67a55a82ce06 137 // Setup IP with given adresses
DeMein 0:67a55a82ce06 138 eth = new EthernetNetIf(*ipparam[0],*ipparam[1],*ipparam[2],*ipparam[3]);
DeMein 0:67a55a82ce06 139 // eth->setup();
DeMein 0:67a55a82ce06 140 }
DeMein 0:67a55a82ce06 141
DeMein 0:67a55a82ce06 142 int count = 0;
DeMein 0:67a55a82ce06 143 do {
DeMein 0:67a55a82ce06 144 DBG_int("do_ninit setup", ++count);
DeMein 0:67a55a82ce06 145 ethErr = eth->setup();
DeMein 0:67a55a82ce06 146 if (ethErr) DBG_int("do_ninit timeout", ethErr);
DeMein 0:67a55a82ce06 147 } while ((ethErr != ETH_OK) && (count < 5));
DeMein 0:67a55a82ce06 148
DeMein 0:67a55a82ce06 149 if (ethErr == ETH_OK) {
DeMein 0:67a55a82ce06 150 // connection worked
DeMein 0:67a55a82ce06 151 network_enabled = true;
DeMein 0:67a55a82ce06 152 mldl.attach(&netpoll);
DeMein 0:67a55a82ce06 153 DBG_msg("do_ninit", "Connected OK\n");
DeMein 0:67a55a82ce06 154 const char* hwAddr = eth->getHwAddr();
DeMein 0:67a55a82ce06 155 sprintf(s, "%02x:%02x:%02x:%02x:%02x:%02x",
DeMein 0:67a55a82ce06 156 hwAddr[0], hwAddr[1], hwAddr[2], hwAddr[3], hwAddr[4], hwAddr[5]);
DeMein 0:67a55a82ce06 157 DBG_msg("ninit MAC addr", s);
DeMein 0:67a55a82ce06 158 param[par_M_].assign(s); // set MAC address
DeMein 0:67a55a82ce06 159
DeMein 0:67a55a82ce06 160 IpAddr ethIp = eth->getIp();
DeMein 0:67a55a82ce06 161 sprintf(s, "%d.%d.%d.%d", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
DeMein 0:67a55a82ce06 162 upstring(s);
DeMein 0:67a55a82ce06 163 DBG_msg("ninit MAC addr", s);
DeMein 0:67a55a82ce06 164 param[par_I_].assign(s); // set MAC address
DeMein 0:67a55a82ce06 165
DeMein 0:67a55a82ce06 166 sprintf(s, "%s", eth->getHostname());
DeMein 0:67a55a82ce06 167 DBG_msg("ninit Hostname", s);
DeMein 0:67a55a82ce06 168 param[par_H_].assign(s); // set Hostname
DeMein 0:67a55a82ce06 169 } else {
DeMein 0:67a55a82ce06 170 // in case initialization did not work
DeMein 0:67a55a82ce06 171 network_enabled = false;
DeMein 0:67a55a82ce06 172 DBG_msg("ninit", "network timout");
DeMein 0:67a55a82ce06 173 send_error(err_net_timeout);
DeMein 0:67a55a82ce06 174 }
DeMein 0:67a55a82ce06 175 }
DeMein 0:67a55a82ce06 176
DeMein 0:67a55a82ce06 177 /** stop the network interface
DeMein 0:67a55a82ce06 178 *
DeMein 0:67a55a82ce06 179 * syntax: NS
DeMein 0:67a55a82ce06 180 */
DeMein 0:67a55a82ce06 181 void do_nstop() {
DeMein 0:67a55a82ce06 182 DBG_msg("do_nstop", inbuf);
DeMein 0:67a55a82ce06 183 mldl.attach(NULL);
DeMein 0:67a55a82ce06 184 delete eth;
DeMein 0:67a55a82ce06 185 network_enabled = false;
DeMein 0:67a55a82ce06 186 }
DeMein 0:67a55a82ce06 187
DeMein 0:67a55a82ce06 188 /** get network time
DeMein 0:67a55a82ce06 189 *
DeMein 0:67a55a82ce06 190 * syntax: NT
DeMein 0:67a55a82ce06 191 * URL of NTP server must be in parameter U
DeMein 0:67a55a82ce06 192 */
DeMein 0:67a55a82ce06 193 void do_ntime() {
DeMein 0:67a55a82ce06 194 char s[255]; // for intermediate results
DeMein 0:67a55a82ce06 195 char s1[255]; // for intermediate results
DeMein 0:67a55a82ce06 196 time_t ctTime;
DeMein 0:67a55a82ce06 197 NTPClient ntp;
DeMein 0:67a55a82ce06 198 DBG_msg("do_ntime", inbuf);
DeMein 0:67a55a82ce06 199
DeMein 0:67a55a82ce06 200 ctTime = time(NULL); // current system time
DeMein 0:67a55a82ce06 201 sprintf(s, "%d %s", ctTime, ctime(&ctTime));
DeMein 0:67a55a82ce06 202 DBG_msg("MMEx time", s);
DeMein 0:67a55a82ce06 203 strcpy(s, param[par_U_].c_str()); // URL from parameter U
DeMein 0:67a55a82ce06 204
DeMein 0:67a55a82ce06 205 Host server(IpAddr(), 123, s);
DeMein 0:67a55a82ce06 206 NTPResult r = ntp.setTime(server);
DeMein 0:67a55a82ce06 207 if (r == NTP_OK) {
DeMein 0:67a55a82ce06 208 // time set
DeMein 0:67a55a82ce06 209 ctTime = time(NULL);
DeMein 0:67a55a82ce06 210 sprintf(s1, "%d %s", ctTime, ctime(&ctTime));
DeMein 0:67a55a82ce06 211 DBG_msg("MMEx time", s1);
DeMein 0:67a55a82ce06 212 } else {
DeMein 0:67a55a82ce06 213 // error in setting the time
DeMein 0:67a55a82ce06 214 send_error(err_net_NTP);
DeMein 0:67a55a82ce06 215 }
DeMein 0:67a55a82ce06 216 }
DeMein 0:67a55a82ce06 217
DeMein 0:67a55a82ce06 218
DeMein 0:67a55a82ce06 219 void request_callback(HTTPResult r) {
DeMein 0:67a55a82ce06 220 result = r;
DeMein 0:67a55a82ce06 221 completed = true;
DeMein 0:67a55a82ce06 222 }
DeMein 0:67a55a82ce06 223
DeMein 0:67a55a82ce06 224 /** get file through HTTP Stream
DeMein 0:67a55a82ce06 225 *
DeMein 0:67a55a82ce06 226 * syntax: NG
DeMein 0:67a55a82ce06 227 * URL of must be in parameter U, %n may be used for filename
DeMein 0:67a55a82ce06 228 */
DeMein 0:67a55a82ce06 229 void do_nget() {
DeMein 0:67a55a82ce06 230
DeMein 0:67a55a82ce06 231 HTTPStream stream;
DeMein 0:67a55a82ce06 232 char Buf[512 + 1] = {0};
DeMein 0:67a55a82ce06 233 char s[255]; // for temp storage
DeMein 0:67a55a82ce06 234 int pnum, pos, count;
DeMein 0:67a55a82ce06 235 char * cstr;
DeMein 0:67a55a82ce06 236 int rdata, i;
DeMein 0:67a55a82ce06 237 bool go = true;
DeMein 0:67a55a82ce06 238 bool stopread = false;
DeMein 0:67a55a82ce06 239 int numbytes = 0;
DeMein 0:67a55a82ce06 240
DeMein 0:67a55a82ce06 241 DBG_msg("do_nget", inbuf);
DeMein 0:67a55a82ce06 242
DeMein 0:67a55a82ce06 243 completed = false;
DeMein 0:67a55a82ce06 244
DeMein 0:67a55a82ce06 245 count = 0;
DeMein 0:67a55a82ce06 246 // next chars on the commandline is the number of bytes to read
DeMein 0:67a55a82ce06 247 if (inbuf[2] == NULL) {
DeMein 0:67a55a82ce06 248 // no value on the command line
DeMein 0:67a55a82ce06 249 numbytes = 0;
DeMein 0:67a55a82ce06 250 } else {
DeMein 0:67a55a82ce06 251 // now process line
DeMein 0:67a55a82ce06 252 for (i = 2; ((inbuf[i] >='0') && (inbuf[i] <= '9')); i++ ) {
DeMein 0:67a55a82ce06 253 numbytes = 10 * numbytes + (inbuf[i] - '0');
DeMein 0:67a55a82ce06 254 }
DeMein 0:67a55a82ce06 255 }
DeMein 0:67a55a82ce06 256 DBG_int("do_nget bytes:", numbytes);
DeMein 0:67a55a82ce06 257
DeMein 0:67a55a82ce06 258 stream.readNext((byte*)Buf, 512); //Point to buffer for the first read
DeMein 0:67a55a82ce06 259 strcpy(s, param[par_U_].c_str()); // URL from parameter U
DeMein 0:67a55a82ce06 260
DeMein 0:67a55a82ce06 261 // check for a % sign in s
DeMein 0:67a55a82ce06 262 pos = 0;
DeMein 0:67a55a82ce06 263 while ((s[pos] != NULL) && (s[pos] != c_percent)) pos++;
DeMein 0:67a55a82ce06 264 if ((s[pos] != NULL) && ((pnum = getpnum(s[pos + 1])) >= 0)) {
DeMein 0:67a55a82ce06 265 // found and valid parameter, now insert
DeMein 0:67a55a82ce06 266 cstr = new char [param[pnum].size() + 1];
DeMein 0:67a55a82ce06 267 strcpy (cstr, param[pnum].c_str());
DeMein 0:67a55a82ce06 268 DBG_msg("param", cstr);
DeMein 0:67a55a82ce06 269 DBG_int("pos", pos);
DeMein 0:67a55a82ce06 270 remchar(s, pos, 2); // remove %n, works better for insert
DeMein 0:67a55a82ce06 271 DBG_msg("do_nget", s);
DeMein 0:67a55a82ce06 272 insertstr(s, cstr, pos); // insert
DeMein 0:67a55a82ce06 273 DBG_msg("do_nget", s);
DeMein 0:67a55a82ce06 274 delete[] cstr;
DeMein 0:67a55a82ce06 275 }
DeMein 0:67a55a82ce06 276
DeMein 0:67a55a82ce06 277 HTTPResult r = http.get(s, &stream, request_callback); // try to get the data
DeMein 0:67a55a82ce06 278
DeMein 0:67a55a82ce06 279 // this is the main loop for reading the file
DeMein 0:67a55a82ce06 280 while((!completed)) {
DeMein 0:67a55a82ce06 281 Net::poll(); // polls the Networking stack
DeMein 0:67a55a82ce06 282 if(stream.readable()) {
DeMein 0:67a55a82ce06 283 rdata = stream.readLen(); // number of bytes read
DeMein 0:67a55a82ce06 284 DBG_int("rdata", rdata);
DeMein 0:67a55a82ce06 285 Buf[stream.readLen()] = 0; //Transform this buffer in zero-terminated char* string
DeMein 0:67a55a82ce06 286
DeMein 0:67a55a82ce06 287 // now send data to our transmit buffer
DeMein 0:67a55a82ce06 288 i = 0;
DeMein 0:67a55a82ce06 289 while (go && (i < rdata)) {
DeMein 0:67a55a82ce06 290 DBG_chr("rd", Buf[i]);
DeMein 0:67a55a82ce06 291 mldl.tx_addp(Buf[i]);
DeMein 0:67a55a82ce06 292 i++;
DeMein 0:67a55a82ce06 293 count++;
DeMein 0:67a55a82ce06 294 // now check if we have to stop?
DeMein 0:67a55a82ce06 295 if (!mldl.rx_empty()) {
DeMein 0:67a55a82ce06 296 stopread = (mldl.rxx_read(data_mode) < 0); // intentional stop of read
DeMein 0:67a55a82ce06 297 DBG_msg("do_nget", "forced stop");
DeMein 0:67a55a82ce06 298 }
DeMein 0:67a55a82ce06 299 go = !((count == numbytes) || stopread);
DeMein 0:67a55a82ce06 300 }
DeMein 0:67a55a82ce06 301
DeMein 0:67a55a82ce06 302 //Buffer has been read, now we can put more data in it
DeMein 0:67a55a82ce06 303 stream.readNext((byte*)Buf, 512);
DeMein 0:67a55a82ce06 304 }
DeMein 0:67a55a82ce06 305 }
DeMein 0:67a55a82ce06 306
DeMein 0:67a55a82ce06 307 // we are done with the required number of bytes or found EOF
DeMein 0:67a55a82ce06 308 if (!stopread && (count != numbytes)) {
DeMein 0:67a55a82ce06 309 // real EOF found, so terminate by sending EOF
DeMein 0:67a55a82ce06 310 mldl.tx_add(c_escape);
DeMein 0:67a55a82ce06 311 mldl.tx_add(c_eof);
DeMein 0:67a55a82ce06 312 DBG_int("do_nget: EOF at byte ", count);
DeMein 0:67a55a82ce06 313 }
DeMein 0:67a55a82ce06 314
DeMein 0:67a55a82ce06 315 if (stopread) {
DeMein 0:67a55a82ce06 316 DBG_msg("do_nget", "forced stop read received");
DeMein 0:67a55a82ce06 317 mldl.flush_tx(); // empty transmit buffer
DeMein 0:67a55a82ce06 318 }
DeMein 0:67a55a82ce06 319
DeMein 0:67a55a82ce06 320 DBG_int("do_nget: end read at byte ", count);
DeMein 0:67a55a82ce06 321 }
DeMein 0:67a55a82ce06 322
DeMein 0:67a55a82ce06 323 /** HTTP Server commands
DeMein 0:67a55a82ce06 324 *
DeMein 0:67a55a82ce06 325 * syntax: NHI[medium]: initialise and start HTTP Server
DeMein 0:67a55a82ce06 326 * [medium] = S, U or L for the filesystem to be used
DeMein 0:67a55a82ce06 327 * default filesystem is "/local"
DeMein 0:67a55a82ce06 328 * \n NHS: stop HTTP Server
DeMein 0:67a55a82ce06 329 *
DeMein 0:67a55a82ce06 330 */
DeMein 0:67a55a82ce06 331 void do_nhttp() {
DeMein 0:67a55a82ce06 332 char c;
DeMein 0:67a55a82ce06 333 char medium[10];
DeMein 0:67a55a82ce06 334
DeMein 0:67a55a82ce06 335 DBG_msg("do_nhttp", inbuf);
DeMein 0:67a55a82ce06 336
DeMein 0:67a55a82ce06 337 c = inbuf[3]; // [medium]
DeMein 0:67a55a82ce06 338 switch (c) {
DeMein 0:67a55a82ce06 339 case f_sdcard : strcpy(medium, rt_sd); // "/sd"
DeMein 0:67a55a82ce06 340 break;
DeMein 0:67a55a82ce06 341 case f_local : strcpy(medium, rt_local); // "/local"
DeMein 0:67a55a82ce06 342 break;
DeMein 0:67a55a82ce06 343 case f_usb : strcpy(medium, rt_usb); // "/usb"
DeMein 0:67a55a82ce06 344 break;
DeMein 0:67a55a82ce06 345 default : strcpy(medium, "/local"); // default
DeMein 0:67a55a82ce06 346 break;
DeMein 0:67a55a82ce06 347 }
DeMein 0:67a55a82ce06 348
DeMein 0:67a55a82ce06 349 if (inbuf[2] == ninit) {
DeMein 0:67a55a82ce06 350 // HTTP server initialize
DeMein 0:67a55a82ce06 351 DBG_msg("HTTP Init", medium);
DeMein 0:67a55a82ce06 352 if (!network_enabled) do_ninit();
DeMein 0:67a55a82ce06 353 server = new HTTPServer;
DeMein 0:67a55a82ce06 354 FSHandler::mount(medium, "/" );
DeMein 0:67a55a82ce06 355 server->addHandler<FSHandler>("/");
DeMein 0:67a55a82ce06 356 server->addHandler<RPCHandler>("/rpc");
DeMein 0:67a55a82ce06 357 server->addHandler<SimpleHandler>("/simple");
DeMein 0:67a55a82ce06 358 server->bind(80);
DeMein 0:67a55a82ce06 359 httpserver_enabled = true;
DeMein 0:67a55a82ce06 360 DBG_msg( "HTTP server", "started" );
DeMein 0:67a55a82ce06 361 return;
DeMein 0:67a55a82ce06 362 }
DeMein 0:67a55a82ce06 363
DeMein 0:67a55a82ce06 364 if (inbuf[2] == nstop) {
DeMein 0:67a55a82ce06 365 // HTTP Server stop
DeMein 0:67a55a82ce06 366 delete server;
DeMein 0:67a55a82ce06 367 httpserver_enabled = false;
DeMein 0:67a55a82ce06 368 DBG_msg( "HTTP server", "stopped" );
DeMein 0:67a55a82ce06 369 return;
DeMein 0:67a55a82ce06 370 }
DeMein 0:67a55a82ce06 371
DeMein 0:67a55a82ce06 372 do_ndefault();
DeMein 0:67a55a82ce06 373 }
DeMein 0:67a55a82ce06 374
DeMein 0:67a55a82ce06 375 /** send error message, command not recognized
DeMein 0:67a55a82ce06 376 *
DeMein 0:67a55a82ce06 377 */
DeMein 0:67a55a82ce06 378 void do_ndefault() {
DeMein 0:67a55a82ce06 379 // command not recognized
DeMein 0:67a55a82ce06 380 DBG_msg("do_ndefault", inbuf);
DeMein 0:67a55a82ce06 381 send_error(err_notrecognized);
DeMein 0:67a55a82ce06 382 }