Home | History | Annotate | Line # | Download | only in bellctrl
bellctrl.c revision 1.3
      1 /*	$NetBSD: bellctrl.c,v 1.3 2001/12/27 02:23:26 wiz Exp $	*/
      2 
      3 /*
      4  * bellctrl - OPM bell controller (for NetBSD/X680x0)
      5  * Copyright (c)1995 ussy.
      6  */
      7 
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 #include <ctype.h>
     11 #include <sys/file.h>
     12 #include <sys/ioctl.h>
     13 #include "../../include/opmbellio.h"
     14 #include "../../dev/opmbellvar.h"
     15 #include "../../dev/opmreg.h"
     16 
     17 #define DEFAULT -1
     18 
     19 #define nextarg(i, argv) \
     20 	argv[i]; \
     21 	if (i >= argc) \
     22 		break; \
     23 
     24 int bell_setting;
     25 char *progName;
     26 struct opm_voice voice;
     27 
     28 static struct bell_info values = {
     29     DEFAULT, DEFAULT, DEFAULT
     30 };
     31 
     32 /* function prototype */
     33 int is_number();
     34 void set_bell_vol();
     35 void set_bell_pitch();
     36 void set_bell_dur();
     37 void set_voice_param();
     38 void set_bell_param();
     39 int usage();
     40 int error();
     41 
     42 int
     43 main(argc, argv)
     44 int argc;
     45 char **argv;
     46 {
     47     register char *arg;
     48     int percent;
     49     int i;
     50 
     51     progName = argv[0];
     52     bell_setting = 0;
     53 
     54     if (argc < 2) {
     55 	usage(NULL, NULL);
     56     }
     57 
     58     for (i = 1; i < argc; ) {
     59 	arg = argv[i++];
     60 	if (strcmp(arg, "-b") == 0) {
     61 	    set_bell_vol(0);		/* turn off bell */
     62 	} else if (strcmp(arg, "b") == 0) {
     63 	    percent = DEFAULT;		/* set bell to default */
     64 	    if (i >= argc) {
     65 		set_bell_vol(percent);		/* set bell to default */
     66 		set_bell_pitch(percent);	/* set pitch to default */
     67 		set_bell_dur(percent);		/* set duration to default */
     68 		break;
     69 	    }
     70 	    arg = nextarg(i, argv);
     71 	    if (strcmp(arg, "on") == 0) {	/* let it stay that way */
     72 		set_bell_vol(BELL_VOLUME);	/* set bell on */
     73 		set_bell_pitch(BELL_PITCH);	/* set pitch to default */
     74 		set_bell_dur(BELL_DURATION);	/* set duration to default */
     75 		i++;
     76 	    } else if (strcmp(arg, "off") == 0) {
     77 		percent = 0;			/* turn the bell off */
     78 		set_bell_vol(percent);
     79 		i++;
     80 	    } else if (is_number(arg, MAXBVOLUME)) {	/* If volume is given */
     81 		percent = atoi(arg);		/* set bell appropriately */
     82 		set_bell_vol(percent);
     83 		i++;
     84 
     85 		arg = nextarg(i, argv);
     86 		if (is_number(arg, MAXBPITCH)) {	/* if pitch is given */
     87 		    set_bell_pitch(atoi(arg));		/* set the bell */
     88 		    i++;
     89 
     90 		    arg = nextarg(i, argv);
     91 		    if (is_number(arg, MAXBTIME)) {	/* If duration is given	*/
     92 			set_bell_dur(atoi(arg));	/* set the bell */
     93 			i++;
     94 		    }
     95 		}
     96 	    } else {
     97 		set_bell_vol(BELL_VOLUME);		/* set bell to default */
     98 	    }
     99 	} else if (strcmp(arg, "v") == 0) {	/* set voice parameter */
    100 	    if (i >= argc) {
    101 		arg = "default";
    102 	    } else {
    103 		arg = nextarg(i, argv);
    104 	    }
    105 	    set_voice_param(arg, 1);
    106 	    i++;
    107 	} else if (strcmp(arg, "-v") == 0) {	/* set voice parameter */
    108 	    if (i >= argc) {
    109 		usage("missing -v argument", NULL);
    110 	    }
    111 	    arg = nextarg(i, argv);
    112 	    set_voice_param(arg, 0);
    113 	    i++;
    114 	} else {
    115 	    usage("unknown option %s", arg);
    116 	}
    117     }
    118 
    119     if (bell_setting)
    120 	set_bell_param();
    121 
    122     exit(0);
    123 }
    124 
    125 int
    126 is_number(arg, maximum)
    127 char *arg;
    128 int maximum;
    129 {
    130     register char *p;
    131 
    132     if (arg[0] == '-' && arg[1] == '1' && arg[2] == '\0')
    133 	return 1;
    134     for (p = arg; isdigit(*p); p++)
    135 	;
    136     if (*p || atoi(arg) > maximum)
    137 	return 0;
    138 
    139     return 1;
    140 }
    141 
    142 void
    143 set_bell_vol(percent)
    144 int percent;
    145 {
    146     values.volume = percent;
    147     bell_setting++;
    148 }
    149 
    150 void
    151 set_bell_pitch(pitch)
    152 int pitch;
    153 {
    154     values.pitch = pitch;
    155     bell_setting++;
    156 }
    157 
    158 void
    159 set_bell_dur(duration)
    160 int duration;
    161 {
    162     values.msec = duration;
    163     bell_setting++;
    164 }
    165 
    166 void
    167 set_voice_param(path, flag)
    168 char *path;
    169 int flag;
    170 {
    171     int fd;
    172 
    173     if (flag) {
    174 	memcpy(&voice, &bell_voice, sizeof(bell_voice));
    175     } else {
    176 	if ((fd = open(path, 0)) >= 0) {
    177 	    if (read(fd, &voice, sizeof(voice)) != sizeof(voice)) {
    178 		error("cannot read voice parameter.");
    179 	    }
    180 	    close(fd);
    181 	} else {
    182 	    error("cannot open voice parameter.");
    183 	}
    184     }
    185 
    186     if ((fd = open("/dev/bell", O_RDWR)) < 0) {
    187 	error("cannot open /dev/bell");
    188     }
    189     if (ioctl(fd, BELLIOCSVOICE, &voice)) {
    190 	error("ioctl BELLIOCSVOICE failed");
    191     }
    192     close(fd);
    193 }
    194 
    195 void
    196 set_bell_param(void)
    197 {
    198     int fd;
    199     struct bell_info param;
    200 
    201     if ((fd = open("/dev/bell", O_RDWR)) < 0) {
    202 	error("cannot open /dev/bell");
    203     }
    204     if (ioctl(fd, BELLIOCGPARAM, &param)) {
    205 	error("ioctl BELLIOCGPARAM failed.");
    206     }
    207 
    208     if (values.volume == DEFAULT) {
    209 	values.volume = param.volume;
    210     }
    211     if (values.pitch == DEFAULT) {
    212 	values.pitch = param.pitch;
    213     }
    214     if (values.msec == DEFAULT) {
    215 	values.msec = param.msec;
    216     }
    217 
    218     if (ioctl(fd, BELLIOCSPARAM, &values)) {
    219 	error("ioctl BELLIOCSPARAM failed.");
    220     }
    221 
    222     close(fd);
    223 }
    224 
    225 int
    226 usage(fmt, arg)
    227 char *fmt;
    228 char *arg;
    229 {
    230     if (fmt) {
    231 	fprintf (stderr, "%s:  ", progName);
    232 	fprintf (stderr, fmt, arg);
    233 	fprintf (stderr, "\n\n");
    234     }
    235 
    236     fprintf(stderr, "usage:  %s option ...\n", progName);
    237     fprintf(stderr, "    To turn bell off:\n");
    238     fprintf(stderr, "\t-b                b off               b 0\n");
    239     fprintf(stderr, "    To set bell volume, pitch and duration:\n");
    240     fprintf(stderr, "\t b [vol [pitch [dur]]]          b on\n");
    241     fprintf(stderr, "    To restore default voice parameter:\n");
    242     fprintf(stderr, "\t v default\n");
    243     fprintf(stderr, "    To set voice parameter:\n");
    244     fprintf(stderr, "\t-v voicefile\n");
    245     exit(0);
    246 }
    247 
    248 int
    249 error(message)
    250 char *message;
    251 {
    252     fprintf(stderr, "%s: %s\n", progName, message);
    253     exit(1);
    254 }
    255 
    256