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.
789 lines
29 KiB
C++
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;
|