Adam Pippin
4 years ago
3 changed files with 116 additions and 2 deletions
@ -0,0 +1,107 @@ |
|||
#include <M5StickC.h> |
|||
#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; |
|||
} |
@ -0,0 +1,2 @@ |
|||
|
|||
int Battery(int pid, unsigned int signal); |
Loading…
Reference in new issue