#ifdef MAPLE_IDE

#include <stdio.h>
#include "wirish.h"

extern void setup(void);
extern void loop(void);

void board_start(const char* program_name)
{
  // Set up the LED to steady on
  pinMode(BOARD_LED_PIN, OUTPUT);
  digitalWrite(BOARD_LED_PIN, HIGH);

  // Setup the button as input
  pinMode(BOARD_BUTTON_PIN, INPUT);
  digitalWrite(BOARD_BUTTON_PIN, HIGH);

  SerialUSB.begin();
  SerialUSB.println("Press BUT");

  // Wait for button press
  while ( !isButtonPressed() )
  {
  }

  SerialUSB.println("Welcome!");
  SerialUSB.println(program_name);

  int i = 11;
  while (i--)
  {
    toggleLED();
    delay(50);
  }
}

/**
 * Custom version of _write, which will print to the USB.
 * In order to use it you MUST ADD __attribute__((weak))
 * to _write in libmaple/syscalls.c
*/
extern "C" int _write (int file, char * ptr, int len)
{
  if ( (file != 1) && (file != 2) )
    return 0; 
  else
    SerialUSB.write(ptr,len);
  return len;
}

/**
 * Re-entrant version of _write.  Yagarto and Devkit now use
 * the re-entrant newlib, so these get called instead of the
 * non_r versions.
 */
extern "C" int _write_r (void*, int file, char * ptr, int len)
{
  return _write( file, ptr, len);
}

__attribute__((constructor)) __attribute__ ((weak)) void premain()
{
  init();
}

__attribute__((weak)) void setup(void)
{
  board_start("No program defined");
}

__attribute__((weak)) void loop(void)
{
}

__attribute__((weak)) int main(void)
{
  setup();

  while (true)
  {
    loop();
  }
  return 0;
}
#endif // ifdef MAPLE_IDE
// vim:cin:ai:sts=2 sw=2 ft=cpp