CARMA C++
DriveHandle.h
Go to the documentation of this file.
1 #ifndef CARMA_CONTROL_DRIVEHANDLE_H
2 #define CARMA_CONTROL_DRIVEHANDLE_H
3 
17 #include <string>
18 #include <memory>
19 #include <vector>
20 
21 #include "carma/corba/corba.h"
22 #include "carma/antenna/common/DriveControl.h"
23 #include "carma/control/antennaHandleUtils.h"
24 #include "carma/control/AzWrapMode.h"
25 #include "carma/control/MjdTriplet.h"
27 #include "carma/monitor/ControlSubsystem.h"
32 #include "carma/services/Source.h"
33 #include "carma/services/Types.h"
34 
35 namespace carma {
36 // forward declarations
37  namespace monitor {
38  class MonitorSystem;
39  } // namespaec monitor
40 
41  namespace services {
42  class Angle;
43  class Pressure;
44  class Temperature;
45  class Velocity;
46  } // namespace carma::services
47 // end forward declarations
48 
49 namespace control {
50 
51 typedef RemoteObjHandleT< antenna::common::DriveControl >
52  DriveControlRemoteObjHandle;
53 
56 public:
68  DriveHandle( unsigned short carmaAntNo,
69  const services::Location & coords,
70  monitor::MonitorSystem & monitorSystem,
71  monitor::ControlSubsystemBase::Antenna & antenna
72  );
73 
74  virtual ~DriveHandle( );
75 
95  // note source and userCatalog cannot be string& because
96  // makeHandleMethodFunctorGroup barfs on that.
97  void startTrack( const ::std::string source,
98  const carma::control::MjdTriplet mjdTriplet,
99  const ::std::string userCatalog,
100  const carma::control::AzWrapMode azWrapMode,
101  double time,
102  int preferredSequenceNo );
103 
110  // weird, need the "X" here (i.e. a different method name)
111  // or I get an unresolved overloaded
112  // function in the makeHandleMethodFunctorGroup call in
113  // SubarrayControlTrack.cc line 208
114  void startTrackX( const carma::services::Source source,
115  const carma::control::MjdTriplet mjdTriplet,
116  const carma::control::AzWrapMode azWrapMode,
117  double time,
118  int preferredSequenceNo );
119 
134  const carma::control::MjdTriplet mjdTriplet,
135  const ::std::string userCatalog,
136  carma::control::AzWrapMode azWrapMode,
137  int preferredSequenceNo );
138 
140  const carma::control::MjdTriplet mjdTriplet,
141  carma::control::AzWrapMode azWrapMode,
142  int preferredSequenceNo );
143 
152  void setLocation( const services::Location & location );
153 
161 
166 
176  void setOffset (double azArcmin, double elArcmin, int preferredSequenceNo );
177 
186  void setAzOffset (double azArcmin, int preferredSequenceNo) ;
187 
196  void setElOffset (double elArcmin, int preferredSequenceNo) ;
197 
207  void setAzel( double azDegrees, double elDegrees, int preferredSequenceNo );
208 
217  void setAz( double azDegrees, int preferredSequenceNo );
218 
227  void setEl( double elDegrees, int preferredSequenceNo );
228 
238  void setMountOffset( double azArcmin,
239  double elArcmin,
240  int preferredSequenceNo );
241 
250  int preferredSequenceNo );
251 
255  void stop( );
256 
271  void setSafeRange(float azLow, float azHigh, float elLow, float elHigh);
272 
278  void updateTracking( double mjd );
279 
292  void updateWeather( double mjd,
293  const services::Temperature & airTemp,
294  const services::Pressure & atmPressure,
295  double relhumid,
296  const services::Temperature & dewpointTemp,
297  const services::Velocity & windSpeed,
298  const services::Angle & windDirection,
299  bool logGoodSend );
300 
309  void setEquatOffset(double ra, double dec);
310 
323  void checkModeForEquatOffset( void );
324 
325 
327  unsigned short getCarmaAntennaNo( ) const;
328 
335  ::std::string getCarmaAntennaName( ) const;
336 
343  ::std::string getTypedAntennaName( ) const;
344 
348  ::std::string getSourceName() ;
349  carma::services::Source getSource() ;
350 
352  void setOvroMountPointingConstants( double m1,
353  double m2,
354  double m3,
355  double m4,
356  double m5 );
357 
363  void setBimaMountPointingConstants( ::std::vector< double > dazCoefs,
364  ::std::vector< double > delCoefs );
365 
367 
369  double azEncoderCountsPerTurn, double elEncoderCountsPerTurn,
370  double azMinEncoderCount, double azMaxEncoderCount,
371  double elMinEncoderCount, double elMaxEncoderCount,
372  double azEncoderZeroDegrees, double elEncoderZeroDegrees,
373  double haTiltDegrees, double latTiltDegrees, double elTiltDegrees,
374  double opticalXCollimationDegrees, double opticalYCollimationDegrees,
375  double opticalFlexureSinDegrees, double opticalFlexureCosDegrees,
376  double radioXCollimationDegrees, double radioYCollimationDegrees,
377  double radioFlexureSinDegrees, double radioFlexureCosDegrees);
378 
380 
381  void setSzaEncoderLimits(double azMinEncoderCount,
382  double azMaxEncoderCount,
383  double elMinEncoderCount,
384  double elMaxEncoderCount);
385 
387 
388  void setSzaEncoderZeros(double azEncoderZeroDegrees, double elEncoderZeroDegrees);
389 
391 
392  void setSzaTilts(double haTiltDegrees, double latTiltDegrees, double elTiltDegrees);
393 
398  void trackingThreshold(float hpbw) ;
399 
408  void conditionallyUpdateTrackTolerance(const double freq) ;
409 
415  void updateTrackTolerance(const float tolerance, const double freq);
416 
426  bool isActionComplete( const monitor::MonitorSystem & monsys,
427  int monDataErrorLimit );
428 
429  typedef enum {
430  SOURCE_MODE_RA_DEC,
431  SOURCE_MODE_AZ_EL,
432  SOURCE_MODE_IDLE,
433  SOURCE_MODE_INVALID
434  } SourceMode;
435 
436 
446  SourceMode getSourceMode( ) const;
447 
448  void test( double aSeconds,
449  double bSeconds,
450  long whichTest );
451 
452 private:
453 
463  void trackFixed( const std::string & source, int preferredSequenceNo );
464 
486  void track( const ::std::string & source,
487  const carma::control::MjdTriplet & triplet,
488  bool resetTrackOffsets,
489  const std::string & userCatalog,
490  carma::control::AzWrapMode azWrapMode,
491  int preferredSequenceNo );
492 
499  void track( const carma::services::Source & source,
500  const carma::control::MjdTriplet & triplet,
501  bool resetTrackOffsets,
502  carma::control::AzWrapMode azWrapMode,
503  int preferredSequenceNo );
504 
515  void updateRaDec( const ::std::string & sourceName,
516  double mjd, double ra, double dec,
517  carma::control::AzWrapMode azWrapMode );
518 
520  void setSourceModeToIdle( );
522  void setSourceModeToRaDec( );
524  void setSourceModeToAzEl( );
525 
531  void updateAntennaSourceRaDec (double mjd) ;
532 
533  void setNextSequenceNo( int preferredSequenceNo );
534 
535  int nextSequenceNo_;
536  int consecutiveErrors_;
537  int errLimit_;
538 
539  const unsigned short carmaAntNo_;
540  const AntennaType antType_;
541 
547  monitor::MonitorSubsystem & antennaSubsystem_;
555  monitor::MonitorSystem & monitorSystem_;
556 
557  monitor::ControlSubsystemBase::Antenna & antenna_;
558 
559  SourceMode sourceMode_;
560 
561  double trackToleranceFreq_; // LO freq used to compute track tol asec
562  float trackTolerance_; // In half power beam widths
563 
568  carma::services::Ephemeris localEphemeris_;
569 
574 
575  double raTrackingOffset_;
576  double decTrackingOffset_;
577  double raPhaseOffset_;
578  double decPhaseOffset_;
579 
586  bool setSafeRangeCompleted_;
587 
594  double optimumWrapTime_;
595 
597  double timeToTrack_;
598 
605  carma::control::AzWrapMode lastControlWrapMode_;
606 
614 
615 
629  void trackTriplet( const ::std::string & source,
630  const carma::control::MjdTriplet & mjdTriplet,
631  bool resetTrackOffsets,
632  const std::string & userCatalog,
633  carma::control::AzWrapMode azWrapMode,
634  int preferredSequenceNo );
635 
639  void trackTriplet( const carma::services::Source & source,
640  const carma::control::MjdTriplet & mjdTriplet,
641  bool resetTrackOffsets,
642  carma::control::AzWrapMode azWrapMode,
643  int preferredSequenceNo );
644 
645 
651  void updateWrapLimits();
652 
661  void checkAgainstLimits(const double azDegrees, const double elDegrees,
662  const bool warnOnly );
663 
668  void defaultWrapLimits();
669 
675  antenna::common::DriveControl::AzWrapMode computeOptimumWrapValue();
676 
678  const ::std::string
679  azWrapModeToString( carma::control::AzWrapMode mode ) const;
680 
682  const ::std::string
683  azWrapModeToString( carma::antenna::common::DriveControl::AzWrapMode mode ) const;
684 
690  controlWrapToDriveWrap( control::AzWrapMode mode );
691 
692 
696  // nb. could have overloaded a general toDriveWrap() method.
698  servicesWrapToDriveWrap( services::AzWrapType wrap ) const;
699 
705  driveWrapToControlWrap( antenna::common::DriveControl::AzWrapMode ) const;
706 
711  controlAntTypeToServicesAntType( control::AntennaType antType ) const;
712 
713 }; // class DriveHandle
714 
715 
716 } // End namespace carma::control
717 } // End namespace carma
718 
719 
720 #endif
::std::string getCarmaAntennaName() const
Returns antenna name as full carma name.
void setSzaEncoderZeros(double azEncoderZeroDegrees, double elEncoderZeroDegrees)
Set SZA encoder zeros.
void updateTrackTolerance(const float tolerance, const double freq)
Set the tracking threshold to the antennas.
AzWrapMode
Possible Azimuth Wrap modes.
Definition: AzWrapMode.idl:11
enum carma::services::AzWrapTypeEnum AzWrapType
mirror drive mode wrap types
Semi-hand-forged extensions to the auto-generated classes for the Control subsystem.
void setSzaTilts(double haTiltDegrees, double latTiltDegrees, double elTiltDegrees)
Set SZA tilts.
void setEl(double elDegrees, int preferredSequenceNo)
Set antenna elevation.
void setSzaEncoderLimits(double azMinEncoderCount, double azMaxEncoderCount, double elMinEncoderCount, double elMaxEncoderCount)
Set SZA encoder limits.
Source is derived from CatalogEntry and is used to hold information for a particular entry from a sou...
Definition: Source.h:23
void trackCurrentSourceWithOffsets(const carma::control::MjdTriplet mjdTriplet, const ::std::string userCatalog, carma::control::AzWrapMode azWrapMode, int preferredSequenceNo)
Continue tracking the current source with new equatorial offsets.
void setSafeRange(float azLow, float azHigh, float elLow, float elHigh)
Set the azimuth and elevation ranges within which this antenna is safe from collisions with other ant...
void trackingThreshold(float hpbw)
Set the tracking threshold.
void stow(antenna::common::DriveControl::Position position, int preferredSequenceNo)
Move the antenna one of the stow positions (zenith, service, safe).
Various type definitions for services classes.
void stop()
Stop the antenna at its current azimuth and elevation.
The Velocity class can represent an velocity in any units.
Definition: Velocity.h:42
void setOvroMountPointingConstants(double m1, double m2, double m3, double m4, double m5)
Set OVRO mount pointing constants.
void updateWeather(double mjd, const services::Temperature &airTemp, const services::Pressure &atmPressure, double relhumid, const services::Temperature &dewpointTemp, const services::Velocity &windSpeed, const services::Angle &windDirection, bool logGoodSend)
Updates weather information to drive.
::std::string getTypedAntennaName() const
Returns antenna name as full type qualified name.
void setAzOffset(double azArcmin, int preferredSequenceNo)
Set antenna Az offset for astronomy or engineering.
void setMountOffset(double azArcmin, double elArcmin, int preferredSequenceNo)
Set mount offsets.
Ephemeris wraps the NOVAS library and any other ephemeris related functions into a simple to use clas...
Definition: Ephemeris.h:91
void setAz(double azDegrees, int preferredSequenceNo)
Set antenna azimuth.
void setElOffset(double elArcmin, int preferredSequenceNo)
Set antenna El offset for astronomy or engineering.
void updateTracking(double mjd)
Updates tracking information to antenna,.
SourceMode getSourceMode() const
Method to get source mode of antenna - it can point at nothing, or at a source specified by RA/DEC...
void startTrack(const ::std::string source, const carma::control::MjdTriplet mjdTriplet, const ::std::string userCatalog, const carma::control::AzWrapMode azWrapMode, double time, int preferredSequenceNo)
For use the first time this drive tracks a given object.
The Temperature class represents a temperature in any unit.
Definition: Temperature.h:39
::std::string getSourceName()
The Pressure class can represent any pressure in any units.
Definition: Pressure.h:38
bool isActionComplete(const monitor::MonitorSystem &monsys, int monDataErrorLimit)
Compare next sequence number with one returned by the monitor system.
Manages connection to remote DO.
Location specifies a location (observatory if you wish) on planet earth, as longitude, latitude, and altitude above sea-level.
Definition: Location.h:32
AntennaType
Enumeration of possible types for antennas.
Definition: Types.h:210
AntennaType
Enumeration of possible types for antennas.
The Angle class can represent any angle in any units.
Definition: Angle.h:38
AzWrapMode
The azimuth drive can operate over more than a full circle, and the wrap logic dictates how the ambig...
void setBimaMountPointingConstants(::std::vector< double > dazCoefs,::std::vector< double > delCoefs)
Set BIMA mount pointing constants.
Typed class for managing connections to DOs.
Monitor system base class.
Definition: MonitorSystem.h:81
services::Location getLocation() const
Method to get antenna&#39;s location as longitude, latitude, altitude.
void setSzaMountPointingConstants(double azEncoderCountsPerTurn, double elEncoderCountsPerTurn, double azMinEncoderCount, double azMaxEncoderCount, double elMinEncoderCount, double elMaxEncoderCount, double azEncoderZeroDegrees, double elEncoderZeroDegrees, double haTiltDegrees, double latTiltDegrees, double elTiltDegrees, double opticalXCollimationDegrees, double opticalYCollimationDegrees, double opticalFlexureSinDegrees, double opticalFlexureCosDegrees, double radioXCollimationDegrees, double radioYCollimationDegrees, double radioFlexureSinDegrees, double radioFlexureCosDegrees)
Set SZA mount pointing constants.
void conditionallyUpdateTrackTolerance(const double freq)
Check to see if the HPBW has changed enough to warrant a threshold update, converting from hpbw to ar...
Manages antenna drive control DO connections.
Definition: DriveHandle.h:55
void setLocation(const services::Location &location)
Method to set antenna&#39;s absolute location.
Source checker returns info on the location in the sky of a source at a given time, e.g.
Definition: SourceChecker.h:37
services::Ephemeris getEphemeris() const
void setAzel(double azDegrees, double elDegrees, int preferredSequenceNo)
Set antenna azimuth and elevation.
void setOffset(double azArcmin, double elArcmin, int preferredSequenceNo)
Set antenna Az/El offsets for astronomy or engineering.
Declaration of carma::services::Ephemeris.
void checkModeForEquatOffset(void)
Check if the drive mode is in an appropriate state for calling setEquatOffset.
void setEquatOffset(double ra, double dec)
Defines equatorial offsets in ra and dec from the input source.
void startTrackX(const carma::services::Source source, const carma::control::MjdTriplet mjdTriplet, const carma::control::AzWrapMode azWrapMode, double time, int preferredSequenceNo)
Version of startTrack that takes a Source object instead of a source name and catalog.
Position
Enumerate valid fixed positions for Stow.
Abstract MonitorSubsystem base class.
unsigned short getCarmaAntennaNo() const
DriveHandle(unsigned short carmaAntNo, const services::Location &coords, monitor::MonitorSystem &monitorSystem, monitor::ControlSubsystemBase::Antenna &antenna)
Constructor.