Skip to content

File digital_control.h

File List > external-docs > libDaisy > src > hid > digital_control.h

Go to the documentation of this file

Source Code

#pragma once
#include "sys/system.h"

namespace daisy
{
struct DigitalControl
{
    uint8_t  state_;
    bool     flip_;
    uint32_t rising_edge_time_;

    DigitalControl() {}

    inline void Init(bool flip)
    {
        flip_  = flip;
        state_ = 0x00;
    }

    inline void Debounce(bool input)
    {
        uint8_t in_val;
        if(flip_)
            in_val = input ? 0 : 1;
        else
            in_val = input ? 1 : 0;
        state_ = (state_ << 1) | in_val;
        if(RisingEdge())
        {
            rising_edge_time_ = System::GetNow();
        }
    }

    inline bool RisingEdge() const { return state_ == 0x7f; }
    inline bool FallingEdge() const { return state_ == 0x80; }
    inline bool Pressed() const { return state_ == 0xff; }

    inline uint32_t TimeHeldMs() const
    {
        return Pressed() ? System::GetNow() - rising_edge_time_ : 0;
    }
};

} // namespace daisy