188 lines
7.6 KiB
C++
188 lines
7.6 KiB
C++
#ifndef _OBP60EXTENSIONPORT_H
|
|
#define _OBP60EXTENSIONPORT_H
|
|
|
|
#include <Arduino.h>
|
|
#include "OBP60Hardware.h"
|
|
#include "LedSpiTask.h"
|
|
#include <GxEPD2_BW.h> // E-paper lib V2
|
|
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
|
|
|
// FRAM address reservations 32kB: 0x0000 - 0x7FFF
|
|
// 0x0000 - 0x03ff: single variables
|
|
#define FRAM_PAGE_NO 0x0002
|
|
#define FRAM_SYSTEM_MODE 0x009
|
|
// Voltage page
|
|
#define FRAM_VOLTAGE_AVG 0x000A
|
|
#define FRAM_VOLTAGE_TREND 0x000B
|
|
#define FRAM_VOLTAGE_MODE 0x000C
|
|
#define FRAM_WIND_SIZE 0x000D
|
|
#define FRAM_WIND_SRC 0x000E
|
|
#define FRAM_WIND_MODE 0x000F
|
|
// Barograph history data
|
|
#define FRAM_BAROGRAPH_START 0x0400
|
|
#define FRAM_BAROGRAPH_END 0x13FF
|
|
|
|
extern Adafruit_FRAM_I2C fram;
|
|
extern bool hasFRAM;
|
|
|
|
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
|
extern const GFXfont Ubuntu_Bold8pt7b;
|
|
extern const GFXfont Ubuntu_Bold10pt7b;
|
|
extern const GFXfont Ubuntu_Bold12pt7b;
|
|
extern const GFXfont Ubuntu_Bold16pt7b;
|
|
extern const GFXfont Ubuntu_Bold20pt7b;
|
|
extern const GFXfont Ubuntu_Bold32pt7b;
|
|
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
|
extern const GFXfont DSEG7Classic_BoldItalic20pt7b;
|
|
extern const GFXfont DSEG7Classic_BoldItalic30pt7b;
|
|
extern const GFXfont DSEG7Classic_BoldItalic42pt7b;
|
|
extern const GFXfont DSEG7Classic_BoldItalic60pt7b;
|
|
extern const GFXfont Atari16px;
|
|
|
|
// Global functions
|
|
#ifdef DISPLAY_GDEW042T2
|
|
GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> & getdisplay();
|
|
#endif
|
|
|
|
#ifdef DISPLAY_GDEY042T81
|
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay();
|
|
#endif
|
|
|
|
#ifdef DISPLAY_GYE042A87
|
|
GxEPD2_BW<GxEPD2_420_GYE042A87, GxEPD2_420_GYE042A87::HEIGHT> & getdisplay();
|
|
#endif
|
|
|
|
#ifdef DISPLAY_SE0420NQ04
|
|
GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
|
#endif
|
|
|
|
struct Point {
|
|
double x;
|
|
double y;
|
|
};
|
|
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
|
|
|
void deepSleep(CommonData &common);
|
|
|
|
uint8_t getLastPage();
|
|
|
|
void hardwareInit(GwApi *api);
|
|
|
|
void setPortPin(uint pin, bool value); // Set port pin for extension port
|
|
|
|
void togglePortPin(uint pin); // Toggle extension port pin
|
|
|
|
Color colorMapping(const String &colorString); // Color mapping string to CHSV colors
|
|
void setBacklightLED(uint brightness, const Color &color);// Set backlight LEDs
|
|
void toggleBacklightLED(uint brightness,const Color &color);// Toggle backlight LEDs
|
|
BacklightMode backlightMapping(const String &backlightString);// Configuration string to value
|
|
|
|
void setFlashLED(bool status); // Set flash LED
|
|
void blinkingFlashLED(); // Blinking function for flash LED
|
|
void setBlinkingLED(bool on); // Set blinking flash LED active
|
|
|
|
void buzzer(uint frequency, uint duration); // Buzzer function
|
|
void setBuzzerPower(uint power); // Set buzzer power
|
|
|
|
String xdrDelete(String input); // Delete xdr prefix from string
|
|
|
|
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
|
void drawTextRalign(int16_t x, int16_t y, String text);
|
|
|
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
|
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
|
|
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
|
void displayFooter(CommonData &commonData);
|
|
|
|
SunData calcSunsetSunrise(GwApi *api, double time, double date, double latitude, double longitude, double timezone); // Calulate sunset and sunrise
|
|
|
|
void batteryGraphic(uint x, uint y, float percent, int pcolor, int bcolor); // Battery graphic with fill level
|
|
void solarGraphic(uint x, uint y, int pcolor, int bcolor); // Solar graphic
|
|
void generatorGraphic(uint x, uint y, int pcolor, int bcolor); // Generator graphic
|
|
void startLedTask(GwApi *api);
|
|
|
|
void doImageRequest(GwApi *api, int *pageno, const PageStruct pages[MAX_PAGE_NUMBER], AsyncWebServerRequest *request);
|
|
|
|
// Icons
|
|
#define icon_width 16
|
|
#define icon_height 16
|
|
|
|
static unsigned char left_bits[] PROGMEM = {
|
|
0x00, 0x00, 0xc0, 0x01, 0xe0, 0x01, 0xf0, 0x01, 0xf8, 0x01, 0xfc, 0x7f,
|
|
0xfe, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x7f, 0xfc, 0x7f, 0xf8, 0x01,
|
|
0xf0, 0x01, 0xe0, 0x01, 0xc0, 0x01, 0x00, 0x00 };
|
|
|
|
static unsigned char right_bits[] PROGMEM = {
|
|
0x00, 0x00, 0x80, 0x03, 0x80, 0x07, 0x80, 0x0f, 0x80, 0x1f, 0xfe, 0x3f,
|
|
0xfe, 0x7f, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0x7f, 0xfe, 0x3f, 0x80, 0x1f,
|
|
0x80, 0x0f, 0x80, 0x07, 0x80, 0x03, 0x00, 0x00 };
|
|
|
|
static unsigned char lock_bits[] PROGMEM = {
|
|
0xc0, 0x03, 0x60, 0x06, 0x30, 0x0c, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08,
|
|
0xfc, 0x3f, 0x04, 0x20, 0x04, 0x20, 0x84, 0x21, 0x84, 0x21, 0x84, 0x21,
|
|
0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0xfc, 0x3f };
|
|
|
|
static unsigned char plus_bits[] PROGMEM = {
|
|
0x00, 0x00, 0xe0, 0x01, 0x18, 0x06, 0x04, 0x08, 0xc4, 0x08, 0xc2, 0x10,
|
|
0xf2, 0x13, 0xf2, 0x13, 0xc2, 0x10, 0xc4, 0x08, 0x04, 0x0c, 0x18, 0x1e,
|
|
0xe0, 0x39, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0 };
|
|
|
|
static unsigned char minus_bits[] PROGMEM = {
|
|
0x00, 0x00, 0xe0, 0x01, 0x18, 0x06, 0x04, 0x08, 0x04, 0x08, 0x02, 0x10,
|
|
0xf2, 0x13, 0xf2, 0x13, 0x02, 0x10, 0x04, 0x08, 0x04, 0x0c, 0x18, 0x1e,
|
|
0xe0, 0x39, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0 };
|
|
|
|
static unsigned char fram_bits[] PROGMEM = {
|
|
0xf8, 0x1f, 0xff, 0xff, 0x9f, 0xff, 0x98, 0x1f, 0xf8, 0x1f, 0xff, 0xff,
|
|
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
|
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
|
|
|
static unsigned char ap_bits[] = {
|
|
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
|
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
|
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
|
|
|
static unsigned char dish_bits[] PROGMEM= {
|
|
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
|
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
|
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
|
|
|
static std::map<String, unsigned char *> iconmap = {
|
|
{"LEFT", left_bits},
|
|
{"RIGHT", right_bits},
|
|
{"LOCK", lock_bits},
|
|
{"PLUS", plus_bits},
|
|
{"MINUS", minus_bits},
|
|
{"DISH", dish_bits},
|
|
{"AP", ap_bits}
|
|
};
|
|
|
|
// Other symbols
|
|
#define swipe_width 24
|
|
#define swipe_height 16
|
|
static unsigned char swipe_bits[] PROGMEM = {
|
|
0x00, 0x06, 0x00, 0x24, 0x09, 0x24, 0x12, 0x09, 0x48, 0x7f, 0x09, 0xfe,
|
|
0x12, 0xb9, 0x48, 0x24, 0xc9, 0x25, 0x40, 0x49, 0x02, 0xa0, 0x49, 0x06,
|
|
0x20, 0x01, 0x0a, 0x20, 0x00, 0x08, 0x40, 0x00, 0x08, 0x40, 0x00, 0x08,
|
|
0x80, 0x00, 0x04, 0x00, 0x01, 0x04, 0x00, 0x02, 0x02, 0x00, 0xfc, 0x01 };
|
|
|
|
#define exclamation_width 32
|
|
#define exclamation_height 32
|
|
static unsigned char exclamation_bits[] PROGMEM = {
|
|
0x00, 0xc0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0xb0, 0x0d, 0x00,
|
|
0x00, 0xd8, 0x1b, 0x00, 0x00, 0xec, 0x37, 0x00, 0x00, 0xf6, 0x6f, 0x00,
|
|
0x00, 0x3b, 0xdc, 0x00, 0x80, 0x3d, 0xbc, 0x01, 0xc0, 0x3e, 0x7c, 0x03,
|
|
0x60, 0x3f, 0xfc, 0x06, 0xb0, 0x3f, 0xfc, 0x0d, 0xd8, 0x3f, 0xfc, 0x1b,
|
|
0xec, 0x3f, 0xfc, 0x37, 0xf6, 0x3f, 0xfc, 0x6f, 0xfb, 0x3f, 0xfc, 0xdf,
|
|
0xfd, 0x3f, 0xfc, 0xbf, 0xfd, 0x3f, 0xfc, 0xbf, 0xfb, 0x3f, 0xfc, 0xdf,
|
|
0xf6, 0x3f, 0xfc, 0x6f, 0xec, 0x3f, 0xfc, 0x37, 0xd8, 0xff, 0xff, 0x1b,
|
|
0xb0, 0xff, 0xff, 0x0d, 0x60, 0x3f, 0xfc, 0x06, 0xc0, 0x3e, 0x7c, 0x03,
|
|
0x80, 0x3d, 0xbc, 0x01, 0x00, 0x3b, 0xdc, 0x00, 0x00, 0xf6, 0x6f, 0x00,
|
|
0x00, 0xec, 0x37, 0x00, 0x00, 0xd8, 0x1b, 0x00, 0x00, 0xb0, 0x0d, 0x00,
|
|
0x00, 0x60, 0x06, 0x00, 0x00, 0xc0, 0x03, 0x00 };
|
|
|
|
#endif
|