[comp.unix.sysv386] Programming the Logitech Serial mouse

steve@hacker.UUCP (Stephen M. Youndt) (12/14/90)

About a month or so ago, I posted a message inquiring how I might read the
Logitech serial mouse that I use without resorting to X/windows.  As it turns
out this endeavor has solved two problems.  First, the source and text that
follow are, inasmuch as I can determine, absolutely correct.  All I have is
the e-mail address, and I've been unable to find the persons name, but
whoever you are, Thank You very much!!!  

Another thing that I've learned is that applications under VP/ix can hose over
the mouse and make it unreadable in this manner.  I plan to call Logitech
tomorrow to determine how to set the mouse back to the default mode from Unix.
All I've been able to determine so far is that starting X with the mouse hosed
causes the graphics cursor to "hide" in the lower left corner of the screen.
The only way thus far to fix it is to unplug the mouse from the serial port,
allowing it to lose power.

When I have the info I need, I'll post source illustrating the other mouse
modes as well, and how to get into and out of those modes.
================================== Start of Text =============================
-->From uucp Tue Dec  4 19:16 EST 1990
-->>From zip.eecs.umich.edu!mknister  Tue Dec  4 10:23:41 1990 remote from uunet
-->Received: from zip.eecs.umich.edu by uunet.UU.NET (5.61/1.14) with UUCP 
-->	id AA29021; Tue, 4 Dec 90 10:23:41 -0500
-->From: uunet!zip.eecs.umich.edu!mknister
-->Received: by mailrus.cc.umich.edu (5.61/1123-1.0)
-->	id AA18072; Tue, 4 Dec 90 10:21:45 -0500
-->Received: from zip.eecs.umich.edu by umich.edu (5.61/1123-1.0)
-->	id AA18324; Tue, 4 Dec 90 10:22:48 -0500
-->Received: from delhi.eecs.umich.edu by zip.eecs.umich.edu (5.61+++/3.00-gamma) id AA11348; Tue, 4 Dec 90 10:21:15 -0500 
-->Message-Id:  <9012041521.AA11348@zip.eecs.umich.edu>
-->To: hacker!steve (Stephen M. Youndt)
-->Cc: umich!zip.eecs.umich.edu!mknister
-->Subject: Re: Serial mouse under Esix rev D 
-->In-Reply-To: Your message of "30 Nov 90 15:53:14 GMT."
-->Date: Tue, 04 Dec 90 10:24:06 EST
-->Status: RO
-->
-->
-->Here's some info on using a serial (logitech/mouse systems) mouse. It
-->was all determined from experimentation, but it seems to be about
-->right.
-->
-->Configure the port at 1200 baud, no parity.  Data comes in 5-byte
-->packets.  The first byte contains mouse info, the last 4 are
-->horizontal/vertical mouse movements.
-->
-->The high 4 bits of byte 1 always seem to be 1000; this appears to be a
-->marker indicating the start of the 5-byte packet.
-->
-->The low 4 bits of byte 1 indicate mouse buttons:
-->
-->Byte 1: 1 0 0 0  0 X X X
-->                   | | |
-->	           | | |-- 0 if right mouse button down, 1 if up
-->                   | |---- 0 if middle mouse button down, 1 if up
-->                   |------ 0 if left mouse button down, 1 if up
-->
-->Byte 2 contains a signed number indicating the horizontal mouse
-->movement.
-->Byte 3 contains a signed number indicating the vertical mouse
-->movement.
-->Bytes 4 & 5 appear to be horizontal/vertical mouse movement again, but
-->at a lower resolution.  I think you can ignore them.
-->
-->Here's some test code I wrote.  hpos1/vpos1 keep track of the
-->horizontal/vertical mouse position using bytes 2 & 3.  hpos2/vpos2 do
-->the same using bytes 4 & 5.
-->
-->#include <stdio.h>
-->#include <termio.h>
-->#include <fcntl.h>
-->
-->main(argc, argv)
-->int argc;
-->char **argv;
-->{
-->    int fd, i, j, hpos1=0, hpos2=0, vpos1=0, vpos2=0;
-->    char buf[100];
-->    struct termio tty;
-->
-->    fd = open(argv[1], O_RDONLY);
-->    if (fd < 0) {
-->	perror("open");
-->	exit(-1);
-->    }
-->
-->      ioctl(fd,TCGETA,&tty);  
-->      tty.c_iflag = IGNBRK | IGNPAR ;     
-->      tty.c_oflag = 0;           
-->      tty.c_cflag = B1200 | CS8 | CSTOPB | CREAD;
-->      tty.c_lflag = 0;
-->      tty.c_cc[VTIME]=0; 
-->      tty.c_cc[VMIN]=1;
-->      ioctl(fd,TCSETA,&tty);
-->
-->    j = 0;
-->
-->    while (1) {
-->	i = read(fd, buf+j, 5);
-->	if (i < 0) {
-->	    perror("read");
-->	}
-->	else {
-->	    j += i;
-->	}
-->	if (j >= 5) {
-->	    hpos1 += buf[1]; hpos2 += buf[3];
-->	    vpos1 += buf[2]; vpos2 += buf[4];
-->	    printf("BUTTONS:%2X  ", (unsigned char) buf[0]);
--> 	    printf("H(%3d/%3d)  ", buf[1],buf[3]);
-->	    printf("V(%3d/%3d)    ", buf[2],buf[4]);
-->	    printf("pos1=(%4d,%4d)   ", hpos1, vpos1);
-->	    printf("pos2=(%4d,%4d)   ", hpos2, vpos2);
-->	    printf("\n");
-->	    fflush(stdout);
-->
-->	    for (i=5; i<j; i++) buf[i-5] = buf[i];
-->	    j -= 5;
-->	}
-->    }
-->}
-->
=================================== End of Text ==============================
If there are any more questions regarding the operation of a Logitech serial
mouse, ask me in a few days and I'll probably know. Again, thanks to all of
those who expressed and interest and/or offered help.  Later. -- SMY


-- 
Stephen M. Youndt       /   "Remember, no matter where you go, 
uunet!hacker!steve     /     there you are."  -- B. Banzai