295abb37ee
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.
219 lines
8.4 KiB
Plaintext
219 lines
8.4 KiB
Plaintext
Final Modes for WII5 Tasmania Release
|
|
|
|
* Incidental ones - used to transition the modes in the state machine
|
|
* BOOT
|
|
* START
|
|
|
|
* Demo / Testing modes - these must not be used in prod, but will have to have just timeouts
|
|
(these modes do not have Iridium and are unreliable, they must exit)
|
|
* DEMO
|
|
* MANUALTEST
|
|
* SELFTEST
|
|
|
|
* Fully functional modes - each of these has full control, metadata, and Iridium
|
|
* SLEEP - as deep as possible, basically off. But will come on every 12 hours
|
|
* LOWBATTERY - Automatically selected, no matter what the mode
|
|
* POSITION - Send the position over and over
|
|
* CAPTURE - Full controlled and capture mode
|
|
|
|
|
|
|
|
|
|
Original Notes:
|
|
|
|
Top Level Modes
|
|
|
|
Most of the buoy uses a lot of memory. But can be rebooted to other states.
|
|
And most of the memory is using MALLOC
|
|
|
|
|
|
|
|
Boot up stages
|
|
|
|
WII5MODE_BOOT - Boot up only once
|
|
. Loading configuration from EEPROM etc only needs to be done once
|
|
. Long processes, like reading the blocks from the SD Cards
|
|
SET - NA
|
|
AUTO - Boot up
|
|
WII5MODE_START - Probably jump here each time waking from sleep etc
|
|
. GPS, RTC, and other updates that need to be regularly checked can be done here
|
|
SET - NA
|
|
AUTO - Start ?
|
|
WII5MODE_OFF, - OFF - Disable everything and go into deep sleep, don't wake, back to sleep
|
|
. Really just a mode that allows us to stay here - (e.g. switch is off)
|
|
SET - NA
|
|
AUTO - Switch position
|
|
WII5MODE_SLEEP, - Same as OFF, but will wake with button, alarm, and every 12 hours
|
|
. Sleep - wake can be from button, network, time is up, alarm hit (RTC), every 12 hours and more
|
|
. Allowing more complicated decisions, e.g. long press to move to MANUAL TEST mode or Force Capture test
|
|
-> REPORT - If 12 hoursly updates
|
|
-> TemporaryMode - If still not expired
|
|
-> mode would be - POSITION or CAPTURE or SLEEP
|
|
-> DefaultMode - Otherwise
|
|
-> mode would be - POSITION or CAPTURE or SLEEP
|
|
SET - expires
|
|
val1 = ReportPeriod - How many minutes between reports. Default is 720 (12 hours)
|
|
NOTE: No way to go back to temporary mode right now. Consider that?
|
|
AUTO - NA
|
|
WII5MODE_LOWBATTERY, - Automatically set mode based on Battery Management
|
|
. A command mode change can force to MANUALTEST, or others but only for a maximum time period
|
|
SET - NA
|
|
AUTO - From Battery Module - not saved, recalculated all the time
|
|
WII5MODE_POSITION, - Position mode - light weight, no Maths, regular updates
|
|
SET - expires
|
|
val1 = ReportPeriod - How many minutes between sending position (default 15 minutes)
|
|
val2 = StrobeModes - e.g. Turn on strobe never, 5 minutes per hour, 1 minute at every send, etc
|
|
NOTE: No way to go back to temporary mode right now. Consider that?
|
|
AUTO - NA
|
|
WII5MODE_REPORT, - Report - this is like position, but a single report, and back to sleep
|
|
MINI Self Test or Requested Self Test
|
|
SET - NA
|
|
AUTO - Done from sleep, returns back to SLEEP - which will test etc
|
|
WII5MODE_CAPTURE, - Normal full capture mode.
|
|
SET - expires
|
|
val1 - RunPeriod - Minutes between - 15 (every 15 mins), 60 (once an hour), 120 (every 2 hours)
|
|
val2 - Records - How many records do we want (needs to be what is needed by maths)
|
|
val3 - Predefined sets of data to send back for Iridium - this is going to be a
|
|
bit mask. So we can have 32 sets of data we can add. Some might be contray to
|
|
each other. e.g. 1 might be low resolution temperature, but 2 high resolution,
|
|
so no point adding both.
|
|
New simpler Binary module - since now we only need to know this 32 bit number,
|
|
to know what is in the rest of the packet - and new types of data get added to the
|
|
end..... maybe.
|
|
AUTO - NA
|
|
WII5MODE_MANUALTEST - Manual test - each power button, module etc, can be toggled.
|
|
. Leaving this mode - we should consider a software reboot as the modes and hardware will be in an unknown state
|
|
SET - (restrict to set from Serial and not Iridium)
|
|
AUTO - NA
|
|
WII5MODE_SELFTEST - Self Test mode allows running through all the self tests automatically and rebooting
|
|
SET - (restrict to set from Serial and not Iridium)
|
|
val1 - ?
|
|
AUTO - NA
|
|
|
|
Changing Modes:
|
|
|
|
* Code:
|
|
- wii5Controler.setMode(WII5MODE_MANUALTEST); // Forever - write to config
|
|
- wii5Controler.setTemporaryMode(WII5MODE_MANUALTEST); // Until reboot (ie, not to config)
|
|
- wii5Controler.setTemporaryMode(WII5MODE_MANUALTEST, 300); // 5 minutes
|
|
* Iridium
|
|
- mode:ModeName:Seconds(0 forever):option1,option2,option3
|
|
(NOTE: Could we support all serial commands here?)
|
|
(NOTE: Could we make it a specific one line reply is always made)
|
|
@WII5!,mode,... e.g. it is WII5! for ACK and then the first string, e.g. mode, rest is optional
|
|
@WII5,hello,From,Here would be therefore @WII5!,hello,My,Reply
|
|
* Serial
|
|
- @WII5,mode,ModeName,Seconds,option1,option2,option3
|
|
* Modules Logic
|
|
- WII5Battery - force to LOWBATTERY mode (never saved), switch back to Capture when it can (or what ever default)
|
|
|
|
Boot Mode: (how do we know where to start)
|
|
|
|
(first one to match)
|
|
* Check the OFF Switch - if it is active, WII5MODE_OFF
|
|
. We don't actually need to do this one, if OFF switch active in loop, it will set it no matter what the mode.
|
|
* Check Battery
|
|
. Special option in config to ignore the battery for a period of time.
|
|
. If battery too low, switch to low power mode (and not ignored)
|
|
* Sleeping
|
|
. Read the sleeping configuration from memory or EEPROM
|
|
. Check the date / time for it has not yet expired (check time is synced)
|
|
. Back to sleep
|
|
* TemporaryMode
|
|
. Read Temporary mode - from memory or EEPROM
|
|
. Check the date / time for it has not yet expired (check time is synced)
|
|
. Use this mode
|
|
* DefaultMode
|
|
. Back to default mode
|
|
|
|
Configuration Options Per mode:
|
|
|
|
* WII5MODE_BOOT
|
|
. NA
|
|
* WII5MODE_START
|
|
. NA
|
|
* WII5MODE_OFF
|
|
. NA
|
|
* WII5MODE_SLEEP
|
|
. When to wake up (time in future, or number of seconds from now)
|
|
* WII5MODE_WAKE
|
|
. NA
|
|
* WII5MODE_REPORT
|
|
. NA
|
|
* WII5MODE_LOWBATTERY
|
|
. NA
|
|
* WII5MODE_POSITION
|
|
. Frequency (how many minutes apart)
|
|
. Strobe Rules - instead of just on/off - strobe can have rules in here
|
|
* WII5MODE_CAPTURE
|
|
. Number of seconds/minutes/records to caputre
|
|
. Process flags - Pass in some optional extra flags on processing and what you want returned via Iridium
|
|
. When to start (minute in hour or some way of multiple per hour, half hour, quarter hour)
|
|
. Hours between too
|
|
. Examples:
|
|
. Start 5 minutes past the hour, ever 3 hours (ie. 00, 03, 06, 09 ...)
|
|
. Run every 15 minutes for one hour, then sleep for an hour (00:00, 00:15, 00:30, 00:45, sleep... 02:00, 02:15, ...)
|
|
. etc.
|
|
* WII5MODE_MANUALTEST
|
|
. NA
|
|
* WII5MODE_SELFTEST
|
|
. NA - might have some subsets in the future
|
|
|
|
Main Modes:
|
|
|
|
* OFF
|
|
* A rare mode where the device is completely off.
|
|
* Exit = ? Physical butto?
|
|
* Time?
|
|
|
|
* Sleep
|
|
* Deep down sleep, don't take up much power
|
|
|
|
* WakeUp
|
|
* Check why we got woken up?
|
|
* User input button
|
|
* Back to old mode after sleep (period hit)
|
|
* Iridium input
|
|
* Period wake up - send status, che
|
|
* Exit - always does end of this, back to sleep
|
|
|
|
* LowPower
|
|
* Special mode, keep everything really short
|
|
* Send Data
|
|
* Sleep
|
|
|
|
* Position
|
|
|
|
* Capture
|
|
|
|
* Capture Start will define what is checked, e.g. It might not allow iridium
|
|
* In that case, Iridium NMEA commands should return correct error to wait
|
|
* NOTE: This is not capture itself
|
|
|
|
* ManualTest
|
|
* Stay in this mode (max tme, maybe 4 hours) to test
|
|
* Allow manual start/stop of processes
|
|
|
|
|
|
Exclusive vs Together:
|
|
|
|
* Classic example...
|
|
* Start capture
|
|
* In the background the Maths processor is still dealing with the old data.
|
|
* And it sends Iridium commands
|
|
* And capture needs metadata such as GPS.
|
|
* So Sparton serial in, SD writes, Iridium sending data, GPS on. All not kind of related.
|
|
|
|
|
|
Sequence:
|
|
|
|
Boot
|
|
Load up configuration from EEPROM, start devices etc
|
|
SelfTest
|
|
A built in self test that takes under 1 minutes. It will just set a Simple
|
|
error we can use to update the LED
|
|
Run
|
|
Sleep
|
|
|
|
Run Modes
|