self_timers.h

self_timers.h
// *************************************************************
// Code for setting up ESP32 Timers
// *************************************************************
// The base clock of timers is 80MHz --> 12.5ns

// jjtimer0      will tic at 10us  ( 10us = 800 * 12.5ns)
// jjtimer1      will tic at 100ns (100ns =   8 * 12.5ns)

// jjtimer0_intr will alarm every jjper0 tics (jjper0 = 100 for alarm rate of 1ms)
// jjtimer1_intr will alarm every jjper1 tics (jjper1 = 10000000 / (jjsound_freq * 2))
// *************************************************************
hw_timer_t *jjtimer0;
hw_timer_t *jjtimer1;

int32_t jjper0;               // jjtimer0 alarm setting
int32_t jjper1;               // jjtimer1 alarm setting

int32_t jjtime_on;            // sound pulse duration
int32_t jjtime_tper;          // sound pulse period

bool    jjsound_on;           // sound pulse itself
int32_t jjsound_freq;         // sound pulse frequency

int32_t jjcnt0;               // sound pulse counter variable

bool    jjstate1;             // jjtimer1 toggle state variable
bool    jjstate2;             // jjtimer1 toggle state variable
bool    jjspk;

uint8_t jjbdx;
uint8_t jjbnum;

void IRAM_ATTR jjtimer0_intr() {
  if (jjcnt0 == 0) {
    jjsound_on = true;
    jjbdx = (jjbdx + 1) % jjbnum;
  } else if (jjcnt0 == jjtime_on) {
    jjsound_on = false;
  }

  jjcnt0 = jjcnt0 + 1;
  if (jjcnt0 >= jjtime_tper) {
    jjcnt0 = 0;
  }

}

void IRAM_ATTR jjtimer1_intr() {
  if (jjsound_on) {
    jjstate1 = !jjstate1;
    if (jjstate1) {
      jjstate2 = !jjstate2;
    }
  } else {
    jjstate1 = false;
    jjstate2 = false;
  }
  jjspk = (jjbdx == 0) ? jjstate1 : jjstate2;
  digitalWrite(SPK_PIN, jjspk);
}


void jjsetup() {
  jjtimer0 = timerBegin(0, 800, true);
  timerAttachInterrupt(jjtimer0, &jjtimer0_intr, true);
  timerAlarmDisable(jjtimer0);

  jjtimer1 = timerBegin(1, 8, true);
  timerAttachInterrupt(jjtimer1, &jjtimer1_intr, true);
  timerAlarmDisable(jjtimer1);

  // jjtimer0 activates 100 tics --> 100 * 10us = 1ms
  jjper0 = 100;

  // jjtimer1 activates 2 times per period of jjsound_freq;
  jjsound_freq = 440;
  jjper1 = 10000000 / (jjsound_freq * 2);

  jjstate1 = false;
  jjstate2 = false;

  jjbnum = 4;
  jjbdx  = 0;

}

void jjenable0() {
  timerAlarmWrite(jjtimer0, jjper0, true);
  timerAlarmEnable(jjtimer0);
}

void jjenable1() {
  jjper1 = 10000000 / (jjsound_freq * 2);
  jjstate1 = false;
  jjstate2 = false;
  timerAlarmWrite(jjtimer1, jjper1, true);
  timerAlarmEnable(jjtimer1);
}

void jjdisable0() {
  timerAlarmDisable(jjtimer0);
}

void jjdisable1() {
  timerAlarmDisable(jjtimer1);
}


void jjTurnOn() {
  jjsound_on  = false;
  jjcnt0      = 0;
  jjtime_on   = 200;
  jjtime_tper = 600;
  jjenable0();
  jjenable1();
}

void jjTurnOff() {
  jjdisable1();
  jjdisable0();
}


void jjTurnOn_kitchen(uint32_t tlength) {
  jjbnum      = 1;
  jjbdx       = 0;
  jjsound_on  = false;
  jjcnt0      = 1;
  jjtime_on   = 0;
  jjtime_tper = tlength;
  jjenable0();
  jjenable1();
}

void jjTurnOff_kitchen() {
  jjdisable1();
  jjdisable0();
  jjsound_on = false;
}


void jjTurnOn_metronome(uint16_t bpm, uint16_t cnt, uint16_t frq) {
  jjbnum       = cnt;
  jjsound_freq = frq;

  jjbdx       = jjbnum - 1;
  jjsound_on  = false;
  jjcnt0      = 0;
  jjtime_tper = 60000/bpm;
  jjtime_on   = jjtime_tper / 2;
  if (jjtime_tper > 400) {
    jjtime_on = 200;
  } else {
    jjtime_on = jjtime_tper / 2;
  }
  jjenable0();
  jjenable1();
}

void jjTurnOff_metronome() {
  jjdisable1();
  jjdisable0();
  jjsound_on = false;
}

// *************************************************************