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