KatanaNativeInterface $VERSION$

kmlMotBase.h

Go to the documentation of this file.
00001 //
00002 // C++ Interface: MotBase
00003 //
00004 // Description: 
00005 //
00006 //
00007 // Author: Tiziano Müller <tiziano.mueller@neuronics.ch>, (C) 2006
00008 //
00009 // Copyright: See COPYING file that comes with this distribution
00010 //
00011 //
00012 
00013 #ifndef KMLMOTBASE_H
00014 #define KMLMOTBASE_H
00015 
00016 #include "common/exception.h"
00017 #include "common/dllexport.h"
00018 
00019 #include "KNI/kmlCommon.h"
00020 #include "KNI/cplBase.h"
00021 
00022 #include <vector>
00023 
00024 class CKatBase; // forward declaration
00025 class CMotBase; // forward declaration
00026 
00027 
00028 /****************************************************************************/
00029 // CMotBase ----------------------------------------------------------------//
00030 /****************************************************************************/
00031 
00034 struct  TMotDesc {
00035         byte            slvID;          
00036 };
00037 
00040 struct  TKatMOT {
00041         short           cnt;            
00042         CMotBase*       arr;            
00043         TMotDesc*       desc;           
00044 };
00045 
00048 enum TMotCmdFlg {
00049         MCF_OFF         = 0,            
00050         MCF_CALIB       = 4,            
00051         MCF_FREEZE      = 8,            
00052         MCF_ON          = 24            
00053 };
00054 
00057 enum TMotStsFlg {
00058         MSF_MECHSTOP    = 1,            
00059         MSF_MAXPOS      = 2,            
00060         MSF_MINPOS      = 4,            
00061         MSF_DESPOS      = 8,            
00062         MSF_NORMOPSTAT  = 16,           
00063         MSF_MOTCRASHED  = 40,           
00064         MSF_NLINMOV     = 88,           
00065         MSF_LINMOV      = 152,          
00066         MSF_NOTVALID    = 128           
00067 };
00068 enum TSearchDir {                       
00069         DIR_POSITIVE,
00070         DIR_NEGATIVE
00071 };
00072 
00073 
00074 //--------------------------------------------------------------------------//
00075 
00078 struct TMotGNL {
00079         CKatBase*       own;            
00080         byte            SID;            
00081 };
00082 
00085 struct TMotSFW {
00086         byte            version;        
00087         byte            subversion;     
00088         byte            revision;       
00089         byte            type;           
00090         byte            subtype;        
00091 };
00092 
00095 struct TMotAPS {
00096         TMotCmdFlg      mcfAPS;         
00097         short           actpos;         
00098 };
00099 
00102 struct TMotTPS {
00103         TMotCmdFlg      mcfTPS;         
00104         short           tarpos;         
00105 };
00106 
00109 struct TMotSCP {
00110 
00111         //--------------- Motor old parameters -------------------------------//
00112         //
00113         byte            maxppwm;        
00114         byte            maxnpwm;        
00115         byte            kP;             
00116         byte            kI;             
00117         byte            kD;             
00118         byte            kARW;           
00119         //byte          kSpeed;         //!< prop. factor of speed limit comp
00120         byte            kP_speed;       
00121         byte            kI_speed;       
00122         byte            kD_speed;       
00123 
00124         //--------------- Motor new parameters -------------------------------//
00125         //
00126         byte            maxppwm_nmp;    
00127         byte            maxnpwm_nmp;    
00128         byte            kspeed_nmp;     
00129         byte            kpos_nmp;       
00130         byte            kI_nmp;         
00131         int             crash_limit_nmp;        
00132         int             crash_limit_lin_nmp;    
00133 };
00134 
00137 struct TMotDYL {
00138 
00139         //--------------- Motor old parameters -------------------------------//
00140         //
00141         byte            maxaccel;       
00142         byte            maxdecel;       
00143         short           minpos;         
00144         short           maxpspeed;      
00145         short           maxnspeed;      
00146         //byte          maxpcurr;       // no more active
00147         //byte          maxncurr;       // no more active
00148         byte            maxcurr;        
00149         byte            actcurr;        
00150 
00151         //--------------- Motor new parameters -------------------------------//
00152         //
00153         byte            maxaccel_nmp;   
00154         short           maxpspeed_nmp;  
00155         short           maxnspeed_nmp;  
00156         byte            maxcurr_nmp;    
00157 };
00158 
00161 struct TMotPVP {
00162         TMotStsFlg      msf;            
00163         short           pos;            
00164         short           vel;            
00165         byte            pwm;            
00166 };
00167 
00170 struct TMotENL {
00171         int     enc_range;              
00172         int     enc_minpos;             
00173         int     enc_maxpos;             
00174         int     enc_per_cycle;          
00175         int     enc_tolerance;          
00176 };
00177 
00178 
00181 struct TMotCLB {
00182   bool          enable;                 
00183   short       order;                    
00184   
00185   TSearchDir    dir;                    
00186   TMotCmdFlg    mcf;                    
00187   
00188   int                 encoderPositionAfter;
00189   bool          isCalibrated;
00190   
00191   TMotDYL dyl;
00192   TMotSCP scp;
00193 };
00194 
00195 
00198 struct TMotInit {
00199         int             encoderOffset;
00200         int             encodersPerCycle;
00201         double          angleOffset;
00202         double          angleRange;
00203         int             rotationDirection;
00204 
00205         // calculated ones:
00206         double                  angleStop;
00207 };
00208 
00209 //--------------------------------------------------------------------------//
00210 
00219 class DLLDIR CMotBase {
00220 
00221         friend class CKatBase;
00222 
00223 
00224 protected:
00225         TMotGNL gnl;                    
00226         TMotAPS aps;                    
00227         TMotTPS tps;                    
00228         TMotSCP scp;                    
00229         TMotDYL dyl;                    
00230         TMotPVP pvp;                    
00231         TMotSFW sfw;                    
00232         TMotCLB  _calibrationParameters;
00233         TMotENL  _encoderLimits;        
00234         TMotInit _initialParameters;
00235         bool    freedom;                
00236         bool    nmp;                    
00237         bool    blocked;                
00238 
00239 
00240 public:
00241         const TMotGNL* GetGNL() { return &gnl; }
00242         const TMotAPS* GetAPS() { return &aps; }
00243         const TMotTPS* GetTPS() { return &tps; }
00244         const TMotSCP* GetSCP() { return &scp; }
00245         const TMotDYL* GetDYL() { return &dyl; }
00246         const TMotPVP* GetPVP() { return &pvp; }
00247         const TMotSFW* GetSFW() { return &sfw; }
00248         const TMotCLB* GetCLB() { return &_calibrationParameters; }
00249 
00250         const TMotInit* GetInitialParameters() { return &_initialParameters; }
00251         const int GetEncoderTolerance() { return _encoderLimits.enc_tolerance; }
00252         const int GetEncoderMinPos() { return _encoderLimits.enc_minpos; }      
00253         const int GetEncoderMaxPos() { return _encoderLimits.enc_maxpos; }      
00254         const int GetEncoderRange() { return _encoderLimits.enc_range; }        
00255 const bool GetFreedom() { return freedom; }const bool GetBlocked() { return blocked; }const bool GetNmp() { return nmp; }
00262 
00263 protected:
00264         CCplBase* protocol;     
00265 
00266 public:
00267         virtual ~CMotBase() {}  //destructor
00268 
00269         bool init(CKatBase* _own, const TMotDesc _motDesc, CCplBase* protocol);
00270         void sendAPS(const TMotAPS* _aps);      void sendTPS(const TMotTPS* _tps);      void sendSCP(const TMotSCP* _scp);      void sendDYL(const TMotDYL* _dyl);
00279         void recvPVP(); void recvSCP(); void recvDYL(); void recvSFW();
00288 
00289         void setSCP(TMotSCP _scp) { scp = _scp; }
00290         void setDYL(TMotDYL _dyl) { dyl = _dyl; }
00291 
00296         void setTPSP(int tar);
00297         void setTPSPDegrees(double tar);        void resetTPSP();
00302 
00303         
00304         void setInitialParameters(double angleOffset, double angleRange, int encodersPerCycle, int encoderOffset, int rotationDirection);
00305         void setCalibrationParameters(bool doCalibration, short order, TSearchDir direction, TMotCmdFlg motorFlagAfter, int encoderPositionAfter);
00306         void setCalibrated(bool calibrated);
00307                                       
00308         void setTolerance(int tolerance);
00309 
00312         bool checkAngleInRange(double angle);   
00313         bool checkEncoderInRange(int encoder);
00314 
00317         void inc(int dif, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00320         void dec(int dif, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00323         void mov(int tar, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00324 
00327         void waitForMotor(int tar, int encTolerance = 100, short mode = 0, int waitTimeout = TM_ENDLESS);
00328 
00331         void incDegrees(double dif, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00334         void decDegrees(double dif, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00337         void movDegrees(double tar, bool wait = false, int tolerance = 100, long timeout = TM_ENDLESS);
00338 
00341         void resetBlocked();
00342 
00343 
00347     void sendSpline(short targetPosition, short duration, short p1, short p2, short p3, short p4);
00348 
00353         void sendFourSplines(short targetPosition, short duration, std::vector<short>& coefficients);
00354 
00355 
00358         void setSpeedLimits(short positiveVelocity, short negativeVelocity);
00359         void setSpeedLimit(short velocity) { setSpeedLimits(velocity, velocity); }
00360 
00363         void setAccelerationLimit( short acceleration );
00364         
00367         void setPwmLimits(byte maxppwm, byte maxnpwm);
00368         
00371         void setControllerParameters(byte kSpeed, byte kPos, byte kI);
00372         
00375         void setCrashLimit(int limit);
00377         void setCrashLimitLinear(int limit_lin);
00379         void setSpeedCollisionLimit(int limit);
00381         void setPositionCollisionLimit(int limit);
00382 
00389         void getParameterOrLimit(int subcommand, byte* R1, byte* R2, byte* R3);
00390 };
00391 
00392 
00393 #endif