diff options
Diffstat (limited to 'src/tangara/input/device_factory.cpp')
| -rw-r--r-- | src/tangara/input/device_factory.cpp | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/src/tangara/input/device_factory.cpp b/src/tangara/input/device_factory.cpp index fe2e2485..ff597556 100644 --- a/src/tangara/input/device_factory.cpp +++ b/src/tangara/input/device_factory.cpp @@ -16,6 +16,7 @@ #include "input/input_touch_dpad.hpp" #include "input/input_touch_wheel.hpp" #include "input/input_volume_buttons.hpp" +#include "input/input_media_buttons.hpp" namespace input { @@ -26,30 +27,73 @@ DeviceFactory::DeviceFactory( wheel_ = std::make_shared<TouchWheel>(services->nvs(), **services->touchwheel()); } + reset_ = std::make_shared<HardReset>(services_->gpios()); } -auto DeviceFactory::createInputs(drivers::NvsStorage::InputModes mode) +auto DeviceFactory::createLockedInputs() -> std::vector<std::shared_ptr<IInputDevice>> { + auto locked_mode = services_->nvs().LockedInput(); std::vector<std::shared_ptr<IInputDevice>> ret; - switch (mode) { - case drivers::NvsStorage::InputModes::kButtonsOnly: - ret.push_back(std::make_shared<NavButtons>(services_->gpios())); + switch (locked_mode) { + case drivers::NvsStorage::ButtonInputModes::kDisabled: + break; + case drivers::NvsStorage::ButtonInputModes::kMediaControls: + ret.push_back(std::make_shared<MediaButtons>(services_->gpios(), services_->track_queue())); + break; + case drivers::NvsStorage::ButtonInputModes::kNavigation: + // I don't think we want navigation to work when locked? + // ret.push_back(std::make_shared<NavButtons>(services_->gpios())); break; - case drivers::NvsStorage::InputModes::kDirectionalWheel: + case drivers::NvsStorage::ButtonInputModes::kVolumeOnly: ret.push_back(std::make_shared<VolumeButtons>(services_->gpios())); + break; + } + ret.push_back(reset_); + return ret; +} + +auto DeviceFactory::createInputs() + -> std::vector<std::shared_ptr<IInputDevice>> { + std::vector<std::shared_ptr<IInputDevice>> ret; + auto wheel_mode = services_->nvs().WheelInput(); + auto buttons_mode = services_->nvs().ButtonInput(); + // Make sure we always have a navigational input + if (wheel_mode == drivers::NvsStorage::WheelInputModes::kDisabled) { + if (buttons_mode != drivers::NvsStorage::ButtonInputModes::kNavigation) { + wheel_mode = drivers::NvsStorage::WheelInputModes::kRotatingWheel; + services_->nvs().WheelInput(wheel_mode); + } + } + switch (wheel_mode) { + case drivers::NvsStorage::WheelInputModes::kDisabled: + break; + case drivers::NvsStorage::WheelInputModes::kDirectionalWheel: if (services_->touchwheel()) { ret.push_back(std::make_shared<TouchDPad>(**services_->touchwheel())); } break; - case drivers::NvsStorage::InputModes::kRotatingWheel: + case drivers::NvsStorage::WheelInputModes::kRotatingWheel: default: // Don't break input over a bad enum value. - ret.push_back(std::make_shared<VolumeButtons>(services_->gpios())); if (wheel_) { ret.push_back(wheel_); } break; } - ret.push_back(std::make_shared<HardReset>(services_->gpios())); + switch (buttons_mode) { + case drivers::NvsStorage::ButtonInputModes::kDisabled: + break; + case drivers::NvsStorage::ButtonInputModes::kMediaControls: + ret.push_back(std::make_shared<MediaButtons>(services_->gpios(), services_->track_queue())); + break; + case drivers::NvsStorage::ButtonInputModes::kNavigation: + ret.push_back(std::make_shared<NavButtons>(services_->gpios())); + break; + case drivers::NvsStorage::ButtonInputModes::kVolumeOnly: + default: + ret.push_back(std::make_shared<VolumeButtons>(services_->gpios())); + break; + } + ret.push_back(reset_); return ret; } |
