Changeset 8864


Ignore:
Timestamp:
02/17/08 22:39:04 (17 years ago)
Author:
tbretz
Message:
*** empty log message ***
Location:
trunk/MagicSoft/Cosy
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Cosy/Changelog

    r8863 r8864  
    11                                                                  -*-*- END -*-*-
     2
     3 2008/02/17 Thomas Bretz (La Palma)
     4
     5   * cosy.cc:           
     6     - enable output device file for log-files
     7     - set sps default address to "sps"
     8
     9   * candrv/canopen.[h,cc]:
     10     - added member function HasError to return an error status
     11       of the network connection
     12
     13   * candrv/ethernet.[h,cc]:
     14     - improved the way a lost connection is reestablished
     15     - added HasConnection to return the connection status
     16
     17   * candrv/interface.h:
     18     - added HasConnection to return the connection status
     19
     20   * candrv/network.cc:
     21     - when setting zombies check also the status of the network
     22
     23   * candrv/nodedrv.h:
     24     - made HasError a bit more fool proof
     25
     26   * devdrv/macs.[cc.h]:
     27     - added some more DKC error codes
     28     - improved printed error DKC message
     29     - do not treat warnings as errors anymore
     30
     31   * gui/MGCosy.cc:
     32     - the RA in TrackPos and CalibPos is in degrees
     33
     34   * main/MCosy.cc:
     35     - replaced some build-in numbers for the shaftenecoder-
     36       resolution by it
     37     - fixed a weird error: in one case when checking for errors
     38       fMac3 was checked without testing for NULL pointer!
     39
     40   * tcpip/MTcpIpIO.[h,cc]:
     41     - imporved the whole communication stuff again, especially
     42       the error handling and reestablishing of connections
     43
     44
    245
    346 2008/02/15 Thomas Bretz (La Palma)
  • trunk/MagicSoft/Cosy/candrv/canopen.cc

    r8862 r8864  
    7878    if (fInterface)
    7979        fInterface->Stop();
     80}
     81
     82bool CanOpen::HasError() const
     83{
     84    return fInterface ? !fInterface->HasConnection() : kFALSE;
    8085}
    8186
  • trunk/MagicSoft/Cosy/candrv/canopen.h

    r8813 r8864  
    7878    virtual void Start();           // Start CanOpen communication
    7979    virtual void Stop();            // Stop  CanOpen communcation
     80
     81    virtual bool HasError() const;
    8082
    8183private:
  • trunk/MagicSoft/Cosy/candrv/ethernet.cc

    r8862 r8864  
    7474// --------------------------------------------------------------------------
    7575//
    76 void Ethernet::ReadSocket(TSocket &rx)
     76Bool_t Ethernet::ReadSocket(TSocket &rx)
    7777{
    7878    Int_t pos = -1;
     
    8787    while (!IsThreadCanceled())
    8888    {
    89         //TThread::CancelPoint();
    90 
    9189        unsigned char c;
    9290        const Int_t len = rx.RecvRaw(&c, 1);
    9391
    94         //TThread::CancelPoint();
    95 
    9692        // No data received (non-blocking mode)
    9793        if (len<0)
     
    10197        }
    10298
    103         // Data received with zero length!
     99        // Data received with zero length! (Connection lost)
    104100        if (len==0)
    105         {
    106             gLog << warn << "WARNING - Connection lost (received 0bytes) to " << address << endl;
    107             //break; // This break is for TEST PURPOSE FIXME!!!
    108             continue;
    109         }
     101            return kFALSE;
    110102
    111103        // Data received
     
    113105        {
    114106            gLog << err << "Data received from " << address << " is more than one byte!" << endl;
    115             break;
     107            continue;
    116108        }
    117109
     
    121113            {
    122114                cout << "Data received from " << address << " too long (> " << MSGLEN << ")" << endl;
    123                 break;
     115                continue;
    124116            }
    125117
     
    147139        // String completed
    148140        HandleMessage(msg);
     141
     142        return kTRUE;
    149143    }
    150 }
    151 
     144
     145    return kTRUE;
     146}
     147
     148/*
     149void Ethernet::ReadSocket(TSocket &rx)
     150{
     151    Int_t pos = -1;
     152
     153    Message msg;
     154    msg.cmd = M_BCAN_RX_ind;
     155    msg.data[0] = 0;
     156    msg.data[1] = 0;
     157
     158    const TString address = MTcpIpO::GetSocketAddress(rx);
     159
     160    while (!IsThreadCanceled())
     161    {
     162        //TThread::CancelPoint();
     163
     164        unsigned char c;
     165        const Int_t len = rx.RecvRaw(&c, 1);
     166
     167        //TThread::CancelPoint();
     168
     169        // No data received (non-blocking mode)
     170        if (len<0)
     171        {
     172            usleep(1);
     173            continue;
     174        }
     175
     176        // Data received with zero length!
     177        if (len==0)
     178        {
     179            gLog << warn << "WARNING - Connection lost (received 0bytes) to " << address << endl;
     180            //break; // This break is for TEST PURPOSE FIXME!!!
     181            return;
     182        }
     183
     184        // Data received
     185        if (len>1)
     186        {
     187            gLog << err << "Data received from " << address << " is more than one byte!" << endl;
     188            continue;
     189        }
     190
     191        if (pos<0)
     192        {
     193            if (c>=MSGLEN)
     194            {
     195                cout << "Data received from " << address << " too long (> " << MSGLEN << ")" << endl;
     196                continue;
     197            }
     198
     199            msg.len = c;
     200            pos = 2;
     201            continue;
     202        }
     203
     204        //            if (pos==2 && c==0x0a)
     205        //                continue;
     206
     207        msg.data[pos++] = c;
     208        if (pos-2<msg.len)
     209            continue;
     210
     211#ifdef DEBUG
     212        cout << "*** RcvdCanFrame len=" << dec << msg.len << ": ";
     213        for (int i=0; i<msg.len; i++)
     214            cout << "0x" << setfill('0') << setw(2) << hex << (int)((msg.data+2)[i]) << " ";
     215        cout << dec << endl;
     216#endif
     217
     218        pos = -1;
     219
     220        // String completed
     221        HandleMessage(msg);
     222    }
     223}
     224*/
    152225
    153226// --------------------------------------------------------------------------
     
    174247//   */
    175248//
     249#ifdef DEBUG
     250#include <TStopwatch.h>
     251#endif
    176252void Ethernet::SendCanFrame(WORD_t cobid, BYTE_t m[8], BYTE_t rtr)
    177253{
     
    203279#endif
    204280
     281#ifdef DEBUG
     282    TStopwatch st;
     283    st.Start();
     284#endif
    205285    MTcpIpO::SendFrame(fTxAddress, fTxPort, (char*)(msg.data+1), msg.len-1);
     286#ifdef DEBUG
     287    st.Print();
     288#endif
    206289    //Send((char*)(msg.data+1), msg.len-1);
    207290
  • trunk/MagicSoft/Cosy/candrv/ethernet.h

    r8862 r8864  
    1717
    1818    // Send interface based on MTcpIpI
    19     void ReadSocket(TSocket &rx);
     19    Bool_t ReadSocket(TSocket &rx);
    2020
    2121    // Start/stop communication inherited from Interface
    2222    void Start() { RunThread(); }
    2323    void Stop()  { CancelThread(); }
     24
     25    Bool_t HasConnection() const { return IsConnectionEstablished(); }
    2426
    2527public:
  • trunk/MagicSoft/Cosy/candrv/interface.h

    r8854 r8864  
    4545    virtual void EnableCobId(WORD_t cobid, int flag=TRUE) { }
    4646
     47    virtual bool HasConnection() const { return true; }
     48
    4749    // Public interface
    4850    void PrintMsg(const Message &m);
  • trunk/MagicSoft/Cosy/candrv/network.cc

    r8863 r8864  
    314314            continue;
    315315
     316        if (CanOpen::HasError())
     317            fNodes[i]->SetZombie();
     318
    316319        if (!fNodes[i]->HasError())
    317320            continue;
     
    325328        //gLog << "' has error #" << fNodes[i]->GetError() << endl;
    326329    }
     330
     331    if (CanOpen::HasError())
     332        return true;
    327333
    328334    return rc;
  • trunk/MagicSoft/Cosy/candrv/nodedrv.h

    r8863 r8864  
    6060
    6161    int  GetError() const { return fError; }
    62     bool HasError() const { return fError; }
     62    bool HasError() const { return fError!=0; }
    6363
    6464    bool IsZombieNode() const { return fIsZombie; }
  • trunk/MagicSoft/Cosy/cosy.cc

    r8862 r8864  
    9090    const Bool_t  kDebugMem     = arg.HasOnlyAndRemove("--debug-mem");
    9191    const Bool_t  kDebugThreads = arg.HasOnlyAndRemove("--debug-threads");
    92     const TString sps           = arg.GetStringAndRemove("--sps=", "127.0.0.1");
     92    const TString sps           = arg.GetStringAndRemove("--sps=", "sps");
    9393    const TString ceco          = arg.GetStringAndRemove("--cc=", "ceco"); // ceco
    9494    const TString pointing      = arg.GetStringAndRemove("--pointing-model=", "bending2.txt"); // ceco
     
    138138        gLog << inf << "Open automatic logfile: " << name << endl;
    139139        gLog.SetOutputFile(name);
     140        gLog.EnableOutputDevice(MLog::eFile);
    140141    }
    141142
  • trunk/MagicSoft/Cosy/devdrv/macs.cc

    r8863 r8864  
    7171    case 0xa148: return "Drive controlled interpolated relative positioning lagless with encoder 1";
    7272    case 0xa149: return "Drive controlled interpolated relative positioning lagless with encoder 2";
     73    case 0xa150: return "Drive controlled positioning with encoder 1";
     74    case 0xa151: return "Drive controlled positioning with encoder 2";
    7375    case 0xa208: return "Jog mode positive";
    7476    case 0xa218: return "Jog mode negative";
     
    8688    case 0xe251: return "Motor overtemp warning";
    8789    case 0xe252: return "Bleeder overtemp warning";
     90    case 0xe257: return "Continous current limit active";
     91    case 0xe264: return "Target position out of numerical range";
    8892    case 0xe834: return "Emergency-Stop";
    8993    case 0xe843: return "Positive end-switch activated";
     
    9599    case 0xf224: return "Maximum breaking time exceeded";
    96100    case 0xf228: return "Excessive control deviation";
     101    case 0xf250: return "Overflow of target position preset memory";
    97102    case 0xf269: return "Error during release of the motor holding brake";
    98103    case 0xf276: return "Absolute encoder out of allowed window";
     
    120125    const Int_t type = errinf&0xf000;
    121126
    122     gLog << all << "DKC reports: ";
     127    gLog << all << MTime(-1) << ": " << GetNodeName() << " DKC ";
    123128
    124129    switch (type)
     
    127132    case 0xe000: gLog << "WARNING"; break;
    128133    case 0xa000: gLog << "Status"; break;
     134    case 0xc000:
     135    case 0xd000: gLog << "Message"; break;
    129136    default:     gLog << "Unknown"; break;
    130137    }
     
    134141    gLog << (type==0xf000 || type==0xe000 ? "!" : ".") << endl;
    135142
    136     return type==0xa000;
     143    return type!=0xf000;
    137144}
    138145
     
    148155            return;
    149156        gLog << inf2 << "- " << GetNodeName() << ": Error[0]=" << hex << val << dec << endl;
    150         SetError(EvalStatus(val) ? 0 : val);
     157        CheckErrorDKC(val);
    151158        return;
    152159
     
    680687}
    681688
     689void Macs::CheckErrorDKC(LWORD_t val)
     690{
     691    Bool_t rc = EvalStatus(val);
     692    SetError(rc ? 0 : val);
     693    if (!rc)
     694        SetZombie();
     695}
     696
    682697void Macs::HandlePDO2(const BYTE_t *data, const timeval_t &tv)
    683698{
     
    688703    if (errnum==0xff && (errinf&0xf000)<=0xe000)
    689704    {
    690         EvalStatus(errnum, errinf);
    691         SetError(0);
     705        CheckErrorDKC(errnum, errinf);
    692706        return;
    693707    }
     
    915929    case 0xff:
    916930        gLog << err << "DKC error! Go and check what is going on!" << endl;
    917         DelError();
     931        //DelError();
    918932        return;
    919933/*
  • trunk/MagicSoft/Cosy/devdrv/macs.h

    r8863 r8864  
    4444        return EvalStatus(errnum|(errinf<<16));
    4545    }
     46    void CheckErrorDKC(LWORD_t val);
     47    void CheckErrorDKC(UInt_t errnum, UInt_t errinf)
     48    {
     49        CheckErrorDKC(errnum|(errinf<<16));
     50    }
     51
    4652
    4753    void HandleSDO(WORD_t idx, BYTE_t subidx, LWORD_t val, const timeval_t &tv);
  • trunk/MagicSoft/Cosy/gui/MGCosy.cc

    r8863 r8864  
    11491149    RaDec dest1(xy1.X()*15., xy1.Y()); // xy.X()  [h]->[ø]
    11501150
    1151     cout << "TrackPos: " << dest0.Ra() << "h " << dest0.Dec() << "\xb0" << endl;
    1152     cout << "CalibPos: " << dest1.Ra() << "h " << dest1.Dec() << "\xb0" << endl;
     1151    cout << "TrackPos: " << dest0.Ra() << "\xb0 " << dest0.Dec() << "\xb0" << endl;
     1152    cout << "CalibPos: " << dest1.Ra() << "\xb0 " << dest1.Dec() << "\xb0" << endl;
    11531153
    11541154    RaDec dest[2] = { dest0, dest1 };
  • trunk/MagicSoft/Cosy/main/MCosy.cc

    r8862 r8864  
    143143    // Get the values          (FIXME!)
    144144    //
    145     int p1 =  (fZd1->GetPos()/*+8192*/)%fZd1->GetPhysRes();
    146     int p2 = -(fZd2->GetPos()/*+8192*/)%fZd2->GetPhysRes();
     145    //int p1 =  (fZd1->GetPos()+fZd1->GetPhysRes()/2)%fZd1->GetPhysRes();
     146    //int p2 = -(fZd2->GetPos()+fZd2->GetPhysRes()/2)%fZd2->GetPhysRes();
     147
     148    int p1 =  fZd1->GetPos();//+fZd1->GetPhysRes()/2)%fZd1->GetPhysRes();
     149    int p2 = -fZd2->GetPos();//+fZd2->GetPhysRes()/2)%fZd2->GetPhysRes();
    147150
    148151    if (fZd1->IsZombieNode())
     
    562565        fMac1->HandleError();
    563566        fMac2->HandleError();
    564         fMac3->HandleError();
     567        if (fMac3)
     568            fMac3->HandleError();
    565569        if (HasError() || HasZombie())
    566570            return false;
     
    948952    gLog << " * Max:  " << zmax << "deg  " << amax << "deg" << endl;
    949953
    950     fMin = fBending.AddOffsets(fMin/TMath::RadToDeg());
    951     fMax = fBending.AddOffsets(fMax/TMath::RadToDeg());
     954    fMin = fBending.AddOffsets(fMin*TMath::DegToRad());
     955    fMax = fBending.AddOffsets(fMax*TMath::DegToRad());
    952956
    953957    gLog << " * Min': " << fMin.Zd()*TMath::RadToDeg() << "deg  " << fMin.Az()*TMath::RadToDeg() << "deg" << endl;
     
    16281632    gLog << inf << "Open Repfile: " << name << endl;
    16291633    fOutRep = new MLog(name, kTRUE);
    1630     *fOutRep << "[Drive Report File]" << endl;
     1634    *fOutRep << all << "[Drive Report File]" << endl;
    16311635    *fOutRep << "Version <cvs>" << endl;
    16321636    *fOutRep << "Date " << MTime(-1) << endl;
  • trunk/MagicSoft/Cosy/tcpip/MTcpIpIO.cc

    r8862 r8864  
    22
    33#include <unistd.h>    // usleep
     4
     5#include <errno.h>
    46
    57#include <TSocket.h>
     
    153155}
    154156
    155 void MTcpIpIO::ReadSocket(TSocket &rx)
    156 {
    157     // Clear buffer!
    158     char c;
    159 //    while (fRxSocket->RecvRaw(&c, 1)>0 && !HasStopFlag())
    160     while (rx.RecvRaw(&c, 1)>0 && !IsThreadCanceled())
    161         usleep(1);
    162 
     157Bool_t MTcpIpIO::ReadSocket(TSocket &rx)
     158{
    163159    TString str;
    164     //        while (!HasStopFlag())
     160
    165161    while (!IsThreadCanceled())
    166162    {
     
    175171        }
    176172
    177         // Data received with zero length!
     173        // Data received with zero length! (Connection lost)
    178174        if (len==0)
    179         {
    180             // THIS MEANS CONNECTIION LOST!!!!
    181             cout << "============> len==0 (CONNECTION LOST?)" << endl;
    182             break; // This break is for TEST PURPOSE FIXME!!!
    183             continue;
    184         }
     175            return kFALSE; // This break is for TEST PURPOSE FIXME!!!
    185176
    186177        // Data received
     
    202193        str = "";
    203194    }
    204 }
    205 
    206 //void *MTcpIpIO::Thread()
     195
     196    return kTRUE;
     197}
     198
     199Bool_t MTcpIpI::WaitForData(TSocket &sock)
     200{
     201    // No connection established?
     202    if (!sock.IsValid())
     203    {
     204        gLog << warn << "TSocket invalid on port " << fPortRx << "." << endl;
     205        return kFALSE;
     206    }
     207
     208    fConnectionEstablished = kTRUE;
     209
     210    // Get connection on port fPortRx and redirected
     211    while (!IsThreadCanceled())
     212    {
     213        // Check for pending data (every ms)
     214        switch (sock.Select(TSocket::kRead, 1))
     215        {
     216        case kTRUE:  // Data pending... go on reading
     217            if (!ReadSocket(sock))
     218            {
     219                gLog << warn << "WARNING - Connection lost to " << MTcpIpO::GetSocketAddress(sock) << endl;
     220                return kFALSE;
     221            }
     222
     223            // *FALLTHROUGH*
     224        case kFALSE: // Time out, no data yet, go on waiting
     225
     226            // Go on waiting for new data
     227            continue;
     228
     229        default:  // Error occurance
     230            gLog << err << "TSocket::Select returned an error: " << strerror(errno) << endl;
     231            return kFALSE;
     232        }
     233    }
     234    return kTRUE; //???
     235}
     236
     237void MTcpIpI::WaitForConnection(TServerSocket &server)
     238{
     239    gLog << all << " Wait for connection" << endl;
     240
     241    while (!IsThreadCanceled())
     242    {
     243        gLog << all << "Listening for new connection on port " << fPortRx << "..." << endl;
     244
     245        // Check for a connection request (reminder: we are in non-blocking mode)
     246        TSocket *socket = 0;
     247
     248        while (!IsThreadCanceled())
     249        {
     250            socket = server.Accept();
     251
     252            // Accept returned an error
     253            if (socket==0)
     254            {
     255                gLog << err << "Error: TServerSock::Accept on port " << fPortRx << ": " << strerror(errno) << endl;
     256                // Since we don't know the type of the error we better shut down the socket
     257                return;
     258            }
     259
     260            // No connection request pending
     261            if ((Long_t)socket<0)
     262            {
     263                MThread::Sleep(1000); // Wait a ms
     264                continue;
     265            }
     266
     267            // Connection established
     268            break;
     269        }
     270
     271        if ((Long_t)socket<=0)
     272            return;
     273
     274        if (!WaitForData(*socket))
     275            fConnectionEstablished = kFALSE;
     276
     277        delete socket;
     278    }
     279}
     280
     281Int_t MTcpIpI::Thread()
     282{
     283    gLog << inf << "- Starting server listening on port " << fPortRx << "..." << endl;
     284
     285    while (!IsThreadCanceled())
     286    {
     287        TServerSocket *server=new TServerSocket(fPortRx, kTRUE);
     288        server->SetOption(kNoBlock, 1);
     289
     290        while (!IsThreadCanceled() && server->IsValid())
     291            WaitForConnection(*server);
     292
     293        if (!server->IsValid())
     294        {
     295            gLog << err << "ServerSocket on port " << fPortRx << " invalid: ";
     296            switch (server->GetErrorCode())
     297            {
     298            case  0: gLog << "No error." << endl; break;
     299            case -1: gLog << "low level socket() call failed." << endl; break;
     300            case -2: gLog << "low level bind() call failed." << endl; break;
     301            case -3: gLog << "low level listen() call failed." << endl; break;
     302            default: gLog << "Unknown." << endl; break;
     303            }
     304        }
     305
     306        delete server;
     307
     308        MThread::Sleep(5000000);
     309    }
     310
     311    gLog << inf << "- Listening server stopped on port " << fPortRx << "." << endl;
     312
     313    return 0;
     314}
     315
     316/*
    207317Int_t MTcpIpI::Thread()
    208318{
     
    276386        gLog << all << "Connection established on port " << fPortRx << "." << endl;
    277387
    278         fRxSocket->SetOption(kNoBlock, 1);
     388
     389        //fRxSocket->SetOption(kNoBlock, 1);
     390
     391        // Waqit for data
     392        while (!IsThreadCanceled())
     393        {
     394            switch (fRxSocket->Select(kRead, 1))
     395            {
     396            case kTRUE:  // Data waiting to be read
     397                break;
     398            case kFALSE: // time out
     399                usleep(10);
     400                continue;
     401            }
     402
     403            // ERROR
     404            cout << "Error: TRxSocket::Select on port " << fPortRx << "." << endl;
     405
     406            delete fServSock;
     407            delete fRxSocket;
     408            fServSock = NULL;
     409            fRxSocket = NULL;
     410            break;
     411        }¨
     412
     413        if (!fServSock)
     414            continue;
     415
     416        if (IsThreadCanceled())
     417        {
     418            delete fServSock;
     419            delete fRxSocket;
     420            fServSock = NULL;
     421            fRxSocket = NULL;
     422            continue;
     423        }
    279424
    280425        // ------ IDENTICAL UP TO HERE ------
    281426
     427        // Read and evaluate data
    282428        ReadSocket(*fRxSocket);
    283429
     
    292438    return 0;
    293439//    return NULL;
    294 }
     440}*/
  • trunk/MagicSoft/Cosy/tcpip/MTcpIpIO.h

    r8862 r8864  
    1818{
    1919private:
    20     Int_t fPortRx;
     20    Int_t  fPortRx;
     21    Bool_t fConnectionEstablished;
     22
     23    Bool_t WaitForData(TSocket &sock);
     24    void   WaitForConnection(TServerSocket &server);
    2125
    2226    Int_t Thread();
    2327
    24     virtual void ReadSocket(TSocket &rx) = 0;
     28    virtual Bool_t ReadSocket(TSocket &rx) = 0;
    2529
    2630public:
    27     MTcpIpI(Int_t rx) : MThread(Form("MTcpIpI::%d", rx)), fPortRx(rx) { /*RunThread();*/ }
     31    MTcpIpI(Int_t rx) : MThread(Form("MTcpIpI::%d", rx)), fPortRx(rx), fConnectionEstablished(kFALSE) { /*RunThread();*/ }
    2832    ~MTcpIpI() { CancelThread(); }
     33
     34    Bool_t IsConnectionEstablished() const { return fConnectionEstablished; }
    2935};
    3036
     
    5258{
    5359private:
    54     void ReadSocket(TSocket &rx);
     60    Bool_t ReadSocket(TSocket &rx);
    5561
    5662public:
Note: See TracChangeset for help on using the changeset viewer.