forked from Elara6331/infinitime
198 lines
4.5 KiB
Go
198 lines
4.5 KiB
Go
package weather
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Type of weather event
|
|
type EventType uint8
|
|
|
|
// These event types correspond to structs
|
|
// that can be used to add an event to the
|
|
// weather timeline
|
|
const (
|
|
EventTypeObscuration EventType = iota
|
|
EventTypePrecipitation
|
|
EventTypeWind
|
|
EventTypeTemperature
|
|
EventTypeAirQuality
|
|
EventTypeSpecial
|
|
EventTypePressure
|
|
EventTypeLocation
|
|
EventTypeClouds
|
|
EventTypeHumidity
|
|
)
|
|
|
|
// Special event type
|
|
type SpecialType uint8
|
|
|
|
// See https://git.io/JM7Oe for the meaning of each type
|
|
const (
|
|
SpecialTypeSquall SpecialType = iota
|
|
SpecialTypeTsunami
|
|
SpecialTypeTornado
|
|
SpecialTypeFire
|
|
SpecialTypeThunder
|
|
)
|
|
|
|
// Precipitation type
|
|
type PrecipitationType uint8
|
|
|
|
// See https://git.io/JM7YM for the meaning of each type
|
|
const (
|
|
PrecipitationTypeNone PrecipitationType = iota
|
|
PrecipitationTypeRain
|
|
PrecipitationTypeDrizzle
|
|
PrecipitationTypeFreezingRain
|
|
PrecipitationTypeSleet
|
|
PrecipitationTypeHail
|
|
PrecipitationTypeSmallHail
|
|
PrecipitationTypeSnow
|
|
PrecipitationTypeSnowGrains
|
|
PrecipitationTypeIceCrystals
|
|
PrecipitationTypeAsh
|
|
)
|
|
|
|
// Visibility obscuration type
|
|
type ObscurationType uint8
|
|
|
|
// See https://git.io/JM7Yd for the meaning of each type
|
|
const (
|
|
ObscurationTypeNone ObscurationType = iota
|
|
ObscurationTypeFog
|
|
ObscurationTypeHaze
|
|
ObscurationTypeSmoke
|
|
ObscurationTypeAsh
|
|
ObscurationTypeDust
|
|
ObscurationTypeSand
|
|
ObscurationTypeMist
|
|
ObscurationTypePrecipitation
|
|
)
|
|
|
|
// TimelineHeader contains the header for a timeline envent
|
|
type TimelineHeader struct {
|
|
// UNIX timestamp with timezone offset
|
|
Timestamp uint64
|
|
// Seconds until the event expires
|
|
Expires uint32
|
|
// Type of weather event
|
|
EventType EventType
|
|
}
|
|
|
|
// NewHeader creates and populates a new timeline header
|
|
// and returns it
|
|
func NewHeader(evtType EventType, expires time.Duration) TimelineHeader {
|
|
now := time.Now()
|
|
_, offset := now.Zone()
|
|
now = now.Add(time.Duration(offset) * time.Second)
|
|
|
|
return TimelineHeader{
|
|
Timestamp: uint64(now.Unix()),
|
|
Expires: uint32(expires.Seconds()),
|
|
EventType: evtType,
|
|
}
|
|
}
|
|
|
|
// CloudsEvent corresponds to EventTypeClouds
|
|
type CloudsEvent struct {
|
|
TimelineHeader
|
|
// Cloud coverage percentage
|
|
Amount uint8
|
|
}
|
|
|
|
// ObscurationEvent corresponds to EventTypeObscuration
|
|
type ObscurationEvent struct {
|
|
TimelineHeader
|
|
// Type of obscuration
|
|
Type ObscurationType
|
|
// Visibility in meters. 65535 is unspecified.
|
|
Amount uint16
|
|
}
|
|
|
|
// PrecipitationEvent corresponds to EventTypePrecipitation
|
|
type PrecipitationEvent struct {
|
|
TimelineHeader
|
|
// Type of precipitation
|
|
Type PrecipitationType
|
|
// Amount of rain in millimeters. 255 is unspecified.
|
|
Amount uint8
|
|
}
|
|
|
|
// WindEvent corresponds to EventTypeWind
|
|
type WindEvent struct {
|
|
TimelineHeader
|
|
// Minimum speed in meters per second
|
|
SpeedMin uint8
|
|
// Maximum speed in meters per second
|
|
SpeedMax uint8
|
|
// Unitless direction, about 1 unit per 0.71 degrees.
|
|
DirectionMin uint8
|
|
// Unitless direction, about 1 unit per 0.71 degrees
|
|
DirectionMax uint8
|
|
}
|
|
|
|
// TemperatureEvent corresponds to EventTypeTemperature
|
|
type TemperatureEvent struct {
|
|
TimelineHeader
|
|
// Temperature in celcius multiplied by 100.
|
|
// -32768 is "no data"
|
|
Temperature int16
|
|
// Dew point in celcius multiplied by 100.
|
|
// -32768 is "no data"
|
|
DewPoint int16
|
|
}
|
|
|
|
// LocationEvent corresponds to EventTypeLocation
|
|
type LocationEvent struct {
|
|
TimelineHeader
|
|
// Location name
|
|
Location string
|
|
// Altitude from sea level in meters
|
|
Altitude int16
|
|
// EPSG:3857 latitude (Google Maps, Openstreetmaps)
|
|
Latitude int32
|
|
// EPSG:3857 longitude (Google Maps, Openstreetmaps)
|
|
Longitude int32
|
|
}
|
|
|
|
// HumidityEvent corresponds to EventTypeHumidity
|
|
type HumidityEvent struct {
|
|
TimelineHeader
|
|
// Relative humidity percentage
|
|
Humidity uint8
|
|
}
|
|
|
|
// PressureEvent corresponds to EventTypePressure
|
|
type PressureEvent struct {
|
|
TimelineHeader
|
|
// Air pressure in hectopascals (hPa)
|
|
Pressure int16
|
|
}
|
|
|
|
// SpecialEvent corresponds to EventTypeSpecial
|
|
type SpecialEvent struct {
|
|
TimelineHeader
|
|
// Type of special event
|
|
Type SpecialType
|
|
}
|
|
|
|
// AirQualityEvent corresponds to EventTypeAirQuality
|
|
type AirQualityEvent struct {
|
|
TimelineHeader
|
|
// Name of the polluting item
|
|
//
|
|
// Do not localize the name. That should be handled by the watch.
|
|
//
|
|
// For particulate matter, use "PM0.1"`, "PM5", or "PM10".
|
|
//
|
|
// For chemicals, use the molecular formula ("NO2", "CO2", or "O3").
|
|
//
|
|
// For pollen, use the genus of the plant.
|
|
Polluter string
|
|
// Amount of pollution in SI units
|
|
//
|
|
// https://ec.europa.eu/environment/air/quality/standards.htm
|
|
// http://www.ourair.org/wp-content/uploads/2012-aaqs2.pdf
|
|
Amount uint32
|
|
}
|