#include DigitalOutputCard::DigitalOutputCard(uint8_t address) { this->address = address; } // Instantiate the card with the specified position on the dip switch DigitalOutputCard::DigitalOutputCard(bool bit0, bool bit1, bool bit2, bool bit3, bool bit4) { this->address = 0x20; if (bit0) this->address += 1; if (bit1) this->address += 2; if (bit2) this->address += 4; if (bit3) this->address += 8; if (bit4) this->address += 16; } // Initialize the card bool DigitalOutputCard::begin() { this->pwm = Adafruit_PWMServoDriver(this->address); this->pwm.begin(); pwm.reset(); pwm.setOutputMode(true); // Output card don't send ack, we can't check if it's connected // so we just return true return true; } // Set the output to the specified state void DigitalOutputCard::digitalWrite(uint8_t pin, bool state) { this->pwm.setPin(pin, state ? 4095 : 0); this->state_buffer[pin] = state; this->value_buffer[pin] = state ? 4095 : 0; } // Set the output to the specified pwm value void DigitalOutputCard::analogWrite(uint8_t pin, uint16_t value) { // If value is greater than 4095, set it to 4095 if (value > 4095) value = 4095; // Set the pwm value this->pwm.setPin(pin, value); this->state_buffer[pin] = value > 0; this->value_buffer[pin] = value; } // Dummy loop function void DigitalOutputCard::loop() { } // Get the state of the specified pin bool DigitalOutputCard::getState(uint8_t pin) { return this->state_buffer[pin]; } // Get the pwm value of the specified pin uint16_t DigitalOutputCard::getValue(uint8_t pin) { return this->value_buffer[pin]; } // Get type of card uint8_t DigitalOutputCard::getType() { return CARD_TYPE_DIGITAL_OUTPUT; }