#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.println(millis() - lastMillis); lastMillis = millis(); Serial.print("Delay: "); Serial.println(chunk[0]); Serial.print("Indoor humidity: "); Serial.println(chunk[1]); Serial.print("Indoor temperature: "); Serial.println((((chunk[3] & 0x7f) << 8) + chunk[2]) * ((chunk[3] & 0x80) ? -0.1 : 0.1)); Serial.print("Outdoor humidity: "); Serial.println(chunk[4]); Serial.print("Outdoor temperature: "); Serial.println((((chunk[6] & 0x7f) << 8) + chunk[5]) * ((chunk[6] & 0x80) ? -0.1 : 0.1)); Serial.print("Absolute pressure: "); Serial.println(((chunk[8] << 8) + chunk[7]) * 0.1); Serial.print("Average wind speed: "); Serial.println((chunk[9] + ((chunk[11] & 0x0f) << 8)) * 0.1); Serial.print("Gust wind speed: "); Serial.println((chunk[10] + ((chunk[11] & 0xf0) << 4)) * 0.1); Serial.print("Wind direction: "); Serial.println(chunk[12] * 22.5); Serial.print("Total rain: "); Serial.println(((chunk[14] << 8) + chunk[13]) * 0.3); Serial.print("Status: "); Serial.println(chunk[15], HEX); } 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; } }