// SPDX-License-Identifier: Apache-2.0 // Copyright (c) 2012-2024 Scott Penrose and WII5 Buoy contributors // // This file is part of WII5 Buoy firmware. // See LICENSE for full terms. /** * @file WII5Data.h * @brief Shared data type definitions: enums, status codes, error codes. */ #ifndef WII5Data_h #define WII5Data_h /* WII5 - Data Structures */ #if !defined(__time_t_defined) // avoid conflict with newlib or other posix libc typedef unsigned long time_t; #endif // Manual from Sh3d #define SH3D_TYPE_COUNTER uint32_t #define SH3D_TYPE_UNIQUEID uint64_t #define SH3D_TYPE_PACKET_TYPE uint8_t #define SH3D_TYPE_PACKET_VERSION uint8_t // Number of seconds in... #define WII5TIME_1WEEK (uint32_t)7*(uint32_t)24*(uint32_t)3600 #define WII5TIME_1DAY (uint32_t)24*(uint32_t)3600 #define WII5TIME_12HOUR (uint32_t)12*(uint32_t)3600 #define WII5TIME_1HOUR (uint32_t)3600 /* Basic: Max 50 bytes * Buoy ID (16 or 32 bit LSB of 64 bit NodeID) * Date time * Location Lat, Lon, Age (in minutes, 1 byte) * Battery Voltage, Age (in miutes) * Temperature Internal, Age (in minutes) * Sleep information - ? Full: Max 100 bytes * More data? Error: * Basic + Error Number and String NOTE: Other types, such as Binary processed Maths come from the Maths CPU */ enum WII5SELFTEST_DEVICES { WII5STD_BOARD = 0, WII5STD_GPS, WII5STD_EEPROM, WII5STD_SD1, WII5STD_SD2, WII5STD_IRIDIUM, WII5STD_BATTERY, WII5STD_MATHS, WII5STD_RTC, WII5STD_SPARTON, WII5STD_18B20, WII5STD_BUTTON, WII5STD_LED, WII5STD_BUZZER, WII5STD_5VOLT, WII5STD_DEVICES }; enum WII5SELFTEST_STATUS { WII5STS_NONE, // Never run WII5STS_NC, // Not connected, not enabled, or not applicable WII5STS_SUCCESS, // SUCCCESS - literally nothing to report WII5STS_HUMAN, // HUMAN - we assume success, but need a human to confirm WII5STS_SLOW, // SLOW - SUCCESS in all ways, but slower than expected. Good for SD, Maths boot, GPS lock etc WII5STS_POWER, // Works, but power management may have failed (e.g. serial data still coming in when power off) WII5STS_TIMEOUT, // Literally timed out. No failure we can actually understand. WII5STS_OUTOFRANGE, // Out of range - voltage, or GPS or something out of range WII5STS_UNKNOWN, // Some sort of bad, unknown error }; enum WII5_DEVICES { WII5DEVICE_UNKNOWN, WII5DEVICE_WAVEBUOY, // This AVR - myself WII5DEVICE_MATHS, // Maths CPU on the Console WII5DEVICE_CONTROLLER, // Dedicated controller - e.g. handheld Wifi Accessed device WII5DEVICE_CLI, // Simple CLI Serial port controller WII5DEVICE_SERVER // Via the Server - e.g. remote command sent from Web Server }; enum WII5_CONTROLLERS { WII5CONTROLLER_UNKNOWN, WII5CONTROLLER_DRIVER, // ie. See Driver below WII5CONTROLLER_CONFIG, WII5CONTROLLER_CONTROLLER, WII5CONTROLLER_COMMANDS, WII5CONTROLLER_DISPLAY, WII5CONTROLLER_HELP, WII5CONTROLLER_SETUP, WII5CONTROLLER_STRINGS, WII5CONTROLLER_METADATA, }; enum WII5_DRIVERS { WII5DRIVER_UNKNOWN, WII5DRIVER_GPS, WII5DRIVER_MATHS, WII5DRIVER_COMMS, WII5DRIVER_COMMS_IRIDIUM, WII5DRIVER_MPU9250, WII5DRIVER_POWER, WII5DRIVER_SPARTON, WII5DRIVER_STORAGE, WII5DRIVER_WEATHER_18B20, WII5DRIVER_BATTERY, WII5DRIVER_RADIO, WII5DRIVER_RTC, WII5DRIVER_WDT, }; enum WII5_PORTS { WII5PORT_UNKNOWN, WII5PORT_RADIO, // Came from the radio, probably LoRa WII5PORT_COMMS, // Came from main comms, e.g. Iridium or similar WII5PORT_CONSOLE, // Via the console, probably an end user (or Maths) WII5PORT_MATHS // From the maths CPU - probably a processed command via web interface }; enum WII5_MATHSMODE { WII5MATHSMODE_UNKNOWN, WII5MATHSMODE_AUTO, // Run in auto mode, start and stop as normal WII5MATHSMODE_BUTTON, // Button was pressed, internally uses setHold WII5MATHSMODE_COMMS, // Communication data came in }; enum WII5_AREAS { WII5AREA_UNKNOWN, WII5AREA_WII5, WII5AREA_HELP, WII5AREA_SH3D }; enum WII5_COMMANDS { WII5COMMAND_NONE = 0, // Not yet parsed WII5COMMAND_NA = 1, // Parsed but no good WII5COMMAND_HELP = 10, // @WII5,help - see @Help WII5COMMAND_LOG_DEBUG = 11, // Show debugging WII5COMMAND_LOG_DEFAULT = 12,// Normal level of logging WII5COMMAND_LOG_FATAL = 13, // Fatals only WII5COMMAND_LOG_ERROR = 14, // Error only WII5COMMAND_LOG_TEST = 19, // Test out the log // Hello and ACK - mostly about chatting to Maths WII5COMMAND_HELLO = 100, WII5COMMAND_HELLOACK = 101, // Do it ! WII5COMMAND_RESET = 102, // Reset the AVR now WII5COMMAND_STORAGE_FORMAT = 103, // Format 1 or more storage devices, all data lost from there WII5COMMAND_ECHO = 110, WII5COMMAND_PEOPLE = 111, WII5COMMAND_BATTERY_START = 112, WII5COMMAND_WEATHER_READ = 113, WII5COMMAND_SET = 114, WII5COMMAND_SEND = 115, WII5COMMAND_WEATHER_TEST = 116, // Set modes now - temporary until reboot etc WII5COMMAND_MODE_SELFTEST = 200, WII5COMMAND_MODE_MANUALTEST = 201, WII5COMMAND_MODE_SLEEP = 202, WII5COMMAND_MODE_DEFAULT = 203, WII5COMMAND_MODE_POSITION = 204, WII5COMMAND_MODE_CAPTURE = 205, // Status and Dumps WII5COMMAND_STATUS = 300, // Optional Device Name WII5COMMAND_DUMP = 301, WII5COMMAND_WAITX = 302, WII5COMMAND_WAITY = 303, WII5COMMAND_WAITZ = 304, WII5COMMAND_WAITQ = 305, WII5COMMAND_WAITS = 306, // Settings - stored WII5COMMAND_SETTING_LIST = 400, // List current settings WII5COMMAND_SETTING_DEVICEID = 401, // Include Device ID to change WII5COMMAND_SETTING_GPSTIMEOUT = 402, // GPSTimeout WII5COMMAND_SETTING_DEFAULTS = 403, // optionally add DeviceId WII5COMMAND_SETTING_RESET = 404, // Reset counters..... Danger WII5COMMAND_SETTING_MODE = 405, // Saved Mode WII5COMMAND_SETTING_TIME = 406, WII5COMMAND_SETTING_DISABLELOWBATTERY = 407, WII5COMMAND_SETTING_FLAGS = 408, WII5COMMAND_SETTING_CAPTUREOPTIONS = 409, WII5COMMAND_SETTING_POSITIONOPTIONS = 410, WII5COMMAND_SETTING_SLEEPOPTIONS = 411, WII5COMMAND_SETTING_BATTERYOPTIONS = 412, // Device - MIsc WII5COMMAND_GPS_MODE = 500, WII5COMMAND_GPS_DUMP = 501, WII5COMMAND_GPS_PASSTHROUGH = 502, WII5COMMAND_GPS_DEBUG = 503, WII5COMMAND_GPS_START = 504, WII5COMMAND_GPS_STOP = 505, WII5COMMAND_GPS_TIME = 506, WII5COMMAND_GPS_POS = 507, WII5COMMAND_GPS_ACCURATE = 508, WII5COMMAND_SPARTON_MODE = 510, WII5COMMAND_SPARTON_DUMP = 511, WII5COMMAND_SPARTON_DEBUG = 513, WII5COMMAND_SPARTON_PASSTHROUGH = 514, WII5COMMAND_SPARTON_INFO = 515, // Device - Maths WII5COMMAND_MATHS_START = 550, // Turn On maths WII5COMMAND_MATHS_STOP = 551, // Stop maths WII5COMMAND_MATHS_BEEP = 552, // Beep ! WII5COMMAND_MATHS_RESTART = 553, // Maths informing that it is restarting WII5COMMAND_MATHS_SHUTDOWN = 554, // Maths being requested to shutdown WII5COMMAND_MATHS_HALT = 555, // Maths informing that it is now halting WII5COMMAND_MATHS_BOOTED = 556, // Maths tells us it is bootet d WII5COMMAND_MATHS_KEEPALIVE = 557, // Maths informing "keep alive" (aka not shut shutdown) WII5COMMAND_MATHS_WIFI_LOCAL = 558, // Tell Maths to try Local WIFI WII5COMMAND_MATHS_WIFI_WAP = 559, // Tell Maths to create a WAP WII5COMMAND_MATHS_SHELL = 560, // Send a direct shell command (can do anything). WII5COMMAND_MATHS_HOLD = 561, // Hold vs Keep Alive.... hmmmm WII5COMMAND_MATHS_FLIP = 562, // We are running all the time. Request a flip of the AVR // TODO Create new file, append, run - so we can send multiple packets, to create arbitrary long file // WII5COMMAND_MATHS_S, // Send a direct shell command (can do anything). WII5COMMAND_MATHS_REPROCESS = 563, // Send maths request to reprocess a file WII5COMMAND_MATHS_BUILD = 564, // Rebuild the maths code with some optional make directives WII5COMMAND_MATHS_FIRMWARE = 565, // Update the firmware, inputs will be 'dev', 'local', 'latest, 'vn.n' (version) WII5COMMAND_MATHS_PATCHLOCAL = 566, // Patch the local Firmware code and rebuild WII5COMMAND_MATHS_UNTIL = 567, // Set the UNTIL - forced power switch on control WII5COMMAND_MATHS_INFO = 568, // Show some info - what is the Maths CPU doing WII5COMMAND_MATHS_DO = 569, WII5COMMAND_MATHS_MAKE = 570, WII5COMMAND_MATHS_SCRIPT = 571, // Actually - use this to add to QUEUE WII5COMMAND_MATHS_DONE = 572, // Actually - use this to add to QUEUE WII5COMMAND_MATHS_RETURN = 573, // RETURN line Turn on or off // Device - Storage cards WII5COMMAND_STORAGE_START = 580, // Mode 1,2,3,4 WII5COMMAND_STORAGE_STOP = 581, WII5COMMAND_STORAGE_TESTFILE = 582, // TODO ls, chdir, get (filename) etc WII5COMMAND_STORAGE_CONSOLEFILE = 583, WII5COMMAND_STORAGE_SERIALFILE = 584, WII5COMMAND_STORAGE_SETSTATUS = 589, WII5COMMAND_STORAGE_OFF = 590, WII5COMMAND_STORAGE_SD1 = 591, WII5COMMAND_STORAGE_SD2 = 592, WII5COMMAND_STORAGE_LIST = 593, WII5COMMAND_STORAGE_VIEW = 594, WII5COMMAND_STORAGE_RESULTS = 595, WII5COMMAND_STORAGE_DEBUG = 596, WII5COMMAND_STORAGE_STATUS = 597, WII5COMMAND_STORAGE_RAW = 598, WII5COMMAND_STORAGE_METADATA = 599, // Device - Network / Radio WII5COMMAND_NETWORK_ECHO = 600, WII5COMMAND_NETWORK_ECHOACK = 601, WII5COMMAND_NETWORK_FAKEECHO = 602, WII5COMMAND_NETWORK_FAKEECHOACK = 603, // Instant commands for modes WII5COMMAND_CAPTURE_START = 700, WII5COMMAND_CAPTURE_STOP = 701, WII5COMMAND_POSITION_START = 702, WII5COMMAND_POSITION_STOP = 703, WII5COMMAND_POSITION_PASSTHROUGH = 704, WII5COMMAND_BINDATA_LIST = 800, WII5COMMAND_BINDATA_SPLIT = 801, // Iridium (90x) & Communications (91x) WII5COMMAND_IRIDIUM_SEND = 901, WII5COMMAND_COMMUNICATIONS_DISABLED = 911, WII5COMMAND_COMMUNICATIONS_TEST = 912, WII5COMMAND_COMMUNICATIONS_START = 913, WII5COMMAND_COMMUNICATIONS_STOP = 914, WII5COMMAND_COMMUNICATIONS_SIGNAL = 915, }; // Results of a command request #define WII5_RESULT_MESSAGE 250 enum WII5_RESULTS { WII5RESULTS_UNKNOWN = 0, // Not great, no idea what happened WII5RESULTS_SUCCESS = 1, // Success - everything worked as you expected WII5RESULTS_INVALID = 2, // Invalid - probably paramers, see message WII5RESULTS_RETRY = 3, // Retry later WII5RESULTS_ERROR = 4, // Error, see message WII5RESULTS_NOREPLY = 5, // This command can't get a reply - e.g. Help }; // Status of a Driver / Device enum WII5_STATUS { WII5STATUS_UNKNOWN, WII5STATUS_OFF, WII5STATUS_ON, WII5STATUS_ON_VALID, WII5STATUS_BUSY, WII5STATUS_WAITING, WII5STATUS_ERROR }; // Error for device // 50 = about 1K // 10 = about 190 bytes #define WII5_ERROR_STRING_MAX 5 enum WII5_ERRORS { WII5ERROR_UNKNOWN, WII5ERROR_NONE, WII5ERROR_RETRY, WII5ERROR_INIT, WII5ERROR_MEMORY, WII5ERROR_TIMEOUT, WII5ERROR_FATAL }; enum WII5_SERIALCMDS { WII5SERIALCMD_NONE, WII5SERIALCMD_OK, WII5SERIALCMD_WAITING, WII5SERIALCMD_TIMEOUT, WII5SERIALCMD_ERROR }; enum WII5_MODES { WII5MODE_NONE, /// Invalid ! // Boot up WII5MODE_BOOT, // First time only - after boot WII5MODE_START, // First time only - after boot WII5MODE_DEMO, // Special mode which kind of does nothing // Normal modes WII5MODE_SLEEP, // Sleeping (long term mode). WII5MODE_LOWBATTERY, // Super low power mode WII5MODE_POSITION, // Send Position Mode WII5MODE_CAPTURE, // Capture - the main mode WII5MODE_MANUAL_TEST, // Special mode where we can turn things on and off. // Testing WII5MODE_MANUALTEST, WII5MODE_SELFTEST }; // Other Config - keep order, and add to end, and check values in read #define WII5_DATA_CONFIG_TYPE 5 #define WII5_DATA_CONFIG_VERSION 2 typedef struct { uint8_t type; uint8_t version; // Useful generic options time_t disableLowBattery; // Disable until? uint32_t flags; uint32_t gpsTimeout; // TODO Battery calibration and modes? // TODO Temperature sensor mapping? // MODE Capture options // Periods: // Minutes // - 15 (0, 15, 30, 45 ...) // - 30 (0, 30) // - 60 (every hour) // - 120 (once per hour) // NOTE: Auto sleep when over 30 minutes? (or configurable) // Number of Records ? // What to process - ? Can we make this automatic // What to return // Could we "return data" only in certain circumstances uint32_t capturePeriod; uint32_t captureBinaryType; uint32_t captureRecords; // MODE LowBattery // None - see disableLowBattery above // MODE Position uint32_t positionPeriod; uint32_t positionBinaryType; // MODE Sleep uint32_t sleepPeriod; // 0 or Invalid = 12 hours uint32_t sleepBinaryType; uint32_t sleepMaths; // Flags and Times for Maths CPU when waking from sleep // So... what mode and for how long WII5_MODES defaultMode; WII5_MODES temporaryMode; WII5_MODES temporaryModeExpires; uint16_t batteryLow; uint16_t batteryMid; uint32_t sleepUntil; // When to auto go back to capture } WII5_Data_Config; // Other Config - keep order, and add to end, and check values in read #define WII5_DATA_STATUS_TYPE 6 #define WII5_DATA_STATUS_VERSION 1 /* typedef struct { uint8_t type; uint8_t version; // Sleep information uint16_t sleepCountTotal; uint16_t sleepCountThis; time_t sleepLast; // Capture information uint32_t captureCountTotal; uint16_t captureCountThis; // Keep error counts and times to allow for temporary disabe etc uint16_t buttonErrorCountTotal; uint8_t buttonErrorCountThis; time_t buttonErrorCountLast; uint16_t gpsErrorCountTotal; uint8_t gpsErrorCountThis; time_t gpsErrorCountLast; uint32_t rtcErrorCountTotal; uint16_t rtcErrorCountThis; time_t rtcErrorCountLast; uint32_t commsErrorCountTotal; uint16_t commsErrorCountThis; time_t commsErrorCountLast; uint32_t captureErrorCountTotal; uint16_t captureErrorCountThis; time_t captureErrorCountLast; uint32_t commsSendTries; uint32_t commsSendSuccess; } WII5_Data_Status; */ enum WII5_FLAGS { WII5FLAGS_GPSDISABLE, // GPS causing problems, turn it OFF WII5FLAGS_RTCDISABLE, // RTC issues, turn it off WII5FLAGS_RADIOOFF, // Radio issues, turn it off WII5FLAGS_ENABLELOGS, // Store logs at record Id WII5FLAGS_DEBUGLOGS, // Higher information WII5FLAGS_DISABLEBEEP, // Hide them beeps away }; enum WII5GPS_MODES { WII5GPS_UNKNOWN, // aka Invalid WII5GPS_OFF, // Turn it off - power and all WII5GPS_ON, // On, but just collecting data - no serial out except errors WII5GPS_TIME, // Wait just for first valid time stamp, set, keep, and send special NMEA and set to OFF WII5GPS_POS, // Wait for position then off WII5GPS_ACCURATE, // Like POS Once but more accurate data - ie. wait longer etc WII5GPS_REPEAT // Send position evern "n" minutes (see setTime) (note, self manage on, off, power modes etc) }; enum WII5_SWITCH { WII5SWITCH_NONE, WII5SWITCH_ON, WII5SWITCH_OFF, WII5SWITCH_TOGGLE }; typedef struct { uint32_t deviceId; uint32_t recordCount; // 12. Date, Time etc time_t last; uint32_t age; // Update as written to disk - (now() - last) uint32_t uptime; // Uptime in minutes (not sure how this goes wih sleep) } WII5Command; enum WII5IRIDIUM_SEND_RESULT { WII5IRIDIUMSENDRESULT_NONE, WII5IRIDIUMSENDRESULT_OK, WII5IRIDIUMSENDRESULT_FAILED_TIMEOUT, WII5IRIDIUMSENDRESULT_FAILED_OTHER, }; enum WII5IRIDIUM_RECEIVE_RESULT { WII5IRIDIUMRECEIVERESULT_NONE, WII5IRIDIUMRECEIVERESULT_OK, }; #define DdW time_t #endif