/********************************* (C) РОТЕК ***********************************
 * @module  testing
 * @file    testing.c
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   Template
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */
   
#include "stm32f4xx.h"
#include "testing.h"
#include "settings_api.h"
#include "common_config.h"
#include "stm32_uid.h"
#include "led.h"
#include "hal.h"

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

#include "lwip/opt.h"
#include "lwip/arch.h"
#include "lwip/api.h"
#include "lwip/tcp.h"

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

#include <stdbool.h>
#include <string.h>

#define UDP_PORT 49049

bool fTesting = false;
bool fServer = false;


#define MSG_LEN   300

char ID[33];

extern SETTINGS_t   sSettings;       // Общая структура настроек
extern bool isIpReceived;

/**
  * @brief  Тестирование
  */
// TODO Убрать заглушки
void vTaskTesting(void *params)
{
  uint8_t len;
  
  while (!isIpReceived) {
    vTaskDelay(100);
  }    
  
  for (;;)
  {    
	  //printf("Start testing task\r\n");
	  memset(ID, 0, 33);
	  /* Читаем ID */
	  GetSTM32IDStr(ID, &len);
	  
	  /* Отправляем запрос */
      vTaskDelay(3000);
	  TEST_SendData();
	  
	  /* Ждем timeout и высылаем ответ на тестер */
	  vTaskDelay(2000);
	  
	  /* Если все прошло хорошо*/
	  if (fServer)
	  {
		  SETTINGS_SetAllDefault();
		  SETTINGS_Save();
#ifdef LED_INIT_ERR
      LED_On(LED_INIT_ERR);
#endif
		/* Устанавливаем статус тестирования "T2OK" и сохраняем настройки */
		SETTINGS_SetT2OK();
#ifdef LED_INIT_ERR
      LED_Off(LED_INIT_ERR);
#endif
	    fServer = false;
	    vTaskDelay(2000);
	  //  Reboot();
	    vTaskDelete(NULL);
      }
      
      vTaskDelay(100);	
  }
}

/**
  * @brief  Отправляет строку данных по UDP
  */
void TEST_SendData(void)
{
  struct netconn *conn;
  struct netbuf *buf;
  char *data;
  char msg[MSG_LEN];
  err_t err;
   
  /* Отправляем сообщение на сервер по UDP */
  memset(msg, 0, MSG_LEN);
 
  conn = netconn_new( NETCONN_UDP );
  
  if (conn!= NULL)
  {
    err = netconn_bind(conn, IP_ADDR_ANY, UDP_PORT); 
    
    if (err == ERR_OK)
    {
      netconn_connect(conn, IP_ADDR_BROADCAST, UDP_PORT);
      
	  strcpy(msg, HW_REV);
#ifdef HARDWARE_BT6709
      strcat(msg, "_BEELINE");
#elif HARDWARE_BT6709_MTS
      strcat(msg, "_MTS");
#endif
	  strcat(msg, ";");
		
	  /* Заглушка */
	  //strcat(msg, "KN-03-00001;EC-4C-4D-00-90-01;0.8_DEMO;;;");
	  strcat(msg, sSettings.sInfo.serialNumber);
	  strcat(msg, ";");
	  
	  strcat(msg, sSettings.sInfo.mac);
	  strcat(msg, ";");
       
	  strcat(msg, VERSION);
	  strcat(msg, ";;;");
      
	//  for (uint8_t i = 0; i < 12; i++)
	  {
		 strcat(msg, ID);
	  }	
	  
      strcat(msg, ";;;");
      
	  strcat(msg, sSettings.sFlags.testState);
	  
	  strcat(msg, ";;");

	  
	  buf = netbuf_new();
      data = netbuf_alloc(buf, strlen(msg));
      memcpy(data, msg, strlen(msg));
      netconn_send(conn, buf);
      netbuf_delete(buf); 
	  
	  netconn_delete(conn);
	}
	else
      netconn_delete(conn);
  }	
}

/**
  * @brief  
  */
void TEST_SetServerFlag(void)
{
  fServer = true;
}


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