/* * InputGPIOInterface.cpp * * Created on: May 31, 2018 * Author: Andreas Schneider, Johannes Wendel, Jonas Zeunert, Rafael Vinci, Dr. Franca Rupprecht */ #include #include #include "InputGPIOInterface.h" #include "json/json.hpp" #include "easylogging/easylogging++.h" #include "config.h" #include using namespace nlohmann; bool InputGPIOInterface::read_data(char pin) { // setting address to read write_row(pin / INPUT_MATRIX_SIZE); write_col(pin % INPUT_MATRIX_SIZE); // wait for mux to set address std::this_thread::sleep_for(std::chrono::nanoseconds(INPUT_SLEEP_DURATION_NANO)); return read_pin(this->data_address); } void InputGPIOInterface::write_row(char data) { write_pin(this->row_address_A, data & 0b001); write_pin(this->row_address_B, data & 0b010); write_pin(this->row_address_C, data & 0b100); } void InputGPIOInterface::write_col(char data) { write_pin(this->col_address_A, data & 0b001); write_pin(this->col_address_B, data & 0b010); write_pin(this->col_address_C, data & 0b100); } InputGPIOInterface::InputGPIOInterface(std::istream& input_config_stream) { init_members(input_config_stream); init_pins(); } void InputGPIOInterface::init_members(std::istream &input_config_stream) { json input_config; input_config_stream >> input_config; try { json row_json = input_config.at("row"); row_address_A = row_json.at("A").get(); row_address_B = row_json.at("B").get(); row_address_C = row_json.at("C").get(); json col_json = input_config.at("col"); col_address_A = col_json.at("A").get(); col_address_B = col_json.at("B").get(); col_address_C = col_json.at("C").get(); data_address = input_config.at("data").get(); } catch (json::type_error& e) { CLOG(ERROR, INPUT_LOGGER) << e.what(); } catch (json::out_of_range& e) { CLOG(ERROR, INPUT_LOGGER) << e.what(); } } void InputGPIOInterface::init_pins() { initialize_output_pin(col_address_A); initialize_output_pin(col_address_B); initialize_output_pin(col_address_C); initialize_output_pin(row_address_A); initialize_output_pin(row_address_B); initialize_output_pin(row_address_C); initialize_input_pin(data_address); }