Archived
1
0

move getRowState() from RowScanner_PinsBitwise to Row_IOE

This commit is contained in:
wolfv6 2016-07-07 06:51:43 -06:00
parent 2431659b2b
commit 987f33e270
5 changed files with 55 additions and 49 deletions

View File

@ -8,7 +8,9 @@
class RowScannerInterface class RowScannerInterface
{ {
public: 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 #endif

View File

@ -3,7 +3,7 @@
Strobes the row and reads the columns. Strobes the row and reads the columns.
Sets rowEnd and returns rowState. 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 //strobe row on
if (activeHigh) if (activeHigh)
@ -29,46 +29,6 @@ read_pins_t RowScanner_PinsBitwise::scan(read_pins_mask_t& rowEnd)
refRowPort.setActivePinHigh(strobePin); refRowPort.setActivePinHigh(strobePin);
} }
return getRowState(rowEnd); // return getRowState(refColPort, rowEnd);
} return &refColPort;
/*
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;
} }

View File

@ -21,7 +21,6 @@ class RowScanner_PinsBitwise : public RowScannerInterface
: refRowPort(refRowPort), strobePin(strobePin), : refRowPort(refRowPort), strobePin(strobePin),
refColPort(refColPort) {} refColPort(refColPort) {}
static const bool activeHigh; //logic level of strobe pin: 0=activeLow, 1=activeHigh static const bool activeHigh; //logic level of strobe pin: 0=activeLow, 1=activeHigh
virtual read_pins_t scan(read_pins_mask_t& rowEnd); virtual ColPort* const scan(read_pins_mask_t& rowEnd);
uint8_t getRowState(read_pins_mask_t& rowEnd);
}; };
#endif #endif

View File

@ -3,11 +3,54 @@
void Row_IOE::process() void Row_IOE::process()
{ {
//these variables are all bitwise, one bit per key //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_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); debouncedChanged = debouncer.debounce(rowState, debounced);
pressRelease(rowEnd, debouncedChanged); 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;
}

View File

@ -4,6 +4,7 @@
#include <RowBase.h> #include <RowBase.h>
#include <RowScanner_PinsBitwise.h> #include <RowScanner_PinsBitwise.h>
#include <Debouncer_4Samples.h> #include <Debouncer_4Samples.h>
#include <ColPort.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.
@ -41,5 +42,6 @@ class Row_IOE : public RowBase
ColPort& refColPort, Key *const ptrsKeys[]) ColPort& refColPort, Key *const ptrsKeys[])
: RowBase(ptrsKeys), scanner(refRowPort, strobePin, refColPort) { } : RowBase(ptrsKeys), scanner(refRowPort, strobePin, refColPort) { }
void process(); void process();
uint8_t getRowState(ColPort* refColPort, read_pins_mask_t& rowEnd);
}; };
#endif #endif