I have a customer application (written in Xbase++) that controls the world's most sensitive metal detector.
The Xbase++ app communicates with 2 microprocessors via IP to control scanning the user's access card, reading the electric field of the arch, opening the door, displaying graphs and charts, etc.
What it didn't do (until now) is capture a video of persons entering the arch.
Here's the test code. Now I only need to add it to the application. Works great!!!
Code: Select all
#INCLUDE "dcdialog.CH"
#INCLUDE "videocapx.CH"
FUNCTION Main()
LOCAL GetList[0], oVideo1, oVideo2, GetOptions, oTimer
PUBLIC oVideo
@ 0,0 DCACTIVEXCONTROL oVideo1 ;
CLSID 'VIDEOCAPX.VideoCapXCtrl.1' SIZE 300,300 PIXEL ;
@ 330, 0 DCPUSHBUTTON CAPTION 'Start Capture' SIZE 100,22 PIXEL ;
ACTION {||oVideo1:capFileName := '.\Camera1\' + Dtos(Date())+'_'+Strtran(Time(),':','-')+'.Avi', ;
oVideo1:startCapture()}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'End Capture' SIZE 100,22 PIXEL ;
ACTION {||oVideo1:stopCapture()}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'SnapShot' SIZE 100,22 PIXEL ;
ACTION {|x,c,o,b|oVideo1:CopyFrame(), ;
b := GetBitmapFromClipboard(), ;
b:saveFile(GetFileName('.\Camera1\','.jpg'),XBPBMP_FORMAT_JPG)}
@ 360,0 DCACTIVEXCONTROL oVideo2 ;
CLSID 'VIDEOCAPX.VideoCapXCtrl.1' SIZE 300,300 PIXEL ;
@ 700, 0 DCPUSHBUTTON CAPTION 'Start Capture' SIZE 100,22 PIXEL ;
ACTION {||oVideo2:capFileName := GetFileName('.\Camera2\','.Avi'), ;
oVideo2:startCapture()}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'End Capture' SIZE 100,22 PIXEL ;
ACTION {||oVideo2:stopCapture()}
@ DCGUI_ROW, DCGUI_COL + 20 DCPUSHBUTTON CAPTION 'SnapShot' SIZE 100,22 PIXEL ;
ACTION {|x,c,o,b|oVideo2:CopyFrame(), ;
b := GetBitmapFromClipboard(), ;
b:saveFile(GetFileName('.\Camera2\','.jpg'),XBPBMP_FORMAT_JPG)}
DCGETOPTIONS RESIZE RESIZEDEFAULT DCGUI_RESIZE_AUTORESIZE
DCREAD GUI FIT TITLE 'VideoCapX Sample Program' ;
OPTIONS GetOptions ;
EVAL {|o|oVideo2:DebugMode := 1, ;
oVideo2:UseVideoFilter := vcxBoth, ;
oVideo2:PreviewAudio := .f., ;
oVideo2:VideoDeviceIndex := 1, ;
oVideo2:Connected := .t., ;
oVideo2:Preview := .t., ;
oVideo1:DebugMode := 1, ;
oVideo1:UseVideoFilter := vcxBoth, ;
oVideo1:PreviewAudio := .f., ;
oVideo1:VideoDeviceIndex := 0, ;
oVideo1:Connected := .t., ;
oVideo1:Preview := .t., ;
M->oVideo := oVideo1, ;
oTimer := DC_SetTimerEvent():new(100,{||CheckForMotion(oVideo1,oVideo2)}), ;
nil }
oTimer:destroy()
RETURN nil
* ---------
PROC appsys ; RETURN
* ---------
STATIC FUNCTION GetFileName( cPath, cExt )
RETURN cPath + Dtos(Date())+'_'+Strtran(Time(),':','-') + cExt
* ---------
STATIC FUNCTION CheckForMotion( oVideo1, oVideo2 )
IF oVideo1:isCapturing .AND. oVideo1:DetectMotion() < 3
oVideo1:stopCapture()
DC_SpawnUrl(oVideo1:capFileName)
ELSEIF !oVideo1:isCapturing .AND. oVideo1:DetectMotion() >= 5
oVideo1:capFileName := GetFileName('.\Camera1\','.Avi')
oVideo1:startCapture()
ENDIF
IF oVideo2:isCapturing .AND. oVideo2:DetectMotion() < 3
oVideo2:stopCapture()
DC_SpawnUrl(oVideo2:capFileName)
ELSEIF !oVideo2:isCapturing .AND. oVideo2:DetectMotion() >= 5
oVideo2:capFileName := GetFileName('.\Camera2\','.Avi')
oVideo2:startCapture()
ENDIF
RETURN nil
* ------------
STATIC FUNCTION GetBitmapFromClipBoard()
LOCAL oClipBoard, oBitmap
oClipBoard := XbpClipBoard():new():create()
oClipBoard:open()
oBitMap := oClipBoard:getBuffer( XBPCLPBRD_BITMAP )
oClipBoard:close()
RETURN oBitmap