12 #include "base classses.h" 13 #include "named pipes.h" 14 #include "rtv device.h" 15 #include "misc tools.h" 17 short (PASCAL *lpf_AngeloRTV_Initial)(
unsigned short PortNo)= NULL;
18 short (PASCAL *lpf_AngeloRTV_Close)(
unsigned short PortNo)= NULL;
19 unsigned short (PASCAL *lpf_AngeloRTV_Read_Serial)(
unsigned short CardNo,
unsigned long* HighByte,
unsigned long* LowByte)= NULL;
20 short (PASCAL *lpf_AngeloRTV_Get_Version)(
unsigned long *DriverVersion,
unsigned long *DLLVersion,
unsigned long *Reserved)= NULL;
21 short (PASCAL *lpf_AngeloRTV_Set_Image_Config)(
unsigned short PortNo,
unsigned char ConfigIndex ,
unsigned char Value)= NULL;
22 short (PASCAL *lpf_AngeloRTV_Set_Color_Format)(
unsigned short PortNo,
unsigned char ColorFormat)= NULL;
23 short (PASCAL *lpf_AngeloRTV_Set_Video_Format)(
unsigned short PortNo,
unsigned char Value)= NULL;
24 short (PASCAL *lpf_AngeloRTV_Capture_Start)(
unsigned short PortNo,
unsigned long CaptureNo)= NULL;
25 short (PASCAL *lpf_AngeloRTV_Capture_Stop)(
unsigned short PortNo)= NULL;
26 short (PASCAL *lpf_AngeloRTV_Select_Channel)(
unsigned short PortNo,
unsigned short Multiplex)= NULL;
27 short (PASCAL *lpf_AngeloRTV_Capture_Config)(
unsigned short PortNo,
unsigned long Start_Field)= NULL;
28 short (PASCAL *lpf_AngeloRTV_Set_Callback)(
unsigned short PortNo, void ( __stdcall *CallBackProc)(
void *VideoBufferaddress ,
unsigned short PortNo))= NULL;
29 short (PASCAL *lpf_AngeloRTV_Get_Int_Status)(
unsigned short PortNo,
unsigned long *IntStatus)= NULL;
33 extern "C" void __stdcall MediaStreamProc(
void* VideoBufferAddress ,
unsigned short PortNo)
36 if (s_pCRTVMan && !lpf_AngeloRTV_Get_Int_Status(PortNo, &dwStatus) && (dwStatus&~0x01) == 0x02)
37 s_pCRTVMan->
NextFrame((
unsigned char*)VideoBufferAddress, PortNo);
41 CManagerRTV::CManagerRTV(
CComm* pcComm,
const TCHAR szPipe[],
int nChan,
int &nError) :
42 CManager(RTV_MAN_STR, std::tstring(szPipe), nChan)
58 if (!pcComm || !szPipe)
60 nError= BAD_INPUT_PARAMS;
63 BOOL bRes= GetProcAddresses(&m_hLib, _T(
"AngeloRTV.dll"), 13, &lpf_AngeloRTV_Initial,
"AngeloRTV_Initial",
64 &lpf_AngeloRTV_Close,
"AngeloRTV_Close", &lpf_AngeloRTV_Read_Serial,
"AngeloRTV_Read_Serial",
65 &lpf_AngeloRTV_Get_Version,
"AngeloRTV_Get_Version", &lpf_AngeloRTV_Set_Image_Config,
"AngeloRTV_Set_Image_Config",
66 &lpf_AngeloRTV_Set_Color_Format,
"AngeloRTV_Set_Color_Format", &lpf_AngeloRTV_Set_Video_Format,
67 "AngeloRTV_Set_Video_Format", &lpf_AngeloRTV_Capture_Start,
"AngeloRTV_Capture_Start", &lpf_AngeloRTV_Capture_Stop,
68 "AngeloRTV_Capture_Stop", &lpf_AngeloRTV_Select_Channel,
"AngeloRTV_Select_Channel", &lpf_AngeloRTV_Capture_Config,
69 "AngeloRTV_Capture_Config", &lpf_AngeloRTV_Set_Callback,
"AngeloRTV_Set_Callback", &lpf_AngeloRTV_Get_Int_Status,
70 "AngeloRTV_Get_Int_Status");
76 DWORD dwDriverVersion[4]= {0};
77 DWORD dwDLLVersion[4]= {0};
78 DWORD dwReserved[4]= {0};
79 if (nError= RTV_ERROR(lpf_AngeloRTV_Get_Version(dwDriverVersion, dwDLLVersion, dwReserved), nError))
81 if (dwDLLVersion[0]*1000+dwDLLVersion[1]*100+dwDLLVersion[2]*10+dwDLLVersion[3] < MIN_RTV_LIB_VER)
87 while (!lpf_AngeloRTV_Initial(i))
92 m_ahCallbackSafe.assign(m_usChans, NULL);
93 m_acRTVDevices.assign(m_usChans, NULL);
94 for (i= 0; i<m_usChans; ++i)
96 m_ahCallbackSafe[i]=
new CRITICAL_SECTION;
97 InitializeCriticalSection(m_ahCallbackSafe[i]);
111 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
112 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_nChan;
113 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
115 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE, m_csName.c_str(), _TRUNCATE);
120 CManagerRTV::~CManagerRTV()
122 for (
size_t i= 0; i<m_usChans; ++i)
123 delete m_acRTVDevices[i];
127 for (
unsigned short i= 0; i<m_usChans; ++i)
129 DeleteCriticalSection(m_ahCallbackSafe[i]);
130 delete m_ahCallbackSafe[i];
147 if (!pHead || dwSize <
sizeof(
SBaseIn) || dwSize != ((
SBaseIn*)pHead)->dwSize)
149 sBase.nError= SIZE_MISSMATCH;
150 }
else if (((
SBaseIn*)pHead)->eType == eQuery && dwSize ==
sizeof(
SBaseIn))
153 if (((
SBaseIn*)pHead)->nChan < 0 || ((
SBaseIn*)pHead)->nChan >= m_acRTVDevices.size() ||
154 !m_acRTVDevices[((
SBaseIn*)pHead)->nChan])
156 sBase.nError= INVALID_CHANN;
160 DWORD dwSizeInfo= m_acRTVDevices[((
SBaseIn*)pHead)->nChan]->GetInfo(NULL, 0);
161 pBase= (
SBaseIn*)m_pcMemPool->PoolAcquire(dwSizeInfo);
164 m_acRTVDevices[((
SBaseIn*)pHead)->nChan]->GetInfo(pBase, dwSizeInfo);
165 sData.dwSize= dwSizeInfo;
167 m_pcComm->SendData(&sData, llId);
170 }
else if (dwSize ==
sizeof(
SBaseIn) && ((
SBaseIn*)pHead)->eType == eDelete)
172 sBase.eType= eDelete;
173 if (((
SBaseIn*)pHead)->nChan < 0 || ((
SBaseIn*)pHead)->nChan >= m_acRTVDevices.size() ||
174 !m_acRTVDevices[((
SBaseIn*)pHead)->nChan])
175 sBase.nError= INVALID_CHANN;
178 EnterCriticalSection(m_ahCallbackSafe[((
SBaseIn*)pHead)->nChan]);
179 delete m_acRTVDevices[((
SBaseIn*)pHead)->nChan];
180 m_acRTVDevices[((
SBaseIn*)pHead)->nChan]= NULL;
181 LeaveCriticalSection(m_ahCallbackSafe[((
SBaseIn*)pHead)->nChan]);
182 sBase.nChan= ((
SBaseIn*)pHead)->nChan;
184 }
else if (dwSize ==
sizeof(
SBaseIn) && ((
SBaseIn*)pHead)->eType == eVersion &&
185 ((
SBaseIn*)pHead)->nChan == -1)
187 DWORD dw1[4]= {0}, dw2[4]= {0}, dwDLLVersion[4]= {0};
188 sBase.nError= RTV_ERROR(lpf_AngeloRTV_Get_Version(dw1, dwDLLVersion, dw2), sBase.nError);
189 sBase.dwInfo= dwDLLVersion[0]*1000+dwDLLVersion[1]*100+dwDLLVersion[2]*10+dwDLLVersion[3];
190 sBase.eType= eVersion;
191 }
else if (((
SBaseIn*)pHead)->nChan < 0 || ((
SBaseIn*)pHead)->nChan >= m_acRTVDevices.size())
193 sBase.eType= ((
SBaseIn*)pHead)->eType;
194 sBase.nError= INVALID_CHANN;
195 }
else if (((
SBaseIn*)pHead)->eType == eSet && m_acRTVDevices[((
SBaseIn*)pHead)->nChan])
197 sBase.eType= ((
SBaseIn*)pHead)->eType;
198 sBase.nError= ALREADY_OPEN;
199 }
else if (((
SBaseIn*)pHead)->eType == eSet &&
201 ((
SBase*)((
char*)pHead+
sizeof(
SBaseIn)))->eType == eRTVChanInit)
204 LARGE_INTEGER llStart;
238 sBase.nError= BAD_INPUT_PARAMS;
275 sBase.nError= BAD_INPUT_PARAMS;
280 sChanInit.
ucBpp= ucBpp;
282 std::tstringstream ss;
284 std::tstringstream ss2;
286 std::tstring csPipeName= m_csPipeName+_T(
":")+ss2.str()+_T(
":")+ss.str();
289 pcChan=
new CChannelRTV(csPipeName.c_str(), ((
SBaseIn*)pHead)->nChan, sChanInit, sBase.nError, llStart);
292 EnterCriticalSection(m_ahCallbackSafe[((
SBaseIn*)pHead)->nChan]);
293 m_acRTVDevices[((
SBaseIn*)pHead)->nChan]= pcChan;
294 LeaveCriticalSection(m_ahCallbackSafe[((
SBaseIn*)pHead)->nChan]);
299 pBaseO->sBaseIn.eType= eResponseExL;
300 pBaseO->sBaseIn.nChan= ((
SBaseIn*)pHead)->nChan;
301 pBaseO->sBaseIn.nError= 0;
302 pBaseO->llLargeInteger= llStart;
303 pBaseO->bActive=
false;
305 ((
SBase*)((
char*)pBaseO+
sizeof(
SBaseOut)))->eType= eRTVChanInit;
308 sData.dwSize= pBaseO->sBaseIn.dwSize;
309 m_pcComm->SendData(&sData, llId);
314 sBase.nError= INVALID_COMMAND;
316 if (sBase.nError || bRes)
322 memcpy(sData.pHead, &sBase,
sizeof(
SBaseIn));
323 m_pcComm->SendData(&sData, llId);
330 if (usChan < m_usChans)
332 EnterCriticalSection(m_ahCallbackSafe[usChan]);
333 if (m_acRTVDevices[usChan])
334 m_acRTVDevices[usChan]->NextFrame(aucData);
335 LeaveCriticalSection(m_ahCallbackSafe[usChan]);
344 LARGE_INTEGER &llStart) :
CDevice(RTV_CHAN_STR), m_csPipeName(szPipe),
345 m_sChanInit(sChanInit), m_usChan(nChan)
353 InitializeCriticalSection(&m_hSentSafe);
357 nError= BAD_INPUT_PARAMS;
361 lpf_AngeloRTV_Close(m_usChan);
362 nError= RTV_ERROR(lpf_AngeloRTV_Initial(m_usChan), nError);
363 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Video_Format(m_usChan, sChanInit.
ucVideoFmt), nError);
364 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Color_Format(m_usChan, sChanInit.
ucColorFmt), nError);
365 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 0, sChanInit.
ucBrightness), nError);
366 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 1, sChanInit.
ucHue), nError);
367 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 2, sChanInit.
ucUSat), nError);
368 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 3, sChanInit.
ucVSat), nError);
369 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 4, sChanInit.
ucLumaContrast), nError);
370 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Image_Config(m_usChan, 5, sChanInit.
ucLumaFilt), nError);
371 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Select_Channel(m_usChan, 0x01), nError);
372 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Capture_Config(m_usChan, 0), nError);
373 if (!nError) nError= RTV_ERROR(lpf_AngeloRTV_Set_Callback(m_usChan, MediaStreamProc), nError);
378 nError=
static_cast<CPipeServer*
>(m_pcComm)->Init(szPipe, ~0x80000000, MIN_BUFF_IN,
379 sChanInit.
dwBuffSize+MIN_BUFF_OUT,
this, NULL);
394 ((
SBaseOut*)pHead)->sBaseIn.eType= eResponseEx;
395 ((
SBaseOut*)pHead)->sBaseIn.nChan= m_usChan;
396 ((
SBaseOut*)pHead)->sBaseIn.nError= 0;
397 EnterCriticalSection(&m_hSentSafe);
398 ((
SBaseOut*)pHead)->bActive= m_bActive;
399 LeaveCriticalSection(&m_hSentSafe);
400 _tcsncpy_s(((
SBaseOut*)pHead)->szName, DEVICE_NAME_SIZE,
m_csName.c_str(), _TRUNCATE);
401 pHead= (
char*)pHead+
sizeof(
SBaseOut);
404 ((
SBase*)pHead)->eType= eRTVChanInit;
405 pHead= (
char*)pHead+
sizeof(
SBase);
411 CChannelRTV::~CChannelRTV()
413 lpf_AngeloRTV_Capture_Stop(m_usChan);
414 lpf_AngeloRTV_Set_Callback(m_usChan, NULL);
415 lpf_AngeloRTV_Close(m_usChan);
416 if (m_pcComm) m_pcComm->
Close();
418 DeleteCriticalSection(&m_hSentSafe);
428 if (!pBase || dwSize !=
sizeof(
SBaseIn) || dwSize != pBase->dwSize)
429 nError= SIZE_MISSMATCH;
430 else if (pBase->eType != eActivate && pBase->eType != eInactivate && pBase->eType != eQuery)
431 nError= INVALID_COMMAND;
432 else if (pBase->nChan != m_usChan)
433 nError= INVALID_CHANN;
440 pBase= (
SBaseIn*)m_pcMemPool->PoolAcquire(sData.dwSize);
443 pBase->dwSize=
sizeof(
SBaseIn);
444 pBase->eType= eResponse;
446 pBase->nError= nError;
450 }
else if (pBase->eType == eQuery)
452 sData.dwSize=
GetInfo(NULL, 0);
453 sData.pHead= m_pcMemPool->PoolAcquire(sData.dwSize);
454 if (sData.pHead &&
GetInfo(sData.pHead, sData.dwSize) == sData.dwSize)
458 EnterCriticalSection(&m_hSentSafe);
459 if (pBase->eType == eActivate)
462 nError= ALREADY_OPEN;
465 nError= RTV_ERROR(lpf_AngeloRTV_Capture_Start(m_usChan, 0xFFFFFFFF), nError);
474 lpf_AngeloRTV_Capture_Stop(m_usChan);
476 pBase= (
SBaseIn*)m_pcMemPool->PoolAcquire(sData.dwSize);
479 pBase->dwSize=
sizeof(
SBaseIn);
480 pBase->eType= eResponse;
481 pBase->nChan= ((
SBaseIn*)pHead)->nChan;
482 pBase->nError= DEVICE_CLOSING;
490 pBase= (
SBaseIn*)m_pcMemPool->PoolAcquire(sData.dwSize);
493 pBase->dwSize=
sizeof(
SBaseIn);
494 pBase->eType= ((
SBaseIn*)pHead)->eType;
495 pBase->nChan= ((
SBaseIn*)pHead)->nChan;
496 pBase->nError= nError;
500 LeaveCriticalSection(&m_hSentSafe);
508 EnterCriticalSection(&m_hSentSafe);
509 if(m_bActive && !m_bSent)
512 if (!m_sChanInit.
bLossless && sData.pHead)
515 m_pLastSent= sData.pHead;
518 LeaveCriticalSection(&m_hSentSafe);
524 ((
SBaseOut*)sData.pHead)->sBaseIn.dwSize= sData.dwSize;
525 ((
SBaseOut*)sData.pHead)->sBaseIn.eType= eResponseExD;
526 ((
SBaseOut*)sData.pHead)->sBaseIn.nChan= m_usChan;
527 ((
SBaseOut*)sData.pHead)->sBaseIn.nError= 0;
528 ((
SBaseOut*)sData.pHead)->bActive=
true;
531 ((
SBase*)((
char*)sData.pHead+
sizeof(
SBaseOut)))->eType= eRTVImageBuf;
538 EnterCriticalSection(&m_hSentSafe);
539 if(m_bSent && m_pLastSent == pHead)
544 LeaveCriticalSection(&m_hSentSafe);
545 m_pcMemPool->PoolRelease(pHead);
void Result(void *pHead, bool bPass)
virtual DWORD GetInfo(void *pHead, DWORD dwSize)
unsigned char ucBrightness
virtual int SendData(const SData *pData, __int64 llId)=0
LARGE_INTEGER GetStart() const
void NextFrame(unsigned char *aucData)
CChannelRTV(const TCHAR szPipe[], int nChan, SChanInitRTV &sChanInit, int &nError, LARGE_INTEGER &llStart)
void NextFrame(unsigned char *aucData, unsigned short usChan)
DWORD GetInfo(void *pHead, DWORD dwSize)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
void ProcessData(const void *pHead, DWORD dwSize, __int64 llId)
unsigned char ucLumaContrast
const std::tstring m_csName