//
// Main.cpp
//

#include <Compiler.h>
#include <Cortex-M.h>
#include <Debug.h>

#include "STM32F4xx_Init.h"

#include <RB_GPIO.h>
#include <RB_RCC.h>
#include <RB.h>
#include <RB_TIM.h>
#include <RB_NVIC.h>

#include <LED.h>
#include <Timer2.h>
#include <Sensor.h>


static bool volatile runMainLoop = true;

/// Program entry.
DECL_NO_RETURN int main(void)
{
	static int control = 0;
	
	ITM_PUTS("It all starts here!");
  ITM_PRINTF("AHB clock = %u Hz", HClk());
  ITM_PRINTF("APB1 clock = %u Hz", PClk1());
  ITM_PRINTF("APB2 clock = %u Hz", PClk2());
	
  STM32F4xx_Init();

  ITM_PUTS("Controller has been initialized");
  
	/// User initialization may start here
	/// vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	
	/// LEDs auf dem Board initialisieren
	LED_init();						// rote und grüne LED des STM32F429i Boards werden Initialisiert
	
	// Ports fuer I2C initialisieren
	Sensor_I2C_init ();
	
	// Power fuer Sensor initialisieren
	Sensor_Pwr_init ();
	
	
	// Timer 2 initialisieren um eine blinkende LED zu bekommen
	TIM2_init();

	/// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	/// End of user initialization!

  /// Das BASEPRI-Register ist im Start-up-Code auf 0x10 eingestellt worden. Damit kann kein IRQ mit niedrigerer oder gleicher Prio
  /// aktiv werden. Erst mit dem Auruf der nachfolgenden Funktion können alle IRQs aktiv werden.

  SetBASEPRI(0U);

	ITM_PRINTF("BASEPRI=0x%08X", GetBASEPRI());
	
  /// Indem Bit #0 im CONTROL-Register des Cortex-M4 gesetzt wird, wird der Prozessor in den non-priviliegierten Modus gesetzt.
  /// Damit können diverse, wichtige Einstellungen nicht mehr versehentlich überschrieben werden.
  /// Aber Achtung: Der Exception-Modus ist immer privilegiert, unabhängig von CONTROL[0].
  
  SetCONTROL(1U | GetCONTROL());

	ITM_PRINTF("CONTROL=0x%08X", GetCONTROL());


	ITM_PUTS("Starting main loop");


  while ( runMainLoop )
  {
		rbTIM02.CR1 |= 0x0097;									// cen bit setzen, dadurch wird Timer gestartet

		
		
		
//		control = LED (on, green);
		
		control = Sensor_Pwr (off);											// Schaltet Sensor aus (da eine logische '1' kommandiert wird
		
		for (int i = 0xFFFFFFFF; i == 0; i--)
		{
			for (int j = 0xFFFFFFFF; j == 0; j--)
			{
				for (int k = 0xFFFFFFFF; k == 0; k--)
				{}
			}
		}
		
		control = Sensor_Pwr (on);											// Schaltet Sensor an, da eine logische '0' kommandiert wird
		
		
		if (control == 1)
		{
			ITM_PUTS("Fehler beim Initialisieren");
		}
  }
  
  ITM_PUTS("This is the end!");
  
  ResetController();
}




