Browse Source

replace Port_*::write() with setHigh() and setLow(), and move strobe logic from Port_*::write() to Scanner_IOE::scan()

tags/v0.6.4
wolfv6 7 years ago
parent
commit
e92716e263

examples/IOE_PCA9655E_development/PCA9655E_5_keybrd/keybrd_PCA9655E.ino → examples/IOE_PCA9655E_development/PCA9655E_5_keybrd/PCA9655E_5_keybrd.ino View File

@@ -1,4 +1,4 @@
/* keybrd_PCA9655E.ino
/* PCA9655E_5_keybrd.ino
keyboard layout is same as top-left keys of DH matrices:

Controller I/O expander
@@ -90,9 +90,9 @@ Row row_R1(scanner_R, 1<<1, ptrsKeys_R1, KEY_COUNT_R1);
void setup()
{
delay(6000);
Keyboard.print("keybrd_PCA9655E.ino ");
Keyboard.print("PCA9655E_5_keybrd.ino ");

//Keyboard.begin(); not needed ?? it's in DH mainSketch.cpp and keybrd_4c_split_keyboard_with_IOE.ino
//Keyboard.begin();todo not needed ?? it's in DH mainSketch.cpp and keybrd_4c_split_keyboard_with_IOE.ino
scanner_R.begin();
}


+ 2
- 2
src/LED_Port.cpp View File

@@ -2,10 +2,10 @@

void LED_Port::on()
{
refPort.write(pin, HIGH);
refPort.setHigh(pin);
}

void LED_Port::off()
{
refPort.write(pin, LOW);
refPort.setLow(pin);
}

+ 2
- 1
src/PortInterface.h View File

@@ -17,7 +17,8 @@ class PortInterface : public PortWriteInterface
public:
virtual void beginProtocol()=0; //SPI bus or I2C bus
virtual void begin(const uint8_t strobeOn)=0; //configure GPIO pins
virtual void write(const uint8_t pin, const bool pinLogicLevel)=0;
virtual void setLow(const uint8_t pin)=0;
virtual void setHigh(const uint8_t pin)=0;
virtual uint8_t read()=0;
};
#endif

+ 2
- 1
src/PortWriteInterface.h View File

@@ -14,6 +14,7 @@ write() interface emulates Arduino's digitalWrite().
class PortWriteInterface
{
public:
virtual void write(const uint8_t pin, const bool pinLogicLevel)=0;
virtual void setLow(const uint8_t pin)=0;
virtual void setHigh(const uint8_t pin)=0;
};
#endif

+ 17
- 13
src/Port_MCP23018.cpp View File

@@ -39,21 +39,25 @@ void Port_MCP23018::begin(const uint8_t strobeOn)
Wire.endTransmission();
}
/* write() sets pin output to logicLevel.
pin is bit pattern, where pin being strobed is 1.
logicLevel is HIGH or LOW.
write() does not overwrite the other pins.
/* setLow() sets pin output LOW.
pin is bit pattern, where pin being set is 1.
*/
void Port_MCP23018::write(const uint8_t pin, const bool logicLevel)
void Port_MCP23018::setLow(const uint8_t pin)
{
if (logicLevel == LOW)
{
outputVal &= ~pin; //set pin output to low
}
else
{
outputVal |= pin; //set pin output to high
}
outputVal &= ~pin; //set pin output to low
Wire.beginTransmission(deviceAddr);
Wire.write(portNum + 0x12); //GPIO
Wire.write(outputVal);
Wire.endTransmission();
}
/* setHigh() sets pin output HIGH.
pin is bit pattern, where pin being set is 1.
*/
void Port_MCP23018::setHigh(const uint8_t pin)
{
outputVal |= pin; //set pin output to high
Wire.beginTransmission(deviceAddr);
Wire.write(portNum + 0x12); //GPIO

+ 2
- 1
src/Port_MCP23018.h View File

@@ -42,7 +42,8 @@ class Port_MCP23018 : public PortInterface
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
void beginProtocol();
void begin(const uint8_t strobeOn);
virtual void write(const uint8_t pin, const bool logicLevel);
virtual void setLow(const uint8_t pin);
virtual void setHigh(const uint8_t pin);
virtual uint8_t read();
};
#endif

+ 11
- 12
src/Port_MCP23S17.cpp View File

@@ -52,22 +52,21 @@ void Port_MCP23S17::begin(const uint8_t strobeOn)
transfer(deviceAddr << 1, portNum + 0x0C, pullUp); //configure GPPU
}

/* write() sets pin output to logicLevel (useful for strobePin, one LED pin, or multiple pins).
/* setLow() sets pin output LOW.
pin is bit pattern, where pin being set is 1.
logicLevel is HIGH or LOW.
write() does not overwrite the other pins.
*/
void Port_MCP23S17::write(const uint8_t pin, const bool logicLevel)
void Port_MCP23S17::setLow(const uint8_t pin)
{
if (logicLevel == LOW)
{
outputVal &= ~pin; //set pin output to low
}
else
{
outputVal |= pin; //set pin output to high
}
outputVal &= ~pin; //set pin output to low
transfer(deviceAddr << 1, portNum + 0x12, outputVal); //set GPIO port to outputVal
}

/* setHigh() sets pin output HIGH.
pin is bit pattern, where pin being set is 1.
*/
void Port_MCP23S17::setHigh(const uint8_t pin)
{
outputVal |= pin; //set pin output to high
transfer(deviceAddr << 1, portNum + 0x12, outputVal); //set GPIO port to outputVal
}


+ 2
- 1
src/Port_MCP23S17.h View File

@@ -46,7 +46,8 @@ class Port_MCP23S17 : public PortInterface
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
void beginProtocol();
void begin(const uint8_t strobeOn);
virtual void write(const uint8_t pin, const bool logicLevel);
virtual void setLow(const uint8_t pin);
virtual void setHigh(const uint8_t pin);
virtual uint8_t read();
};
#endif

+ 17
- 13
src/Port_PCA9655E.cpp View File

@@ -25,21 +25,25 @@ void Port_PCA9655E::begin(const uint8_t strobeOn)
Wire.endTransmission();
}
/* write() sets pin output to logicLevel.
pin is bit pattern, where pin being strobed is 1.
logicLevel is HIGH or LOW.
write() does not overwrite the other pins.
/* setLow() sets pin output LOW.
pin is bit pattern, where pin being set is 1.
*/
void Port_PCA9655E::write(const uint8_t pin, const bool logicLevel)
void Port_PCA9655E::setLow(const uint8_t pin)
{
if (logicLevel == LOW)
{
outputVal &= ~pin; //set pin output to low
}
else
{
outputVal |= pin; //set pin output to high
}
outputVal &= ~pin; //set pin output to low
Wire.beginTransmission(deviceAddr);
Wire.write(portNum + 2); //output Byte command
Wire.write(outputVal);
Wire.endTransmission();
}
/* setHigh() sets pin output HIGH.
pin is bit pattern, where pin being set is 1.
*/
void Port_PCA9655E::setHigh(const uint8_t pin)
{
outputVal |= pin; //set pin output to high
Wire.beginTransmission(deviceAddr);
Wire.write(portNum + 2); //output Byte command

+ 2
- 1
src/Port_PCA9655E.h View File

@@ -46,7 +46,8 @@ class Port_PCA9655E : public PortInterface
: deviceAddr(deviceAddr), portNum(portNum), outputVal(0), readPins(readPins) {}
void beginProtocol();
void begin(const uint8_t strobeOn);
virtual void write(const uint8_t pin, const bool logicLevel);
virtual void setLow(const uint8_t pin);
virtual void setHigh(const uint8_t pin);
virtual uint8_t read();
};
#endif

+ 17
- 9
src/Port_ShiftRegs.cpp View File

@@ -14,16 +14,24 @@ void Port_ShiftRegs::begin()
SPI.begin();
}

void Port_ShiftRegs::write(const uint8_t pin, const bool logicLevel)
/* setLow() sets pin output LOW.
pin is bit pattern, where pin being set is 1.
*/
void Port_ShiftRegs::setLow(const uint8_t pin)
{
outputVal &= ~pin; //set pin output to low

digitalWrite(slaveSelect, LOW);
SPI.transfer(outputVal);
digitalWrite (slaveSelect, HIGH);
}

/* setHigh() sets pin output HIGH.
pin is bit pattern, where pin being set is 1.
*/
void Port_ShiftRegs::setHigh(const uint8_t pin)
{
if (logicLevel == LOW)
{
outputVal &= ~pin; //set pin output to low
}
else
{
outputVal |= pin; //set pin output to high
}
outputVal |= pin; //set pin output to high

digitalWrite(slaveSelect, LOW);
SPI.transfer(outputVal);

+ 2
- 1
src/Port_ShiftRegs.h View File

@@ -16,6 +16,7 @@ class Port_ShiftRegs : public PortWriteInterface
public:
Port_ShiftRegs(const uint8_t slaveSelect);
void begin();
void write(const uint8_t pin, const bool logicLevel);
void setLow(const uint8_t pin);
void setHigh(const uint8_t pin);
};
#endif

+ 14
- 3
src/Scanner_IOE.cpp View File

@@ -26,18 +26,29 @@ read_pins_t Scanner_IOE::scan(const uint8_t strobePin)
uint8_t readState; //bits, 1 means key is pressed, 0 means released

//strobe on
refPortWrite.write(strobePin, activeState);
if (activeState == LOW) //if active low
{
refPortWrite.setLow(strobePin);
}
else //if active high
{
refPortWrite.setHigh(strobePin);
}
delayMicroseconds(3); //time to stabilize voltage

//read the port pins
readState = refPortRead.read();

//strobe off
refPortWrite.write(strobePin, !activeState);

if (activeState == LOW) //if active low
{
refPortWrite.setHigh(strobePin);
readState = ~readState;
}
else //if active high
{
refPortWrite.setLow(strobePin);
}

return readState;
}