3 #include "ftdi device.h" 5 static const unsigned char s_aucBitReverseTable256[] =
7 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
8 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
9 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
10 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
11 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
12 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
13 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
14 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
15 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
16 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
17 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
18 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
19 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
20 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
21 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
22 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
28 DWORD WINAPI ADCProc(LPVOID lpParameter)
31 return ((
CADCPeriph*)lpParameter)->ThreadProc();
36 HANDLE hNewData,
int &nError,
CTimer* pcTimer):
38 m_sInit(sADCInit), m_ucDefault(1 << sADCInit.ucClk), m_ucMask(~(1 << sADCInit.ucClk|((0xFF << sADCInit.ucLowestDataBit) &
39 (0xFF >> (6 - sADCInit.ucLowestDataBit - sADCInit.ucDataBits))))),
40 m_ucConfigWriteBit(1 << (sADCInit.bReverseBytes?sADCInit.ucLowestDataBit:sADCInit.ucLowestDataBit+1+sADCInit.ucDataBits)),
41 m_ucConfigReadBit(sADCInit.bReverseBytes?(m_ucConfigWriteBit << 1):(m_ucConfigWriteBit >> 1)), m_ucReverse(sADCInit.bReverseBytes?1:0),
42 m_usConfigWord((((sADCInit.bChop?0x80:0) | (sADCInit.ucRateFilter & 0x7F)) << 8) | (sADCInit.ucDataBits+1) << 5
43 | (sADCInit.ucBitsPerData == 24?0x10:0) | (sADCInit.bChan2?0x8:0) | (sADCInit.bChan1?0x4:0) | (sADCInit.ucInputRange & 0x3)),
44 m_ucTransPerByte(0), m_hNext(hNewData),
45 m_ucNGroups(((sADCInit.ucDataBits==0) | (sADCInit.ucDataBits==2) | (sADCInit.ucDataBits==6))?(m_sInit.ucBitsPerData/8+1)*8/(sADCInit.ucDataBits+2):8),
46 m_ucNBytes(((sADCInit.ucDataBits==0) | (sADCInit.ucDataBits==2) | (sADCInit.ucDataBits==6))?(m_sInit.ucBitsPerData/8 + 1):(sADCInit.ucDataBits + 2)),
47 m_hProcessData(CreateEvent(NULL, TRUE, FALSE, NULL)), m_apsReadIdx(m_hProcessData)
58 InitializeCriticalSection(&m_hStateSafe);
61 if (!pcComm || (m_sInitFT.dwBuff%510 && m_sInitFT.dwBuff%62) ||
62 (m_sInit.ucBitsPerData != 16 && m_sInit.ucBitsPerData != 24) ||
63 (!m_sInit.bStatusReg) || m_sInitFT.dwMinSizeR != m_sInitFT.dwBuff ||
64 m_sInitFT.dwMinSizeW != m_sInitFT.dwBuff || !pcTimer || !hNewData || (!m_sInit.bChan1 && !m_sInit.bChan2)
65 || m_sInit.ucDataBits > 6)
67 nError= BAD_INPUT_PARAMS;
72 m_hThreadClose= CreateEvent(NULL, TRUE, FALSE, NULL);
73 m_hReset= CreateEvent(NULL, TRUE, TRUE, NULL);
74 if (!m_hThreadClose || !m_hProcessData || !m_hReset)
76 nError= NO_SYS_RESOURCE;
82 nError= NO_SYS_RESOURCE;
85 m_hThread= CreateThread(NULL, 0, ADCProc,
this, 0, NULL);
88 nError= NO_SYS_RESOURCE;
92 m_psDataHeader->dwPos= 0;
94 m_psDataHeader->dwCount1= 0;
95 m_psDataHeader->dwCount2= 0;
96 m_psDataHeader->dwChan1S= 0;
97 m_psDataHeader->dwChan2S= 0;
99 m_psDataHeader->sDataBase.eType= eTrigger;
100 m_psDataHeader->sDataBase.nChan= m_sInitFT.nChan;
102 m_psDataHeader->sBase.eType= eADCData;
103 m_psDataHeader->dStartTime= 0;
104 m_adwData= (DWORD*)((
unsigned char*)m_psDataHeader+
sizeof(
SADCData));
105 m_eConfigState = eConfigDone;
112 m_eState= eInactivateState;
114 m_sData.pDevice=
this;
115 m_sData.dwSize=
sizeof(
SADCData)+
sizeof(DWORD)*m_sInit.dwDataPerTrans*((sADCInit.
bChan1 && sADCInit.
bChan2)?2:1);
116 m_aucDecoded = (
unsigned short(*)[256])m_pcMemPool->PoolAcquire(
sizeof(*m_aucDecoded)*m_ucNGroups);
117 unsigned __int64 llTemp;
118 unsigned char ucTemp;
127 for (
char i = 0; i<m_ucNGroups; ++i)
128 if (i*(m_sInit.ucDataBits + 2)/8 > m_ucNBytes - 2)
131 m_aucGroups[i] = m_ucNBytes - 2 - i*(m_sInit.ucDataBits + 2)/8;
132 for (
unsigned short i = 0; i< 256; ++i)
134 ucTemp = (i & ~(m_ucMask | 1 << m_sInit.ucClk));
135 if (m_sInit.bReverseBytes)
137 cShift = m_sInit.ucLowestDataBit - (8 - (m_sInit.ucLowestDataBit + m_sInit.ucDataBits + 2));
138 ucTemp = cShift>=0 ? s_aucBitReverseTable256[ucTemp] << cShift: s_aucBitReverseTable256[ucTemp] >> -cShift;
140 ucTemp <<= 8 - (m_sInit.ucLowestDataBit + m_sInit.ucDataBits + 2);
141 llTemp = (
unsigned __int64)ucTemp << 8 * (m_ucNBytes - 1);
142 for (
char j = 0; j<m_ucNGroups; ++j)
144 m_aucDecoded[j][i] = ((llTemp >> m_aucGroups[j] * 8) & 0xFFFF);
145 llTemp >>= m_sInit.ucDataBits + 2;
153 m_cBuffSize = m_ucNBytes;
156 m_cBuffSize = m_ucNBytes*(m_sInit.ucBitsPerData/8 + 1);
159 m_aucBuff = (
unsigned char*)m_pcMemPool->PoolAcquire(m_cBuffSize);
160 memset(m_aucBuff, 0, m_cBuffSize);
161 m_cDataOffset = m_ucNBytes * (m_cBuffSize / m_ucNBytes - 1);
172 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
173 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_sInitFT.nChan;
174 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
175 ((
SBaseOut*)pHead)->bActive= GetState() == eActive;
176 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE, m_csName.c_str(), _TRUNCATE);
177 pHead= (
char*)pHead+
sizeof(
SBaseOut);
180 ((
SBase*)pHead)->eType= eFTDIPeriphInit;
181 pHead= (
char*)pHead+
sizeof(
SBase);
186 ((
SBase*)pHead)->eType= eFTDIADCInit;
187 pHead= (
char*)pHead+
sizeof(
SBase);
188 memcpy(pHead, &m_sInit,
sizeof(
SADCInit));
193 CADCPeriph::~CADCPeriph()
196 if (m_hThread && (WAIT_OBJECT_0 != SignalObjectAndWait(m_hThreadClose, m_hThread, 2000, FALSE)))
197 TerminateThread(m_hThread, 0);
198 DeleteCriticalSection(&m_hStateSafe);
199 if (m_hThread) CloseHandle(m_hThread);
202 while (m_pcMemRing && m_apsReadIdx.GetSize())
204 psRead = m_apsReadIdx.Front(
true, bNotEmpty);
205 if (psRead && bNotEmpty)
207 m_pcMemRing->ReleaseIndex(psRead->nIdx);
211 if (m_hProcessData) CloseHandle(m_hProcessData);
212 if (m_hReset) CloseHandle(m_hReset);
213 if (m_hThreadClose) CloseHandle(m_hThreadClose);
215 m_pcMemPool->PoolRelease(m_psDataHeader);
219 bool CADCPeriph::DoWork(
void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason,
int nError)
223 unsigned char *aucBuff= (
unsigned char *)pHead;
227 EnterCriticalSection(&m_hStateSafe);
228 m_eState= eActivateState;
230 LeaveCriticalSection(&m_hStateSafe);
231 if (m_sInit.bConfigureADC)
232 m_ucBitOutput = m_sInitFT.ucBitOutput | m_ucConfigWriteBit;
233 m_eConfigState = eConfigStart;
235 case eInactivateState:
239 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
242 ((
SBaseIn*)sData.pHead)->eType= eResponse;
243 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
244 ((
SBaseIn*)sData.pHead)->nError= DEVICE_CLOSING;
247 EnterCriticalSection(&m_hStateSafe);
248 m_eState= eInactivateState;
250 m_pcComm->SendData(&sData, m_llId);
252 LeaveCriticalSection(&m_hStateSafe);
255 EnterCriticalSection(&m_hStateSafe);
256 if (m_eState == eActive || m_eState == eActivateState)
258 m_eState= eActivateState;
259 m_eConfigState = eConfigStart;
260 m_ucBitOutput = m_sInitFT.ucBitOutput;
262 LeaveCriticalSection(&m_hStateSafe);
265 if (m_eState == eActivateState)
267 switch (m_eConfigState)
272 m_dwRestartE= GetTickCount() + ADC_RESET_DELAY;
277 aucBuff[i++] = (aucBuff[i] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
278 aucBuff[i] = (aucBuff[i] & m_ucMask) | m_ucConfigWriteBit;
280 for (; i<m_sInitFT.dwBuff;++i)
281 aucBuff[i]= (aucBuff[i]&m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
289 aucBuff[i++] = (aucBuff[i] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
290 aucBuff[i] = (aucBuff[i] & m_ucMask) | m_ucConfigWriteBit;
292 aucBuff[90] = (aucBuff[90] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
293 aucBuff[91] = (aucBuff[91] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
294 for (DWORD i = 0; i<10; ++i)
296 aucBuff[2*i + 92] = (aucBuff[2*i + 92] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
297 aucBuff[2*i + 1 + 92] = (aucBuff[2*i + 1 + 92] & m_ucMask) | m_ucDefault;
299 aucBuff[112] = (aucBuff[112] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
300 aucBuff[113] = (aucBuff[113] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
302 for (DWORD i= 0; i<16; ++i)
304 value = (m_usConfigWord & (1 << (15-i)))?m_ucConfigWriteBit:0;
305 aucBuff[3*i+114] = (aucBuff[3*i+114] & m_ucMask) | m_ucDefault | value;
306 aucBuff[3*i+1+114] = (aucBuff[3*i+1+114] & m_ucMask) | value;
307 aucBuff[3*i+2+114] = (aucBuff[3*i+2+114] & m_ucMask) | m_ucDefault | value;
312 }
else if (m_eState == eInactivateState)
314 m_ucBitOutput = m_sInitFT.ucBitOutput;
315 m_eConfigState = eConfigDone;
317 for (DWORD i= 0; i<m_sInitFT.dwBuff;++i)
318 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucDefault;
319 EnterCriticalSection(&m_hStateSafe);
320 m_eState = eInactive;
322 LeaveCriticalSection(&m_hStateSafe);
323 }
else if (m_eState == eActive)
325 m_dTimeTemp = g_cTimer.
Seconds();
329 if (m_eState == eActivateState)
331 if (m_eConfigState == eConfigStart)
333 for (
int i = 0; i<90; ++i)
334 aucBuff[i] = (aucBuff[i] & m_ucMask) | m_ucDefault | m_ucConfigWriteBit;
335 m_eConfigState = eConfigTO;
336 }
else if (m_eConfigState == eConfigDone)
338 for (DWORD i= 0; i < m_sInitFT.dwBuff;++i)
340 aucBuff[i++] = (aucBuff[i] & m_ucMask) | m_ucDefault;
341 aucBuff[i] = aucBuff[i] & m_ucMask;
343 aucBuff[m_sInitFT.dwBuff-1] = (aucBuff[m_sInitFT.dwBuff-1] & m_ucMask) | m_ucDefault;
348 if (m_eState == eActivateState)
350 switch (m_eConfigState)
354 if (m_dwRestartE <= GetTickCount())
356 if (!m_sInit.bConfigureADC)
357 m_eConfigState = eConfigDone;
359 m_eConfigState = eConfigWrite;
365 unsigned short usConfigWord = 0;
366 unsigned char * aucRx = (
unsigned char *)m_pcMemRing->GetIndexMemoryUnsafe(*(
int *)pHead);
367 for (
char i = 0; i < 16; ++i)
368 if (aucRx[3*i + 116] & m_ucConfigReadBit)
369 usConfigWord |= 1 << (15 - i);
370 if (usConfigWord != m_usConfigWord)
371 m_eConfigState = eConfigStart;
373 m_eConfigState = eConfigDone;
379 m_ucBitOutput = m_sInitFT.ucBitOutput;
380 m_cDataOffset = m_ucNBytes * (m_cBuffSize / m_ucNBytes - 1);
384 m_dwStartRead = GetTickCount();
385 EnterCriticalSection(&m_hStateSafe);
387 LeaveCriticalSection(&m_hStateSafe);
391 }
else if (m_eState == eActive)
394 sTimed.nIdx = *(
int *)pHead;
395 sTimed.dTime = m_dTimeTemp;
396 sTimed.pHead = m_pcMemRing->GetIndexMemory(sTimed.nIdx);
406 EStateFTDI CADCPeriph::GetState()
408 EnterCriticalSection(&m_hStateSafe);
409 EStateFTDI eState= m_eState;
410 LeaveCriticalSection(&m_hStateSafe);
419 if (!pHead || dwSize !=
sizeof(
SBaseIn) || ((
SBaseIn*)pHead)->eType != eTrigger ||
420 ((
SBaseIn*)pHead)->dwSize != dwSize)
425 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
429 ((
SBaseIn*)sData.pHead)->eType= eResponse;
430 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
431 ((
SBaseIn*)sData.pHead)->nError= INVALID_COMMAND;
432 m_pcComm->SendData(&sData, llId);
438 EnterCriticalSection(&m_hStateSafe);
441 if (m_eState == eActive || m_eState == eActivateState)
446 nError= ALREADY_OPEN;
448 nError= INACTIVE_DEVICE;
449 LeaveCriticalSection(&m_hStateSafe);
456 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
460 ((
SBaseIn*)sData.pHead)->eType= eResponse;
461 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
462 ((
SBaseIn*)sData.pHead)->nError= nError;
463 m_pcComm->SendData(&sData, llId);
468 DWORD CADCPeriph::ThreadProc()
470 HANDLE ahEvents[]= {m_hThreadClose, m_hProcessData, m_hReset};
471 bool bDone=
false, bNotEmpty;
472 DWORD dwStart, dwMid, dwEnd;
473 DWORD dwInitialRead= 0;
478 dwStart= GetTickCount();
479 switch (WaitForMultipleObjects(3, ahEvents, FALSE, INFINITE))
484 case WAIT_OBJECT_0 + 1:
485 psRead = m_apsReadIdx.Front(
true, bNotEmpty);
486 if (psRead && bNotEmpty)
488 dwInitialRead= m_psDataHeader->dwCount1+m_psDataHeader->dwCount2;
490 dwMid= GetTickCount();
492 dwEnd= GetTickCount();
493 m_dwAmountRead += m_psDataHeader->dwCount1+m_psDataHeader->dwCount2;
494 m_fTimeWorked= (float)((
double)(dwEnd-dwMid)/(dwEnd-dwStart));
498 m_pcMemRing->ReleaseIndex(psRead->nIdx);
501 m_apsReadIdx.ResetIfEmpty();
503 case WAIT_OBJECT_0 + 2:
504 m_psDataHeader->dwCount1= 0;
505 m_psDataHeader->dwCount2= 0;
509 m_psDataHeader->ucError= 0;
510 m_psDataHeader->sDataBase.nError= 0;
516 ResetEvent(m_hReset);
526 void CADCPeriph::ExtractData(
STimedRead *psRead)
530 unsigned char* rx = (
unsigned char *)psRead->pHead;
531 m_psDataHeader->dStartTime = psRead->dTime;
532 EnterCriticalSection(&m_hStateSafe);
533 __int64 llId = m_llId;
534 LeaveCriticalSection(&m_hStateSafe);
536 m_psDataHeader->dwChan1S = m_psDataHeader->dwCount1;
537 m_psDataHeader->dwChan2S = m_psDataHeader->dwCount2;
538 unsigned char ucTemp1, ucTemp2;
541 for (DWORD i= 0; i<=m_sInitFT.dwBuff-1;++i)
545 if (!(rx[i]&1<<m_sInit.ucClk) && (
unsigned char)(rx[i]&~(m_ucMask|m_ucConfigWriteBit)) == (
unsigned char)(~rx[i+1]&~(m_ucMask|m_ucConfigWriteBit))
546 && (rx[i] & m_ucConfigWriteBit) == (rx[i+1] & m_ucConfigWriteBit))
554 memset(m_aucBuff+m_cDataOffset, 0, m_ucNBytes);
556 *(
unsigned short*)(m_aucBuff+m_aucGroups[0]+m_cDataOffset) = m_aucDecoded[0][rx[i]];
560 ucTemp1 = rx[i]&~m_ucMask;
561 ucTemp2 = rx[i+1]&~m_ucMask;
563 if ((ucTemp1&~(1<<m_sInit.ucClk)) == (ucTemp2&~(1<<m_sInit.ucClk)) || ucTemp1&(1<<m_sInit.ucClk))
566 if (!m_dwDataCount || ucTemp1 != (
unsigned char)((~ucTemp2)&(~m_ucMask)))
572 *(
unsigned short*)(m_aucBuff+m_aucGroups[m_dwDataCount] + m_cDataOffset) |= m_aucDecoded[m_dwDataCount][rx[i]];
575 if (m_dwDataCount == m_ucNGroups)
578 m_cDataOffset -= m_ucNBytes;
580 #pragma NOTE("m_aucBuff only works on little endian systems.") 581 const char cADCSize = m_sInit.ucBitsPerData/8 + 1;
582 unsigned char ucStatusReg;
584 if (m_cDataOffset == -m_ucNBytes)
586 m_cDataOffset = m_ucNBytes * (m_cBuffSize / m_ucNBytes - 1);
587 for (
char j = m_cBuffSize/cADCSize - 1; j >= 0; --j)
590 if (m_psDataHeader->dwCount1 == m_sInit.dwDataPerTrans || m_psDataHeader->dwCount2 == m_sInit.dwDataPerTrans)
592 m_psDataHeader->sDataBase.nError = m_usBadRead | (m_usOverflow<<16);
593 m_psDataHeader->dwPos= m_dwPos++;
594 m_dwAmountRead += m_psDataHeader->dwCount1+m_psDataHeader->dwCount2;
596 m_psDataHeader->fSpaceFull = (float)((m_psDataHeader->dwCount1 + m_psDataHeader->dwCount2) * cADCSize * 8 / (double)((m_sInit.ucDataBits + 2) * m_dwSpaceUsed));
598 m_psDataHeader->fSpaceFull = 0.0;
600 m_psDataHeader->fTimeWorked = m_fTimeWorked;
601 m_psDataHeader->fDataRate = (float)((m_psDataHeader->dwCount1 + m_psDataHeader->dwCount2) / (double)(GetTickCount() - m_dwStartRead) * 1000);
602 m_psDataHeader->fDataRate /= ((m_sInit.bChan1 && m_sInit.bChan2)?2:1);
603 m_dwStartRead = GetTickCount();
604 m_sData.pHead = m_psDataHeader;
605 m_pcComm->SendData(&m_sData, llId);
606 m_psDataHeader = (
SADCData*) m_pcMemPool->PoolAcquire(
sizeof(
SADCData)+
sizeof(DWORD)*m_sInit.dwDataPerTrans*((m_sInit.bChan1 && m_sInit.bChan2)?2:1));
612 m_psDataHeader->dwChan2Start = m_sInit.bChan1?m_sInit.dwDataPerTrans:0;
613 m_psDataHeader->dwCount1 = 0;
614 m_psDataHeader->dwCount2 = 0;
615 m_psDataHeader->sDataBase.dwSize =
sizeof(
SADCData)+
sizeof(DWORD)*m_sInit.dwDataPerTrans*((m_sInit.bChan1 && m_sInit.bChan2)?2:1);
616 m_psDataHeader->sDataBase.eType = eTrigger;
617 m_psDataHeader->sDataBase.nChan = m_sInitFT.nChan;
618 m_psDataHeader->sBase.dwSize =
sizeof(
SADCData)+
sizeof(DWORD)*m_sInit.dwDataPerTrans*((m_sInit.bChan1 && m_sInit.bChan2)?2:1)-
sizeof(
SBaseIn);
619 m_psDataHeader->sBase.eType = eADCData;
620 m_psDataHeader->dStartTime = 0;
621 m_psDataHeader->dwChan1S = 0;
622 m_psDataHeader->dwChan2S = 0;
623 m_adwData = (DWORD*)((
unsigned char*)m_psDataHeader+
sizeof(
SADCData));
624 memset(m_adwData, 0,
sizeof(DWORD)*m_sInit.dwDataPerTrans*((m_sInit.bChan1 && m_sInit.bChan2)?2:1));
625 m_psDataHeader->ucError = 0;
626 m_psDataHeader->sDataBase.nError = 0;
630 ucStatusReg = m_aucBuff[j * cADCSize + cADCSize - 1];
631 m_bSecond = (ucStatusReg & 0x40) != 0;
632 if (ucStatusReg & 0x80)
635 memcpy(&dwDataPoint, m_aucBuff + j * cADCSize, cADCSize - 1);
636 if (ucStatusReg & 0x20 || !(ucStatusReg & 0x08))
641 m_psDataHeader->ucError |= (ucStatusReg & 0x05) << (m_bSecond?4:0);
645 m_adwData[m_psDataHeader->dwChan2Start + m_psDataHeader->dwCount2++] = dwDataPoint;
654 m_adwData[m_psDataHeader->dwCount1++]= dwDataPoint;
bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
DWORD GetInfo(void *pHead, DWORD dwSize)