Title |
Testing the Scroll lock state |
Ref. No. |
QNX.000009236 |
Category(ies) |
Input Devices, Development, Character I/O |
Issue |
How can we test the Numlock, Scroll lock, and/or Caps lock?
We found them defined in sys/qioctl.h but we are still not sure how to test if the state is "on" or "off".
|
Solution |
Here's some code that should help(NOTE: The /dev/kbd can be changed to /dev/usbkbd0 to read from a usb keyboard.):
keystate.c
#ifdef __USAGE keystate #endif
#include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <ctype.h> #include <termios.h> #include <sys/dev.h> #include <sys/qioctl.h> #include <sys/kernel.h> #include <term.h>
main(argc, argv) int argc; char *argv[]; { int fd; long lval[2]; struct termios tios;
if(tcgetattr(0, &tios) == -1) { fprintf(stderr, "%s: Not a terminal devicen", argv[0]); exit(EXIT_FAILURE); } fd = open("/dev/kbd", O_RDONLY); /* * Get state of keyboard numlock etc.. */ lval[0] = 0; lval[1] = 0; if(qnx_ioctl( fd, QCTL_DEV_CTL, &lval[0], 8, &lval[0], 4 ) == 0 ) { printf("%cnumlock", (lval[0] & 0x000002L) ? '+' : '-'); printf(" %ccapslock",(lval[0] & 0x000004L) ? '+' : '-'); printf(" %cscrlock", (lval[0] & 0x004001L) ? '+' : '-'); printf("n"); } close(fd); }
As well, you can query the state of the serial lines(in case anyone else is looking for this)
serline.c
#ifdef __USAGE
e.g. serline </dev/ser1
#endif
#include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <ctype.h> #include <termios.h> #include <sys/dev.h> #include <sys/qioctl.h> #include <sys/kernel.h> #include <term.h>
main(argc, argv) int argc; char *argv[];
{ long lval[2]; struct termios tios;
if(tcgetattr(0, &tios) == -1) { fprintf(stderr, "%s: Not a terminal devicen", argv[0]); exit(EXIT_FAILURE); }
/* * Get state of hardware lines */ lval[0] = 0; lval[1] = 0; if(qnx_ioctl( 0, QCTL_DEV_CTL, &lval[0], 8, &lval[0], 4 ) == 0 ) { printf("%cDTR", (lval[0] & 0x000001L) ? '+' : '-'); printf(" %cRTS", (lval[0] & 0x000002L) ? '+' : '-'); printf(" %cBRK", (lval[0] & 0x004000L) ? '+' : '-'); printf(" %ccts", (lval[0] & 0x100000L) ? '+' : '-'); printf(" %cdsr", (lval[0] & 0x200000L) ? '+' : '-'); printf(" %cri", (lval[0] & 0x400000L) ? '+' : '-'); printf(" %ccd", (lval[0] & 0x800000L) ? '+' : '-'); printf("n"); } }
|
|