/********************************* (C) РОТЕК ***********************************
 * @module  bt_6701_commands
 * @file    bt_6701_commands.c
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   bt_6701_commands
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */

#include "stm32f4xx.h"  
#include "bt_6701_commands.h"
#include "commands_api.h"
#include "common_config.h"
#include "gpio.h"
#if defined HARDWARE_BT6703
#include "board_bt6703.h"
#elif defined HARDWARE_BT6707 || HARDWARE_BT6709
#include "board_bt6707.h"
#endif
#include "buttons.h"
#include "led.h"
#include "netconf.h"
#include "stm32f4x7_eth_bsp.h"
#include "http_server.h"
#include "rtc.h"
#include "sntp_api.h"
#include "d_inouts.h"
#include "config_service.h"
#include "usart.h"
#include "spi_flash.h"

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

#include "lwip/opt.h"
#include "lwip/api.h"
#include "lwip/sys.h"

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

#include <string.h>

bool ntpResult = false;
uint32_t SNTP_Time;

extern uint8_t DefCounter;
extern BUTTON_NO_FIX_t defButton;

extern uint8_t SetCounter;
extern BUTTON_NO_FIX_t setButton;

/**
  * @brief  Флаг ининциализации Eth интерфейса
  */
extern unsigned char eth_ready_flag;

// -------------------------------------------------------------------------- //
//                              __weak функции

/**
  * @brief  
  */
void TestProcessing(void)
{
  
    vTaskDelay(200);
}

/**
  * @brief  
  */
void Test_U232(void)
{
    // Отправляем символы в RS232
    for (uint16_t i = 0; i < 1023; i++)
    	ups_putchar('A');
  
    vTaskDelay(10);
    
  
    for (uint16_t i = 0; i < 1023; i++)
    {
        if (ups_getchar(500) != 'A') {
            printf("U232 FAIL\r\n");
            TEST_SetTest(TEST_WAIT);
            return;
        }
    }  
    
    printf("U232 OK\r\n");
    TEST_SetTest(TEST_WAIT);
}
#ifndef HARDWARE_BT6709
/**
  * @brief  
  */
void Test_DRY(void)
{
    uint8_t inputState;
#if defined HARDWARE_BT6707
    uint8_t start_state = 0;
    uint8_t end_state = 1;
    set_state_douts(DOUT1, 1);
    set_state_douts(DOUT2, 1);
    set_state_douts(DOUT3, 1);
#endif

#ifdef HARDWARE_BT6703
    uint8_t start_state = 1;
    uint8_t end_state = 0;
#endif
    vTaskDelay(10);
    inputState = get_state_din_outs(DIN1);
    
    set_state_douts(DOUT1, start_state);
    
    vTaskDelay(10);
        
    if (get_state_din_outs(DIN1) == inputState) {
        printf("DRY FAIL\r\n");
        TEST_SetTest(TEST_WAIT);
        return;
    }  

    set_state_douts(DOUT1, end_state);
    
    vTaskDelay(10);
    
    if (get_state_din_outs(DIN1) != inputState) {
        printf("DRY FAIL\r\n");
        TEST_SetTest(TEST_WAIT);
        return;
    }  
    
    inputState = get_state_din_outs(DIN1);

	set_state_douts(DOUT2, start_state);

	vTaskDelay(10);

	if (get_state_din_outs(DIN1) == inputState) {
		printf("DRY FAIL\r\n");
		TEST_SetTest(TEST_WAIT);
		return;
	}

	set_state_douts(DOUT2, end_state);

	vTaskDelay(10);

	if (get_state_din_outs(DIN1) != inputState) {
		printf("DRY FAIL\r\n");
		TEST_SetTest(TEST_WAIT);
		return;
	}

	vTaskDelay(10);
#if defined HARDWARE_BT6707
    inputState = get_state_din_outs(DIN1);

	set_state_douts(DOUT3, start_state);

	vTaskDelay(10);

	if (get_state_din_outs(DIN1) == inputState) {
		printf("DRY FAIL\r\n");
		TEST_SetTest(TEST_WAIT);
		return;
	}

	set_state_douts(DOUT3, end_state);

	vTaskDelay(10);

	if (get_state_din_outs(DIN1) != inputState) {
		printf("DRY FAIL\r\n");
		TEST_SetTest(TEST_WAIT);
		return;
	}

	vTaskDelay(10);
#endif

    printf("DRY OK\r\n");
    TEST_SetTest(TEST_WAIT);
}
#endif
/**
  * @brief  
  */
void vTest_DEF(void *params)
{
    static uint32_t timeout = 0;
    
    for (;;)
    {
        if (timeout++ > BUTTON_TIMEOUT) {
            timeout = 0;
            DefCounter = 0;
            LED_Off(LED_INIT_R);
			LED_Off(LED_MAJOR_R);
			LED_Off(LED_MINOR_R);
            printf("DEF FAIL\r\n");
            TEST_SetTest(TEST_WAIT);
            ifTest_DEF = false;
            vTaskDelete(NULL);
        }  
	
        BUTTON_NoFixHandler(&defButton);
	
        if (DefCounter == 3)
        {
            timeout = 0;
            DefCounter = 0;
            printf("DEF OK\r\n");
	  
            /* Завершение теста T0 */
            /* Устанавливаем статус T0READY, сохраняем статус во флеш */
            COM_SetTestState(T0READY);
	  	    
            TEST_SetTest(TEST_WAIT);
            ifTest_DEF = false;
            vTaskDelete(NULL);
        }

        vTaskDelay(10);  
    }
    
}

/**
  * @brief
  */
void vTest_SET(void *params)
{
    static uint32_t timeout_set = 0;

    for (;;)
    {
        if (timeout_set++ > BUTTON_TIMEOUT) {
            timeout_set = 0;
            SetCounter = 0;
            LED_Off(LED_INIT_G);
			LED_Off(LED_MINOR_G);
            printf("SET FAIL\r\n");
            TEST_SetTest(TEST_WAIT);
            ifTest_SET = false;
            vTaskDelete(NULL);
        }

        BUTTON_NoFixHandler(&setButton);

        if (SetCounter == 3)
        {
            timeout_set = 0;
            SetCounter = 0;
            printf("SET OK\r\n");

            /* Завершение теста T0 */
            /* Устанавливаем статус T0READY, сохраняем статус во флеш */
            COM_SetTestState(T0READY);

            TEST_SetTest(TEST_WAIT);
            ifTest_SET = false;
            vTaskDelete(NULL);
        }

        vTaskDelay(10);
    }

}

/**
  * @brief  Тестирование RTC
  */
void COM_TestRtc(void)
{
  /* Пытаемся синхронизироваться с NTP сервером */
  SNTP_Enable(true);
  SNTP_Poll();
  vTaskDelay(1000);

  /* Синхронизация удалась */
  if (ntpResult) {
    printf("RTC OK\r\n");
  }
  else
    printf("RTC FAIL SYNC\r\n");

  TEST_SetTest(TEST_WAIT);
}

/**
  * @brief  Тестирование SPIFLASH
  */
void COM_TestSPIflash(void)
{

  if (spi_flash_test()) {
    printf("SPIFLASH OK\r\n");
  }
  else
    printf("SPIFLASH FAIL SYNC\r\n");

  TEST_SetTest(TEST_WAIT);
}


/**
  * @brief  
  */
void Test_Ethernet(void)
{
    static bool ethernetInit = false;
    int timeout = 100; /* 10 sec timeout */
  
   // if (ethernetInit == false)
    {
        if (eth_ready_flag == 0) {
        	if(!ethernetInit){
        		ethernetInit = true;
				ETH_BSP_Config();
				 LwIP_Init();
        	}
        	else{
        		init_get_ip_address_controller();
        	}
        }
        /* Waiting ETH init */
        while ((eth_ready_flag == 0) && (timeout-- > 0)) {
            vTaskDelay(100);
        }

        if (eth_ready_flag == 0) {
            printf("ETH FAIL\r\n");
        }
        else {
            sys_thread_new("HTTP", vTaskTcpServer, NULL, 4*configMINIMAL_STACK_SIZE, tskIDLE_PRIORITY);
            ethernetInit = true;
        }
    }
  /*  else {
        printf("ETH OK\r\n");
    }*/
   
	TEST_SetTest(TEST_WAIT);
}

/**
  * @brief  
  */
void Test_Serno(void)
{
	macWaiting = true;
	macIsInstalled = false;
	
    // Устанавливаем статус тестирования "T1OK"
    COM_SetTestState(T0OK); 
    
    // Отправляем udp пакет с информацией
    //COM_TestSerno();  
	  
	// Пауза. В это время должен прийти GET запрос с MAC адресом. 
	//vTaskDelay(8000);
	//macWaiting = false;
	  
	//if (!macIsInstalled)
	//	printf("SERNO FAIL\r\n");
  
    for (uint8_t i = 0; i < 4; i++)
    {
        // Отправляем udp пакет с информацией
        COM_TestSerno();  
        // Пауза. В это время должен прийти GET запрос с MAC адресом. 
        vTaskDelay(8000);
        
        if (macIsInstalled)
            break;
    } 
    
    if (!macIsInstalled)
		printf("SERNO FAIL\r\n");
    
    TEST_SetTest(TEST_WAIT);
}


// -------------------------------------------------------------------------- //


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