diff --git a/FlippR-Driver/src/output/detail/DriverBoardPinController.cpp b/FlippR-Driver/src/output/detail/DriverBoardPinController.cpp index 329263b..cb59e24 100644 --- a/FlippR-Driver/src/output/detail/DriverBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/DriverBoardPinController.cpp @@ -25,19 +25,68 @@ void DriverBoardPinController::activate(items::DriverBoardItem &driver_board_ite { std::lock_guard guard(*output_item_mutex); - write_pin(driver_board_item.get_address(), true); + uint8_t address = driver_board_item.get_address(); + + this->select_mux(address/8); + this->select_adress(address); + + write_pin(this->data_pin, true); } void DriverBoardPinController::deactivate(items::DriverBoardItem &driver_board_item) { std::lock_guard guard(*output_item_mutex); - write_pin(driver_board_item.get_address(), false); + uint8_t address = driver_board_item.get_address(); + + this->select_mux(address/8); + this->select_adress(address); + + write_pin(this->data_pin, false); } void DriverBoardPinController::write_pin(uint8_t pin, bool value) const { - PinController::write_pin(pin, value); + this->write_pin(pin, value); +} + +void DriverBoardPinController::select_adress(uint8_t address) +{ + address = address / 8; + this->write_pin(this->address_pins[0], address & 0b001); + this->write_pin(this->address_pins[1], address & 0b010); + this->write_pin(this->address_pins[2], address & 0b100); +} + +void DriverBoardPinController::set_address_pins(std::array address_pins) +{ + this->address_pins = address_pins; +} +void DriverBoardPinController::set_mux_pins(std::array mux_enable_pins) +{ + this->mux_enable_pins = mux_enable_pins; +} +void DriverBoardPinController::set_data_pin(uint8_t data_pin) +{ + this->data_pin = data_pin; +} +void DriverBoardPinController::set_run_pin(uint8_t run_pin) +{ + this->run_pin = run_pin; +} + +void DriverBoardPinController::select_mux(uint8_t mux) +{ + this->deselect_all_muxes(); + this->write_pin(this->mux_enable_pins[mux], 1); +} + +void DriverBoardPinController::deselect_all_muxes() +{ + for(auto pin : mux_enable_pins) + { + this->write_pin(pin, 0); + } } } diff --git a/FlippR-Driver/src/output/detail/DriverBoardPinController.h b/FlippR-Driver/src/output/detail/DriverBoardPinController.h index 2ae9cba..be93bd7 100644 --- a/FlippR-Driver/src/output/detail/DriverBoardPinController.h +++ b/FlippR-Driver/src/output/detail/DriverBoardPinController.h @@ -28,11 +28,24 @@ public: void activate(items::DriverBoardItem & driver_board_item); void deactivate(items::DriverBoardItem & driver_board_item); + void set_address_pins(std::array address_pins); + void set_mux_pins(std::array mux_enable_pins); + void set_data_pin(uint8_t data_pin); + void set_run_pin(uint8_t run_pin); + private: + void deselect_all_muxes(); + void select_mux(uint8_t mux); + void select_adress(uint8_t address); void write_pin(uint8_t pin, bool value) const; private: std::shared_ptr output_item_mutex; + + std::array address_pins; + std::array mux_enable_pins; + uint8_t data_pin; + uint8_t run_pin; }; } diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp index f036345..bfa6fdf 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.cpp @@ -15,7 +15,7 @@ namespace detail SoundBoardPinController::SoundBoardPinController(std::shared_ptr output_item_mutex, uint8_t fire_address, - const std::vector address_pins) : + const std::array address_pins) : output_item_mutex{output_item_mutex}, fire_address{fire_address}, address_pins{address_pins} @@ -71,7 +71,7 @@ void SoundBoardPinController::write_pin(const uint8_t &pin, const bool &value) c PinController::write_pin(pin, value); } -void SoundBoardPinController::set_address_pins(std::vector address_pins) +void SoundBoardPinController::set_address_pins(std::array address_pins) { this->address_pins = address_pins; diff --git a/FlippR-Driver/src/output/detail/SoundBoardPinController.h b/FlippR-Driver/src/output/detail/SoundBoardPinController.h index f5f4bdc..f664e0c 100644 --- a/FlippR-Driver/src/output/detail/SoundBoardPinController.h +++ b/FlippR-Driver/src/output/detail/SoundBoardPinController.h @@ -19,7 +19,7 @@ namespace detail class SoundBoardPinController : public output::SoundBoardPinController { public: - explicit SoundBoardPinController(std::shared_ptr output_item_mutex, uint8_t fire_address, const std::vector address_pins); + explicit SoundBoardPinController(std::shared_ptr output_item_mutex, uint8_t fire_address, const std::array address_pins); explicit SoundBoardPinController(std::shared_ptr output_item_mutex); ~SoundBoardPinController() override = default; @@ -27,7 +27,7 @@ public: void deactivate(const items::detail::Sound &sound); void set_fire_address(const uint8_t & fire_address); - void set_address_pins(const std::vector address_pins); + void set_address_pins(const std::array address_pins); private: void write_sound_address(const uint8_t & address) const; @@ -40,7 +40,7 @@ private: uint8_t pin_base; uint8_t fire_address; - std::vector address_pins; + std::array address_pins; }; } diff --git a/FlippR-Driver/src/output/factories/SoundFactory.cpp b/FlippR-Driver/src/output/factories/SoundFactory.cpp index cd0dad3..9b59441 100644 --- a/FlippR-Driver/src/output/factories/SoundFactory.cpp +++ b/FlippR-Driver/src/output/factories/SoundFactory.cpp @@ -52,13 +52,7 @@ void SoundFactory::set_address_pins() { auto address_pins = object.at(config_path::address_pins); - std::vector pins; - - //todo mach nen array draus - for (auto & pin_json : address_pins) - { - pins.push_back(0); - } + std::array pins; for (auto & pin_json : address_pins) {