Changeset 1953 for trunk/MagicSoft/Cosy


Ignore:
Timestamp:
04/12/03 19:06:27 (22 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Cosy
Files:
2 added
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Cosy/Changelog

    r1882 r1953  
    11                                                                  -*-*- END -*-*-
     2 2003/04/12 - Thomas Bretz
     3
     4   * prepos_magic.txt:
     5     - added
     6     
     7   * bend.cc:
     8     - added
     9
     10   * Makefile:
     11     - bend added
     12     
     13   * bending_magic.txt:
     14     - new bending
     15
     16   * cosy.cc:
     17     - fixed typo
     18     - disable console output
     19     
     20   * testse.cc:
     21     - accept commandline options
     22     
     23   * base/MThread.cc, base/msgqueue.cc:
     24     - added DEBUG-stuff
     25   
     26   * candrv/network.cc:
     27     - fixed wrong handling of SDO messages with less than 4 bytes
     28     
     29   * candrv/nodedrv.cc:
     30     - do not switch timer off if it isn't switched on
     31   
     32   * candrv/vmodican.cc:
     33     - added EXPERT mode
     34   
     35   * catalog/SlaStars.h:
     36     - added CalcAltAz/ZdAz with mjd
     37   
     38   * catalog/StarCatalog.[h,cc]:
     39     - included rotation angle
     40   
     41   * devdrv/macs.cc:
     42     - added request for present error code
     43     - added #71 error message
     44     
     45   * devdrv/shaftencoder.[h,cc]:
     46     - fixes to support multiturn encoders correctly
     47     - removed velocity and acceleration from gui
     48
     49   * gui/MGAccuracy.cc:
     50     - mega mini change
     51   
     52   * gui/MGCosy.[h,cc]:
     53     - added EXPERT mode
     54     - added TrackPos
     55     - removed shaftencoder label for velocity and acceleration
     56     - commented out MAC3
     57     - fixed reading of predefined positions
     58     - commented out everything related to the demo mode
     59     - changed some displayed text
     60
     61   * gui/MGStarguider.[h,cc]:
     62     - added support for rotation angle
     63     
     64   * main/MBending.h:
     65     - added constructor with filename
     66
     67   * main/MCosy.[h,cc]:
     68     - for gear display both axis
     69     - some more output in WaitForEndMovement
     70     - added CheckRange
     71     - added AlignTrackingPos
     72     - changed timing in tracking procedure from 3s/50ms to 5s/1s
     73     - added TrackPos
     74     - replaced some code by AlignTrackingPos
     75     - commented out CALIB and PRESET
     76
     77   * slalib/oapqk.c:
     78     - fixed a bug checking validity of arguments for atan2
     79
     80   * videodev/Writer.cc:
     81     - fixed names
     82
     83
     84
    285 2003/03/31 - Daniela Dorner:
    386 
  • trunk/MagicSoft/Cosy/Makefile

    r1803 r1953  
    2020#
    2121
    22 PROGRAMS = testse starg cosy
     22PROGRAMS = testse starg cosy bend
    2323SOLIB    = cosy.so
    2424CINT     = M
  • trunk/MagicSoft/Cosy/base/MThread.cc

    r1275 r1953  
    55#include <pthread.h>
    66#include <sys/resource.h>  // PRIO_PROCESS
     7
     8#undef DEBUG
    79
    810// ----------------------------------------------------------------------
     
    1416MThread::MThread(bool start, int prio) : fIsRunning(false), fIsDetached(false), fThread(NULL), fReturn(NULL)
    1517{
     18#ifdef DEBUG
     19    cout << "MThread::MThread" << endl;
     20#endif
    1621    if (!start)
    1722        return;
     
    2934MThread::~MThread()
    3035{
     36#ifdef DEBUG
    3137    cout << "~MThread::MThread" << endl;
     38#endif
    3239    Stop();
    3340}
     
    122129void MThread::Stop()
    123130{
     131#ifdef DEBUG
    124132    cout << "MThread::Stop: fThread=" << fThread << ", fIsRunning=" << (int)fIsRunning << endl;
     133#endif
     134
    125135    if (!fThread || !fIsRunning)
    126136        return;
     
    128138    if (fIsDetached)
    129139    {
     140#ifdef DEBUG
    130141        cout << "Stopping detached thread..." << flush;
     142#endif
    131143        pthread_cancel(*fThread);
    132144        fIsRunning = false;
     
    134146    else
    135147    {
     148#ifdef DEBUG
    136149        cout << "Stopping thread..." << flush;
     150#endif
    137151        fStop = true;
    138152        pthread_join(*fThread, &fReturn);
    139153    }
     154#ifdef DEBUG
    140155    cout << "done." << endl;
     156#endif
    141157
    142158    delete fThread;
    143159    fThread = NULL;
    144160
     161#ifdef DEBUG
    145162    cout << "MThread::Stop() done." << endl;
     163#endif
    146164}
  • trunk/MagicSoft/Cosy/base/msgqueue.cc

    r1727 r1953  
    66#include <sys/resource.h>  // PRIO_PROCESS
    77
     8#undef DEBUG
     9
    810// --------------------------------------------------------------------------
    911//
     
    2224MsgQueue::~MsgQueue()
    2325{
     26#ifdef DEBUG
    2427    cout << "~MsgQueue::MsgQueue" << endl;
     28#endif
    2529    pthread_cancel(fThread);
    2630    delete (unsigned char*)fMp;
     
    8993        pthread_mutex_unlock(&fMuxMsg);
    9094
     95#ifdef DEBUG
    9196        cout << "MsgQueue::Thread: Processing Msg 0x" << hex << fMsg << endl;
     97#endif
    9298        // --- bool quit = fMsg==WM_QUIT;
    9399        fRc=Proc(fMsg, fMp);
     100#ifdef DEBUG
    94101        cout << "MsgQueue::PostMsg: Msg 0x" << hex << fMsg << " processed (rc=" << fRc << ")" << endl;
     102#endif
    95103
    96104        // --- if (quit)
     
    119127    // stopped and the messages are processed serialized
    120128    //
     129#ifdef DEBUG
    121130    cout << "MsgQueue::PostMsg: Locking MsgQueue mutex..." << flush;
     131#endif
    122132    pthread_mutex_lock(&fMuxMsg);
     133#ifdef DEBUG
    123134    cout << "done." << endl;
     135#endif
    124136
    125137    //
     
    134146    {
    135147        pthread_mutex_unlock(&fMuxMsg);
     148#ifdef DEBUG
    136149        cout << "------------> MsgQueue::PostMsg: Proc still pending... Message IGNORED." << endl;
     150#endif
    137151        return NULL;
    138152    }
    139153    /**** NEW 20/01/2003 ****/
     154#ifdef DEBUG
    140155    cout << "MsgQueue::PostMsg: ---> Break <---" << endl;
     156#endif
    141157    fBreak = 1;
    142158
     
    156172    // Start Proc()
    157173    //
     174#ifdef DEBUG
    158175    cout << "MsgQueue::PostMsg: Releasing MsgQueue mutex..." << flush;
     176#endif
    159177    fStart = 1;
    160178    pthread_mutex_unlock(&fMuxMsg);
     179#ifdef DEBUG
    161180    cout << "done." << endl;
     181#endif
    162182
    163183    /*
     
    175195    //    usleep(1);
    176196 
     197#ifdef DEBUG
    177198    cout << "MsgQueue::PostMsg: Returning rc = " << hex << rc << endl;
     199#endif
    178200    return rc;
    179201}
  • trunk/MagicSoft/Cosy/bending_magic.txt

    r1806 r1953  
    1 MAGIC1 2003/03/02 21:59:35.620239
     1MAGIC1 2003/03/07 20:40:26.88604
    22S   00   000000   000000  0000000
    3  IA     -49.372136 -1
    4  IE     1.8923836 -1
    5  CA     -0.84914789 -1
    6  NPAE   -2.142261 -1
    7  AN     0.90833138 -1
    8  AW     0.93094796 -1
    9  NRX    24.647251 -1
    10  NRY    1.4925634 -1
     3 IA     499.0188249 -1
     4 IE     -10.741869 -1
     5 CA     -0.23939033 -1
     6 NPAE   2.3247554 -1
     7 AN     0          -1
     8 AW     -1.1901258 -1
     9 NRX    0 -1
     10 NRY    0 -1
    1111 CRX    0 -1
    1212 CRY    0 -1
    13  ECES   15.454204 -1
    14  ACES   0.090104657 -1
    15  ECEC   -4.7751393 -1
    16  ACEC   -0.082728729 -1
    17  MAGIC1 0.1424389 -1
     13 ECES   0 -1
     14 ACES   0 -1
     15 ECEC   0 -1
     16 ACEC   0 -1
     17 MAGIC1 0 -1
    1818 MAGIC2 0 -1
    1919END
  • trunk/MagicSoft/Cosy/candrv/network.cc

    r1727 r1953  
    9797
    9898        case kSDO_TX3:       // answer to 0x40 with 2 bytes of data
    99             fNodes[node]->HandleSDO(idx, subidx, data>>16, tv);
     99            fNodes[node]->HandleSDO(idx, subidx, data&0xffff, tv);
    100100            return;
    101101
    102102        case kSDO_TX1:       // answer to 0x40 with 1 byte  of data
    103             fNodes[node]->HandleSDO(idx, subidx, data>>24, tv);
     103            fNodes[node]->HandleSDO(idx, subidx, data&0xff, tv);
    104104            return;
    105105
  • trunk/MagicSoft/Cosy/candrv/nodedrv.cc

    r1804 r1953  
    526526void NodeDrv::StopGuarding()
    527527{
     528    if (!fTimerOn)
     529        return;
     530
    528531    fTimeout->TurnOff();
    529532    fTimerOn = kFALSE;
  • trunk/MagicSoft/Cosy/candrv/vmodican.cc

    r1804 r1953  
    880880
    881881    while (!Send(&msg));
    882 
     882#ifdef EXPERT
    883883    lout << "- CobId 0x" << hex << setfill('0') << setw(3) << cobid << " enabled." << endl;
     884#endif
    884885}
    885886
  • trunk/MagicSoft/Cosy/catalog/SlaStars.h

    r1758 r1953  
    4040    ZdAz   CalcZdAz (const RaDec &radec) const;
    4141
     42    AltAz  CalcAltAz(const RaDec &radec, double mjd)
     43    { SetMjd(mjd); return CalcAltAz(radec); }
     44    ZdAz   CalcZdAz (const RaDec &radec, double mjd)
     45    { SetMjd(mjd); return CalcZdAz(radec); }
     46
    4247    AltAz  CalcAltAzFast(const RaDec &radec) const;
    4348    ZdAz   CalcZdAzFast (const RaDec &radec) const;
  • trunk/MagicSoft/Cosy/catalog/StarCatalog.cc

    r1803 r1953  
    1414ClassImp(StarCatalog);
    1515
    16 StarCatalog::StarCatalog(MObservatory::LocationName_t key) : SlaStars(key), fEntries(0)
     16StarCatalog::StarCatalog(MObservatory::LocationName_t key) : SlaStars(key), fEntries(0), fSinAngle(0), fCosAngle(1)
    1717{
    1818    // p = pointer to MainFrame (not owner)
     
    505505    // Align alt/az[pix]
    506506    //
    507     const int xx = 767-(int)((fWidth-dx+DPI)/fPixSize);
    508     const int yy =     (int)((fHeight+dy)/fPixSize);
     507    const int xx = (int)(((dx-DPI)*fCosAngle - dy*fSinAngle + fWidth)/fPixSize);
     508    const int yy = (int)(((dx-DPI)*fSinAngle + dy*fCosAngle + fHeight)/fPixSize);
     509    //const int xx = 767-(int)((fWidth-dx+DPI)/fPixSize);
     510    //const int yy =     (int)((fHeight+dy)/fPixSize);
    509511
    510512    //
     
    685687
    686688            //
    687             // Align alt/az[pix]
    688             //
    689             const float xx = 768.0 - (fWidth -dx+DPI)/fPixSize;
    690             const float yy =         (fHeight+dy)    /fPixSize;
     689            // Align and rotate alt/az[pix]
     690            //
     691            float xx = ((dx-DPI)*fCosAngle - dy*fSinAngle + fWidth)/fPixSize;
     692            float yy = ((dx-DPI)*fSinAngle + dy*fCosAngle + fHeight)/fPixSize;
    691693
    692694            //
     
    710712AltAz StarCatalog::CalcAltAzFromPix(Double_t pixx, Double_t pixy) const
    711713{
    712     Double_t dx = (pixx-768.0)*fPixSize + fWidth+DPI;
    713     Double_t dy =         pixy*fPixSize - fHeight;
     714    pixx *= fPixSize;
     715    pixy *= fPixSize;
     716
     717    const double dx =  (pixx-fWidth)*fCosAngle + (pixy-fHeight)*fSinAngle;
     718    const double dy = -(pixx-fWidth)*fSinAngle + (pixy-fHeight)*fCosAngle;
     719
     720    //const double dx = (pixx-768.0)*fPixSize + fWidth+DPI;
     721    //const double dy =         pixy*fPixSize - fHeight;
    714722
    715723    double ha, dec;
  • trunk/MagicSoft/Cosy/catalog/StarCatalog.h

    r1803 r1953  
    2828    double   fWidth;    // size of display
    2929    double   fHeight;   //
     30    double   fSinAngle;
     31    double   fCosAngle;
    3032
    3133    float    fLimitMag; // [M] limiting magnitude for display
     
    8789    void  SetPixSize(const double pixsize);
    8890    void  SetLimitMag(const float mag) { fLimitMag = mag; }
     91    void  SetRotationAngle(const float angle) { fSinAngle = sin(angle/kRad2Deg); fCosAngle = cos(angle/kRad2Deg); }
    8992
    9093    double GetPixSize() const;
  • trunk/MagicSoft/Cosy/cosy.cc

    r1727 r1953  
    2525    gLog << "==================================================" << endl;
    2626    gLog << "                    Cosy V0.1                     " << endl;
    27     gLog << "       Magic Drive Control System Softwware       " << endl;
     27    gLog << "       Magic Drive Control System Software        " << endl;
    2828    gLog << "            Compiled on <" << __DATE__ << ">"       << endl;
    2929    gLog << "               Using ROOT v" << ROOTVER             << endl;
     
    3939    MLog *l = new MLog("log/cosy.log", kTRUE);
    4040    MLog &lout = *l;
    41     lout.EnableOutputDevice(MLog::eStdout);
    4241
    4342    clog("Starting Cosy at " << time.GetTimeStr() << " ...");
     
    7675
    7776    clog("- Starting MCosy.");
     77    lout.DisableOutputDevice(MLog::eStdout);
    7878    cosy->Start();
    7979
  • trunk/MagicSoft/Cosy/devdrv/macs.cc

    r1804 r1953  
    4646    switch (idx)
    4747    {
     48    case 0x1003:
     49        // FIXME, see Init
     50        if (subidx!=2)
     51            return;
     52        lout << "- " << GetNodeName() << ": Error[0]=" << dec << val << endl;
     53        SetError(val);
     54        return;
     55
    4856    case 0x100a:
    4957        lout << "- " << GetNodeName() << ": Using Software Version V" << dec << (int)(val>>16) << "." << (int)(val&0xff) << endl;
     
    221229}
    222230
    223 
    224231void Macs::Init()
    225232{
     233    //
     234    // Request current error status (FIXME: is the first entry in the
     235    // error list)
     236    //
     237    lout << "- " << GetNodeName() << ": Requesting Error[0]." << endl;
     238    RequestSDO(0x1003, 2);
     239    WaitForSdo(0x1003, 2);
    226240    if (HasError())
    227241    {
     
    238252    RequestSDO(0x100a);
    239253    WaitForSdo(0x100a);
    240 
    241254    if (IsZombieNode())
    242     {
    243         lout << GetNodeName() << " - InitDevice failed!" << endl;
    244         return;
    245     }
     255        return;
    246256
    247257    // FIXME! Not statically linked!
     
    538548        return;
    539549
     550    case 71:
     551        lout << "Array out of bound." << endl;
     552        return;
     553
    540554    case 84:
    541555        lout << "Too many (>12) ON TIME calls." << endl;
  • trunk/MagicSoft/Cosy/devdrv/shaftencoder.cc

    r1804 r1953  
    4040            default:
    4141                lout << "?" << endl;
     42                SetZombie();
    4243                return;
    4344            }
    4445        default:
    4546            lout << "???" << endl;
     47            SetZombie();
    4648            return;
    4749        }
     
    8890
    8991    case 0x6502:
    90         if (val==0)
    91             val = 1;  // Single Turn = Multiturn with one turn
    92         lout << "- Possible Turns: " << dec << val << endl;
     92        //if (val==0)
     93        //    val = 1;  // Single Turn = Multiturn with one turn
     94        lout << "- Number of Revolutions: " << dec << val << endl;
    9395        fTurns = val;
    9496        return;
     
    105107    if (IsZombieNode())
    106108    {
    107         fLabel[0]->SetText(new TGString(""));
    108         fLabel[1]->SetText(new TGString(""));
    109         fLabel[2]->SetText(new TGString(""));
     109        fLabel->SetText(new TGString(""));
    110110        fUpdPos = ~fPos;
    111         fUpdVel = ~fVel;
    112         fUpdAcc = ~fAcc;
    113111        return;
    114112    }
     
    116114    char text[21];
    117115
    118     if (fPos!=fUpdPos && fLabel[0])
     116    if (fPos!=fUpdPos && fLabel)
    119117    {
    120118        sprintf(text, "%ld", fPos);
    121         fLabel[0]->SetText(new TGString(text));
     119        fLabel->SetText(new TGString(text));
    122120        fUpdPos = fPos;
    123     }
    124 
    125     if (fVel!=fUpdVel && fLabel[1])
    126     {
    127         sprintf(text, "%d", fVel);
    128         fLabel[1]->SetText(new TGString(text));
    129         fUpdVel = fVel;
    130     }
    131 
    132     if (fAcc!=fUpdAcc && fLabel[2])
    133     {
    134         sprintf(text, "%d", fAcc);
    135         fLabel[2]->SetText(new TGString(text));
    136         fUpdAcc = fAcc;
    137121    }
    138122}
     
    183167    fAcc = data[6] | (data[7]<<8);
    184168
    185     const int uplim = 9*fTicks/10;
    186     const int dnlim = 1*fTicks/10;
     169    const int dnlim = fTicks/10;
     170    const int uplim = fTurns*fTicks-dnlim;
    187171
    188172    int turn = fTurn;
     
    199183    fPos  = pos;
    200184    fTurn = turn;
    201 
    202     //fout << dec << (int)GetId() << " " << turn << " " << pos << endl;
    203185
    204186    fTime.SetTimer(tv);
     
    230212    RequestSDO(0x1000);
    231213    WaitForSdo(0x1000);
    232 
    233214    if (IsZombieNode())
    234     {
    235         lout << GetNodeName() << " - Init failed!" << endl;
    236         return;
    237     }
     215        return;
    238216
    239217    //
  • trunk/MagicSoft/Cosy/devdrv/shaftencoder.h

    r1727 r1953  
    1717    WORD_t   fTurns; // Number of possible turns
    1818
    19     TGLabel **fLabel;     //
     19    TGLabel  *fLabel;     //
    2020    LWORDS_t  fUpdPos;    // ticks
    21     WORDS_t   fUpdVel;    // ticks per 5ms
    22     WORDS_t   fUpdAcc;    // ticks per 25ms^2
     21    //    WORDS_t   fUpdVel;    // ticks per 5ms
     22    //    WORDS_t   fUpdAcc;    // ticks per 25ms^2
    2323
    2424    bool fPosHasChanged;  //!
     
    4040    void StopDevice();
    4141
    42     void SetDisplay(TGLabel **label) { fLabel = label; }
     42    void SetDisplay(TGLabel *label) { fLabel = label; }
    4343
    4444    void HandleSDO(WORD_t idx, BYTE_t subidx, LWORD_t val, timeval_t *tv);
  • trunk/MagicSoft/Cosy/gui/MGAccuracy.cc

    r1819 r1953  
    246246    //
    247247    // calculate actual time for planet positions
     248    // acc [deg]
    248249    //
    249250    static int X = ~0;
  • trunk/MagicSoft/Cosy/gui/MGCosy.cc

    r1793 r1953  
    3232
    3333#undef DEBUG
     34#define EXPERT
    3435
    3536ClassImp(MGCosy);
     
    4445    kPB_TRACK,
    4546    kPB_STOP,
    46     kPB_HOME,
     47    kPB_TRACKPOS,
    4748    kPB_CALCALTAZ,
    4849    kPB_TPOINT,
     
    126127    fList->Add(l);
    127128
    128     fLabel1 = new TGLabel*[3];
    129     fLabel1[0] = new TGLabel(f, "00000"); // Max: 16384
    130     fLabel1[1] = new TGLabel(f, "000");   // Max: 256
    131     fLabel1[2] = new TGLabel(f, "000");   // Max: 256
    132     fLabel1[0]->SetTextJustify(kTextRight);
    133     fLabel1[1]->SetTextJustify(kTextRight);
    134     fLabel1[2]->SetTextJustify(kTextRight);
    135     fLabel1[0]->Move(x,    y+40);
    136     fLabel1[1]->Move(x+43, y+40);
    137     fLabel1[2]->Move(x+70, y+40);
    138     fList->Add(fLabel1[0]);
    139     fList->Add(fLabel1[1]);
    140     fList->Add(fLabel1[2]);
    141     //f->AddFrame(fLabel1[0]);
    142     //f->AddFrame(fLabel1[1]);
    143     //f->AddFrame(fLabel1[2]);
    144 
    145     fLabel2 = new TGLabel*[3];
    146     fLabel2[0] = new TGLabel(f, "00000");
    147     fLabel2[1] = new TGLabel(f, "000");
    148     fLabel2[2] = new TGLabel(f, "000");
    149     fLabel2[0]->SetTextJustify(kTextRight);
    150     fLabel2[1]->SetTextJustify(kTextRight);
    151     fLabel2[2]->SetTextJustify(kTextRight);
    152     fLabel2[0]->Move(x,    y+57);
    153     fLabel2[1]->Move(x+43, y+57);
    154     fLabel2[2]->Move(x+70, y+57);
    155     fList->Add(fLabel2[0]);
    156     fList->Add(fLabel2[1]);
    157     fList->Add(fLabel2[2]);
    158     //f->AddFrame(fLabel2[0]);
    159     //f->AddFrame(fLabel2[1]);
    160     //f->AddFrame(fLabel2[2]);
    161 
    162     fLabel3 = new TGLabel*[3];
    163     fLabel3[0] = new TGLabel(f, "00000");
    164     fLabel3[1] = new TGLabel(f, "000");
    165     fLabel3[2] = new TGLabel(f, "000");
    166     fLabel3[0]->SetTextJustify(kTextRight);
    167     fLabel3[1]->SetTextJustify(kTextRight);
    168     fLabel3[2]->SetTextJustify(kTextRight);
    169     fLabel3[0]->Move(x,    y+74);
    170     fLabel3[1]->Move(x+43, y+74);
    171     fLabel3[2]->Move(x+70, y+74);
    172     fList->Add(fLabel3[0]);
    173     fList->Add(fLabel3[1]);
    174     fList->Add(fLabel3[2]);
    175     //f->AddFrame(fLabel3[0]);
    176     //f->AddFrame(fLabel3[1]);
    177     //f->AddFrame(fLabel3[2]);
     129    fLabel1 = new TGLabel(f, "00000"); // Max: 16384
     130    fLabel2 = new TGLabel(f, "00000");
     131    fLabel3 = new TGLabel(f, "00000");
     132    fLabel1->SetTextJustify(kTextRight);
     133    fLabel2->SetTextJustify(kTextRight);
     134    fLabel3->SetTextJustify(kTextRight);
     135    fLabel1->Move(x, y+40);
     136    fLabel2->Move(x, y+57);
     137    fLabel3->Move(x, y+74);
     138    fList->Add(fLabel1);
     139    fList->Add(fLabel2);
     140    fList->Add(fLabel3);
    178141
    179142    l = new TGLabel(f, "Offset-Zd:");
     
    250213    fAvailMac1 = new TGLabel(f, "- MAC1 -");
    251214    fAvailMac2 = new TGLabel(f, "- MAC2 -");
    252     fAvailMac3 = new TGLabel(f, "- MAC3 -");
     215    //fAvailMac3 = new TGLabel(f, "- MAC3 -");
    253216    fAvailSe1  = new TGLabel(f, "-SE/Zd1-");
    254217    fAvailSe2  = new TGLabel(f, "-SE/Zd2-");
     
    261224    fAvailMac1->SetBackgroundColor(color);
    262225    fAvailMac2->SetBackgroundColor(color);
    263     fAvailMac3->SetBackgroundColor(color);
     226    //fAvailMac3->SetBackgroundColor(color);
    264227    fAvailSe1->SetBackgroundColor(color);
    265228    fAvailSe2->SetBackgroundColor(color);
     
    281244    fAvailMac1->Move(10, 25+120);
    282245    fAvailMac2->Move(10, 25+140);
    283     fAvailMac3->Move(10, 25+160);
     246    //fAvailMac3->Move(10, 25+160);
    284247    fAvailSe1->Move(10, 25+180);
    285248    fAvailSe2->Move(10, 25+200);
     
    293256    fAvailMac1->Resize(60, 20);
    294257    fAvailMac2->Resize(60, 20);
    295     fAvailMac3->Resize(60, 20);
     258    //fAvailMac3->Resize(60, 20);
    296259    fAvailSe1->Resize(60, 20);
    297260    fAvailSe2->Resize(60, 20);
     
    305268    fList->Add(fAvailMac1);
    306269    fList->Add(fAvailMac2);
    307     fList->Add(fAvailMac3);
     270    //fList->Add(fAvailMac3);
    308271    fList->Add(fAvailSe1);
    309272    fList->Add(fAvailSe2);
     
    332295
    333296    int i=0;
    334     while (!fin.eof())
     297    while (1)
    335298    {
    336299        TString str;
    337300        Double_t zd, az;
    338301        fin >> str >> zd >> az;
     302        if (!fin)
     303            break;
    339304        box->AddEntry(str, i++);
    340305
     
    347312    TGCompositeFrame *tf1 = fTab->AddTab("Position");
    348313    TGCompositeFrame *tf2 = fTab->AddTab("Track");
     314#ifdef EXPERT
    349315    TGCompositeFrame *tf4 = fTab->AddTab("Calib");
    350316    TGCompositeFrame *tf5 = fTab->AddTab("Test SE");
    351317    TGCompositeFrame *tf6 = fTab->AddTab("Gear");
    352     /*TGCompositeFrame *tf3 =*/ fTab->AddTab("Demo");
     318#endif
     319    /*TGCompositeFrame *tf3 =*/// fTab->AddTab("Demo");
    353320
    354321    fCZdAz = new MGCoordinates(tf1, kETypeZdAz);
     
    362329    fList->Add(fCRaDec);
    363330
     331#ifdef EXPERT
    364332    fCCalib = new MGCoordinates(tf4, kETypeRaDec);
    365333    fCCalib->Move(27, 105);
    366334    fList->Add(fCCalib);
     335#endif
    367336
    368337    const int x=15;
     
    372341    TGLabel *l1 = new TGLabel(tf1, "Move the telescope to a position given in");
    373342    TGLabel *l2 = new TGLabel(tf1, "local coordinates. The given coordinates");
    374     TGLabel *l3 = new TGLabel(tf1, "are pointing coordinates, which means that the");
    375     TGLabel *l4 = new TGLabel(tf1, "coordinates are corrected for the bending of");
    376     TGLabel *l5 = new TGLabel(tf1, "the telescope.");
     343    TGLabel *l3 = new TGLabel(tf1, "are pointing coordinates. Enter the coordinates");
     344    TGLabel *l4 = new TGLabel(tf1, "manually or choose a predefined position");
     345    TGLabel *l5 = new TGLabel(tf1, "from the combobox below.");
    377346    l1->Move(x, y);
    378347    l2->Move(x, y+h);
     
    396365    fList->Add(l3);
    397366
     367#ifdef EXPERT
    398368    l1 = new TGLabel(tf4, "Start the calibration using the Start button.");
    399369    l2 = new TGLabel(tf4, "Write a coordinate pair to a TPoint file using");
    400     l3 = new TGLabel(tf4, "the TPoint button. To set the Shaftencoder offset");
    401     l4 = new TGLabel(tf4, "use the Calib SE button.");
     370    l3 = new TGLabel(tf4, "the TPoint button.");
     371    //l3 = new TGLabel(tf4, "the TPoint button. To set the Shaftencoder offset");
     372    //l4 = new TGLabel(tf4, "use the Calib SE button.");
    402373    l1->Move(x, y);
    403374    l2->Move(x, y+h);
     
    425396    l1->Move(x, y);
    426397    fList->Add(l1);
     398#endif
    427399
    428400    //
     
    465437    fList->Add(but);
    466438
    467     but = new TGTextButton(tf1, "Home", kPB_HOME);
    468     but->Resize(80, 25);
    469     but->Move(160, 197);
    470     but->SetToolTipText("Initiate Home Drive.");
     439    but = new TGTextButton(tf1, "Move'n'Track", kPB_TRACKPOS);
     440    but->Resize(100, 25);
     441    but->Move(25, 242);
     442    but->SetToolTipText("Move telescope to a Zd/Az position and start tracking.");
    471443    but->Associate(this);
    472444    fList->Add(but);
    473445
     446    but= new TGTextButton(tf2, "Calc Zd/Az",  kPB_CALCALTAZ);
     447    but->Resize(80, 25);
     448    but->Move(165, 197);
     449    but->SetToolTipText("Calculate Zd/Az corresponding to Ra/Dec.");
     450    but->Associate(this);
     451    fList->Add(but);
     452
     453#ifdef EXPERT
    474454    but = new TGTextButton(tf5, "Display", kPB_DISPLAY1);
    475455    but->Resize(80, 25);
     
    486466    fList->Add(but);
    487467
    488     but= new TGTextButton(tf2, "Calc Zd/Az",  kPB_CALCALTAZ);
    489     but->Resize(80, 25);
    490     but->Move(165, 197);
    491     but->SetToolTipText("Calculate Zd/Az corresponding to Ra/Dec.");
    492     but->Associate(this);
    493     fList->Add(but);
    494 
    495     but = new TGTextButton(tf4, "TPoint", kPB_TPOINT);
    496     but->Resize(80, 25);
    497     but->Move(25, 190);
    498     but->SetToolTipText("Trigger writing a tpoint coordinate pair.");
    499     but->Associate(this);
    500     fList->Add(but);
    501 
     468    /*
    502469    but = new TGTextButton(tf4, "Calib SE", kPB_CALIBSE);
    503470    but->Resize(80, 25);
     
    506473    but->Associate(this);
    507474    fList->Add(but);
    508 
     475    */
    509476    but = new TGTextButton(tf4, "Load", kPB_LoadBending);
    510477    but->Resize(80, 25);
    511     but->Move(25, 220);
     478    but->Move(25, 190);
    512479    but->SetToolTipText("Load bending corrections from file 'bending.txt'");
    513480    but->Associate(this);
     
    516483    but = new TGTextButton(tf4, "Reset", kPB_ResetBending);
    517484    but->Resize(80, 25);
    518     but->Move(25, 250);
     485    but->Move(25, 220);
    519486    but->SetToolTipText("Reset bending correction (coefficients=0)");
    520487    but->Associate(this);
    521488    fList->Add(but);
     489
     490    but = new TGTextButton(tf4, "TPoint", kPB_TPOINT);
     491    but->Resize(80, 25);
     492    but->Move(25, 250);
     493    but->SetToolTipText("Trigger writing a tpoint coordinate pair.");
     494    but->Associate(this);
     495    fList->Add(but);
     496#endif
    522497
    523498    ULong_t color;
     
    958933                    ZdAz soll, UInt_t stat, UInt_t stat2)
    959934{
     935    // acc [rad]
     936    acc *= kRad2Deg;   // [deg]
     937
    960938    double mjd = UpdateTime();
    961939    fSkyPosition->Update(pos, mjd);
     
    984962    SetLabelColor(fAvailMac1, stat2&0x01);
    985963    SetLabelColor(fAvailMac2, stat2&0x02);
    986     SetLabelColor(fAvailMac3, stat2&0x04);
     964    //SetLabelColor(fAvailMac3, stat2&0x04);
    987965    SetLabelColor(fAvailSe1,  stat2&0x08);
    988966    SetLabelColor(fAvailSe2,  stat2&0x10);
     
    10331011}
    10341012
     1013void MGCosy::StartTrackPos()
     1014{
     1015    cout << "Start tracking Zd/Az pos." << endl;
     1016
     1017    const XY &xy = fCZdAz->GetCoordinates();
     1018
     1019    ZdAz za(xy.X(), xy.Y());
     1020
     1021    cout << za.Zd() << "\xb0 " << za.Az() << "\xb0" << endl;
     1022
     1023    fQueue->PostMsg(WM_TRACKPOS, &za, sizeof(za));
     1024
     1025    cout << "PostMsg (WM_TrackPos) returned." << endl;
     1026}
     1027
    10351028void MGCosy::StartPos()
    10361029{
     
    10501043// ************************** For demo purpose **********************
    10511044//
     1045/*
    10521046#include <TRandom.h>
    10531047class MDemo : public MThread
     
    10681062            Timer tm;
    10691063            tm.Now();
    1070             /*
    1071             Float_t h = 2.+tm.H()+(10.7+tm.M())/60.;
    1072             RaDec dest(h*15, 129.7);
    1073 
    1074             cout << dest.Ra()/15 << "h " << dest.Dec() << "°" << endl;
    1075 
    1076             fQueue->PostMsg(WM_TRACK, &dest, sizeof(dest));
     1064
     1065            //fQueue->PostMsg(WM_STOP, 0, 0);
     1066
     1067            ZdAz dest1((float)fRand.Integer(120)-60., 0);//fRand.Integer(25)+90);
     1068
     1069            cout << "Demo: Zd=" << dest1.Zd() << "° Az=" << dest1.Az() << "°" << endl;
     1070
     1071            fQueue->PostMsg(WM_POSITION, &dest1, sizeof(dest1));
    10771072
    10781073            int i = 0;
    1079             while (!HasStopFlag() && i++<60)  // 2.5min
    1080             usleep(1000000);
    1081             if (HasStopFlag())
    1082                 break;
    1083             */
    1084 
    1085             //fQueue->PostMsg(WM_STOP, 0, 0);
    1086 
    1087             ZdAz dest1((float)fRand.Integer(120)-60., 0);//fRand.Integer(25)+90);
    1088 
    1089             cout << "Demo: Zd=" << dest1.Zd() << "° Az=" << dest1.Az() << "°" << endl;
    1090 
    1091             fQueue->PostMsg(WM_POSITION, &dest1, sizeof(dest1));
    1092 
    1093             int i = 0;
    1094             while (!HasStopFlag() && i++<5/*5*/)  // 30s
     1074            while (!HasStopFlag() && i++<5)  // 30s
    10951075                usleep(1000000);
    10961076            if (HasStopFlag())
     
    10991079            //ZdAz dest2(5, 30);
    11001080            //fQueue->PostMsg(WM_POSITION, &dest2, sizeof(dest2));
    1101             /*
    1102             i = 0;
    1103             while (!HasStopFlag() && i++<30)  // 30s
    1104                 usleep(1000000);
    1105             */
    11061081            //if (HasStopFlag())
    11071082            //    break;
     
    11291104    demo.Stop();
    11301105}
    1131 
     1106*/
     1107/*
    11321108void MGCosy::StartCalib()
    11331109{
     
    11411117    cout << "PostMsg (WM_Calib) returned." << endl;
    11421118}
    1143 
     1119*/
    11441120void MGCosy::StartTPoint()
    11451121{
     
    12131189                    fQueue->Proc(WM_GEAR, (void*)1);
    12141190                    return kTRUE;
     1191                    /*
    12151192                case 5:
    12161193                    StartDemo();
    12171194                    return kTRUE;
     1195                    */
    12181196                }
    12191197                return kTRUE;
     
    12211199            case kPB_STOP:
    12221200                cout << "Sending stop movement msg." << endl;
    1223                 StopDemo();
     1201                //StopDemo();
    12241202                fQueue->PostMsg(WM_STOP, 0, 0);
    12251203                if (fTab->GetCurrent()==3)
     
    12701248                StartTPoint();
    12711249                return kTRUE;
     1250                /*
    12721251            case kPB_CALIBSE:
    12731252                StartCalib();
    12741253                return kTRUE;
     1254                */
    12751255            case kPB_LoadBending:
    12761256                fQueue->Proc(WM_LOADBENDING, NULL);
     
    12791259                fQueue->Proc(WM_RESETBENDING, NULL);
    12801260                return kTRUE;
     1261                /*
    12811262            case kPB_HOME:
    12821263                fQueue->PostMsg(WM_HOME, 0, 0);
     1264                return kTRUE;
     1265                */
     1266            case kPB_TRACKPOS:
     1267                StartTrackPos();
    12831268                return kTRUE;
    12841269            case kPB_DISPLAY1:
  • trunk/MagicSoft/Cosy/gui/MGCosy.h

    r1760 r1953  
    4949    MGList        *fList;
    5050
    51     TGLabel      **fLabel1;
    52     TGLabel      **fLabel2;
    53     TGLabel      **fLabel3;
     51    TGLabel       *fLabel1;
     52    TGLabel       *fLabel2;
     53    TGLabel       *fLabel3;
    5454
    5555    TGLabel       *fOffsetZd;
     
    104104    void StartPos();
    105105    void StartTrack();
     106    void StartTrackPos();
    106107    void StartDemo();
    107     void StartCalib();
     108    //void StartCalib();
    108109    void StartTPoint();
    109110
     
    121122    void CloseWindow();
    122123
    123     TGLabel **GetLabel1() const { return fLabel1; }
    124     TGLabel **GetLabel2() const { return fLabel2; }
    125     TGLabel **GetLabel3() const { return fLabel3; }
     124    TGLabel *GetLabel1() const { return fLabel1; }
     125    TGLabel *GetLabel2() const { return fLabel2; }
     126    TGLabel *GetLabel3() const { return fLabel3; }
    126127
    127128    TGListBox *GetLog() const { return fLog; }
  • trunk/MagicSoft/Cosy/gui/MGStarguider.cc

    r1819 r1953  
    7474    IDM_kLimMag9,
    7575    IDM_kPixSize,
     76    IDM_kAngle,
    7677    IDM_kInterpol125,
    7778    IDM_kInterpol25,
     
    217218    fWriteType->AddEntry("&Once",      IDM_kOnce);
    218219    fWriteType->AddEntry("&Continous", IDM_kContinous);
     220    fWriteType->CheckEntry(IDM_kOnce);
    219221    fWriteType->Associate(this);
    220222    fList->Add(fWriteType);
     
    334336    l = new TGLabel(this, "arcsec/pix");
    335337    l->SetTextJustify(kTextLeft);
    336     l->Move(605, fMenu->GetDefaultHeight()+619);
     338    l->Move(605, fMenu->GetDefaultHeight()+619+13);
     339    AddFrame(l);
     340    fList->Add(l);
     341
     342    l = new TGLabel(this, "deg");
     343    l->SetTextJustify(kTextLeft);
     344    l->Move(605, fMenu->GetDefaultHeight()+619-10);
    337345    AddFrame(l);
    338346    fList->Add(l);
     
    347355
    348356    fSao->SetPixSize(pixsize/3600);
     357    fSao->SetRotationAngle(0);
    349358
    350359    TString txt;
     
    353362    fPixSize = new TGTextEntry(this, txt, IDM_kPixSize);
    354363    fPixSize->SetAlignment(kTextCenterX);
    355     fPixSize->Move(547, fMenu->GetDefaultHeight()+617);
     364    fPixSize->Move(547, fMenu->GetDefaultHeight()+617+13);
    356365    AddFrame(fPixSize);
    357366    fList->Add(fPixSize);
     367
     368    fAngle = new TGTextEntry(this, "         0", IDM_kAngle);
     369    fAngle->SetAlignment(kTextCenterX);
     370    fAngle->Move(547, fMenu->GetDefaultHeight()+617-10);
     371    AddFrame(fAngle);
     372    fList->Add(fAngle);
    358373
    359374    // TGHorizontal3DLine *fLineSep = new TGHorizontal3DLine(this);
     
    582597    case kC_TEXTENTRY:
    583598        if (GET_SUBMSG(msg)==kTE_ENTER)
    584         {
    585             const Float_t pixsize = atof(fPixSize->GetText());
    586             cout << "Pixel Size changed to " << pixsize << "\"/pix" << endl;
    587             fSao->SetPixSize(pixsize/3600);
    588         }
     599            switch (mp1)
     600            {
     601            case IDM_kPixSize:
     602                {
     603                    const Float_t pixsize = atof(fPixSize->GetText());
     604                    cout << "Pixel Size changed to " << pixsize << "\"/pix" << endl;
     605                    fSao->SetPixSize(pixsize/3600);
     606                    return kTRUE;
     607                }
     608            case IDM_kAngle:
     609                {
     610                    const Float_t angle = atof(fAngle->GetText());
     611                    cout << "Rotation Angle changed to " << angle << "deg" << endl;
     612                    fSao->SetRotationAngle(angle);
     613                    return kTRUE;
     614                }
     615            }
    589616        return kTRUE;
    590617
     
    896923    AltAz pos1 = fSao->CalcAltAzFromPix(768/2+g.GetMean(1), 576/2+g.GetMean(2))*kRad2Deg;
    897924
     925    ofstream fout1("pointingpos.txt");
     926    fout1 << setprecision(10) << fSao->GetMjd()-52000 << " " << -pos1.Alt() << " " << pos1.Az() << endl;
     927
    898928    pos1 -= pos0;
    899929
    900     ofstream fout("tracking_error.txt");
    901     fout << setprecision(10) << fSao->GetMjd()-52000 << " " << -pos1.Alt() << " " << pos1.Az() << endl;
    902     fout.close();
     930    ofstream fout2("tracking_error.txt");
     931    fout2 << setprecision(10) << fSao->GetMjd()-52000 << " " << -pos1.Alt() << " " << pos1.Az() << endl;
    903932
    904933    return ZdAz(-pos1.Alt(), pos1.Az());
     
    11721201    fDy = dy;
    11731202
    1174     cout << "New coordinates for zoom: " << fDx << " " << fDy << endl;
     1203    fSao->Now();
     1204    AltAz aa = fSao->CalcAltAzFromPix(fDx, fDy)*kRad2Deg;
     1205
     1206    cout << "New coordinates for zoom - x, y   : " << fDx << " " << fDy << endl;
     1207    cout << "New coordinates for zoom - Alt, az: " << aa.Alt() << " " << aa.Az() << endl;
    11751208
    11761209    return kTRUE;
  • trunk/MagicSoft/Cosy/gui/MGStarguider.h

    r1819 r1953  
    8989
    9090    TGTextEntry   *fPixSize;
     91    TGTextEntry   *fAngle;
    9192
    9293    StarCatalog   *fSao;
  • trunk/MagicSoft/Cosy/main/MBending.h

    r1805 r1953  
    11#ifndef COSY_MBending
    22#define COSY_MBending
    3 
    4 #include <TROOT.h>
    5 
    6 #include <fstream.h>
    73
    84#include "coord.h"
     
    5349public:
    5450    MBending() { Clear(); }
     51    MBending(const char *name) { Clear(); Load(name); }
    5552
    5653    void Load(const char *name);
  • trunk/MagicSoft/Cosy/main/MCosy.cc

    r1819 r1953  
    1313
    1414#include <TH2.h>
     15#include <TH3.h>
    1516#include <TProfile.h>
    1617#include <TCanvas.h>
     
    7677}
    7778
     79/*
    7880ZdAz MCosy::CorrectTarget(const ZdAz &src, const ZdAz &dst)
    7981{
     
    145147    return ret*(16384.0/360.0);
    146148}
     149*/
    147150
    148151// --------------------------------------------------------------------------
     
    329332{
    330333    // FIXME, what when waiting times out (Zombie)
     334
    331335    while ((fMac1->IsPositioning() || fMac2->IsPositioning()) &&
    332            !(Break() || HasError()) && !HasZombie())
     336           !(Break() || HasError() || HasZombie()))
    333337        usleep(1);
    334338
    335339    if (Break() || HasError() || HasZombie())
    336         lout << "WaitForEndMovement aborted..." << endl;
     340    {
     341        lout << "WaitForEndMovement aborted... ";
     342        if (Break())
     343            lout << "Break signal." << endl;
     344        if (HasError())
     345            lout << "Network has error." << endl;
     346        if (HasZombie())
     347            lout << "Network has zombie." << endl;
     348    }
    337349}
    338350
     
    382394}
    383395
     396Bool_t MCosy::CheckRange(const ZdAz &d) const
     397{
     398    // d [deg]
     399
     400    if (d.Zd()<fMin.Zd() || d.Zd()>fMax.Zd())
     401    {
     402        lout << "ERROR: Requested Zenith Angle (" << d.Zd() << "deg) not ";
     403        lout << "inside allowed range." << endl;
     404        return kFALSE;
     405    }
     406
     407    if (d.Az()<fMin.Az() || d.Az()>fMax.Az())
     408    {
     409        lout << "ERROR: Requested Azimuth Angle (" << d.Az() << "deg) not ";
     410        lout << "inside allowed range." << endl;
     411        return kFALSE;
     412    }
     413
     414    return kTRUE;
     415}
     416
    384417// --------------------------------------------------------------------------
    385418//
     
    396429{
    397430    // FIXME: Correct by fOffset ?
    398 /*
    399     ZdAz
    400 
    401     if (dst.Az()<-TMath::Pi()/2)
    402         dst.Az(dst.Az() + TMath::Pi()*2);
    403 
    404     if (dst.Az()>3*TMath::Pi()/2)
    405         dst.Az(dst.Az() -TMath::Pi()*2);
    406 */
    407  //   track=kFALSE;
    408 
    409    // const ZdAz d1 = track ? CorrectTarget(src, dst) : dst*16384/TMath::Pi()/2; // [se]
    410431
    411432    const ZdAz d = dst*kRad2Deg;
     
    413434    lout << "Target Position: " << d.Zd() << "deg, " << d.Az() << "deg (Zd/Az)" << endl;
    414435
    415     if (d.Zd()<fMin.Zd() || d.Zd()>fMax.Zd())
    416     {
    417         lout << "ERROR: Requested Zenith Angle (" << d.Zd() << "deg) not ";
    418         lout << "inside allowed range." << endl;
     436    if (!CheckRange(d))
    419437        return kFALSE;
    420     }
    421 
    422     if (d.Az()<fMin.Az() || d.Az()>fMax.Az())
    423     {
    424         lout << "ERROR: Requested Azimuth Angle (" << d.Az() << "deg) not ";
    425         lout << "inside allowed range." << endl;
    426         return kFALSE;
    427     }
    428438
    429439    //
     
    520530        cout << "Estimated1: " << 16384*dx + dk << endl;
    521531        cout << "Estimated2: " << (16384*dx + dk)/1.085949688 << endl;
     532        cout << "Estimated3: " << rd.Zd()*432 << endl;
    522533        // ===========================================
    523534
     
    775786}
    776787
     788Bool_t MCosy::AlignTrackingPos(ZdAz pointing, ZdAz &za)
     789{
     790    // pointing [deg]
     791
     792    if (pointing.Zd()<0)
     793    {
     794        pointing.Zd(-pointing.Zd());
     795        pointing.Az(pointing.Az()+180);
     796    }
     797
     798    const ZdAz se = GetSePos()*360/16384; // [deg]
     799    const ZdAz unbendedse = fBending.CorrectBack(se); // ist pointing
     800
     801    do
     802    {
     803        const Double_t d = unbendedse.Az() - pointing.Az();
     804        if (d>-180 && d<=180)
     805            break;
     806
     807        pointing.Az(pointing.Az()+TMath::Sign(360., -d));
     808    } while (1);
     809  /*
     810    while (pointing.Az()<fMin.Az())
     811        pointing.Az(pointing.Az() + 360);
     812
     813    while (pointing.Az()>fMax.Az())
     814        pointing.Az(pointing.Az() - 360);
     815        */
     816    const Bool_t rc = CheckRange(pointing);
     817    za = fBending(pointing/kRad2Deg); // [rad]
     818
     819    if (!rc)
     820        lout << "Error: Aligned position out of Range." << endl;
     821
     822    return rc;
     823}
     824
    777825void MCosy::TrackPosition(const RaDec &dst) // ra, dec [rad]
    778826{
     
    787835    ZdAz dest = sla.CalcZdAz(dst);
    788836
     837    // FIXME: Determin tracking start point by star culmination
    789838    if (dest.Az()<-TMath::Pi()/2)
     839    {
     840        lout << "Adding 360deg to Azimuth " << dest.Az()*kRad2Deg << endl;
    790841        dest.Az(dest.Az() + TMath::Pi()*2);
     842    }
    791843
    792844    if (dest.Az()>3*TMath::Pi()/2)
     845    {
     846        lout << "Substracting 360deg to Azimuth " << dest.Az()*kRad2Deg << endl;
    793847        dest.Az(dest.Az() -TMath::Pi()*2);
     848    }
    794849
    795850    if (!SetPosition(dest, kTRUE))
     
    849904    //
    850905    // *OLD*const float dt = 1;  // 1 second
    851     const float dt = 3;  // 2 second
    852     while (!(Break() || HasError()) && !HasZombie())
     906    const float dt = 5;//3;  // 2 second
     907    while (!(Break() || HasError() || HasZombie()))
    853908    {
    854909        //
     
    860915        // Request theoretical Position for a time in the future (To+dt) from CPU
    861916        //
    862         sla.SetMjd(sla.GetMjd()+dt/(60*60*24));
     917        const Double_t mjd = sla.GetMjd()+dt/(60*60*24);
     918        const ZdAz pointing = sla.CalcZdAz(fRaDec, mjd)*kRad2Deg; // soll pointing [deg]
     919
     920        ZdAz dest;
     921        if (!AlignTrackingPos(pointing, dest))
     922            break;
     923
     924        dest *= 16384/TMath::Pi()/2;  // [se]
     925
     926        /*
    863927        ZdAz dummy1 = sla.CalcZdAz(fRaDec);
    864928
     
    868932            dummy1.Az(dummy1.Az() -TMath::Pi()*2);
    869933
     934        if (!CheckRange(dummy1*kRad2Deg))
     935        {
     936            lout << "Error: Tracking position out of Range." << endl;
     937            break;
     938        }
     939
    870940        ZdAz dummy = fBending(dummy1);
    871941        dest = CorrectTarget(GetSePos(), dummy); // [se]
    872 
    873         const ZdAz d = dest*360./16384; // [deg]
     942        */
     943
     944//*LP*      const ZdAz d = dest*360./16384; // [deg]
    874945        dest *= kGearRatio;  // [re]
    875946
    876         ZdAz min = fBending(fMin/kRad2Deg)*kRad2Deg;
    877         ZdAz max = fBending(fMax/kRad2Deg)*kRad2Deg;
    878 
    879         /*
    880         if (d.Zd()<min.Zd() || d.Az()<min.Az())
    881         {
    882             lout << "ERROR: Calculated position for T+dt not inside allowed range." << endl;
    883             lout << "<  " << d.Zd() << " " << min.Zd() << "  " << d.Az() << " " << min.Az()  << endl;
    884             break;
    885         }
    886         if (d.Zd()>max.Zd() || d.Az()>max.Az())
    887         {
    888             lout << "ERROR: Calculated position for T+dt not inside allowed range." << endl;
    889             lout << ">  " <<  d.Zd() << " " << max.Zd() << "  " << d.Az() << " " << max.Az()  << endl;
    890             break;
    891         }
    892         */
     947//*LP*      ZdAz min = fBending(fMin/kRad2Deg)*kRad2Deg;
     948//*LP*      ZdAz max = fBending(fMax/kRad2Deg)*kRad2Deg;
     949
    893950        ZdAz vcalc = sla.GetApproxVel(fRaDec) * kGearRatio2*4./60.;  // [re/min]
    894951
     
    9631020        // (This is important on fast machines >500MHz)
    9641021        //
    965         usleep(50000); // 0.25s
     1022        usleep(1000000); // 1s
    9661023        //usleep(50000); // 0.05s
    9671024    }
     
    9891046    // set deceleration to 50%
    9901047    //
    991     cout << "Stopping movement (dec=20%)..." << endl;
     1048    cout << "Stopping movement (dec=30%)..." << endl;
    9921049
    9931050    fMac1->SetDeceleration(0.3*fMac1->GetVelRes());
     
    11031160        StopMovement();
    11041161        return NULL;
    1105 
     1162/*
    11061163    case WM_PRESET:
    11071164        cout << "WM_Preset: start." << endl;
     
    11131170        cout << "WM_Preset: done. (return 0xaffe)" << endl;
    11141171        return (void*)0xaffe;
    1115 
     1172*/
     1173        /*
    11161174    case WM_CALIB:
    11171175        {
     
    11261184
    11271185            //RaDec rd(37.94, 89.2644);      // POLARIS
    1128             //RaDec rd(213.915417, 19.1825); // ACTURUS
     1186            //RaDec rd(213.915417, 19.1825); // ARCTURUS
    11291187
    11301188            cout << "Calibrating to: " << rd.Ra()*24/360 << "h " << rd.Dec() << "°" << endl;
     
    11441202        }
    11451203        return (void*)0xaffe;
     1204        */
    11461205
    11471206    case WM_TPOINT:
     
    11701229        }
    11711230        return (void*)0xca1b;
     1231
     1232    case WM_TRACKPOS:
     1233        cout << "WM_TrackPosition: start." << endl;
     1234        {
     1235            if (!CheckNetwork())
     1236                return (void*)0xebb0;
     1237
     1238            ZdAz dest = *((ZdAz*)mp) * kDeg2Rad;
     1239            //if (!SetPosition(dest))
     1240            //    return (void*)0x1234;
     1241
     1242            SlaStars sla(fObservatory);
     1243            sla.Now();
     1244
     1245            RaDec rd = sla.CalcRaDec(dest);
     1246            cout << dest.Zd()*180/3.1415 << " " << dest.Az()*180/3.1415 << endl;
     1247            cout << rd.Ra()*12/3.1415 << " " << rd.Dec()*180/3.1415 << endl;
     1248            TrackPosition(rd);
     1249        }
     1250        cout << "WM_TrackPosition: done. (return 0xabcd)" << endl;
     1251        return (void*)0xabcd;
    11721252
    11731253    case WM_POSITION:
     
    12731353            RaDec rd(xy.X()*15., xy.Y()); // [deg]
    12741354
    1275             ZdAz a0 = sla.CalcZdAz(rd*kDeg2Rad);
    1276             ZdAz a1 = fBending(a0);
    1277             ZdAz se = CorrectTarget(GetSePos(), a1);
    1278             a0 *= kRad2Deg;
    1279             a1 *= kRad2Deg;
    1280             ZdAz a2 = a1*16384/360;
     1355            const ZdAz a0 = sla.CalcZdAz(rd*kDeg2Rad);
     1356
     1357            ZdAz a1;
     1358            AlignTrackingPos(a0, a1);
     1359            a1 *= 180/TMath::Pi();
     1360
     1361            const ZdAz a2 = a1*16384/360;
     1362            const ZdAz se = a0*16384/360;
     1363
    12811364            cout << "Ra/Dec source: " << xy.X()  << "h " << xy.Y()  << "°" << endl;
    1282             cout << "Zd/Az source:  " << a0.Zd() << "° " << a0.Az() << "°" << endl;
     1365            cout << "Zd/Az target:  " << a0.Zd() << "° " << a0.Az() << "°" << endl;
    12831366            cout << "Zd/Az bended:  " << a1.Zd() << "° " << a1.Az() << "°" << endl;
     1367            cout << "SE target:     " << se.Zd() << "  " << se.Az() << endl;
    12841368            cout << "SE bended:     " << a2.Zd() << "  " << a2.Az() << endl;
    1285             cout << "SE target:     " << se.Zd() << "  " << se.Az() << endl;
    12861369        }
    12871370        return (void*)0xa17a;
     
    14011484
    14021485    SlaStars sla(fObservatory);
     1486    sla.Now();
    14031487
    14041488    ZdAz old;
    1405     ZdAz ist;
    1406 
    1407     ZdAz sollzd;
    1408     ZdAz sollaz;
    1409 
    1410     ZdAz istre = -fOffset;                // [re]
     1489    ZdAz ist = GetSePos();              // [se]
     1490
     1491//    ZdAz istre = -fOffset;              // [re]
    14111492    ZdAz time;
     1493
     1494    ZdAz sollzd = sla.CalcZdAz(fRaDec); // [rad]
     1495    ZdAz sollaz = sollzd;               // [rad]
    14121496
    14131497    //
     
    14561540         continue;
    14571541         */
    1458         istre = GetRePosPdo();
     1542        ZdAz istre = GetRePosPdo();
    14591543
    14601544        //
     
    14791563        if (phca1 || phca2 /*(int)ist.Zd() != (int)old.Zd()*/)
    14801564        {
    1481             sla.SetMjd(time.Zd());
    1482 
     1565            sollzd = sla.CalcZdAz(fRaDec, time.Zd()); // [rad]
     1566            /*
    14831567            ZdAz dummy = fBending(sla.CalcZdAz(fRaDec));
    14841568            sollzd = CorrectTarget(ist, dummy); // [se]
    1485 
     1569            */
    14861570            fOffset.Zd(fOffset.Zd()*(1.-weight)+(ist.Zd()*kGearRatio.X()-istre.Zd())*weight);
    14871571        }
     
    14891573        if (phcaz /*(int)ist.Az() != (int)old.Az()*/)
    14901574        {
    1491             sla.SetMjd(time.Az());
    1492 
     1575            sollaz = sla.CalcZdAz(fRaDec, time.Az()); // [rad]
     1576            /*
    14931577            ZdAz dummy = fBending(sla.CalcZdAz(fRaDec));
    14941578            sollaz = CorrectTarget(ist, dummy); // [se]
    1495 
     1579            */
    14961580            fOffset.Az(fOffset.Az()*(1.-weight)+(ist.Az()*kGearRatio.Y()-istre.Az())*weight);
    14971581        }
    14981582
    1499         ZdAz soll(sollzd.Zd(), sollaz.Az()); // [se]
     1583        ZdAz soll(sollzd.Zd(), sollaz.Az()); // [rad]
     1584
     1585        AlignTrackingPos(soll*360/16384, fZdAzSoll);
     1586        /*
    15001587        fZdAzSoll = fBending.CorrectBack(soll*2*TMath::Pi()/16384);
    15011588
    1502         fTrackingError.Set((ist.Zd()-sollzd.Zd())*kGearRatio.X(),
    1503                            (ist.Az()-sollaz.Az())*kGearRatio.Y());
     1589        // FIXME?
     1590        if (fZdAzSoll.Az()<-TMath::Pi()/2)
     1591            fZdAzSoll.Az(fZdAzSoll.Az() + TMath::Pi()*2);
     1592        if (fZdAzSoll.Az()>3*TMath::Pi()/2)
     1593            fZdAzSoll.Az(fZdAzSoll.Az() -TMath::Pi()*2);
     1594
     1595        // FIXME?
     1596        while (ist.Az()>3*16384/4/2)
     1597            ist.Az(ist.Az() - 16384);
     1598        while (soll.Az()>3*16384/4/2)
     1599            soll.Az(soll.Az() - 16384);
     1600        while (ist.Az()<-16384/4)
     1601            ist.Az(ist.Az() + 16384);
     1602        while (soll.Az()<-16384/4)
     1603            soll.Az(soll.Az() + 16384);
     1604            */
     1605        ist *= TMath::Pi()*2/16384;
     1606        fTrackingError.Set(ist.Zd()-fZdAzSoll.Zd(), ist.Az()-fZdAzSoll.Az());
    15041607
    15051608        //---            fout << setprecision(15) << setw(17) << time.Zd()*60.*60.*24. << " ";
     
    15861689    }
    15871690
    1588     //    fHist = new TH2F("Gear", "Gear Ratio Re/Se",
    1589     //                     201, fMin.Zd(), fMax.Zd(), 61, 349.5, 500.5);
    1590     fHist = new TH2F("Gear", "Gear Ratio Re/Se",
    1591                      201, fMin.Az(), fMax.Az(), 61, 419.5, 570.5);
    1592     fHist->SetXTitle("ZA [\\circ]");
    1593     fHist->SetYTitle("Re/Se");
     1691    fHist = new TH3F("Gear", "Gear Ratio Re/Se",
     1692                     (int)((fMax.Zd()-fMin.Zd())/2.5+1), fMin.Zd(), fMax.Zd(),
     1693                     (int)((fMax.Az()-fMin.Az())/2.5+1), fMin.Az(), fMax.Az(),
     1694                     61, 349.5, 500.5);
     1695
     1696    fHist->SetXTitle("Zd [\\circ]");
     1697    fHist->SetYTitle("Az [\\circ]");
     1698    fHist->SetZTitle("Re/Se");
    15941699
    15951700    lout << "Starting Gear determination..." << endl;
     
    16141719        ZdAz dre = re-re0;
    16151720
    1616         if (fabs(dse.Zd())*144>16384) // Each 2.5deg
     1721        if (fabs(dse.Zd())*144>16384) // Each 2.5deg (144)
    16171722        {
    16181723            se0.Zd(se.Zd());
     
    16201725
    16211726            ZdAz bend = fBending.CorrectBack(se*2*TMath::Pi()/16384)*kRad2Deg;
    1622             fHist->Fill(bend.Zd(), dre.Zd()/dse.Zd());
     1727            ((TH3*)fHist)->Fill(bend.Zd(), bend.Az(), dre.Zd()/dse.Zd());
    16231728        }
    16241729
    1625         if (fabs(dse.Az())*144>16384) // Each 2.5deg
     1730        if (fabs(dse.Az())*144>16384) // Each 2.5deg (144)
    16261731        {
    16271732            se0.Az(se.Az());
     
    16291734
    16301735            ZdAz bend = fBending.CorrectBack(se*2*TMath::Pi()/16384)*kRad2Deg;
    1631             fHist->Fill(bend.Az(), dre.Az()/dse.Az());
    1632 
    1633             cout << bend.Az() << ": " << dre.Az()/dse.Az() << endl;
     1736            ((TH3*)fHist)->Fill(bend.Az(), bend.Az(), dre.Az()/dse.Az());
    16341737        }
    1635 
    1636         /*
    1637         const Double_t pos[3] = {
    1638             (fZd1->GetPos()+8192)%16384,
    1639             (fZd2->GetPos()+8192)%16384,
    1640             fAz->GetPos() };
    1641 
    1642         //
    1643         //  Estimate Offset from the first ten positions
    1644         //
    1645         if (cnt++<10)
    1646         {
    1647             offset += pos[0]+pos[1];
    1648             continue;
    1649         }
    1650         if (cnt==11)
    1651         {
    1652             offset /= 10;
    1653             cnt++;
    1654         }
    1655 
    1656         Double_t apos = (pos[0]-pos[1])/2 * TMath::Pi()*2 / 16384;
    1657 
    1658         ZdAz bend = fBending.CorrectBack(ZdAz(apos, pos[2]))*kRad2Deg;
    1659         fHistTestSe->Fill(bend.Zd(), pos[0]+pos[1]-offset);
    1660 */
    16611738    }
    16621739    lout << "Gear Test Stopped... displaying Histogram." << endl;
     
    17481825    lout.UpdateGui();
    17491826
    1750     fWin->Update(bendist*(360.0/2/TMath::Pi()), fTrackingError/kGearRatio2,
     1827    fWin->Update(bendist*(360.0/2/TMath::Pi()), fTrackingError,
    17511828                 fVelocity, fOffset, fRaDec, fZdAzSoll, fStatus, avail);
    1752 
    1753     /*
    1754      cout << (int)(fMac1->GetStatus()&Macs::kOutOfControl) << " ";
    1755      cout << (int)(fMac2->GetStatus()&Macs::kOutOfControl) << " ";
    1756      cout << (int)(fMac3->GetStatus()&Macs::kOutOfControl) << endl;
    1757      */
    17581829
    17591830    const Bool_t trigger = fTriggerDisplay;
     
    17731844    lout << "Displaying histogram..." << endl;
    17741845
    1775     TH2F &hist = *fHist;
     1846    TH2F &hist = *(TH2F*)fHist;
    17761847
    17771848    if (del)
     
    17961867    TH1F p2("spread", "Spread of the differences", hist.GetNbinsX(), hist.GetBinLowEdge(1),
    17971868            hist.GetBinLowEdge(hist.GetNbinsX()+1));
    1798     p2.SetXTitle("ZA [\\circ]");
     1869    p2.SetXTitle("Zd [\\circ]");
    17991870    for (int i=0; i<hist.GetNbinsX(); i++)
    18001871        p2.SetBinError(i, p->GetBinError(i));
     
    18111882    lout << "Displaying histogram..." << endl;
    18121883
    1813     TH2F &hist = *fHist;
     1884    TH3F &hist = *(TH3F*)fHist;
    18141885
    18151886    if (del)
     
    18201891
    18211892    TCanvas *c=new TCanvas("c1", "", 1000, 1000);
    1822     c->Divide(1,2);
     1893    c->Divide(2,2);
     1894
     1895    // ----------
    18231896
    18241897    c->cd(1);
    1825     TH2 *h=(TH2*)hist.DrawCopy();
    1826 
    1827     TProfile *p = h->ProfileX("_pfx", -1, 9999, "s");
    1828     p->SetLineColor(kBlue);
    1829     p->Draw("same");
    1830     p->SetBit(kCanDelete);
     1898    TH2D &h1=*(TH2D*)hist.Project3D("zx"); // Zd
     1899    h1.SetTitle(" Gear Ratio Zenith Distance [re/se]  ");
     1900    h1.SetXTitle("Zd [\\circ]");
     1901    h1.Draw();
     1902    h1.SetBit(kCanDelete);
     1903
     1904    TProfile *p1 = h1.ProfileX("_pfx", -1, 9999, "s");
     1905    p1->SetLineColor(kBlue);
     1906    p1->Draw("same");
     1907    p1->SetBit(kCanDelete);
     1908
     1909    // ----------
    18311910
    18321911    c->cd(2);
    1833 
    1834     TH1F p2("spread", "Spread of the gear [16384/1500/4*U/U]", hist.GetNbinsX(), hist.GetBinLowEdge(1),
    1835             hist.GetBinLowEdge(hist.GetNbinsX()+1));
    1836     p2.SetXTitle("ZA [\\circ]");
    1837     for (int i=0; i<hist.GetNbinsX(); i++)
    1838         p2.SetBinError(i, p->GetBinError(i));
    1839     p2.SetLineColor(kRed);
    1840     p2.SetStats(0);
    1841     p2.DrawCopy();
     1912    TH2D &h2=*(TH2D*)hist.Project3D("zy"); // Az
     1913    h2.SetTitle(" Gear Ratio Azimuth [re/se]  ");
     1914    h2.SetXTitle("Zd [\\circ]");
     1915    h2.Draw();
     1916    h2.SetBit(kCanDelete);
     1917
     1918    TProfile *p2 = h2.ProfileX("_pfx", -1, 9999, "s");
     1919    p2->SetLineColor(kBlue);
     1920    p2->Draw("same");
     1921    p2->SetBit(kCanDelete);
     1922
     1923    // ----------
     1924
     1925    c->cd(3);
     1926
     1927    TAxis &axe1 = *h1.GetXaxis();
     1928
     1929    TH1F f1("spreadzd", " Spread Zenith Distance ",
     1930            axe1.GetNbins(), axe1.GetXmin(), axe1.GetXmax());
     1931    f1.SetXTitle("Zd [\\circ]");
     1932    for (int i=0; i<axe1.GetNbins(); i++)
     1933        f1.SetBinError(i, p1->GetBinError(i));
     1934    f1.SetLineColor(kRed);
     1935    f1.SetStats(0);
     1936    f1.DrawCopy();
     1937
     1938    c->cd(4);
     1939
     1940    // ----------
     1941
     1942    TAxis &axe2 = *h2.GetXaxis();
     1943
     1944    TH1F f2("spreadaz", " Spread Azimuth ",
     1945            axe2.GetNbins(), axe2.GetXmin(), axe2.GetXmax());
     1946    f2.SetXTitle("Az [\\circ]");
     1947    for (int i=0; i<axe2.GetNbins(); i++)
     1948        f2.SetBinError(i, p2->GetBinError(i));
     1949    f2.SetLineColor(kRed);
     1950    f2.SetStats(0);
     1951    f2.DrawCopy();
     1952
     1953    // ----------
    18421954
    18431955    if (del)
  • trunk/MagicSoft/Cosy/main/MCosy.h

    r1817 r1953  
    1515
    1616#define WM_WAIT         WM_NULL
    17 #define WM_PRESET       0x1000
     17//#define WM_PRESET       0x1000
    1818#define WM_POSITION     0x1001
    1919#define WM_TRACK        0x1002
    2020#define WM_STOP         0x1003
    21 #define WM_CALIB        0x1004
     21//#define WM_CALIB        0x1004
    2222#define WM_TPOINT       0x1005
    2323#define WM_NEWTRACK     0x1006
     
    2929#define WM_GEAR         0x100c
    3030#define WM_DISPLAY      0x100d
     31#define WM_TRACKPOS     0x100e
    3132
    3233class ShaftEncoder;
     
    3435class MGCosy;
    3536class MCosy;
    36 class TH2F;
     37class TH1;
    3738
    3839class MTTalk : public MThread
     
    9697    BackgroundAction_t fBackground;    // Flag for present backgroundthread
    9798
    98     ZdAz  fTrackingError; // Tracking Offset between SE and calc-pos [re]
     99    ZdAz  fTrackingError; // [rad] Tracking Offset between SE and calc-pos
    99100    ZdAz  fOffset;        // Offset between se and re coordinate system [re]
    100     ZdAz  fZdAzSoll;      // Soll position when moving
     101    ZdAz  fZdAzSoll;      // [rad] Soll position when moving
    101102    RaDec fRaDec;         // Position to track
    102103    ZdAz  fAccuracy;      // Actual accuracy of Tracking
     
    105106    ZdAz  fMax;
    106107
    107     TH2F  *fHist;
     108    TH1  *fHist;
    108109    Bool_t fTriggerDisplay;
    109110
     
    116117
    117118    ofstream *tpout;
     119
     120    Bool_t AlignTrackingPos(ZdAz pointing, ZdAz &za);
     121    Bool_t CheckRange(const ZdAz &d) const;
    118122
    119123    double Rad2SE(double rad) const;
     
    182186    Bool_t HandleTimer(TTimer *t);
    183187
    184     static ZdAz CorrectTarget(const ZdAz &src, const ZdAz &dst);
     188    // static ZdAz CorrectTarget(const ZdAz &src, const ZdAz &dst);
    185189    //    static ZdAz RaDec2ZdAz(const double mjd, const RaDec &pos, const RaDec &pm=RaDec(0,0));
    186190
  • trunk/MagicSoft/Cosy/testse.cc

    r1742 r1953  
    11#include <iostream.h>
    2 /*#include <iomanip.h>
    3 #include <fstream.h>
    4 
    5 #include <TROOT.h>
    6 #include <TSystem.h>
    7 #include <TApplication.h>
    8 
    9 */
    102
    113#include "network.h"
     
    2113//    gLog.EnableOutputDevice(MLog::eStdout);
    2214
    23     cout << "Creating Network..." << endl;
    24     const int baud = 500;
     15    cout << endl;
     16    cout << "Usage: testse [nodeid [[speed]" << endl;
     17    cout << endl;
     18    const int baud = argc>2 ? atoi(argv[2]) : 500;
     19    cout << "Creating Network (" << baud << "bps)..." << endl;
    2520    Network net("/dev/dpm_00", baud);
    2621
    27     cout << "Creating SE..." << endl;
    28     const int nodeid = 6;
     22    const int nodeid = argc>1 ? atoi(argv[1]) : 16;
     23
     24    cout << "Creating SE #" << nodeid << "..." << endl;
    2925    ShaftEncoder se(nodeid, "SE/Zd1");
    3026
  • trunk/MagicSoft/Cosy/videodev/Writer.cc

    r1816 r1953  
    1414                 struct timeval *date)
    1515{
     16    Timer t(date);
     17    TString mjd;
     18    mjd += t.GetMjd()-52000;
     19    mjd = mjd.Strip(TString::kBoth);
     20    if (mjd.Length()<10)
     21        mjd.Append('0', 10-mjd.Length());
     22
    1623    TString name = fname;
    17 
    18     Timer t(date);
    19 
    2024    name += "_";
    21     name += t.GetMjd()-52000;
     25    name += mjd;
    2226    name += ".png";
    2327
Note: See TracChangeset for help on using the changeset viewer.