INTRODUCTION Overview Download and Install Documentation Publications REPOSITORY Libraries DEVELOPER Dev Guide Dashboard PEOPLE Contributors Users Project Download Mailing lists
|
messages.h00001 /* 00002 * GearBox Project: Peer-Reviewed Open-Source Libraries for Robotics 00003 * http://gearbox.sf.net/ 00004 * Copyright (c) 2004-2008 Alex Brooks 00005 * 00006 * This distribution is licensed to you under the terms described in 00007 * the LICENSE file included in this distribution. 00008 * 00009 */ 00010 00011 #ifndef SICK_ACFR_DRIVER_MESSAGES_H 00012 #define SICK_ACFR_DRIVER_MESSAGES_H 00013 00014 #include <string> 00015 #include <vector> 00016 #include <gbxsickacfr/sickdefines.h> 00017 #include <gbxsickacfr/gbxserialdeviceacfr/gbxserialdeviceacfr.h> 00018 00019 namespace gbxsickacfr { 00020 00021 std::string toHexString( const uChar *buf, int bufLen ); 00022 inline std::string toHexString( const std::vector<uChar> &buf ) 00023 {return toHexString( &(buf[0]), buf.size() );} 00024 00026 // Generic LMS Response classes: 00027 // 00028 // - The SICK replies to commands with responses. 00029 // - Responses are of a standard format, but some responses contain 00030 // extra response-type-specific data. 00031 // - This is handled with the abstract class 'LmsResponseData': 00032 // - The LmsResponse has a pointer to LmsResponseData, which should 00033 // be cast to the appropriate type depending on the response type. 00034 // 00035 // (Note that in continuous mode, the measurements continuously 00036 // sent out by the SICK are 'responses', even though there's no command). 00037 // 00039 00040 // Abstract class for representing response-type-specific data. 00041 class LmsResponseData { 00042 public: 00043 virtual ~LmsResponseData() {} 00044 00045 // human-readable string 00046 virtual std::string toString() const=0; 00047 00048 virtual bool isError() const { return false; } 00049 virtual bool isWarn() const { return false; } 00050 00051 // Returns a freshly allocated object of the same type 00052 virtual LmsResponseData *clone() const=0; 00053 }; 00054 00055 // This class represents responses which the SICK uses to reply to commands. 00056 // All response types have the information in this class. 00057 // Some responses also have extra data, which is stored in the 'data' member. 00058 class LmsResponse : public gbxserialdeviceacfr::IResponse { 00059 public: 00060 LmsResponse() 00061 : status(0), 00062 data(NULL) 00063 {} 00064 LmsResponse( const LmsResponse &other ); 00065 LmsResponse &operator=( const LmsResponse &other ); 00066 ~LmsResponse() 00067 { if (data) delete data; } 00068 00069 uChar type; 00070 uChar status; 00071 LmsResponseData *data; 00072 00073 bool isError() const; 00074 bool isWarn() const; 00075 00076 std::string toString() const; 00077 }; 00078 std::string toString( const LmsResponse &r ); 00079 00081 // Response-specific data classes 00082 // 00083 // - The set of classes below all inherit from the abstract 00084 // 'LmsResponseData' class. They represent the data contained 00085 // in specific response types. 00086 // - See 'parseResponse' in the .cpp file for details of which 00087 // classes go with which response codes. 00088 // 00090 00091 class LmsInitResponseData : public LmsResponseData { 00092 public: 00093 std::string description; 00094 00095 std::string toString() const { return description; } 00096 LmsResponseData *clone() const { return new LmsInitResponseData(*this); } 00097 }; 00098 00099 class LmsStatusResponseData : public LmsResponseData { 00100 public: 00101 std::string version; 00102 uChar operatingMode; 00103 uChar status; 00104 std::string manufacturer; 00105 uChar variantType; 00106 uint16_t pollution[POLLUTION_LENGTH]; 00107 uint16_t refPollution[REF_POLLUTION_LENGTH]; 00108 uint16_t calibPollution[CALIB_POLLUTION_LENGTH]; 00109 uint16_t calibRefPollution[CALIB_REF_POLLUTION_LENGTH]; 00110 uint16_t numMotorRevolutions; 00111 uint16_t refScale1Dark100Pct; 00112 uint16_t refScale2Dark100Pct; 00113 uint16_t refScale1Dark66Pct; 00114 uint16_t refScale2Dark66Pct; 00115 uint16_t signalAmplitudePct; 00116 uint16_t currentAngle; 00117 uint16_t peakThreshold; 00118 uint16_t angleOfMeasurement; 00119 uint16_t calibSignalAmplitude; 00120 uint16_t targetStopThreshold; 00121 uint16_t targetPeakThreshold; 00122 uint16_t actualStopThreshold; 00123 uint16_t actualPeakThreshold; 00124 uChar measuringMode; 00125 uint16_t refSingleMeasuredValues; 00126 uint16_t refMeanMeasuredValues; 00127 uint16_t scanningAngle; 00128 uint16_t angularResolution; 00129 uChar restartMode; 00130 uChar restartTime; 00131 uint16_t baudRate; 00132 uChar evaluationNumber; 00133 uChar permanentBaudRate; 00134 uChar lmsAddress; 00135 uChar fieldSetNumber; 00136 uChar currentMeasuredValueUnit; 00137 uChar laserSwitchOff; 00138 std::string softwareVersion; 00139 00140 std::string toString() const; 00141 LmsResponseData *clone() const { return new LmsStatusResponseData(*this); } 00142 }; 00143 00144 class LmsSwitchOperatingModeResponseData : public LmsResponseData { 00145 public: 00146 uChar success; 00147 00148 bool isError() const { return success != OPERATING_MODE_RESPONSE_SUCCESS; } 00149 std::string toString() const { return modeSwitchSuccessToString(success); } 00150 LmsResponseData *clone() const { return new LmsSwitchOperatingModeResponseData(*this); } 00151 }; 00152 00153 class LmsConfigurationData : public LmsResponseData { 00154 public: 00155 00156 // Default values for all these fuckers 00157 LmsConfigurationData(); 00158 bool operator==( const LmsConfigurationData &o ) const; 00159 bool operator!=( const LmsConfigurationData &o ) const 00160 { return !(operator==(o)); } 00161 00162 uint16_t blanking; 00163 uChar sensitivity; 00164 uChar availability; 00165 uChar measuringMode; 00166 uChar measuredValueUnit; 00167 uChar transientFieldSet; 00168 uChar subtractiveFields; // 14 00169 uChar multipleEvaluation; 00170 uChar restart; 00171 uChar restartTime; 00172 uChar multipleEvaluationForSuppressed; 00173 uChar contourARef; 00174 uChar contourAPosToleranceBand; // 20 00175 uChar contourANegToleranceBand; 00176 uChar contourAStartAngle; 00177 uChar contourAStopAngle; 00178 uChar contourBRef; 00179 uChar contourBPosToleranceBand; 00180 uChar contourBNegToleranceBand; 00181 uChar contourBStartAngle; 00182 uChar contourBStopAngle; 00183 uChar contourARef2; 00184 uChar contourAPosToleranceBand2; // 30 00185 uChar contourCNegToleranceBand; 00186 uChar contourCStartAngle; 00187 uChar contourCStopAngle; 00188 uChar pixelOrientedEvaluation; 00189 uChar singleMeasuredValueEvaluation; 00190 uint16_t restartTimeFields; 00191 uint16_t multipleEvaluationForDazzle; 00192 00193 std::string toString() const; 00194 LmsResponseData *clone() const { return new LmsConfigurationData(*this); } 00195 }; 00196 00197 class LmsConfigurationResponseData : public LmsResponseData { 00198 public: 00199 LmsConfigurationData config; 00200 uChar configSuccess; 00201 00202 std::string toString() const; 00203 LmsResponseData *clone() const { return new LmsConfigurationResponseData(*this); } 00204 bool isError() const { return configSuccess != CONFIGURATION_SUCCESS; } 00205 }; 00206 00207 class LmsSwitchVariantResponseData : public LmsResponseData { 00208 public: 00209 uChar success; 00210 uint16_t scanningAngle; 00211 uint16_t angularResolution; 00212 00213 std::string toString() const; 00214 LmsResponseData *clone() const { return new LmsSwitchVariantResponseData(*this); } 00215 bool isError() const { return success != SWITCH_VARIANT_SUCCESS; } 00216 }; 00217 00218 class LmsMeasurementData : public LmsResponseData { 00219 public: 00220 00221 // ranges in metres 00222 std::vector<float> ranges; 00223 std::vector<uChar> intensities; 00224 00225 std::string toString() const; 00226 LmsResponseData *clone() const { return new LmsMeasurementData(*this); } 00227 }; 00228 00229 class LmsErrorResponseData : public LmsResponseData { 00230 public: 00231 00232 std::vector<uChar> errorTypes; 00233 std::vector<uChar> errorCodes; 00234 00235 std::string toString() const; 00236 LmsResponseData *clone() const { return new LmsErrorResponseData(*this); } 00237 bool isError() const; 00238 bool isWarn() const; 00239 }; 00240 00241 class LmsOperatingDataCounterData : public LmsResponseData { 00242 public: 00243 00244 int hoursOfOperation; 00245 int numSwitchOns; 00246 00247 std::string toString() const; 00248 LmsResponseData *clone() const { return new LmsOperatingDataCounterData(*this); } 00249 }; 00250 00252 00253 // If a complete telegram was found, returns true and allocates memory in 'response'. 00254 bool parseBufferForResponses( const uChar *buffer, 00255 int bufferLength, 00256 LmsResponse *&response, 00257 int &bytesParsed ); 00258 00259 void constructTelegram( std::vector<uChar> &buffer, 00260 const std::vector<uChar> &commandAndData ); 00261 00262 // SICK parameters can be changed in installation mode. 00263 void constructRequestInstallationMode( std::vector<uChar> &commandAndData ); 00264 00265 void constructRequestContinuousMode( std::vector<uChar> &commandAndData ); 00266 void constructRequestMeasuredOnRequestMode( std::vector<uChar> &commandAndData ); 00267 00268 void constructInitAndReset( std::vector<uChar> &commandAndData ); 00269 00270 void constructStatusRequest( std::vector<uChar> &commandAndData ); 00271 00272 void constructConfigurationRequest( std::vector<uChar> &commandAndData ); 00273 00274 void constructConfigurationCommand( const LmsConfigurationData &c, 00275 std::vector<uChar> &commandAndData ); 00276 00277 void constructRequestErrorMessage( std::vector<uChar> &commandAndData ); 00278 00279 void constructSwitchVariant( uint16_t scanningAngle, 00280 uint16_t angularResolution, 00281 std::vector<uChar> &commandAndData ); 00282 00283 void constructRequestOperatingDataCounter( std::vector<uChar> &commandAndData ); 00284 00285 void constructRequestBaudRate( std::vector<uChar> &commandAndData, int baudRate ); 00286 } 00287 00288 #endif |