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:
+147
@@ -0,0 +1,147 @@
|
||||
// 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 WII5RTC.cpp
|
||||
* @brief Real-time clock helper.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
WII5RTC -
|
||||
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <WII5RTC.h>
|
||||
#include <Wire.h>
|
||||
#include "RTClib.h"
|
||||
RTC_DS3231 rtc;
|
||||
|
||||
uint32_t syncProvider() {
|
||||
return rtc.now().unixtime();
|
||||
}
|
||||
|
||||
void WII5RTC::begin() {
|
||||
if (! rtc.begin()) {
|
||||
SerialConsole.println("RTC: Couldn't find RTC");
|
||||
}
|
||||
|
||||
// TODO Do the lost power thing
|
||||
|
||||
// Then connect to GPS
|
||||
|
||||
console.printf(F("RTC: startup date time from RTC="));
|
||||
console.printDateTime(rtc.now().unixtime());
|
||||
console.printNewLine();
|
||||
|
||||
setSyncProvider(syncProvider); // the function to get the time from the RTC
|
||||
if(timeStatus() != timeSet)
|
||||
SerialConsole.println("RTC: Unable to sync with the RTC");
|
||||
else
|
||||
SerialConsole.println("RTC: has set the system time");
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
What type of device
|
||||
Whuihc Library
|
||||
Can they suse SPI or I2c or, writred wrong?
|
||||
|
||||
What are the pins
|
||||
|
||||
*/
|
||||
|
||||
float WII5RTC::getTemperature() {
|
||||
return rtc.getTemperature();
|
||||
}
|
||||
|
||||
void WII5RTC::setRTC(uint32_t t) {
|
||||
if (t == 0) {
|
||||
t = now();
|
||||
}
|
||||
rtc.adjust(t);
|
||||
console.log(LOG_INFO, F("RTC: Adjusted to new time provided"));
|
||||
console.printf(F("# TimeSet="));
|
||||
console.printDateTime(t);
|
||||
console.printf(F(" RTC="));
|
||||
console.printDateTime(rtc.now().unixtime());
|
||||
console.printNewLine();
|
||||
}
|
||||
|
||||
void WII5RTC::test() {
|
||||
|
||||
// TODO Move to Strings for space
|
||||
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
|
||||
|
||||
// TODO Move this code into begin !
|
||||
if (rtc.lostPower()) {
|
||||
SerialConsole.println(F("RTC lost power, lets set the time!"));
|
||||
// following line sets the RTC to the date & time this sketch was compiled
|
||||
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
|
||||
// Fixed date temporary
|
||||
rtc.adjust(1483268462);
|
||||
// TODO Log this !
|
||||
}
|
||||
|
||||
elapsedMillis doIt = 0;
|
||||
|
||||
while (doIt < 15000) {
|
||||
DateTime nowrtc = rtc.now();
|
||||
time_t nowsys = now();
|
||||
|
||||
// System vs RTC
|
||||
SerialConsole.print(F("# UnixTimeStamp System = "));
|
||||
SerialConsole.print(nowsys);
|
||||
SerialConsole.print(F(" RTC = "));
|
||||
SerialConsole.print(nowrtc.unixtime());
|
||||
SerialConsole.println();
|
||||
|
||||
SerialConsole.print(nowrtc.year(), DEC);
|
||||
SerialConsole.print('/');
|
||||
SerialConsole.print(nowrtc.month(), DEC);
|
||||
SerialConsole.print('/');
|
||||
SerialConsole.print(nowrtc.day(), DEC);
|
||||
SerialConsole.print(" (");
|
||||
SerialConsole.print(daysOfTheWeek[nowrtc.dayOfTheWeek()]);
|
||||
SerialConsole.print(") ");
|
||||
SerialConsole.print(nowrtc.hour(), DEC);
|
||||
SerialConsole.print(':');
|
||||
SerialConsole.print(nowrtc.minute(), DEC);
|
||||
SerialConsole.print(':');
|
||||
SerialConsole.print(nowrtc.second(), DEC);
|
||||
SerialConsole.println();
|
||||
|
||||
SerialConsole.print(F(" since midnight 1/1/1970 = "));
|
||||
SerialConsole.print(nowrtc.unixtime());
|
||||
SerialConsole.print("s = ");
|
||||
SerialConsole.print(nowrtc.unixtime() / 86400L);
|
||||
SerialConsole.println("d");
|
||||
|
||||
// calculate a date which is 7 days and 30 seconds into the future
|
||||
DateTime future (nowrtc + TimeSpan(7,12,30,6));
|
||||
|
||||
SerialConsole.print(F(" now + 7d + 30s: "));
|
||||
SerialConsole.print(future.year(), DEC);
|
||||
SerialConsole.print('/');
|
||||
SerialConsole.print(future.month(), DEC);
|
||||
SerialConsole.print('/');
|
||||
SerialConsole.print(future.day(), DEC);
|
||||
SerialConsole.print(' ');
|
||||
SerialConsole.print(future.hour(), DEC);
|
||||
SerialConsole.print(':');
|
||||
SerialConsole.print(future.minute(), DEC);
|
||||
SerialConsole.print(':');
|
||||
SerialConsole.print(future.second(), DEC);
|
||||
SerialConsole.println();
|
||||
|
||||
SerialConsole.println();
|
||||
delay(1000);
|
||||
}
|
||||
SerialConsole.println(F("End of test"));
|
||||
}
|
||||
|
||||
WII5RTC wii5RTC;
|
||||
Reference in New Issue
Block a user