You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.5 KiB
107 lines
2.5 KiB
#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;
|
|
}
|
|
|