//#include "hw_timer.h"

volatile int Dim_Val1 = 2, Dim_Val2 = 3;

hw_timer_t *timer0 = NULL;
hw_timer_t *timer1 = NULL;

// define the GPIO connected with Zero Crossing
//static uint8_t ZC1 = 34;  // Zero crossing i/p
//static uint8_t ZC2 = 35;
#define ZC1 34
#define ZC2 35
// define the GPIO connected with Dimmer o/p
//static unit8_t Dim1 = 22; // Dimmer o/p
//ststic unit8_t Dim2 = 1;
#define Dim1 22
#define Dim2 23


portMUX_TYPE timer0Mux = portMUX_INITIALIZER_UNLOCKED;
portMUX_TYPE timer1Mux = portMUX_INITIALIZER_UNLOCKED;
portMUX_TYPE zc0Mux = portMUX_INITIALIZER_UNLOCKED;
portMUX_TYPE zc1Mux = portMUX_INITIALIZER_UNLOCKED;

// External Interrupts
void IRAM_ATTR Ext_INT1_ISR(){
  // Toggle The LED
  portENTER_CRITICAL_ISR(&zc0Mux);
   digitalWrite(Dim1, HIGH);
   timerWrite(timer0,0);
   timerStart(timer0);
   timerAlarmWrite(timer0, (Dim_Val1 * 1000000), false);
   //timerRestart(timer0);
   
   timerAlarmEnable(timer0);
  portEXIT_CRITICAL_ISR(&zc0Mux);
  }

void IRAM_ATTR Ext_INT2_ISR(){
  // Toggle The LED
  portENTER_CRITICAL_ISR(&zc1Mux);
  digitalWrite(Dim2, HIGH);
  timerAlarmWrite(timer1, (Dim_Val2 * 1000000), false);
  timerRestart(timer1);
  timerAlarmEnable(timer1);
  portEXIT_CRITICAL_ISR(&zc1Mux);
  }

//TImer0 is used to produce a sum of numbers every 0.5 seconds
void IRAM_ATTR onTimer0(){
  portENTER_CRITICAL_ISR(&timer0Mux);
  digitalWrite(Dim1, LOW);
  portEXIT_CRITICAL_ISR(&timer0Mux);
  timerStop(timer0);
 }

//TImer1 is used to generate fibonaccu rows every 0.9 seconds
void IRAM_ATTR onTimer1(){
  portENTER_CRITICAL_ISR(&timer1Mux);
  digitalWrite(Dim2, LOW);
  portEXIT_CRITICAL_ISR(&timer1Mux);
  //timerStop(timer1);
  }

void setup() {
  // 
  pinMode(Dim1, OUTPUT);
  pinMode(Dim2, OUTPUT);
  pinMode(ZC1, INPUT);
  pinMode(ZC2, INPUT);

  attachInterrupt(ZC1, Ext_INT1_ISR, RISING);
  attachInterrupt(ZC2, Ext_INT2_ISR, RISING);

  // put your setup code here, to run once:
  Serial.begin(115200);
  timer0 = timerBegin(0, 80, true);
  timerAttachInterrupt(timer0, &onTimer0, true);
  //timerAlarmWrite(timer0, 10000, false);
  //timerAlarmEnable(timer0);

  timer1 = timerBegin(1, 80, true);
  timerAttachInterrupt(timer1, &onTimer1, true);
  //timerAlarmWrite(timer1, 10000, false);
  //timerAlarmEnable(timer1);
}

void loop() {
 
 // Dim_1 = Dim_Val1 * 1000000;
  //Dim_2 = Dim_Val2 * 1000000;

}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
led1:A
led1:C
led2:A
led2:C