#ifndef MCOSY_H
#define MCOSY_H

#include "coord.h"
#include "msgqueue.h"
#include "network.h"

#define kDEG ((char)0xb0)  // Linux 'ø'

#define WM_PRESET    0x1000
#define WM_POSITION  0x1001
#define WM_TRACK     0x1002
#define WM_STOP      0x1003
#define WM_POLARIS   0x1004

class ShaftEncoder;
class Macs;
class MGCosy;

class MCosy : public Network, public MsgQueue
{
private:
    ShaftEncoder *fAlt1;
    ShaftEncoder *fAlt2;
    ShaftEncoder *fAz;

    Macs *fMac1;
    Macs *fMac2;

    MGCosy *fWin;

    pthread_t *fTxThrd;

    ZdAz  fOffset;    // Tracking Offset between SE and calc-pos [re]
    RaDec fRaDec;     // Position to track
    int   fTracking;  // Flag for present tracking action

    static void *MapTalkThread(void *arg);

    ZdAz GetSePos();     // [se]
    ZdAz GetRePos();

    void TalkThread();
    int  SetPosition(const ZdAz &dst);

    void TerminateApp();

    void TrackPosition(const RaDec &dst); // ra, dec [rad]

    int StopWaitingForSDO();

public:
    MCosy(const char *dev, const int baud, ostream &out=cout);
    ~MCosy();

    void Start();
    void Stop();

    void *Proc(int msg, void *mp);

    static ZdAz CorrectTarget(const ZdAz &src, const ZdAz &dst);
    static ZdAz RaDec2ZdAz(const double mjd, const RaDec &pos, const RaDec &pm=RaDec(0,0));
};

#endif
