/*
 * CLI_Parameters.c
 *
 *  Created on: 04.12.2017
 *      Author: balbekova
 */

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

#include "CLI_Parameters.h"
#include "parameters.h"
#include "settings_api.h"


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


//Настройки SNMP
void snmp_config_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;


	const int8_t * const pcInfoTableHeader = ( int8_t * ) "\r\n***********SNMP настройки Контроллера***********\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcInfoTableHeader, strlen( ( char * ) pcInfoTableHeader ) );

	GetManagerIp(str, &len);
	strcat(( char * ) buf, "Ceрвер 1:\t\t\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСервер 2:\t\t\t");
	GetManagerIp2(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСервер 3:\t\t\t");
	GetManagerIp3(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСервер 4:\t\t\t");
	GetManagerIp4(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСервер 5:\t\t\t");
	GetManagerIp5(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nRead community:\t\t\t");
	GetReadCommunity(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nWrite community:\t\t");
	GetWriteCommunity(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\n");
}

//Настройки сухих контактов
void inouts_config_param(int8_t *buf)
{
	char str[20];
	char str_temp[20];
	uint8_t len = 0;

	const int8_t * const pcInOutsTableHeader = ( int8_t * ) "\r\n*********Настройки сухих контактов Контроллера*********\r\n";
	const int8_t * const pcDryInsTableHeader = ( int8_t * ) "Дискретные входы\r\n";
	const int8_t * const pcDryInsTableHeader2 = ( int8_t * ) "\r\nКонтакт\t\tНормальное состояние\r\n";
	const int8_t * const pcRelaysTableHeader = ( int8_t * ) "Релейные выходы\r\n";
	const int8_t * const pcRelaysTableHeader2 = ( int8_t * ) "\r\nКонтакт\t\tИсточник\r\n";
	const int8_t * const pcSharedTableHeader = ( int8_t * ) "------------+--------------------------------------------\r\n";


	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcInOutsTableHeader, strlen( ( char * ) pcInOutsTableHeader ) );

	strncat( ( char * ) buf, ( const char * ) pcDryInsTableHeader, strlen( ( char * ) pcDryInsTableHeader ) );
	strncat( ( char * ) buf, ( const char * ) pcDryInsTableHeader2, strlen( ( char * ) pcDryInsTableHeader2 ) );
	strncat( ( char * ) buf, ( const char * ) pcSharedTableHeader, strlen( ( char * ) pcSharedTableHeader ) );

	GetDINTypeActStr(str, &len, 0);
	strcat(( char * ) buf, "1:\t\t");
	switch(str[0]){
	case '0':
		strcat(( char * ) buf, "Разомкнут\r\n");
		break;
	case '1':
		strcat(( char * ) buf, "Замкнут\r\n");
		break;
	}
	strncat( ( char * ) buf, ( const char * ) pcSharedTableHeader, strlen( ( char * ) pcSharedTableHeader ) );
	strcat(( char * ) buf, "\r\n");

	strncat( ( char * ) buf, ( const char * ) pcRelaysTableHeader, strlen( ( char * ) pcRelaysTableHeader ) );
	strncat( ( char * ) buf, ( const char * ) pcRelaysTableHeader2, strlen( ( char * ) pcRelaysTableHeader2 ) );
	strncat( ( char * ) buf, ( const char * ) pcSharedTableHeader, strlen( ( char * ) pcSharedTableHeader ) );

	for(uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i++){
		GetROTypeActStr(str, &len, i);
		memset(str_temp, 0, strlen(str_temp));
		sprintf(str_temp, "%d:\t\t", i);
		strncat(( char * ) buf, str_temp, strlen(str_temp));
		switch(str[0]){
		case '0':
			strcat(( char * ) buf, "Наличие сети\r\n");
			break;
		case '1':
			strcat(( char * ) buf, "Наличие выходного напряжения\r\n");
			break;
		case '2':
			strcat(( char * ) buf, "Разряд АКБ\r\n");
			break;
		case '3':
			strcat(( char * ) buf, "Отключение АКБ\r\n");
			break;
		case '4':
			strcat(( char * ) buf, "SNMP SET\r\n");
			break;
		}
		strcat(( char * ) buf, "\r\n");
	}
	strncat( ( char * ) buf, ( const char * ) pcSharedTableHeader, strlen( ( char * ) pcSharedTableHeader ) );
}

//Сетевые настройки
void net_config_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;

	const int8_t * const pcInfoTableHeader = ( int8_t * ) "\r\n*********Сетевые настройки Контроллера*********\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcInfoTableHeader, strlen( ( char * ) pcInfoTableHeader ) );

	GetDhcpStateStrRu(str, &len);
	strcat(( char * ) buf, "DHCP:\t\t\t\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nIP адрес:\t\t\t");
	GetIpStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nАдрес шлюза:\t\t\t");
	GetGatewayStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nАдрес маски подсети:\t\t");
	GetMaskStr(str, &len);
	strncat(( char * ) buf, str, len);


	strcat(( char * ) buf, "\r\n");
}

//Настройки времени
void time_config_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;

	const int8_t * const pcTimeTableHeader = ( int8_t * ) "\r\n*********Настройки времени Контроллера*********\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcTimeTableHeader, strlen( ( char * ) pcTimeTableHeader ) );

	GetSntpStateStrRU(str, &len);
	strcat(( char * ) buf, "Режим установки времени:\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nЧасовой пояс:\t\t\t");
	GetSntpTimeZoneStr(str, &len);
	strncat(( char * ) buf, str, len);

	if(sSettings.sSNTP.sntpEnable){
		strcat(( char * ) buf, "\r\nIP адрес NTP сервера:\t\t");
		GetSntpServerIpStr(str, &len);
		strncat(( char * ) buf, str, len);

		strcat(( char * ) buf, "\r\nПоследняя дата синхронизации:\t");
		GetSntpLastDataStr(str, &len);
		strncat(( char * ) buf, str, len);

	}
	else{
		GetDateStr(str, &len);
		strcat(( char * ) buf, "Дата:\t\t\t");
		strncat(( char * ) buf, str, len);

		strcat(( char * ) buf, "\r\nВремя:\t\t\t");
		GetTimeStr(str, &len);
		strncat(( char * ) buf, str, len);
	}

	strcat(( char * ) buf, "\r\n");
}

//Параметры ИБП
void ups_sensor_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;

	GetConnectUPSAlarmStr(str, &len);
	strcat(( char * ) buf, "\r\nСвязь с ИБП:\t\t\t\t");
	strncat(( char * ) buf, str, len);

	const int8_t * const pcUPSInfoTableHeader = ( int8_t * ) "\r\n\r\n***********Параметры источника питания***********\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncat( ( char * ) buf, ( const char * ) pcUPSInfoTableHeader, strlen( ( char * ) pcUPSInfoTableHeader ) );

	GetInputVoltageStr(str, &len);
	strcat(( char * ) buf, "Входное напряжение (VAC):\t\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nВыходное напряжение (VAC):\t\t");
	GetOutputVoltageStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nВходная частота:\t\t\t");
	GetInputFreqStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nНагрузка:\t\t\t\t");
	GetPowerStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nТекущий режим:\t\t\t\t");
	GetUPSModeStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСтатус:\t\t\t\t\t");
	GetUPSAlarmStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\n");
}

//Параметры аккумуляторных батарей
void ups_sensor_akb_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;

	const int8_t * const pcAKBInfoTableHeader = ( int8_t * ) "\r\n*********Параметры аккумуляторных батарей*********\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcAKBInfoTableHeader, strlen( ( char * ) pcAKBInfoTableHeader ) );

	GetBatCapacityStr(str, &len);
	strcat(( char * ) buf, "Емкость батареи:\t\t\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nВнутренняя температура:\t\t\t");
	GetInternalTempStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nОставшееся время работы:\t\t");
	GetRuntimeStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nСтатус:\t\t\t\t\t");
	GetAKBAlarmStr(str, &len);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\n");
}

//Параметры сухих контактов
void inouts_sensor_param(int8_t *buf)
{
	char str[20];
	uint8_t len = 0;

	const int8_t * const pcInOutsInfoTableHeader = ( int8_t * ) "\r\n************Параметры сухих контактов************\r\n";
	/* Return the next command help string, before moving the pointer on to
	the next command in the list. */
	strncpy( ( char * ) buf, ( const char * ) pcInOutsInfoTableHeader, strlen( ( char * ) pcInOutsInfoTableHeader ) );

	GetDIN0StatusStrRU(str, &len);
	strcat(( char * ) buf, "Дискретный вход:\t\t\t");
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nРелейный выход 1:\t\t\t");
	GetDOUTStatusStrRU(str, &len, 0);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nРелейный выход 2:\t\t\t");
	GetDOUTStatusStrRU(str, &len, 1);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\nРелейный выход 3:\t\t\t");
	GetDOUTStatusStrRU(str, &len, 2);
	strncat(( char * ) buf, str, len);

	strcat(( char * ) buf, "\r\n");
}
