#include "hidwh1080rptparser.h" void WH1080ReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) { // See http://www.jim-easterbrook.me.uk/weather/mm/ if ((chunkStart + len) >= WH1080_BUFFER_CHUNK) { memcpy(chunk + chunkStart, buf, WH1080_BUFFER_CHUNK - chunkStart); chunkStart = 0; if (readingBlockZero) { unsigned short currentPos = chunk[WH1080_CURRENT_POS] + (chunk[WH1080_CURRENT_POS + 1] << 8); report[1] = (uint8_t)(currentPos / 256); report[2] = (uint8_t)(currentPos & 255); report[5] = (uint8_t)(currentPos / 256); report[6] = (uint8_t)(currentPos & 255); readingBlockZero = false; startDelay = millis() + 250; } else { if (memcmp(chunk, lastChunk, WH1080_BUFFER_CHUNK) != 0) { memcpy(lastChunk, chunk, WH1080_BUFFER_CHUNK); //Serial.print("Time since last change: "); Serial.print("{\"period\":"); Serial.print(millis() - lastMillis); lastMillis = millis(); Serial.print(",\"delay\":"); Serial.print(chunk[WH1080_DELAY]); Serial.print(",\"in_humidity\":"); Serial.print(chunk[WH1080_HUMIDITY_IN]); Serial.print(",\"in_temp\":"); Serial.print((((chunk[WH1080_TEMPERATURE_IN+1] & 0x7f) << 8) + chunk[WH1080_TEMPERATURE_IN]) * ((chunk[WH1080_TEMPERATURE_IN+1] & 0x80) ? -0.1 : 0.1)); Serial.print(",\"out_humidity\":"); Serial.print(chunk[WH1080_HUMIDITY_OUT]); Serial.print(",\"out_temp\":"); Serial.print((((chunk[WH1080_TEMPERATURE_OUT+1] & 0x7f) << 8) + chunk[WH1080_TEMPERATURE_OUT]) * ((chunk[WH1080_TEMPERATURE_OUT+1] & 0x80) ? -0.1 : 0.1)); Serial.print(",\"pressure\":"); Serial.print(((chunk[WH1080_ABS_PRESSURE+1] << 8) + chunk[WH1080_ABS_PRESSURE]) * 0.1); Serial.print(",\"wind_speed\":"); Serial.print((chunk[WH1080_WIND_AVE] + ((chunk[WH1080_WIND_GUST+1] & 0x0f) << 8)) * 0.1); Serial.print(",\"wind_gust\":"); Serial.print((chunk[WH1080_WIND_GUST] + ((chunk[WH1080_WIND_GUST+1] & 0xf0) << 4)) * 0.1); Serial.print(",\"wind_dir\":"); Serial.print(chunk[WH1080_WIND_DIR] * 22.5); Serial.print(",\"rain\":"); Serial.print(((chunk[WH1080_RAIN+1] << 8) + chunk[WH1080_RAIN]) * 0.3); // TODO: check overflow bit Serial.print(",\"status\":"); Serial.print(chunk[WH1080_STATUS], HEX); Serial.println("}"); } readingBlockZero = true; report[1] = 0; report[2] = 0; report[5] = 0; report[6] = 0; startDelay = millis() + 5000; } } else { memcpy(chunk + chunkStart, buf, len); chunkStart += len; } }