package uk.org.floop.msc.wview object VALUE_TYPE extends Enumeration { val FLOAT, USHORT, TIME_T, SHORT, UCHAR = Value def sizeof(t: Value): Int = t match { case VALUE_TYPE.FLOAT => 4 case VALUE_TYPE.USHORT => 2 case VALUE_TYPE.TIME_T => 4 case VALUE_TYPE.SHORT => 2 case VALUE_TYPE.UCHAR => 1 } } object LoopPacket { val fields = List( (VALUE_TYPE.FLOAT, "barometer"), // inches (VALUE_TYPE.FLOAT, "stationPressure"), // inches (VALUE_TYPE.FLOAT, "altimeter"), // inches (VALUE_TYPE.FLOAT, "inTemp"), // degrees F (VALUE_TYPE.FLOAT, "outTemp"), // degrees F (VALUE_TYPE.USHORT, "inHumidity"), // percent (VALUE_TYPE.USHORT, "outHumidity"), // percent (VALUE_TYPE.FLOAT, "windSpeed"), // mph (VALUE_TYPE.USHORT, "windDir"), // degrees (VALUE_TYPE.USHORT, "padding1"), // ! 2 bytes of padding (VALUE_TYPE.FLOAT, "windGust"), // mph (VALUE_TYPE.USHORT, "windGustDir"), // degrees (VALUE_TYPE.USHORT, "padding2"), // ! 2 bytes of padding (VALUE_TYPE.FLOAT, "rainRate"), // in/hr (VALUE_TYPE.FLOAT, "sampleRain"), // inches (VALUE_TYPE.FLOAT, "sampleET"), // ET (VALUE_TYPE.USHORT, "radiation"), // watts/m^3 (VALUE_TYPE.USHORT, "padding3"), // ! 2 bytes of padding (VALUE_TYPE.FLOAT, "UV"), // UV index * 10 (VALUE_TYPE.FLOAT, "dewpoint"), // degrees F (VALUE_TYPE.FLOAT, "windchill"), // degrees F (VALUE_TYPE.FLOAT, "heatindex"), // degrees F // computed values - station should not alter these (VALUE_TYPE.FLOAT, "stormRain"), // inches (VALUE_TYPE.TIME_T, "stormStart"), // time_t (VALUE_TYPE.FLOAT, "dayRain"), // inches (VALUE_TYPE.FLOAT, "monthRain"), // inches (VALUE_TYPE.FLOAT, "yearRain"), // inches (VALUE_TYPE.FLOAT, "dayET"), // inches (VALUE_TYPE.FLOAT, "monthET"), // inches (VALUE_TYPE.FLOAT, "yearET"), // inches (VALUE_TYPE.FLOAT, "intervalAvgWCHILL"), // degrees F (VALUE_TYPE.FLOAT, "intervalAvgWSPEED"), // mph (VALUE_TYPE.USHORT, "yearRainMonth"), // 1-12 Rain Start Month // --- The following may or may not be supported for a given station --- // Vantage Pro (VALUE_TYPE.USHORT, "rxCheckPercent"), // 0 - 100 (VALUE_TYPE.USHORT, "tenMinuteAvgWindSpeed"), // mph (VALUE_TYPE.USHORT, "forecastIcon"), // VP only (VALUE_TYPE.USHORT, "forecastRule"), // VP only (VALUE_TYPE.USHORT, "txBatteryStatus"), // VP only (VALUE_TYPE.USHORT, "consBatteryVoltage"), // VP only (VALUE_TYPE.USHORT, "padding4"), // ! 2 bytes of padding (VALUE_TYPE.FLOAT, "soilTemp1"), // degrees F + 90 (VALUE_TYPE.FLOAT, "soilTemp2"), // degrees F + 90 (VALUE_TYPE.FLOAT, "soilTemp3"), // degrees F + 90 (VALUE_TYPE.FLOAT, "soilTemp4"), // degrees F + 90 (VALUE_TYPE.FLOAT, "leafTemp1"), // degrees F + 90 (VALUE_TYPE.FLOAT, "leafTemp2"), // degrees F + 90 (VALUE_TYPE.UCHAR, "soilMoist1"), (VALUE_TYPE.UCHAR, "soilMoist2"), (VALUE_TYPE.UCHAR, "leafWet1"), (VALUE_TYPE.UCHAR, "leafWet2"), // Vaisala WXT-510 (VALUE_TYPE.FLOAT, "wxt510Hail"), // inches (VALUE_TYPE.FLOAT, "wxt510Hailrate"), // in/hr (VALUE_TYPE.FLOAT, "wxt510HeatingTemp"), // degrees F (VALUE_TYPE.FLOAT, "wxt510HeatingVoltage"), // volts (VALUE_TYPE.FLOAT, "wxt510SupplyVoltage"), // volts (VALUE_TYPE.FLOAT, "wxt510ReferenceVoltage"), // volts (VALUE_TYPE.FLOAT, "wxt510RainDuration"), // sec (VALUE_TYPE.FLOAT, "wxt510RainPeakRate"), // volts (VALUE_TYPE.FLOAT, "wxt510HailDuration"), // sec (VALUE_TYPE.FLOAT, "wxt510HailPeakRate"), // volts (VALUE_TYPE.FLOAT, "wxt510Rain"), // inches // WMR918/968 (VALUE_TYPE.FLOAT, "wmr918Pool"), // degrees F (VALUE_TYPE.UCHAR, "wmr918Humid3"), // percent (VALUE_TYPE.UCHAR, "wmr918Tendency"), // WMR's Forecast (VALUE_TYPE.UCHAR, "wmr918WindBatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918RainBatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918OutTempBatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918InTempBatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918poolTempBatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918extra1BatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918extra2BatteryStatus"), (VALUE_TYPE.UCHAR, "wmr918extra3BatteryStatus"), (VALUE_TYPE.USHORT, "padding5"), // ! 2 bytes of padding // Generic extra sensor and status support: (VALUE_TYPE.FLOAT, "extraTemp0"), (VALUE_TYPE.FLOAT, "extraTemp1"), (VALUE_TYPE.FLOAT, "extraTemp2"), (VALUE_TYPE.FLOAT, "extraTemp3"), (VALUE_TYPE.FLOAT, "extraTemp4"), (VALUE_TYPE.FLOAT, "extraTemp5"), (VALUE_TYPE.FLOAT, "extraTemp6"), (VALUE_TYPE.FLOAT, "extraTemp7"), (VALUE_TYPE.FLOAT, "extraTemp8"), (VALUE_TYPE.FLOAT, "extraTemp9"), (VALUE_TYPE.FLOAT, "extraTempA"), (VALUE_TYPE.FLOAT, "extraTempB"), (VALUE_TYPE.FLOAT, "extraTempC"), (VALUE_TYPE.FLOAT, "extraTempD"), (VALUE_TYPE.FLOAT, "extraTempE"), (VALUE_TYPE.FLOAT, "extraTempF"), (VALUE_TYPE.USHORT, "extraHumidity0"), (VALUE_TYPE.USHORT, "extraHumidity1"), (VALUE_TYPE.USHORT, "extraHumidity2"), (VALUE_TYPE.USHORT, "extraHumidity3"), (VALUE_TYPE.USHORT, "extraHumidity4"), (VALUE_TYPE.USHORT, "extraHumidity5"), (VALUE_TYPE.USHORT, "extraHumidity6"), (VALUE_TYPE.USHORT, "extraHumidity7"), (VALUE_TYPE.USHORT, "extraHumidity8"), (VALUE_TYPE.USHORT, "extraHumidity9"), (VALUE_TYPE.USHORT, "extraHumidityA"), (VALUE_TYPE.USHORT, "extraHumidityB"), (VALUE_TYPE.USHORT, "extraHumidityC"), (VALUE_TYPE.USHORT, "extraHumidityD"), (VALUE_TYPE.USHORT, "extraHumidityE"), (VALUE_TYPE.USHORT, "extraHumidityF"), (VALUE_TYPE.UCHAR, "windBatteryStatus"), (VALUE_TYPE.UCHAR, "rainBatteryStatus"), (VALUE_TYPE.UCHAR, "outTempBatteryStatus"), (VALUE_TYPE.UCHAR, "consoleBatteryStatus"), (VALUE_TYPE.UCHAR, "uvBatteryStatus"), (VALUE_TYPE.UCHAR, "solarBatteryStatus"), (VALUE_TYPE.USHORT, "padding6"), // ! 2 bytes of padding (VALUE_TYPE.UCHAR, "extraTempBatteryStatus0"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus1"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus2"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus3"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus4"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus5"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus6"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus7"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus8"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatus9"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusA"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusB"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusC"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusD"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusE"), (VALUE_TYPE.UCHAR, "extraTempBatteryStatusF") ) val START_FRAME = Array(0x88, 0xf3, 0xa2, 0xc6, 0xda, 0xda, 0x01, 0x00).map(_.toByte) val SIZE = LoopPacket.fields.map(pair => VALUE_TYPE.sizeof(pair._1)).foldLeft(0)(_ + _) }