Newer
Older
weather_station / hidwh1080rptparser.cpp
#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;
  }
}