Browse Source

delete RowDelay, replace with scanDelay in loop()

tags/v0.5.0
wolfv6 7 years ago
parent
commit
2431659b2b

+ 3
- 1
doc/keybrd_library_developer_guide.md View File

@@ -94,6 +94,7 @@ Keybrd library class inheritance diagram
|
Debouncer_4Samples
ScanDelay
LayerStateInterface
|
@@ -244,7 +245,6 @@ Refer to it like a table of contents while reading the keybrd library.
```
loop() for each row
RowBase::process()
RowBase::wait() delay time for debounce
RowScanner_PinsArray::scan() strobe row on
for each readPin
set rowState bit
@@ -257,6 +257,8 @@ Refer to it like a table of contents while reading the keybrd library.
if rising edge
Key_*::press() scanCode->press()
Code_*::press() Keyboard.press(scancode)
scanDelay.delay();
```
## The Arduino libraries

+ 4
- 1
examples/keybrd_shift_register/keybrd_shift_register.ino View File

@@ -16,6 +16,7 @@ Layout
// ################## GLOBAL ###################
// ================= INCLUDES ==================
#include <Debug.h>
#include <ScanDelay.h>

//Codes
#include <Code_Sc.h>
@@ -26,7 +27,7 @@ Layout
#include <Row_ShiftRegisters.h>

// =============== CONFIGURATION ===============
const unsigned int RowDelay::DELAY_MICROSECONDS = 0; //500
ScanDelay scanDelay(9000);
const bool RowScanner_PinsArray::ACTIVE_HIGH = 0; //left matrix is active low
const uint8_t RowScanner_SPIShiftRegisters::SHIFT_LOAD = 10;

@@ -163,6 +164,8 @@ void loop()
row_R0.process();
row_R1.process();

scanDelay.delay();

//delay(100);
//Keyboard.println("");
//debug.print_microseconds_per_scan();

+ 0
- 1
src/Row_IOE.cpp View File

@@ -7,7 +7,6 @@ void Row_IOE::process()
read_pins_mask_t rowEnd; //1 bit marks positioned after last key of row
read_pins_t debouncedChanged; //1 means debounced changed

rowDelay.delay();
rowState = scanner.scan(rowEnd);
debouncedChanged = debouncer.debounce(rowState, debounced);
pressRelease(rowEnd, debouncedChanged);

+ 0
- 2
src/Row_IOE.h View File

@@ -2,7 +2,6 @@
#define ROWIOE_H

#include <RowBase.h>
#include <RowDelay.h>
#include <RowScanner_PinsBitwise.h>
#include <Debouncer_4Samples.h>

@@ -35,7 +34,6 @@ Number of pins in colPort0 should equal number of keys in ptrsKeys_0[] array.
class Row_IOE : public RowBase
{
private:
RowDelay rowDelay;
RowScanner_PinsBitwise scanner;
Debouncer_4Samples debouncer;
public:

+ 0
- 1
src/Row_ShiftRegisters.cpp View File

@@ -7,7 +7,6 @@ void Row_ShiftRegisters::process()
read_pins_mask_t rowEnd; //1 bit marks positioned after last key of row
read_pins_t debouncedChanged; //1 means debounced changed

rowDelay.delay();
rowState = scanner.scan(rowEnd);
debouncedChanged = debouncer.debounce(rowState, debounced);
pressRelease(rowEnd, debouncedChanged);

+ 0
- 2
src/Row_ShiftRegisters.h View File

@@ -2,7 +2,6 @@
#define ROW_SHIFTREGISTERS_H

#include <RowBase.h>
#include <RowDelay.h>
#include <RowScanner_SPIShiftRegisters.h>
#include <Debouncer_4Samples.h>
//#include <Debouncer_Not.h>
@@ -28,7 +27,6 @@ Number of pins in colPort0 should equal number of keys in ptrsKeys_0[] array.
class Row_ShiftRegisters : public RowBase
{
private:
RowDelay rowDelay;
RowScanner_SPIShiftRegisters scanner;
Debouncer_4Samples debouncer;
//Debouncer_Not debouncer; //passed test

+ 0
- 1
src/Row_uC.cpp View File

@@ -10,7 +10,6 @@ void Row_uC::process()
read_pins_mask_t rowEnd; //1 bit marks positioned after last key of row
read_pins_t debouncedChanged; //1 means debounced changed

rowDelay.delay();
rowState = scanner.scan(rowEnd);
debouncedChanged = debouncer.debounce(rowState, debounced);
pressRelease(rowEnd, debouncedChanged);

+ 0
- 2
src/Row_uC.h View File

@@ -2,7 +2,6 @@
#define ROW_H

#include <RowBase.h>
#include <RowDelay.h>
#include <RowScanner_PinsArray.h>
#include <Debouncer_4Samples.h>

@@ -30,7 +29,6 @@ Number of colPins should equal number of keys in ptrsKeys_0[] array.
class Row_uC : public RowBase
{
private:
RowDelay rowDelay;
RowScanner_PinsArray scanner;
Debouncer_4Samples debouncer;
public:

src/RowDelay.cpp → src/ScanDelay.cpp View File

@@ -1,6 +1,6 @@
#include "RowDelay.h"
#include "ScanDelay.h"

void RowDelay::delay()
void ScanDelay::delay()
{
delayMicroseconds(DELAY_MICROSECONDS);
}

src/RowDelay.h → src/ScanDelay.h View File

@@ -1,18 +1,16 @@
#ifndef ROWDELAY_H
#define ROWDELAY_H
#ifndef SCANDELAY_H
#define SCANDELAY_H
#include <Arduino.h>
#include <inttypes.h>

/* RowDelay() delay's scan to give switches time to debounce.
For fastest response time, RowDelay() should be placed before scan() or after pressRelease()
(RowDelay() between scan and send would unnecessarily delay send).
/* ScanDelay() delay's scan to give switches time to debounce.

DELAY_MICROSECONDS explained
----------------------------
A keyboard with a faster scan rate responds faster.
Follow these step to tune DELAY_MICROSECONDS for maximum scan rate for a given SAMPLE_COUNT:
Initialize DELAY_MICROSECONDS in your sketch:
const unsigned int RowDelay::DELAY_MICROSECONDS = 1000;
Intantiate DELAY_MICROSECONDS in your sketch:
ScanDelay scanDelay(1000);
Add this to the sketch's loop() function:
debug.print_microseconds_per_scan();
Compile and load the sketch into the microcontroller; microseconds_per_scan is printed every second.
@@ -24,22 +22,23 @@ Cherry MX specifies 5msec bounce time http://www.cherrycorp.com/english/switches
hasu measured Cherry MX bounce times .3ms to 1.4ms http://geekhack.org/index.php?topic=42385.0
Tactile switch MJTP series bounce 10 ms http://www.apem.com/files/apem/brochures/MJTP_6MM.pdf

The largest allowable DELAY_MICROSECONDS is 65535 (65.535 ms).

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.

The largest allowable DELAY_MICROSECONDS is 65535 (.065535 seconds).

Polling I2C may slow the scan rate enough so that no additional delay is needed:
const unsigned int RowDelay::DELAY_MICROSECONDS = 0;
Polling I2C may slow the scan rate enough so that no additional delay is needed
and scanDelay(0) can be omitted from the loop().

DELAY_MICROSECONDS is static so multiple row types can share it.
For example, primary and secondary matrices would share the same DELAY_MICROSECONDS.
Could put delay directly in loop(), but then it's harder to finding this documentation.
delay(5);
*/
class RowDelay
class ScanDelay
{
private:
static const unsigned int DELAY_MICROSECONDS; //delay between each Row scan for debouncing
public:
const unsigned int DELAY_MICROSECONDS; //delay each loop() for debouncing
public:
ScanDelay(const unsigned int DELAY_MICROSECONDS): DELAY_MICROSECONDS(DELAY_MICROSECONDS) {}
void delay();
};
#endif