enum hxb_error_code endpoint_get_name(uint32_t eid, char* buffer, size_t len) { if (eid % 32 == 0) { if (len >= nvm_size(domain_name)) { len = nvm_size(domain_name) - 1; } nvm_read_block(domain_name, buffer, len); buffer[nvm_size(domain_name)] = '\0'; return HXB_ERR_SUCCESS; } else { struct endpoint_descriptor ep; if (find_descriptor(eid, &ep)) { strncpy_from_rodata(buffer, ep.name, len); return HXB_ERR_SUCCESS; } else { return HXB_ERR_UNKNOWNEID; } } }
static ulong nvm_hex2ulong(byte *addr, byte len) { char c; ulong v = 0; nvm_read_block(tmp_buffer, (void*)addr, len); for(byte i=0;i<len;i++) { c = tmp_buffer[i]; v <<= 4; if(c>='0' && c<='9') { v += (c-'0'); } else if (c>='A' && c<='F') { v += 10 + (c-'A'); } else if (c>='a' && c<='f') { v += 10 + (c-'a'); } else { return 0; } } return v; }
void GetWeather() { // perform DNS lookup for every query nvm_read_block(tmp_buffer, (void*)ADDR_NVM_WEATHERURL, MAX_WEATHERURL); ether.dnsLookup(tmp_buffer, true); //bfill=ether.tcpOffset(); char tmp[30]; read_from_file(wtopts_filename, tmp, 30); BufferFiller bf = (uint8_t*)tmp_buffer; bf.emit_p(PSTR("$D.py?loc=$E&key=$E&fwv=$D&wto=$S"), (int) os.options[OPTION_USE_WEATHER], ADDR_NVM_LOCATION, ADDR_NVM_WEATHER_KEY, (int)os.options[OPTION_FW_VERSION], tmp); // copy string to tmp_buffer, replacing all spaces with _ char *src=tmp_buffer+strlen(tmp_buffer); char *dst=tmp_buffer+TMP_BUFFER_SIZE-12; char c; // url encode. convert SPACE to %20 // copy reversely from the end because we are potentially expanding // the string size while(src!=tmp_buffer) { c = *src--; if(c==' ') { *dst-- = '0'; *dst-- = '2'; *dst-- = '%'; } else { *dst-- = c; } }; *dst = *src; uint16_t _port = ether.hisport; // save current port number ether.hisport = 80; ether.browseUrl(PSTR("/weather"), dst, PSTR("*"), getweather_callback); ether.hisport = _port; }
void OpenSprinkler::station_attrib_bits_load(int addr, byte bits[]) { nvm_read_block(bits, (void*)addr, MAX_EXT_BOARDS+1); }
// Get station name from nvm void OpenSprinkler::get_station_name(byte sid, char tmp[]) { tmp[STATION_NAME_SIZE]=0; nvm_read_block(tmp, (void*)(ADDR_NVM_STN_NAMES+(int)sid*STATION_NAME_SIZE), STATION_NAME_SIZE); return; }
void GetWeather() { EthernetClient client; struct hostent *server; nvm_read_block(tmp_buffer, (void*)ADDR_NVM_WEATHERURL, MAX_WEATHERURL); server = gethostbyname(tmp_buffer); if (!server) { DEBUG_PRINTLN("can't resolve weather server"); return; } DEBUG_PRINT("weather server ip:"); DEBUG_PRINT(((uint8_t*)server->h_addr)[0]); DEBUG_PRINT(":"); DEBUG_PRINT(((uint8_t*)server->h_addr)[1]); DEBUG_PRINT(":"); DEBUG_PRINT(((uint8_t*)server->h_addr)[2]); DEBUG_PRINT(":"); DEBUG_PRINTLN(((uint8_t*)server->h_addr)[3]); if (!client.connect((uint8_t*)server->h_addr, 80)) { client.stop(); return; } BufferFiller bf = tmp_buffer; char tmp[100]; read_from_file(wtopts_filename, tmp, 100); bf.emit_p(PSTR("$D.py?loc=$E&key=$E&fwv=$D&wto=$S"), (int) os.options[OPTION_USE_WEATHER], ADDR_NVM_LOCATION, ADDR_NVM_WEATHER_KEY, (int)os.options[OPTION_FW_VERSION], tmp); char *src=tmp_buffer+strlen(tmp_buffer); char *dst=tmp_buffer+TMP_BUFFER_SIZE-12; char c; // url encode. convert SPACE to %20 // copy reversely from the end because we are potentially expanding // the string size while(src!=tmp_buffer) { c = *src--; if(c==' ') { *dst-- = '0'; *dst-- = '2'; *dst-- = '%'; } else { *dst-- = c; } }; *dst = *src; char urlBuffer[255]; strcpy(urlBuffer, "GET /weather"); strcat(urlBuffer, dst); strcat(urlBuffer, " HTTP/1.0\r\nHOST: weather.opensprinkler.com\r\n\r\n"); DEBUG_PRINTLN(urlBuffer); client.write((uint8_t *)urlBuffer, strlen(urlBuffer)); bzero(ether_buffer, ETHER_BUFFER_SIZE); time_t timeout = os.now_tz() + 5; // 5 seconds timeout while(os.now_tz() < timeout) { int len=client.read((uint8_t *)ether_buffer, ETHER_BUFFER_SIZE); if (len<=0) { if(!client.connected()) break; else continue; } peel_http_header(); getweather_callback(0, 0, ETHER_BUFFER_SIZE); break; } client.stop(); }