diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 3a71588..9f0ffbe 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -47,6 +47,8 @@ extern TX_EVENT_FLAGS_GROUP gui_update_events; extern FDCAN_HandleTypeDef hfdcan1; #define GUI_UPDATE_VEHICLE_STATE (1 << 0) +#define GUI_UPDATE_NEXT_SCREEN (1 << 1) +#define GUI_UPDATE_ALL (GUI_UPDATE_VEHICLE_STATE | GUI_UPDATE_NEXT_SCREEN) /* USER CODE END EC */ /* Exported macro ------------------------------------------------------------*/ diff --git a/Core/Inc/ui.h b/Core/Inc/ui.h index 8fa00e0..8be62c4 100644 --- a/Core/Inc/ui.h +++ b/Core/Inc/ui.h @@ -12,7 +12,7 @@ extern "C" { #define BUTTON_MIN_INTERVAL 50 // ms #define ENC_MAX_PHASE 50 // ms -typedef enum { UMK_BTN_RELEASED, UMK_ENC_CW, UMK_ENC_CCW } ButtonMessageKind; +typedef enum { UMK_BTN_PRESSED, UMK_ENC_CW, UMK_ENC_CCW } ButtonMessageKind; typedef struct { ButtonMessageKind kind; diff --git a/Core/Src/STWButtonController.cpp b/Core/Src/STWButtonController.cpp index a1f01e4..59d0a7b 100644 --- a/Core/Src/STWButtonController.cpp +++ b/Core/Src/STWButtonController.cpp @@ -10,7 +10,7 @@ bool STWButtonController::sample(uint8_t &key) { ButtonMessage msg; if (tx_queue_receive(&gui_button_queue, &msg, TX_NO_WAIT) == TX_SUCCESS) { switch (msg.kind) { - case UMK_BTN_RELEASED: + case UMK_BTN_PRESSED: key = KEY_BTN1 + msg.number; break; case UMK_ENC_CW: { diff --git a/Core/Src/ui.c b/Core/Src/ui.c index 068166b..4195690 100644 --- a/Core/Src/ui.c +++ b/Core/Src/ui.c @@ -20,6 +20,7 @@ void ui_thread_entry(ULONG _) { uint32_t button_press_times[NUM_BUTTONS] = {HAL_GetTick()}; while (1) { + int press_event = -1; for (int i = 0; i < NUM_BUTTONS; i++) { GPIO_PinState state = HAL_GPIO_ReadPin(button_ports[i], button_pins[i]); if (state != button_states[i]) { @@ -27,13 +28,18 @@ void ui_thread_entry(ULONG _) { if (state == GPIO_PIN_SET && now - button_press_times[i] >= BUTTON_MIN_INTERVAL) { // Button press event! + press_event = i; button_press_times[i] = now; - ButtonMessage msg = {.kind = UMK_BTN_RELEASED, .number = i}; + ButtonMessage msg = {.kind = UMK_BTN_PRESSED, .number = i}; tx_queue_send(&gui_button_queue, &msg, TX_NO_WAIT); } button_states[i] = state; } } + if ((press_event == 1 || press_event == 2) && button_states[1] && + button_states[2]) { + tx_event_flags_set(&gui_update_events, GUI_UPDATE_NEXT_SCREEN, TX_OR); + } vehicle_broadcast_buttons(button_states); // Release so other threads can get scheduled tx_thread_sleep(1); diff --git a/TouchGFX/gui/include/gui/debugview_screen/DebugViewPresenter.hpp b/TouchGFX/gui/include/gui/debugview_screen/DebugViewPresenter.hpp index 927916c..6b0f08c 100644 --- a/TouchGFX/gui/include/gui/debugview_screen/DebugViewPresenter.hpp +++ b/TouchGFX/gui/include/gui/debugview_screen/DebugViewPresenter.hpp @@ -27,7 +27,8 @@ public: virtual ~DebugViewPresenter(){}; - virtual void vehicleStateUpdated() override; + void vehicleStateUpdated() override; + void nextScreen() override; private: DebugViewPresenter(); diff --git a/TouchGFX/gui/include/gui/driverview_screen/DriverViewPresenter.hpp b/TouchGFX/gui/include/gui/driverview_screen/DriverViewPresenter.hpp index cb9d587..aa3eadc 100644 --- a/TouchGFX/gui/include/gui/driverview_screen/DriverViewPresenter.hpp +++ b/TouchGFX/gui/include/gui/driverview_screen/DriverViewPresenter.hpp @@ -30,6 +30,7 @@ public: virtual ~DriverViewPresenter(){}; void vehicleStateUpdated() override; + void nextScreen() override; void setFieldType(size_t i, DataFieldType type); diff --git a/TouchGFX/gui/include/gui/model/ModelListener.hpp b/TouchGFX/gui/include/gui/model/ModelListener.hpp index c08d163..41d8ce4 100644 --- a/TouchGFX/gui/include/gui/model/ModelListener.hpp +++ b/TouchGFX/gui/include/gui/model/ModelListener.hpp @@ -14,6 +14,7 @@ public: void bind(Model *m) { model = m; } virtual void vehicleStateUpdated(){}; + virtual void nextScreen(){}; protected: Model *model; diff --git a/TouchGFX/gui/include/gui/vehicleconfig_screen/VehicleConfigPresenter.hpp b/TouchGFX/gui/include/gui/vehicleconfig_screen/VehicleConfigPresenter.hpp index 2209694..84d6b85 100644 --- a/TouchGFX/gui/include/gui/vehicleconfig_screen/VehicleConfigPresenter.hpp +++ b/TouchGFX/gui/include/gui/vehicleconfig_screen/VehicleConfigPresenter.hpp @@ -8,29 +8,32 @@ using namespace touchgfx; class VehicleConfigView; -class VehicleConfigPresenter : public touchgfx::Presenter, public ModelListener -{ +class VehicleConfigPresenter : public touchgfx::Presenter, + public ModelListener { public: - VehicleConfigPresenter(VehicleConfigView& v); + VehicleConfigPresenter(VehicleConfigView &v); - /** - * The activate function is called automatically when this screen is "switched in" - * (ie. made active). Initialization logic can be placed here. - */ - virtual void activate(); + /** + * The activate function is called automatically when this screen is "switched + * in" (ie. made active). Initialization logic can be placed here. + */ + virtual void activate(); - /** - * The deactivate function is called automatically when this screen is "switched out" - * (ie. made inactive). Teardown functionality can be placed here. - */ - virtual void deactivate(); + /** + * The deactivate function is called automatically when this screen is + * "switched out" (ie. made inactive). Teardown functionality can be placed + * here. + */ + virtual void deactivate(); - virtual ~VehicleConfigPresenter() {}; + virtual ~VehicleConfigPresenter(){}; + + void nextScreen() override; private: - VehicleConfigPresenter(); + VehicleConfigPresenter(); - VehicleConfigView& view; + VehicleConfigView &view; }; #endif // VEHICLECONFIGPRESENTER_HPP diff --git a/TouchGFX/gui/src/debugview_screen/DebugViewPresenter.cpp b/TouchGFX/gui/src/debugview_screen/DebugViewPresenter.cpp index bd30088..10cad53 100644 --- a/TouchGFX/gui/src/debugview_screen/DebugViewPresenter.cpp +++ b/TouchGFX/gui/src/debugview_screen/DebugViewPresenter.cpp @@ -1,7 +1,6 @@ #include #include - DebugViewPresenter::DebugViewPresenter(DebugViewView &v) : view(v) {} void DebugViewPresenter::activate() {} @@ -9,3 +8,8 @@ void DebugViewPresenter::activate() {} void DebugViewPresenter::deactivate() {} void DebugViewPresenter::vehicleStateUpdated() { view.updateFieldValues(); } + +void DebugViewPresenter::nextScreen() { + static_cast(Application::getInstance()) + ->gotoDriverViewScreenNoTransition(); +} diff --git a/TouchGFX/gui/src/driverview_screen/DriverViewPresenter.cpp b/TouchGFX/gui/src/driverview_screen/DriverViewPresenter.cpp index 72fe026..2520d18 100644 --- a/TouchGFX/gui/src/driverview_screen/DriverViewPresenter.cpp +++ b/TouchGFX/gui/src/driverview_screen/DriverViewPresenter.cpp @@ -32,6 +32,11 @@ void DriverViewPresenter::vehicleStateUpdated() { view.updateFieldValues(); } +void DriverViewPresenter::nextScreen() { + static_cast(Application::getInstance()) + ->gotoVehicleConfigScreenNoTransition(); +} + void DriverViewPresenter::setFieldType(size_t i, DataFieldType type) { fields[i] = type; view.setFieldType(i, type); diff --git a/TouchGFX/gui/src/model/Model.cpp b/TouchGFX/gui/src/model/Model.cpp index dafaa57..68672f4 100644 --- a/TouchGFX/gui/src/model/Model.cpp +++ b/TouchGFX/gui/src/model/Model.cpp @@ -13,10 +13,14 @@ Model::Model() : modelListener(0) {} void Model::tick() { ULONG events; - if (tx_event_flags_get(&gui_update_events, GUI_UPDATE_VEHICLE_STATE, + if (tx_event_flags_get(&gui_update_events, + GUI_UPDATE_VEHICLE_STATE | GUI_UPDATE_NEXT_SCREEN, TX_OR_CLEAR, &events, TX_NO_WAIT) != TX_SUCCESS) { return; } + if (events & GUI_UPDATE_NEXT_SCREEN) { + modelListener->nextScreen(); + } if (events & GUI_UPDATE_VEHICLE_STATE) { modelListener->vehicleStateUpdated(); } diff --git a/TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigPresenter.cpp b/TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigPresenter.cpp index 441c1e1..af7c3a4 100644 --- a/TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigPresenter.cpp +++ b/TouchGFX/gui/src/vehicleconfig_screen/VehicleConfigPresenter.cpp @@ -1,18 +1,14 @@ -#include #include +#include -VehicleConfigPresenter::VehicleConfigPresenter(VehicleConfigView& v) - : view(v) -{ - -} - -void VehicleConfigPresenter::activate() -{ - -} - -void VehicleConfigPresenter::deactivate() -{ +VehicleConfigPresenter::VehicleConfigPresenter(VehicleConfigView &v) + : view(v) {} +void VehicleConfigPresenter::activate() {} + +void VehicleConfigPresenter::deactivate() {} + +void VehicleConfigPresenter::nextScreen() { + static_cast(Application::getInstance()) + ->gotoDebugViewScreenNoTransition(); }