#include "ExponentialFilter.h"

#define BUTTON_PIN A0

#define MIN_INPUT 0.0
#define MAX_INPUT 1.0

const float lowerThreshold = 0.293 * (MAX_INPUT - MIN_INPUT);
const float upperThreshold = 0.707 * (MAX_INPUT - MIN_INPUT);

ExpTrigger trigger {
  lowerThreshold, upperThreshold, LTGT
};

ExponentialFilter expButton;
bool toggle;

void OnTrigger(ExpEventArgs e);

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);

  expButton.mode(AUTO);                   // Exponential Filter in Auto Mode
  expButton.cutoffTime(MS2S(5000));         // Debounce Period = 20 milliseconds
  expButton.init(1.0);                    // INPUT/INPUT_PULLUP = 1.0
  expButton.eventOnTrigger(0, OnTrigger);
}

void loop() {
  expButton.filter(digitalRead(BUTTON_PIN));
  expButton.schmittTrigger(&trigger);
  digitalWrite(LED_BUILTIN, toggle);

  SerialPrint();
}

void OnTrigger(ExpEventArgs e) {
  switch (e.state) {
    case UPPER_TRIGGER:
      toggle = !toggle;
      break;
  }
}

void SerialPrint() {
  Serial.println(
    "Input:" + String(expButton.input, 3)
    + ", Output:" + String(expButton.output, 3)
    + ", Lower Threshold:" + String(trigger.lowerThreshold, 3)
    + ", Upper Threshold:" + String(trigger.upperThreshold, 3)
    + ", Trigger:" + String(trigger.trigger, 3)
  );
}