#include <I2cDiscreteIoExpander.h>
#define PIN_PCF_INTERRUPT_INPUT 3
#define PIN_GOT_INTERRUPT_INDICATOR 10
// instantiate I2cDiscreteIoExpander object
I2cDiscreteIoExpander device[3] = {0b000, 0b001,0b010};
volatile bool haveInt[3]= {false,false, false};
void pcfInt0() {
haveInt[0] = true;
}
void pcfInt1() {
haveInt[1] = true;
}
void pcfInt2() {
haveInt[2] = true;
}
void setup()
{
// initialize i2c interface
Wire.begin();
// initialize serial interface
Serial.begin(115200);
device[0].disableBitwiseInversion();
device[1].disableBitwiseInversion();
device[2].disableBitwiseInversion();
pinMode(PIN_PCF_INTERRUPT_INPUT, INPUT);
pinMode(PIN_GOT_INTERRUPT_INDICATOR, OUTPUT);
flashLED(5);
device[0].digitalWrite(0xffff);
device[1].digitalWrite(0xffff);
device[2].digitalWrite(0xffff);
Serial.println("ATTACHING INTs");
attachInterrupt(digitalPinToInterrupt(2), pcfInt0, FALLING);
attachInterrupt(digitalPinToInterrupt(3), pcfInt1, FALLING);
attachInterrupt(digitalPinToInterrupt(4), pcfInt2, FALLING);
delay(1000);
Serial.println("Clearing any int/mirroring inputs");
mirrorInputOntoOutputs(0);
mirrorInputOntoOutputs(1);
mirrorInputOntoOutputs(2);
}
void flashLED(uint8_t n) {
for (uint8_t i=0; i<n; i++) {
device[0].digitalWrite(0x7fff);
delay(100);
device[0].digitalWrite(0xffff);
delay(80);
}
}
uint16_t getChangedInputValue(uint8_t idx) {
Serial.println("Got INTerrupt");
//device[].digitalRead();
device[idx].digitalRead();
return device[idx].getPorts();
}
void mirrorInputOntoOutputs(uint8_t idx) {
uint16_t bothports = getChangedInputValue(idx);
//uint16_t Linputs = lowByte(bothports);
uint16_t Linputs = bothports;
Serial.print("[");
Serial.print(Linputs, HEX);
Serial.println("]");
// Mirror the inputs to the outputs
// leave the inputs, as inputs (i.e. writing high)
// uint16_t newValue = word(Linputs, 0xff) ; // (inputs << 8) | 0xff;
uint16_t newValue = Linputs ;
Serial.print("Inputs read as 0x");
Serial.print(Linputs, HEX);
Serial.println(" being mirrored to out");
device[0].digitalWrite(newValue);
Serial.print("Wrote 2 bytes: port0 -> 0x");
Serial.print(lowByte(newValue), HEX);
Serial.print(" port1 -> 0x");
Serial.print(highByte(newValue), HEX);
Serial.print(" to device ");
Serial.println((int)idx);
}
bool handleInt(uint8_t idx) {
if (haveInt[idx]) {
haveInt[idx] = false;
mirrorInputOntoOutputs(idx);
return true;
}
return false;
}
void loop() {
if (handleInt(0) || handleInt(1) || handleInt(2)) {
digitalWrite(PIN_GOT_INTERRUPT_INDICATOR, HIGH);
} else {
digitalWrite(PIN_GOT_INTERRUPT_INDICATOR, LOW);
}
delay(50);
}
Address bits 001
nINT
interrupt indicator
Address bits 000
nINT
Address bits 001
nINT