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; }; }