[comp.sys.sgi] programming the dial and button box

corkum@csri.toronto.edu (Brent Thomas Corkum) (12/14/90)

I'm wondering how easy it is to write a program that uses input from
the dial and button box. We have one and use it extensively with IDEAS, 
but we haven't tried to incorporate it into any of our home brew packages.
If anyone has experience with writing code for the dial and button box
can you tell me what I need to do and if you can include a short snipit 
of code it would be much appreciated.

Brent Corkum
corkum@boulder.civ.toronto.edu

" ratcliffe) (12/18/90)

In article <1990Dec14.003742.27298@jarvis.csri.toronto.edu> corkum@csri.toronto.edu (Brent Thomas Corkum) writes:
>I'm wondering how easy it is to write a program that uses input from
>the dial and button box. We have one and use it extensively with IDEAS, 
>but we haven't tried to incorporate it into any of our home brew packages.
>If anyone has experience with writing code for the dial and button box
>can you tell me what I need to do and if you can include a short snipit 
>of code it would be much appreciated.
>
>Brent Corkum
>corkum@boulder.civ.toronto.edu

/usr/people/4Dgifts is a sample user account provided in the dev.sw.giftssrc
subsystem.  if you don't have a /usr/people/4Dgifts subtree of approximately
3.5 MB in size, then you might want to re-install this subsystem from the DEV
tape.  consult yer "4D1-3.3, Development Release and Installation Notes,"
p. 5-26 for more details.

the following two progs come from /usr/people/4Dgifts/examples/devices:
(2nd prog begins 135 lines below this)

/*
 *  dialtest.c:
 *
 *  primitive program to test basic communication setup for the Dials box 
 *  (and by implication, the Buttons as well) functionality.  
 *  note the ranges used for setvaluator are completely arbitrary.
 *
 *  OPERATION OF:  this program was written to simply provide the most
 *                 *minimalist* test to determine whether or not the
 *                 dial and buttons box pair are correctly configured
 *                 to communicate with the IRIS.  it is for this reason
 *                 that the grafix window you are prompted to initially
 *                 open up does nothing more than provide a screen 
 *                 location for the input focus to be applied to--there
 *                 is no "graphics" (beside clearing to color GREEN) that 
 *                 happens in the GL window you open when this program 
 *                 runs.  the only output/feedback you will ever see is-
 *                 -with the mouse sitting *inside* the perimeter of the 
 *                 GL window--DIAL/X-Y window coordinates sent back to 
 *                 stdout into the shell you invoked dialtest from in the
 *                 first place.  This kind of "output" is sufficient to 
 *                 confirm that the dial and button box pair are 
 *                 correctly hooked up to the IRIS.  (if you wish to see 
 *                 graphics in the GL window (like an "etch-a-sketch"), 
 *                 look at/compile-run the dialbuttons program in this 
 *                 same directory.
 */

#include <stdio.h>
#include <gl/gl.h>
#include <gl/device.h>

main()
{
    Icoord xval, yval;
    Device type, i;
    short val;

    foreground();
    winopen("dial test program");
    color(GREEN);
    clear();

    /* Put Mousebuttons, switches, and valuators in queue */    
    qdevice(KEYBD);                    
    qdevice(LEFTMOUSE);
    qdevice(MIDDLEMOUSE);
    for(i=DIAL0; i<=DIAL7; i++) 
        qdevice(i);

    /* set noise so Dials must move more than two before value is queued */
    for(i=DIAL0; i<=DIAL7; i++) {
        noise(i, 2);
    }

    /* Set initial, min, and max values for dials */
    setvaluator(DIAL0,512,100,924);
    setvaluator(DIAL1,512,100,678);
    setvaluator(DIAL2,512,100,924);
    setvaluator(DIAL3,512,100,678);
    setvaluator(DIAL4,512,100,924);
    setvaluator(DIAL5,512,100,678);
    setvaluator(DIAL6,512,100,924);
    setvaluator(DIAL7,512,100,678);

    color(4);

    while (1) {
        type = qread(&val);
        switch (type) {
            case KEYBD:                            /* exits program       */
                gexit();
                exit(0);
                break;
            case REDRAW:            
		reshapeviewport();
	        color(GREEN);
    	        clear();
                break;         
            case INPUTCHANGE:  /* catch/trap inputchange events occurring */
                break;   /* when mouse crosses the window border boundary */
            case MIDDLEMOUSE:                      /* MIDDLEMOUSE is used */
                setvaluator(DIAL0,512,100,924);    /* to reset Dials 0-1  */
                setvaluator(DIAL1,512,100,678);    /* back to the center  */
                xval = getvaluator(DIAL0);         /* of their range      */
                yval = getvaluator(DIAL1);
                break;
            case DIAL0:
                xval = getvaluator(DIAL0);
                yval = getvaluator(DIAL1);
                fprintf(stderr,"DIAL0-1: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL1:
                xval = getvaluator(DIAL0);
                yval = getvaluator(DIAL1);
                fprintf(stderr," DIAL0-1: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL2:
                xval = getvaluator(DIAL2);
                yval = getvaluator(DIAL3);
                fprintf(stderr,"  DIAL2-3: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL3:
                xval = getvaluator(DIAL2);
                yval = getvaluator(DIAL3);
                fprintf(stderr,"   DIAL2-3: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL4:
                xval = getvaluator(DIAL4);
                yval = getvaluator(DIAL5);
                fprintf(stderr,"    DIAL4-5: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL5:
                xval = getvaluator(DIAL4);
                yval = getvaluator(DIAL5);
                fprintf(stderr,"     DIAL4-5: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL6:
                xval = getvaluator(DIAL6);
                yval = getvaluator(DIAL7);
                fprintf(stderr,"      DIAL6-7: x=%d  y=%d\n",xval, yval);
                break;
            case DIAL7:
                xval = getvaluator(DIAL6);
                yval = getvaluator(DIAL7);
                fprintf(stderr,"       DIAL6-7: x=%d  y=%d\n",xval, yval);
                break;
            default: fprintf(stderr,"device # %d was entered\n",type);
        }
    }
}


/*
 * dialbuttons.c:
 *
 * this program is expanded version of dialtest.c.  
 *  - it draws colored lines in the x and y directions based on which dial 
 *    gets turned:  
 *      x is DIAL0, DIAL2, DIAL4, & DIAL6, and
 *      y is DIAL1, DIAL3, DIAL5, & DIAL7.
 *
 *  - the switches (0-31) control the noise level for the eight dials.  
 *    the initial noise delta is set to 2. 
 *
 *  - everytime a switch is depressed or a dial is turned, the LED display on
 *    the switches box (if you have that style--some switch box models do not
 *    include an LED display) will specify which device is being accessed.
 * 
 *  - there is a variable called count--initially set to 5--used to determine
 *    the frequency of echoing to stderr the screen values being returned from
 *    getvaluator and their equivalent "window values".  (no matter what size/
 *    shape of window one initially opens or manually resizes, this window is
 *    mapped to a simulated "full console screen" in that x always runs from 
 *    0 to 1279, and y always runs from 0 to 1023.  (0 to 1023 and 0 to 767 
 *    respectively for the 14-inch monitor 4D machines.))  if for some reason 
 *    you wish to change the frequency, push the numeric keys 1-9 to increase
 *    or decrease the freqency of text being sent to stderr.
 *
 *              dave "who can do? ratmandu!" ratcliffe - 1990
 */

#include <stdio.h>
#include <gl/gl.h>
#include <gl/device.h>

#define round(n)       ((int) ((n) + 0.5))

long sx, sy;                   /* size of window in x and y */
float xratio, yratio;          /* maps window size to full console */
short xmaxscrn, ymaxscrn;      /* maximum simulated size of screen in x & y */

main() {

    static int curdial = 0, count = 0, modfactor = 5;
    Icoord xval, yval;
    float xpos, ypos, startx, starty;
    Device dev, i;
    short val;
    char str[9];
    long xscrnsize;       /* size of actual screen in x used to set globals  */

    xscrnsize = getgdesc(GD_XPMAX);                   /* get/set screen size */
    if (xscrnsize == 1280) {
        xmaxscrn = 1279;
        ymaxscrn = 1023;
        xval = 640;
        yval = 512;
    } else if (xscrnsize ==1024) {
        xmaxscrn = 1023;
        ymaxscrn = 767;
        xval = 512;
        yval = 384;
    } else {
        fprintf(stderr, "Something's EXTREMELY wrong:  ");
        fprintf(stderr, "xscrnsize=%d\n", xscrnsize);
        exit(-1) ;
    }


    foreground();
    winopen("");
    wintitle("dialbuttons program");
    linewidth(3);
    init_win();
    startx = ((float) sx)/2;
    starty = ((float) sy)/2;
    move2(startx, starty);
    draw2(startx+1, starty-1);
    draw2(startx-1, starty+1);

    /* Put Mousebuttons, switches, valuators, and buttons in the event ueue */
    qdevice(ESCKEY);                    
    qdevice(ONEKEY);                    
    qdevice(TWOKEY);                    
    qdevice(THREEKEY);                    
    qdevice(FOURKEY);                    
    qdevice(FIVEKEY);                    
    qdevice(SIXKEY);                    
    qdevice(SEVENKEY);                    
    qdevice(EIGHTKEY);                    
    qdevice(NINEKEY);                    
    for(i=DIAL0; i<=DIAL7; i++) {
        qdevice(i);
    }
    for(i=SW0; i<=SW31; i++) {
        qdevice(i);
    }

    /* set noise so Dials must move more than two before value is queued */
    for(i=DIAL0; i<=DIAL7; i++) {
        noise(i, 2);
    }

    /* Set initial, min, and max values for dials */
    setvaluator(DIAL0, (short) xval, 0, xmaxscrn);
    setvaluator(DIAL1, (short) yval, 0, ymaxscrn);
    setvaluator(DIAL2, (short) xval, 0, xmaxscrn);
    setvaluator(DIAL3, (short) yval, 0, ymaxscrn);
    setvaluator(DIAL4, (short) xval, 0, xmaxscrn);
    setvaluator(DIAL5, (short) yval, 0, ymaxscrn);
    setvaluator(DIAL6, (short) xval, 0, xmaxscrn);
    setvaluator(DIAL7, (short) yval, 0, ymaxscrn);

    color(4);

    qreset();
    while (1) {
        dev = qread(&val);
	if (SW0 <= dev && dev <= SW31) {
	    sprintf(str,"BUTTON%2d",dev-SW0);
            dbtext(str);
            if (val) {
                for(i=DIAL0; i<=DIAL7; i++) noise(dev-SW0, 0);
                fprintf(stderr, "\n noise delta now set to %d\n",dev-SW0);
	    }
	} else if (ONEKEY <= dev && dev <= NINEKEY) {
	    modfactor = dev - ONEKEY + 1;
            count = 0;
	} else switch (dev) {
            case ESCKEY:                            /* exits program       */
                gexit();
                exit(0);
                break;
            case INPUTCHANGE:
                qreset();
                break;
            case REDRAW:
                init_win();
                break;
            case DIAL0:
                if (curdial == 0) {
                    color(0);
                    xval = getvaluator(DIAL0);
                    yval = getvaluator(DIAL1);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) {
                        fprintf(stderr,"DIAL0-1: xvalue=%d  yvalue=%d ",
                                                        xval,       yval);
                        fprintf(stderr,"     xwinpos=%d  ywinpos=%d\n",
                                                  round(xpos), round(ypos));
                    }
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL0, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL1, (short) yval, 0, ymaxscrn);
                    curdial = 0;
                    dbtext("DIAL 0");
                }
                break;
            case DIAL1:
                if (curdial == 1) {
                    color(1);
                    xval = getvaluator(DIAL0);
                    yval = getvaluator(DIAL1);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) {
                        fprintf(stderr," DIAL1-0: yvalue=%d  xvalue=%d ",
                                                        yval,       xval);
                        fprintf(stderr,"     ywinpos=%d  xwinpos=%d\n",
                                                  round(ypos), round(xpos));
                    }
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL0, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL1, (short) yval, 0, ymaxscrn);
                    curdial = 1;
                    dbtext("DIAL 1");
                }
                break;
            case DIAL2:
                if (curdial == 2) {
                    color(2);
                    xval = getvaluator(DIAL2);
                    yval = getvaluator(DIAL3);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) 
                        fprintf(stderr,"  DIAL2:  xvalue=%d  xwinpos=%d\n",
                                                      xval,    round(xpos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL2, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL3, (short) yval, 0, ymaxscrn);
                    curdial = 2;
                    dbtext("DIAL 2");
                }
                break;
            case DIAL3:
                if (curdial == 3) {
                    color(3);
                    xval = getvaluator(DIAL2);
                    yval = getvaluator(DIAL3);
                    ypos = yval*yratio;
                    xpos = xval*xratio;
                    if ((count++ % modfactor) == 0)
                        fprintf(stderr,"   DIAL3:    yvalue=%d    ywinpos=%d\n",
                                                    yval,           round(ypos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL2, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL3, (short) yval, 0, ymaxscrn);
                    curdial = 3;
                    dbtext("DIAL 3");
                }
                break;
            case DIAL4:
                if (curdial == 4) {
                    color(4);
                    xval = getvaluator(DIAL4);
                    yval = getvaluator(DIAL5);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) 
                        fprintf(stderr,"    DIAL4:  xvalue=%d  xwinpos=%d\n",
                                                    xval,        round(xpos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL4, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL5, (short) yval, 0, ymaxscrn);
                    curdial = 4;
                    dbtext("DIAL 4");
                }
                break;
            case DIAL5:
                if (curdial == 5) {
                    color(5);
                    xval = getvaluator(DIAL4);
                    yval = getvaluator(DIAL5);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) 
                        fprintf(stderr,"     DIAL5:    yvalue=%d    ywinpos=%d\n",
                                                    yval,             round(ypos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL4, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL5, (short) yval, 0, ymaxscrn);
                    curdial = 5;
                    dbtext("DIAL 5");
                }
                break;
            case DIAL6:
                if (curdial == 6) {
                    color(6);
                    xval = getvaluator(DIAL6);
                    yval = getvaluator(DIAL7);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0) 
                        fprintf(stderr,"      DIAL6:  xvalue=%d  xwinpos=%d\n",
                                                    xval,          round(xpos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL6, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL7, (short) yval, 0, ymaxscrn);
                    curdial = 6;
                    dbtext("DIAL 6");
                }
                break;
            case DIAL7:
                if (curdial == 7) {
                    color(7);
                    xval = getvaluator(DIAL6);
                    yval = getvaluator(DIAL7);
                    xpos = xval*xratio;
                    ypos = yval*yratio;
                    if ((count++ % modfactor) == 0)
                        fprintf(stderr,"       DIAL7:    yvalue=%d    ywinpos=%d\n",
                                                    yval,               round(ypos));
                    draw2(xpos,ypos);
                } else {
                    setvaluator(DIAL6, (short) xval, 0, xmaxscrn);
                    setvaluator(DIAL7, (short) yval, 0, ymaxscrn);
                    curdial = 7;
                    dbtext("DIAL 7");
                }
                break;
        }
    }
}
 
 
init_win() {

    reshapeviewport();
    getsize(&sx,&sy);
    viewport(0,sx-1,0,sy-1);
    ortho2(-0.5,sx-0.5,-0.5,sy-0.5);
    color(44);
    clear();
    xratio = ((float) sx-1)/xmaxscrn;
    yratio = ((float) sy-1)/ymaxscrn;
}

--
                                             daveus rattus   

                                   yer friendly neighborhood ratman

                              KOYAANISQATSI

   ko.yan.nis.qatsi (from the Hopi Language)  n.  1. crazy life.  2. life
       in turmoil.  3. life out of balance.  4. life disintegrating.  
         5. a state of life that calls for another way of living.