#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment object

// button Pins
const int b_reset = 2;
const int b_decr  = 3;
const int b_incr  = 4;

// Power off
const int power = A5;
unsigned long inactiveAtTime = millis();
unsigned long inactivityInterval = 300000; // 5min in milliseconds

// Button readibility var
const int pressed = LOW;

// button hold in milliseconds
int resetInterval = 1000; 

int resetPressedTime;
int resetLastState = 0;
int resetCurrentState = 0;

// Changing number
int number;

// Numberchange speed
int interval = 500; // Default time in millis to wait before next number change is possible. Should be >= maxSpeed
const int originalInterval = interval; // Stores default interval for resetting its value later
const int maxSpeed = 50; // Shortest time possible in millis to wait before next numberchange. Should be <= interval
unsigned long startMillis = 0; // Variable for storing millis


void setup() {
  byte numDigits = 2;
  byte digitPins[] = {8,7};
  byte segmentPins[] = {5, 6, 13, 11, 12, 9, 10};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);

  pinMode(b_decr,  INPUT_PULLUP);
  pinMode(b_incr,  INPUT_PULLUP);
  pinMode(b_reset, INPUT_PULLUP);

  // Power pin
  pinMode(power, OUTPUT);
  digitalWrite(power, HIGH);

  sevseg.blank();
  number = 0;

  Serial.begin(9600);
}

void loop() {
  
  // Inactivity check  //////////////////////////////////////////////////////////////////////////////
  unsigned long inactiveTime = millis() - inactiveAtTime;
  if (inactiveTime > inactivityInterval) {
    analogWrite(power, LOW);
  }
  else {
    Serial.println(inactiveTime);
    delay(10);
  }

  if ( (digitalRead(b_incr) && digitalRead(b_decr) && digitalRead(b_reset)) == 0) {
    inactiveAtTime = millis();
  }
  


  // Reset button ///////////////////////////////////////////////////////////////////////////////////

  resetLastState    = resetCurrentState;
  resetCurrentState = digitalRead(b_reset);

  // Store time when reset button is pressed
  if (resetLastState == 1 && resetCurrentState == 0) {
    resetPressedTime = millis();
  }

  // If pressed more than set resetInterval time, number will be reset to 0
  if (resetCurrentState == 0 && millis() - resetPressedTime > resetInterval) {
    number = 0;
  }



  // Increase button ////////////////////////////////////////////////////////////////////////////////

  if (digitalRead(b_incr) == 0 && millis() - startMillis > interval) {

    // Loop between 0-99 numbers
    if (number != 99) {
      number++;
    } else number = 0;

    // Speed up if on hold
    if (interval > maxSpeed) {
      interval = interval - 50;
    }

    startMillis = millis(); // Store new startMillis after interval of time has passed
  }



  // Decrease button ////////////////////////////////////////////////////////////////////////////////

  if (digitalRead(b_decr) == 0 && millis() - startMillis > interval) {

    // Loop between 0-99 numbers
    if (number != 0) {
      number--;
    } else number = 99;

    // Speed up if on hold
    if (interval > maxSpeed) {
      interval = interval - 50;
    }

    startMillis = millis(); // Store new startMillis after interval of time has passed
  }



  // Reset interval back to its original /////////////////////////////////////////////////////////////

  if ( interval < originalInterval 
        && digitalRead(b_decr) != pressed 
        && digitalRead(b_incr) != pressed ) {
    interval = originalInterval;
  }


  // Update Seven segment displays //////////////////////////////////////////////////////////////////
  sevseg.setNumber(number);
  sevseg.refreshDisplay();


  // Delete delay from real thing
  delay(5);
}