Files
WII5Firmware/WII5Data.h
T
scottp 295abb37ee Initial public release of WII5 Buoy firmware
Firmware for an autonomous wave-measurement buoy (ATmega2560-based
WII5 v2 board). Reads wave motion from a Sparton AHRS-M1/M2 IMU,
samples GPS and battery state, and reports back over Iridium SBD
satellite telemetry. Originally developed 2012-2024.

This is the first public release. Code, documentation, and field-tested
operating modes (Capture, Sleep, Position, ManualTest, SelfTest,
LowBattery) are licensed under Apache 2.0 — see LICENSE and NOTICE.

See README.md for an overview and build instructions, CONTRIBUTING.md
for how to contribute, and DEPLOYMENTS.md for the field-deployment log.
2026-05-07 16:27:18 +10:00

507 lines
16 KiB
C

// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2012-2024 Scott Penrose <scottp@dd.com.au> 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