esp-clock/include/display.h
2024-01-13 15:40:00 +01:00

153 lines
3.8 KiB
C++

#pragma once
#include <Adafruit_LEDBackpack.h> // Support for the Backpack FeatherWing
#include <Adafruit_GFX.h> // Adafruit's graphics library
#include <Adafruit_I2CDevice.h>
#include <SPI.h>
#include "ntp_time.h"
#include "bme.h"
#define DISPLAY_ADDRESS 0x70
#define BRIGHTNESS_MIN 0
#define BRIGHTNESS_MAX 15
#define BRIGHTNESS_STEP 1
#define BRIGHTNESS_NIGHT BRIGHTNESS_MIN
#define BRIGHTNESS_DAY 11
#define SECONDS(value) value*1000
namespace Display {
void displayTime();
void displayTemp();
void displayHumidity();
void drawTime();
void drawColon(bool);
Task tDisplayTime(500, TASK_FOREVER, displayTime, &ts, false, []() {
drawTime();
return true;
}, []() {
drawColon(false);
});
Task tDisplaySensor(5*TASK_SECOND, 4, displayTemp, &ts, false, []() {
tDisplayTime.disable();
return true;
}, []() {
tDisplayTime.enableDelayed(tDisplaySensor.getInterval());
});
bool hourFormat24 = false;
void (*hourFormatChangedCallback)();
void onHourFormatChanged(void (*f)()) {
hourFormatChangedCallback = f;
}
// Create display object
Adafruit_7segment clockDisplay = Adafruit_7segment();
namespace Brightness {
uint8_t current = BRIGHTNESS_NIGHT;
void (*brightnessChangedCallback)();
void set(uint8_t value) {
current = value % (BRIGHTNESS_MAX + 1);
clockDisplay.setBrightness(current);
brightnessChangedCallback();
}
void onChanged(void (*f)()) {
brightnessChangedCallback = f;
}
void change(bool increase) {
increase ? set(current + BRIGHTNESS_STEP) : set(current - BRIGHTNESS_STEP);
}
}
void drawTime() {
int displayHour = hourFormat24 ? hour() : hourFormat12();
int displayMinute = minute();
int displayValue = displayHour * 100 + displayMinute;
// Print the time on the display
clockDisplay.print(displayValue, DEC);
// Add zero padding when in 24 hour mode and it's midnight.
// In this case the print function above won't have leading 0's
// which can look confusing. Go in and explicitly add these zeros.
if (displayHour == 0) {
clockDisplay.writeDigitNum(1, 0);
if (displayMinute < 10) {
clockDisplay.writeDigitNum(3, 0);
}
}
}
void drawColon(bool colonOn) {
if (colonOn) {
static int currentHour = -1;
if (currentHour != hour()) {
currentHour = hour();
if (currentHour == 8) {
Brightness::set(BRIGHTNESS_DAY);
Wifi::reconnect();
}
if (currentHour == 17) {
Brightness::set(BRIGHTNESS_NIGHT);
}
}
static int currentMin = -1;
if (currentMin != minute()) {
currentMin = minute();
drawTime();
}
}
clockDisplay.drawColon(colonOn);
}
void displayTime() {
static bool colonOn = true;
drawColon(colonOn);
clockDisplay.writeDisplay();
colonOn = !colonOn;
}
void displayTemp() {
clockDisplay.printFloat(Bme::data.temp, 1);
clockDisplay.writeDisplay();
tDisplaySensor.setCallback(&displayHumidity);
}
void displayHumidity() {
clockDisplay.printFloat(Bme::data.humidity, 1);
clockDisplay.writeDisplay();
tDisplaySensor.setCallback(&displayTemp);
}
void displayValue(uint8_t value) {
tDisplayTime.disable();
clockDisplay.print(value, HEX);
clockDisplay.writeDisplay();
tDisplayTime.enableDelayed(SECONDS(2));
}
void displayText(const char c[]) {
tDisplayTime.disable();
clockDisplay.println(c);
clockDisplay.writeDisplay();
tDisplayTime.enableDelayed(SECONDS(2));
}
void changeHourFormat24(bool format24) {
hourFormat24 = format24;
drawTime();
hourFormatChangedCallback();
}
void setup() {
clockDisplay.begin(DISPLAY_ADDRESS);
clockDisplay.setBrightness(Brightness::current);
}
}