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.
This commit is contained in:
+225
@@ -0,0 +1,225 @@
|
||||
// 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 WII5Sh3dIO.h
|
||||
* @brief I/O abstraction: buttons, LEDs, and the IO loop tick.
|
||||
*/
|
||||
|
||||
#ifndef WII5Sh3dIO_h
|
||||
#define WII5Sh3dIO_h
|
||||
|
||||
#include <Arduino.h> //assumes Arduino IDE v1.0 or greater
|
||||
#include <WII5Data.h>
|
||||
|
||||
// Standard Hardware Locations
|
||||
#ifdef ISMEGA
|
||||
#ifndef SH3D_NODE_LED_1
|
||||
#define SH3D_NODE_LED_1 15
|
||||
#endif
|
||||
#ifndef SH3D_NODE_LED_2
|
||||
#define SH3D_NODE_LED_2 14
|
||||
#endif
|
||||
|
||||
// does not work
|
||||
// #elifdef SH3D_DEVICE_HANDHELD_1
|
||||
// #define SH3D_NODE_LED_1 17
|
||||
// #define SH3D_NODE_LED_2 16
|
||||
|
||||
#else
|
||||
// #define LED1 9
|
||||
// #define LED2 6
|
||||
|
||||
// TODO Talk2
|
||||
#ifndef SH3D_NODE_LED_1
|
||||
#define SH3D_NODE_LED_1 6
|
||||
// T2_WPN_LED_1
|
||||
#endif
|
||||
#ifndef SH3D_NODE_LED_2
|
||||
#define SH3D_NODE_LED_2 9
|
||||
// T2_WPN_LED_2
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Moteino Mega = 16, 15
|
||||
// Moteino Standard = X, Y
|
||||
// Talk2 = T2_WPN_BTN_1, T2_WPN_BTN_2
|
||||
#define SH3D_NODE_BUTTON_1 4
|
||||
// T2_WPN_BTN_1
|
||||
#define SH3D_NODE_BUTTON_2 5
|
||||
// T2_WPN_BTN_2
|
||||
|
||||
// Temperature Sensor
|
||||
// TODO Temp remove for Simon #define SH3D_NODE_18B20
|
||||
//#ifdef ISMEGA
|
||||
// #define SH3D_NODE_ONE_WIRE_BUS 24
|
||||
//#else
|
||||
// #define SH3D_NODE_ONE_WIRE_BUS 14
|
||||
//#endif
|
||||
#define SH3D_NODE_ONE_WIRE_BUS 16
|
||||
|
||||
#ifdef SH3D_NODE_18B20
|
||||
#include <OneWire.h>
|
||||
#include <DallasTemperature.h>
|
||||
#endif
|
||||
|
||||
#include <elapsedMillis.h>
|
||||
|
||||
/*
|
||||
Noticed: T2Led - looks like it might have better features.
|
||||
*/
|
||||
#include <PushButton.h>
|
||||
|
||||
// ENUM !!!
|
||||
enum {
|
||||
LED_OFF,
|
||||
LED_ON,
|
||||
LED_SLOW,
|
||||
LED_FAST,
|
||||
LED_SHORT,
|
||||
LED_DOUBLE,
|
||||
LED_TRIPPLE,
|
||||
LED_SHORT_LONG,
|
||||
LED_DOUBLE_LONG,
|
||||
LED_TRIPPLE_LONG,
|
||||
LED_SHORT_GAP,
|
||||
LED_DOUBLE_GAP,
|
||||
LED_TRIPPLE_GAP,
|
||||
LED_ONE,
|
||||
LED_TWO,
|
||||
LED_THREE,
|
||||
LED_FOUR,
|
||||
LED_FIVE,
|
||||
LED_SIX,
|
||||
LED_SEVEN,
|
||||
LED_EIGHT,
|
||||
LED_NINE,
|
||||
LED_TEN,
|
||||
LED_ONCE,
|
||||
LED_TWICE,
|
||||
};
|
||||
|
||||
class WII5Sh3dIO {
|
||||
public:
|
||||
|
||||
void preButton(PushButton* btn1 = NULL, PushButton* btn2 = NULL, PushButton* btn3 = NULL, PushButton* btn4 = NULL);
|
||||
void begin(
|
||||
uint8_t led1 = SH3D_NODE_LED_1,
|
||||
uint8_t led2 = SH3D_NODE_LED_2,
|
||||
uint8_t btn1 = SH3D_NODE_BUTTON_1,
|
||||
uint8_t btn2 = SH3D_NODE_BUTTON_2
|
||||
);
|
||||
void begin(
|
||||
uint8_t led1 = SH3D_NODE_LED_1,
|
||||
uint8_t led2 = SH3D_NODE_LED_2,
|
||||
uint8_t led3 = 0,
|
||||
uint8_t led4 = 0,
|
||||
uint8_t btn1 = SH3D_NODE_BUTTON_1,
|
||||
uint8_t btn2 = SH3D_NODE_BUTTON_2,
|
||||
uint8_t btn3 = 0,
|
||||
uint8_t btn4 = 0
|
||||
);
|
||||
void loop();
|
||||
|
||||
void led1Set(uint8_t m) { led1_mode = m; led1_state = 0; led1_timeon = 0; }
|
||||
void led1SetTimeout(uint32_t m) { led1_max = m; led1_timeon = 0; }
|
||||
void led1SetDefault(uint8_t m) { led1_default = m; }
|
||||
uint8_t led1Get() { return led1_mode; }
|
||||
|
||||
void led2Set(uint8_t m) { led2_mode = m; led2_state = 0; led2_timeon = 0; }
|
||||
void led2SetTimeout(uint32_t m) { led2_max = m; led2_timeon = 0; }
|
||||
void led2SetDefault(uint8_t m) { led2_default = m; }
|
||||
uint8_t led2Get() { return led2_mode; }
|
||||
|
||||
void led3Set(uint8_t m) { led3_mode = m; led3_state = 0; led3_timeon = 0; }
|
||||
void led3SetTimeout(uint32_t m) { led3_max = m; led3_timeon = 0; }
|
||||
void led3SetDefault(uint8_t m) { led3_default = m; }
|
||||
uint8_t led3Get() { return led3_mode; }
|
||||
|
||||
void led4Set(uint8_t m) { led4_mode = m; led4_state = 0; led4_timeon = 0; }
|
||||
void led4SetTimeout(uint32_t m) { led4_max = m; led4_timeon = 0; }
|
||||
void led4SetDefault(uint8_t m) { led4_default = m; }
|
||||
uint8_t led4Get() { return led4_mode; }
|
||||
|
||||
// Temporary HACK version with individual - see array branch for single function for unlimited LED and Buttons
|
||||
|
||||
PushButton *button1;
|
||||
PushButton *button2;
|
||||
PushButton *button3;
|
||||
PushButton *button4;
|
||||
|
||||
uint8_t buttonSleepCheck();
|
||||
|
||||
void sleep();
|
||||
void wake();
|
||||
|
||||
protected:
|
||||
elapsedMillis lastLedLoop;
|
||||
|
||||
// Validity etc of most recent data
|
||||
uint8_t validPacketType;
|
||||
|
||||
bool _begin;
|
||||
|
||||
// Led udpate
|
||||
bool updateLED(uint8_t pin, uint8_t mode, uint8_t state);
|
||||
|
||||
uint16_t battery_voltage;
|
||||
|
||||
// LED1
|
||||
uint8_t led1_pin;
|
||||
bool led1_activelow;
|
||||
uint8_t led1_mode;
|
||||
uint8_t led1_default;
|
||||
uint8_t led1_state;
|
||||
elapsedMillis led1_timeon;
|
||||
uint32_t led1_max;
|
||||
|
||||
// LED2
|
||||
uint8_t led2_pin;
|
||||
bool led2_activelow;
|
||||
uint8_t led2_mode;
|
||||
uint8_t led2_default;
|
||||
uint8_t led2_state;
|
||||
elapsedMillis led2_timeon;
|
||||
uint32_t led2_max;
|
||||
|
||||
// LED3
|
||||
uint8_t led3_pin;
|
||||
uint8_t led3_mode;
|
||||
uint8_t led3_default;
|
||||
uint8_t led3_state;
|
||||
elapsedMillis led3_timeon;
|
||||
uint32_t led3_max;
|
||||
|
||||
// LED4
|
||||
uint8_t led4_pin;
|
||||
uint8_t led4_mode;
|
||||
uint8_t led4_default;
|
||||
uint8_t led4_state;
|
||||
elapsedMillis led4_timeon;
|
||||
uint32_t led4_max;
|
||||
|
||||
// Button1
|
||||
uint8_t button1_pin;
|
||||
bool button1_activelow;
|
||||
|
||||
// Button2
|
||||
uint8_t button2_pin;
|
||||
bool button2_activelow;
|
||||
|
||||
// Button3
|
||||
uint8_t button3_pin;
|
||||
bool button3_activelow;
|
||||
|
||||
// Button4
|
||||
uint8_t button4_pin;
|
||||
bool button4_activelow;
|
||||
};
|
||||
|
||||
extern WII5Sh3dIO sh3dNodeIO;
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user