/*** readyled.h  -*- C -*- */
/** Blinking Ready LED. */

/*** Ivan Shmakov, 2019 */

/*** Code */
#ifndef READYLED_H
#define READYLED_H

#include <machine.h>

/** Use PD3 for RDY LED by default */
#ifndef READYLED_PORT_SHIFT
#define READYLED_PORT_SHIFT (27)
#endif
#ifndef READYLED_PORT_MASK
#define READYLED_PORT_MASK  (1L << READYLED_PORT_SHIFT)
#endif
#ifndef READYLED_PORT_INVERSE
#define READYLED_PORT_INVERSE (1)
#endif
#ifndef READYLED_PORT_ON
#define READYLED_PORT_ON  ((READYLED_PORT_INVERSE) ? 0 : (READYLED_PORT_MASK))
#endif
#ifndef READYLED_PORT_OFF
#define READYLED_PORT_OFF ((READYLED_PORT_ON) ^ (READYLED_PORT_MASK))
#endif

/** Turn RDY LED off for DELAY ticks, then ensure off for - PAUSE */
#ifndef READYLED_DELAY
#define READYLED_DELAY   (3)
#endif
#ifndef READYLED_PAUSE
#define READYLED_PAUSE   (-7)
#endif

static int_least8_t readyled_wait = 0;

static void
readyled_tick (void)
{
  if (readyled_wait < READYLED_PAUSE || --readyled_wait != 0) {
    return;
  }
  machine_port_write (READYLED_PORT_ON, READYLED_PORT_MASK);
}

static void
readyled_blink (void)
{
  if (readyled_wait > READYLED_PAUSE) {
    return;
  }
  readyled_wait
    = READYLED_DELAY;
  machine_port_write (READYLED_PORT_OFF, READYLED_PORT_MASK);
}

#endif
/*** readyled.h ends here */
