#include "c_types.h"
#include "os_type.h"
#include "eagle_soc.h"
#include "osapi.h"
#include "gpio.h"
#define RestartOnAnyImpulse 1
/*
по сигналу на ноге МК должен запускаться таймер0, который по истечении заданного времени должен запускать таймер1 и установку одного из выходов МК в HIGH.
Таймер1 после истечении заданного времени должен сбрасывать ранее установленного выхода МК в LOW.
*/
#define GPIO_INP 4
#define GPIO_OUT 5
#define interval_t0_ms 10
#define interval_t1_ms 25
ETSTimer timer0, timer1;
void IRAM_ATTR gpioIsr(void *par1, void *par2) {
(void) par1; (void) par2;
uint32_t status = GPIE;
GPIEC = status; // clear gpio interrupts
if (status != 0) {
#if ResetOnAnyImpulse
ets_isr_mask(1 << ETS_GPIO_INUM);
#endif
os_timer_arm(&timer0, interval_t0_ms, 0);
digitalWrite(GPIO_OUT, LOW);
}
}
void IRAM_ATTR timer0_callback(void *par) {
(void) par;
digitalWrite(GPIO_OUT, HIGH);
os_timer_arm(&timer1, interval_t1_ms, 0);
}
void IRAM_ATTR timer1_callback(void *par) {
(void) par;
digitalWrite(GPIO_OUT, LOW);
gpio_pin_intr_state_set(GPIO_INP, GPIO_PIN_INTR_POSEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE | GPIO_PIN_INTR_ANYEDGE | GPIO_PIN_INTR_LOLEVEL | GPIO_PIN_INTR_HILEVEL| GPIO_PIN_INTR_DISABLE
#if !ResetOnAnyImpulse
uint32_t status = GPIE;
GPIEC = status; // clear gpio interrupts
ets_isr_unmask(1 << ETS_GPIO_INUM);
#endif
}
void setup() {
os_timer_setfn(&timer0, timer0_callback, NULL);
os_timer_setfn(&timer1, timer1_callback, NULL);
pinMode(GPIO_INP, INPUT);
pinMode(GPIO_OUT, OUTPUT);
digitalWrite(GPIO_OUT, LOW);
ets_isr_mask(1 << ETS_GPIO_INUM);
gpio_pin_intr_state_set(GPIO_INP, GPIO_PIN_INTR_POSEDGE); // GPIO_PIN_INTR_POSEDGE | GPIO_PIN_INTR_NEGEDGE | GPIO_PIN_INTR_DISABLE
ets_isr_attach(ETS_GPIO_INUM, gpioIsr, NULL);
ets_isr_unmask(1 << ETS_GPIO_INUM);
}
void loop() {
// put your main code here, to run repeatedly:
}