#include "archinc.h"
#include "eventq.h"
#include "rtcregs.h"
#include "olimex.h"

#ifdef CONFIG_BOARD_OLIMEX_P213X

/* Olimex LPC-P213X board */

#define YELLOW_LED_MASK (0x00001000)
#define GREEN_LED_MASK  (0x00002000)

static boolean greenLedState  = false;
static boolean yellowLedState = false;

static void handleLedOnEvent(void);
static void handleLedOffEvent(void);

int olimexInit(void)
{
  PINSEL0 = (unsigned long)0x00000055;
#ifdef CONFIG_INCLUDE_LPC213X_SSP
  PINSEL1 = (unsigned long)0x000002A9;
#else
  PINSEL1 = (unsigned long)0x00000001;
#endif
  IO0CLR   = (unsigned long)0x00000000;
  IO0SET   = (unsigned long)(YELLOW_LED_MASK | GREEN_LED_MASK); // make LEDs outputs
  IO0DIR   = (unsigned long)(YELLOW_LED_MASK | GREEN_LED_MASK); // make LEDs outputs


  IO1SET   = (unsigned long)0x00000000; // 
  IO1CLR   = (unsigned long)0x00000000; // 
  IO1DIR   = (unsigned long)0x00000000; // 

  // enable 32kHz
  CCR = (unsigned long)CLK_CTRL_CLKEN;

  eventqRegisterHandler(RUN_LED_ON,  handleLedOnEvent);
  eventqRegisterHandler(RUN_LED_OFF, handleLedOffEvent);

  return 0;
}

#ifdef CONFIG_TOOLCHAIN_IAR
#pragma inline
void olimexSetGreenLed(boolean onOff)
#else
void INLINE_KEYWORD olimexSetGreenLed(boolean onOff)
#endif
{
  if (onOff == false)
    IO0SET = GREEN_LED_MASK;
  else
    IO0CLR = GREEN_LED_MASK;

  greenLedState = onOff;
}

#ifdef CONFIG_TOOLCHAIN_IAR
#pragma inline
void olimexToggleGreenLed(void)
#else
void INLINE_KEYWORD olimexToggleGreenLed(void)
#endif
{
    olimexSetGreenLed(greenLedState == true ? false : true);
}

#ifdef CONFIG_TOOLCHAIN_IAR
#pragma inline
void olimexSetYellowLed(boolean onOff)
#else
void INLINE_KEYWORD olimexSetYellowLed(boolean onOff)
#endif
{
  if (onOff == false)
    IO0SET = YELLOW_LED_MASK;
  else
    IO0CLR = YELLOW_LED_MASK;

  yellowLedState = onOff;
}

#ifdef CONFIG_TOOLCHAIN_IAR
#pragma inline
void olimexToggleYellowLed(void)
#else
void INLINE_KEYWORD olimexToggleYellowLed(void)
#endif
{
    olimexSetYellowLed(yellowLedState == true ? false : true);
}

static void handleLedOnEvent(void)
{
  olimexSetGreenLed(true);
}

static void handleLedOffEvent(void)
{
  olimexSetGreenLed(false);
}

#endif /* CONFIG_BOARD_OLIMEX_P213X */
