diff --git a/software/arduino/keyboard/Makefile b/software/arduino/keyboard/Makefile new file mode 100644 index 0000000..9691cd9 --- /dev/null +++ b/software/arduino/keyboard/Makefile @@ -0,0 +1,11 @@ + +all: verify + +verify: + ~/Prog/Program/arduino-1.8.9/arduino --verify keyboard.ino | sed "s/stepper:/stepper.ino:/g" + +upload: + ~/Prog/Program/arduino-1.8.9/arduino --upload keyboard.ino | sed "s/stepper:/stepper.ino:/g" + +#test: testing.cpp stepper.ino +# c++ testing.cpp -std=c++14 -o test -g -pthread \ No newline at end of file diff --git a/software/arduino/keyboard/keyboard.ino b/software/arduino/keyboard/keyboard.ino new file mode 100644 index 0000000..423aeba --- /dev/null +++ b/software/arduino/keyboard/keyboard.ino @@ -0,0 +1,50 @@ +#include "keyboardstate.h" +#include + +namespace { + +constexpr size_t width = 6; +constexpr size_t height = 5; + +const std::array xPins = {}; +const std::array yPins = {}; + +typedef KeyboardState keyboard_state_t; +keyboard_state_t state; + +} // namespace + +void setup() { + for (auto pin : xPins) { + pinMode(pin, OUTPUT); + } +} + +//! Turn on one column pin and turn of the rest +void changeColumnPin(size_t column) { + for (size_t i = 0; i < xPins.size(); ++i) { + digitalWrite(xPins[i], i == column); + } +} + +void readRowPins(keyboard_state_t &keyboardState, size_t x) { + for (size_t y = 0; y < yPins.size(); ++y) { + int value = digitalRead(yPins[y]); + auto &keyState = keyboardState.state(x, y); + + if (keyState != value) { + // Todo: Handle this + Serial.print("key is changed"); + keyState = value; + } + } +} + +void loop() { + // Cycle through columns + for (size_t x = 0; x < width; ++x) { + changeColumnPin(x); + + readRowPins(state, x); + } +} diff --git a/software/arduino/keyboard/keyboardstate.h b/software/arduino/keyboard/keyboardstate.h new file mode 100644 index 0000000..b20b373 --- /dev/null +++ b/software/arduino/keyboard/keyboardstate.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +template +class KeyboardState { + std::array _state = {}; + +public: + typedef char state_t; + + // Todo: Bounds check + state_t state(size_t x, size_t y) const { return _state[y * width + x]; } + state_t &state(size_t x, size_t y) { return _state[y * width + x]; } +};