Files
harbour-core/harbour/extras/commouse/commouse.prg
Viktor Szakats 340318e66d 2012-07-21 19:09 UTC+0200 Viktor Szakats (vszakats syenar.net)
+ extras
  - examples
  * doc/dirstruc.txt
    * renamed 'examples' to what it is more: 'extras'
2012-07-21 17:10:27 +00:00

134 lines
3.6 KiB
Plaintext

/*
* $Id$
*/
#include "hbcom.ch"
PROC 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