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

226 lines
4.8 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 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