2 #include "ftdi device.h" 12 int &nError, HANDLE hNewData,
CTimer* pcTimer) :
CPeriphFTDI(MULTI_W_P, sInitFT), m_sInit(sValveInit),
13 m_abData(sValveInit.dwBoards*8, false), m_ucDefault(1<<sValveInit.ucLatch), m_ucMask(~(1<<sValveInit.ucLatch|
14 1<<sValveInit.ucClk|1<<sValveInit.ucData)), m_allIds(hNewData)
20 InitializeCriticalSection(&m_hDataSafe);
23 if (!pcComm || sInitFT.dwMinSizeW < (sValveInit.dwBoards*8*2+2)*sValveInit.dwClkPerData ||
24 sInitFT.dwBuff < sInitFT.dwMinSizeW || !sValveInit.dwClkPerData || !sValveInit.dwBoards || !pcTimer ||
27 nError= BAD_INPUT_PARAMS;
36 m_eState= eInactivateState;
48 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
49 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_sInitFT.nChan;
50 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
51 ((
SBaseOut*)pHead)->bActive= GetState() == eActive;
52 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE,
m_csName.c_str(), _TRUNCATE);
53 pHead= (
char*)pHead+
sizeof(
SBaseOut);
56 ((
SBase*)pHead)->eType= eFTDIPeriphInit;
57 pHead= (
char*)pHead+
sizeof(
SBase);
62 ((
SBase*)pHead)->eType= eFTDIMultiWriteInit;
63 pHead= (
char*)pHead+
sizeof(
SBase);
69 CMultiWPeriph::~CMultiWPeriph()
71 DeleteCriticalSection(&m_hDataSafe);
79 unsigned char *aucBuff= (
unsigned char *)pHead;
82 if (eReason == eActivateState || eReason == eInactivateState)
84 EnterCriticalSection(&m_hDataSafe);
85 m_eState= eReason == eActivateState?eActive:eInactivateState;
86 LeaveCriticalSection(&m_hDataSafe);
87 }
else if (eReason == eRecover)
89 EnterCriticalSection(&m_hDataSafe);
90 if (m_eState == eActive || m_eState == eInactivateState)
95 LeaveCriticalSection(&m_hDataSafe);
98 if (m_eState == eInactivateState && eReason == ePreWrite)
100 EnterCriticalSection(&m_hDataSafe);
103 LeaveCriticalSection(&m_hDataSafe);
111 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
114 ((
SBaseIn*)sData.pHead)->eType= eResponse;
115 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
116 ((
SBaseIn*)sData.pHead)->nError= DEVICE_CLOSING;
124 for (DWORD i= 0; i<m_sInitFT.dwBuff;++i)
125 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucDefault;
126 }
else if (m_eState == eActive && eReason == ePreWrite)
128 EnterCriticalSection(&m_hDataSafe);
133 for (;i<m_sInit.dwBoards*8*2*m_sInit.dwClkPerData;)
137 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
138 aucBuff[i++]= (aucBuff[i]&m_ucMask)|(m_abData[(m_sInit.dwBoards-1-k/8)*8+k%8]?1<<m_sInit.ucData:0)|1<<m_sInit.ucClk;
139 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
140 aucBuff[i++]= (aucBuff[i]&m_ucMask)|(m_abData[(m_sInit.dwBoards-1-k/8)*8+k%8]?1<<m_sInit.ucData:0);
143 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
144 aucBuff[i]= aucBuff[i++]&m_ucMask;
145 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
146 aucBuff[i]= (aucBuff[i++]&m_ucMask)|1<<m_sInit.ucLatch;
149 m_nProcessed= m_allIds.
GetSize();
150 m_dInitial= g_cTimer.
Seconds();
153 LeaveCriticalSection(&m_hDataSafe);
154 }
else if (m_eState == eActive && eReason == ePostWrite)
158 for (
int i= 0; i<m_nProcessed; ++i)
163 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseOut));
166 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
167 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
168 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
170 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
175 for (DWORD i= 0; i<(m_sInit.dwBoards*8*2+2)*m_sInit.dwClkPerData;++i)
176 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucDefault;
183 EStateFTDI CMultiWPeriph::GetState()
185 EnterCriticalSection(&m_hDataSafe);
186 EStateFTDI eState= m_eState;
187 LeaveCriticalSection(&m_hDataSafe);
196 || ((
SBase*)((
char*)pHead+
sizeof(
SBaseIn)))->eType != eFTDIMultiWriteData ||
202 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
206 ((
SBaseIn*)sData.pHead)->eType= eResponse;
207 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
208 ((
SBaseIn*)sData.pHead)->nError= INVALID_COMMAND;
216 EnterCriticalSection(&m_hDataSafe);
217 if (m_eState == eActive)
221 if (asValveData[i].usIndex<m_abData.size())
222 m_abData[asValveData[i].usIndex]= asValveData[i].bValue;
224 nError= BAD_INPUT_PARAMS;
233 nError= INACTIVE_DEVICE;
234 LeaveCriticalSection(&m_hDataSafe);
241 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
245 ((
SBaseIn*)sData.pHead)->eType= eResponse;
246 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
247 ((
SBaseIn*)sData.pHead)->nError= nError;
256 int &nError, HANDLE hNewData,
CTimer* pcTimer) :
CPeriphFTDI(MULTI_R_P, sInitFT), m_sInit(sValveInit),
257 m_ucDefault(1<<sValveInit.ucLatch|1<<sValveInit.ucClk), m_ucMask(~(1<<sValveInit.ucLatch|
258 1<<sValveInit.ucClk|1<<sValveInit.ucData))
263 InitializeCriticalSection(&m_hDataSafe);
266 if (!pcComm || sInitFT.dwMinSizeW < (sValveInit.dwBoards*8*2+2+4)*sValveInit.dwClkPerData ||
267 m_sInitFT.dwBuff < sInitFT.dwMinSizeW || sInitFT.dwMinSizeW != sInitFT.dwMinSizeR ||
268 !sValveInit.dwClkPerData || !sValveInit.dwBoards || !pcTimer || !hNewData)
270 nError= BAD_INPUT_PARAMS;
278 m_eState= eInactivateState;
290 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
291 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_sInitFT.nChan;
292 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
293 ((
SBaseOut*)pHead)->bActive= GetState() == eActive;
294 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE,
m_csName.c_str(), _TRUNCATE);
295 pHead= (
char*)pHead+
sizeof(
SBaseOut);
298 ((
SBase*)pHead)->eType= eFTDIPeriphInit;
299 pHead= (
char*)pHead+
sizeof(
SBase);
304 ((
SBase*)pHead)->eType= eFTDIMultiReadInit;
305 pHead= (
char*)pHead+
sizeof(
SBase);
311 CMultiRPeriph::~CMultiRPeriph()
313 DeleteCriticalSection(&m_hDataSafe);
321 unsigned char *aucBuff= (
unsigned char *)pHead;
323 if (eReason == eActivateState || eReason == eInactivateState)
325 EnterCriticalSection(&m_hDataSafe);
326 m_eState= eReason == eActivateState?eActive:eInactivateState;
327 LeaveCriticalSection(&m_hDataSafe);
330 if (m_eState == eInactivateState && eReason == ePreWrite)
332 EnterCriticalSection(&m_hDataSafe);
334 for (
int i= 0; i<m_allIds.size(); ++i)
339 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
342 ((
SBaseIn*)sData.pHead)->eType= eResponse;
343 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
344 ((
SBaseIn*)sData.pHead)->nError= DEVICE_CLOSING;
346 m_pcComm->
SendData(&sData, m_allIds[i]);
350 LeaveCriticalSection(&m_hDataSafe);
355 for (DWORD i= 0; i<m_sInitFT.dwBuff;++i)
356 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucDefault;
357 }
else if (m_eState == eActive && eReason == ePreWrite)
359 EnterCriticalSection(&m_hDataSafe);
360 m_nProcessed= (int)m_allIds.size();
361 LeaveCriticalSection(&m_hDataSafe);
366 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
367 aucBuff[i++]= (aucBuff[i]&m_ucMask)|1<<m_sInit.ucClk;
368 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
369 aucBuff[i++]= (aucBuff[i]&m_ucMask)|(1<<m_sInit.ucLatch|1<<m_sInit.ucClk);
370 for (;i<(4+m_sInit.dwBoards*8*2)*m_sInit.dwClkPerData;)
372 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
373 aucBuff[i++]= (aucBuff[i]&m_ucMask)|1<<m_sInit.ucLatch;
374 for (DWORD j= 0; j<m_sInit.dwClkPerData; ++j)
375 aucBuff[i++]= (aucBuff[i]&m_ucMask)|(1<<m_sInit.ucLatch|1<<m_sInit.ucClk);
379 m_dInitial= g_cTimer.
Seconds();
381 }
else if (m_eState == eActive && eReason == ePostWrite)
387 for (
int i= 0; i<m_nProcessed; ++i)
392 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseOut));
395 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
396 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
397 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
399 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
400 EnterCriticalSection(&m_hDataSafe);
401 m_pcComm->
SendData(&sData, m_allIds[i]);
402 LeaveCriticalSection(&m_hDataSafe);
406 EnterCriticalSection(&m_hDataSafe);
407 if (!m_sInit.bContinuous)
408 m_allIds.erase(m_allIds.begin(), m_allIds.begin() + m_nProcessed);
409 if (!m_allIds.size())
411 LeaveCriticalSection(&m_hDataSafe);
414 for (DWORD i= 0; i<(m_sInit.dwBoards*8*2+2+4)*m_sInit.dwClkPerData;++i)
415 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucDefault;
417 }
else if (m_eState == eActive && eReason == ePostRead)
422 for (
int j= 0; j<m_nProcessed; ++j)
425 sData.dwSize=
sizeof(
SBaseOut)+
sizeof(
SBase)+
sizeof(bool)*m_sInit.dwBoards*8;
427 sData.pHead= m_pcMemPool->PoolAcquire(sData.dwSize);
430 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
431 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
432 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
433 ((
SBaseOut*)sData.pHead)->sBaseIn.dwSize= sData.dwSize;
434 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
435 ((
SBase*)((
char*)sData.pHead+
sizeof(
SBaseOut)))->eType= eFTDIMultiReadData;
436 ((
SBase*)((
char*)sData.pHead+
sizeof(
SBaseOut)))->dwSize=
sizeof(
SBase)+
sizeof(bool)*m_sInit.dwBoards*8;
437 bool* bVal= (
bool*)((
char*)sData.pHead+
sizeof(
SBaseOut)+
sizeof(
SBase));
438 for (DWORD i= 0; i<m_sInit.dwBoards*8; ++i)
439 bVal[i]= (aucBuff[(3+i*2)*m_sInit.dwClkPerData]&1<<m_sInit.ucData) != 0;
440 EnterCriticalSection(&m_hDataSafe);
441 if (m_pcComm->
SendData(&sData, m_allIds[j]))
443 LeaveCriticalSection(&m_hDataSafe);
447 EnterCriticalSection(&m_hDataSafe);
448 if (!m_sInit.bContinuous)
449 m_allIds.erase(m_allIds.begin(), m_allIds.begin() + m_nProcessed);
451 while (k < m_allIds.size())
453 if (m_allIds[k] == -1)
454 m_allIds.erase(m_allIds.begin() + k);
458 if (!m_allIds.size())
460 LeaveCriticalSection(&m_hDataSafe);
467 EStateFTDI CMultiRPeriph::GetState()
469 EnterCriticalSection(&m_hDataSafe);
470 EStateFTDI eState= m_eState;
471 LeaveCriticalSection(&m_hDataSafe);
480 if (!pHead || dwSize !=
sizeof(
SBaseIn) || (((
SBaseIn*)pHead)->eType != eTrigger &&
481 ((
SBaseIn*)pHead)->eType != eCancelReadRequest) || ((
SBaseIn*)pHead)->dwSize != dwSize)
486 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
490 ((
SBaseIn*)sData.pHead)->eType= eResponse;
491 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
492 ((
SBaseIn*)sData.pHead)->nError= INVALID_COMMAND;
499 EQueryType eResp = eResponse;
500 if (((
SBaseIn*)pHead)->eType == eTrigger)
503 EnterCriticalSection(&m_hDataSafe);
504 if (m_eState == eActive)
506 for (k = 0; k < m_allIds.size(); ++k)
507 if (m_allIds[k] == llId)
509 if (!m_sInit.bContinuous || k == m_allIds.size())
511 m_allIds.push_back(llId);
514 nError = ALREADY_OPEN;
516 nError= INACTIVE_DEVICE;
517 LeaveCriticalSection(&m_hDataSafe);
520 EnterCriticalSection(&m_hDataSafe);
521 for (
int k = 0; k < m_allIds.size(); ++k)
523 if (m_allIds[k] == llId)
529 LeaveCriticalSection(&m_hDataSafe);
530 eResp = eCancelReadRequest;
533 if (nError || eResp != eResponse)
538 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
542 ((
SBaseIn*)sData.pHead)->eType= eResp;
543 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
544 ((
SBaseIn*)sData.pHead)->nError= nError;
553 int &nError, HANDLE hNewData,
CTimer* pcTimer) :
CPeriphFTDI(PIN_W_P, sInitFT), m_sInit(sPinInit),
560 InitializeCriticalSection(&m_hDataSafe);
563 if (!pcComm || sInitFT.dwMinSizeW < sPinInit.
usBytesUsed || m_sInitFT.dwBuff < sInitFT.dwMinSizeW
566 nError= BAD_INPUT_PARAMS;
575 m_eState= eInactivateState;
587 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
588 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_sInitFT.nChan;
589 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
590 ((
SBaseOut*)pHead)->bActive= GetState() == eActive;
591 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE,
m_csName.c_str(), _TRUNCATE);
592 pHead= (
char*)pHead+
sizeof(
SBaseOut);
595 ((
SBase*)pHead)->eType= eFTDIPeriphInit;
596 pHead= (
char*)pHead+
sizeof(
SBase);
601 ((
SBase*)pHead)->eType= eFTDIPinWriteInit;
602 pHead= (
char*)pHead+
sizeof(
SBase);
603 memcpy(pHead, &m_sInit,
sizeof(
SPinInit));
608 CPinWPeriph::~CPinWPeriph()
610 DeleteCriticalSection(&m_hDataSafe);
618 unsigned char *aucBuff= (
unsigned char *)pHead;
621 if (eReason == eActivateState || eReason == eInactivateState)
623 EnterCriticalSection(&m_hDataSafe);
624 m_eState= eReason == eActivateState?eActive:eInactivateState;
625 LeaveCriticalSection(&m_hDataSafe);
626 }
else if (eReason == eRecover)
628 EnterCriticalSection(&m_hDataSafe);
629 if (m_eState == eActive || m_eState == eInactivateState)
634 LeaveCriticalSection(&m_hDataSafe);
637 if (m_eState == eInactivateState && eReason == ePreWrite)
639 EnterCriticalSection(&m_hDataSafe);
642 LeaveCriticalSection(&m_hDataSafe);
650 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
653 ((
SBaseIn*)sData.pHead)->eType= eResponse;
654 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
655 ((
SBaseIn*)sData.pHead)->nError= DEVICE_CLOSING;
663 for (DWORD i= 0; i<m_sInitFT.dwBuff;++i)
664 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucLast;
665 }
else if (m_eState == eActive && eReason == ePreWrite)
667 EnterCriticalSection(&m_hDataSafe);
671 m_ucLast= m_aucData[m_sInit.usBytesUsed-1];
672 for (; i<m_sInit.usBytesUsed; ++i)
674 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_aucData[i];
675 m_aucData[i]= m_ucLast;
677 for (; i<m_sInitFT.dwBuff; ++i)
678 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucLast;
681 m_nProcessed= m_allIds.
GetSize();
682 m_dInitial= g_cTimer.
Seconds();
685 LeaveCriticalSection(&m_hDataSafe);
686 }
else if (m_eState == eActive && eReason == ePostWrite)
689 for (
unsigned short i= 0; i<m_sInit.usBytesUsed;++i)
690 aucBuff[i]= (aucBuff[i]&m_ucMask)|m_ucLast;
691 }
else if (m_eState == eActive && eReason == ePostRead)
695 for (
int i= 0; i<m_nProcessed; ++i)
700 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseOut));
703 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
704 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
705 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
707 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
718 EStateFTDI CPinWPeriph::GetState()
720 EnterCriticalSection(&m_hDataSafe);
721 EStateFTDI eState= m_eState;
722 LeaveCriticalSection(&m_hDataSafe);
730 if (!pHead || dwSize <
sizeof(
SBaseIn) +
sizeof(
SBase) || ((
SBaseIn*)pHead)->dwSize != dwSize || ((
SBaseIn*)pHead)->eType != eData ||
731 (!(((
SBase*)((
char*)pHead+
sizeof(
SBaseIn)))->eType == eFTDIPinWDataArray && dwSize >
sizeof(
SBaseIn) +
sizeof(
SBase) &&
738 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
742 ((
SBaseIn*)sData.pHead)->eType= eResponse;
743 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
744 ((
SBaseIn*)sData.pHead)->nError= INVALID_COMMAND;
751 unsigned char* aucData= NULL;
754 unsigned char ucPinSelect;
756 if (((
SBaseIn*)((
char*)pHead+
sizeof(
SBaseIn)))->eType == eFTDIPinWDataArray)
761 for (
int i= 0; i<nLen; ++i)
762 nSum += asPinData[i].usRepeat;
763 if (nSum>m_sInit.usBytesUsed)
764 nError= BAD_INPUT_PARAMS;
770 sPinData.ucPinSelect= sPinData.ucPinSelect&(~m_ucMask);
771 ucPinSelect= ~sPinData.ucPinSelect;
772 if (nLen>m_sInit.usBytesUsed)
773 nError= BAD_INPUT_PARAMS;
777 EnterCriticalSection(&m_hDataSafe);
778 if (m_eState == eActive)
780 if (((
SBaseIn*)((
char*)pHead+
sizeof(
SBaseIn)))->eType == eFTDIPinWDataArray)
787 asPinData[i].ucPinSelect= asPinData[i].ucPinSelect&(~m_ucMask);
788 ucPinSelect= ~asPinData[i].ucPinSelect;
789 ucVal= asPinData[i].ucValue&asPinData[i].ucPinSelect;
791 for (; k < kTemp+asPinData[i].usRepeat; ++k)
792 m_aucData[k]= (m_aucData[k]&ucPinSelect)|ucVal;
794 for (;k<m_sInit.usBytesUsed; ++k)
795 m_aucData[k]= (m_aucData[k]&ucPinSelect)|ucVal;
800 m_aucData[i]= (m_aucData[i]&ucPinSelect)|(aucData[i]&sPinData.ucPinSelect);
801 const unsigned char ucVal= aucData[i-1]&sPinData.ucPinSelect;
802 for (;i<m_sInit.usBytesUsed; ++i)
803 m_aucData[i]= (m_aucData[i]&ucPinSelect)|ucVal;
809 nError= INACTIVE_DEVICE;
810 LeaveCriticalSection(&m_hDataSafe);
818 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
822 ((
SBaseIn*)sData.pHead)->eType= eResponse;
823 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
824 ((
SBaseIn*)sData.pHead)->nError= nError;
833 int &nError, HANDLE hNewData,
CTimer* pcTimer) :
CPeriphFTDI(PIN_R_P, sInitFT), m_sInit(sPinInit),
839 InitializeCriticalSection(&m_hDataSafe);
842 if (!pcComm || sInitFT.dwMinSizeW < sPinInit.
usBytesUsed ||
843 sInitFT.dwBuff < sInitFT.dwMinSizeW || sInitFT.dwMinSizeW != sInitFT.dwMinSizeR ||
846 nError= BAD_INPUT_PARAMS;
854 m_eState= eInactivateState;
866 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
867 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_sInitFT.nChan;
868 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
869 ((
SBaseOut*)pHead)->bActive= GetState() == eActive;
870 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE,
m_csName.c_str(), _TRUNCATE);
871 pHead= (
char*)pHead+
sizeof(
SBaseOut);
874 ((
SBase*)pHead)->eType= eFTDIPeriphInit;
875 pHead= (
char*)pHead+
sizeof(
SBase);
880 ((
SBase*)pHead)->eType= eFTDIPinReadInit;
881 pHead= (
char*)pHead+
sizeof(
SBase);
882 memcpy(pHead, &m_sInit,
sizeof(
SPinInit));
887 CPinRPeriph::~CPinRPeriph()
889 DeleteCriticalSection(&m_hDataSafe);
897 unsigned char *aucBuff= (
unsigned char *)pHead;
899 if (eReason == eActivateState || eReason == eInactivateState)
901 EnterCriticalSection(&m_hDataSafe);
902 m_eState= eReason == eActivateState?eActive:eInactivateState;
903 LeaveCriticalSection(&m_hDataSafe);
906 if (m_eState == eInactivateState && eReason == ePreWrite)
908 EnterCriticalSection(&m_hDataSafe);
910 for (
int i= 0; i<m_allIds.size(); ++i)
915 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
918 ((
SBaseIn*)sData.pHead)->eType= eResponse;
919 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
920 ((
SBaseIn*)sData.pHead)->nError= DEVICE_CLOSING;
922 m_pcComm->
SendData(&sData, m_allIds[i]);
926 LeaveCriticalSection(&m_hDataSafe);
932 }
else if (m_eState == eActive && eReason == ePreWrite)
934 EnterCriticalSection(&m_hDataSafe);
935 m_nProcessed= (int)m_allIds.size();
936 LeaveCriticalSection(&m_hDataSafe);
940 m_dInitial= g_cTimer.
Seconds();
942 }
else if (m_eState == eActive && eReason == ePostWrite)
948 for (
int i= 0; i<m_nProcessed; ++i)
953 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseOut));
956 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
957 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
958 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
960 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
961 EnterCriticalSection(&m_hDataSafe);
962 m_pcComm->
SendData(&sData, m_allIds[i]);
963 LeaveCriticalSection(&m_hDataSafe);
967 EnterCriticalSection(&m_hDataSafe);
968 if (!m_sInit.bContinuous)
969 m_allIds.erase(m_allIds.begin(), m_allIds.begin() + m_nProcessed);
970 if (!m_allIds.size())
972 LeaveCriticalSection(&m_hDataSafe);
976 }
else if (m_eState == eActive && eReason == ePostRead)
981 for (
int j= 0; j<m_nProcessed; ++j)
984 sData.dwSize=
sizeof(
SBaseOut)+
sizeof(
SBase)+
sizeof(
unsigned char)*m_sInit.usBytesUsed;
986 sData.pHead= m_pcMemPool->PoolAcquire(sData.dwSize);
989 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
990 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_sInitFT.nChan;
991 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= nError;
992 ((
SBaseOut*)sData.pHead)->sBaseIn.dwSize= sData.dwSize;
993 ((
SBaseOut*)sData.pHead)->dDouble= m_dInitial;
994 ((
SBase*)((
unsigned char*)sData.pHead+
sizeof(
SBaseOut)))->eType= eFTDIPinRDataArray;
995 ((
SBase*)((
unsigned char*)sData.pHead+
sizeof(
SBaseOut)))->dwSize=
sizeof(
SBase)+
sizeof(
unsigned char)*m_sInit.usBytesUsed;
996 unsigned char* ucVal= (
unsigned char*)sData.pHead+
sizeof(
SBaseOut)+
sizeof(
SBase);
997 for (
unsigned short i= 0; i<m_sInit.usBytesUsed; ++i)
998 ucVal[i]= aucBuff[i]&~m_ucMask;
999 EnterCriticalSection(&m_hDataSafe);
1000 if (m_pcComm->
SendData(&sData, m_allIds[j]))
1002 LeaveCriticalSection(&m_hDataSafe);
1006 EnterCriticalSection(&m_hDataSafe);
1007 if (!m_sInit.bContinuous)
1008 m_allIds.erase(m_allIds.begin(), m_allIds.begin() + m_nProcessed);
1010 while (k < m_allIds.size())
1012 if (m_allIds[k] == -1)
1013 m_allIds.erase(m_allIds.begin() + k);
1017 if (!m_allIds.size())
1018 ResetEvent(m_hNext);
1019 LeaveCriticalSection(&m_hDataSafe);
1026 EStateFTDI CPinRPeriph::GetState()
1028 EnterCriticalSection(&m_hDataSafe);
1029 EStateFTDI eState= m_eState;
1030 LeaveCriticalSection(&m_hDataSafe);
1039 if (!pHead || dwSize !=
sizeof(
SBaseIn) || (((
SBaseIn*)pHead)->eType != eTrigger &&
1040 ((
SBaseIn*)pHead)->eType != eCancelReadRequest) || ((
SBaseIn*)pHead)->dwSize != dwSize)
1043 sData.dwSize=
sizeof(
SBaseIn);
1044 sData.pDevice=
this;
1045 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
1049 ((
SBaseIn*)sData.pHead)->eType= eResponse;
1050 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
1051 ((
SBaseIn*)sData.pHead)->nError= INVALID_COMMAND;
1058 EQueryType eResp = eResponse;
1059 if (((
SBaseIn*)pHead)->eType == eTrigger)
1062 EnterCriticalSection(&m_hDataSafe);
1063 if (m_eState == eActive)
1065 for (k = 0; k < m_allIds.size(); ++k)
1066 if (m_allIds[k] == llId)
1068 if (!m_sInit.bContinuous || k == m_allIds.size())
1070 m_allIds.push_back(llId);
1073 nError = ALREADY_OPEN;
1075 nError= INACTIVE_DEVICE;
1076 LeaveCriticalSection(&m_hDataSafe);
1079 EnterCriticalSection(&m_hDataSafe);
1080 for (
int k = 0; k < m_allIds.size(); ++k)
1082 if (m_allIds[k] == llId)
1088 LeaveCriticalSection(&m_hDataSafe);
1089 eResp = eCancelReadRequest;
1092 if (nError || eResp != eResponse)
1095 sData.dwSize=
sizeof(
SBaseIn);
1096 sData.pDevice=
this;
1097 sData.pHead= m_pcMemPool->PoolAcquire(
sizeof(
SBaseIn));
1101 ((
SBaseIn*)sData.pHead)->eType= eResp;
1102 ((
SBaseIn*)sData.pHead)->nChan= m_sInitFT.nChan;
1103 ((
SBaseIn*)sData.pHead)->nError= nError;
DWORD GetInfo(void *pHead, DWORD dwSize)
bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)
bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)
virtual int SendData(const SData *pData, __int64 llId)=0
bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)
unsigned char ucInitialVal
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
DWORD GetInfo(void *pHead, DWORD dwSize)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
unsigned char ucActivePins
DWORD GetInfo(void *pHead, DWORD dwSize)
bool DoWork(void *pHead, DWORD dwSize, FT_HANDLE ftHandle, EStateFTDI eReason, int nError)
CMultiWPeriph(const SValveInit &sValveInit, CComm *pcComm, const SInitPeriphFT &sInitFT, int &nError, HANDLE hNewData, CTimer *pcTimer)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
DWORD GetInfo(void *pHead, DWORD dwSize)
unsigned short usBytesUsed
const std::tstring m_csName
void * GetIndexMemoryUnsafe(int nIdx)
T Front(bool bPop, bool &bValid)
CPeriphFTDI(const TCHAR szName[], const SInitPeriphFT &sInitFT)