// // Created by rhetenor on 14.12.18. // #include "DriverBoardPinController.h" namespace flippR_driver { namespace output { namespace impl { DriverBoardPinController::DriverBoardPinController(std::map pins_driver_board, std::shared_ptr output_item_mutex) : pins_driver_board(std::move(pins_driver_board)), output_item_mutex(std::move(output_item_mutex)) { } void DriverBoardPinController::activate(items::DriverBoardItem &driver_board_item) { std::lock_guard guard(*output_item_mutex); write_driver_board_address(driver_board_item.get_address()); write_data(true); } void DriverBoardPinController::deactivate(items::DriverBoardItem &driver_board_item) { std::lock_guard guard(*output_item_mutex); write_driver_board_address(driver_board_item.get_address()); write_data(false); } void DriverBoardPinController::write_driver_board_address(uint8_t address) const { int latch = address / 8; int pin = address % 8; select_mux(latch); select_latch(latch); select_pin(pin); } void DriverBoardPinController::select_mux(uint8_t latch)const { bool mux1 = latch / 8; write_pin(pins_driver_board.at("mux1"), mux1); write_pin(pins_driver_board.at("mux2"), !mux1); } void DriverBoardPinController::select_latch(uint8_t latch) const { // todo not nice if(latch > 8) latch -= 8; write_pin(pins_driver_board.at("latch-select-A"), latch & 0b001u); write_pin(pins_driver_board.at("latch-select-B"), latch & 0b010u); write_pin(pins_driver_board.at("latch-select-C"), latch & 0b100u); } void DriverBoardPinController::write_data(bool data) const { write_pin(pins_driver_board.at("data"), data); } void DriverBoardPinController::select_pin(uint8_t pin) const { write_pin(pins_driver_board.at("pin-select-A"), pin & 0b001u); write_pin(pins_driver_board.at("pin-select-B"), pin & 0b010u); write_pin(pins_driver_board.at("pin-select-C"), pin & 0b100u); } void DriverBoardPinController::write_pin(uint8_t pin, bool value) const { PinController::write_pin(pins_driver_board.at("pin_base") + pin, value); } } } }