Browse Source

Add battery indicator

master
Adam Pippin 4 years ago
parent
commit
1b4b3fa3e3
  1. 107
      Battery.cpp
  2. 2
      Battery.h
  3. 9
      watchos.ino

107
Battery.cpp

@ -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;
}

2
Battery.h

@ -0,0 +1,2 @@
int Battery(int pid, unsigned int signal);

9
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())

Loading…
Cancel
Save