diff --git a/apps/Makefile b/apps/Makefile index c6aeb8504..6a76e3d2d 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -16,8 +16,9 @@ app_objs += $(addprefix apps/,\ battery_timer.o\ battery_view.o\ constant.o\ - global_preferences.o\ + empty_battery_window.o\ exam_pop_up_controller.o\ + global_preferences.o\ i18n.o\ led_timer.o\ main.o\ diff --git a/apps/apps_container.cpp b/apps/apps_container.cpp index edef5fde1..fc52f5204 100644 --- a/apps/apps_container.cpp +++ b/apps/apps_container.cpp @@ -12,6 +12,7 @@ using namespace Shared; AppsContainer::AppsContainer() : Container(), m_window(AppsWindow()), + m_emptyBatteryWindow(EmptyBatteryWindow()), m_homeApp(this), m_graphApp(this, &m_globalContext), m_probabilityApp(this), @@ -29,6 +30,7 @@ AppsContainer::AppsContainer() : m_USBTimer(USBTimer(this)) { refreshPreferences(); + m_emptyBatteryWindow.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height)); } int AppsContainer::numberOfApps() { @@ -115,6 +117,15 @@ void AppsContainer::displayExamModePopUp(bool activate, bool forceWindowRedraw) } } +void AppsContainer::shutdownDueToLowBattery() { + while (Ion::Battery::level() == Ion::Battery::Charge::EMPTY) { + m_emptyBatteryWindow.redraw(true); + Ion::msleep(3000); + Ion::Power::suspend(); + } + window()->redraw(true); +} + Window * AppsContainer::window() { return &m_window; } diff --git a/apps/apps_container.h b/apps/apps_container.h index 4fc4ec23d..9fa3f9fe8 100644 --- a/apps/apps_container.h +++ b/apps/apps_container.h @@ -11,6 +11,7 @@ #include "settings/app.h" #include "statistics/app.h" #include "apps_window.h" +#include "empty_battery_window.h" #include "math_toolbox.h" #include "variable_box_controller.h" #include "exam_pop_up_controller.h" @@ -38,12 +39,14 @@ public: void updateBatteryState(); void refreshPreferences(); void displayExamModePopUp(bool activate, bool forceRedrawWindow); + void shutdownDueToLowBattery(); private: Window * window() override; int numberOfTimers() override; Timer * timerAtIndex(int i) override; static constexpr int k_numberOfApps = 9; AppsWindow m_window; + EmptyBatteryWindow m_emptyBatteryWindow; Home::App m_homeApp; Graph::App m_graphApp; Probability::App m_probabilityApp; diff --git a/apps/battery_timer.cpp b/apps/battery_timer.cpp index 6660da0c0..8307e9a07 100644 --- a/apps/battery_timer.cpp +++ b/apps/battery_timer.cpp @@ -9,4 +9,7 @@ BatteryTimer::BatteryTimer(AppsContainer * container) : void BatteryTimer::fire() { m_container->updateBatteryState(); + if (Ion::Battery::level() == Ion::Battery::Charge::EMPTY) { + m_container->shutdownDueToLowBattery(); + } } diff --git a/apps/empty_battery_window.cpp b/apps/empty_battery_window.cpp new file mode 100644 index 000000000..645c81566 --- /dev/null +++ b/apps/empty_battery_window.cpp @@ -0,0 +1,19 @@ +#include "empty_battery_window.h" +#include "i18n.h" +#include "global_preferences.h" +extern "C" { +#include +} + +EmptyBatteryWindow::EmptyBatteryWindow() : + Window() +{ +} + +void EmptyBatteryWindow::drawRect(KDContext * ctx, KDRect rect) const { + ctx->fillRect(bounds(), KDColorWhite); + const char * warningMessage = I18n::translate(I18n::Message::LowBattery, GlobalPreferences::sharedGlobalPreferences()->language()); + KDSize warningSize = KDText::stringSize(warningMessage, KDText::FontSize::Large); + ctx->drawString(warningMessage, KDPoint((Ion::Display::Width - warningSize.width())/2, (Ion::Display::Height - warningSize.height())/2), KDText::FontSize::Large); +} + diff --git a/apps/empty_battery_window.h b/apps/empty_battery_window.h new file mode 100644 index 000000000..66669271a --- /dev/null +++ b/apps/empty_battery_window.h @@ -0,0 +1,12 @@ +#ifndef APPS_EMPTY_BATTERY_WINDOW_H +#define APPS_EMPTY_BATTERY_WINDOW_H + +#include + +class EmptyBatteryWindow : public Window { +public: + EmptyBatteryWindow(); + void drawRect(KDContext * ctx, KDRect rect) const; +}; + +#endif diff --git a/apps/i18n.cpp b/apps/i18n.cpp index 04b703474..4f4f495c6 100644 --- a/apps/i18n.cpp +++ b/apps/i18n.cpp @@ -17,13 +17,14 @@ constexpr static char deviationFrenchDefinition[] = {Ion::Charset::SmallSigma, ' constexpr static char deviationEnglishDefinition[] = {Ion::Charset::SmallSigma, ' ', ':', ' ', 'S', 't', 'a', 'n', 'd', 'a', 'r', 'd', ' ','d','e', 'v', 'i', 'a', 't','i','o','n', 0}; constexpr static char deviationSpanishDefinition[] = {Ion::Charset::SmallSigma, ' ', ':', ' ', 'D', 'e','s','v','i','a','c','i','o','n',' ','t','i','p','i','c','a',0}; -const char * messages[210][3] { +const char * messages[211][3] { {"Attention", "Warning", "Cuidado"}, {"Valider", "Confirm", "Confirmar"}, {"Annuler", "Cancel", "Cancelar"}, {"Suivant", "Next", "Siguiente"}, {"Attention a la syntaxe", "Syntax error", "Error sintactico"}, {"Erreur mathematique", "Math error", "Error matematico"}, + {"Batterie faible", "Low battery", "Bateria baja"}, /* Variables */ {"Variables", "Variables", "Variables"}, diff --git a/apps/i18n.h b/apps/i18n.h index 8a0e4e02d..a4b624d39 100644 --- a/apps/i18n.h +++ b/apps/i18n.h @@ -11,6 +11,7 @@ namespace I18n { Next = 3, SyntaxError, MathError, + LowBattery, /* Variables */ Variables,