home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d1xx
/
d165
/
spudclock
/
spudclock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-22
|
33KB
|
912 lines
/*************************************************************************
*
* SPUDclock - This program does a nice little talking alarm clock
*
* This was written by Robert E. Beaty and H. Bret Young and
* are Copyright (C) 1987 by R.E.Beaty and H. Bret Young and
* The Man From S.P.U.D.
*
* v1.2
*************************************************************************/
/* Get the necessary include files for this program */
#include <exec/types.h>
#include <exec/exec.h>
#include <devices/narrator.h>
#include <devices/timer.h>
#include <libraries/translator.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <string.h>
/*
* Here are some necessary defines for processing needs
*/
#define REVISION 1
#define TASK_PRIORITY 0
/*
* Here are some necessary return codes for various routines
*/
#define NORMAL_EXIT 0
#define NORMAL_START 0
#define QUICK_EXIT -10
#define QUICK_START -20
#define CANT_OPEN_INTUITION -100
#define CANT_OPEN_TRANSLATOR -200
#define CANT_OPEN_NARRATOR -300
#define CANT_OPEN_TIMER -400
#define CREATE_PORT_PROBLEMS -500
#define CREATE_IO_PROBLEMS -600
#define TRANSLATOR_NOT_WORKING -700
/*
* Here are the variable values that come in handy
*/
#define QUARTER_HOUR 1
#define HALF_HOUR 2
#define HOUR 4
#define LITTLE 1
#define BIG 2
#define AM_BIT (1<<0)
#define PS_BIT (1<<1)
#define SA_BIT (1<<2)
#define EA_BIT (1<<3)
#define AV_BIT (1<<4)
#define S_BIT (1<<5)
/*
* Here are the global structures
*/
struct timerequest timeReq; /* this is my conduit to the timer */
struct MsgPort *clockPort = NULL, *writePort = NULL,
*replyPort = NULL, *timerPort = NULL;
struct narrator_rb *writeNarrator = NULL;
struct IntuitionBase *IntuitionBase = NULL;
struct Library *TranslatorBase = NULL;
struct DateStamp now;
struct PacketMessage {
struct Message packet_message; /* this is for DOS */
int alarm_mode, /* this will tell us how often to alarm */
prestart, /* this will tell if we prestart the speakers */
start_alarm, /* this is the starting time */
end_alarm, /* this is the ending time */
alarm_volume, /* this is how loud to make it */
quit_flag; /* this will tell when to quit */
char salutation[80]; /* this is a little saying before the time */
int change_flags,
changing,
listing;
};
/*
* Here are the global variables
*/
UBYTE *sampleInput, outputString[500]; /* these are for the translator */
SHORT rtnCode, error;
BYTE audChanMasks[4] = { 3, 5, 10, 12 }; /* which channels to use */
int signal, timer_signal, port_signal; /* where the message came from */
int alarm_mode, quit_flag, prestart, alarm_volume;
int start_alarm, end_alarm, alarm_time;
int hours_24, hours_12, minutes;
char *cp, salutation[80], alarm[120];
struct PacketMessage *incoming, *outgoing;
/************************************************************************
*
* cprintf( why ) - This routine does simple string printing to
* the console, and so saves us loading the printf
* routines.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
cprintf( arg )
char *arg;
{
int length;
length = Write( Output(), arg, strlen(arg) );
return( length );
} /* end of cprintf(); */
/************************************************************************
*
* itoa( string, value ) - This routine does simple integer to ascii
* conversion. NOTE: value < 9999 !!
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
void itoa( carg, varg )
char *carg;
int varg;
{
int place;
/* reset where I am putting this stuff */
place = 0;
if ( varg > 999 ) {
/* do the most thousands digit */
carg[place++] = '0' + (varg/1000);
varg = varg - (1000*(varg/1000));
}
if ( (varg > 99) || (place != 0) ) {
/* do the hundreds digit */
carg[place++] = '0' + (varg/100);
varg = varg - (100*(varg/100));
}
if ( (varg > 9) || (place != 0) ) {
/* do the tens digit */
carg[place++] = '0' + (varg/10);
varg = varg - (10*(varg/10));
}
/* always do the ones digit */
carg[place++] = '0' + varg;
/* null terminate this string */
carg[place] = '\0';
} /* end of itoa(); */
/************************************************************************
*
* CloseNarrator( why ) - This routine closes up the narrator and
* translator devices nicely.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
void CloseNarrator( why )
int why;
{
/* Check to see if this was called by OpenNarrator() */
if ( why != CANT_OPEN_NARRATOR ) {
if ( writeNarrator != NULL )
CloseDevice( writeNarrator );
}
/* Just start deleting things if they exist */
if ( writeNarrator != NULL )
DeleteExtIO( writeNarrator, sizeof(struct narrator_rb) );
if ( writePort != NULL )
DeletePort( writePort );
if ( TranslatorBase != NULL )
CloseLibrary( TranslatorBase );
} /* end of CloseNarrator(); */
/************************************************************************
*
* OpenNarrator() - This routine opens up the narrator and translator
* devices nicely. It will return non-FALSE if an error
* occured.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
OpenNarrator( )
{
int error;
/* Open up the translator first */
TranslatorBase = (struct Library *) OpenLibrary( "translator.library", REVISION );
if ( TranslatorBase == NULL )
return( CANT_OPEN_TRANSLATOR );
/* test it */
sampleInput = "this is a test.";
rtnCode = Translate( sampleInput, strlen(sampleInput), outputString, 500 );
if ( rtnCode != 0 ) {
CloseLibrary( TranslatorBase ); /* this is open, so close */
return( TRANSLATOR_NOT_WORKING );
} /* end of error checking the translator */
/* Create the port to the Narrator */
writePort = (struct MsgPort *) CreatePort( "SPUDclock.narrator", TASK_PRIORITY );
if ( writePort == NULL ) {
CloseLibrary( TranslatorBase ); /* this is open, so close */
return( CREATE_PORT_PROBLEMS );
} /* end of error checking the port creation */
/* Open an I/O channel to the Narrator */
writeNarrator = (struct narrator_rb *) CreateExtIO( writePort, sizeof(struct narrator_rb) );
if ( writeNarrator == NULL ) {
DeletePort( writePort ); /* this port is open */
CloseLibrary( TranslatorBase ); /* this is open, so close */
return( CREATE_IO_PROBLEMS );
} /* end of error checking I/O creation */
/* Now set up the defaults for the narrator port */
writeNarrator->ch_masks = audChanMasks; /* ... the channel masks */
writeNarrator->nm_masks = sizeof(audChanMasks); /* ... the size */
writeNarrator->message.io_Data = (APTR)outputString; /* data */
writeNarrator->mouths = 0; /* we don't want shapes computed */
writeNarrator->message.io_Command = CMD_WRITE; /* output command */
/* Finally, open the narrator device */
error = OpenDevice( "narrator.device", 0, writeNarrator, TASK_PRIORITY );
if ( error != 0 ) {
CloseNarrator( CANT_OPEN_NARRATOR ); /* close it all up */
return( CANT_OPEN_NARRATOR );
} /* end of checking narrator device opening */
/* no errors so return FALSE */
return( FALSE );
} /* end of OpenNarrator(); */
/************************************************************************
*
* init( how ) - This routine opens everything up and returns non-FALSE
* if something went wrong.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
init( how )
int how;
{
int error;
/* Open up Intuition first */
if ( IntuitionBase == NULL ) {
IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", REVISION );
if ( IntuitionBase == NULL )
return( CANT_OPEN_INTUITION );
} /* end of opening intuition if needed */
/* if this is a quick start, then only open up intuition */
if ( how == QUICK_START ) return( FALSE );
/* Open the communication port to other copies of SPUDclock */
clockPort = (struct MsgPort *) CreatePort( "SPUDclock", TASK_PRIORITY );
if ( clockPort == NULL ) {
CloseLibrary( IntuitionBase ); /* this is open, so close */
return( CREATE_PORT_PROBLEMS );
} /* end of error checking the port creation */
/* Now open the narrator */
error = OpenNarrator();
if ( error ) {
DeletePort( clockPort );
CloseLibrary( IntuitionBase );
return( error );
} /* end of error checking the narrator opening */
/* Now create the timer */
timerPort = (struct MsgPort *) CreatePort( "SPUDclock.timer", TASK_PRIORITY );
if ( timerPort == NULL ) {
CloseNarrator( CANT_OPEN_TIMER );
DeletePort( clockPort );
CloseLibrary( IntuitionBase ); /* this is open, so close */
return( CREATE_PORT_PROBLEMS );
} /* end of error checking the port creation */
error = OpenDevice( TIMERNAME, UNIT_VBLANK, (char *) &timeReq, TASK_PRIORITY );
if ( error != 0 ) {
DeletePort( timerPort );
CloseNarrator( CANT_OPEN_TIMER );
DeletePort( clockPort );
CloseLibrary( IntuitionBase ); /* this is open, so close */
return( CANT_OPEN_TIMER );
}
/* Everything is open O.K., so get the signal bits */
timer_signal = 1 << timerPort->mp_SigBit;
port_signal = 1 << clockPort->mp_SigBit;
/* ... and set up the timer request structure */
timeReq.tr_node.io_Message.mn_ReplyPort = timerPort;
timeReq.tr_node.io_Command = TR_ADDREQUEST;
timeReq.tr_node.io_Flags = 0;
timeReq.tr_node.io_Error = 0;
/* no errors, so return FALSE */
return( FALSE );
} /* end of init(); */
/************************************************************************
*
* clean( why ) - This routine cleans everything up.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
void clean( why )
int why;
{
/* Abort the timer request pending */
if ( timeReq.tr_node.io_Message.mn_ReplyPort != NULL )
AbortIO( (char *) &timeReq.tr_node );
/* if we want a quick exit then skip this stuff */
if ( why == QUICK_EXIT ) goto quick;
/* just call the clean up routines */
if ( timerPort != NULL ) DeletePort( timerPort );
CloseNarrator( why );
if ( clockPort != NULL ) DeletePort( clockPort );
quick:
if ( IntuitionBase != NULL ) CloseLibrary( IntuitionBase );
} /* end of clean(); */
/************************************************************************
*
* bed_bye( how_much ) - This routine submits a timer event for us
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
void bed_bye( how_much )
int how_much;
{
/* See how long the sleep is for */
if ( how_much == LITTLE ) {
timeReq.tr_time.tv_secs = 5; /* little is 5 sec. */
timeReq.tr_time.tv_micro = 0;
}
else {
timeReq.tr_time.tv_secs = 885; /* big is 14 min 45 sec. */
timeReq.tr_time.tv_micro = 0;
}
/* ... and send it out to be done */
SendIO( (char *) &timeReq.tr_node );
} /* end of bed_bye(); */
/************************************************************************
*
* speak_time( hrs, mins ) - This routine formats and speaks the time.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
************************************************************************/
void speak_time( hrs, mins )
int hrs, mins;
{
/*
* First, see if we need to prestart the speakers
*/
if ( prestart )
cp = stpcpy( alarm, "t,," );
else
cp = alarm;
/*
* Build up the string to speak
*/
/* start with the salutation */
cp = stpcpy( cp, salutation );
/* ... add the time is stuff */
cp = stpcpy( cp, ", It is now " );
/* check for quarter till */
if ( (alarm_mode == QUARTER_HOUR) && (mins == 45) ) {
cp = stpcpy( cp, "quarter till " );
/* check to see that it makes sense */
if ( (++hrs) == 13 ) hrs = 1;
}
/*
* always add the hour
*/
switch( hrs ) {
case 1 : cp = stpcpy( cp, "1 " ); break;
case 2 : cp = stpcpy( cp, "2 " ); break;
case 3 : cp = stpcpy( cp, "3 " ); break;
case 4 : cp = stpcpy( cp, "4 " ); break;
case 5 : cp = stpcpy( cp, "5 " ); break;
case 6 : cp = stpcpy( cp, "6 " ); break;
case 7 : cp = stpcpy( cp, "7 " ); break;
case 8 : cp = stpcpy( cp, "8 " ); break;
case 9 : cp = stpcpy( cp, "9 " ); break;
case 10 : cp = stpcpy( cp, "ten " ); break;
/* the number 11 sounds better spelled 'eelaven' */
case 11 : cp = stpcpy( cp, "eelaven " ); break;
case 12 : cp = stpcpy( cp, "twelve " ); break;
} /* end of decoding the hours */
/*
* decode the different modes
*/
switch( alarm_mode ) {
case QUARTER_HOUR :
switch( mins ) {
case 0 : cp = stpcpy( cp, "o'clock." ); break;
case 15 : cp = stpcpy( cp, "fifteen." ); break;
case 30 : cp = stpcpy( cp, "thirty." ); break;
case 45 : cp = stpcpy( cp, "." ); break;
/* if we aren't where we are supposed to be, NULL it out */
default : cp = NULL; break;
}
break;
case HALF_HOUR :
switch( mins ) {
case 0 : cp = stpcpy( cp, "o'clock." ); break;
case 30 : cp = stpcpy( cp, "thirty." ); break;
/* if we aren't where we are supposed to be, NULL it out */
default : cp = NULL; break;
}
break;
case HOUR :
if ( mins == 0 )
cp = stpcpy( cp, "o'clock." );
else
/* if we aren't where we are supposed to be, NULL it out */
cp = NULL;
break;
} /* end of alarm_mode selection */
/*
* If the time section is not NULL, do the rest
*/
if ( cp != NULL ) {
/*
* ... add the "Good morning..." or "Good night..."
*/
if ( start_alarm != end_alarm ) {
if ( alarm_time == start_alarm )
cp = stpcpy( cp, ",, Good Morning!" );
if ( alarm_time == end_alarm )
cp = stpcpy( cp, ",, Good Night." );
} /* end of special salutation */
/*
* translate it and speak it
*/
rtnCode = Translate( alarm, strlen(alarm), outputString, 500 );
writeNarrator->sex = MALE;
writeNarrator->pitch = DEFPITCH;
writeNarrator->mode = ROBOTICF0;
writeNarrator->volume = alarm_volume;
writeNarrator->message.io_Data = (APTR)outputString;
writeNarrator->message.io_Length = strlen( outputString );
DoIO( writeNarrator );
} /* end of finishing it up and speaking it */
} /* end of speak_time(); */
/************************************************************************
*
* usage() - This routine helps the user.
*
* This code section was written by Robert E. Beaty and
* are Copyright (C) 1987 by R.E.Beaty and The Man From S.P.U.D.
*
* minimal additions by H. Bret Young
*
************************************************************************/
usage( how_much )
int how_much;
{
cprintf( "Usage:\n" );
cprintf( " run SPUDclock [-m greeting message] [-f] [-t] [-h] [-q] [-p] [-s ####] [-e ####] [-v ##]\n" );
if ( how_much == LITTLE ) return( FALSE );
cprintf( "Where:\n" );
cprintf( " -m greeting message - this will be spoken before the time\n" );
cprintf( " -f - this will cause the alarm to sound every quarter hour\n" );
cprintf( " -t - this will cause the alarm to sound every half hour\n" );
cprintf( " -h - this will cause the alarm to sound every hour\n" );
cprintf( " -p - this will make the alarm contain a 't' to start speakers\n" );
cprintf( " -s #### - this will set the starting time to this time (2400 hr.)\n" );
cprintf( " -e #### - this will set the ending time to this time (2400 hr.)\n" );
cprintf( " -v ## - this will set the alarm volume to this (>0 and <=64)\n" );
cprintf( " -q - this will remove all copies of SPUDclock from memory\n" );
cprintf( " -l - this will list the current SPUDclock settings\n");
cprintf( " -d - this will cause the parameters not specified on the\n");
cprintf( " command line to revert to their defaults\n");
return( FALSE );
} /* end of usage(); */
/************************************************************************
*
* print_settings() - This routine prints the current SPUDclock settings
*
* This section was written by H. Bret Young
* are Copyright (C) 1987 by H. Bret Young and The Man From S.P.U.D.
*
************************************************************************/
void print_settings()
{
char out[5];
cprintf("SPUDclock settings \n\n");
cprintf(" The alarm will sound ");
switch (alarm_mode) {
case QUARTER_HOUR :
cprintf("every QUARTER HOUR\n");
break;
case HALF_HOUR :
cprintf("every HALF HOUR\n");
break;
case HOUR :
cprintf("every HOUR\n");
break;
}
if (prestart)
cprintf(" The speakers WILL be prestarted\n");
else
cprintf(" The speakers WILL NOT be prestarted\n");
cprintf(" The clock will begin at ");
itoa(out,start_alarm);
cprintf(out); cprintf("\n");
cprintf(" The clock will stop at ");
itoa(out,end_alarm);
cprintf(out); cprintf("\n");
cprintf(" The alarm volume is ");
itoa(out,alarm_volume);
cprintf(out); cprintf("\n");
cprintf(" The alarm salutation is :\n");
cprintf(" ");
cprintf(salutation); cprintf("\n");
}
/************************************************************************
*
* Main section of SPUDclock...
*
* This and all code sections were written by Robert E. Beaty and
* H. Bret Young are Copyright (C) 1987 by H. Bret Young and R.E.Beaty
* and The Man From S.P.U.D.
*
************************************************************************/
main( argc, argv )
int argc;
char *argv[];
{
int i;
int change_flags,
changing,
listing;
/*
*
* Set the defaults
*
*/
alarm_mode = HALF_HOUR; /* do it every 30 minutes */
prestart = FALSE; /* don't prestart the speakers */
start_alarm = 830; /* start at 8:30 am */
end_alarm = 2300; /* end at 11:00 pm */
alarm_volume = 50; /* not too loud */
stpcpy( salutation, " " ); /* no salutation to start off */
cp = salutation; /* this is for the argument processing */
quit_flag = FALSE; /* we aren't stopping yet */
change_flags = 0;
changing = FALSE;
listing = FALSE;
/*
*
* Decode the arguments
*
*/
for ( i=1; i < argc; i++ ) {
/* check the options */
if ( argv[i][0] == '-' ) {
/* decode the options */
switch( argv[i][1] ) {
case 'f' :
change_flags |= AM_BIT;
alarm_mode = QUARTER_HOUR;
break;
case 't' :
change_flags |= AM_BIT;
alarm_mode = HALF_HOUR;
break;
case 'h' :
change_flags |= AM_BIT;
alarm_mode = HOUR;
break;
case 'q' :
quit_flag = TRUE;
break;
case 'p' :
change_flags |= PS_BIT;
prestart = TRUE;
break;
case 's' :
change_flags |= SA_BIT;
i++; /* move to the next argument, the time */
start_alarm = 0;
while((*argv[i] >= '0') && (*argv[i] <= '9'))
start_alarm = (start_alarm * 10) + *argv[i]++ - '0';
break;
case 'e' :
change_flags |= EA_BIT;
i++; /* move to the next argument, the time */
end_alarm = 0;
while((*argv[i] >= '0') && (*argv[i] <= '9'))
end_alarm = (end_alarm * 10) + *argv[i]++ - '0';
break;
case 'v' :
change_flags |= AV_BIT;
i++; /* move to the next argument, the volume */
alarm_volume = 0;
while((*argv[i] >= '0') && (*argv[i] <= '9'))
alarm_volume = (alarm_volume * 10) + *argv[i]++ - '0';
break;
case 'm' :
change_flags |= S_BIT;
/* read in the salutation a word at a time */
for ( i=i; (argv[i+1][0] != '-') && (i < argc); i++ ) {
cp = stpcpy( cp, argv[i+1] );
cp = stpcpy( cp, " ");
}
break;
case 'l' :
listing = TRUE;
break;
case 'd' :
changing = TRUE;
break;
default :
usage( LITTLE ); /* show him the small usage */
exit( TRUE );
break;
} /* end of decoding the options */
} /* end of checking the options */
else {
usage( BIG ); /* he needs lots of help */
exit( TRUE );
}
} /* end of decoding the arguments */
/*
*
* O.K. all arguments are decoded, so let's see if one copy of
* SPUDclock already exists
*
*/
/* Assume one does and do just a quick start */
if ( (error=init( QUICK_START )) != FALSE ) {
if ( error == CANT_OPEN_INTUITION ) {
cprintf( "Sorry, but I cannot open a copy of Intuition!\n" );
cprintf( "Please check your DEVS: directory or reboot.\n" );
} /* end of printing the error message */
exit( error );
} /* end of error checking for the initial start */
clockPort = (struct MsgPort *) FindPort( "SPUDclock" );
if ( clockPort != NULL ) {
/* Allocate the memory for the message to the other SPUDclock */
outgoing = (struct PacketMessage *) AllocMem( sizeof(struct PacketMessage), MEMF_PUBLIC );
if ( outgoing == NULL ) {
cprintf( "Sorry, There is not enough memory to send the message\n" );
cprintf( "to the running copy of SPUDclock. You will probably\n" );
cprintf( "have to re-boot the machine to change the running copy\n" );
cprintf( "of SPUDclock.\n" );
clean( QUICK_EXIT );
exit( TRUE );
} /* end of error checking the message allocation */
/* Allocate the reply port for this message */
replyPort = (struct MsgPort *) CreatePort( "SPUDclock.reply.port", TASK_PRIORITY );
if ( replyPort == NULL ) {
cprintf( "Sorry, There are not enough free resources to send the\n" );
cprintf( "message to the running copy of SPUDclock. You will probably\n" );
cprintf( "have to re-boot the machine to change the running copy\n" );
cprintf( "of SPUDclock.\n" );
/* free everything up */
FreeMem( outgoing, sizeof(struct PacketMessage) );
clean( QUICK_EXIT );
exit( TRUE );
} /* end of error checking for port creation */
/*
* Now set this message packet so that it will do the job
*/
outgoing->packet_message.mn_Node.ln_Type = NT_MESSAGE;
outgoing->packet_message.mn_ReplyPort = replyPort;
outgoing->packet_message.mn_Length = sizeof( struct PacketMessage );
/* Get the status from the packet */
outgoing->alarm_mode = alarm_mode;
outgoing->prestart = prestart;
outgoing->start_alarm = start_alarm;
outgoing->end_alarm = end_alarm;
outgoing->alarm_volume = alarm_volume;
stpcpy( outgoing->salutation, salutation );
outgoing->quit_flag = quit_flag;
outgoing->change_flags = change_flags;
outgoing->changing = changing;
outgoing->listing = listing;
/*
* Send it, wait for a reply, and then dispose of all of it
*/
PutMsg( clockPort, outgoing );
WaitPort( replyPort );
/* free everything up */
DeletePort( replyPort );
FreeMem( outgoing, sizeof(struct PacketMessage) );
clean( QUICK_EXIT );
exit( TRUE );
} /* end of passing arguments to the running SPUDclock */
/* Print a copyright notice */
cprintf( "SPUDclock v1.2 - Copyright 1987 by The Man From S.P.U.D.\n" );
if (listing) print_settings();
/* If quitting was our only motive, then quit */
if ( quit_flag ) {
clean( QUICK_EXIT );
exit( FALSE );
} /* end of quick quit */
/* We need to do a normal start */
if ( (error=init( NORMAL_START )) != FALSE ) {
/* decode the error */
switch ( error ) {
case CANT_OPEN_INTUITION :
cprintf( "Sorry, but I cannot open a copy of Intuition!\n" );
cprintf( "Please check your DEVS: directory or reboot.\n" );
break;
case CANT_OPEN_TRANSLATOR :
cprintf( "Sorry, but I cannot open a copy of the\n" );
cprintf( "Translator device! Please check your DEVS:\n" );
cprintf( "directory for the narrator.device file\n" );
cprintf( "and/or reboot.\n" );
break;
case CANT_OPEN_NARRATOR :
cprintf( "Sorry, but I cannot open a copy of the\n" );
cprintf( "Narrator device! Please check your DEVS:\n" );
cprintf( "directory for the narrator.device file\n" );
cprintf( "and/or reboot.\n" );
break;
case CANT_OPEN_TIMER :
cprintf( "Sorry, but I cannot open a copy of the\n" );
cprintf( "Timer device! Please check your DEVS:\n" );
cprintf( "directory and/or reboot.\n" );
break;
case CREATE_PORT_PROBLEMS :
cprintf( "Sorry, There are not enough free resources to open the\n" );
cprintf( "message ports required. You will probably have to re-boot\n" );
cprintf( "the machine to run SPUDclock.\n" );
break;
case CREATE_IO_PROBLEMS :
cprintf( "Sorry, There are not enough free resources to open the\n" );
cprintf( "I/O ports required. You will probably have to re-boot\n" );
cprintf( "the machine to run SPUDclock.\n" );
break;
case TRANSLATOR_NOT_WORKING :
cprintf( "Sorry, but the Translator device does not seem to be working\n" );
cprintf( "at this time. The only suggestion is to re-boot the machine\n" );
cprintf( "and/or get a fresh copy of narrator.device into DEVS:.\n" );
break;
default :
cprintf( "Sorry, but SPUDclock has returned an error.\n" );
cprintf( "Please try running it again.\n" );
break;
} /* end of decoding the error and printing the error message */
exit( error );
} /* end of error checking the start-up of the original copy */
/* Submit a little sleep */
bed_bye( LITTLE );
while( TRUE ) {
/*
* Now wait until something wakes us up
*/
signal = Wait( timer_signal | port_signal );
/*
*
* ... check the timer
*
*/
if ( signal & timer_signal ) {
/* get the message out of the way */
(void) GetMsg( timerPort );
/* Get the time now */
DateStamp( &now );
/* Get the time into hours and minutes */
hours_24 = now.ds_Minute / 60;
hours_12 = ( now.ds_Minute / 60 ) % 12;
if ( hours_12 == 0 ) hours_12 = 12; /* make it simple 12 hour */
minutes = now.ds_Minute % 60;
/*
* See if we are synced up yet
*/
if ( (minutes == 0) || (minutes == 15) || (minutes == 30) || (minutes == 45) ) {
/* submit a nice long wake up call */
bed_bye( BIG );
/*
* Now see if we need to output this to the speakers
*/
alarm_time = hours_24 * 100 + minutes;
if ( (alarm_time >= start_alarm) && (alarm_time <= end_alarm) )
speak_time( hours_12, minutes );
} /* end of processing for synced up */
else {
/* submit another wake up call soon */
bed_bye( LITTLE );
} /* end of processing for not synced up */
} /* end of processing the timer signal */
/*
*
* ... check the clock port
*
*/
if ( signal & port_signal ) {
/* Get the message */
incoming = (struct PacketMessage *) GetMsg( clockPort );
/* Get the status from the packet */
changing = incoming->changing;
change_flags = incoming->change_flags;
listing = incoming->listing;
quit_flag = incoming->quit_flag;
switch (changing) {
case FALSE :
if (change_flags & AM_BIT)
alarm_mode = incoming->alarm_mode;
if (change_flags & PS_BIT)
prestart = incoming->prestart;
if (change_flags & SA_BIT)
start_alarm = incoming->start_alarm;
if (change_flags & EA_BIT)
end_alarm = incoming->end_alarm;
if (change_flags & AV_BIT)
alarm_volume = incoming->alarm_volume;
if (change_flags & S_BIT)
stpcpy( salutation, incoming->salutation );
break;
case TRUE :
alarm_mode = incoming->alarm_mode;
prestart = incoming->prestart;
start_alarm = incoming->start_alarm;
end_alarm = incoming->end_alarm;
alarm_volume = incoming->alarm_volume;
stpcpy( salutation, incoming->salutation );
break;
}
if (listing) print_settings();
/* since we didn't allocate this message, we must reply */
ReplyMsg( incoming );
/*
* If the quit flag is set then we need to leave
*/
if ( quit_flag ) {
clean( NORMAL_EXIT ); /* clean all this up */
exit( FALSE );
} /* end of quitting */
} /* end of processing the port signal */
} /* end of main loop */
/* we need this to keep the compiler happy */
return( FALSE );
} /* end of SPUDclock(); */