Archived
1
0

remove col port arrays, add RowScanner_PinsBitwise, RowScanner_PinsArray, RowIOE

This commit is contained in:
wolfv6 2016-06-09 13:29:31 -06:00
parent 514c326800
commit c1e465f1ad
12 changed files with 167 additions and 128 deletions

View File

@ -1,7 +1,3 @@
/* debounce() sets debounced and returns debouncedChanged. All variables are bitwise.
For parameter, 1 means pressed, 0 means released.
For return, 1 means debounced changed.
*/
#include "Row.h" #include "Row.h"
/* /*

View File

@ -2,15 +2,12 @@
#define ROW_H #define ROW_H
#include <RowBase.h> #include <RowBase.h>
//#include <RowScanner_BitManipulation.h> #include <RowScanner_PinsArray.h>
#include <RowScanner_Arduino.h>
#include <Debouncer_4Samples.h> #include <Debouncer_4Samples.h>
/* /*
Configuration Configuration
------------- -------------
define and initilize DELAY_MICROSECONDS in sketch.
const unsigned int RowBase::DELAY_MICROSECONDS = 0;
Instantiation Instantiation
------------- -------------
@ -19,12 +16,12 @@ Instantiation
class Row : public RowBase class Row : public RowBase
{ {
private: private:
//RowScanner_BitManipulation scanner; RowScanner_PinsArray scanner;
RowScanner_Arduino scanner;
Debouncer_4Samples debouncer; Debouncer_4Samples debouncer;
public: public:
//Row constructor was like Row_DH constructor //Row constructor was like Row_DH constructor
Row(const uint8_t strobePin, const uint8_t readPins[], const uint8_t READ_PIN_COUNT, Key *const ptrsKeys[]) Row(const uint8_t strobePin, const uint8_t readPins[], const uint8_t READ_PIN_COUNT,
Key *const ptrsKeys[])
: RowBase(ptrsKeys), scanner(strobePin, readPins, READ_PIN_COUNT) { } : RowBase(ptrsKeys), scanner(strobePin, readPins, READ_PIN_COUNT) { }
virtual void process(); virtual void process();
}; };

View File

@ -23,14 +23,14 @@ Tactile switch MJTP series bounce 10 ms http://www.apem.com/files/apem/brochures
Avoid sampling the switch input at a rate synchronous to events in the environment Avoid sampling the switch input at a rate synchronous to events in the environment
that might create periodic EMI. For instance, 50 and 60 Hz. that might create periodic EMI. For instance, 50 and 60 Hz.
The largest allowabl DELAY_MICROSECONDS is 65535 (.065535 second). The largest allowable DELAY_MICROSECONDS is 65535 (.065535 seconds).
Polling I2C may slow the scan rate enough so that no additional delay is needed: Polling I2C may slow the scan rate enough so that no additional delay is needed:
const unsigned int Row::DELAY_MICROSECONDS = 0; const unsigned int Row::DELAY_MICROSECONDS = 0;
Slow-scan trick for debug messages that print too fast and not aligned, add this to sketch loop(): Slow-scan trick for debug messages that print too fast and not aligned, add this to sketch loop():
delay(500); delay(500);
Keyboard.println(""); Keyboard.println(F(""));
That way debug messages are printed at a managable rate, and each scan starts a new line. That way debug messages are printed at a managable rate, and each scan starts a new line.
*/ */
void RowBase::wait() void RowBase::wait()

View File

@ -5,6 +5,9 @@
#include <Key.h> #include <Key.h>
/* RowBase is an abstract base class. /* RowBase is an abstract base class.
Define and initilize DELAY_MICROSECONDS in sketch.
const unsigned int RowBase::DELAY_MICROSECONDS = 0;
*/ */
class RowBase class RowBase
{ {

17
src/RowIOE.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "RowIOE.h"
/*
process() scans the row and calls any newly pressed or released keys.
*/
void RowIOE::process()
{
//these variables are all bitwise, one bit per key
uint8_t rowState; //1 means pressed, 0 means released
uint16_t rowEnd; //1 bit marks positioned after last key of row
uint8_t debouncedChanged; //1 means debounced changed
wait();
rowState = scanner.scan(rowEnd);
debouncedChanged = debouncer.debounce(rowState, debounced);
pressRelease(rowEnd, debouncedChanged);
}

28
src/RowIOE.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef ROWIOE_H
#define ROWIOE_H
#include <RowBase.h>
#include <RowScanner_PinsBitwise.h>
#include <Debouncer_4Samples.h>
/*
Simlar to Row but using RowScanner_PinsBitwise.
Configuration
-------------
Instantiation
-------------
*/
class RowIOE : public RowBase
{
private:
RowScanner_PinsBitwise scanner;
Debouncer_4Samples debouncer;
public:
RowIOE( RowPort& refRowPort, const uint8_t strobePin,
ColPort& refColPort, Key *const ptrsKeys[])
: RowBase(ptrsKeys), scanner(refRowPort, strobePin, refColPort) { }
virtual void process();
};
#endif

View File

@ -1,78 +0,0 @@
#include "RowScanner_BitManipulation.h"
/*
Strobes the row and reads the columns.
Strobe is on for shortest possible time to preserve IR LED on DodoHand's optic switch.
*/
uint8_t RowScanner_BitManipulation::scan(uint16_t& rowEnd)
{
//strobe row on
if (activeHigh)
{
refRowPort.setActivePinHigh(rowPin);
}
else //activeLow
{
refRowPort.setActivePinLow(rowPin);
}
//read all the column ports
for (uint8_t i=0; i < colPortCount; i++)
{
ptrsColPorts[i]->read();
}
//strobe row off
if (activeHigh)
{
refRowPort.setActivePinLow(rowPin);
}
else //activeLow
{
refRowPort.setActivePinHigh(rowPin);
}
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_BitManipulation::getRowState(uint16_t& rowEnd)
{
uint8_t rowState = 0; //bitwise, one key per bit, 1 means key is pressed
rowEnd = 1;
for (uint8_t i=0; i < colPortCount; i++) //for each col port
{
//bitwise colPins, 1 means pin is connected to column
uint8_t colPins = ptrsColPorts[i]->getColPins();
//bitwise colPortState, pin values where set in ColPort::read(), get them now
uint8_t colPortState = ptrsColPorts[i]->getPortState();
if (activeHigh)
{
colPortState = ~colPortState;
}
for ( uint8_t 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

@ -1,29 +0,0 @@
#ifndef ROWSCANNER_BITMANIPULATION_H
#define ROWSCANNER_BITMANIPULATION_H
#include <Arduino.h>
#include <inttypes.h>
#include <RowScannerInterface.h>
#include <RowPort.h>
#include <ColPort.h>
/* RowScanner_BitManipulation uses bit manipulation to read all pins of one port.
*/
class RowScanner_BitManipulation : public RowScannerInterface
{
private:
static const bool activeHigh; //logic level of strobe pin: 0=activeLow, 1=activeHigh
RowPort &refRowPort; //this row's IC port
const uint8_t rowPin; //bitwise, 1 indicates IC pin connected to this row
ColPort *const *const ptrsColPorts; //array of column ports
const uint8_t colPortCount;
public:
RowScanner_BitManipulation(RowPort &refRowPort, const uint8_t rowPin,
ColPort *const ptrsColPorts[], const uint8_t colPortCount)
: refRowPort(refRowPort), rowPin(rowPin),
ptrsColPorts(ptrsColPorts), colPortCount(colPortCount) {}
virtual uint8_t scan(uint16_t& rowEnd);
uint8_t getRowState(uint16_t& rowEnd);
};
#endif

View File

@ -1,4 +1,4 @@
#include "RowScanner_Arduino.h" #include "RowScanner_PinsArray.h"
/* /*
Strobes the row and reads the columns. Strobes the row and reads the columns.
@ -7,7 +7,7 @@ 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. 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. rowEnd is a larger type than portMask so that it can not overflow.
*/ */
uint8_t RowScanner_Arduino::scan(uint16_t& rowEnd) uint8_t RowScanner_PinsArray::scan(uint16_t& rowEnd)
{ {
uint8_t rowState = 0; uint8_t rowState = 0;
rowEnd = 1; rowEnd = 1;
@ -23,7 +23,7 @@ uint8_t RowScanner_Arduino::scan(uint16_t& rowEnd)
} }
delayMicroseconds(3); //time to stablize voltage delayMicroseconds(3); //time to stablize voltage
//read all the column ports //read all the column pins
for (uint8_t i=0; i < READ_PIN_COUNT; i++) for (uint8_t i=0; i < READ_PIN_COUNT; i++)
{ {
if ( digitalRead(readPins[i]) == activeHigh ) if ( digitalRead(readPins[i]) == activeHigh )

View File

@ -1,14 +1,14 @@
#ifndef ROWSCANNER_ARDUINO_H #ifndef ROWSCANNER_PINSARRAY_H
#define ROWSCANNER_ARDUINO_H #define ROWSCANNER_PINSARRAY_H
#include <Arduino.h> #include <Arduino.h>
#include <inttypes.h> #include <inttypes.h>
#include <RowScannerInterface.h> #include <RowScannerInterface.h>
#include <RowPort.h> #include <RowPort.h>
#include <ColPort.h> #include <ColPort.h>
/* RowScanner_Arduino class uses Arduino pin numbers (no port name). /* RowScanner_PinsArray class uses Arduino pin numbers (no port name).
*/ */
class RowScanner_Arduino : public RowScannerInterface class RowScanner_PinsArray : public RowScannerInterface
{ {
private: private:
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
@ -16,7 +16,7 @@ class RowScanner_Arduino : public RowScannerInterface
const uint8_t* readPins; //array of read pin numbers const uint8_t* readPins; //array of read pin numbers
const uint8_t READ_PIN_COUNT; //number of read pins const uint8_t READ_PIN_COUNT; //number of read pins
public: public:
RowScanner_Arduino(const uint8_t strobePin, RowScanner_PinsArray(const uint8_t strobePin,
const uint8_t readPins[], const uint8_t READ_PIN_COUNT) const uint8_t readPins[], const uint8_t READ_PIN_COUNT)
: strobePin(strobePin), readPins(readPins), READ_PIN_COUNT(READ_PIN_COUNT) : strobePin(strobePin), readPins(readPins), READ_PIN_COUNT(READ_PIN_COUNT)
{ {

View File

@ -0,0 +1,79 @@
#include "RowScanner_PinsBitwise.h"
/*
Strobes the row and reads the columns.
Strobe is on for shortest possible time to preserve IR LED on DodoHand's optic switch.
*/
uint8_t RowScanner_PinsBitwise::scan(uint16_t& rowEnd)
{
//strobe row on
if (activeHigh)
{
refRowPort.setActivePinHigh(strobePin);
}
else //activeLow
{
refRowPort.setActivePinLow(strobePin);
}
delayMicroseconds(3); //time to stablize voltage
//read all the port pins
refColPort.read();
/* shows strobing pin 1 and 2, but realy stobing 0 and 1 todo
Keyboard.print(F(" strobePin="));
Keyboard.print(strobePin);
Keyboard.print(F(", "));
*/
//strobe row off
if (activeHigh)
{
refRowPort.setActivePinLow(strobePin);
}
else //activeLow
{
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(uint16_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
}
}
//todo Keyboard.print(rowState);
return rowState;
}

View File

@ -0,0 +1,26 @@
#ifndef ROWSCANNER_PINSBITWISE_H
#define ROWSCANNER_PINSBITWISE_H
#include <Arduino.h>
#include <inttypes.h>
#include <RowScannerInterface.h>
#include <RowPort.h>
#include <ColPort.h>
/* RowScanner_PinsBitwise uses bit manipulation to read all pins of one port.
*/
class RowScanner_PinsBitwise : public RowScannerInterface
{
private:
static const bool activeHigh; //logic level of strobe pin: 0=activeLow, 1=activeHigh
RowPort& refRowPort; //this row's IC port
const uint8_t strobePin; //bitwise, 1 indicates IC pin connected to this row
ColPort& refColPort;
public:
RowScanner_PinsBitwise(RowPort &refRowPort, const uint8_t strobePin,
ColPort& refColPort)
: refRowPort(refRowPort), strobePin(strobePin),
refColPort(refColPort) {}
virtual uint8_t scan(uint16_t& rowEnd);
uint8_t getRowState(uint16_t& rowEnd);
};
#endif