@@ -5,7 +5,7 @@ This project adheres to [Semantic Versioning 2.0.0](http://semver.org/). | |||
keybrd version 0.x.x is for initial development. The public API should not be considered stable. | |||
keybrd version 1.0.0 will be released when the public API is stable. | |||
## [Unreleased][unreleased] | |||
## [Unreleased] | |||
## [0.3.2] - 2016-06-21 | |||
### Added |
@@ -34,26 +34,15 @@ const unsigned int RowBase::DELAY_MICROSECONDS = 500; | |||
//activeHigh has diode cathode (band) on col, and pull down resistors on cols | |||
//0=active low, 1= active high | |||
const bool RowScanner_PinsArray::activeHigh = 0; | |||
//const bool RowScanner_PinsBitwise::activeHigh = 0; | |||
Debug debug; | |||
// ================ LEFT PORTS ================= | |||
// ================= LEFT PINS ================= | |||
uint8_t readPins[] = {14, 15}; | |||
uint8_t READ_PIN_COUNT = sizeof(readPins)/sizeof(*readPins); | |||
LED_PinNumber LED1(16); //Teensy LC pins 16, 17 are 20 ma | |||
LED_PinNumber LED1(16); //Teensy LC pins 16, 17 are 20 mA | |||
// ================ RIGHT PORTS ================ | |||
/* | |||
const uint8_t IOExpanderPort::ADDR = 0x20; | |||
IOExpanderPort portA(0, 0); | |||
RowPort_MCP23018 rowPort(portA); | |||
IOExpanderPort portB(1, 0); | |||
ColPort_MCP23018 colPort(portB, 1<<0 | 1<<1 ); | |||
*/ | |||
// =================== CODES =================== | |||
Code_Sc s_a(KEY_A); | |||
Code_Sc s_b(KEY_B); | |||
@@ -86,8 +75,9 @@ Key* ptrsKeys_R[] = { &s_0, &s_z, &s_z, &s_z, | |||
Key* ptrsKeys_R[] = { &s_0, &s_1, &s_2, &s_3, | |||
&s_4, &s_5, &s_6, &s_7 }; //the most that 8-bit send() can handle | |||
const uint8_t KEY_COUNT = sizeof(ptrsKeys_R)/sizeof(*ptrsKeys_R); | |||
//Row_ShiftRegisters row_R(9, 2, ptrsKeys_R, KEY_COUNT); | |||
Row_ShiftRegisters row_R(9, 1, ptrsKeys_R, KEY_COUNT); //1 byte | |||
Row_ShiftRegisters row_R(9, 1, ptrsKeys_R, KEY_COUNT); // (SS, BYTE_COUNT,,) | |||
// ################### MAIN #################### | |||
void setup() | |||
@@ -99,29 +89,6 @@ void setup() | |||
//delay(1000); //time for OS to detect USB before printing | |||
Keyboard.print(F("activeState.ino ")); | |||
debug.print_free_RAM(); | |||
//Wire.begin(); | |||
/* Teensy LC on 1*bb 6/13/16 copied to: activeState_MCP23018_begin_hangs.no | |||
RowPort_MCP23018::begin() hangs | |||
ColPort_MCP23018::begin() sometimes hangs, sometimes prints after 6 seconds | |||
PCA9655E::begin()s works on 4*bb | |||
maybe hangs if IOE is not attached because endTransmission() waiting for confirmation?? | |||
trouble shooting MCP23018::begin()s | |||
checked wiring against datasheets | |||
measured power and ground, 3.3 volts checks out | |||
!! next things to check could take days: | |||
test MCP23018 with Teensy 2.0, because it worked last year | |||
set Teensy 2.0 to 3.3 volts and test again | |||
try with PCA9655E instead of MCP23018 (works on 4*bb) | |||
might be solder joints on LC (I soldered it), try using other Teensy LC | |||
test MCP23018 on simple demo sketch /home/wolfv/Documents/Arduino/demo_keep/mcp23018_../ | |||
test MCP23018 with signal analyzer | |||
//rowPort.begin(); //this breaks sketch, does not print "activeState.ino ", kb unresponsive | |||
//colPort.begin(RowScanner_PinsBitwise::activeHigh); //hanges for 6 seconds | |||
Keyboard.println(F(" after Port.begin()")); | |||
*/ | |||
} | |||
//uint16_t next = 0; | |||
@@ -137,14 +104,6 @@ void loop() | |||
//row_R0.process(); | |||
//row_R1.process(); | |||
/* used this when debugging MCP23018::begin() hangs | |||
if ( (next < 10) && (elapsed > 1000 * next) ) | |||
{ | |||
Keyboard.print(next); | |||
Keyboard.print(F(" ")); | |||
next++; | |||
} | |||
*/ | |||
//delay(100); | |||
//Keyboard.println(""); | |||
} |
@@ -1,129 +0,0 @@ | |||
/* this works on Teensy LC 1*bb, active low and active high | |||
MCP23018::begin() hangs, details in setup() | |||
| Layout | **0** | **1** | | |||
|:------:|-------|-------| | |||
| **0** | a | b | | |||
| **1** | c | d | | |||
*/ | |||
// ################## GLOBAL ################### | |||
// ================= INCLUDES ================== | |||
#include <Debug.h> | |||
//IOE Ports | |||
#include "IOExpanderPort.h" | |||
#include <RowPort_MCP23018.h> | |||
#include <ColPort_MCP23018.h> | |||
//Codes | |||
#include <Code_Sc.h> | |||
//Matrix | |||
#include <Row_uC.h> | |||
#include <Row_IOE.h> | |||
// =============== CONFIGURATION =============== | |||
const unsigned int RowBase::DELAY_MICROSECONDS = 500; | |||
//activeLow has diode cathode (band) on row | |||
//activeHigh has diode cathode (band) on col, and pull down resistors on cols | |||
//0=active low, 1= active high | |||
const bool RowScanner_PinsArray::activeHigh = 0; | |||
const bool RowScanner_PinsBitwise::activeHigh = 0; | |||
Debug debug; | |||
// ================= uC PINS ================= | |||
uint8_t readPins[] = {14, 15}; | |||
uint8_t READ_PIN_COUNT = sizeof(readPins)/sizeof(*readPins); | |||
// ================ IOE PORTS ================ | |||
const uint8_t IOExpanderPort::ADDR = 0x20; | |||
IOExpanderPort portA(0, 0); | |||
RowPort_MCP23018 rowPort(portA); | |||
IOExpanderPort portB(1, 0); | |||
ColPort_MCP23018 colPort(portB, 1<<0 | 1<<1 ); | |||
// =================== CODES =================== | |||
Code_Sc s_a(KEY_A); | |||
Code_Sc s_b(KEY_B); | |||
Code_Sc s_c(KEY_C); | |||
Code_Sc s_d(KEY_D); | |||
Code_Sc s_0(KEY_0); | |||
Code_Sc s_1(KEY_1); | |||
Code_Sc s_2(KEY_2); | |||
Code_Sc s_3(KEY_3); | |||
// ================= LEFT ROWS ================= | |||
Key* ptrsKeys_L0[] = { &s_a, &s_b }; | |||
Row_uC row_L0(0, readPins, READ_PIN_COUNT, ptrsKeys_L0); | |||
Key* ptrsKeys_L1[] = { &s_c, &s_d }; | |||
Row_uC row_L1(1, readPins, READ_PIN_COUNT, ptrsKeys_L1); | |||
// ================= RIGHT ROWS ================ | |||
Key* ptrsKeys_R0[] = { &s_0, &s_1 }; | |||
Row_IOE row_R0(rowPort, 1<<0, colPort, ptrsKeys_R0); | |||
Key* ptrsKeys_R1[] = { &s_2, &s_3 }; | |||
Row_IOE row_R1(rowPort, 1<<1, colPort, ptrsKeys_R1); | |||
// ################### MAIN #################### | |||
void setup() | |||
{ | |||
Keyboard.begin(); | |||
Wire.begin(); //Wire.begin() must be called before rowPort.begin() colPort.begin() | |||
//delay(1000); //time for OS to detect USB before printing | |||
Keyboard.print(F("activeState.ino ")); | |||
debug.print_free_RAM(); | |||
/* Teensy LC on 1*bb | |||
RowPort_MCP23018::begin() hangs | |||
ColPort_MCP23018::begin() sometimes hangs, sometimes prints after 6 seconds | |||
PCA9655E::begin()s works on 4*bb | |||
maybe hangs if IOE is not attached because endTransmission() waiting for confirmation?? | |||
trouble shooting MCP23018::begin()s | |||
checked wiring against datasheets | |||
measured power and ground, 3.3 volts checks out | |||
!! next things to check could take days: | |||
test MCP23018 with Teensy 2.0, because it worked last year | |||
set Teensy 2.0 to 3.3 volts and test again | |||
try with PCA9655E instead of MCP23018 (works on 4*bb) | |||
might be solder joints on LC (I soldered it), try using other Teensy LC | |||
test MCP23018 on simple demo sketch /home/wolfv/Documents/Arduino/demo_keep/mcp23018_../ | |||
test MCP23018 with signal analyzer | |||
//rowPort.begin(); //this breaks sketch, does not print "activeState.ino ", kb unresponsive | |||
//colPort.begin(RowScanner_PinsBitwise::activeHigh); //hanges for 6 seconds | |||
Keyboard.println(F(" after Port.begin()")); | |||
*/ | |||
} | |||
uint16_t next = 0; | |||
elapsedMillis elapsed; | |||
void loop() | |||
{ | |||
row_L0.process(); | |||
row_L1.process(); | |||
//row_R0.process(); | |||
//row_R1.process(); | |||
/* used this when debugging MCP23018::begin() hangs | |||
if ( (next < 10) && (elapsed > 1000 * next) ) | |||
{ | |||
Keyboard.print(next); | |||
Keyboard.print(F(" ")); | |||
next++; | |||
} | |||
*/ | |||
//delay(500); | |||
//Keyboard.println(""); | |||
} |
@@ -60,7 +60,7 @@ void RowBase::pressRelease(const read_pins_mask_t rowEnd, const read_pins_t debo | |||
{ | |||
read_pins_t isFallingEdge; //bitwise, 1 means falling edge | |||
read_pins_t isRisingEdge; //bitwise, 1 means rising edge | |||
read_pins_t rowMask; //bitwise, active col bit is 1 (same type as rowEnd) | |||
read_pins_mask_t rowMask; //bitwise, active col bit is 1 | |||
uint8_t col; //index for ptrsKeys[col] array | |||
//bit=1 if last debounced changed from 1 to 0, else bit=0 |
@@ -11,11 +11,11 @@ Sets rowEnd and returns rowState. | |||
*/ | |||
read_pins_t RowScanner_SPIShiftRegisters::scan(read_pins_mask_t& rowEnd) | |||
{ | |||
//todo rowEnd, rowState, return int size depend on BYTE_COUNT, like in send() | |||
//todo rowEnd, rowState, return int size depend on BYTE_COUNT, like in send(), set in config_keybrd? | |||
read_pins_t rowState = 0; | |||
digitalWrite(SS, LOW); | |||
digitalWrite(SS, HIGH); | |||
digitalWrite(SS, LOW); //load parallel inputs to the register | |||
digitalWrite(SS, HIGH); //shift the data toward a serial output | |||
SPI.transfer(&rowState, BYTE_COUNT); | |||
rowEnd = 1 << KEY_COUNT; | |||
return rowState; |
@@ -14,8 +14,8 @@ The maximum keys per row is 31, because Arduino's largest type is 32 bits and ro | |||
class RowScanner_SPIShiftRegisters : public RowScannerInterface | |||
{ | |||
private: | |||
const uint8_t SS; //Slave Select, pin on master | |||
const uint8_t BYTE_COUNT; //number of shift registers | |||
const uint8_t SS; //pin on master that selects slave | |||
const uint8_t BYTE_COUNT; //number of bytes to read from shift registers | |||
const uint8_t KEY_COUNT; //number of keys in row | |||
public: | |||
RowScanner_SPIShiftRegisters(const uint8_t SS, uint8_t BYTE_COUNT, uint8_t KEY_COUNT) |
@@ -13,17 +13,17 @@ Using smaller types on a 32-bit uC (Teensy LC) would accomplish nothing. | |||
For RowScanner_SPIShiftRegisters, RowScanner_SPIShiftRegisters::KEY_COUNT | |||
For RowScanner_PinsBitwise, cover the last 1 bit in RowScanner_PinsBitwise::strobePin | |||
*/ | |||
typedef uint8_t read_pins_t; | |||
//typedef uint8_t read_pins_t; | |||
//typedef uint16_t read_pins_t; | |||
//typedef uint32_t read_pins_t; | |||
typedef uint32_t read_pins_t; | |||
/* read_pins_mask_t is only used for rowEnd, which extends one bit beyond the last col pin. | |||
/* read_pins_mask_t is only used for rowMask and rowEnd, which extends one bit beyond the last col pin. | |||
uncomment typedef that covers one bit beyond the last col pin. | |||
This could be the same typedef as read_pins_t, or the next larger typedef. | |||
*/ | |||
typedef uint8_t read_pins_mask_t; | |||
//typedef uint8_t read_pins_mask_t; | |||
//typedef uint16_t read_pins_mask_t; | |||
//typedef uint32_t read_pins_mask_t; | |||
typedef uint32_t read_pins_mask_t; | |||
/* SAMPLE_COUNT = 4 is very reliable for a keyboard. | |||
Split keyboards with a long connecting wire or in environment with |