static void manage_setvalue(const char *path) { char *port = strstr(path, "&set="); if (!port) return; port += 5; char *value = strstr(path, "&value="); if (!value) return; value += 7; switch (*port) { case 'D': { int r = atoi(port + 1); if (r < 0 || r > 11) return; r += 2; Serial << "setPWM " << r << " " << value <<"\n"; lduino.setPWM(r, atoi(value)); break; } case 'A': { int r = atoi(port + 1); if (r < 0 || r > 11) return; r += 54; Serial << "setAnalog " << r << " " << value << "\n"; lduino.setAnalogInput(r, atoi(value)); break; } } }
static void manage_toggle(const char *path) { char *toggle = strstr(path, "&toggle="); if (!toggle) return; toggle += 8; switch (*toggle) { case 'D': { int r = atoi(toggle + 1); if (r < 0 || r > 11) return; r += 2; Serial << "toggle " << r << "\n"; lduino.toggleDigitalOutput(r); break; } case 'R': { int r = atoi(toggle + 1); if (r < 0 || r > 9) return; r += 22; Serial << "toggle " << r << "\n"; lduino.toggleDigitalOutput(r); break; } case 'A': { int r = atoi(toggle + 1); if (r < 0 || r > 11) return; r += 54; Serial << "toggle " << r << "\n"; lduino.toggleDigitalInput(r); break; } case 'r': lduino.ToggleProgramRunning(); break; case 'i': lduino.ToggleIO_Polling(); break; default: break; } return; }
static boolean getstate_handler(TinyWebServer& web_server) { web_server.send_error_code(200); web_server.send_content_type("text/xml"); web_server.send_content_type("Connection: keep-alive"); web_server.end_headers(); manage_toggle(web_server.get_path()); manage_setvalue(web_server.get_path()); Client& stream = web_server.get_client(); lduino.XML_State(stream); return true; }
static void main_page(Client& client, String status = "") { //index_html.print(client); String str((__FlashStringHelper *)index_html_flash); str.replace(F("%status"), status.length() > 0 ? status + '\n' : ""); str.replace(F("%useDHCP"), IP_Config.useDHCP ? "checked": ""); str.replace(F("%mac"), MAC2Ascii(IP_Config.mac_address)); str.replace(F("%ip"), IP2Ascii(IP_Config.local_ip)); str.replace(F("%subnet"), IP2Ascii(IP_Config.subnet)); str.replace(F("%dns"), IP2Ascii(IP_Config.dns_server)); str.replace(F("%gateway"), IP2Ascii(IP_Config.gateway)); client << str; lduino.PrintStats(client); client << F("<pre></body></html>"); }
static void file_uploader_handler(TinyWebServer& web_server, TinyWebPutHandler::PutAction action, char* buffer, int size) { static char *boundary = NULL; static size_t boundary_len = 0; static CircularBuffer<char, 128> cb; static enum state { search_begin=0, search_data, search_filename, in_filename, in_data} st; static int file_size = 0; static String fname = ""; const char *ct; switch (action) { case TinyWebPutHandler::START: { ct = web_server.get_header_value("Content-Type"); if (!ct) { Serial << F("Missing Content-Type\n"); break; } boundary = strstr(ct, "boundary="); if (!boundary) { Serial << F("Missing boundary= in '") << ct << "'\n"; break; } boundary += 5; boundary[0] = '\r'; boundary[1] = '\n'; boundary[2] = '-'; boundary[3] = '-'; boundary_len = strlen(boundary); D(Serial.print("**** Upload file ")); D(Serial.println(fname)); st = search_begin; file_size = 0; lduino.setStatus(F("Loading new ladder program")); break; } static char *fname_tag = "filename=\""; case TinyWebPutHandler::WRITE: for (int i = 0; i < size; i++) { D(Serial.write(*buffer)); switch(st) { case search_begin: cb.push(*buffer++); if (cb.remain() < boundary_len-2) break; if (cb.match(boundary+2, boundary_len-2)) { st = search_filename; D(Serial.println("search_filename")); cb.flush(); fname = ""; } else { cb.pop(); } break; case search_filename: cb.push(*buffer++); if (cb.remain() < strlen(fname_tag)) break; if (cb.match(fname_tag, strlen(fname_tag))) { st = in_filename; D(Serial.println("in_filename")); cb.flush(); } else { cb.pop(); } break; case in_filename: if (*buffer == '\"') { buffer++; st = search_data; D(Serial << F("fname=") << fname << "\n"); D(Serial.println("search_data")); } else { fname += *buffer++; } break; case search_data: cb.push(*buffer++); if (cb.remain() < 4) break; if (cb.match("\r\n\r\n", 4)) { st = in_data; D(Serial.println("in_data")); cb.flush(); } else { cb.pop(); } break; case in_data: cb.push(*buffer++); if (cb.remain() < boundary_len) break; if (cb.match(boundary, boundary_len)) { st = search_data; D(Serial.println("search_data")); cb.flush(); } else { if (file_size == 0) lduino.ClearProgram(); char c = cb.pop(); file_size++; lduino.LoadProgramLine(c); } break; }; } break; case TinyWebPutHandler::END: D(Serial.println("**** END")); D(Serial.print("file size ")); D(Serial.println(file_size)); Client& client = web_server.get_client(); String status; if (file_size > 0 && lduino.getProgramReady()) { status += fname; status += F(" loaded"); } else { status += F("Upload failure"); } Serial << status << '\n'; lduino.setStatus(status); //main_page(client, status); break; } }
static void file_uploader_handler(TinyWebServer& web_server, TinyWebPutHandler::PutAction action, char* buffer, int size) { static char *boundary = NULL; static size_t boundary_len = 0; static CircularBuffer<char, 128> cb; static enum state { search_begin=0, search_data, in_data} st; static int file_size = 0; static char *fname; switch (action) { case TinyWebPutHandler::START: { fname = web_server.get_file_from_path(web_server.get_path()); const char *ct = web_server.get_header_value("Content-Type"); if (!ct) break; boundary = strstr(ct, "boundary="); if (!boundary) break; boundary += 5; boundary[0] = '\r'; boundary[1] = '\n'; boundary[2] = '-'; boundary[3] = '-'; boundary_len = strlen(boundary); D(Serial.print("**** Upload file ")); D(Serial.println(fname)); free(fname); st = search_begin; file_size = 0; break; } case TinyWebPutHandler::WRITE: for (int i = 0; i < size; i++) { D(Serial.write(*buffer)); cb.push(*buffer++); switch(st) { case search_begin: if (cb.remain() < boundary_len-2) break; if (cb.match(boundary+2, boundary_len-2)) { st = search_data; D(Serial.println("search_data")); cb.flush(); } else { cb.pop(); } break; case search_data: if (cb.remain() < 4) break; if (cb.match("\r\n\r\n", 4)) { st = in_data; D(Serial.println("in_data")); cb.flush(); } else { cb.pop(); } break; case in_data: if (cb.remain() < boundary_len) break; if (cb.match(boundary, boundary_len)) { st = search_data; D(Serial.println("search_data")); cb.flush(); } else { if (file_size == 0) lduino.ClearProgram(); char c = cb.pop(); file_size++; lduino.LoadProgramLine(c); } break; }; } break; case TinyWebPutHandler::END: D(Serial.println("**** END")); D(Serial.print("file size ")); D(Serial.println(file_size)); Client& client = web_server.get_client(); String status; if (file_size > 0 && lduino.getProgramReady()) { status += F("<font color='green'>New ladder program uploaded - file size: "); status += file_size; status += F(" bytes</font>"); } else { status += F("<font color='red'>Upload aborted</font>"); } main_page(client, status); break; } }