Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef CInterfaceFTDI_H
00030 #define CInterfaceFTDI_H
00031
00032 #include <mrpt/config.h>
00033 #include <mrpt/utils/CStream.h>
00034 #include <mrpt/utils/stl_extensions.h>
00035
00036 #include <mrpt/hwdrivers/link_pragmas.h>
00037
00038 namespace mrpt
00039 {
00040 namespace hwdrivers
00041 {
00042
00043
00044
00045
00046
00047 struct HWDRIVERS_IMPEXP TFTDIDevice
00048 {
00049 std::string ftdi_manufacturer;
00050 std::string ftdi_description;
00051 std::string ftdi_serial;
00052
00053 uint16_t usb_idVendor;
00054 uint16_t usb_idProduct;
00055 uint8_t usb_serialNumber;
00056
00057 #if defined(MRPT_OS_LINUX) || defined(MRPT_OS_APPLE)
00058
00059 void *usb_device_struct;
00060 #endif
00061 };
00062
00063
00064 std::ostream HWDRIVERS_IMPEXP &operator << ( std::ostream &o, const TFTDIDevice &d);
00065
00066
00067 typedef std::deque<TFTDIDevice> TFTDIDeviceList;
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 class HWDRIVERS_IMPEXP CInterfaceFTDI : public utils::CStream
00093 {
00094 public:
00095
00096
00097 CInterfaceFTDI();
00098
00099
00100
00101 virtual ~CInterfaceFTDI();
00102
00103
00104 CInterfaceFTDI(const CInterfaceFTDI &o);
00105
00106
00107 CInterfaceFTDI& operator =(const CInterfaceFTDI &o);
00108
00109
00110
00111
00112 bool isOpen();
00113
00114
00115
00116 void OpenBySerialNumber( const std::string &serialNumber );
00117
00118
00119
00120 void OpenByDescription( const std::string &description );
00121
00122
00123 void Close();
00124
00125
00126 void ResetDevice();
00127
00128
00129 void Purge();
00130
00131
00132 void SetLatencyTimer (unsigned char latency_ms);
00133
00134
00135 void SetTimeouts(unsigned long dwReadTimeout_ms, unsigned long dwWriteTimeout_ms);
00136
00137
00138
00139
00140 void ListAllDevices( TFTDIDeviceList &outList );
00141
00142
00143
00144 size_t ReadSync(void *Buffer, size_t Count)
00145 {
00146 return Read(Buffer,Count);
00147 }
00148
00149
00150
00151 size_t WriteSync(const void *Buffer, size_t Count)
00152 {
00153 return Write(Buffer,Count);
00154 }
00155
00156
00157
00158
00159
00160 virtual size_t ReadBufferImmediate(void *Buffer, size_t Count);
00161
00162 protected:
00163
00164
00165
00166 size_t Read(void *Buffer, size_t Count);
00167
00168 mrpt::utils::circular_buffer<uint8_t> m_readBuffer;
00169
00170
00171
00172
00173 size_t Write(const void *Buffer, size_t Count);
00174
00175
00176
00177 uint64_t Seek(long Offset, CStream::TSeekOrigin Origin = sFromBeginning);
00178
00179
00180
00181 uint64_t getTotalBytesCount();
00182
00183
00184
00185 uint64_t getPosition();
00186
00187
00188 void ftdi_read(void *lpvBuffer, unsigned long dwBuffSize, unsigned long *lpdwBytesRead);
00189 void ftdi_write(const void *lpvBuffer, unsigned long dwBuffSize, unsigned long *lpdwBytes);
00190
00191 #if defined(MRPT_OS_WINDOWS)
00192 private:
00193 void checkErrorAndRaise(int errorCode);
00194
00195 void ftdi_open(void* pvDevice);
00196 void ftdi_openEx(void* pArg1, unsigned long dwFlags);
00197 void ftdi_listDevices(void *pArg1, void *pArg2, unsigned long dwFlags);
00198 void ftdi_getQueueStatus(unsigned long *lpdwAmountInRxQueue);
00199
00200 void *m_hmodule;
00201 unsigned long m_ftHandle;
00202
00203 void loadDriver();
00204
00205 enum FT_STATUS
00206 {
00207 dummy
00208 };
00209
00210 typedef FT_STATUS (__stdcall *PtrToOpen)(void*, unsigned long *);
00211 PtrToOpen m_pOpen;
00212
00213 typedef FT_STATUS (__stdcall *PtrToOpenEx)(void*, unsigned long, unsigned long *);
00214 PtrToOpenEx m_pOpenEx;
00215
00216 typedef FT_STATUS (__stdcall *PtrToListDevices)(void*, void*, unsigned long);
00217 PtrToListDevices m_pListDevices;
00218
00219 typedef FT_STATUS (__stdcall *PtrToClose)(unsigned long );
00220 PtrToClose m_pClose;
00221
00222 typedef FT_STATUS (__stdcall *PtrToRead)(unsigned long , void *, unsigned long, unsigned long *);
00223 PtrToRead m_pRead;
00224
00225 typedef FT_STATUS (__stdcall *PtrToWrite)(unsigned long , const void *, unsigned long, unsigned long *);
00226 PtrToWrite m_pWrite;
00227
00228 typedef FT_STATUS (__stdcall *PtrToResetDevice)(unsigned long );
00229 PtrToResetDevice m_pResetDevice;
00230
00231 typedef FT_STATUS (__stdcall *PtrToPurge)(unsigned long , unsigned long);
00232 PtrToPurge m_pPurge;
00233
00234 typedef FT_STATUS (__stdcall *PtrToSetTimeouts)(unsigned long , unsigned long, unsigned long);
00235 PtrToSetTimeouts m_pSetTimeouts;
00236
00237 typedef FT_STATUS (__stdcall *PtrToGetQueueStatus)(unsigned long , unsigned long *);
00238 PtrToGetQueueStatus m_pGetQueueStatus;
00239
00240 typedef FT_STATUS (__stdcall *PtrToSetLatencyTimer )(unsigned long , unsigned char);
00241 PtrToSetLatencyTimer m_pSetLatencyTimer;
00242
00243 #else
00244
00245 void *m_ftdi_context;
00246
00247
00248 void recursive_fill_list_devices( void *usb_device_structure , TFTDIDeviceList &outList );
00249
00250
00251 #endif
00252
00253
00254 };
00255
00256 }
00257 }
00258
00259 #endif