diff --git a/src/RowScannerInterface.h b/src/RowScannerInterface.h index 5a623b3..3d37117 100644 --- a/src/RowScannerInterface.h +++ b/src/RowScannerInterface.h @@ -8,7 +8,9 @@ class RowScannerInterface { public: - virtual read_pins_t scan(read_pins_mask_t& rowEnd)=0; + // virtual read_pins_t scan(read_pins_mask_t& rowEnd)=0; + // todo, remove RowScannerInterface because + // some RowScanners will return ColPort e.g. RowScanner_PinsBitwise }; #endif diff --git a/src/RowScanner_PinsBitwise.cpp b/src/RowScanner_PinsBitwise.cpp index 7a44890..39c07ae 100644 --- a/src/RowScanner_PinsBitwise.cpp +++ b/src/RowScanner_PinsBitwise.cpp @@ -3,7 +3,7 @@ Strobes the row and reads the columns. Sets rowEnd and returns rowState. */ -read_pins_t RowScanner_PinsBitwise::scan(read_pins_mask_t& rowEnd) +ColPort* const RowScanner_PinsBitwise::scan(read_pins_mask_t& rowEnd) { //strobe row on if (activeHigh) @@ -29,46 +29,6 @@ read_pins_t RowScanner_PinsBitwise::scan(read_pins_mask_t& rowEnd) refRowPort.setActivePinHigh(strobePin); } - return getRowState(rowEnd); -} - -/* -Copies column pins to rowState. Unused column pins are not copied. -Sets rowEnd and returns rowState. -rowEnd is a bitwise row mask, one col per bit, where active col bit is 1. -At end of function, 1 bit marks place immediatly after last key of row. -rowEnd is a larger type than portMask so that it can not overflow. -*/ -uint8_t RowScanner_PinsBitwise::getRowState(read_pins_mask_t& rowEnd) -{ - uint8_t rowState = 0; //bitwise, one key per bit, 1 means key is pressed - uint8_t portMask; //bitwise, 1 bit is a colPortState position - - rowEnd = 1; - - //bitwise colPins, 1 means pin is connected to column - uint8_t colPins = refColPort.getColPins(); - - //bitwise colPortState, pin values where set in ColPort::read(), get them now - uint8_t colPortState = refColPort.getPortState(); - - if (activeHigh) - { - colPortState = ~colPortState; - } - - for ( portMask = 1; portMask > 0; portMask <<= 1 ) //shift portMask until overflow - { //for each pin of col port - if (portMask & colPins) //if pin is connected to column - { - if (portMask & ~colPortState) //if pin detected a key press - { - rowState |= rowEnd; //set rowState bit for that key - } - - rowEnd <<= 1; //shift rowEnd to next key - } - } - - return rowState; +// return getRowState(refColPort, rowEnd); + return &refColPort; } diff --git a/src/RowScanner_PinsBitwise.h b/src/RowScanner_PinsBitwise.h index 6752f73..3a21035 100644 --- a/src/RowScanner_PinsBitwise.h +++ b/src/RowScanner_PinsBitwise.h @@ -21,7 +21,6 @@ class RowScanner_PinsBitwise : public RowScannerInterface : refRowPort(refRowPort), strobePin(strobePin), refColPort(refColPort) {} static const bool activeHigh; //logic level of strobe pin: 0=activeLow, 1=activeHigh - virtual read_pins_t scan(read_pins_mask_t& rowEnd); - uint8_t getRowState(read_pins_mask_t& rowEnd); + virtual ColPort* const scan(read_pins_mask_t& rowEnd); }; #endif diff --git a/src/Row_IOE.cpp b/src/Row_IOE.cpp index f5a2005..c6a32d1 100644 --- a/src/Row_IOE.cpp +++ b/src/Row_IOE.cpp @@ -3,11 +3,54 @@ void Row_IOE::process() { //these variables are all bitwise, one bit per key - read_pins_t rowState; //1 means pressed, 0 means released + uint8_t rowState; //1 means pressed, 0 means released read_pins_mask_t rowEnd; //1 bit marks positioned after last key of row - read_pins_t debouncedChanged; //1 means debounced changed + uint8_t debouncedChanged; //1 means debounced changed + ColPort* ptrColPort; //new - rowState = scanner.scan(rowEnd); + ptrColPort = scanner.scan(rowEnd); + rowState = getRowState(ptrColPort, rowEnd); //new debouncedChanged = debouncer.debounce(rowState, debounced); pressRelease(rowEnd, debouncedChanged); } + +/* +Copies column pins to rowState. Unused column pins are not copied. +Sets rowEnd and returns rowState. +rowEnd is a bitwise row mask, one col per bit, where active col bit is 1. +At end of function, 1 bit marks place immediatly after last key of row. +rowEnd is a larger type than portMask so that it can not overflow. +*/ +uint8_t Row_IOE::getRowState(ColPort* ptrColPort, read_pins_mask_t& rowEnd) +{ + uint8_t rowState = 0; //bitwise, one key per bit, 1 means key is pressed + uint8_t portMask; //bitwise, 1 bit is a colPortState position + + rowEnd = 1; + + //bitwise colPins, 1 means pin is connected to column + uint8_t colPins = ptrColPort->getColPins(); + + //bitwise colPortState, pin values where set in ColPort::read(), get them now + uint8_t colPortState = ptrColPort->getPortState(); + + /*if (activeHigh) //'activeHigh' was not declared in this scope + { + colPortState = ~colPortState; //todo configure IOE polarity to take care of this + }*/ + + for ( portMask = 1; portMask > 0; portMask <<= 1 ) //shift portMask until overflow + { //for each pin of col port + if (portMask & colPins) //if pin is connected to column + { + if (portMask & ~colPortState) //if pin detected a key press + { + rowState |= rowEnd; //set rowState bit for that key + } + + rowEnd <<= 1; //shift rowEnd to next key + } + } + + return rowState; +} diff --git a/src/Row_IOE.h b/src/Row_IOE.h index d2e7c85..4981bf8 100644 --- a/src/Row_IOE.h +++ b/src/Row_IOE.h @@ -4,6 +4,7 @@ #include #include #include +#include /* Row_DH_IOE is a row connected to an Input/Output Expander. @@ -41,5 +42,6 @@ class Row_IOE : public RowBase ColPort& refColPort, Key *const ptrsKeys[]) : RowBase(ptrsKeys), scanner(refRowPort, strobePin, refColPort) { } void process(); + uint8_t getRowState(ColPort* refColPort, read_pins_mask_t& rowEnd); }; #endif