A small class that given a sampling of a binary state reports whether that state rose, fell, remained high, or remained low.
class edgeGizmo
{
public:
enum class edgeState { RISE, HIGH, FALL, LOW };
edgeGizmo() : prev(edgeState::LOW) {};
edgeState update(bool pressed)
{
using is = edgeState;
switch(prev)
{
case is::RISE:
{
prev = pressed ? is::FALL : is::HIGH;
} break;
case is::FALL:
{
prev = pressed ? is::LOW : is::RISE;
} break;
case is::HIGH:
{
prev = pressed ? is::FALL : is::HIGH;
} break;
case is::LOW:
{
prev = pressed ? is::LOW : is::RISE;
} break;
}
return prev;
}
edgeState peek()
{
return prev;
}
private:
edgeState prev;
};