added missing files! Dumbkoppf
This commit is contained in:
parent
90569c319c
commit
55c33af996
124
Arduino/BTCDieselHeater/BTCDateTime.cpp
Normal file
124
Arduino/BTCDieselHeater/BTCDateTime.cpp
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
#include "BTCDateTime.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
|
||||||
|
const char*
|
||||||
|
BTCDateTime::dowStr() const
|
||||||
|
{
|
||||||
|
return daysOfTheWeek[dayOfTheWeek()];
|
||||||
|
}
|
||||||
|
|
||||||
|
const char*
|
||||||
|
BTCDateTime::monthStr() const
|
||||||
|
{
|
||||||
|
return months[month()-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
BTCDateTime&
|
||||||
|
BTCDateTime::operator=(const DateTime& rhs)
|
||||||
|
{
|
||||||
|
yOff = rhs.year()-2000;
|
||||||
|
m = rhs.month();
|
||||||
|
d = rhs.day();
|
||||||
|
hh = rhs.hour();
|
||||||
|
mm = rhs.minute();
|
||||||
|
ss = rhs.second();
|
||||||
|
}
|
||||||
|
|
||||||
|
BTCDateTime&
|
||||||
|
BTCDateTime::operator=(const BTCDateTime& rhs)
|
||||||
|
{
|
||||||
|
yOff = rhs.yOff;
|
||||||
|
m = rhs.m;
|
||||||
|
d = rhs.d;
|
||||||
|
hh = rhs.hh;
|
||||||
|
mm = rhs.mm;
|
||||||
|
ss = rhs.ss;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustDay(int dir)
|
||||||
|
{
|
||||||
|
int days = daysInMonth(m, yOff);
|
||||||
|
if(dir > 0) {
|
||||||
|
if(d == days) d = 1;
|
||||||
|
else d++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(d == 1) d = days;
|
||||||
|
else d--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustMonth(int dir)
|
||||||
|
{
|
||||||
|
if(dir > 0) {
|
||||||
|
if(m == 12) m = 1;
|
||||||
|
else m++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(m == 1) m = 12;
|
||||||
|
else m--;
|
||||||
|
}
|
||||||
|
int days = daysInMonth(m, yOff); // trap shorter months
|
||||||
|
UPPERLIMIT(d, days);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustYear(int dir)
|
||||||
|
{
|
||||||
|
yOff += dir;
|
||||||
|
int days = daysInMonth(m, yOff);
|
||||||
|
UPPERLIMIT(d, days); // pick up 29 Feb
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustHour(int dir)
|
||||||
|
{
|
||||||
|
if(dir > 0) {
|
||||||
|
if(hh == 23) hh = 0;
|
||||||
|
else hh++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(hh == 0) hh = 23;
|
||||||
|
else hh--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustMinute(int dir)
|
||||||
|
{
|
||||||
|
if(dir > 0) {
|
||||||
|
if(mm == 59) mm = 0;
|
||||||
|
else mm++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(mm == 0) mm = 59;
|
||||||
|
else mm--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BTCDateTime::adjustSecond(int dir)
|
||||||
|
{
|
||||||
|
if(dir > 0) {
|
||||||
|
if(ss == 59) ss = 0;
|
||||||
|
else ss++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(ss == 0) ss = 59;
|
||||||
|
else ss--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
BTCDateTime::daysInMonth(int month, int year)
|
||||||
|
{
|
||||||
|
if(month >= 1 && month <= 12) {
|
||||||
|
int days = monthDays[month-1];
|
||||||
|
if((month == 2) && ((year & 0x03) == 0))
|
||||||
|
days++;
|
||||||
|
return days;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
25
Arduino/BTCDieselHeater/BTCDateTime.h
Normal file
25
Arduino/BTCDieselHeater/BTCDateTime.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#ifndef __BTCDATETIME_H__
|
||||||
|
#define __BTCDATETIME_H__
|
||||||
|
|
||||||
|
#include "RTClib.h"
|
||||||
|
|
||||||
|
class BTCDateTime : public DateTime {
|
||||||
|
const char daysOfTheWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
|
||||||
|
const char months[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||||
|
const char monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||||
|
public:
|
||||||
|
const char* monthStr() const;
|
||||||
|
const char* dowStr() const;
|
||||||
|
const char* briefDowStr() const;
|
||||||
|
int daysInMonth(int month, int year);
|
||||||
|
void adjustDay(int val);
|
||||||
|
void adjustMonth(int val);
|
||||||
|
void adjustYear(int dir);
|
||||||
|
void adjustHour(int dir);
|
||||||
|
void adjustMinute(int dir);
|
||||||
|
void adjustSecond(int dir);
|
||||||
|
BTCDateTime& operator=(const DateTime& rhs);
|
||||||
|
BTCDateTime& operator=(const BTCDateTime& rhs);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __BTCDATETIME_H__
|
93
Arduino/BTCDieselHeater/Clock.cpp
Normal file
93
Arduino/BTCDieselHeater/Clock.cpp
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "Clock.h"
|
||||||
|
#include "BTCDateTime.h"
|
||||||
|
#include "Wire.h"
|
||||||
|
#include "RTClib.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
#include "NVStorage.h"
|
||||||
|
|
||||||
|
CClock::CClock(RTC_DS3231& rtc) : _rtc(rtc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CClock::begin()
|
||||||
|
{
|
||||||
|
_rtc.begin();
|
||||||
|
_nextRTCfetch = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
const BTCDateTime&
|
||||||
|
CClock::update()
|
||||||
|
{
|
||||||
|
long deltaT = millis() - _nextRTCfetch;
|
||||||
|
if(deltaT >= 0) {
|
||||||
|
uint32_t origClock = Wire.getClock();
|
||||||
|
Wire.setClock(400000);
|
||||||
|
_currentTime = _rtc.now(); // moderate I2C accesses
|
||||||
|
Wire.setClock(origClock);
|
||||||
|
_nextRTCfetch = millis() + 500;
|
||||||
|
_checkTimers();
|
||||||
|
}
|
||||||
|
return _currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BTCDateTime&
|
||||||
|
CClock::get() const
|
||||||
|
{
|
||||||
|
return _currentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CClock::set(const DateTime& newTimeDate)
|
||||||
|
{
|
||||||
|
_rtc.adjust(newTimeDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CClock::_checkTimers()
|
||||||
|
{
|
||||||
|
_checkTimer(0, _currentTime); // test timer 1
|
||||||
|
_checkTimer(1, _currentTime); // test timer 2
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CClock::_checkTimer(int timer, const DateTime& now)
|
||||||
|
{
|
||||||
|
sTimer Info;
|
||||||
|
NVstore.getTimerInfo(timer, Info);
|
||||||
|
int DOW = now.dayOfTheWeek();
|
||||||
|
int timeNow = now.hour() * 60 + now.minute();
|
||||||
|
int timeStart = Info.start.hour * 60 + Info.start.min;
|
||||||
|
int timeStop = Info.stop.hour * 60 + Info.stop.min;
|
||||||
|
|
||||||
|
// ensure DOW tracks expected start day should timer straddle midnight
|
||||||
|
if(timeStop < timeStart) { // true if stop is next morning
|
||||||
|
if(timeNow <= timeStop) { // current time has passed midnight - enable flag is based upon prior day
|
||||||
|
DOW--;
|
||||||
|
ROLLLOWERLIMIT(DOW, 0, 6); // fixup for saturday night!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// DOW of week is now correct for the day this timer started
|
||||||
|
int maskDOW = 0x01 << DOW;
|
||||||
|
|
||||||
|
if(Info.enabled & (maskDOW | 0x80) ) { // specific day of week, or next day
|
||||||
|
|
||||||
|
if(timeNow == timeStart && now.second() < 3) { // check start, within 2 seconds of the minute rollover
|
||||||
|
requestOn();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(timeNow == timeStop) { // check stop
|
||||||
|
requestOff();
|
||||||
|
if(!Info.repeat) { // cancel timer if non repeating
|
||||||
|
if(Info.enabled & 0x80) // next day start flag set?
|
||||||
|
Info.enabled = 0; // outright cancel
|
||||||
|
else {
|
||||||
|
Info.enabled &= ~maskDOW; // otherwise clear specific day
|
||||||
|
}
|
||||||
|
NVstore.setTimerInfo(timer, Info);
|
||||||
|
NVstore.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
Arduino/BTCDieselHeater/Clock.h
Normal file
30
Arduino/BTCDieselHeater/Clock.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef __BTC_TIMERS_H__
|
||||||
|
#define __BTC_TIMERS_H__
|
||||||
|
|
||||||
|
#include "BTCDateTime.h"
|
||||||
|
|
||||||
|
/*const BTCDateTime& getCurrentTime();
|
||||||
|
void setCurrentTime(const DateTime& newDateTime);
|
||||||
|
|
||||||
|
void initClock();
|
||||||
|
void checkClock();*/
|
||||||
|
|
||||||
|
class CClock {
|
||||||
|
|
||||||
|
RTC_DS3231& _rtc;
|
||||||
|
unsigned long _nextRTCfetch;
|
||||||
|
BTCDateTime _currentTime;
|
||||||
|
|
||||||
|
void _checkTimers();
|
||||||
|
void _checkTimer(int timer, const DateTime& now);
|
||||||
|
public:
|
||||||
|
CClock(RTC_DS3231& rtc);
|
||||||
|
void begin();
|
||||||
|
const BTCDateTime& update();
|
||||||
|
const BTCDateTime& get() const;
|
||||||
|
void set(const DateTime& newTime);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CClock Clock;
|
||||||
|
|
||||||
|
#endif // __BTC_TIMERS_H__
|
93
Arduino/BTCDieselHeater/Screen8.cpp
Normal file
93
Arduino/BTCDieselHeater/Screen8.cpp
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the "bluetoothheater" distribution
|
||||||
|
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "128x64OLED.h"
|
||||||
|
#include "KeyPad.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
#include "Screen8.h"
|
||||||
|
#include "Tahoma16.h"
|
||||||
|
#include "Clock.h"
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// CScreen8
|
||||||
|
//
|
||||||
|
// This screen presents a large format clock
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
CScreen8::CScreen8(C128x64_OLED& display, CScreenManager& mgr) : CScreenHeader(display, mgr)
|
||||||
|
{
|
||||||
|
_colon = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CScreen8::showTime(int)
|
||||||
|
{
|
||||||
|
// override and DO NOTHING!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CScreen8::show()
|
||||||
|
{
|
||||||
|
CScreenHeader::show();
|
||||||
|
|
||||||
|
const BTCDateTime& now = Clock.get();
|
||||||
|
|
||||||
|
char str[32];
|
||||||
|
// if(now.second() & 0x01)
|
||||||
|
if(_colon)
|
||||||
|
sprintf(str, "%d:%02d", now.hour(), now.minute());
|
||||||
|
else
|
||||||
|
sprintf(str, "%d %02d", now.hour(), now.minute());
|
||||||
|
_colon = !_colon;
|
||||||
|
|
||||||
|
int yPos = 25;
|
||||||
|
{
|
||||||
|
CTransientFont AF(_display, &tahoma_16ptFontInfo); // temporarily use a large font
|
||||||
|
_printMenuText(_display.xCentre(), yPos, str, false, eCentreJustify);
|
||||||
|
}
|
||||||
|
sprintf(str, "%s %d %s %d", now.dowStr(), now.day(), now.monthStr(), now.year());
|
||||||
|
_printMenuText(_display.xCentre(), 56, str, false, eCentreJustify);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
CScreen8::keyHandler(uint8_t event)
|
||||||
|
{
|
||||||
|
if(event & keyPressed) {
|
||||||
|
// press CENTRE
|
||||||
|
if(event & key_Centre) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// press LEFT
|
||||||
|
if(event & key_Left) {
|
||||||
|
_ScreenManager.prevScreen();
|
||||||
|
}
|
||||||
|
// press RIGHT
|
||||||
|
if(event & key_Right) {
|
||||||
|
_ScreenManager.nextScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
36
Arduino/BTCDieselHeater/Screen8.h
Normal file
36
Arduino/BTCDieselHeater/Screen8.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the "bluetoothheater" distribution
|
||||||
|
* (https://gitlab.com/mrjones.id.au/bluetoothheater)
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Ray Jones <ray@mrjones.id.au>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
#include "ScreenHeader.h"
|
||||||
|
|
||||||
|
class C128x64_OLED;
|
||||||
|
class CScreenManager;
|
||||||
|
|
||||||
|
class CScreen8 : public CScreenHeader {
|
||||||
|
protected:
|
||||||
|
virtual void showTime(int numTimers);
|
||||||
|
bool _colon;
|
||||||
|
public:
|
||||||
|
CScreen8(C128x64_OLED& display, CScreenManager& mgr);
|
||||||
|
void show();
|
||||||
|
void keyHandler(uint8_t event);
|
||||||
|
};
|
Loading…
Reference in a new issue