Files
WII5Firmware/WII5Strings.cpp
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

789 lines
29 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 WII5Strings.cpp
* @brief String-formatting helpers: strDriver, strStatus, strError, etc.
*/
/*
WII5Strings - Parsing and Generating larger text strings
*/
#include <Arduino.h>
#include <WII5Strings.h>
// TODO This is hard coded to console
/*
Parse Console commands
TODO:
* Lower case - but only as compared
* NOW = lower case only
*
* Move literals ("hellow") etc into #DEFINE or similar
* Consider shorter strings - e.g allow "he" instead of hello
*/
// TODO 3 inputs - not using Console !!!
// TODO Returns command (could have consumed 1..3 entries)
// TODO Returns params (could have converted strings to numbers, but numbers returned)
// - Consisiting of the rest of the params consumed
// TODO how?
WII5_COMMANDS WII5Strings::parseCommand(char* in1, char* in2, char* in3) {
// 1 - One level entries
if (strcmp_P(in1,(PGM_P) F("hello")) == 0) {
return WII5COMMAND_HELLO;
}
else if (strcmp_P(in1,(PGM_P) F("hello!")) == 0) {
return WII5COMMAND_HELLOACK;
}
else if (strcmp_P(in1,(PGM_P) F("dump")) == 0) {
return WII5COMMAND_DUMP;
}
else if (strcmp_P(in1,(PGM_P) F("status")) == 0) {
return WII5COMMAND_STATUS;
}
else if (strcmp_P(in1,(PGM_P) F("waitx")) == 0) {
return WII5COMMAND_WAITX;
}
else if (strcmp_P(in1,(PGM_P) F("waity")) == 0) {
return WII5COMMAND_WAITY;
}
else if (strcmp_P(in1,(PGM_P) F("waitz")) == 0) {
return WII5COMMAND_WAITZ;
}
else if (strcmp_P(in1,(PGM_P) F("waitq")) == 0) {
return WII5COMMAND_WAITQ;
}
else if (strcmp_P(in1,(PGM_P) F("waits")) == 0) {
return WII5COMMAND_WAITS;
}
else if (strcmp_P(in1,(PGM_P) F("help")) == 0) {
return WII5COMMAND_HELP;
}
else if (strcmp_P(in1,(PGM_P) F("reset")) == 0) {
return WII5COMMAND_RESET;
}
else if (strcmp_P(in1,(PGM_P) F("echo")) == 0) {
return WII5COMMAND_ECHO;
}
else if (strcmp_P(in1,(PGM_P) F("people")) == 0) {
return WII5COMMAND_PEOPLE;
}
else if (strcmp_P(in1,(PGM_P) F("set")) == 0) {
return WII5COMMAND_SET;
}
else if (strcmp_P(in1,(PGM_P) F("send")) == 0) {
return WII5COMMAND_SEND;
}
// GPS
else if (strcmp_P(in1,(PGM_P) F("gps")) == 0) {
if (strcmp_P(in2,(PGM_P) F("dump")) == 0)
return WII5COMMAND_GPS_DUMP;
else if (strcmp_P(in2,(PGM_P) F("passthrough")) == 0)
return WII5COMMAND_GPS_PASSTHROUGH;
else if (strcmp_P(in2,(PGM_P) F("debug")) == 0)
return WII5COMMAND_GPS_DEBUG;
else if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_GPS_START;
else if (strcmp_P(in2,(PGM_P) F("stop")) == 0)
return WII5COMMAND_GPS_STOP;
else if (strcmp_P(in2,(PGM_P) F("time")) == 0)
return WII5COMMAND_GPS_TIME;
else if (strcmp_P(in2,(PGM_P) F("pos")) == 0)
return WII5COMMAND_GPS_POS;
else if (strcmp_P(in2,(PGM_P) F("accurate")) == 0)
return WII5COMMAND_GPS_ACCURATE;
}
// SPARTON
else if (strcmp_P(in1,(PGM_P) F("sparton")) == 0) {
if (strcmp_P(in2,(PGM_P) F("mode")) == 0)
return WII5COMMAND_SPARTON_MODE;
else if (strcmp_P(in2,(PGM_P) F("dump")) == 0)
return WII5COMMAND_SPARTON_DUMP;
else if (strcmp_P(in2,(PGM_P) F("passthrough")) == 0)
return WII5COMMAND_SPARTON_PASSTHROUGH;
else if (strcmp_P(in2,(PGM_P) F("debug")) == 0)
return WII5COMMAND_SPARTON_DEBUG;
else if (strcmp_P(in2,(PGM_P) F("info")) == 0)
return WII5COMMAND_SPARTON_INFO;
}
// MATHS
else if (strcmp_P(in1,(PGM_P) F("maths")) == 0) {
if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_MATHS_START;
else if (strcmp_P(in2,(PGM_P) F("stop")) == 0)
return WII5COMMAND_MATHS_STOP;
else if (strcmp_P(in2,(PGM_P) F("beep")) == 0)
return WII5COMMAND_MATHS_BEEP;
else if (strcmp_P(in2,(PGM_P) F("restart")) == 0)
return WII5COMMAND_MATHS_RESTART;
else if (strcmp_P(in2,(PGM_P) F("flip")) == 0)
return WII5COMMAND_MATHS_FLIP;
else if (strcmp_P(in2,(PGM_P) F("hold")) == 0)
return WII5COMMAND_MATHS_HOLD;
else if (strcmp_P(in2,(PGM_P) F("until")) == 0)
return WII5COMMAND_MATHS_UNTIL;
else if (strcmp_P(in2,(PGM_P) F("info")) == 0)
return WII5COMMAND_MATHS_INFO;
else if (strcmp_P(in2,(PGM_P) F("halt")) == 0)
return WII5COMMAND_MATHS_HALT;
else if (strcmp_P(in2,(PGM_P) F("do")) == 0)
return WII5COMMAND_MATHS_DO;
else if (strcmp_P(in2,(PGM_P) F("make")) == 0)
return WII5COMMAND_MATHS_MAKE;
else if (strcmp_P(in2,(PGM_P) F("script")) == 0)
return WII5COMMAND_MATHS_SCRIPT;
else if (strcmp_P(in2,(PGM_P) F("booted")) == 0)
return WII5COMMAND_MATHS_BOOTED;
else if (strcmp_P(in2,(PGM_P) F("return")) == 0)
return WII5COMMAND_MATHS_RETURN;
}
// LOG
// @WII5,log,debug|deafult|fatal
else if (strcmp_P(in1,(PGM_P) F("log")) == 0) {
if (strcmp_P(in2,(PGM_P) F("debug")) == 0)
return WII5COMMAND_LOG_DEBUG;
else if (strcmp_P(in2,(PGM_P) F("default")) == 0)
return WII5COMMAND_LOG_DEFAULT;
else if (strcmp_P(in2,(PGM_P) F("error")) == 0)
return WII5COMMAND_LOG_ERROR;
else if (strcmp_P(in2,(PGM_P) F("fatal")) == 0)
return WII5COMMAND_LOG_FATAL;
else if (strcmp_P(in2,(PGM_P) F("test")) == 0)
return WII5COMMAND_LOG_TEST;
}
// SETTINGS
// @WII5,setting,deviceid,10045
else if (strcmp_P(in1,(PGM_P) F("setting")) == 0) {
if (strcmp_P(in2,(PGM_P) F("list")) == 0)
return WII5COMMAND_SETTING_LIST;
else if (strcmp_P(in2,(PGM_P) F("deviceid")) == 0)
return WII5COMMAND_SETTING_DEVICEID;
else if (strcmp_P(in2,(PGM_P) F("defaults")) == 0)
return WII5COMMAND_SETTING_DEFAULTS;
else if (strcmp_P(in2,(PGM_P) F("gpstimeout")) == 0)
return WII5COMMAND_SETTING_GPSTIMEOUT;
else if (strcmp_P(in2,(PGM_P) F("mode")) == 0)
return WII5COMMAND_SETTING_MODE;
else if (strcmp_P(in2,(PGM_P) F("time")) == 0)
return WII5COMMAND_SETTING_TIME;
else if (strcmp_P(in2,(PGM_P) F("disablelowbattery")) == 0)
return WII5COMMAND_SETTING_DISABLELOWBATTERY;
// FLAGS - all,uint32_t or X,0|1
else if (strcmp_P(in2,(PGM_P) F("flags")) == 0)
return WII5COMMAND_SETTING_FLAGS;
// OPTIONS - pass in {PERIOD} and {BINARYTYPE} - 0=ignore
else if (strcmp_P(in2,(PGM_P) F("captureoptions")) == 0)
return WII5COMMAND_SETTING_CAPTUREOPTIONS;
else if (strcmp_P(in2,(PGM_P) F("positionoptions")) == 0)
return WII5COMMAND_SETTING_POSITIONOPTIONS;
else if (strcmp_P(in2,(PGM_P) F("sleepoptions")) == 0)
return WII5COMMAND_SETTING_SLEEPOPTIONS;
else if (strcmp_P(in2,(PGM_P) F("batteryoptions")) == 0)
return WII5COMMAND_SETTING_BATTERYOPTIONS;
}
// NETWORK
else if (strcmp_P(in1,(PGM_P) F("network")) == 0) {
if (strcmp_P(in2,(PGM_P) F("echo")) == 0)
return WII5COMMAND_NETWORK_ECHO;
else if (strcmp_P(in2,(PGM_P) F("echoack")) == 0)
return WII5COMMAND_NETWORK_ECHOACK;
else if (strcmp_P(in2,(PGM_P) F("fakeecho")) == 0)
return WII5COMMAND_NETWORK_FAKEECHO;
else if (strcmp_P(in2,(PGM_P) F("fakeechoack")) == 0)
return WII5COMMAND_NETWORK_FAKEECHOACK;
}
// STORAGE
// Storage
else if (strcmp_P(in1,(PGM_P) F("storage")) == 0) {
if (strcmp_P(in2,(PGM_P) F("format")) == 0)
return WII5COMMAND_STORAGE_FORMAT;
else if (strcmp_P(in2,(PGM_P) F("testfile")) == 0)
return WII5COMMAND_STORAGE_TESTFILE;
else if (strcmp_P(in2,(PGM_P) F("setstatus")) == 0)
return WII5COMMAND_STORAGE_SETSTATUS;
else if (strcmp_P(in2,(PGM_P) F("off")) == 0)
return WII5COMMAND_STORAGE_OFF;
else if (strcmp_P(in2,(PGM_P) F("sd1")) == 0)
return WII5COMMAND_STORAGE_SD1;
else if (strcmp_P(in2,(PGM_P) F("sd2")) == 0)
return WII5COMMAND_STORAGE_SD2;
else if (strcmp_P(in2,(PGM_P) F("list")) == 0)
return WII5COMMAND_STORAGE_LIST;
else if (strcmp_P(in2,(PGM_P) F("view")) == 0)
return WII5COMMAND_STORAGE_VIEW;
else if (strcmp_P(in2,(PGM_P) F("metadata")) == 0)
return WII5COMMAND_STORAGE_METADATA;
else if (strcmp_P(in2,(PGM_P) F("results")) == 0)
return WII5COMMAND_STORAGE_RESULTS;
else if (strcmp_P(in2,(PGM_P) F("raw")) == 0)
return WII5COMMAND_STORAGE_RAW;
else if (strcmp_P(in2,(PGM_P) F("debug")) == 0)
return WII5COMMAND_STORAGE_DEBUG;
else if (strcmp_P(in2,(PGM_P) F("status")) == 0)
return WII5COMMAND_STORAGE_STATUS;
}
// Battery
else if (strcmp_P(in1,(PGM_P) F("battery")) == 0) {
if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_BATTERY_START;
}
// Weather
else if (strcmp_P(in1,(PGM_P) F("weather")) == 0) {
if (strcmp_P(in2,(PGM_P) F("read")) == 0)
return WII5COMMAND_WEATHER_READ;
else if (strcmp_P(in2,(PGM_P) F("test")) == 0)
return WII5COMMAND_WEATHER_TEST;
}
// CAPTURE
else if (strcmp_P(in1,(PGM_P) F("capture")) == 0) {
if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_CAPTURE_START;
else if (strcmp_P(in2,(PGM_P) F("stop")) == 0)
return WII5COMMAND_CAPTURE_STOP;
}
// POSITION
else if (strcmp_P(in1,(PGM_P) F("position")) == 0) {
if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_POSITION_START;
else if (strcmp_P(in2,(PGM_P) F("stop")) == 0)
return WII5COMMAND_POSITION_STOP;
else if (strcmp_P(in2,(PGM_P) F("passthrough")) == 0)
return WII5COMMAND_POSITION_PASSTHROUGH;
}
// Mode
else if (strcmp_P(in1,(PGM_P) F("mode")) == 0) {
if (strcmp_P(in2,(PGM_P) F("position")) == 0)
return WII5COMMAND_MODE_POSITION;
else if (strcmp_P(in2,(PGM_P) F("manualtest")) == 0)
return WII5COMMAND_MODE_MANUALTEST;
else if (strcmp_P(in2,(PGM_P) F("selftest")) == 0)
return WII5COMMAND_MODE_SELFTEST;
else if (strcmp_P(in2,(PGM_P) F("capture")) == 0)
return WII5COMMAND_MODE_CAPTURE;
else if (strcmp_P(in2,(PGM_P) F("sleep")) == 0)
return WII5COMMAND_MODE_SLEEP;
else if (strcmp_P(in2,(PGM_P) F("manualtest")) == 0)
return WII5COMMAND_MODE_MANUALTEST;
else if (strcmp_P(in2,(PGM_P) F("default")) == 0)
return WII5COMMAND_MODE_DEFAULT;
}
// Iridium
else if (strcmp_P(in1,(PGM_P) F("iridium")) == 0) {
if (strcmp_P(in2,(PGM_P) F("send")) == 0)
return WII5COMMAND_IRIDIUM_SEND;
}
// Communication
else if (strcmp_P(in1,(PGM_P) F("communications")) == 0) {
if (strcmp_P(in2,(PGM_P) F("disabled")) == 0)
return WII5COMMAND_COMMUNICATIONS_DISABLED;
else if (strcmp_P(in2,(PGM_P) F("test")) == 0)
return WII5COMMAND_COMMUNICATIONS_TEST;
else if (strcmp_P(in2,(PGM_P) F("signal")) == 0)
return WII5COMMAND_COMMUNICATIONS_SIGNAL;
else if (strcmp_P(in2,(PGM_P) F("start")) == 0)
return WII5COMMAND_COMMUNICATIONS_START;
else if (strcmp_P(in2,(PGM_P) F("stop")) == 0)
return WII5COMMAND_COMMUNICATIONS_STOP;
}
// Bindata
else if (strcmp_P(in1,(PGM_P) F("bindata")) == 0) {
if (strcmp_P(in2,(PGM_P) F("list")) == 0)
return WII5COMMAND_BINDATA_LIST;
else if (strcmp_P(in2,(PGM_P) F("split")) == 0)
return WII5COMMAND_BINDATA_SPLIT;
}
return WII5COMMAND_NONE;
}
WII5_MODES WII5Strings::parseMode(char *in) {
if (strcmp_P(in,(PGM_P) F("boot")) == 0) return WII5MODE_BOOT;
else if (strcmp_P(in,(PGM_P) F("start")) == 0) return WII5MODE_START;
else if (strcmp_P(in,(PGM_P) F("demo")) == 0) return WII5MODE_DEMO;
else if (strcmp_P(in,(PGM_P) F("lowbattery")) == 0) return WII5MODE_LOWBATTERY;
else if (strcmp_P(in,(PGM_P) F("position")) == 0) return WII5MODE_POSITION;
else if (strcmp_P(in,(PGM_P) F("capture")) == 0) return WII5MODE_CAPTURE;
else if (strcmp_P(in,(PGM_P) F("sleep")) == 0) return WII5MODE_SLEEP;
else if (strcmp_P(in,(PGM_P) F("manualtest")) == 0) return WII5MODE_MANUALTEST;
else if (strcmp_P(in,(PGM_P) F("selftest")) == 0) return WII5MODE_SELFTEST;
return WII5MODE_NONE;
}
WII5_SWITCH WII5Strings::parseSwitch(char *in) {
if (
(strcmp_P(in,(PGM_P) F("on")) == 0)
|| (strcmp_P(in,(PGM_P) F("yes")) == 0)
|| (strcmp_P(in,(PGM_P) F("true")) == 0)
) {
return WII5SWITCH_ON;
}
else if (
(strcmp_P(in,(PGM_P) F("off")) == 0)
|| (strcmp_P(in,(PGM_P) F("no")) == 0)
|| (strcmp_P(in,(PGM_P) F("false")) == 0)
) {
return WII5SWITCH_OFF;
}
else if (
(strcmp_P(in,(PGM_P) F("toggle")) == 0)
) {
return WII5SWITCH_TOGGLE;
}
return WII5SWITCH_NONE;
}
// TODO Deprecate?
WII5GPS_MODES WII5Strings::parseGPSMode(char *in) {
if (
(strcmp_P(in,(PGM_P) F("off")) == 0)
)
return WII5GPS_OFF;
else if (
(strcmp_P(in,(PGM_P) F("on")) == 0)
)
return WII5GPS_ON;
else if (
(strcmp_P(in,(PGM_P) F("time")) == 0)
)
return WII5GPS_TIME;
else if (
(strcmp_P(in,(PGM_P) F("pos")) == 0)
)
return WII5GPS_POS;
else if (
(strcmp_P(in,(PGM_P) F("accurate")) == 0)
)
return WII5GPS_ACCURATE;
else if (
(strcmp_P(in,(PGM_P) F("repeat")) == 0)
)
return WII5GPS_REPEAT;
return WII5GPS_UNKNOWN;
}
WII5_DEVICES WII5Strings::parseDevice(char *in) {
if (strcmp_P(in,(PGM_P) F("wavebuoy")) == 0) return WII5DEVICE_WAVEBUOY;
else if (strcmp_P(in,(PGM_P) F("maths")) == 0) return WII5DEVICE_MATHS;
else if (strcmp_P(in,(PGM_P) F("controller")) == 0) return WII5DEVICE_CONTROLLER;
else if (strcmp_P(in,(PGM_P) F("cli")) == 0) return WII5DEVICE_CLI;
else if (strcmp_P(in,(PGM_P) F("server")) == 0) return WII5DEVICE_SERVER;
return WII5DEVICE_UNKNOWN;
}
WII5_DRIVERS WII5Strings::parseDriver(char *in) {
// TODO
return WII5DRIVER_GPS;
}
WII5_PORTS WII5Strings::parsePort(char *in) {
return WII5PORT_CONSOLE;
}
void WII5Strings::setBufferUnknown() {
strcpy_P(wii5BufferString ,(PGM_P) F("unknown"));
}
char* WII5Strings::strCommand(WII5_COMMANDS c) {
/*
switch(d) {
case WII5DEVICE_WAVEBUOY: strcpy_P(wii5BufferString ,(PGM_P) F("wavebuoy")); break;
case WII5DEVICE_MATHS: strcpy_P(wii5BufferString ,(PGM_P) F("maths")); break;
case WII5DEVICE_CONTROLLER: strcpy_P(wii5BufferString ,(PGM_P) F("controller")); break;
case WII5DEVICE_CLI: strcpy_P(wii5BufferString ,(PGM_P) F("cli")); break;
case WII5DEVICE_SERVER: strcpy_P(wii5BufferString ,(PGM_P) F("server")); break;
default: setBufferUnknown(); break;
};
*/
setBufferUnknown();
return wii5BufferString;
}
char* WII5Strings::strDevice(WII5_DEVICES d) {
switch(d) {
case WII5DEVICE_WAVEBUOY: strcpy_P(wii5BufferString ,(PGM_P) F("wavebuoy")); break;
case WII5DEVICE_MATHS: strcpy_P(wii5BufferString ,(PGM_P) F("maths")); break;
case WII5DEVICE_CONTROLLER: strcpy_P(wii5BufferString ,(PGM_P) F("controller")); break;
case WII5DEVICE_CLI: strcpy_P(wii5BufferString ,(PGM_P) F("cli")); break;
case WII5DEVICE_SERVER: strcpy_P(wii5BufferString ,(PGM_P) F("server")); break;
default: setBufferUnknown(); break;
};
return wii5BufferString;
}
char* WII5Strings::strPort(WII5_PORTS p) {
setBufferUnknown();
return wii5BufferString;
}
char* WII5Strings::strStatus(WII5_STATUS s) {
switch(s) {
case WII5STATUS_OFF: strcpy_P(wii5BufferString ,(PGM_P) F("off")); break;
case WII5STATUS_ON: strcpy_P(wii5BufferString ,(PGM_P) F("on")); break;
case WII5STATUS_ON_VALID: strcpy_P(wii5BufferString ,(PGM_P) F("valid")); break;
case WII5STATUS_BUSY: strcpy_P(wii5BufferString ,(PGM_P) F("busy")); break;
case WII5STATUS_WAITING: strcpy_P(wii5BufferString ,(PGM_P) F("waiting")); break;
case WII5STATUS_ERROR: strcpy_P(wii5BufferString ,(PGM_P) F("error")); break;
default: setBufferUnknown(); break;
}
return wii5BufferString;
}
char* WII5Strings::strError(WII5_ERRORS e) {
switch(e) {
case WII5ERROR_RETRY: strcpy_P(wii5BufferString ,(PGM_P) F("RETRY")); break;
case WII5ERROR_INIT: strcpy_P(wii5BufferString ,(PGM_P) F("INIT")); break;
case WII5ERROR_MEMORY: strcpy_P(wii5BufferString ,(PGM_P) F("MEMORY")); break;
case WII5ERROR_TIMEOUT: strcpy_P(wii5BufferString ,(PGM_P) F("TIMEOUT")); break;
case WII5ERROR_FATAL: strcpy_P(wii5BufferString ,(PGM_P) F("FATAL")); break;
default: setBufferUnknown(); break;
}
return wii5BufferString;
}
char* WII5Strings::strSwitch(WII5_SWITCH s) {
strcpy_P(wii5BufferString ,(PGM_P) F("UnknownSwitch"));
return wii5BufferString;
}
// TODO instead of strDriver - and getting
// the wii5BufferString set. Return the PROGMEM string
// and then use a helper function toBuffer or similar to change.
// As PROGMEM returns have use.
char* WII5Strings::strDriver(WII5_DRIVERS d) {
switch(d) {
case WII5DRIVER_GPS: strcpy_P(wii5BufferString ,(PGM_P) F("GPS")); break;
case WII5DRIVER_COMMS: strcpy_P(wii5BufferString ,(PGM_P) F("Comms")); break;
case WII5DRIVER_COMMS_IRIDIUM: strcpy_P(wii5BufferString ,(PGM_P) F("CommsIridium")); break;
case WII5DRIVER_MATHS: strcpy_P(wii5BufferString ,(PGM_P) F("Maths")); break;
case WII5DRIVER_POWER: strcpy_P(wii5BufferString ,(PGM_P) F("Power")); break;
case WII5DRIVER_MPU9250: strcpy_P(wii5BufferString ,(PGM_P) F("MPU9250")); break;
case WII5DRIVER_SPARTON: strcpy_P(wii5BufferString ,(PGM_P) F("Sparton")); break;
case WII5DRIVER_STORAGE: strcpy_P(wii5BufferString ,(PGM_P) F("Storage")); break;
case WII5DRIVER_WEATHER_18B20: strcpy_P(wii5BufferString ,(PGM_P) F("Weather_18B20")); break;
case WII5DRIVER_BATTERY: strcpy_P(wii5BufferString ,(PGM_P) F("Battery")); break;
default: setBufferUnknown(); break;
}
return wii5BufferString;
}
// TODO DEPRECATE
char* WII5Strings::strGPSMode(WII5GPS_MODES g) {
switch(g) {
case WII5GPS_OFF: strcpy_P(wii5BufferString ,(PGM_P) F("Off")); break;
case WII5GPS_ON: strcpy_P(wii5BufferString ,(PGM_P) F("On")); break;
case WII5GPS_TIME: strcpy_P(wii5BufferString ,(PGM_P) F("Time")); break;
case WII5GPS_POS: strcpy_P(wii5BufferString ,(PGM_P) F("Pos")); break;
case WII5GPS_ACCURATE: strcpy_P(wii5BufferString ,(PGM_P) F("Accurate")); break;
case WII5GPS_REPEAT: strcpy_P(wii5BufferString ,(PGM_P) F("Repeat")); break;
default: setBufferUnknown(); break;
}
return wii5BufferString;
}
char* WII5Strings::strMode(WII5_MODES g) {
switch(g) {
case WII5MODE_BOOT: strcpy_P(wii5BufferString, (PGM_P) F("boot")); break;
case WII5MODE_START: strcpy_P(wii5BufferString, (PGM_P) F("start")); break;
case WII5MODE_DEMO: strcpy_P(wii5BufferString, (PGM_P) F("demo")); break;
case WII5MODE_SLEEP: strcpy_P(wii5BufferString, (PGM_P) F("sleep")); break;
case WII5MODE_LOWBATTERY: strcpy_P(wii5BufferString, (PGM_P) F("lowbattery")); break;
case WII5MODE_POSITION: strcpy_P(wii5BufferString, (PGM_P) F("position")); break;
case WII5MODE_CAPTURE: strcpy_P(wii5BufferString, (PGM_P) F("capture")); break;
case WII5MODE_MANUALTEST: strcpy_P(wii5BufferString, (PGM_P) F("manualtest")); break;
case WII5MODE_SELFTEST: strcpy_P(wii5BufferString, (PGM_P) F("selftest")); break;
default: setBufferUnknown(); break;
}
return wii5BufferString;
}
char* WII5Strings::strPinMode(uint8_t p) {
if (p == INPUT) strcpy_P(wii5BufferString, (PGM_P) F("INPUT "));
else if (p == INPUT_PULLUP) strcpy_P(wii5BufferString, (PGM_P) F("INPUT_PULLUP"));
else if (p == OUTPUT) strcpy_P(wii5BufferString, (PGM_P) F("OUTPUT "));
else strcpy_P(wii5BufferString ,(PGM_P) F("Unknown "));
return wii5BufferString;
}
char* WII5Strings::strState(uint8_t p) {
if (p == HIGH) strcpy_P(wii5BufferString, (PGM_P) F("HIGH"));
else if (p == LOW) strcpy_P(wii5BufferString, (PGM_P) F("low "));
else strcpy_P(wii5BufferString ,(PGM_P) F("????"));
return wii5BufferString;
}
char* WII5Strings::strPinArduinoName(uint8_t p) {
// Analopg Pin Number
strcpy_P(wii5BufferString ,(PGM_P) F(" "));
if ((p >= A0) && (p < (A0 + NUM_ANALOG_INPUTS))) {
uint8_t a = p - A0;
if (a < 10) {
wii5BufferString[0] = 'A';
wii5BufferString[1] = '0';
wii5BufferString[2] = '0' + a;
}
else {
wii5BufferString[0] = 'A';
wii5BufferString[1] = '1';
wii5BufferString[2] = '0' + (a - 10);
}
return wii5BufferString;
}
switch(p) {
// TODO Needs config - not hard coded
case 0:
strcpy_P(wii5BufferString ,(PGM_P) F("RX0 "));
break;
case 1:
strcpy_P(wii5BufferString ,(PGM_P) F("TX0 "));
break;
case 14:
strcpy_P(wii5BufferString ,(PGM_P) F("TX3 "));
break;
case 15:
strcpy_P(wii5BufferString ,(PGM_P) F("RX3 "));
break;
/*
case 16:
strcpy_P(wii5BufferString ,(PGM_P) F("TX2 "));
break;
case 17:
strcpy_P(wii5BufferString ,(PGM_P) F("RX2 "));
break;
*/
case 18:
strcpy_P(wii5BufferString ,(PGM_P) F("TX1 "));
break;
case 19:
strcpy_P(wii5BufferString ,(PGM_P) F("RX1 "));
break;
case SS:
strcpy_P(wii5BufferString ,(PGM_P) F("SS "));
break;
case MOSI:
strcpy_P(wii5BufferString ,(PGM_P) F("MOSI "));
break;
case MISO:
strcpy_P(wii5BufferString ,(PGM_P) F("MISO "));
break;
case SCK:
strcpy_P(wii5BufferString ,(PGM_P) F("SCK "));
break;
case SDA:
strcpy_P(wii5BufferString ,(PGM_P) F("SDA "));
break;
case SCL:
strcpy_P(wii5BufferString ,(PGM_P) F("SCL "));
break;
}
return wii5BufferString;
}
char* WII5Strings::strPinWII5Name(uint8_t p) {
strcpy_P(wii5BufferString ,(PGM_P) F(" "));
switch(p) {
#if LED_1>0
case LED_1:
strcpy_P(wii5BufferString ,(PGM_P) F("LED1 "));
break;
#endif
#if LED_2>0
case LED_2:
strcpy_P(wii5BufferString ,(PGM_P) F("LED2/Buzz "));
break;
#endif
#if LED_3>0
case LED_3:
strcpy_P(wii5BufferString ,(PGM_P) F("LED3 "));
break;
#endif
#if LED_4>0
case LED_4:
strcpy_P(wii5BufferString ,(PGM_P) F("LED4 "));
break;
#endif
#if BUTTON_1>0
case BUTTON_1:
strcpy_P(wii5BufferString ,(PGM_P) F("BTN1 "));
break;
#endif
#if BUTTON_2>0
case BUTTON_2:
strcpy_P(wii5BufferString ,(PGM_P) F("BTN2 "));
break;
#endif
#if BUTTON_3>0
case BUTTON_3:
strcpy_P(wii5BufferString ,(PGM_P) F("BTN3 "));
break;
#endif
#if BUTTON_4>0
case BUTTON_4:
strcpy_P(wii5BufferString ,(PGM_P) F("BTN4 "));
break;
#endif
#ifdef POWER_MATHS_PIN
case POWER_MATHS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Maths "));
break;
#endif
case POWER_RADIO_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Radio "));
break;
case POWER_COMMS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Comms "));
break;
case POWER_GPS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr GPS "));
break;
#ifdef POWER_STROBE1_PIN
case POWER_STROBE1_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Strob1"));
break;
#endif
#ifdef POWER_STROBE1_PIN
case POWER_STROBE2_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Strob2"));
break;
#endif
#ifdef POWER_IMU_MPU9250_PIN
case POWER_IMU_MPU9250_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr 9250 "));
break;
#endif
#ifdef POWER_IMU_SERIAL_PIN
case POWER_IMU_SERIAL_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Spartn"));
break;
#endif
case WEATHER_18B20_DATA:
strcpy_P(wii5BufferString, (PGM_P) F("Data 18B20"));
break;
case POWER_WEATHER_18B20_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr 18B20 "));
break;
case POWER_WEATHER_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Weathr"));
break;
case BATTERY_1_VOLTS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Bat1 Meas "));
break;
#if POWER_SUBBOARD_1_PIN>0
case POWER_SUBBOARD_1_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Sub1 "));
break;
#endif
#if POWER_SUBBOARD_1_PIN>0
case POWER_SUBBOARD_2_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr Sub2 "));
break;
#endif
#if POWER_STORAGE_1_PIN>0
case POWER_STORAGE_1_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr SD 1 "));
break;
#endif
#if POWER_STORAGE_2_PIN>0
case POWER_STORAGE_2_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Pwr SD 2 "));
break;
#endif
#ifdef STORAGE_SD1_MATHS_PIN
case STORAGE_SD1_MATHS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("SEL SD 1 "));
break;
#endif
#ifdef STORAGE_SD2_MATHS_PIN 57
case STORAGE_SD2_MATHS_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("SEL SD 2 "));
break;
#endif
#ifdef SHARED_5VOLT_PIN
case SHARED_5VOLT_PIN:
strcpy_P(wii5BufferString, (PGM_P) F("Shrd 5Volt"));
break;
#endif
}
return wii5BufferString;
}
char* WII5Strings::strSelfTestDevice(WII5SELFTEST_DEVICES in) {
switch(in) {
case WII5STD_BOARD: strcpy_P(wii5BufferString, (PGM_P) F("Board")); break;
case WII5STD_GPS: strcpy_P(wii5BufferString, (PGM_P) F("GPS")); break;
case WII5STD_EEPROM: strcpy_P(wii5BufferString, (PGM_P) F("EEPROM")); break;
case WII5STD_SD1: strcpy_P(wii5BufferString, (PGM_P) F("SD1")); break;
case WII5STD_SD2: strcpy_P(wii5BufferString, (PGM_P) F("SD2")); break;
case WII5STD_IRIDIUM: strcpy_P(wii5BufferString, (PGM_P) F("Iridium")); break;
case WII5STD_BATTERY: strcpy_P(wii5BufferString, (PGM_P) F("Battery")); break;
case WII5STD_MATHS: strcpy_P(wii5BufferString, (PGM_P) F("Maths")); break;
case WII5STD_RTC: strcpy_P(wii5BufferString, (PGM_P) F("RTC")); break;
case WII5STD_SPARTON: strcpy_P(wii5BufferString, (PGM_P) F("Sparton")); break;
case WII5STD_18B20: strcpy_P(wii5BufferString, (PGM_P) F("18B20")); break;
case WII5STD_BUTTON: strcpy_P(wii5BufferString, (PGM_P) F("Button")); break;
case WII5STD_LED: strcpy_P(wii5BufferString, (PGM_P) F("LED")); break;
case WII5STD_BUZZER: strcpy_P(wii5BufferString, (PGM_P) F("Buzzer")); break;
case WII5STD_5VOLT: strcpy_P(wii5BufferString, (PGM_P) F("5Volts")); break;
// TODO LED, Button, Buzzer, TEmperature sensor
default: setBufferUnknown(); break;
}
return wii5BufferString;
};
char* WII5Strings::strSelfTestStatus(WII5SELFTEST_STATUS in) {
switch(in) {
case WII5STS_NONE: strcpy_P(wii5BufferString, (PGM_P) F("NONE")); break; // , // Never run
case WII5STS_NC: strcpy_P(wii5BufferString, (PGM_P) F("NC")); break; // , // Not connected, not enabled, or not applicable
case WII5STS_SUCCESS: strcpy_P(wii5BufferString, (PGM_P) F("Success")); break; // , // SUCCCESS - literally nothing to report
case WII5STS_HUMAN: strcpy_P(wii5BufferString, (PGM_P) F("Human")); break; // , // HUMAN - we assume success, but need a human to confirm
case WII5STS_SLOW: strcpy_P(wii5BufferString, (PGM_P) F("Slow")); break; // , // SLOW - SUCCESS in all ways, but slower than expected. Good for SD, Maths boot, GPS lock etc
case WII5STS_POWER: strcpy_P(wii5BufferString, (PGM_P) F("Power")); break; // , // Works, but power management may have failed (e.g. serial data still coming in when power off)
case WII5STS_TIMEOUT: strcpy_P(wii5BufferString, (PGM_P) F("Timeout")); break; // , // Literally timed out. No failure we can actually understand.
case WII5STS_OUTOFRANGE: strcpy_P(wii5BufferString, (PGM_P) F("OutOfRange")); break; // , // Out of range - voltage, or GPS or something out of range
case WII5STS_UNKNOWN: strcpy_P(wii5BufferString, (PGM_P) F("Unknown")); break; // , // Some sort of bad, unknown error
default: setBufferUnknown(); break;
}
return wii5BufferString;
};
char* WII5Strings::strSelfTestStatusLong(WII5SELFTEST_STATUS in) {
switch(in) {
case WII5STS_NONE: strcpy_P(wii5BufferString, (PGM_P) F("Never been run")); break; // , // Never run
case WII5STS_NC: strcpy_P(wii5BufferString, (PGM_P) F("Not connected or enabled")); break; // , // Not connected, not enabled, or not applicable
case WII5STS_SUCCESS: strcpy_P(wii5BufferString, (PGM_P) F("Nothing wrong. Fantastic!")); break; // , // SUCCCESS - literally nothing to report
case WII5STS_HUMAN: strcpy_P(wii5BufferString, (PGM_P) F("Human needed to see results - e.g. did the LED or buzzer go off")); break; // , // HUMAN - we assume success, but need a human to confirm
case WII5STS_SLOW: strcpy_P(wii5BufferString, (PGM_P) F("Success but slow - e.g. long time to load SD or slow gps lock")); break; // , // SLOW - SUCCESS in all ways, but slower than expected. Good for SD, Maths boot, GPS lock etc
case WII5STS_POWER: strcpy_P(wii5BufferString, (PGM_P) F("Power management issue. E.g. serial data still coming in after power pin off")); break; // , // Works, but power management may have failed (e.g. serial data still coming in when power off)
case WII5STS_TIMEOUT: strcpy_P(wii5BufferString, (PGM_P) F("Timeout no idea why...")); break; // , // Literally timed out. No failure we can actually understand.
case WII5STS_OUTOFRANGE: strcpy_P(wii5BufferString, (PGM_P) F("Out of range, e.g. volts or temperature")); break; // , // Out of range - voltage, or GPS or something out of range
case WII5STS_UNKNOWN: strcpy_P(wii5BufferString, (PGM_P) F("Unknown error")); break; // , // Bad, unknown error
default: setBufferUnknown(); break;
}
return wii5BufferString;
};
WII5Strings wii5Strings;