Barst  2.0
A server that controls lab hardware.
ftdi device.h
1 
4 #ifndef _CPL_FTDI_DEVICE_H_
5 #define _CPL_FTDI_DEVICE_H_
6 
7 #include "base classses.h"
8 #include "cpl queue.h"
9 #include "misc tools.h"
10 #include "ftd2xx.h"
11 
12 class CChannelFTDI;
13 class CPeriphFTDI;
14 
15 
17 #define FTDI_MAN_STR _T("FTDIMan")
18 class CManagerFTDI : public CManager
19 {
20 public:
21  CManagerFTDI(CComm* pcComm, const TCHAR szPipe[], int nChan, int &nError);
22  virtual ~CManagerFTDI();
23  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
24  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
25  virtual DWORD GetInfo(void* pHead, DWORD dwSize);
26 private:
27  std::vector<CChannelFTDI*> m_acFTDevices; // holds all the FTDI channels
28 
29  DWORD m_dwNumDevs; // number of devices discovered (including not ours)
30  std::vector<FT_DEVICE_LIST_INFO_NODE> m_asFTChanInfo; // holds the device info for all the devices discovered
31 };
32 
33 
34 // struct used by ftdi thread to repond to user updates commands
35 typedef struct SFTUpdates
36 {
37  SData sData;
38  __int64 llId;
39 } SFTUpdates;
40 
41 /* Defines a FTDI channel. Note, each channel correponds to a single channel on a physical device. But
42  each channel can hold multiple virutal devices defined below. */
43 #define FTDI_CHAN_STR _T("FTChann")
44 class CChannelFTDI : public CDevice
45 {
46 public:
59  CChannelFTDI(SChanInitFTDI &sChanInit, SBase* pInit, DWORD dwSize, FT_DEVICE_LIST_INFO_NODE &FTInfo,
60  const TCHAR szPipe[], int nChan, int &nError, LARGE_INTEGER &llStart);
61  virtual ~CChannelFTDI();
62  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
63  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
64  DWORD GetInfo(void* pHead, DWORD dwSize);
65 
66  DWORD ThreadProc(); // thread that reads/writes to physical device
67 
68  // channles init data
69  const FT_DEVICE_LIST_INFO_NODE m_FTInfo;
70  const std::tstring m_csPipeName;
71  const int m_nChan;
72 private:
73  FT_HANDLE m_ftHandle; // ft_handle to the channel
74  std::vector<CPeriphFTDI*> m_aDevices; // list of all the subdevices. index is channel number
75  SChanInitFTDI m_sChanInit;
76 
77 
78  HANDLE m_hStop; // stops the thread
79  HANDLE m_hNext; // tells the thread to do another read/write
80  HANDLE m_hUpdate; // tells the thread updates are pending for a device
81  std::vector<HANDLE> m_ahEvents; // events for all the devices
82  HANDLE m_hThread; // thread handle
83  CQueue<SFTUpdates> m_asUpdates; // queue which holds the updates, MUST only be valid
84 
85 
86  unsigned char* m_aucTx; // buffer used to write to device
87  CMemRing* m_pcMemRing; // provides the buffers for reading
88 
89  CTimer m_cTimer; // timer for this channel
90 };
91 
92 
93 
94 // see the Do work function in CPeriphFTDI for the use of this enum.
95 enum EStateFTDI
96 {
97  eActive= 1,
98  eInactive,
99  eActivateState,
100  eInactivateState,
101  ePreWrite,
102  ePostWrite,
103  ePostRead,
104  eRecover,
105 };
106 
107 /* following are the devices that FTDI channels recognize
108  they must be derived from CPeriphFTDI. Channel is initialized with list
109  of devices. Every device is initialized with a const struct of the init info. */
110 class CPeriphFTDI : public CDevice
111 {
112 friend class CChannelFTDI;
113 public:
115  CPeriphFTDI(const TCHAR szName[], const SInitPeriphFT &sInitFT) : CDevice(szName), m_sInitFT(sInitFT),
116  m_ucBitOutput(sInitFT.ucBitOutput){};
117  virtual ~CPeriphFTDI(){};
136  virtual bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)= 0;
137  virtual void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)= 0;
138  virtual void Result(void *pHead, bool bPass)= 0;
139  virtual EStateFTDI GetState()= 0; // returns if we're active/inactive etc.
140  virtual DWORD GetInfo(void* pHead, DWORD dwSize)= 0;
141  void SetOutputBits(unsigned char ucBitOutput) {m_ucBitOutput = ucBitOutput;}
142  unsigned char GetOutputBits() {return m_ucBitOutput;}
143 
144  const SInitPeriphFT m_sInitFT;
145 protected:
146  EStateFTDI m_eState; // current device state
147  CTimer* m_pcTimer; // timer of device.
148  unsigned char m_ucBitOutput; // current bits set as output
149  CMemRing* m_pcMemRing; // the class that provides the reading buffers
150 };
151 
152 
154 #define ADC_P _T("ADCBrd")
155 #define ADC_RESET_DELAY 2500
156 enum EHandshakeADC {
157  eConfigStart,
158  eConfigTO,
159  eConfigClkToggle,
160  eConfigWrite,
161  eConfigDone,
162 };
163 
164 typedef struct STimedRead
165 {
166  double dTime;
167  int nIdx;
168  void* pHead;
169 } STimedRead;
170 
171 class CADCPeriph : public CPeriphFTDI
172 {
173 public:
174  CADCPeriph(const SADCInit &sADCInit, CComm *pcComm, const SInitPeriphFT &sInitFT,
175  HANDLE hNewData, int &nError, CTimer* pcTimer);
176  virtual ~CADCPeriph();
177  bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError);
178  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
179  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
180  EStateFTDI GetState();
181  DWORD GetInfo(void* pHead, DWORD dwSize);
182 
183  DWORD ThreadProc();
184 
185  const SADCInit m_sInit;
186  const unsigned char m_ucMask; // flipped
187  const unsigned char m_ucConfigWriteBit;
188  const unsigned char m_ucConfigReadBit;
189  const unsigned char m_ucReverse; // 1 if reverse, 0 otherwise
190  const unsigned char m_ucDefault; // default state of the pins (high/low)
191  const unsigned short m_usConfigWord;
192  const unsigned char m_ucTransPerByte;
193  const unsigned char m_ucNGroups; // number of transections it takes to get a data set (cycle)
194  const unsigned char m_ucNBytes; // number of bytes sent in a data set
195 private:
196  void ExtractData(STimedRead *psRead);
197  DWORD m_dwRestartE;
198  EHandshakeADC m_eConfigState;
199  SData m_sData;
200 
201  HANDLE m_hThread;
202  HANDLE m_hThreadClose;
203  HANDLE m_hProcessData;
204  HANDLE m_hReset;
205  HANDLE m_hNext;
206 
207  CQueue<STimedRead *> m_apsReadIdx;
208  CRITICAL_SECTION m_hStateSafe;
209  __int64 m_llId;
210 
211  DWORD m_dwDataCount; // count of packets since start of now transection cycle
212  char m_cDataOffset; // number of cycles into m_aucBuff multiplied my m_ucNBytes
213  char m_cBuffSize;
214  unsigned char* m_aucBuff;
215  unsigned short (*m_aucDecoded)[256];
216  unsigned char m_aucGroups[16]; // sending 2 bits at a time w/ 4 bytes per ADC point = max 16 groups
217  unsigned char m_ucFlags;
218  unsigned short m_usBadRead;
219  unsigned short m_usOverflow;
220  DWORD m_dwTempData;
221  DWORD m_dwAmountRead;
222 
223  SADCData* m_psDataHeader;
224  DWORD* m_adwData;
225  bool m_bSecond;
226  DWORD m_dwPos;
227  DWORD m_dwSpaceUsed;
228  float m_fTimeWorked;
229  DWORD m_dwStartRead;
230  double m_dTimeTemp;
231 
232  //unsigned char m_ucLastByte;
233 };
234 
236 #define MULTI_W_P _T("MltWBrd")
238 {
239 public:
240  CMultiWPeriph(const SValveInit &sValveInit, CComm *pcComm, const SInitPeriphFT &sInitFT,
241  int &nError, HANDLE hNewData, CTimer* pcTimer);
242  virtual ~CMultiWPeriph();
243  bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError);
244  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
245  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
246  EStateFTDI GetState();
247  DWORD GetInfo(void* pHead, DWORD dwSize);
248 
249  const SValveInit m_sInit;
250  const unsigned char m_ucMask;
251  const unsigned char m_ucDefault;
252 private:
253  bool m_bUpdated;
254  bool m_bChanged;
255  int m_nProcessed;
256  double m_dInitial;
257  std::vector<bool> m_abData;
258  CRITICAL_SECTION m_hDataSafe;
259  CQueue<__int64> m_allIds;
260  HANDLE m_hNext;
261 };
262 
264 #define MULTI_R_P _T("MltRBrd")
266 {
267 public:
268  CMultiRPeriph(const SValveInit &sValveInit, CComm *pcComm, const SInitPeriphFT &sInitFT,
269  int &nError, HANDLE hNewData, CTimer* pcTimer);
270  virtual ~CMultiRPeriph();
271  bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError);
272  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
273  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
274  EStateFTDI GetState();
275  DWORD GetInfo(void* pHead, DWORD dwSize);
276 
277  const SValveInit m_sInit;
278  const unsigned char m_ucMask;
279  const unsigned char m_ucDefault;
280 private:
281  bool m_bRead;
282  int m_nProcessed;
283  double m_dInitial;
284  CRITICAL_SECTION m_hDataSafe;
285  std::vector<__int64> m_allIds;
286  HANDLE m_hNext;
287 };
288 
290 #define PIN_W_P _T("PinWBrd")
291 class CPinWPeriph : public CPeriphFTDI
292 {
293 public:
294  CPinWPeriph(const SPinInit &sPinInit, CComm *pcComm, const SInitPeriphFT &sInitFT,
295  int &nError, HANDLE hNewData, CTimer* pcTimer);
296  virtual ~CPinWPeriph();
297  bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError);
298  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
299  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
300  EStateFTDI GetState();
301  DWORD GetInfo(void* pHead, DWORD dwSize);
302 
303  const SPinInit m_sInit;
304  const unsigned char m_ucMask;
305 private:
306  unsigned char m_ucLast;
307  bool m_bUpdated;
308  bool m_bChanged;
309  int m_nProcessed;
310  double m_dInitial;
311  std::vector<unsigned char> m_aucData;
312  CRITICAL_SECTION m_hDataSafe;
313  CQueue<__int64> m_allIds;
314  HANDLE m_hNext;
315 };
316 
318 #define PIN_R_P _T("PinRBrd")
319 class CPinRPeriph : public CPeriphFTDI
320 {
321 public:
322  CPinRPeriph(const SPinInit &sPinInit, CComm *pcComm, const SInitPeriphFT &sInitFT,
323  int &nError, HANDLE hNewData, CTimer* pcTimer);
324  virtual ~CPinRPeriph();
325  bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError);
326  void ProcessData(const void *pHead, DWORD dwSize, __int64 llId);
327  void Result(void *pHead, bool bPass) {if (m_pcMemPool) m_pcMemPool->PoolRelease(pHead);}
328  EStateFTDI GetState();
329  DWORD GetInfo(void* pHead, DWORD dwSize);
330 
331  const SPinInit m_sInit;
332  const unsigned char m_ucMask;
333 private:
334  bool m_bRead;
335  int m_nProcessed;
336  double m_dInitial;
337  CRITICAL_SECTION m_hDataSafe;
338  std::vector<__int64> m_allIds;
339  HANDLE m_hNext;
340 };
341 
342 #endif
virtual DWORD GetInfo(void *pHead, DWORD dwSize)
Definition: ftdi device.cpp:74
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:245
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:24
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:299
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:327
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:63
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:179
void Result(void *pHead, bool bPass)
Definition: ftdi device.h:273
CPeriphFTDI(const TCHAR szName[], const SInitPeriphFT &sInitFT)
Definition: ftdi device.h:115