#include <I2cDiscreteIoExpander.h>
#define PIN_PCF_INTERRUPT_INPUT 3
#define PIN_GOT_INTERRUPT_INDICATOR 10
#define ADDRESS_BITS_SETTINGS 0b000
int8_t counter_0=0;
int8_t counter_1=0;
int8_t counter_2=0;
// instantiate I2cDiscreteIoExpander object
I2cDiscreteIoExpander device[3] = {0,1,2};
volatile bool haveInt = false;
void pcfInt() {
haveInt = 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(0,5);
//delay(1000);
//flashLED(1,5);
//flashLED(2,5);
//device.digitalWrite(0xffff);
uint16_t val = device[0].getPorts();
Serial.print("read 0x");
Serial.print(val, HEX);
Serial.println(".");
Serial.println("ATTACHING INT");
attachInterrupt(digitalPinToInterrupt(3), pcfInt, FALLING);
delay(1000);
Serial.println("Clearing any int/mirroring inputs");
mirrorInputOntoOutputs(0);
}
void flashLED(uint8_t deviceno, uint8_t n ) {
for (uint8_t i=0; i<n; i++) {
device[deviceno].digitalWrite(0x7faa);
delay(1000);
device[deviceno].digitalWrite(0xffff);
delay(800);
}
}
uint16_t getChangedInputValue(int8_t dev) {
Serial.println("Got INTerrupt");
device[dev].digitalRead();
return device[dev].getPorts();
}
void mirrorInputOntoOutputs(int8_t dev) {
uint16_t bothports = getChangedInputValue(dev);
uint16_t inputs = lowByte(bothports);
// Mirror the inputs to the outputs
// leave the inputs, as inputs (i.e. writing high)
uint16_t newValue = word(inputs, 0xff) ; // (inputs << 8) | 0xff;
Serial.print("Inputs read as 0x");
Serial.print(inputs, HEX);
Serial.println(" being mirrored to out");
device[dev].digitalWrite(newValue);
Serial.print("Wrote 2 bytes: port0 -> 0x");
Serial.print(lowByte(newValue), HEX);
Serial.print(" port1 -> 0x");
Serial.println(highByte(newValue), HEX);
}
void loop() {
if (haveInt) {
haveInt = false;
digitalWrite(PIN_GOT_INTERRUPT_INDICATOR, HIGH);
mirrorInputOntoOutputs(0);
} else {
digitalWrite(PIN_GOT_INTERRUPT_INDICATOR, LOW);
}
//device(0b000);
counter_0++;
if (counter_0 > 0xff) {
counter_0 = 0;
}
device[0].digitalWrite((counter_0 << 8)+ counter_0);
delay(50);
device[0].digitalWrite(0xffff);
//device(0b001);
counter_1 += 2;
if (counter_1 > 0xff) {
counter_1 = 0;
}
device[1].digitalWrite((counter_1 << 8)+ counter_1);
delay(50);
device[1].digitalWrite(0xffff);
//device(0b010);
counter_2 +=3;
if (counter_2 > 0xff) {
counter_2 = 0;
}
device[2].digitalWrite((counter_2 << 8)+ counter_2);
delay(50);
device[2].digitalWrite(0xffff);
//for (int8_t i = 0; i< 0xff;i++) {
// device.digitalWrite((i<<8)+i);
// delay(50);
// device.digitalWrite(0xffff);
//}
}
Address bits 2,1
Address bit 0
nINT
interrupt indicator
Address bits 2,1
Address bit 0
nINT
Address bits 2,1
Address bit 0
nINT