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
nfuncs.cpp@0:67a55a82ce06, 2011-02-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |