From 6ba4eac5c84ec801ac49b98438038a1186079907 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Sep 2018 20:35:20 +0200 Subject: [PATCH 1/6] linking against crypt --- FlippR-Driver/CMakeLists.txt | 16 +++++++++++----- FlippR-Driver/lib/libwiringPi.so.2.44 | Bin 90520 -> 0 bytes FlippR-Driver/src/utilities/GPIOInterface.cpp | 6 +++--- 3 files changed, 14 insertions(+), 8 deletions(-) delete mode 100755 FlippR-Driver/lib/libwiringPi.so.2.44 diff --git a/FlippR-Driver/CMakeLists.txt b/FlippR-Driver/CMakeLists.txt index 93dfe66..52ca3c0 100644 --- a/FlippR-Driver/CMakeLists.txt +++ b/FlippR-Driver/CMakeLists.txt @@ -110,14 +110,17 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/include) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/${LIB_DIR}) ##################### WIRING_PI ########################## -find_library(WIRING_PI NAMES libwiringPi.so.2.44 HINTS ${CMAKE_SOURCE_DIR}/lib) - -if(NOT WIRING_PI) +find_library(wiringPi_LIB wiringPi) +if(NOT wiringPi_LIB) message(FATAL_ERROR "Could not find wiringPi library") endif() +target_link_libraries(${PROJECT_NAME} PUBLIC ${wiringPi_LIB}) -target_link_libraries(${PROJECT_NAME} PUBLIC ${WIRING_PI}) - +find_library(crypt_LIB crypt) +if(NOT crypt_LIB) + message(FATAL_ERROR "Could not find crypt library") +endif() +target_link_libraries(${PROJECT_NAME} PUBLIC ${crypt_LIB}) ## EASYLOGGING set(EASYLOGGING_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/${LIB_DIR}/easylogging) add_library(Easylogging STATIC ${EASYLOGGING_INCLUDE_DIR}/easylogging++.cc) @@ -132,6 +135,9 @@ target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR}) ## THREAD find_package(Threads REQUIRED) +if(NOT CMAKE_THREAD_LIBS_INIT) + message(FATAL_ERROR, "Could not find libthread") +endif() target_link_libraries(${PROJECT_NAME} PRIVATE ${Threads_LIBRARIES}) if(ENABLE_TESTING) diff --git a/FlippR-Driver/lib/libwiringPi.so.2.44 b/FlippR-Driver/lib/libwiringPi.so.2.44 deleted file mode 100755 index 92f7d4d161781a8f98a174de9a460d239e9c93c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90520 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 Date: Thu, 13 Sep 2018 20:36:10 +0200 Subject: [PATCH 2/6] modified gitignore --- FlippR-Driver/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/FlippR-Driver/.gitignore b/FlippR-Driver/.gitignore index cae6c66..4bbdf15 100644 --- a/FlippR-Driver/.gitignore +++ b/FlippR-Driver/.gitignore @@ -11,3 +11,4 @@ bin Makefile .project .cproject +.idea From 2feef207a653f9ba3bd3c9c03222d94b5ac88842 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Sep 2018 20:38:20 +0200 Subject: [PATCH 3/6] changed cmakeversion --- FlippR-Driver/tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FlippR-Driver/tests/CMakeLists.txt b/FlippR-Driver/tests/CMakeLists.txt index 574b955..518b833 100644 --- a/FlippR-Driver/tests/CMakeLists.txt +++ b/FlippR-Driver/tests/CMakeLists.txt @@ -1,5 +1,5 @@ ###################### START_CMAKE ####################### -cmake_minimum_required(VERSION 3.9.1) +cmake_minimum_required(VERSION 3.6.2) project(FlippR-Driver-Tests VERSION 0.1.0 LANGUAGES CXX) # Compile tests to output_path/tests From cfc23212634ce7c33fe759e6085dcb0e2afc9ac6 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Sep 2018 20:39:18 +0200 Subject: [PATCH 4/6] changed to cxx14 --- FlippR-Driver/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FlippR-Driver/CMakeLists.txt b/FlippR-Driver/CMakeLists.txt index 52ca3c0..cfc2f74 100644 --- a/FlippR-Driver/CMakeLists.txt +++ b/FlippR-Driver/CMakeLists.txt @@ -8,7 +8,7 @@ set(OUTPUT_PATH bin) set(LIB_DIR lib) set(DEFAULT_BUILD_TYPE DEBUG) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 14) # Boost configuration set(BOOST_COMPONENTS program_options thread timer chrono) From aedb2469c5716658501350b11adc3249ca292852 Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Sep 2018 22:00:52 +0200 Subject: [PATCH 5/6] finishing inputgpiointerface --- FlippR-Driver/src/input/Detector.cpp | 2 +- FlippR-Driver/src/utilities/GPIOInterface.cpp | 16 ++++ FlippR-Driver/src/utilities/GPIOInterface.h | 11 ++- .../src/utilities/IInputGPIOInterface.h | 2 +- .../src/utilities/InputGPIOInterface.cpp | 87 +++++++++++-------- .../src/utilities/InputGPIOInterface.h | 22 ++--- FlippR-Driver/tests/input/TestDetector.cpp | 6 +- 7 files changed, 96 insertions(+), 50 deletions(-) diff --git a/FlippR-Driver/src/input/Detector.cpp b/FlippR-Driver/src/input/Detector.cpp index bf8b66a..4aa99a5 100644 --- a/FlippR-Driver/src/input/Detector.cpp +++ b/FlippR-Driver/src/input/Detector.cpp @@ -55,7 +55,7 @@ bool Detector::check_inputs(char& address) { for(char pin = 0; pin < (INPUT_MATRIX_SIZE * INPUT_MATRIX_SIZE); pin++) { - if(input_gpio_interface->read_input_data(pin)) + if(input_gpio_interface->read_data(pin)) { address = pin; return true; diff --git a/FlippR-Driver/src/utilities/GPIOInterface.cpp b/FlippR-Driver/src/utilities/GPIOInterface.cpp index b055fe0..7a1d096 100644 --- a/FlippR-Driver/src/utilities/GPIOInterface.cpp +++ b/FlippR-Driver/src/utilities/GPIOInterface.cpp @@ -10,6 +10,12 @@ #include "wiringPi/wiringPi.h" #include "json/json.hpp" +std::once_flag GPIOInterface::GPIO_LIB_INITIALIZED; + +void GPIOInterface::initialize_input_pin(char address) +{ + pinMode(address, INPUT); +} void GPIOInterface::write_pin(char address, char data) { @@ -21,3 +27,13 @@ bool GPIOInterface::read_pin(char address) { return digitalRead(address); } + +void GPIOInterface::initialize_output_pin(char address) +{ + pinMode(address, OUTPUT); +} + +GPIOInterface::GPIOInterface() +{ + std::call_once(GPIO_LIB_INITIALIZED, wiringPiSetup); +} diff --git a/FlippR-Driver/src/utilities/GPIOInterface.h b/FlippR-Driver/src/utilities/GPIOInterface.h index 3ef332b..fff69cd 100644 --- a/FlippR-Driver/src/utilities/GPIOInterface.h +++ b/FlippR-Driver/src/utilities/GPIOInterface.h @@ -13,17 +13,26 @@ #ifndef SRC_UTILITIES_GPIOINTERFACE_H_ #define SRC_UTILITIES_GPIOINTERFACE_H_ +#include #include #include "config.h" - class GPIOInterface { public: + GPIOInterface(); + virtual ~GPIOInterface() {}; + static void initialize_input_pin(char address); + + static void initialize_output_pin(char address); + static void write_pin(char address, char data); static bool read_pin(char address); + +public: + static std::once_flag GPIO_LIB_INITIALIZED; }; diff --git a/FlippR-Driver/src/utilities/IInputGPIOInterface.h b/FlippR-Driver/src/utilities/IInputGPIOInterface.h index 9881234..67c878a 100644 --- a/FlippR-Driver/src/utilities/IInputGPIOInterface.h +++ b/FlippR-Driver/src/utilities/IInputGPIOInterface.h @@ -14,7 +14,7 @@ class IInputGPIOInterface public: virtual ~IInputGPIOInterface(){}; - virtual bool read_input_data(char pin) = 0; + virtual bool read_data(char pin) = 0; }; diff --git a/FlippR-Driver/src/utilities/InputGPIOInterface.cpp b/FlippR-Driver/src/utilities/InputGPIOInterface.cpp index eb8609c..424158a 100644 --- a/FlippR-Driver/src/utilities/InputGPIOInterface.cpp +++ b/FlippR-Driver/src/utilities/InputGPIOInterface.cpp @@ -15,56 +15,75 @@ #include using namespace nlohmann; -bool InputGPIOInterface::read_input_data(char pin) +bool InputGPIOInterface::read_data(char pin) { // setting address to read - write_input_row(pin / INPUT_MATRIX_SIZE); - write_input_col(pin % INPUT_MATRIX_SIZE); + 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->input_data_address); + return read_pin(this->data_address); } -void InputGPIOInterface::write_input_row(char data) +void InputGPIOInterface::write_row(char data) { - write_pin(this->input_row_address_A, data & 0b001); - write_pin(this->input_row_address_B, data & 0b010); - write_pin(this->input_row_address_C, data & 0b100); + 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_input_col(char data) +void InputGPIOInterface::write_col(char data) { - write_pin(this->input_col_address_A, data & 0b001); - write_pin(this->input_col_address_B, data & 0b010); - write_pin(this->input_col_address_C, data & 0b100); + 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& matrix_config_stream) { - json matrix_config; - matrix_config_stream >> matrix_config; - - try { - json matrix_config_input = matrix_config.at("input"); - - json row_json = matrix_config.at("row"); - input_row_address_A = row_json.at("A").get(); - input_row_address_B = row_json.at("B").get(); - input_row_address_C = row_json.at("C").get(); - - json col_json = matrix_config.at("col"); - input_col_address_A = col_json.at("A").get(); - input_col_address_B = col_json.at("B").get(); - input_col_address_C = col_json.at("C").get(); - - input_data_address = matrix_config.at("data").get(); - } catch (json::type_error& e) { - CLOG(ERROR, INPUT_LOGGER) << "ERROR"; - } catch (json::out_of_range& e) { - CLOG(ERROR, INPUT_LOGGER) << "ANOTHER ERROR!"; - } + init_members(matrix_config_stream); + init_pins(); +} + +void InputGPIOInterface::init_members(std::istream &matrix_config_stream) +{ + json matrix_config; + matrix_config_stream >> matrix_config; + + try { + json matrix_config_input = matrix_config.at("input"); + + json row_json = matrix_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 = matrix_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 = matrix_config.at("data").get(); + } catch (json::type_error& e) { + CLOG(ERROR, INPUT_LOGGER) << "ERROR"; + } catch (json::out_of_range& e) { + CLOG(ERROR, INPUT_LOGGER) << "ANOTHER ERROR!"; + } +} + +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); } diff --git a/FlippR-Driver/src/utilities/InputGPIOInterface.h b/FlippR-Driver/src/utilities/InputGPIOInterface.h index b21540d..0cf5e96 100644 --- a/FlippR-Driver/src/utilities/InputGPIOInterface.h +++ b/FlippR-Driver/src/utilities/InputGPIOInterface.h @@ -16,20 +16,22 @@ class InputGPIOInterface : public IInputGPIOInterface, GPIOInterface { public: InputGPIOInterface(std::istream& matrix_config_stream); - bool read_input_data(char pin); + bool read_data(char pin); private: - void write_input_row(char data); - void write_input_col(char data); + void init_members(std::istream& matrix_config_stream); + void init_pins(); + void write_row(char data); + void write_col(char data); private: - char input_row_address_A; - char input_row_address_B; - char input_row_address_C; - char input_col_address_A; - char input_col_address_B; - char input_col_address_C; - char input_data_address; + char row_address_A; + char row_address_B; + char row_address_C; + char col_address_A; + char col_address_B; + char col_address_C; + char data_address; }; #endif /* SRC_UTILITIES_INPUTGPIOINTERFACE_H_ */ diff --git a/FlippR-Driver/tests/input/TestDetector.cpp b/FlippR-Driver/tests/input/TestDetector.cpp index e137ad2..e67bce5 100644 --- a/FlippR-Driver/tests/input/TestDetector.cpp +++ b/FlippR-Driver/tests/input/TestDetector.cpp @@ -36,7 +36,7 @@ SCENARIO("Creating a Detector object", "") Mock gpio_interface_mock; Fake(Dtor(gpio_interface_mock)); - When(Method(gpio_interface_mock, read_input_data)).AlwaysReturn(false); + When(Method(gpio_interface_mock, read_data)).AlwaysReturn(false); Fake(Dtor(event_notifier_mock)); When(Method(event_notifier_mock, distribute_event)).AlwaysReturn(); @@ -64,7 +64,7 @@ SCENARIO("There are events at the input", "") Mock gpio_interface_mock; Fake(Dtor(gpio_interface_mock)); - When(Method(gpio_interface_mock, read_input_data)).AlwaysDo([](char c){return c==2;}); + When(Method(gpio_interface_mock, read_data)).AlwaysDo([](char c){return c==2;}); Fake(Dtor(event_notifier_mock)); When(Method(event_notifier_mock, distribute_event)).AlwaysReturn(); @@ -104,7 +104,7 @@ SCENARIO("There are events at the input but no suitable event in map", "") Mock gpio_interface_mock; Fake(Dtor(gpio_interface_mock)); - When(Method(gpio_interface_mock, read_input_data)).AlwaysDo([](char c){return c==4;}); + When(Method(gpio_interface_mock, read_data)).AlwaysDo([](char c){return c==4;}); Fake(Dtor(event_notifier_mock)); When(Method(event_notifier_mock, distribute_event)).AlwaysReturn(); From e8c801a3c0bfaaa94367787a24afa9c1fbfb83df Mon Sep 17 00:00:00 2001 From: Jonas Zeunert Date: Thu, 13 Sep 2018 22:04:29 +0200 Subject: [PATCH 6/6] refactored matrix_config to input_config --- .../src/utilities/InputGPIOInterface.cpp | 18 +++++++++--------- .../src/utilities/InputGPIOInterface.h | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/FlippR-Driver/src/utilities/InputGPIOInterface.cpp b/FlippR-Driver/src/utilities/InputGPIOInterface.cpp index 424158a..8f26111 100644 --- a/FlippR-Driver/src/utilities/InputGPIOInterface.cpp +++ b/FlippR-Driver/src/utilities/InputGPIOInterface.cpp @@ -42,32 +42,32 @@ void InputGPIOInterface::write_col(char data) } -InputGPIOInterface::InputGPIOInterface(std::istream& matrix_config_stream) +InputGPIOInterface::InputGPIOInterface(std::istream& input_config_stream) { - init_members(matrix_config_stream); + init_members(input_config_stream); init_pins(); } -void InputGPIOInterface::init_members(std::istream &matrix_config_stream) +void InputGPIOInterface::init_members(std::istream &input_config_stream) { - json matrix_config; - matrix_config_stream >> matrix_config; + json input_config; + input_config_stream >> input_config; try { - json matrix_config_input = matrix_config.at("input"); + json matrix_config_input = input_config.at("input"); - json row_json = matrix_config.at("row"); + 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 = matrix_config.at("col"); + 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 = matrix_config.at("data").get(); + data_address = input_config.at("data").get(); } catch (json::type_error& e) { CLOG(ERROR, INPUT_LOGGER) << "ERROR"; } catch (json::out_of_range& e) { diff --git a/FlippR-Driver/src/utilities/InputGPIOInterface.h b/FlippR-Driver/src/utilities/InputGPIOInterface.h index 0cf5e96..4bb6cc7 100644 --- a/FlippR-Driver/src/utilities/InputGPIOInterface.h +++ b/FlippR-Driver/src/utilities/InputGPIOInterface.h @@ -15,11 +15,11 @@ class InputGPIOInterface : public IInputGPIOInterface, GPIOInterface { public: - InputGPIOInterface(std::istream& matrix_config_stream); + InputGPIOInterface(std::istream& input_config_stream); bool read_data(char pin); private: - void init_members(std::istream& matrix_config_stream); + void init_members(std::istream& input_config_stream); void init_pins(); void write_row(char data); void write_col(char data);