'===========================================================================
' Subject: Reflex Test                        Date: 12-22-02 (  :  )       
'  Author: Stuart McLachlan                   Code: PBDLL                  
'  Origin: stuart@lexacorp.com.pg           Packet: PBDLL.ABC
'===========================================================================
'Test Reflexes - StuartMcl
'PB code

#COMPILE EXE 
#DIM ALL 
#INCLUDE "WIN32API.INC" 
 
GLOBAL hdlg AS LONG 
GLOBAL accum AS DOUBLE 
GLOBAL mintime AS DOUBLE 
GLOBAL maxtime AS DOUBLE 
GLOBAL tries AS LONG 
GLOBAL runningstate AS LONG 
 
STATIC FUNCTION ElapsedMicroSeconds() AS LONG 
    DIM freq AS QUAD, overhead AS QUAD 
    DIM count AS QUAD, prevCount AS QUAD 
    DIM microseconds AS QUAD 
    DIM fStarted AS LONG 
 
    IF fStarted THEN 
   QueryPerformanceCounter count 
   microseconds = (count - prevCount - overhead) / freq * 1000000 
   IF microseconds > 2147483647 THEN EXIT FUNCTION 
   ElapsedMicroSeconds = microseconds 
    ELSE 
   IF QueryPerformanceFrequency(freq) = 0 OR freq < 100 THEN 
  ElapsedMicroSeconds = -1 
  EXIT FUNCTION 
   END IF 
   QueryPerformanceCounter prevCount 
   QueryPerformanceCounter count 
   overhead = count - prevCount 
   fStarted = %True 
    END IF 
    prevCount = count 
END FUNCTION 
 
FUNCTION DelayTimer(BYVAL hWnd AS DWORD, BYVAL uiMsg AS DWORD, _ 
   BYVAL idEvent AS DWORD, BYVAL dwTime AS DWORD) AS LONG 
    DIM temptick AS LONG 
    IF runningstate = 1 THEN 
   runningstate = 2 
   CONTROL SET COLOR HDLG,1,%BLACK,%GREEN 
   CONTROL SET TEXT HDLG,1,"GO" 
   temptick = elapsedmicroseconds 
   END IF 
   FUNCTION = 0 
END FUNCTION 
 
CALLBACK FUNCTION Getclick() 
    DIM temptick AS LONG 
    DIM delay AS LONG 
    DIM TimerProcPtr  AS DWORD 
 
    IF CBMSG =  %WM_LBUTTONDOWN THEN 
     temptick = elapsedmicroseconds 
     SELECT CASE runningstate 
    CASE 2  'Go 
    CONTROL SET COLOR HDLG,1,%BLACK,%RED 
    CONTROL SET TEXT HDLG,1,FORMAT$((temptick/1000000),"0.000")  & " - Click here again to retry" 
    INCR tries 
    IF mintime = 0 OR (temptick) < mintime THEN mintime = temptick 
    IF  (temptick) > maxtime THEN maxtime = temptick 
    accum = accum + temptick 
    runningstate = 0 
  CASE 1 'Standby 
    CONTROL SET COLOR HDLG,1,%BLACK,%RED 
    CONTROL SET TEXT HDLG,1,"WAIT FOR IT! - Click here again to retry" 
    runningstate = 0 
      CASE 0  'Waiting for Start click 
   CONTROL SET TEXT HDLG,1,"STANDBY" 
   Delay = 3000 + RND(0,2000) 
   TimerProcPtr = CODEPTR(DelayTimer) 
   SetTimer hdlg, 1, Delay, TimerProcPtr 
   runningstate = 1 
     END SELECT 
   END IF 
END FUNCTION 
 
CALLBACK FUNCTION showresults() 
    LOCAL strResults AS STRING 
    strresults = STR$(tries) & " attempts:" & CHR$(13,10) 
    strresults =  strresults & "Min: " & FORMAT$(mintime/1000000,"0.000") & CHR$(13,10) 
    strresults =  strresults & "Max: " & FORMAT$(maxtime/1000000,"0.000") & CHR$(13,10) 
    strresults =  strresults & "Avg: " & FORMAT$(accum/tries/1000000,"0.000") & CHR$(13,10) 
    MSGBOX strResults,, "[b]reflex[/b] Tester Results" 
END FUNCTION 
 
CALLBACK FUNCTION resetresults() 
    tries = 0 
    accum = 0 
    mintime = 0 
    maxtime = 0 
END FUNCTION 
 
FUNCTION PBMAIN() AS LONG 
    LOCAL lRslt AS LONG 
    RANDOMIZE TIMER 
    DIALOG NEW 0, "Response Timer", 195, 88, 258, 140, %WS_POPUP OR _ 
   %WS_BORDER OR %WS_CAPTION OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ 
   %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ 
   %DS_SETFONT, %WS_EX_WINDOWEDGE OR %WS_EX_CONTROLPARENT OR %WS_EX_LEFT _ 
   OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg 
    CONTROL ADD LABEL, hDlg, 1, "CLICK MOUSE TO START", 25, 30, _ 
   215, 50, %WS_CHILD OR %WS_VISIBLE OR %SS_CENTER OR %SS_CENTERIMAGE, _ 
   %WS_EX_LEFT OR %WS_EX_LTRREADING 
    CONTROL SET COLOR hDlg, 1, -1, %RED 
    CONTROL ADD LABEL, hDlg,2, "Click the mouse button in the box when it " + _ 
   "turns green.", 45, 0, 200, 10 
    CONTROL ADD LABEL, hDlg,3, "Your response time in milliseconds " + _ 
   "will displayed", 55, 10, 155, 15 
    CONTROL ADD BUTTON, hdlg,5,"Results",100,90,60,14 CALL showresults 
    CONTROL ADD BUTTON, hdlg,6,"Reset",100,110,60,14 CALL resetresults 
 
     DIALOG SHOW MODAL hDlg, CALL Getclick TO lRslt 
END FUNCTION  
