00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __igstkSerialCommunication_h
00019 #define __igstkSerialCommunication_h
00020
00021
00022 #if defined(_MSC_VER)
00023 #pragma warning ( disable : 4355 )
00024 #endif
00025
00026 #include "itkObject.h"
00027 #include "itkEventObject.h"
00028 #include "igstkLogger.h"
00029 #include "itkStdStreamLogOutput.h"
00030
00031 #include "igstkMacros.h"
00032 #include "igstkEvents.h"
00033 #include "igstkCommunication.h"
00034 #include "igstkStateMachine.h"
00035
00036
00037 namespace igstk
00038 {
00039
00063 class SerialCommunication : public Communication
00064 {
00065 public:
00066
00068 enum PortNumberType { PortNumber0 = 0,
00069 PortNumber1 = 1,
00070 PortNumber2 = 2,
00071 PortNumber3 = 3,
00072 PortNumber4 = 4,
00073 PortNumber5 = 5,
00074 PortNumber6 = 6,
00075 PortNumber7 = 7 };
00076
00078 enum BaudRateType { BaudRate9600 = 9600,
00079 BaudRate19200 = 19200,
00080 BaudRate38400 = 38400,
00081 BaudRate57600 = 57600,
00082 BaudRate115200 = 115200 };
00083
00085 enum DataBitsType { DataBits7 = 7,
00086 DataBits8 = 8 };
00087
00089 enum ParityType { NoParity = 'N',
00090 OddParity = 'O',
00091 EvenParity = 'E' };
00092
00094 enum StopBitsType { StopBits1 = 1,
00095 StopBits2 = 2 };
00096
00098 enum HandshakeType { HandshakeOff = 0,
00099 HandshakeOn = 1 };
00100
00101 typedef Communication::ResultType ResultType;
00102
00104 igstkStandardClassBasicTraitsMacro( SerialCommunication, Communication );
00105
00111 static Pointer New(void);
00112
00113
00116 igstkSetMacro( PortNumber, PortNumberType );
00118 igstkGetMacro( PortNumber, PortNumberType );
00119
00122 igstkSetMacro( BaudRate, BaudRateType );
00124 igstkGetMacro( BaudRate, BaudRateType );
00125
00128 igstkSetMacro( DataBits, DataBitsType );
00130 igstkGetMacro( DataBits, DataBitsType );
00131
00133 igstkSetMacro( Parity, ParityType );
00135 igstkGetMacro( Parity, ParityType );
00136
00138 igstkSetMacro( StopBits, StopBitsType );
00140 igstkGetMacro( StopBits, StopBitsType );
00141
00143 igstkSetMacro( HardwareHandshake, HandshakeType );
00145 igstkGetMacro( HardwareHandshake, HandshakeType );
00146
00148 void SetCaptureFileName(const char* filename);
00150 const char* GetCaptureFileName() const;
00151
00153 igstkSetMacro( Capture, bool );
00155 igstkGetMacro( Capture, bool );
00156
00159 ResultType UpdateParameters( void );
00160
00163 ResultType OpenCommunication( void );
00164
00166 ResultType CloseCommunication( void );
00167
00171 ResultType SetRTS( unsigned int signal );
00172
00174 ResultType Write( const char *message, unsigned int numberOfBytes );
00175
00179 ResultType Read( char *data, unsigned int numberOfBytes,
00180 unsigned int &bytesRead );
00181
00187 ResultType SendBreak( void );
00188
00193 ResultType PurgeBuffers( void );
00194
00199 void Sleep( unsigned int milliseconds );
00200
00202 igstkStateMachineMacro();
00203
00205 igstkLoggerMacro();
00206
00207 protected:
00208
00209 SerialCommunication();
00210
00211 ~SerialCommunication();
00212
00213
00214
00216 virtual ResultType InternalOpenPort( void ) { return SUCCESS; }
00217
00219 virtual ResultType InternalUpdateParameters( void ) { return SUCCESS; }
00220
00222 virtual ResultType InternalClosePort( void ) { return SUCCESS; }
00223
00225 virtual ResultType InternalSetRTS( unsigned int ) { return SUCCESS; }
00226
00228 virtual ResultType InternalWrite( const char *, unsigned int ) {
00229 return TIMEOUT; }
00230
00232 virtual ResultType InternalRead( char *, unsigned int, unsigned int &) {
00233 return TIMEOUT; }
00234
00236 virtual ResultType InternalSendBreak( void ) { return SUCCESS; }
00237
00239 virtual ResultType InternalPurgeBuffers( void ) { return SUCCESS; }
00240
00242 virtual void InternalSleep( unsigned int ) {};
00243
00245 virtual void PrintSelf( std::ostream& os, itk::Indent indent ) const;
00246
00247 private:
00248
00249
00250
00252 PortNumberType m_PortNumber;
00253
00255 BaudRateType m_BaudRate;
00256
00258 DataBitsType m_DataBits;
00259
00261 ParityType m_Parity;
00262
00264 StopBitsType m_StopBits;
00265
00267 HandshakeType m_HardwareHandshake;
00268
00270 unsigned int m_SleepPeriod;
00271
00273 char *m_InputData;
00274
00276 const char *m_OutputData;
00277
00279 unsigned int m_BytesToWrite;
00280
00282 unsigned int m_BytesToRead;
00283
00285 unsigned int m_BytesRead;
00286
00288 typedef std::map<int, InputType> IntegerInputMapType;
00289
00291 std::string m_CaptureFileName;
00292
00294 std::ofstream m_CaptureFileStream;
00295
00297 unsigned int m_CaptureMessageNumber;
00298
00300 bool m_Capture;
00301
00303 igstk::Object::LoggerType::Pointer m_Recorder;
00304
00306 unsigned int m_RTSSignal;
00307
00309 itk::StdStreamLogOutput::Pointer m_CaptureFileOutput;
00310
00312 ResultType m_ReturnValue;
00313
00315 IntegerInputMapType m_ResultInputMap;
00316
00317
00318 igstkDeclareStateMacro( Idle );
00319 igstkDeclareStateMacro( AttemptingToOpenPort );
00320 igstkDeclareStateMacro( PortOpen );
00321 igstkDeclareStateMacro( AttemptingToUpdateParameters );
00322 igstkDeclareStateMacro( ReadyForCommunication );
00323 igstkDeclareStateMacro( AttemptingToClosePort );
00324 igstkDeclareStateMacro( AttemptingToRead );
00325 igstkDeclareStateMacro( AttemptingToWrite );
00326 igstkDeclareStateMacro( AttemptingToSendBreak );
00327 igstkDeclareStateMacro( AttemptingToPurgeBuffers );
00328 igstkDeclareStateMacro( AttemptingToSetRTS );
00329 igstkDeclareStateMacro( Sleep );
00330
00331
00332 igstkDeclareInputMacro( Success );
00333 igstkDeclareInputMacro( Failure );
00334 igstkDeclareInputMacro( Timeout );
00335 igstkDeclareInputMacro( OpenPort );
00336 igstkDeclareInputMacro( ClosePort );
00337 igstkDeclareInputMacro( UpdateParameters );
00338 igstkDeclareInputMacro( Read );
00339 igstkDeclareInputMacro( Write );
00340 igstkDeclareInputMacro( SendBreak );
00341 igstkDeclareInputMacro( PurgeBuffers );
00342 igstkDeclareInputMacro( Sleep );
00343 igstkDeclareInputMacro( SetRTS );
00344
00346 void OpenPortSuccessProcessing( void );
00347
00349 void OpenPortFailureProcessing( void );
00350
00352 void ClosePortSuccessProcessing( void );
00353
00355 void ClosePortFailureProcessing( void );
00356
00358 void SuccessProcessing( void );
00359
00361 void FailureProcessing( void );
00362
00364 void TimeoutProcessing( void );
00365
00367 void NoProcessing();
00368
00370 void AttemptToOpenPortProcessing( void );
00371
00373 void AttemptToUpdateParametersProcessing( void );
00374
00376 void AttemptToClosePortProcessing( void );
00377
00379 void AttemptToSetRTSProcessing( void );
00380
00382 void AttemptToWriteProcessing( void );
00383
00385 void AttemptToReadProcessing( void );
00386
00388 void AttemptToSendBreakProcessing( void );
00389
00391 void AttemptToPurgeBuffersProcessing( void );
00392
00394 void SleepProcessing( void );
00395
00397 const InputType &MapResultToInput( int condition );
00398 };
00399
00400 }
00401
00402 #endif // __igstkSerialCommunication_h