//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+
//+   Copyright (c) CML Microsystems Plc 2015
//+
//+   This firmware was designed by CML Microcircuits (UK) Ltd, based on
//+   UK originated technology and is only intended for use on CML’s  Evaluation kits.
//+
//+   The supply and use of this Firmware is subject to CML's
//+   Licence Agreement, a copy of which can be obtained from CML on request.
//+
//+   Contact details:
//+   Technical:  techsupport@cmlmicro.com
//+   Sales:  sales@cmlmicro.com
//+
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


#include "chip.h"
#include "pe0003.h"
#include "pe0003_config.h"
#include "ftdi.h"
#include "cbus.h"
#include "gpio.h"
#include "timer.h"
#include "lpc_types.h"

#include "monitor.h"
#include "messages.h"
#include "mon_general.h"
#include "mon_fi.h"

#include "Settings.h"
#include "Registers.h"
#include "ProgTools.h"
#include "PR7261_Tools.h"

#include <stdio.h>


uint32_t tcrvalue = 0;


uint8_t BoardInit()
{
	// Initialise board
	Pe0003_BoardInit();

	//FTDI usb
	Pe0003_UsbFtdiInit();


	// Initialise CBUS
	Pe0003_CbusInit(CBUS1);
	Pe0003_CbusInit(CBUS2);

	//Init Timer
	Pe0003_TimerInit();

	//GPIO
	Pe0003_IOInit();
	Pe0003_DIOInit();
	Pe0003_GpioInit();


	//Set interrupts IRQN1 and IRQN2
	Pe0003_IrqnIntSet();
	//Pe0003_IrqnDisable();


	//Configure leds
	//Pe0003_GpioGenIOSetPin(PE0003_DIO, 3);
	//Pe0003_GpioGenIOSetPin(PE0003_DIO, 4);

	//Pe0003_GpioSetDir(0xFF);

	//Clear display
	Gui_ClearDisplay();

	//Init GUI
	Cml_GuiSystemInit();

	return TRUE;
}


uint8_t LoadFI()
{
	//Load FI
	uint32_t time = 0;
	uint16_t productId = 0;
	uint16_t fiVersion = 0;
	uint8_t res = 0;




	if (FI_OPENDIALOG_EN)
	{
		time = Pe0003_TimerUsec();

		mprintf("Load FI\n");
		time = Pe0003_TimerUsec();
		res = Gui_LoadFunctionImageCbus_CMX7x6x(CBUS1, &productId, &fiVersion);
	}
	else
	{
		mprintf("Loading %s\n", FI_PC_PATH);
		time = Pe0003_TimerUsec();
		res = Gui_LoadFunctionImageCbus_DirectFile_CMX7x6x(CBUS1, FI_PC_PATH, &productId, &fiVersion);
	}


	if (res == FI_OK)
	{
		time = Pe0003_TimerUsec() - time;
		mprintf("FI loaded...\n");
		mprintf("Product ID : %x  FI Version : %x\n", productId, fiVersion);
	}
	else
	{
		mprintf("Failed to load FI...\n");

		return FALSE;
	}

	return TRUE;
}








void SetDelay(uint32_t delay_us)
{
	tcrvalue = delay_us + Pe0003_TimerUsec();


	if (tcrvalue < delay_us)
	{
		Pe0003_ResetTimer();				//reset counter and continue
		tcrvalue = delay_us;
	}
}


uint8_t DelayReached(void)
{
	if (tcrvalue < Pe0003_TimerUsec())
		return TRUE;
	return FALSE;
}



uint32_t GetNumberOfSamples()
{
	int samples = 0;

	mprintf("Insert the number of samples\n");
	mscanf("%d", &samples);
	mprintf("VAL %d\n", samples);

	if ((samples > 1000000) || (samples < 5000))
		samples =  NSAMPLES;


	return samples;
}


