diff --git a/apps/hardware_test/Makefile b/apps/hardware_test/Makefile index f6a490b0d..de664ad2c 100644 --- a/apps/hardware_test/Makefile +++ b/apps/hardware_test/Makefile @@ -12,4 +12,5 @@ app_src += $(addprefix apps/hardware_test/,\ screen_test_controller.cpp \ screen_test_controller.cpp \ serial_number_controller.cpp \ + vblank_test_controller.cpp \ ) diff --git a/apps/hardware_test/app.cpp b/apps/hardware_test/app.cpp index ce18a656c..97452b2c2 100644 --- a/apps/hardware_test/app.cpp +++ b/apps/hardware_test/app.cpp @@ -28,16 +28,18 @@ App::WizardViewController::WizardViewController(Responder * parentResponder) : m_screenTestController(this), m_ledTestController(this), m_batteryTestController(this), - m_serialNumberController(this) + m_serialNumberController(this), + m_vBlankTestController(this) { } int App::WizardViewController::numberOfChildren() { - return 5; + return 6; } ViewController * App::WizardViewController::childAtIndex(int i) { ViewController * children[] = { + &m_vBlankTestController, &m_keyboardController, &m_screenTestController, &m_ledTestController, diff --git a/apps/hardware_test/app.h b/apps/hardware_test/app.h index 6d5047ffc..58a88cdd7 100644 --- a/apps/hardware_test/app.h +++ b/apps/hardware_test/app.h @@ -7,6 +7,7 @@ #include "led_test_controller.h" #include "battery_test_controller.h" #include "serial_number_controller.h" +#include "vblank_test_controller.h" class AppsContainer; @@ -32,6 +33,7 @@ private: LEDTestController m_ledTestController; BatteryTestController m_batteryTestController; SerialNumberController m_serialNumberController; + VBlankTestController m_vBlankTestController; }; App(Container * container, Snapshot * snapshot); diff --git a/apps/hardware_test/vblank_test_controller.cpp b/apps/hardware_test/vblank_test_controller.cpp new file mode 100644 index 000000000..94b38302d --- /dev/null +++ b/apps/hardware_test/vblank_test_controller.cpp @@ -0,0 +1,53 @@ +#include "vblank_test_controller.h" +#include "../apps_container.h" + +using namespace Poincare; + +namespace HardwareTest { + +bool VBlankTestController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::OK) { + if (strcmp(m_view.vBlankStateTextView()->text(), k_vBlankOKText) == 0) { + // Handled in WizardViewController + return false; + } + assert(strcmp(m_view.vBlankStateTextView()->text(), k_vBlankLaunchTest) == 0); + m_view.setColor(KDColorRed); + m_view.vBlankStateTextView()->setText(k_vBlankFailTest); + static_cast(const_cast(app()->container()))->redrawWindow(); + /* We redraw the window with "VBLANK FAIL" before lauching the test. This + * test might end up in an infinite loop, in which case "VBLANK fail" keeps + * being displayed. If the test succeeds, the screen should change very + * quickly to "VBLANK OK". */ + for (int i=0; i<6; i++) { + Ion::Display::waitForVBlank(); + } + m_view.setColor(KDColorGreen); + m_view.vBlankStateTextView()->setText(k_vBlankOKText); + } + return true; +} + +void VBlankTestController::viewWillAppear() { + for (int i=0; i<6; i++) { + Ion::Display::waitForVBlank(); + } + m_view.vBlankStateTextView()->setText(k_vBlankLaunchTest); +} + +VBlankTestController::ContentView::ContentView() : + SolidColorView(KDColorWhite), + m_vBlankStateView(KDFont::LargeFont) +{ +} + +void VBlankTestController::ContentView::setColor(KDColor color) { + SolidColorView::setColor(color); + m_vBlankStateView.setBackgroundColor(color); +} + +void VBlankTestController::ContentView::layoutSubviews() { + m_vBlankStateView.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height)); +} + +} diff --git a/apps/hardware_test/vblank_test_controller.h b/apps/hardware_test/vblank_test_controller.h new file mode 100644 index 000000000..b52fdc95b --- /dev/null +++ b/apps/hardware_test/vblank_test_controller.h @@ -0,0 +1,42 @@ +#ifndef HARDWARE_TEST_VBLANK_TEST_CONTROLLER_H +#define HARDWARE_TEST_VBLANK_TEST_CONTROLLER_H + +#include +#include + +namespace HardwareTest { + +class VBlankTestController : public ViewController { +public: + VBlankTestController(Responder * parentResponder) : + ViewController(parentResponder), + m_view() + {} + View * view() override { return &m_view; } + bool handleEvent(Ion::Events::Event event) override; + void viewWillAppear() override; +private: + class ContentView : public SolidColorView { + public: + ContentView(); + BufferTextView * vBlankStateTextView() { return &m_vBlankStateView; } + void setColor(KDColor color) override; + private: + void layoutSubviews() override; + int numberOfSubviews() const override { return 1; } + View * subviewAtIndex(int index) override { + assert(index == 0); + return &m_vBlankStateView; + } + BufferTextView m_vBlankStateView; + }; + constexpr static const char * k_vBlankOKText = "VBLANK: OK"; + constexpr static const char * k_vBlankFailTest = "VBLANK: FAIL"; + constexpr static const char * k_vBlankLaunchTest = "Launch VBLANK test"; + ContentView m_view; +}; + +} + +#endif +