#ifndef LIGTHBARRIERSENSOR_H
#define LIGTHBARRIERSENSOR_H

#include "sensor.h"

#ifdef ROBOTHW // vrai robot
#include "stm32f10x_gpio.h"
#endif

/** @brief Classe des gestions des barriers optiques */
class LigthBarrierSensor : public Sensor
{
    #ifndef ROBOTHW
    typedef int GPIO_TypeDef;
    #endif

    public:

        /** @brief Permet de nommer les différentes barrières optique */
        enum LigthBarrierName
        {
            /** @brief Aucun capteur */
            NONE,
            /** @brief barrière optique avant */
            FRONT
        };

        #ifdef ROBOTHW
        /** @brief Constructeur d'une barrière optique *
        *   @param pin Numéro de pin utilisée (GPIO_Pin_1, GPIO_Pin_2, ...) *
        *   @param group Groupe de pin utilisé (GPIOA, GPIOB, ...) *
        *   @brief name Nom de la barrière optique */
        LigthBarrierSensor(LigthBarrierName name, uint16_t pin, GPIO_TypeDef* group);
        #else
        LigthBarrierSensor();
        #endif

        /** @brief Destructeur de la classe */
        virtual ~LigthBarrierSensor();

        /** @brief Permet de récupérer les données rendu diponible par le capteur fin de course*
        *   @return Retourne une structure OutputSensor contenant les données traitées du capteur. Cette structure sera de type LIGTH_BARRIER et la seul donnée utile sera donc la variable b qui contiendra un booléen valant true si le capteur détecte quelque chose. */
        OutputSensor getValue();

        /** @brief Accesseur de l'attribue name */
        LigthBarrierName getName();

        /** @brief Met à jour la valeur de retour du capteur en étidiant la valeur actuel sur la pin sur laquel il est branché. *
        *   @warning Il faut appeler cette fonction souvent pour que la value du retour du capteur soit la plus juste possible. */
        void updateValue();

    private:
    #ifdef ROBOTHW
        /** @brief Numéro de pin utilisée (GPIO_Pin_1, GPIO_Pin_2, ...) */
        uint16_t pin;

        /** @brief Groupe de pin utilisé (GPIOA, GPIOB, ...) */
        GPIO_TypeDef* group;

        /** @brief Compteur pour filtrer le signal numérique reçu. Ce compteur agit comme un filtre passe bas. */
        uint16_t counter;

        /** @brief Nom de la barrière optique */
        LigthBarrierName name;

        /** @brief Valeur retourné par le capteur */
        bool output;
    #endif
};

#endif // LIGTHBARRIERSENSOR_H
