Changeset 16887 for trunk


Ignore:
Timestamp:
06/22/13 11:45:51 (11 years ago)
Author:
tbretz
Message:
Added some smoothing to the deviation responsible for the OnTrack/Tracking; allow a second auto resume after five seconds.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/drivectrl.cc

    r16732 r16887  
    127127    uint16_t fDeviationMax;
    128128
     129    vector<double> fDevBuffer;
     130    uint64_t       fDevCount;
     131
    129132    uint64_t fTrackingCounter;
    130133
     
    362365
    363366        // Calculate absolut deviation on the sky
     367
    364368        const double dev = GetDevAbs(zd1, zd1-zd_err, az_err)*3600;
     369
     370        fDevBuffer[fDevCount++%5] = dev;
     371
     372        const uint8_t cnt    = fDevCount<5 ? fDevCount : 5;
     373        const double  avgdev = accumulate(fDevBuffer.begin(), fDevBuffer.begin()+cnt, 0)/cnt;
    365374
    366375        // If any other state than tracking or a deviation
    367376        // larger than 60, reset the counter
    368         if (fState!=State::kTracking || dev>fDeviationLimit)
     377        if (fState!=State::kTracking || avgdev>fDeviationLimit)
    369378            fTrackingCounter = 0;
    370379        else
     
    377386
    378387        // Having th state as Tracking will reset the counter
    379         if (fState==State::kOnTrack && dev>fDeviationMax)
     388        if (fState==State::kOnTrack && avgdev>fDeviationMax)
    380389            fState = State::kTracking;
     390
     391        if (fState!=State::kTracking && avgdev!=State::kOnTrack)
     392            fDevCount = 0;
    381393
    382394        // 206 206         ce ce       pwr vlt emcy fs        |  pwr vlt emcy fs
     
    624636public:
    625637    ConnectionDrive(ba::io_service& ioservice, MessageImp &imp) : Connection(ioservice, imp()),
    626         fState(-1), fIsVerbose(true), fDeviationLimit(120), fDeviationCounter(5), fDeviationMax(240), fTrackingCounter(0), fKeepAlive(ioservice)
     638        fState(-1), fIsVerbose(true),
     639        fDeviationLimit(120), fDeviationCounter(5), fDeviationMax(240),
     640        fDevBuffer(5), fDevCount(0),
     641        fTrackingCounter(0), fKeepAlive(ioservice)
    627642    {
    628643        SetLogStream(&imp);
     
    640655        fDeviationMax     = max;
    641656    }
     657
    642658    int GetState() const
    643659    {
     
    790806    string fLastCommand;  // Last tracking (RADEC) command
    791807    int fAutoResume;      // 0: disabled, 1: enables, 2: resuming
     808    Time fAutoResumeTime;
    792809
    793810    // Status 0: Error
     
    873890        }
    874891
     892       
     893        T::Info("Resume: "+fLastCommand);
    875894        return SendCommand(fLastCommand, false);
    876895    }
     
    12201239        }*/
    12211240
    1222         if (Time()>fSunRise)
     1241        const Time now;
     1242
     1243
     1244        if (now>fSunRise)
    12231245        {
    12241246            if (T::GetCurrentState()>Drive::State::kLocked)
     
    12271249            if (T::GetCurrentState()==Drive::State::kLocked)
    12281250            {
    1229                 fSunRise = Time().GetNextSunRise();
     1251                fSunRise = now.GetNextSunRise();
    12301252
    12311253                ostringstream msg;
     
    12461268            // If auto resume is enabled and the drive is in error,
    12471269            // resume tracking
    1248             if (fAutoResume==1 && state==StateMachineImp::kSM_Error)
     1270            if (state==StateMachineImp::kSM_Error)
    12491271            {
    1250                 Resume();
    1251                 fAutoResume = 2;
     1272                if (fAutoResume==1)
     1273                {
     1274                    Resume();
     1275                    fAutoResume = 2;
     1276                    fAutoResumeTime = now;
     1277                }
     1278
     1279                if (fAutoResume==2 && fAutoResumeTime+boost::posix_time::seconds(5)<now)
     1280                {
     1281                    Resume();
     1282                    fAutoResume = 3;
     1283                }
    12521284            }
    1253 
    1254             // If drive got out of the error state,
    1255             // enable auto resume again
    1256             if (fAutoResume==2 && state!=StateMachineImp::kSM_Error)
    1257                 fAutoResume = 1;
     1285            else
     1286            {
     1287                // If drive got out of the error state,
     1288                // enable auto resume again
     1289                if (fAutoResume>1)
     1290                    fAutoResume = 1;
     1291            }
    12581292        }
    12591293
Note: See TracChangeset for help on using the changeset viewer.