Skip to content
Snippets Groups Projects
Select Git revision
  • aaf7c677538f19fbbcee373b9703310f57901f43
  • master default protected
2 results

merge_db.sh

Blame
  • led_controller.h 2.87 KiB
    class LED_controller
    {
    public:
        LED_controller(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 LED_chain
    {
    public:
        LED_chain(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;
    };