// Save station attribute bits to NVM void OpenSprinkler::station_attrib_bits_save(int addr, byte bits[]) { nvm_write_block(bits, (void*)addr, MAX_EXT_BOARDS+1); }
static PT_THREAD(handle_input(struct httpd_state *s)) { int found = 0; PSOCK_BEGIN(&s->sin); PSOCK_READTO(&s->sin, ISO_space); if(httpd_strncmp(s->inputbuf, httpd_get, 4) == 0) { PSOCK_READTO(&s->sin, ISO_space); if(s->inputbuf[0] != ISO_slash) { PSOCK_CLOSE_EXIT(&s->sin); } if(s->inputbuf[1] == ISO_space) { httpd_strcpy(s->filename, httpd_indexfn); } else { s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name and send any following text to the LCD */ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; // s->inputbuf[i]=0; //allow multiple beeps with multiple ?'s } if (s->inputbuf[i]==0) break; } } } else if(httpd_strncmp(s->inputbuf, httpd_post, 5) == 0) { PSOCK_READTO(&s->sin, ISO_space); if(s->inputbuf[0] != ISO_slash) { PSOCK_CLOSE_EXIT(&s->sin); } if (httpd_strncmp(&s->inputbuf[1], httpd_config_file, sizeof(httpd_config_file)-1) == 0) { s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name*/ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; } if (s->inputbuf[i]==0) break; } //parse config data found = 0; //look for the combination "\r\n\r\n"; the post data follow thereafter while (!found) { PSOCK_READTO(&s->sin, ISO_nl); PSOCK_READTO(&s->sin, ISO_cr); if (PSOCK_DATALEN(&s->sin) == 1) { PSOCK_READTO(&s->sin, ISO_nl); found=1; } } PSOCK_READTO(&s->sin, ISO_equal); //check for domain_name PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] != ISO_amper) { char tmp[nvm_size(domain_name)]; memset(tmp, 0, sizeof (tmp)); memcpy(tmp, s->inputbuf, PSOCK_DATALEN(&s->sin) - 1); nvm_write_block(domain_name, tmp, sizeof(tmp)); } PSOCK_READTO(&s->sin, ISO_equal); //check for relay_default_state PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] == '1') set_relay_default(0); else if (s->inputbuf[0] == '0') set_relay_default(1); #if S0_ENABLE PSOCK_READTO(&s->sin, ISO_equal); //check for s0 calibration value PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] != ISO_amper) { metering_set_s0_calibration((uint16_t)atoi(s->inputbuf)); } #endif } else if (httpd_strncmp(&s->inputbuf[1], httpd_socket_status_file, sizeof(httpd_socket_status_file)-1) == 0) { // toggle button has been pressed s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name*/ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; } if (s->inputbuf[i]==0) break; } relay_toggle(); } else { PSOCK_CLOSE_EXIT(&s->sin); } } else { PSOCK_CLOSE_EXIT(&s->sin); } webserver_log_file(&uip_conn->ripaddr, s->filename); s->state = (s->state == STATE_ERROR) ? STATE_OUTPUT_ERROR : STATE_OUTPUT; while(1) { PSOCK_READTO(&s->sin, ISO_nl); if(httpd_strncmp(s->inputbuf, httpd_ref, 8) == 0) { s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; petsciiconv_topetscii(s->inputbuf, PSOCK_DATALEN(&s->sin) - 2); webserver_log(s->inputbuf); } } PSOCK_END(&s->sin); }
// Set station name to nvm void OpenSprinkler::set_station_name(byte sid, char tmp[]) { tmp[STATION_NAME_SIZE]=0; nvm_write_block(tmp, (void*)(ADDR_NVM_STN_NAMES+(int)sid*STATION_NAME_SIZE), STATION_NAME_SIZE); return; }