/********************************* (C) РОТЕК ***********************************
 * @module  init_task
 * @file    init_task.c
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   Инициализация всех задач.
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */
  
#include "init_task.h"
#include "common_config.h"   
#include "wdg.h"
#include "usart.h"
//#include "port_microrl.h"
#include "led.h"
#include "rng.h"
#include "buttons.h"
#include "jumper.h"
#include "rtc.h"
#include "log.h"
#include "stm32f4x7_eth_bsp.h"
#include "netconf.h"
#include "udp_netsetting.h"
#include "snmp_api.h"
#include "http_server.h"
#include "sntp.h"
#include "settings_api.h"
#include "main.h"
#include "trap_api.h"
#include "megatec.h"
//#include "testing.h"
#include "ups_monitor.h"
//#include "ups_params.h"
//#include "ups_monitor.h"
//#include <lwip/stats.h>

#ifdef PRINTF_STDLIB
#include <stdio.h>
#endif
#ifdef PRINTF_CUSTOM
#include "tinystdio.h"
#endif

#include "FreeRTOS.h"
#include "task.h" 

extern bool dhcp;	

/**
  * @brief  Общая структура настроек
  */
extern SETTINGS_t sSettings;

/**
  * @brief Хендл для задачи vTaskLedBlink
  */
TaskHandle_t xTaskToKill;

static void vTaskDebug(void *pvParameters);

/**
  * @brief  Разовая синхронизация времени при старте контроллера
  */
TaskHandle_t xHandleSntpOnceSinhro = NULL;


/**
  * @brief  Задача инициализации. Запускает основные задачи девайса и умирает.
  * @retval 
  */
void InitTask(void *params)
{
// -----------------------------------------------------------------------------    
 // xTaskCreate(vTaskWdt, "WDT", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
// -----------------------------------------------------------------------------    
  InitUSART();
  ups_megatec_init();
// -----------------------------------------------------------------------------    
 // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
/*  SETTINGS_SetDefaultDebug();
  SETTINGS_Save();*/
  SETTINGS_Load();

	if(set_mode_jumper()){
		SETTINGS_SetServiceDef();
		SETTINGS_Save();
		log_event_data(LOG_PSW_CHANGE, "Сброс к заводскому");
	}
// -----------------------------------------------------------------------------    
  
// -----------------------------------------------------------------------------  
#ifdef USART_DEBUG_ENABLE
  InitUSART();
 // MICRORL_Init();
#endif  
// -----------------------------------------------------------------------------    

// -----------------------------------------------------------------------------  
#ifdef LED_ENABLE
  LED_Init();
  /* Простая мигалка для подтверждения живучести контроллера */
  xTaskCreate(vTaskLedBlink, "LED_Blink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);//&xTaskToKill
#endif  
// -----------------------------------------------------------------------------    
  
// -----------------------------------------------------------------------------  
#ifdef BUTTON_ENABLE  
  BUTTON_Init();
  xTaskCreate(vTaskButtons, "Buttons", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
#endif
// -----------------------------------------------------------------------------    
  
  //xTaskCreate( d_inouts_task,  "inouts_task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
 // 	xTaskCreate( d_inouts_test, "d_inouts_test", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);

// -----------------------------------------------------------------------------    
#ifdef RTC_ENABLE  
  TM_RTC_Init(TM_RTC_ClockSource_External);  // Так было
 // TM_RTC_Init(TM_RTC_ClockSource_Internal);  // TODO Уточнить источинк тактирования
#endif
// -----------------------------------------------------------------------------      
  
  /* UDP for net settings */
  UDP_netsetting_init();
// -----------------------------------------------------------------------------
#ifdef UPS_ENABLE
 /* UPS_Init();
  xTaskCreate(UPS_TaskParsing, "UPS_Parsing", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
  xTaskCreate(UPS_TaskState, "UPS_State", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);*/
  xTaskCreate(UPS_Monitor, "UPS_Monitor", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
#endif
// -----------------------------------------------------------------------------    
  /* Random number generator */
  RNG_Init();
// -----------------------------------------------------------------------------  
#ifdef NET_ENABLE
  ETH_BSP_Config();
  LwIP_Init();
  
#ifdef WEB_SERVER_ENABLE
  HTTP_Init();
#endif
  
#ifdef SNMP_ENABLE

  SNMP_Init();
	  
	xTaskCreate(SNMP_SysUpTimeTask, "snmpSysUpTime", configMINIMAL_STACK_SIZE,
              NULL, tskIDLE_PRIORITY, NULL);
	
	xTaskCreate(snmp_trap_tread, "snmpTrapTest", 3*configMINIMAL_STACK_SIZE,
              NULL, tskIDLE_PRIORITY, NULL);
   
#endif	
    
#endif  
// -----------------------------------------------------------------------------      
	 /* SNTP */
	 SNTP_Init();
	 xTaskCreate(vTaskOnceSynchro, "sntpOnceSinhro", 2*configMINIMAL_STACK_SIZE,
				 NULL, tskIDLE_PRIORITY, &xHandleSntpOnceSinhro);
	 xTaskCreate(vTaskPeriodicSynchro, "sntpPeriodicSinhro", 2*configMINIMAL_STACK_SIZE,
				 NULL, tskIDLE_PRIORITY, NULL);
// -----------------------------------------------------------------------------  
// Тестирование
    
  // Тест таблицы трапов  
  //xTaskCreate(vTestTrap, "Trap_test", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
// -----------------------------------------------------------------------------      

// -----------------------------------------------------------------------------        
#ifdef DEBUG_FREERTOS
  xTaskCreate(vTaskDebug, "Debug", 800, NULL, tskIDLE_PRIORITY, NULL);
#endif  
// -----------------------------------------------------------------------------      

 /* xTaskCreate(vTaskTesting, "Testing", configMINIMAL_STACK_SIZE,
              NULL, tskIDLE_PRIORITY, NULL);*/
  
  //TEST_InitRS485();
  //TEST_IO();
  
  /* Контроль успешной загрузки. Сброс флага bootry */
  /* Сброс флага и сохранение нового значения во флеш памяти происходт после
     некоторой задержки для запуска всех задач */
  vTaskDelay(4000);
 
  SETTINGS_ResetBootTry();
  
  // Отправка трапа о перезагрузке в случае статического IP
 /* if (!dhcp)
    SNMP_SendUserTrap(DEVICE_REBOOTED);
  
  printf("Hello world\r\n");*/
  
  vTaskDelete(NULL);
     taskYIELD();
}

static void vTaskDebug(void *pvParameters) 
{
  char msg[700];
  for(;;)
  {
	vTaskList(msg);
	printf(msg);
	printf("\n\r\r\n");     
#if LWIP_STATS
	stats_display();
	printf("\r\n\r\n");
#endif
	vTaskDelay(5000);
  }   
}




/********************************* (C) РОТЕК **********************************/