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.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;
  }
}