#include "contiki-conf.h"
#include "dev/models.h"
#include "dev/leds.h"

#include "cc2430_sfr.h"

/*
 * Sensinode v1.0 HW products have 2 red LEDs, LED1 is mapped to the Contiki
 * LEDS_GREEN and LED2 is mapped to LEDS_RED.
 */

/*---------------------------------------------------------------------------*/
void
leds_arch_init(void)
{
#ifdef MODEL_N740
  /*
   * We don't need explicit led initialisation for N740s. They are controlled
   * by the ser/par chip which is initalised already
   */
  return;
#else
  P0DIR |= 0x30;
#endif
}
/*---------------------------------------------------------------------------*/
unsigned char
leds_arch_get(void)
{
  unsigned char l = 0;

#ifdef MODEL_N740
  /* Read the current ser-par chip status */
  uint8_t ser_par;
  ser_par = n740_ser_par_get();
  /* Check bits 7 & 8, ignore the rest */
  if(ser_par & N740_SER_PAR_LED_GREEN) {
    l |= LEDS_GREEN;
  }
  if(ser_par & N740_SER_PAR_LED_RED) {
    l |= LEDS_RED;
  }
#else
  if(LED1_PIN) {
    l |= LEDS_GREEN;
  }
  if(LED2_PIN) {
    l |= LEDS_RED;
  }
#endif
  return l;
}
/*---------------------------------------------------------------------------*/
void
leds_arch_set(unsigned char leds)
{
#ifdef MODEL_N740
  /* Read the current ser-par chip status - we want to change bits 7 & 8 but
   * the remaining bit values should be retained */
  uint8_t ser_par;
  ser_par = n740_ser_par_get();
  if(leds & LEDS_GREEN) {
    ser_par |= N740_SER_PAR_LED_GREEN; /* Set bit 7 */
  } else {
    ser_par &= ~N740_SER_PAR_LED_GREEN; /* Unset bit 7 */
  }

  if(leds & LEDS_RED) {
    ser_par |= N740_SER_PAR_LED_RED; /* Set bit 8 */
  } else {
    ser_par &= ~N740_SER_PAR_LED_RED; /* Unset bit 8 */
  }

  /* Write the new status back to the chip */
  n740_ser_par_set(ser_par);
#else
  if(leds & LEDS_GREEN) {
    LED1_PIN = 1;
  } else {
    LED1_PIN = 0;
  }

  if(leds & LEDS_RED) {
    LED2_PIN = 1;
  } else {
    LED2_PIN = 0;
  }
#endif
}
/*---------------------------------------------------------------------------*/