#include "main.h"

/* ------------ Standard  Include Files --------------- */
#include <stdint.h>
/* ------------ Special   Include Files --------------- */
#include "tm_stm32f4_ili9341.h"
#include "tm_stm32f4_adc.h"
#include "tm_stm32f4_exti.h"
#include "tm_stm32f4_disco.h"
#include "tm_stm32f4_delay.h"
#include "tm_stm32f4_low_power.h"
/* ------------ Projekt   Include Files --------------- */
#include "config.h"
#include "rtc_user.h"
#include "init_system.h"
#include "graphik.h"
#include "sensor.h"
#include "eeprom.h"
#include "rtc_user.h"
#include "tools.h"

/////////////////////////////////////////
//    Globale Variablen
////////////////////////////////////////

Work_t BKRAM Work;                              // Instanz der Haupt Datenbasis im Backup RAM
volatile _Bool    f_SwitchToTextMode = false;   // Umschaltung auf Textbildschirm

//////////////////////////////////////
/*         Hauptprogramm            */
//////////////////////////////////////

int main(void)
{

    //////////////////////////////////////
    /* Initialisierung des Systems      */
    //////////////////////////////////////

    SystemInit();               // Init der Clocks und wichtiger Register
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
    SysTick_Config(SystemCoreClock/1000);

    Init_Ports();               // Ports einstellen
    Init_BackupRam();           // Backup Ram aktivieren
    Init_RTC();                 // RTC aktivieren
    TM_DELAY_Init();
    Init_BMP180();              // Drucksensor
    BMP180_ReadSensor(&BMP180_Data);
    TM_DISCO_ButtonInit();
    TM_ADC_Init(ADC1,TM_ADC_Channel_1);
    Init_LCD();                 // LCD einstellen
    gfx_InitWork();

    // Daten ungültig machen, wenn Userbutton beim Reset gedrückt wurde
    if (TM_DISCO_ButtonPressed()) {
        Work.id = 0;
        gfx_InitWork();
    }

    //////////////////////////////////////
    /* Initialisierung Variablen      */
    //////////////////////////////////////

    GPIO_SetPin(HWPORT,LED_GREEN);
    flags.drawalways = false;
    LDRValue = TM_ADC_Read(ADC1, ADC_Channel_1);

    // Sonnenaufgang und Untergang berechnen
    CalcSonnenAufgang(&Time,&SonnenZeiten);

    //////////////////////////////////////
    /* Ende der Initialisierung         */
    //////////////////////////////////////

    // Werte für Druck einstellen und alles zeichnen
    gfx_UpdateHistory();
    gfx_DrawDateTime();
    gfx_DrawPressure();
    gfx_DrawTemperature();
    gfx_DrawHistory();
    tls_CalcRegression();
    gfx_Wettervorhersage();

    //gfx_HochTiefDruckgebiet();

    // Wakeup Interrupt alle 1s setzen
    TM_RTC_Interrupts(TM_RTC_Int_1s);

    // ------------- Hauptschleife --------------
    while (1) {

        if (flags.rtc_1s == true) {
            // ----- 1 Sekunde ----------------------
            LDRValue = TM_ADC_Read(ADC1, ADC_Channel_1);
            gfx_DrawDateTime();

            // Umschalten zwischen Text/Grafik Modus
            if (TM_DISCO_ButtonPressed())
                f_SwitchToTextMode = !f_SwitchToTextMode;

           // ----- 1 Minute ----------------------
           if (flags.rtc_1min) {
               BMP180_ReadSensor(&BMP180_Data);
               gfx_UpdateHistory();
               gfx_DrawTemperature();
               gfx_DrawPressure();
               gfx_DrawHistory();
               tls_CalcRegression();
               gfx_Wettervorhersage();                           // LEDs schalten
               tls_RFSendData();
               flags.rtc_1min = false;
           }

           // ----- 1 Stunde ----------------------
           // Stuendlich History updaten
           if  (flags.rtc_1hr) {
                gfx_FreezeHistory();                              // Historie hochzählen
                if (E2P_Backup_Work()==ERROR)                     // Backup die Daten ins E2PROM hinein
                {
                    TM_ILI9341_Fill(ILI9341_COLOR_BLACK);
                    TM_ILI9341_Puts(TransX(0),TransY(239),"EEPROM Backup Error!",&TM_Font_11x18,ILI9341_COLOR_RED, ILI9341_COLOR_BLACK);
                    while(TM_DISCO_ButtonPressed() == 0);
                }

                flags.rtc_1hr = false;
           }

           // Tägliche Aktionen
           if (flags.rtc_1day) {
                CalcSonnenAufgang(&Time,&SonnenZeiten);
               flags.rtc_1day = false;
           }

           flags.rtc_1s = false;

        }
        // Core anhalten bis 1s Wakeup von RTC (bei Debug Mode crashed der Debugger sonst)
        #ifdef RELEASE_MODE
            TM_LOWPOWER_SleepUntilEvent();
        #endif
    }


}
