Skip to content
Snippets Groups Projects
pins.cpp 1.99 KiB
Newer Older
#include "pins.hpp"

MCP23S08 MCP(SS, MISO, MOSI, SCK);
volatile byte ISR_FLAG = 0;
struct pins PINS;

Cyril Danilevski's avatar
Cyril Danilevski committed
void IRAM_ATTR isr() { ISR_FLAG = 1; }
Cyril Danilevski's avatar
Cyril Danilevski committed
void initializeMCP() {
    pinMode(ISR_PIN, INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(ISR_PIN), isr, CHANGE);
Cyril Danilevski's avatar
Cyril Danilevski committed
    SPI.begin();
    MCP.begin();
Cyril Danilevski's avatar
Cyril Danilevski committed
    // Enable inputs and interrupts on pins 0-2
    MCP.pinMode8(0b00000111);
    MCP.enableInterrupt(0, CHANGE);
    MCP.enableInterrupt(1, CHANGE);
    MCP.enableInterrupt(2, CHANGE);
    Serial.println("MCP23S08 Started");
Cyril Danilevski's avatar
Cyril Danilevski committed
void isr_check_loop() {
    if (ISR_FLAG == 1) {
        PINS.sib = false;
        PINS.plc = false;
        PINS.ups = false;
        PINS.last_triggered = millis();

        Serial.print("Interrupt: ");
        uint8_t regval = MCP.getInterruptCaptureRegister();  // INTCAP
        Serial.print(regval, BIN);

        uint8_t mask = 1 << 0;
        if (!(regval & mask)) {
            Serial.print(" UPS");
            PINS.ups = true;
        }

        mask = 1 << 1;
        if (!(regval & mask)) {
            Serial.print(" PLC");
            PINS.plc = true;
        }

        mask = 1 << 2;
        if (!(regval & mask)) {
            Serial.print(" SIB");
            PINS.sib = true;
        }

        Serial.println();
        ISR_FLAG = 0;
Cyril Danilevski's avatar
Cyril Danilevski committed
void poll_port_expander() {
    PINS.sib = false;
    PINS.plc = false;
    PINS.ups = false;
    PINS.last_triggered = millis();
    int regval = MCP.read8();
Cyril Danilevski's avatar
Cyril Danilevski committed

    uint8_t mask = 1 << 0;
    if (!(regval & mask)) {
Cyril Danilevski's avatar
Cyril Danilevski committed
        Serial.print(" UPS");
        PINS.ups = true;
    }

    mask = 1 << 1;
    if (!(regval & mask)) {
Cyril Danilevski's avatar
Cyril Danilevski committed
        Serial.print(" PLC");
        PINS.plc = true;
    }

    mask = 1 << 2;
    if (!(regval & mask)) {
Cyril Danilevski's avatar
Cyril Danilevski committed
        Serial.print(" SIB");
        PINS.sib = true;
bool on = true;
unsigned long toggle_start = 0;
void toggle_status_led() {
Cyril Danilevski's avatar
Cyril Danilevski committed
    if (millis() - toggle_start >= 1000) {
        toggle_start = millis();
Cyril Danilevski's avatar
Cyril Danilevski committed
        on = !on;
        MCP.write1(STATUS_LED_PIN, on);
Cyril Danilevski's avatar
Cyril Danilevski committed
    }