Files
harbour-core/tests/commouse.prg
vszakats 9687850865 2013-03-16 02:10 UTC+0100 Viktor Szakats (harbour syenar.net)
* (all files)
    * stripped svn header
    * minor cleanups
    ; use following command to find out the history of files:
       git log
       git log --follow
       git blame
       git annotate
2013-03-16 02:11:42 +01:00

133 lines
3.7 KiB
Plaintext

#include "hbcom.ch"
PROCEDURE Main( cParam )
LOCAL nPort, cBuf, cBuffer, nLen, nType, lL, lM, lR, nX, nY
IF cParam == NIL
? "Usage: commouse [ nPort | cDevice ]"
RETURN
ENDIF
nPort := Val( cParam )
IF nPort == 0
? "Using device:", cParam
nPort := 1
hb_comSetDevice( nPort, cParam )
ELSE
? "Using port number:", nPort
ENDIF
IF ! hb_comOpen( nPort )
? "Unable to open port. Error:", hb_comGetError( nPort ), " OS error:", hb_comGetOSError( nPort )
RETURN
ENDIF
IF ! hb_comInit( nPort, 1200, "N", 8, 1 )
? "Unable to initialize port. Error:", hb_comGetError( nPort ), " OS error:", hb_comGetOSError( nPort )
hb_comClose( nPort )
RETURN
ENDIF
hb_comMCR( nPort, , HB_COM_MCR_DTR + HB_COM_MCR_RTS )
hb_idleSleep( 0.1 )
hb_comFlush( nPort )
hb_comMCR( nPort, , , HB_COM_MCR_DTR + HB_COM_MCR_RTS )
cBuf := Space( 256 )
IF ( nLen := hb_comRecv( nPort, @cBuf,, 500 ) ) > 0
IF hb_BCode( cBuf ) == 0xCD
? "Bingo: 2 button mouse detected!"
nType := 2
cBuffer := hb_BSubStr( cBuf, 2, nLen - 1 )
ELSE
cBuffer := hb_BLeft( cBuf, nLen )
ENDIF
ELSE
cBuffer := ""
ENDIF
IF nType == NIL
? "Mouse not detected, assuming 3 button mouse"
nType := 3
ENDIF
? "Press any key to exit..."
DO WHILE ( nLen := Inkey() ) == 0
IF ( nLen := hb_comRecv( nPort, @cBuf ) ) > 0
cBuffer += hb_BLeft( cBuf, nLen )
ENDIF
IF hb_BLen( cBuffer ) == 0
hb_idleSleep( 0.05 )
LOOP
ENDIF
IF nType == 2
IF hb_bitAnd( hb_BCode( cBuffer ), 0xC0 ) != 0xC0
cBuffer := hb_BSubStr( cBuffer, 2 )
ELSEIF hb_BLen( cBuffer ) >= 3
lR := hb_bitAnd( hb_BCode( cBuffer ), 0x10 ) != 0
lL := hb_bitAnd( hb_BCode( cBuffer ), 0x20 ) != 0
nX := hb_bitAnd( hb_BCode( cBuffer ), 3 ) * 64 + hb_bitAnd( hb_BCode( hb_BSubStr( cBuffer, 2 ) ), 0x3F )
IF nX > 127
nX -= 256
ENDIF
nY := hb_bitAnd( hb_BCode( cBuffer ), 0x0C ) * 16 + hb_bitAnd( hb_BCode( hb_BSubStr( cBuffer, 3 ) ), 0x3F )
IF nY > 127
nY -= 256
ENDIF
? "dX,dY:", Str( nX, 4 ), Str( nY, 4 ), " "
IF lL
?? "LEFT "
ENDIF
IF lR
?? "RIGHT"
ENDIF
cBuffer := hb_BSubStr( cBuffer, 4 )
ENDIF
ELSEIF nType == 3
IF hb_bitAnd( hb_BCode( cBuffer ), 0xC0 ) != 0x80
cBuffer := hb_BSubStr( cBuffer, 2 )
ELSEIF hb_BLen( cBuffer ) >= 4
lR := hb_bitAnd( hb_BCode( cBuffer ), 1 ) == 0
lM := hb_bitAnd( hb_BCode( cBuffer ), 2 ) == 0
lL := hb_bitAnd( hb_BCode( cBuffer ), 4 ) == 0
nI := hb_BCode( hb_BSubStr( cBuffer, 2 ) )
IF nI > 127
nI -= 256
ENDIF
nX := nI
nI := hb_BCode( hb_BSubStr( cBuffer, 4 ) )
IF nI > 127
nI -= 256
ENDIF
nX += nI
nI := hb_BCode( hb_BSubStr( cBuffer, 3 ) )
IF nI > 127
nI -= 256
ENDIF
nY := - nI
nI := hb_BCode( hb_BSubStr( cBuffer, 5 ) )
IF nI > 127
nI -= 256
ENDIF
nY -= nI
? "dX,dY:", Str( nX, 4 ), Str( nY, 4 ), " "
IF lL
?? "LEFT "
ENDIF
IF lM
?? "MIDDLE "
ENDIF
IF lR
?? "RIGHT"
ENDIF
cBuffer := hb_BSubStr( cBuffer, 5 )
ENDIF
ENDIF
ENDDO
hb_comClose( nPort )
RETURN