
/**
* @file EyeTracking.h
*
* @brief The file contains the header for SMI RED object
**/

/*!
Header include
*/
#include "common.h"


/*!
Class definition
*/
class EyeTracking
{
  public:
    /*!
    Standard constructor and destructor
    */
    EyeTracking();
    ~EyeTracking();

    /*!
    Set up calibration
    */
    void SetCalibration(int method, int visualization, int displayDevice, int speed, int autoAccept, int foregroundBrightness, 
                        int backgroundBrightness, int targetShape, int targetSize, char* targetFilename);
    bool Calibrate(int validation);
    bool SaveCalibrationToFile(char* fileName);
    bool LoadCalibrationFromFile(char* fileName);

    /*!
    Getters
    */
    AccuracyStruct* GetAccuracy();
    SystemInfoStruct* GetSystemInfo();
    CalibrationStruct* GetCalibration();

    /*!
    Connection and Disconnection
    */
    bool Connect(char* senderIp, int senderPort, char* receiverIp, int receiverPort);
    bool Disconnect();

    /*!
    Show tracking window
    */
    bool ShowTrackingWindow();

    /*!
    Data logger
    */
    bool CreateLogFile(char* logFileName);
    bool WriteToLog(char* logFileLine);

    /*!
    Callback functions
    */
    static int __stdcall SampleCallbackFunction(SampleStruct sampleData);
    static int __stdcall CalibrationUpdated(CalibrationPointStruct calibrationPoint);
    static int __stdcall FixationUpdated(EventStruct eventDataSample);
    void AddCallbacks();

    /*!
    Thread loop
    */
    void GoThread();

    /*!
    Handle new data
    */
    void HandleFixationEvent();
    void HandleSampleEvent();

  private:
    AccuracyStruct* m_accuracyData; 
	  SystemInfoStruct* m_systemInfoData; 
	  CalibrationStruct* m_calibrationData;

    char* m_senderIp, m_receiverIp;
    int m_senderPort, m_receiverPort;

    /*!
    Boost thread
    */
    bool exitRequested;           // Global variable used to ask the loop thread to end
    boost::thread* loopThread;    // Pointer to the update loop thread
};


/*!
Classes to post/send messages from callbacks
*/
class FixationData
{
  public:
    float duration;
    int posX;
    int posY;
    FixationData(){}; 
    ~FixationData(){};
};

class SampleData
{
  public:
    float leftPupilDiameter;
    float rightPupilDiameter;
    int leftGazeX;
    int rightGazeX;
    int leftGazeY;
    int rightGazeY;
    SampleData(){}; 
    ~SampleData(){};
};

