Browse Source

Add battery meter

master
Adam PIppin 3 years ago
parent
commit
cc3c306acd
  1. 33
      watchos2/Module_UI.cpp
  2. 6
      watchos2/Module_UI.h
  3. 76
      watchos2/Task_Battery.cpp
  4. 2
      watchos2/__vm/Compile.vmps.xml
  5. 2
      watchos2/__vm/Upload.vmps.xml
  6. 3
      watchos2/watchos2.ino
  7. 11
      watchos2/watchos2.vcxproj
  8. 27
      watchos2/watchos2.vcxproj.filters

33
watchos2/Module_UI.cpp

@ -376,6 +376,39 @@ void Module_UI::fill(int x, int y, int width, int height, uint16_t colour)
gfx.fillRect(x, y, width, height, colour);
}
void Module_UI::fillRectangle(int x, int y, int w, int h, uint16_t colour)
{
local_to_screen(&x, &y);
gfx.fillRect(x, y, w, h, colour);
}
void Module_UI::rectangle(int x, int y, int w, int h, uint16_t colour)
{
local_to_screen(&x, &y);
gfx.drawRect(x, y, w, h, colour);
}
void Module_UI::line(int x0, int y0, int x1, int y1, uint16_t colour)
{
local_to_screen(&x0, &y0);
local_to_screen(&x1, &y1);
gfx.drawLine(x0, y0, x1, y1, colour);
}
void Module_UI::horizontalLine(int y, uint16_t colour)
{
int x = 0;
local_to_screen(&x, &y);
gfx.drawFastHLine(x, y, m_draw_w, colour);
}
void Module_UI::verticalLine(int x, uint16_t colour)
{
int y = 0;
local_to_screen(&x, &y);
gfx.drawFastVLine(x, y, m_draw_h, colour);
}
void Module_UI::print(int x, int y, char* str, uint16_t colour, void* font)
{
local_to_screen(&x, &y);

6
watchos2/Module_UI.h

@ -242,6 +242,12 @@ public:
/// <param name="font_id">id of a registered font</param>
void print(int x, int y, char* str, uint16_t colour = COLOUR_PRIMARY, byte font_id = 0);
void rectangle(int x, int y, int w, int h, uint16_t colour = COLOUR_PRIMARY);
void fillRectangle(int x, int y, int w, int h, uint16_t colour = COLOUR_PRIMARY);
void line(int x0, int y0, int x1, int y1, uint16_t colour = COLOUR_PRIMARY);
void horizontalLine(int y, uint16_t colour = COLOUR_PRIMARY);
void verticalLine(int x, uint16_t colour = COLOUR_PRIMARY);
/// <summary>
/// Register a font with an id
/// </summary>

76
watchos2/Task_Battery.cpp

@ -0,0 +1,76 @@
#include "watchos.h"
#include "Module_UI.h"
#define TASK_BATTERY_UPDATE_INTERVAL_MS 30000
class Task_Battery : public IRunnable, public IDrawable, public Task
{
Module_UI* ui = nullptr;
kernel_handle_t window_handle;
int voltage = 0;
unsigned long last_update = 0;
int getBatteryVoltage()
{
float raw_value = (analogRead(HW_BATTERY_ADC_PIN) / 4096.0 * 7.23);
return (int)round(raw_value * 100);
}
public:
void start()
{
ui = static_cast<Module_UI*>(watchos::module(WATCHOS_MODULE_UI));
window_handle = ui->createWindow(this, ui->getRoot());
ui->setAbsolutePosition(window_handle, DISPLAY_WIDTH - 32, 2, 22, 10);
}
void tick()
{
if (millis() - last_update > TASK_BATTERY_UPDATE_INTERVAL_MS)
{
int new_voltage = getBatteryVoltage();
if (new_voltage != voltage)
{
ui->setDirty(window_handle);
voltage = new_voltage;
}
last_update = millis();
}
}
void draw(kernel_handle_t handle)
{
delay(100);
voltage = getBatteryVoltage();
// Main body
ui->fillRectangle(0, 0, 20, 10);
// Pin
ui->fillRectangle(20, 2, 2, 6);
if (voltage >= 350)
{
int bars = 0;
if (voltage > 410)
bars = 3;
else if (voltage > 395)
bars = 2;
else if (voltage >= 380)
bars = 1;
else
bars = 0;
int bar_width = (20 - 8) / 3;
int x = 2;
for (int i = 0; i < bars; i++)
{
ui->fillRectangle(x, 2, bar_width, ui->getHeight() - 4, COLOUR_SECONDARY);
x += bar_width + 2;
}
}
else
{
ui->line(0, ui->getHeight(), ui->getWidth(), 0, COLOUR_SECONDARY);
}
}
};

2
watchos2/__vm/Compile.vmps.xml

File diff suppressed because one or more lines are too long

2
watchos2/__vm/Upload.vmps.xml

File diff suppressed because one or more lines are too long

3
watchos2/watchos2.ino

@ -11,7 +11,7 @@
#include "Module_Input.h"
#include "Task_Test.cpp"
#include "Task_Clock.cpp"
#include <Preferences.h>
#include "Task_Battery.cpp"
#include <GxEPD2_BW.h>
#include <Fonts/FreeMono12pt7b.h>
@ -32,6 +32,7 @@ void setup()
kernel->registerTask(ui = new Module_UI(), WATCHOS_MODULE_UI);
watchos::run(new Task_Clock());
watchos::run(new Task_Test());
watchos::run(new Task_Battery());
if (!storage->isValid())
{
watchos::debug("Resetting storage");

11
watchos2/watchos2.vcxproj

File diff suppressed because one or more lines are too long

27
watchos2/watchos2.vcxproj.filters

@ -63,6 +63,18 @@
<ClInclude Include="Module_UI.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Module_Power.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Module_Input.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Module_Storage.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Module_RTC.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Kernel.cpp">
@ -86,5 +98,20 @@
<ClCompile Include="Module_UI.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Module_Power.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Module_Input.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Module_Storage.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Module_RTC.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Task_Clock.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
Loading…
Cancel
Save