void RowScanner_SPIShiftRegisters::begin() | void RowScanner_SPIShiftRegisters::begin() | ||||
{ | { | ||||
pinMode (SS, OUTPUT); | |||||
digitalWrite (SS, HIGH); | |||||
//configure row | |||||
pinMode(STROBE_PIN, OUTPUT); | |||||
//todo there is only one slave, is select needed? | |||||
pinMode (SHIFT_LOAD, OUTPUT); | |||||
digitalWrite (SHIFT_LOAD, HIGH); | |||||
} | } | ||||
/* | /* | ||||
*/ | */ | ||||
read_pins_t RowScanner_SPIShiftRegisters::scan(read_pins_mask_t& rowEnd) | read_pins_t RowScanner_SPIShiftRegisters::scan(read_pins_mask_t& rowEnd) | ||||
{ | { | ||||
//todo rowEnd, rowState, return int size depend on BYTE_COUNT, like in send(), set in config_keybrd? | |||||
read_pins_t rowState = 0; | read_pins_t rowState = 0; | ||||
digitalWrite(SS, LOW); //load parallel inputs to the register | |||||
digitalWrite(SS, HIGH); //shift the data toward a serial output | |||||
//strobe row on | |||||
digitalWrite(STROBE_PIN, LOW); | |||||
delayMicroseconds(3); //time to stablize voltage | |||||
//read all the column pins | |||||
digitalWrite(SHIFT_LOAD, LOW); //load parallel inputs to the register | |||||
digitalWrite(SHIFT_LOAD, HIGH); //shift the data toward a serial output | |||||
SPI.transfer(&rowState, BYTE_COUNT); | SPI.transfer(&rowState, BYTE_COUNT); | ||||
//strobe row off | |||||
digitalWrite(STROBE_PIN, HIGH); | |||||
rowEnd = 1 << KEY_COUNT; | rowEnd = 1 << KEY_COUNT; | ||||
return rowState; | return rowState; | ||||
} | } |
class RowScanner_SPIShiftRegisters : public RowScannerInterface | class RowScanner_SPIShiftRegisters : public RowScannerInterface | ||||
{ | { | ||||
private: | private: | ||||
const uint8_t SS; //pin on master that selects slave | |||||
//todo static const bool ACTIVE_HIGH; //logic level of strobe pin: 0=activeLow, 1=activeHigh | |||||
const uint8_t STROBE_PIN; //Arduino pin number connected to this row | |||||
const uint8_t SHIFT_LOAD; //controller's pin number that is connected to shift register's SHIFT_LOAD pin | |||||
const uint8_t BYTE_COUNT; //number of bytes to read from shift registers | const uint8_t BYTE_COUNT; //number of bytes to read from shift registers | ||||
const uint8_t KEY_COUNT; //number of keys in row | const uint8_t KEY_COUNT; //number of keys in row | ||||
public: | public: | ||||
RowScanner_SPIShiftRegisters(const uint8_t SS, uint8_t BYTE_COUNT, uint8_t KEY_COUNT) | |||||
: SS(SS), BYTE_COUNT(BYTE_COUNT), KEY_COUNT(KEY_COUNT) {} | |||||
RowScanner_SPIShiftRegisters(const uint8_t STROBE_PIN, const uint8_t SHIFT_LOAD, | |||||
uint8_t BYTE_COUNT, uint8_t KEY_COUNT) | |||||
: STROBE_PIN(STROBE_PIN), SHIFT_LOAD(SHIFT_LOAD), | |||||
BYTE_COUNT(BYTE_COUNT), KEY_COUNT(KEY_COUNT) {} | |||||
virtual read_pins_t scan(read_pins_mask_t& rowEnd); | virtual read_pins_t scan(read_pins_mask_t& rowEnd); | ||||
void begin(); | void begin(); | ||||
}; | }; |
#include <RowBase.h> | #include <RowBase.h> | ||||
#include <RowScanner_SPIShiftRegisters.h> | #include <RowScanner_SPIShiftRegisters.h> | ||||
#include <Debouncer_4Samples.h> | #include <Debouncer_4Samples.h> | ||||
//todo #include <Debouncer_Not.h> | |||||
/* Row_DH_IOE is a row connected to an Input/Output Expander. | /* Row_DH_IOE is a row connected to an Input/Output Expander. | ||||
private: | private: | ||||
RowScanner_SPIShiftRegisters scanner; | RowScanner_SPIShiftRegisters scanner; | ||||
Debouncer_4Samples debouncer; | Debouncer_4Samples debouncer; | ||||
//Debouncer_Not debouncer; //todo test | |||||
public: | public: | ||||
Row_ShiftRegisters(const uint8_t SS, uint8_t BYTE_COUNT, Key *const ptrsKeys[], uint8_t KEY_COUNT) | |||||
: RowBase(ptrsKeys), scanner(SS, BYTE_COUNT, KEY_COUNT) { } | |||||
Row_ShiftRegisters(const uint8_t STROBE_PIN, const uint8_t SHIFT_LOAD, uint8_t BYTE_COUNT, | |||||
Key *const ptrsKeys[], uint8_t KEY_COUNT) | |||||
: RowBase(ptrsKeys), scanner(STROBE_PIN, SHIFT_LOAD, BYTE_COUNT, KEY_COUNT) { } | |||||
void begin(); | void begin(); | ||||
read_pins_t scan(read_pins_mask_t& rowEnd); | read_pins_t scan(read_pins_mask_t& rowEnd); | ||||
read_pins_t debounce(const read_pins_t rowState, read_pins_t& debounced); | read_pins_t debounce(const read_pins_t rowState, read_pins_t& debounced); |