﻿#ifndef MEDIDOR_H
#define MEDIDOR_H

#include <ctime>
#include <sys/socket.h>
#include <cstdint> 

#define REGISTROS_MAXIMOS 30

#define COMUNICACION_EXITOSA 0
#define ERROR_COMUNICACION 1

struct fecha {
    unsigned int ano;
    unsigned int mes;
    unsigned int dia;
    unsigned int hora;
    unsigned int minutos;
    unsigned int segundos;
};

class Medidor {
public:
    Medidor();
    virtual ~Medidor();

    void setSocket(int sock) { this->sock = sock; }
    int autenticarMedidor();
    int leerInstantaneos(int grupo);
    float getRegistros(int indice) const { 
        if (indice < REGISTROS_MAXIMOS && indice >= 0)
            return this->registros[indice];
        return 0;
    }
    
    void mostrarVariablesInstantaneas();

private:
    int CRC8(unsigned char *puchMsg, unsigned int inicio, unsigned int fin);
    int enviarADSUfijo(int control);
    int esperaPaqueteADSU(unsigned int vDelay, unsigned char *vMensajeRX);
    int32_t convertirA32BitsSignado(unsigned char* bytes);
    uint32_t convertirA32BitsSinSigno(unsigned char* bytes);
    float convertirAFloat32(unsigned char* bytes);
    float aplicarEscala(int32_t valor, float escala);
    float aplicarEscala(uint32_t valor, float escala);
    bool verificarSocket(); // Añadimos la declaración de verificarSocket aquí

    int sock;
    int direccion;
    float registros[REGISTROS_MAXIMOS];
};

#endif // MEDIDOR_H