﻿#ifndef MEDIDOR_H
#define MEDIDOR_H

#include <mysql/mysql.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <ctime>

#define REGISTROS_MAXIMOS 30

#define COMUNICACION_EXITOSA 0
#define NO_INTERROGA_ESTADO_0 1
#define FALTA_PROXIMO_INTERVALO 2
#define ERROR_TRY_CATCH 3
#define ERROR_TIEMPO_EXCEDIDO 5

//#include "Puerto.h"
//#define MEDIDOR_LEER_CIERRES

#define REGISTROS_MAXIMOS 30

extern MYSQL *mysqlConexiones[]; //CONEXION A LA BASE DE DATOS

//extern Puerto *miPuerto;
extern int fd; //PUNTERO AL PUERTO SERIE

struct fecha
{
unsigned int ano;//fecha de la lectura
unsigned int mes;
unsigned int dia;
unsigned int hora;
unsigned int minutos;
unsigned int segundos; 
};

struct tarificacion
{
/*
<20> Información de Tarificación (Totales)
<21> Información de Tarificación (período tarifario 1)
<22> Información de Tarificación (período tarifario 2)
<23> Información de Tarificación (periodo tarifario 3)
<24> Información de Tarificación (periodo tarifario 4)
<25> Información de Tarificación (período tarifario 5)
<26> Información de Tarificación (periodo tarifario 6)
<27> Información de Tarificación (período tarifario 7)
<28> Información de Tarificación (período tarifario 8)
<29>Información de Tarificación (período tarifario 9)*/

int periodoTarifario; //0=20 al 9=29

unsigned long VabA;  //Energía absoluta A [A+/A-] Entero sin signo 4
unsigned long VinA;  //Energía incremental A [A+/A-] Entero sin signo 4
int CinA;			 //Cualificador A Array de 8 bits 1

unsigned long VabRi; //Energía absoluta Ri[Ri +/ Ri -] Entero sin signo 4
unsigned long VinRi; //Energía incremental Ri[Ri +/ Ri -] Entero sin signo 4
int CinRi;			//Cualificador Ri Array de 8 bits 1

unsigned long VabRc; //Energía absoluta Rc[Rc -/ Rc +] Entero sin signo 4
unsigned long VinRc; //Energía incremental Rc [Rc-/Rc+] Entero sin signo 4
int CinRc;	//Cualificador Rc Array de 8 bits 1

float VMaxA; //Máximo Potencia A [A+/A-] Entero sin signo 4
fecha FechaA;//Fecha Máximo Potencia A Etiqueta tiempo a 5
int CMaxA;//	Cualificador Máximo A Array de 8 bits 1

float VexcA; //Excesos de Potencia A[A +/ A -] Entero sin signo 4
int CexcA;//Cualificador de Excesos Array de 8 bits 1

fecha inicio;//Inicio del período Etiqueta tiempo a 5
fecha fin;//Fin del período Etiqueta tiempo a 5
};


struct instantaneoIV
{
	float tension[3];
	float corriente[3];
	fecha tiempo;//fecha de la lectura
};


struct instantaneoPotencia
{
	float activaTotal;//Potencia Total activa KW
	int activaTotalImpoExpo;//0:Importadoda 1:Exportada
	float reactivaTotal; //
	int reactivaTotalImpoExpo;//0:Q1/Q2 1:Q3/Q4
	float factorPotenciaTotal;
	
	int totalesValidas;//0:Medidas validas 1:Invalidas


	float activaFases[3];//Potencia activa KW
	int activaFasesImpoExpo[3];//0:Importadoda 1:Exportada
	float reactivaFases[3];
	int reactivafasesImpoExpo[3];//0:Q1/Q2 1:Q3/Q4
	float factorPotenciaFases[3];
	
	int fasesValidas[3];//0:Medidas validas 1:Invalidas

	fecha tiempo;//fecha de la lectura

};


struct instantaneoEnergia
{
	unsigned long activaImpo;//KWh
	unsigned long activaExpo;//KWh
	unsigned long reactivaQ1;//kVArh
	unsigned long reactivaQ2;//kVArh
	unsigned long reactivaQ3;//kVArh
	unsigned long reactivaQ4;//kVArh

	fecha tiempo;//fecha de la lectura
};

struct instantaneos
{
	instantaneoIV IV;
	instantaneoPotencia P;
	instantaneoEnergia E;
};

class Medidor 
{
public:
	Medidor();
	virtual ~Medidor();
	int CRC8(unsigned char *puchMsg, unsigned int inicio, unsigned int fin);

	int autenticarMedidor(void);
	int leerCierreMedidor(fecha vInicio, fecha vFin);
	int leerCurvaCarga(void);
	int leerInstantaneos(int grupo);
	
	void setIdPuerto(int v){idPuerto = v; };
	
	void setIdSistema(int v){idSistema = v; };
	void setIdModBus(int v){idModBus = v; };
	void setForzarLectura(bool v){forzarLectura = v; };

	void setDireccion(int v){direccion = v;};
	void setPuntoMedida(int v){puntoMedida = v; };
	void setClave(int v){clave = v; };
	void setDGap(int v){gap = v; };

	
	void inicializarMedidor(int vIdModBus);

	int interrogarMedidor(void);

	unsigned long getFecha(void){return this->fechaUltimaComunicacionInstantaneos;};
	float getRegistros(int indice){if (indice < REGISTROS_MAXIMOS && indice>=0)return this->registros[indice];return 0;};
 
	
	int getIndiceArrayPuerto(){return indiceArrayPuerto;}
	void setIndiceArrayPuerto(int var) {indiceArrayPuerto = var; }


	
private:
	MYSQL *miSQL; //CONEXION A LA BASE DE DATOS

	Puerto* miPuerto; 

	int esperaPaqueteADSU(unsigned int , unsigned char *);
	
	int enviarADSUfijo(int control);//campo de control
	int pedirCierre(void); //pide los datos de cierre
	int insertLectura(tarificacion lectura);
	int updateInstantaneos(instantaneos lectura);

	bool forzarLectura;
	
	int idSistema;
	int idModBus;
	int idPuerto;
	int indiceArrayPuerto;

	int gap;
	int estado;

	int punteroConexion;
	
	int direccion;
	int puntoMedida;
	int	clave;

	int protocolo;

	instantaneos valoresInstantaneos;//Valores Instantaneos V, I, P, E
	float registros[REGISTROS_MAXIMOS];// todos los valores Instantáneos;

	unsigned long fechaUltimaComunicacionInstantaneos;
	unsigned long fechaUltimaComunicacionCierres[3];
	};
	//*/
#endif // !defined(MEDIDOR_H)
