#include "Sevseg.h" //import library Sevseg.h

int digit[10][7] = {{LOW,LOW,LOW,LOW,LOW,LOW,HIGH},
                    {HIGH,LOW,LOW,HIGH,HIGH,HIGH,HIGH},
                    {LOW,LOW,HIGH,LOW,LOW,HIGH,LOW},
                    {LOW,LOW,LOW,LOW,HIGH,HIGH,LOW},
                    {HIGH,LOW,LOW,HIGH,HIGH,LOW,LOW},
                    {LOW,HIGH,LOW,LOW,HIGH,LOW,LOW},
                    {LOW,HIGH,LOW,LOW,LOW,LOW,LOW},
                    {LOW,LOW,LOW,HIGH,HIGH,HIGH,HIGH},
                    {LOW,LOW,LOW,LOW,LOW,LOW,LOW},
                    {LOW,LOW,LOW,LOW,HIGH,LOW,LOW}
                   }; //untuk menampilkan angka 0-9
int pinName[7] = {2,3,4,5,6,7,8}; //deklarasi pin segmen A-G
int pinDigit[4] = {9,10,11,12}; //deklarasi pin digit 1-4
int pinDigitControl[4][4] =  {{HIGH,LOW,LOW,LOW},
                              {LOW,HIGH,LOW,LOW},
                              {LOW,LOW,HIGH,LOW},
                              {LOW,LOW,LOW,HIGH}};
                              //untuk mengaktifkan digit 1-4
const int buttonPin[2] = {18,19}; //deklarasi pin pushbutton
int count = 0; //variabel untuk menyimpan jumlah orang
//variabel untuk menyimpan waktu terjadinya antar interupsi
unsigned long button_time = 0;
unsigned long last_button_time = 0;
int jumlah[4] = {0,0,0,0}; //variabel untuk menampilkan jumlah orang pada seven segmen

//memanggil konstruktor 
Sevseg sevsegku = Sevseg(digit, pinName, pinDigit, pinDigitControl);

void setup(){
  for (int i=0;i<2;i++){
    pinMode(buttonPin[i], INPUT_PULLUP); //mengatur push button interupsi sebagai input_pullup
  }
  Serial.begin(9600);
  //memanggil fungsi attachInterrupt() untuk push button 1 dan 2
  attachInterrupt(digitalPinToInterrupt(buttonPin[0]), button_ISR_1, CHANGE); //sensor masuk
  attachInterrupt(digitalPinToInterrupt(buttonPin[1]), button_ISR_2, CHANGE); //sensor keluar
}

void loop(){
  sevsegku.scan7Seg(jumlah); //untuk mencetak jumlah orang pada seven segmen
}

//fungsi ISR untuk interupsi pertama (sensor masuk)
void button_ISR_1(){
  button_time = millis(); //untuk mendapatkan timestamp
  if (button_time - last_button_time > 250){
    count = count + 1; //increment jumlah orang
    //konversi jumlah orang dalam variabel count ke bentuk matriks jumlah[4]
    jumlah[3] = count % 10;
    if (count >= 10 and count < 100){
      jumlah[2] = count/10; 
    } else if (count >= 100 and count < 1000){
      jumlah[2] = (count/10)%10;
      jumlah[1] = count/100;
    } else{
      jumlah[2] = (count/10)%10;
      jumlah[1] = (count/100)%10;
      jumlah[0] = count/1000;
    }
    //menampilkan pada port serial
    Serial.print("Jumlah orang dalam ruangan: ");
    Serial.println(count);
    last_button_time = button_time;
  }
}

//fungsi ISR untuk interupsi kedua (sensor keluar)
void button_ISR_2(){
  button_time = millis(); //untuk mendapatkan timestamp
  if (button_time - last_button_time > 250){
    count = count - 1; //decrement jumlah orang
    //konversi jumlah orang dalam variabel count ke bentuk matriks jumlah[4]
    jumlah[3] = count % 10;
    if (count < 10){
      jumlah[2] = 0;
    } else if (count >= 10 and count < 100){
      jumlah[2] = count/10;
      jumlah[1] = 0; 
    } else if (count >= 100 and count < 1000){
      jumlah[2] = (count/10)%10;
      jumlah[1] = count/100;
      jumlah[0] = 0;
    } else{
      jumlah[2] = (count/10)%10;
      jumlah[1] = (count/100)%10;
      jumlah[0] = count/1000;
    }
    //menampilkan pada port serial
    Serial.print("Jumlah orang dalam ruangan: ");
    Serial.println(count);
    last_button_time = button_time;
  }
}