Skip to content
Snippets Groups Projects
Select Git revision
  • c017462357f4c4e93e13df0ca09c6ed266885536
  • main default protected
2 results

led_controller.h

Blame
  • led_controller.h 2.92 KiB
    #ifndef LEDCONTROLLER_H
    #define LEDCONTROLLER_H
    
    class LEDController
    {
    public:
        LEDController(byte aPin) : PIN(aPin) { pinMode(aPin, OUTPUT); };
        void switch_to(bool b) { digitalWrite(PIN, b); };
        byte read_pin_state() { return digitalRead(PIN); };
        void on() { switch_to(HIGH); };
        void off() { switch_to(LOW); };
        void toggle() { switch_to(!read_pin_state()); };
    
        void blink(uint16_t interval)
        {
            if ((millis() - timestamp) > interval)
            {
                digitalWrite(PIN, !digitalRead(PIN));
                timestamp = millis();
            }
        };
    
        void blink(uint16_t interval_off, uint16_t interval_on)
        {
            switch (digitalRead(PIN))
            {
            case HIGH:
                if ((millis() - timestamp) > interval_on)
                {
                    digitalWrite(PIN, !digitalRead(PIN));
                    timestamp = millis();
                }
                break;
            case LOW:
                if ((millis() - timestamp) > interval_off)
                {
                    digitalWrite(PIN, !digitalRead(PIN));
                    timestamp = millis();
                }
                break;
            }
        }
    
    private:
        const byte PIN;
        uint32_t timestamp;
    };
    
    enum Chainmode
    {
        LEFT,
        RIGHT,
        TOGGLE
    };
    
    class LEDChain
    {
    public:
        LEDChain(byte aPin_count, byte aPin_chain[], Chainmode chainmode = RIGHT) : PIN_CHAIN(aPin_chain), PIN_COUNT(aPin_count), chainmode(chainmode)
        {
            for (byte i = 0; i < aPin_count; i++)
                pinMode(aPin_chain[i], OUTPUT);
        };
        void run(uint16_t interval)
        {
            if ((millis() - timestamp) > interval)
            {
                digitalWrite(PIN_CHAIN[active_chain_index], LOW);
                timestamp = millis();
                active_chain_index = next_pin(PIN_COUNT, &direction, active_chain_index, chainmode);
            }
            else
            {
                digitalWrite(PIN_CHAIN[active_chain_index], HIGH);
            }
        }
        void set_chainmode(Chainmode cm) { chainmode = cm; };
        void on()
        {
            for (byte i = 0; i < PIN_COUNT; i++)
                digitalWrite(PIN_CHAIN[i], HIGH);
        };
        void off()
        {
            for (byte i = 0; i < PIN_COUNT; i++)
                digitalWrite(PIN_CHAIN[i], LOW);
        };
    
    private:
        int8_t next_pin(int8_t aCount, int8_t *aDir, int8_t aIndex, Chainmode aMode)
        {
            switch (aMode)
            {
            case RIGHT:
                return (aIndex + 1) % aCount;
                break;
            case LEFT:
                if (aIndex <= 0)
                    return aCount - 1;
                else
                    return (aIndex - 1) % aCount;
                break;
            case TOGGLE:
                if ((aIndex <= 0) || (aIndex >= aCount - 1))
                    direction *= -1;
                return aIndex + direction;
                break;
            default:
                return aIndex;
            }
        };
        const byte *PIN_CHAIN;
        const byte PIN_COUNT;
        Chainmode chainmode;
        int8_t active_chain_index = 0;
        uint32_t timestamp;
        int8_t direction = -1;
    };
    
    #endif