static void ICACHE_FLASH_ATTR tcp_receive_cb(void *arg, char *pData, unsigned short len) { HttpdConnData c; char bfr[100] = { 0 }; struct espconn *conn = (struct espconn*) arg; httpdParseHeader(pData, &c); TESTP("URL=%s\n", c.url); if (httpSetupMode && os_strncmp(c.url, "/setup", 5) == 0) { if (httpdFindArg(c.getArgs, "Action", bfr, sizeof(bfr)) >= 0) { TESTP("Action=%s\n", bfr); if (os_strncmp(bfr, "Update", 6) == 0) { if (httpdFindArg(c.getArgs, "MQTThost", bfr, sizeof(bfr)) >= 0) { TESTP("MQTThost=%s\n", bfr); if (7 < os_strlen(bfr) && os_strlen(bfr) < sizeof(sysCfg.mqtt_host)) { os_strcpy(sysCfg.mqtt_host, bfr); } } if (httpdFindArg(c.getArgs, "MQTTport", bfr, sizeof(bfr)) >= 0) { TESTP("MQTTport=%s\n", bfr); if (1 <= os_strlen(bfr) && os_strlen(bfr) <= 4) { sysCfg.mqtt_port = atoi(bfr); } } if (httpdFindArg(c.getArgs, "MQTTuser", bfr, sizeof(bfr)) >= 0) { TESTP("MQTTuser=%s\n", bfr); if (0 <= os_strlen(bfr) && os_strlen(bfr) < sizeof(sysCfg.mqtt_user)) { os_strcpy(sysCfg.mqtt_user, bfr); } } if (httpdFindArg(c.getArgs, "MQTTpass", bfr, sizeof(bfr)) >= 0) { TESTP("MQTTpass=%s\n", bfr); if (0 <= os_strlen(bfr) && os_strlen(bfr) < sizeof(sysCfg.mqtt_pass)) { os_strcpy(sysCfg.mqtt_pass, bfr); } } if (httpdFindArg(c.getArgs, "DevPrefix", bfr, sizeof(bfr)) >= 0) { TESTP("DevPrefix=%s\n", bfr); if (2 <= os_strlen(bfr) && os_strlen(bfr) < sizeof(sysCfg.deviceID_prefix)) { os_strcpy(sysCfg.deviceID_prefix, bfr); os_sprintf(sysCfg.device_id, "%s%lx", sysCfg.deviceID_prefix, system_get_chip_id()); } } if (httpdFindArg(c.getArgs, "reboot", bfr, sizeof(bfr)) >= 0) { TESTP("reboot=%s\n", bfr); if (strcmp(bfr, "yes") == 0) { reboot = true; } } CFG_dirty(); } } replyOK(conn); } else { replyFail(conn); } }
void avrisp(int ReceivedByte){ // is pmode active? if (ram.isp.pmode) LEDs_TurnOnLEDs(LEDS_PMODE); else LEDs_TurnOffLEDs(LEDS_PMODE); // is there an error? if (ram.isp.error) LEDs_TurnOnLEDs(LEDS_ERR); else LEDs_TurnOffLEDs(LEDS_ERR); // read in bytes from the CDC interface if (!(ReceivedByte < 0)){ switch (ReceivedByte) { case STK_GET_SYNC: ram.isp.error = 0; replyOK(); break; case STK_GET_SIGNON: if (getch() == CRC_EOP) { sendCDCbyte(STK_INSYNC); sendCDCbyte('A'); sendCDCbyte('V'); sendCDCbyte('R'); sendCDCbyte(' '); sendCDCbyte('I'); sendCDCbyte('S'); sendCDCbyte('P'); sendCDCbyte(STK_OK); } break; case STK_GET_PARM: get_parameters(getch()); break; case STK_SET_PARM: set_parameters(); replyOK(); break; case STK_SET_PARM_EXT: // extended parameters - ignore for now fill(5); replyOK(); break; case STK_PMODE_START: start_pmode(); replyOK(); break; case STK_SET_ADDR: ram.isp._addr = getch(); ram.isp._addr += 256 * getch(); replyOK(); break; case STK_PROG_FLASH: //uint8_t low = getch(); getch(); //uint8_t high = getch(); getch(); replyOK(); break; case STK_PROG_DATA: //uint8_t data = getch(); getch(); replyOK(); break; case STK_PROG_PAGE: program_page(); break; case STK_READ_PAGE: read_page(); break; case STK_UNIVERSAL: universal(); break; case STK_PMODE_END: ram.isp.error = 0; end_pmode(); replyOK(); break; case STK_READ_SIGN: read_signature(); break; // expecting a command, not CRC_EOP // this is how we can get back in sync case CRC_EOP: ram.isp.error++; sendCDCbyte(STK_NOSYNC); break; // anything else we will return STK_UNKNOWN default: ram.isp.error++; if (CRC_EOP == getch()) sendCDCbyte(STK_UNKNOWN); else sendCDCbyte(STK_NOSYNC); } } }