90 lines
2.1 KiB
C++
90 lines
2.1 KiB
C++
//
|
|
// Created by rhetenor on 14.12.18.
|
|
//
|
|
|
|
#include "DriverBoardPinController.h"
|
|
|
|
namespace flippR_driver
|
|
{
|
|
namespace output
|
|
{
|
|
namespace impl
|
|
{
|
|
|
|
DriverBoardPinController::DriverBoardPinController(std::map<std::string, uint8_t> pins_driver_board, std::shared_ptr<std::mutex> 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<std::mutex> 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<std::mutex> 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);
|
|
}
|
|
|
|
}
|
|
}
|
|
} |