/* tty_tb.c 6.2 83/09/22 */
* Line discipline for RS232 tablets.
* Supplies binary coordinate data.
* MAKE TABLET TYPE AN ioctl TO AVOID HAVING ONE DISCIPLINE PER TABLET TYPE.
* Open as tablet discipline. Called when discipline changed
* with ioctl, and changes the interpretation of the information
if (tp
->t_line
== TABLDISC
|| tp
->t_line
== NTABLDISC
)
for (tbp
= tb
; tbp
< &tb
[NTBS
]; tbp
++)
tbp
->tbpos
.xpos
= tbp
->tbpos
.ypos
= 0;
tbp
->tbpos
.status
= tbp
->tbpos
.scount
= 0;
tp
->T_LINEP
= (caddr_t
) tbp
;
* Break down... called when discipline changed or from device
((struct tb
*) tp
->T_LINEP
)->used
= 0;
tp
->t_rawq
.c_cc
= 0; /* clear queues -- paranoid */
tp
->t_line
= 0; /* paranoid: avoid races */
* Read from a tablet line.
* Characters have been buffered in a buffer and
* decoded. The coordinates are now sluffed back to the user.
if ((tp
->t_state
&TS_CARR_ON
)==0)
tbpos
= &(((struct tb
*) (tp
->T_LINEP
))->tbpos
);
return (uiomove(tbpos
, sizeof *tbpos
, UIO_READ
, uio
));
* Low level character input routine.
* Stuff the character in the buffer, and decode the it
* if all the chars are there.
* This routine could be expanded in-line in the receiver
* interrupt routine of the dh-11 to make it run as fast as possible.
register struct tb
*tbp
= (struct tb
*) tp
->T_LINEP
;
if (tp
->t_line
== TABLDISC
) {
if ((c
&0200) || (tp
->t_inbuf
== MTABCHAR
)) {
if (++tp
->t_inbuf
== MTABCHAR
)
tbdecode(tbp
->cbuf
, &tbp
->tbpos
);
} else if (tp
->t_line
== NTABLDISC
) {
if ((c
&0200) || (tp
->t_inbuf
== MNTABCHAR
)) {
if (++tp
->t_inbuf
== MNTABCHAR
)
tbndecode(tbp
->cbuf
, &tbp
->tbpos
);
* Decode tablet coordinates from ascii to binary.
* (gtco 6 character format)
register struct tbpos
*tbpos
;
tbpos
->status
= *cp
>>2; /* this needs to be decoded */
tbpos
->xpos
= ((*cp
++)&03)<<14;
tbpos
->xpos
|= (*cp
++)<<7;
tbpos
->ypos
= ((*cp
++)&03)<<14;
tbpos
->ypos
|= (*cp
++)<<7;
* Decode tablet coordinates from ascii to binary.
* (hitachi 5 character format)
register struct tbpos
*tbpos
;
status
= (byte
&0100) ? 0100000 : 0;
status
|= 1<<((byte
-040)/2);
tbpos
->xpos
= (*cp
++)<<7;
if (tbpos
->xpos
< 256) /* tablet wraps around at 256 */
status
&= 077777; /* make it out of proximity */
tbpos
->ypos
= (*cp
++)<<7;
* This routine is called whenever a ioctl is about to be performed
* and gets a chance to reject the ioctl. We reject all teletype
* oriented ioctl's except those which set the discipline, and
* those which get parameters (gtty and get special characters).
tbioctl(tp
, cmd
, data
, flag
)