mirror of https://github.com/sqfmi/Watchy.git
193 lines
6.1 KiB
C++
193 lines
6.1 KiB
C++
|
#include "WatchyPipBoy.h"
|
||
|
|
||
|
#define DARKMODE true
|
||
|
#define STEPSGOAL 5000
|
||
|
|
||
|
const uint8_t WEATHER_ICON_WIDTH = 48;
|
||
|
const uint8_t WEATHER_ICON_HEIGHT = 32;
|
||
|
|
||
|
RTC_DATA_ATTR uint8_t vaultBoyNum;
|
||
|
|
||
|
void WatchyPipBoy::drawWatchFace(){
|
||
|
//top menu bar
|
||
|
display.fillScreen(DARKMODE ? GxEPD_BLACK : GxEPD_WHITE);
|
||
|
display.setFont(&monofonto8pt7b);
|
||
|
display.setTextColor(DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.setCursor(22, 14);
|
||
|
display.print("STAT INV DATA MAP");
|
||
|
display.drawBitmap(0, 10, menubar, 200, 9, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
|
||
|
//bottom text
|
||
|
display.setFont(&monofonto8pt7b);
|
||
|
display.setCursor(10, 195);
|
||
|
display.println("PIP-BOY 3000 ROBCO IND.");
|
||
|
|
||
|
drawTime();
|
||
|
drawDate();
|
||
|
drawSteps();
|
||
|
drawWeather();
|
||
|
drawBattery();
|
||
|
// display.drawBitmap(120, 77, WIFI_CONFIGURED ? wifi : wifioff, 26, 18, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
// if(BLE_CONFIGURED){
|
||
|
// display.drawBitmap(100, 75, bluetooth, 13, 21, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
// }
|
||
|
}
|
||
|
|
||
|
void WatchyPipBoy::drawTime(){
|
||
|
|
||
|
//draw random vault boy every 15mins
|
||
|
if(currentTime.Minute % 15 == 0){
|
||
|
vaultBoyNum = random(0, 3);
|
||
|
}
|
||
|
|
||
|
switch(vaultBoyNum){
|
||
|
case 0:
|
||
|
display.drawBitmap(70, 50, vaultboy, 57, 100, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
break;
|
||
|
case 1:
|
||
|
display.drawBitmap(70, 50, vaultboypoint, 57, 100, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
break;
|
||
|
case 2:
|
||
|
display.drawBitmap(60, 50, vaultboysmile, 67, 100, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
//time border
|
||
|
display.drawLine(137, 28, 200, 28, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.drawLine(137, 28, 137, 132, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.drawLine(137, 132, 157, 132, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.drawLine(180, 132, 200, 132, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
|
||
|
//draw time
|
||
|
display.setFont(&monofonto28pt7b);
|
||
|
display.setCursor(141, 75);
|
||
|
|
||
|
int displayHour;
|
||
|
if(HOUR_12_24==12){
|
||
|
displayHour = ((currentTime.Hour+11)%12)+1;
|
||
|
} else {
|
||
|
displayHour = currentTime.Hour;
|
||
|
}
|
||
|
if(displayHour < 10){
|
||
|
display.print("0");
|
||
|
}
|
||
|
display.print(displayHour);
|
||
|
|
||
|
display.setCursor(141, 125);
|
||
|
if(currentTime.Minute < 10){
|
||
|
display.print("0");
|
||
|
}
|
||
|
display.print(currentTime.Minute);
|
||
|
|
||
|
//AMPM
|
||
|
display.setFont(&monofonto8pt7b);
|
||
|
display.setCursor(160, 140);
|
||
|
display.print(currentTime.Hour < 11 ? "AM" : "PM");
|
||
|
}
|
||
|
|
||
|
void WatchyPipBoy::drawDate(){
|
||
|
|
||
|
display.setFont(&monofonto10pt7b);
|
||
|
int16_t x1, y1;
|
||
|
uint16_t w, h;
|
||
|
String dayOfWeek = dayStr(currentTime.Wday);
|
||
|
dayOfWeek.toUpperCase();
|
||
|
display.setTextColor(DARKMODE ? GxEPD_BLACK : GxEPD_WHITE);
|
||
|
display.getTextBounds(dayOfWeek, 7, 42, &x1, &y1, &w, &h);
|
||
|
display.setCursor(7, 42);
|
||
|
display.fillRect(x1-2, y1-2, w+4, h+4, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.print(dayOfWeek);
|
||
|
|
||
|
display.setFont(&monofonto10pt7b);
|
||
|
display.setTextColor(DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.setCursor(7, 62);
|
||
|
display.print(monthShortStr(currentTime.Month));
|
||
|
display.print(" ");
|
||
|
display.print(currentTime.Day);
|
||
|
display.setCursor(7, 78);
|
||
|
display.print(tmYearToCalendar(currentTime.Year));
|
||
|
}
|
||
|
|
||
|
void WatchyPipBoy::drawSteps(){
|
||
|
// reset step counter at midnight
|
||
|
if (currentTime.Hour == 0 && currentTime.Minute == 0){
|
||
|
sensor.resetStepCounter();
|
||
|
}
|
||
|
|
||
|
//draw progress bar
|
||
|
uint32_t stepCount = sensor.getCounter();
|
||
|
uint8_t progress = (uint8_t)(stepCount * 100.0 / STEPSGOAL);
|
||
|
progress = progress > 100 ? 100 : progress;
|
||
|
display.drawBitmap(60, 155, gauge, 73, 10, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.fillRect(60+13, 155+5, (progress/2)+5, 4, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
|
||
|
//show step count
|
||
|
display.setFont(&monofonto8pt7b);
|
||
|
display.setTextColor(DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.setCursor(150, 160);
|
||
|
display.print("STEPS");
|
||
|
display.setCursor(150, 175);
|
||
|
display.print(stepCount);
|
||
|
}
|
||
|
|
||
|
void WatchyPipBoy::drawBattery(){
|
||
|
display.drawBitmap(10, 150, battery, 37, 21, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.fillRect(15, 155, 27, 11, DARKMODE ? GxEPD_BLACK : GxEPD_WHITE);//clear battery segments
|
||
|
int8_t batteryLevel = 0;
|
||
|
float VBAT = getBatteryVoltage();
|
||
|
if(VBAT > 4.1){
|
||
|
batteryLevel = 3;
|
||
|
}
|
||
|
else if(VBAT > 3.95 && VBAT <= 4.1){
|
||
|
batteryLevel = 2;
|
||
|
}
|
||
|
else if(VBAT > 3.80 && VBAT <= 3.95){
|
||
|
batteryLevel = 1;
|
||
|
}
|
||
|
else if(VBAT <= 3.80){
|
||
|
batteryLevel = 0;
|
||
|
}
|
||
|
|
||
|
for(int8_t batterySegments = 0; batterySegments < batteryLevel; batterySegments++){
|
||
|
display.fillRect(15 + (batterySegments * 9), 155, 7, 11, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WatchyPipBoy::drawWeather(){
|
||
|
|
||
|
weatherData currentWeather = getWeatherData();
|
||
|
|
||
|
int8_t temperature = currentWeather.temperature;
|
||
|
int16_t weatherConditionCode = currentWeather.weatherConditionCode;
|
||
|
|
||
|
display.setFont(&monofonto10pt7b);
|
||
|
display.setTextColor(DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
display.setCursor(12, 133);
|
||
|
|
||
|
|
||
|
display.print(temperature);
|
||
|
display.print(currentWeather.isMetric ? "C" : "F");
|
||
|
const unsigned char* weatherIcon;
|
||
|
|
||
|
//https://openweathermap.org/weather-conditions
|
||
|
if(weatherConditionCode > 801){//Cloudy
|
||
|
weatherIcon = cloudy;
|
||
|
}else if(weatherConditionCode == 801){//Few Clouds
|
||
|
weatherIcon = cloudsun;
|
||
|
}else if(weatherConditionCode == 800){//Clear
|
||
|
weatherIcon = sunny;
|
||
|
}else if(weatherConditionCode >=700){//Atmosphere
|
||
|
weatherIcon = atmosphere;
|
||
|
}else if(weatherConditionCode >=600){//Snow
|
||
|
weatherIcon = snow;
|
||
|
}else if(weatherConditionCode >=500){//Rain
|
||
|
weatherIcon = rain;
|
||
|
}else if(weatherConditionCode >=300){//Drizzle
|
||
|
weatherIcon = drizzle;
|
||
|
}else if(weatherConditionCode >=200){//Thunderstorm
|
||
|
weatherIcon = thunderstorm;
|
||
|
}else
|
||
|
return;
|
||
|
display.drawBitmap(5, 85, weatherIcon, WEATHER_ICON_WIDTH, WEATHER_ICON_HEIGHT, DARKMODE ? GxEPD_WHITE : GxEPD_BLACK);
|
||
|
}
|