From 1b4b3fa3e33489d30f85dc3be81330035e8afd36 Mon Sep 17 00:00:00 2001 From: Adam Pippin Date: Sat, 18 Apr 2020 19:06:35 -0700 Subject: [PATCH] Add battery indicator --- Battery.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Battery.h | 2 + watchos.ino | 9 ++++- 3 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 Battery.cpp create mode 100644 Battery.h diff --git a/Battery.cpp b/Battery.cpp new file mode 100644 index 0000000..8f445c0 --- /dev/null +++ b/Battery.cpp @@ -0,0 +1,107 @@ +#include +#include "Kernel.h" +#include "Util.h" + +int voltage_to_percent(float voltage); +void draw(int bars); + +#define BATTERY_OFFSET_X 141 +#define BATTERY_OFFSET_Y 1 +#define BATTERY_WIDTH 17 +#define BATTERY_HEIGHT 8 +#define BATTERY_BARS 4 +#define BATTERY_TERMINAL_HEIGHT 4 +#define BATTERY_TERMINAL_WIDTH 2 +#define BATTERY_COLOUR 0x999999 +#define BATTERY_LOW_COLOUR 0xAA0000 +#define BATTERY_PADDING 1 +#define BATTERY_BAR_COLOUR 0xAAAAAA + +int battery_bars = -1; + +int Battery(int pid, unsigned int signal) +{ + if (signal & SIGNAL_START) + { + Kernel_signal_mask(pid, SIGNAL_START | SIGNAL_STOP | SIGNAL_TICK | SIGNAL_REDRAW); + } + if (signal & SIGNAL_STOP) + { + return 255; + } + if (signal & SIGNAL_TICK) + { + float vbat = M5.Axp.GetVbatData() * 1.1 / 1000; + int percent = voltage_to_percent(vbat); + int bars = floor((percent / (100.0 / BATTERY_BARS)) + 0.5); + if (battery_bars != bars) + { + battery_bars = bars; + Kernel_signal(SIGNAL_REDRAW); + } + } + + if (signal & SIGNAL_REDRAW) + { + draw(battery_bars); + } + + return 0; +} + +void draw(int bars) +{ + // Draw terminal + M5.Lcd.fillRect( + BATTERY_OFFSET_X, + BATTERY_OFFSET_Y + (BATTERY_HEIGHT / 2) - (BATTERY_TERMINAL_HEIGHT / 2), + BATTERY_TERMINAL_WIDTH, + BATTERY_TERMINAL_HEIGHT, + bars == 0 ? rgb_to_colour(BATTERY_LOW_COLOUR) : rgb_to_colour(BATTERY_COLOUR) + ); + // Draw battery shell + M5.Lcd.drawRect( + BATTERY_OFFSET_X + BATTERY_TERMINAL_WIDTH, + BATTERY_OFFSET_Y, + BATTERY_WIDTH - BATTERY_TERMINAL_WIDTH, + BATTERY_HEIGHT, + bars == 0 ? rgb_to_colour(BATTERY_LOW_COLOUR) : rgb_to_colour(BATTERY_COLOUR) + ); + + // -2: for frame + int bar_width = (BATTERY_WIDTH - BATTERY_TERMINAL_WIDTH - 2 - (BATTERY_PADDING * (BATTERY_BARS + 1))) / BATTERY_BARS; + int bar_height = BATTERY_HEIGHT - (BATTERY_PADDING * 2) - 2; + int x = BATTERY_OFFSET_X + BATTERY_WIDTH - 1 - BATTERY_PADDING - bar_width; + int y = BATTERY_OFFSET_Y + 1 + BATTERY_PADDING; + + while (bars > 0) + { + + M5.Lcd.fillRect( + x, + y, + bar_width, + bar_height, + rgb_to_colour(BATTERY_BAR_COLOUR) + ); + x -= (bar_width + BATTERY_PADDING); + bars--; + } + + //M5.Lcd.setCursor(80, 20); + //M5.Lcd.print(bars); +} + +int voltage_to_percent(float voltage) +{ + /* + 4.2 volts 100% + 4.1 about 90% + 4.0 about 80% + 3.9 about 60% + 3.8 about 40% + 3.7 about 20% + 3.6 empty for practical purposes + */ + return ((voltage - 3.6) / (4.2-3.6)) * 100; +} diff --git a/Battery.h b/Battery.h new file mode 100644 index 0000000..daf2e23 --- /dev/null +++ b/Battery.h @@ -0,0 +1,2 @@ + +int Battery(int pid, unsigned int signal); diff --git a/watchos.ino b/watchos.ino index 19ee5db..244915e 100644 --- a/watchos.ino +++ b/watchos.ino @@ -7,6 +7,7 @@ #include "PowerManagement.h" #include "UserInput.h" #include "Clock.h" +#include "Battery.h" int count = 0; bool input_a = false, input_b = false; @@ -72,6 +73,8 @@ int test_func(int pid, unsigned int signal) void setup() { M5.begin(); + Serial.begin(115200); + delay(30); Kernel_setup(); int pid; pid = Kernel_start(&UI, 86400); @@ -80,10 +83,12 @@ void setup() Serial.printf("[POWER] pid %d\n", pid); pid = Kernel_start(&UserInput, 0); Serial.printf("[INPUT] pid %d\n", pid); - pid = Kernel_start(&test_func, 5000); - Serial.printf("[TEST ] pid %d\n", pid); + //pid = Kernel_start(&test_func, 5000); + //Serial.printf("[TEST ] pid %d\n", pid); pid = Kernel_start(&Clock, 1000); Serial.printf("[CLOCK] pid %d\n", pid); + pid = Kernel_start(&Battery, 2000); + Serial.printf("[BATT ] pid %d\n", pid); M5.update(); if (M5.BtnB.isPressed())