home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 607.lha / WizardClock_v1.20 / source.lzh / WizardClock.c < prev   
C/C++ Source or Header  |  1991-11-13  |  35KB  |  1,353 lines

  1. /**
  2. ***    WizardClock v1.20
  3. ***    An international calendar clock with WB2.0 design
  4. ***    Written by Stefan Zeiger in Jul-Nov/1991
  5. ***    Released into the Public Domain by ! WIZARD WORKS ! in 1991
  6. ***    Compiler: SAS/C 5.10a (The very, very best !!!)
  7. ***
  8. ***    Hi, programmer !
  9. ***    I actually wrote WizardClock as an exercise in Workbench 2.0 design.
  10. ***    I've also included some other graphical elements, which aren't used in
  11. ***    WizardClock. Feel free to use those graphx and parts of this program
  12. ***    in your own projects. I've taken the know-how for the timer-device
  13. ***    programming from Jonathan Potter's "JPClock". If you want to use
  14. ***    WizardClock in a commercial product, please let me know it. And,
  15. ***    please, leave my name in it. Thank you. If you want to recompile
  16. ***    WizardClock, you need the file "umain.c" from the "source" directory of
  17. ***    SAS/C 5.10a. Compile it with a "#define TINY" at the beginning of the
  18. ***    source code and a command like
  19. ***                  "lc -v -O -ctusr -m0t -d0 -oTinyMain.o umain.c".
  20. ***    Then put the object code to the WizardClock source codes and execute
  21. ***    "LMK". Have fun with this clock, and happy programming,
  22. ***                                                            Stefan.
  23. ***
  24. **/
  25.  
  26.  
  27. /* --------------------------------------------------------------- INCLUDES */
  28.  
  29. #include <exec/types.h>
  30. #include <exec/memory.h>
  31. #include <exec/tasks.h>
  32. #include <graphics/gfxbase.h>
  33. #include <graphics/gfx.h>
  34. #include <graphics/gfxmacros.h>
  35. #include <intuition/intuitionbase.h>
  36. #include <intuition/intuition.h>
  37. #include <libraries/dos.h>
  38. #include <libraries/dosextens.h>
  39. #include <devices/audio.h>
  40. #include <devices/timer.h>
  41. #include <proto/intuition.h>
  42. #include <proto/graphics.h>
  43. #include <proto/exec.h>
  44. #include <proto/dos.h>
  45. #include <proto/timer.h>
  46. #include <string.h>
  47. #include <stdlib.h>
  48. #include <stdio.h>
  49. #include <time.h>
  50. #include <ctype.h>
  51. #include "Toggle1.h"
  52. #include "Toggle2.h"
  53. #include "DrawGads.h"
  54. #include "Icons.h"
  55. #include "Multiple1.h"
  56. #include "Multiple3.h"
  57. #include "Sinus.h"
  58.  
  59.  
  60. /* ---------------------------------------------------------------- DEFINES */
  61.  
  62. #define LANGUAGE   1
  63. #define CALENDAR   2
  64. #define ANALOG     3
  65. #define DIGITAL    4
  66. #define ABOUT      5
  67.  
  68. #define GADGOFF   14
  69. #define ALARMOFF 102
  70.  
  71. #define ANALOGX  130
  72. #define ANALOGY   77
  73.  
  74.  
  75. /* ------------------------------------------------- DISK ACCESS PROTOTYPES */
  76.  
  77. #ifndef __ARGS
  78. #ifdef NARGS
  79. #define __ARGS(a) ()
  80. #else
  81. #define __ARGS(a) a
  82. #endif
  83. #endif
  84.  
  85. extern int open __ARGS((char *, int, ));
  86. extern int write __ARGS((int, void *, unsigned));
  87. extern int close __ARGS((int));
  88.  
  89.  
  90. /* ------------------------------------------------ DISABLE CTRL-C HANDLING */
  91.  
  92. int CXBRK(void) { return(0); }
  93. int chkabort(void) { return(0); }
  94.  
  95.  
  96. /* -------------------------------------------------------------- LSR STUFF */
  97.  
  98. long _stack = 4000;
  99. char *_procname = "WizardClock";
  100. long _priority = 0;
  101. long _BackGroundIO = 1;
  102. extern BPTR _Backstdout;
  103.  
  104.  
  105. /* ------------------------------------------------ LIBRARY BASE STRUCTURES */
  106.  
  107. struct IntuitionBase *IntuitionBase=NULL;
  108. struct GfxBase *GfxBase=NULL;
  109.  
  110.  
  111. /* -------------------------------------------- LANGUAGE SPECIFIC TEXT DATA */
  112.  
  113. char *English[]=
  114. {
  115.   /* 00 */  "Sunday    ","Monday    ","Tuesday   ","Wednesday ",
  116.   /* -- */  "Thursday  ","Friday    ","Saturday  ",
  117.   /* 07 */  "Jan","Feb","Mar","Apr","May","Jun",
  118.   /* -- */  "Jul","Aug","Sep","Oct","Nov","Dec",
  119.   /* 19 */  "Mo","Tu","We","Th","Fr","Sa","Su",
  120.   /* 26 */  "Day of the year :","Total    :","by  Stefan Zeiger",
  121.   /* 29 */  "Released as Public","   Domain by :   ","Voice: (49)-6188-2525",
  122.   /* 30 */  "Alarm:"
  123. };
  124.  
  125. char *German[]=
  126. {
  127.   /* 00 */  "Sonntag   ","Montag    ","Dienstag  ","Mittwoch  ",
  128.   /* -- */  "Donnerstag","Freitag   ","Samstag   ",
  129.   /* 07 */  "Jan","Feb","Mär","Apr","Mai","Jun",
  130.   /* -- */  "Jul","Aug","Sep","Okt","Nov","Dez",
  131.   /* 19 */  "Mo","Di","Mi","Do","Fr","Sa","So",
  132.   /* 26 */  "Tag des Jahres : ","Gesamt   :","von Stefan Zeiger",
  133.   /* 29 */  "Als  Public Domain","freigegeben von :","Tel.:  (49)-6188-2525",
  134.   /* 30 */  "Alarm:"
  135. };
  136.  
  137. char *French[]=
  138. {
  139.   /* 00 */  "Dimanche  ","Lundi     ","Mardi     ","Mercredi  ",
  140.   /* -- */  "Jeudi     ","Vendredi  ","Samedi    ",
  141.   /* 07 */  "Jan","Fév","Mar","Avr","Mai","Jun",
  142.   /* -- */  "Jul","Aoû","Sep","Oct","Nov","Déc",
  143.   /* 19 */  "Lu","Ma","Me","Je","Ve","Sa","Di",
  144.   /* 26 */  "Jour dans l'an : ","Environ  :","par Stefan Zeiger",
  145.   /* 29 */  "Placé dans  le do-","maine public par:","   (49)-6188-2525    ",
  146.   /* 30 */  "Alarme"
  147. };
  148.  
  149. char **Language=English;
  150.  
  151.  
  152. /* ------------------------------------------------------ GADGET STRUCTURES */
  153.  
  154. UBYTE alarm_buffer[10]="00:00:00 ";
  155. UBYTE alarm_undo_buffer[10];
  156. struct StringInfo alarm_string_info={alarm_buffer,alarm_undo_buffer,0,10,0,0,0,0,0,0,NULL,NULL,NULL};
  157. struct Gadget alarm_gadget=
  158. {
  159.   NULL,
  160.   ALARMOFF+6,103,64,8,
  161.   GADGHCOMP,
  162.   RELVERIFY,
  163.   STRGADGET,
  164.   NULL,                 /* GadgetRender */
  165.   NULL,                 /* SelectRender */
  166.   NULL,NULL,(APTR) &alarm_string_info,0,NULL
  167. };
  168.  
  169. struct Gadget isalarm_gadget=
  170. {
  171.   NULL,
  172.   ALARMOFF+85,      /* LeftEdge      */
  173.   101,              /* TopEdge       */
  174.   26,               /* Width         */
  175.   11,               /* Height        */
  176.   GADGHIMAGE|
  177.   GADGIMAGE,
  178.   GADGIMMEDIATE|
  179.   TOGGLESELECT,
  180.   BOOLGADGET,
  181.   (APTR)&tog1_image,(APTR)&tog2_image,
  182.   NULL,             /* GadgetText    */
  183.   NULL,             /* MutualExclude */
  184.   NULL,             /* SpecialInfo   */
  185.   0,                /* GadgetID      */
  186.   NULL              /* UserData      */
  187. };
  188.  
  189. struct Gadget l3_gadget=   /* FRENCH */
  190. {
  191.   NULL,
  192.   40,               /* LeftEdge      */
  193.   50,               /* TopEdge       */
  194.   17,               /* Width         */
  195.    7,               /* Height        */
  196.   GADGHNONE,
  197.   GADGIMMEDIATE|
  198.   RELVERIFY,
  199.   BOOLGADGET,
  200.   NULL,NULL,
  201.   NULL,             /* GadgetText    */
  202.   NULL,             /* MutualExclude */
  203.   NULL,             /* SpecialInfo   */
  204.   0,                /* GadgetID      */
  205.   NULL              /* UserData      */
  206. };
  207.  
  208. struct Gadget l2_gadget=   /* GERMAN */
  209. {
  210.   &l3_gadget,
  211.   40,               /* LeftEdge      */
  212.   40,               /* TopEdge       */
  213.   17,               /* Width         */
  214.    7,               /* Height        */
  215.   GADGHNONE,
  216.   GADGIMMEDIATE|
  217.   RELVERIFY,
  218.   BOOLGADGET,
  219.   NULL,NULL,
  220.   NULL,             /* GadgetText    */
  221.   NULL,             /* MutualExclude */
  222.   NULL,             /* SpecialInfo   */
  223.   0,                /* GadgetID      */
  224.   NULL              /* UserData      */
  225. };
  226.  
  227. struct Gadget l1_gadget=  /* ENGLISH */
  228. {
  229.   &l2_gadget,       /* NextGadget    */
  230.   40,               /* LeftEdge      */
  231.   30,               /* TopEdge       */
  232.   17,               /* Width         */
  233.    7,               /* Height        */
  234.   GADGHNONE,
  235.   GADGIMMEDIATE|
  236.   RELVERIFY,
  237.   BOOLGADGET,
  238.   NULL,NULL,
  239.   NULL,             /* GadgetText    */
  240.   NULL,             /* MutualExclude */
  241.   NULL,             /* SpecialInfo   */
  242.   0,                /* GadgetID      */
  243.   NULL              /* UserData      */
  244. };
  245.  
  246. struct Gadget p6_gadget=
  247. {
  248.   &l1_gadget,       /* NextGadget    */
  249.   GADGOFF+200,      /* LeftEdge      */
  250.   130,              /* TopEdge       */
  251.   32,               /* Width         */
  252.   16,               /* Height        */
  253.   GADGHCOMP,        /* Flags         */
  254.   RELVERIFY,        /* Activation    */
  255.   BOOLGADGET,       /* GadgetType    */
  256.   NULL,             /* GadgetRender  */
  257.   NULL,             /* SelectRender  */
  258.   NULL,             /* GadgetText    */
  259.   NULL,             /* MutualExclude */
  260.   NULL,             /* SpecialInfo   */
  261.   0,                /* GadgetID      */
  262.   NULL              /* UserData      */
  263. };
  264.  
  265. struct Gadget p5_gadget=
  266. {
  267.   &p6_gadget,       /* NextGadget    */
  268.   GADGOFF+160,      /* LeftEdge      */
  269.   130,              /* TopEdge       */
  270.   32,               /* Width         */
  271.   16,               /* Height        */
  272.   GADGHCOMP,        /* Flags         */
  273.   RELVERIFY,        /* Activation    */
  274.   BOOLGADGET,       /* GadgetType    */
  275.   NULL,             /* GadgetRender  */
  276.   NULL,             /* SelectRender  */
  277.   NULL,             /* GadgetText    */
  278.   NULL,             /* MutualExclude */
  279.   NULL,             /* SpecialInfo   */
  280.   0,                /* GadgetID      */
  281.   NULL              /* UserData      */
  282. };
  283.  
  284. struct Gadget p4_gadget=
  285. {
  286.   &p5_gadget,       /* NextGadget    */
  287.   GADGOFF+120,      /* LeftEdge      */
  288.   130,              /* TopEdge       */
  289.   32,               /* Width         */
  290.   16,               /* Height        */
  291.   GADGHCOMP,        /* Flags         */
  292.   RELVERIFY,        /* Activation    */
  293.   BOOLGADGET,       /* GadgetType    */
  294.   NULL,             /* GadgetRender  */
  295.   NULL,             /* SelectRender  */
  296.   NULL,             /* GadgetText    */
  297.   NULL,             /* MutualExclude */
  298.   NULL,             /* SpecialInfo   */
  299.   0,                /* GadgetID      */
  300.   NULL              /* UserData      */
  301. };
  302.  
  303. struct Gadget p3_gadget=
  304. {
  305.   &p4_gadget,       /* NextGadget    */
  306.   GADGOFF+80,       /* LeftEdge      */
  307.   130,              /* TopEdge       */
  308.   32,               /* Width         */
  309.   16,               /* Height        */
  310.   GADGHCOMP,        /* Flags         */
  311.   RELVERIFY,        /* Activation    */
  312.   BOOLGADGET,       /* GadgetType    */
  313.   NULL,             /* GadgetRender  */
  314.   NULL,             /* SelectRender  */
  315.   NULL,             /* GadgetText    */
  316.   NULL,             /* MutualExclude */
  317.   NULL,             /* SpecialInfo   */
  318.   0,                /* GadgetID      */
  319.   NULL              /* UserData      */
  320. };
  321.  
  322. struct Gadget p2_gadget=
  323. {
  324.   &p3_gadget,       /* NextGadget    */
  325.   GADGOFF+40,       /* LeftEdge      */
  326.   130,              /* TopEdge       */
  327.   32,               /* Width         */
  328.   16,               /* Height        */
  329.   GADGHCOMP,        /* Flags         */
  330.   RELVERIFY,        /* Activation    */
  331.   BOOLGADGET,       /* GadgetType    */
  332.   NULL,             /* GadgetRender  */
  333.   NULL,             /* SelectRender  */
  334.   NULL,             /* GadgetText    */
  335.   NULL,             /* MutualExclude */
  336.   NULL,             /* SpecialInfo   */
  337.   0,                /* GadgetID      */
  338.   NULL              /* UserData      */
  339. };
  340.  
  341. struct Gadget p1_gadget=
  342. {
  343.   &p2_gadget,       /* NextGadget    */
  344.   GADGOFF,          /* LeftEdge      */
  345.   130,              /* TopEdge       */
  346.   32,               /* Width         */
  347.   16,               /* Height        */
  348.   GADGHCOMP,        /* Flags         */
  349.   RELVERIFY,        /* Activation    */
  350.   BOOLGADGET,       /* GadgetType    */
  351.   NULL,             /* GadgetRender  */
  352.   NULL,             /* SelectRender  */
  353.   NULL,             /* GadgetText    */
  354.   NULL,             /* MutualExclude */
  355.   NULL,             /* SpecialInfo   */
  356.   0,                /* GadgetID      */
  357.   NULL              /* UserData      */
  358. };
  359.  
  360.  
  361. /* ------------------------------------------------------- INFORMATION PAGE */
  362.  
  363. UBYTE InformationCount=16;
  364. char *Information[]=
  365. {
  366.   "\n\n\033[33mWizard Clock\033[31m v1.20 - The ultimate workbench clock\n",
  367.   "Written by \033[33mStefan Zeiger\033[31m in Jul-Nov/1991\n",
  368.   "Given into the Public Domain by \033[33m! WIZARD WORKS !\033[31m\n",
  369.   "Syntax  : \033[33mWizardClock [options]\033[31m\n",
  370.   "Options : \033[33m-d\033[31m : German\n",
  371.   "          \033[33m-e\033[31m : English\n",
  372.   "          \033[33m-f\033[31m : French\n",
  373.   "          \033[33m-I\033[31m : About mode\n",
  374.   "          \033[33m-A\033[31m : Analog clock mode\n",
  375.   "          \033[33m-D\033[31m : Digital clock mode\n",
  376.   "          \033[33m-C\033[31m : Calendar mode\n",
  377.   "          \033[33m-L\033[31m : Language selection mode\n",
  378.   "          \033[33m-S\033[31m : Speak time at startup\n",
  379.   "          \033[33m? \033[31m : Show this information and quit\n",
  380.   "The default options are \033[33m-e -I\033[31m\n",
  381.   "\n\033[33m<RETURN>\033[31m\n"
  382. };
  383.  
  384.  
  385. /* ------------------------------------------------------ WINDOW STRUCTURES */
  386.  
  387. struct Window *my_window=NULL;
  388. struct NewWindow my_new_window=
  389. {
  390.   0,             /* LeftEdge    */
  391.   11,            /* TopEdge     */
  392.   260,           /* Width       */
  393.   155,           /* Height      */
  394.   0,             /* DetailPen   */
  395.   1,             /* BlockPen    */
  396.   CLOSEWINDOW|   /* IDCMPFlags  */
  397.   GADGETDOWN|
  398.   GADGETUP,      /*             */
  399.   SMART_REFRESH| /* Flags       */
  400.   WINDOWCLOSE|   /*             */
  401.   WINDOWDRAG|    /*             */
  402.   WINDOWDEPTH|   /*             */
  403.   ACTIVATE,      /*             */
  404.   &p1_gadget,    /* FirstGadget */
  405.   NULL,          /* CheckMark   */
  406.   "WizardClock v1.20",
  407.   NULL,          /* Screen      */
  408.   NULL,          /* BitMap      */
  409.   NULL,          /* MinWidth    */
  410.   NULL,          /* MinHeight   */
  411.   NULL,          /* MaxWidth    */
  412.   NULL,          /* MaxHeight   */
  413.   WBENCHSCREEN   /* Type        */
  414. };
  415.  
  416.  
  417. /* ------------------------------------------------- PORT AND MESSAGE STUFF */
  418.  
  419. struct IntuiMessage *Msg;
  420. struct timerequest TimeReq;
  421. struct MsgPort *TimerPort;
  422.  
  423.  
  424. /* ---------------------------------------------------------- AREA PATTERNS */
  425.  
  426. UWORD back_pattern[]={0x5555,0xAAAA};
  427. UWORD full_pattern[]={0xFFFF};
  428.  
  429.  
  430. /* ------------------------------------------------------------------- FONT */
  431.  
  432. struct TextAttr topaz_font={"topaz.font",TOPAZ_EIGHTY,FS_NORMAL,FPF_ROMFONT};
  433. struct IntuiText topaz_text={1,0,JAM2,0,-6,&topaz_font,NULL,NULL};
  434.  
  435.  
  436. /* ------------------------------------------------------- GLOBAL VARIABLES */
  437.  
  438. UWORD Mode=ABOUT;
  439. LONG GMTime;
  440. struct tm *SYSTime;
  441. int mday,wday,year,mon,yday,sec,min,hour;
  442. UWORD Chip, Fast, Total;
  443. char strbuf[20];
  444. int oldsec=0,oldday=0,mday2=0,oldhour=0,oldmin=0,wday2=0;
  445. int totalyear;
  446. UWORD argcount;
  447. BOOL SpeakFirst=FALSE;
  448. int alhour=0,almin=0,alsec=0;
  449.  
  450.  
  451. /* -------------------------------------------------- FUNCTION DECLARATIONS */
  452.  
  453. void CleanX(void);
  454. void __regargs DrawCal(struct RastPort *,ULONG,ULONG);
  455. void __regargs Tx(struct RastPort *,char *,ULONG,ULONG,UWORD);
  456. void __regargs WriteDate(UWORD,UWORD,UWORD);
  457. void __regargs WriteCal(UWORD,UWORD);
  458. void Calendar(void);
  459. void CalendarRedraw(void);
  460. void GetTime(void);
  461. void Digital(void);
  462. void DigitalRedraw(void);
  463. void DigitalEnd(void);
  464. void DrawGadgets(void);
  465. void About(void);
  466. void LanguageStart(void);
  467. void LanguageRedraw(void);
  468. void main(int,char **);
  469. void Analog(void);
  470. void AnalogRedraw(void);
  471. BOOL Speak(void);
  472. void OffGadgets(void);
  473. void OnGadgets(void);
  474. void Alarm(void);
  475. void Beep(void);
  476.  
  477.  
  478. /* ---------------------------------------------------------- MAIN FUNCTION */
  479.  
  480. void main(int argc,char **argv)
  481. {
  482.   ULONG class;
  483.   APTR address;
  484.   BOOL close_me=FALSE;
  485.  
  486.   UBYTE i;
  487.  
  488.   /****** GET THE ARGUMENTS FROM THE CLI ******/
  489.  
  490.   if(argc!=0)
  491.   {
  492.     if(argc>1)
  493.     {
  494.       for(argcount=1;argcount<argc;argcount++)
  495.       {
  496.         if(strcmp(argv[argcount],"?")==NULL)
  497.         {
  498.           Delay(10L);
  499.           if(!_Backstdout) exit((int)0);
  500.           for(i=0;i<InformationCount;i++) Write(_Backstdout,Information[i],strlen(Information[i]));
  501.           Close(_Backstdout);
  502.           exit((int)0);
  503.         }
  504.         if(strcmp(argv[argcount],"-d")==NULL) Language=German;
  505.         if(strcmp(argv[argcount],"-e")==NULL) Language=English;
  506.         if(strcmp(argv[argcount],"-f")==NULL) Language=French;
  507.         if(strcmp(argv[argcount],"-I")==NULL) Mode=ABOUT;
  508.         if(strcmp(argv[argcount],"-A")==NULL) Mode=ANALOG;
  509.         if(strcmp(argv[argcount],"-D")==NULL) Mode=DIGITAL;
  510.         if(strcmp(argv[argcount],"-C")==NULL) Mode=CALENDAR;
  511.         if(strcmp(argv[argcount],"-L")==NULL) Mode=LANGUAGE;
  512.         if(strcmp(argv[argcount],"-S")==NULL) SpeakFirst=TRUE;
  513.       }
  514.     }
  515.   }
  516.  
  517.   /****** CLOSE THAT DAMN BACKSTDOUT ******/
  518.  
  519.   if(_Backstdout) Close(_Backstdout);
  520.  
  521.   /****** PREPARE EVERYTHING ******/
  522.  
  523.   IntuitionBase=(struct IntuitionBase *) OpenLibrary("intuition.library",0);
  524.   if(IntuitionBase==NULL) CleanX();
  525.  
  526.   GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0);
  527.   if(GfxBase==NULL) CleanX();
  528.  
  529.   my_window=OpenWindow(&my_new_window);
  530.   if(my_window==NULL) CleanX();
  531.  
  532.   if((TimerPort=(struct MsgPort *) CreatePort("Timer Port",0))==NULL) CleanX();
  533.   if(OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IOStdReq *)&TimeReq,0)!=NULL) CleanX();
  534.  
  535.   TimeReq.tr_node.io_Message.mn_ReplyPort=TimerPort;
  536.   TimeReq.tr_node.io_Command=TR_ADDREQUEST;
  537.   TimeReq.tr_node.io_Flags=0;
  538.   TimeReq.tr_node.io_Error=0;
  539.   TimeReq.tr_time.tv_secs=0;
  540.   TimeReq.tr_time.tv_micro=1000000;
  541.   SendIO((struct IOStdReq *) &TimeReq.tr_node);
  542.  
  543.   /****** INITIALIZE GRAPHICS ******/
  544.  
  545.   SetAPen(my_window->RPort,2);
  546.   SetAfPt(my_window->RPort,back_pattern,1);
  547.   RectFill(my_window->RPort,4,11,255,152);
  548.   SetAfPt(my_window->RPort,full_pattern,0);
  549.  
  550.   DrawGadgets();
  551.   GetTime();
  552.  
  553.   if(Mode==DIGITAL) Digital();
  554.   if(Mode==CALENDAR) Calendar();
  555.   if(Mode==ABOUT) About();
  556.   if(Mode==LANGUAGE) LanguageStart();
  557.   if(Mode==ANALOG) Analog();
  558.  
  559.   if(SpeakFirst) Speak();
  560.  
  561.   /****** MAIN LOOP ******/
  562.  
  563.   while(close_me==FALSE)
  564.   {
  565.     oldsec=sec;
  566.     oldday=mday2;
  567.     oldhour=hour;
  568.     oldmin=min;
  569.  
  570.     GetTime();
  571.  
  572.     if(Mode==CALENDAR)
  573.     {
  574.       if(oldday!=mday2) CalendarRedraw();
  575.     }
  576.  
  577.     if(Mode==DIGITAL)
  578.     {
  579.       if(oldsec!=sec) DigitalRedraw();
  580.     }
  581.  
  582.     if(Mode==ANALOG)
  583.     {
  584.       if(oldsec!=sec) AnalogRedraw();
  585.     }
  586.  
  587.     if(isalarm_gadget.Flags & SELECTED)
  588.     {
  589.       if(alhour==hour && almin==min && alsec==sec) Alarm();
  590.     }
  591.  
  592.     Wait(1<<my_window->UserPort->mp_SigBit | 1<<TimerPort->mp_SigBit);
  593.     if((BOOL)(Msg=(struct IntuiMessage *)GetMsg(my_window->UserPort)))
  594.     {
  595.       class=Msg->Class;
  596.       address=Msg->IAddress;
  597.       ReplyMsg((struct IntuiMassage *)Msg);
  598.       switch(class)
  599.       {
  600.         case CLOSEWINDOW:
  601.           close_me=TRUE;
  602.           break;
  603.  
  604.         case GADGETUP:
  605.           if(address==(APTR)&p1_gadget)
  606.           {
  607.             DigitalEnd();
  608.             Mode=ANALOG;
  609.             Analog();
  610.           }
  611.           if(address==(APTR)&alarm_gadget)
  612.           {
  613.             sscanf(alarm_buffer,"%d:%d:%d",&alhour,&almin,&alsec);
  614.           }
  615.           if(address==(APTR)&p2_gadget)
  616.           {
  617.             DigitalEnd();
  618.             Mode=DIGITAL;
  619.             Digital();
  620.           }
  621.           if(address==(APTR)&p3_gadget)
  622.           {
  623.             DigitalEnd();
  624.             Mode=CALENDAR;
  625.             Calendar();
  626.           }
  627.           if(address==(APTR)&p4_gadget)
  628.           {
  629.             DigitalEnd();
  630.             Mode=LANGUAGE;
  631.             LanguageStart();
  632.           }
  633.           if(address==(APTR)&p5_gadget)
  634.           {
  635.             DigitalEnd();
  636.             Mode=ABOUT;
  637.             About();
  638.           }
  639.           if(address==(APTR)&p6_gadget)
  640.           {
  641.             if(Speak()) DisplayBeep(NULL);
  642.           }
  643.           break;
  644.  
  645.         case GADGETDOWN:
  646.           if((address==(APTR)&l1_gadget) && (Mode==LANGUAGE))
  647.           {
  648.             Language=English;
  649.             LanguageRedraw();
  650.           }
  651.           if((address==(APTR)&l2_gadget) && (Mode==LANGUAGE))
  652.           {
  653.             Language=German;
  654.             LanguageRedraw();
  655.           }
  656.           if((address==(APTR)&l3_gadget) && (Mode==LANGUAGE))
  657.           {
  658.             Language=French;
  659.             LanguageRedraw();
  660.           }
  661.           break;
  662.       }
  663.     }
  664.     if((BOOL)(GetMsg(TimerPort)))
  665.     {
  666.       TimeReq.tr_time.tv_secs=0;
  667.       TimeReq.tr_time.tv_micro=1000000;
  668.       SendIO((struct IOStdReq *) &TimeReq.tr_node);
  669.     }
  670.  
  671.   } /* End of main loop */
  672.  
  673.   /****** TERMINATE ******/
  674.  
  675.   CleanX();
  676. }
  677.  
  678.  
  679. /* ------------------------------------------------------------- CLEAN EXIT */
  680.  
  681. void CleanX(void)
  682. {
  683.   if(my_window) CloseWindow(my_window);
  684.   Wait(1<<TimerPort->mp_SigBit);            /*     Wait for the     */
  685.     GetMsg(TimerPort);                        /*     last message     */
  686.     if(TimeReq.tr_node.io_Message.mn_ReplyPort) CloseDevice((struct IOStdReq *)&TimeReq);
  687.     if(TimerPort) DeletePort(TimerPort);
  688.   if(GfxBase) CloseLibrary((struct Library *)GfxBase);
  689.   if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  690.   exit((int)0);
  691. }
  692.  
  693.  
  694. /* ------------------------------------------------------ DRAW THE CALENDAR */
  695.  
  696. void __regargs DrawCal(struct RastPort *rp,ULONG x,ULONG y)
  697. {
  698.   ULONG xa,ya;
  699.   BYTE i,j;
  700.   UWORD xpos;
  701.  
  702.   /* DRAW THE FIELDS */
  703.  
  704.   for(xa=x,i=0;i<7;xa+=26,i++) DrawImage(rp,&tog1_image,xa,y);
  705.  
  706.   for(ya=y+13,j=0;j<6;ya+=11,j++)
  707.   {
  708.     for(xa=x,i=0;i<7;xa+=26,i++) DrawImage(rp,&tog1_image,xa,ya);
  709.   }
  710.  
  711.   /* WRITE THE DAYS OF THE WEEK */
  712.  
  713.   for(i=0,xpos=x+5;i<6;i++,xpos+=26) Tx(my_window->RPort,Language[19+i],xpos,y+8,1);
  714.   Tx(my_window->RPort,Language[25],x+161,y+8,3);
  715.  
  716. }
  717.  
  718.  
  719. /* ------------------------------------------------------------ DRAW A TEXT */
  720.  
  721. void __regargs Tx(struct RastPort *RP,char *text,ULONG px,ULONG py,UWORD colour)
  722. {
  723.   topaz_text.IText=text;
  724.   topaz_text.FrontPen=colour;
  725.   PrintIText(RP,&topaz_text,px,py);
  726. }
  727.  
  728.  
  729. /* --------------------------------------- WRITE A DATE NUMBER INTO A FIELD */
  730.  
  731. void __regargs WriteDate(UWORD x,UWORD y,UWORD num)
  732. {
  733.   char strbuf[3];
  734.   UWORD color;
  735.  
  736.   sprintf(strbuf,"%2d",num);
  737.   if(x==6) color=3; else color=1;
  738.   Tx(my_window->RPort,strbuf,(ULONG)(45+(x*26)),(ULONG)(58+(y*11)),color);
  739. }
  740.  
  741.  
  742. /* ----------------------------------------------------- WRITE THE CALENDAR */
  743.  
  744. void __regargs WriteCal(UWORD start,UWORD length)
  745. {
  746.   UWORD i,xpos=start,ypos=0;
  747.  
  748.   for(i=1;i<=length;i++)
  749.   {
  750.     WriteDate(xpos,ypos,i);
  751.     xpos++;
  752.     if(xpos==7)
  753.     {
  754.       xpos=0;
  755.       ypos++;
  756.     }
  757.   }
  758. }
  759.  
  760.  
  761. /* --------------------------------------------------- DISPLAY THE CALENDAR */
  762.  
  763. void Calendar(void)
  764. {
  765.   DrawNeg(my_window->RPort,25,20,210,102);
  766.   CalendarRedraw();
  767. }
  768.  
  769.  
  770. /* ---------------------------------------------------- REDRAW THE CALENDAR */
  771.  
  772. void CalendarRedraw(void)
  773. {
  774.   UWORD monlen;
  775.   BOOL is29feb=FALSE;
  776.  
  777.   /****** CALCULATE BACK TO THE FIRST DAY IN THE MONTH ******/
  778.  
  779.   if(wday==0) wday=6; else wday--;
  780.   while(mday>1)
  781.   {
  782.     mday--;
  783.     if(wday==0) wday=6; else wday--;
  784.   }
  785.  
  786.   /****** CALCULATE THE LENGTH OF THE MONTH ******/
  787.  
  788.   switch(mon)
  789.   {
  790.     case  0:
  791.       monlen=30;
  792.       break;
  793.     case  1:
  794.       if(year%4==0)
  795.       {
  796.         is29feb=TRUE;
  797.         if(year%100==0)
  798.         {
  799.           is29feb=FALSE;
  800.           if(year%400==0) is29feb=TRUE;
  801.         }
  802.       }
  803.       if(is29feb==TRUE) monlen=29; else monlen=28;
  804.       break;
  805.     case  2:
  806.       monlen=31;
  807.       break;
  808.     case  3:
  809.       monlen=30;
  810.       break;
  811.     case  4:
  812.       monlen=31;
  813.       break;
  814.     case  5:
  815.       monlen=30;
  816.       break;
  817.     case  6:
  818.       monlen=31;
  819.       break;
  820.     case  7:
  821.       monlen=31;
  822.       break;
  823.     case  8:
  824.       monlen=30;
  825.       break;
  826.     case  9:
  827.       monlen=31;
  828.       break;
  829.     case 10:
  830.       monlen=30;
  831.       break;
  832.     case 11:
  833.       monlen=31;
  834.   }
  835.  
  836.   if(year<78) totalyear=year+2000; else totalyear=year+1900;
  837.   sprintf(strbuf,"%s %2d-%s-%4d",Language[SYSTime->tm_wday],SYSTime->tm_mday,Language[(SYSTime->tm_mon)+7],totalyear);
  838.   DrawCal(my_window->RPort,40,37);
  839.   WriteCal(wday,monlen);
  840.   Tx(my_window->RPort,strbuf,43,32,1);
  841. }
  842.  
  843.  
  844. /* ---------------------------------------------------- GET THE SYSTEM TIME */
  845.  
  846. void GetTime(void)
  847. {
  848.   GMTime=time(NULL);
  849.   SYSTime=localtime(&GMTime);
  850.  
  851.   mday=SYSTime->tm_mday;
  852.   mday2=mday;
  853.   wday=SYSTime->tm_wday;
  854.   wday2=wday;
  855.   year=SYSTime->tm_year;
  856.   mon=SYSTime->tm_mon;
  857.   sec=SYSTime->tm_sec;
  858.   min=SYSTime->tm_min;
  859.   hour=SYSTime->tm_hour;
  860.   yday=SYSTime->tm_yday;
  861.  
  862.   Chip=AvailMem(MEMF_CHIP)>>10;
  863.   Fast=AvailMem(MEMF_FAST)>>10;
  864.   Total=Chip+Fast;
  865. }
  866.  
  867.  
  868. /* ---------------------------------------------------------------- DIGITAL */
  869.  
  870. void Digital(void)
  871. {
  872.   DrawNeg(my_window->RPort,25,20,210,102);
  873.  
  874.   Tx(my_window->RPort,Language[32],ALARMOFF-54,109,1);
  875.   DrawPos(my_window->RPort,ALARMOFF,100,75,12);
  876.   DrawNeg(my_window->RPort,ALARMOFF+2,101,71,10);
  877.   AddGadget(my_window,&alarm_gadget,(long)(-1));
  878.   AddGadget(my_window,&isalarm_gadget,(long)(-1));
  879.   RefreshGadgets(&p5_gadget,my_window,NULL);
  880.  
  881.   DigitalRedraw();
  882. }
  883.  
  884.  
  885. /* ------------------------------------------------------------ END DIGITAL */
  886.  
  887. void DigitalEnd(void)
  888. {
  889.   if(Mode==DIGITAL)
  890.   {
  891.     RemoveGadget(my_window,&isalarm_gadget);
  892.     RemoveGadget(my_window,&alarm_gadget);
  893.     RefreshGadgets(&p5_gadget,my_window,NULL);
  894.   }
  895. }
  896.  
  897.  
  898. /* --------------------------------------------------------- REDRAW DIGITAL */
  899.  
  900. void DigitalRedraw(void)
  901. {
  902.   if(year<78) totalyear=year+2000; else totalyear=year+1900;
  903.   sprintf(strbuf,"%s %2d-%s-%4d",Language[SYSTime->tm_wday],SYSTime->tm_mday,Language[(SYSTime->tm_mon)+7],totalyear);
  904.   Tx(my_window->RPort,strbuf,43,32,1);
  905.   sprintf(strbuf,"%2d : %2d : %2d",hour,min,sec);
  906.   Tx(my_window->RPort,strbuf,82,42,1);
  907.   sprintf(strbuf,"%s %3d",Language[26],yday);
  908.   Tx(my_window->RPort,strbuf,46,57,1);
  909.   sprintf(strbuf,"Chip     : %6ld kB",Chip);
  910.   Tx(my_window->RPort,strbuf,50,72,1);
  911.   sprintf(strbuf,"Fast     : %6ld kB",Fast);
  912.   Tx(my_window->RPort,strbuf,50,82,1);
  913.   sprintf(strbuf,"%s %6ld kB",Language[27],Total);
  914.   Tx(my_window->RPort,strbuf,50,92,1);
  915. }
  916.  
  917.  
  918. /* ------------------------------------------------------- DRAW THE GADGETS */
  919.  
  920. void DrawGadgets(void)
  921. {
  922.   DrawImage(my_window->RPort,&Analog_image,  GADGOFF+   0,130);
  923.   DrawImage(my_window->RPort,&Digital_image, GADGOFF+  40,130);
  924.   DrawImage(my_window->RPort,&Calendar_image,GADGOFF+  80,130);
  925.   DrawImage(my_window->RPort,&Language_image,GADGOFF+ 120,130);
  926.   DrawImage(my_window->RPort,&About_image,   GADGOFF+ 160,130);
  927.   DrawImage(my_window->RPort,&Speaker_image, GADGOFF+ 200,130);
  928. }
  929.  
  930.  
  931. /* ------------------------------------------------------------------ ABOUT */
  932.  
  933. void About(void)
  934. {
  935.   DrawNeg(my_window->RPort,25,20,210,102);
  936.   Tx(my_window->RPort,"WizardClock v1.20",62,40,1);
  937.   Tx(my_window->RPort,Language[28],62,48,1);
  938.   Tx(my_window->RPort,Language[29],58,56,1);
  939.   Tx(my_window->RPort,Language[30],62,64,1);
  940.   Tx(my_window->RPort,"! Wizard Works !",66,72,1);
  941.  
  942.   Tx(my_window->RPort,"Stefan Zeiger",76,84,1);
  943.   Tx(my_window->RPort,"Seligenstädter Weg 24",48,92,1);
  944.   Tx(my_window->RPort,"D-W-8756 Kahl",76,100,1);
  945.   Tx(my_window->RPort,Language[31],48,108,1);
  946. }
  947.  
  948.  
  949. /* ----------------------------------------------------- LANGUAGE SELECTION */
  950.  
  951. void LanguageStart(void)
  952. {
  953.   DrawNeg(my_window->RPort,25,20,210,102);
  954.   Tx(my_window->RPort,"English",70,36,1);
  955.   Tx(my_window->RPort,"Deutsch",70,46,1);
  956.   Tx(my_window->RPort,"Français",70,56,1);
  957.   LanguageRedraw();
  958. }
  959.  
  960.  
  961. /* ---------------------------------------------- REDRAW LANGUAGE SELECTION */
  962.  
  963. void LanguageRedraw(void)
  964. {
  965.   if(Language==English) DrawImage(my_window->RPort,&multi3_image,40,30);
  966.   else DrawImage(my_window->RPort,&multi1_image,40,30);
  967.   if(Language==German) DrawImage(my_window->RPort,&multi3_image,40,40);
  968.   else DrawImage(my_window->RPort,&multi1_image,40,40);
  969.   if(Language==French) DrawImage(my_window->RPort,&multi3_image,40,50);
  970.   else DrawImage(my_window->RPort,&multi1_image,40,50);
  971. }
  972.  
  973.  
  974. /* ----------------------------------------------------------------- ANALOG */
  975.  
  976. void Analog(void)
  977. {
  978.   LONG xm,ym,xn,yn;
  979.   WORD i;
  980.  
  981.   DrawNeg(my_window->RPort,25,20,210,102);
  982.  
  983.   SetAPen(my_window->RPort,1);
  984.   DrawEllipse(my_window->RPort,ANALOGX,ANALOGY,80,40);
  985.  
  986.   for(i=0;i<60;i+=5)
  987.   {
  988.     xm=ANALOGX+(lcos6(i)/125);
  989.     ym=ANALOGY+(lsin6(i)/250);
  990.     xn=ANALOGX+(lcos6(i)/140);
  991.     yn=ANALOGY+(lsin6(i)/280);
  992.     Move(my_window->RPort,xm,ym);
  993.     Draw(my_window->RPort,xn,yn);
  994.   }
  995.   for(i=0;i<60;i++)
  996.   {
  997.     xm=ANALOGX+(lcos6(i)/125);
  998.     ym=ANALOGY+(lsin6(i)/250);
  999.     xn=ANALOGX+(lcos6(i)/130);
  1000.     yn=ANALOGY+(lsin6(i)/260);
  1001.     Move(my_window->RPort,xm,ym);
  1002.     Draw(my_window->RPort,xn,yn);
  1003.   }
  1004.  
  1005.   AnalogRedraw();
  1006. }
  1007.  
  1008.  
  1009. /* ---------------------------------------------------------- REDRAW ANALOG */
  1010.  
  1011. void AnalogRedraw(void)
  1012. {
  1013.   LONG xs,ys,xso,yso;
  1014.   LONG xm,ym,xmo,ymo;
  1015.   LONG xh,yh,xho,yho;
  1016.  
  1017.   if(year<78) totalyear=year+2000; else totalyear=year+1900;
  1018.   sprintf(strbuf,"%s %2d-%s-%4d",Language[SYSTime->tm_wday],SYSTime->tm_mday,Language[(SYSTime->tm_mon)+7],totalyear);
  1019.   xs =ANALOGX+(lcos6((WORD)   sec -15)/150);
  1020.   ys =ANALOGY+(lsin6((WORD)   sec -15)/300);
  1021.   xso=ANALOGX+(lcos6((WORD)oldsec -15)/150);
  1022.   yso=ANALOGY+(lsin6((WORD)oldsec -15)/300);
  1023.   xm =ANALOGX+(lcos6((WORD)   min -15)/150);
  1024.   ym =ANALOGY+(lsin6((WORD)   min -15)/300);
  1025.   xmo=ANALOGX+(lcos6((WORD)oldmin -15)/150);
  1026.   ymo=ANALOGY+(lsin6((WORD)oldmin -15)/300);
  1027.   xh =ANALOGX+(lcos6((WORD)(   hour*5)+(WORD)(   min/12)-15)/190);
  1028.   yh =ANALOGY+(lsin6((WORD)(   hour*5)+(WORD)(   min/12)-15)/380);
  1029.   xho=ANALOGX+(lcos6((WORD)(oldhour*5)+(WORD)(oldmin/12)-15)/190);
  1030.   yho=ANALOGY+(lsin6((WORD)(oldhour*5)+(WORD)(oldmin/12)-15)/380);
  1031.  
  1032.   SetAPen(my_window->RPort,0);
  1033.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1034.   Draw(my_window->RPort,xso,yso);
  1035.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1036.   Draw(my_window->RPort,xmo,ymo);
  1037.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1038.   Draw(my_window->RPort,xho,yho);
  1039.  
  1040.   SetAPen(my_window->RPort,2);
  1041.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1042.   Draw(my_window->RPort,xm,ym);
  1043.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1044.   Draw(my_window->RPort,xh,yh);
  1045.   SetAPen(my_window->RPort,3);
  1046.   Move(my_window->RPort,ANALOGX,ANALOGY);
  1047.   Draw(my_window->RPort,xs,ys);
  1048.  
  1049.   Tx(my_window->RPort,strbuf,43,32,1);
  1050. }
  1051.  
  1052.  
  1053. /* ---------------------------------------------------- SPEAK DATE AND TIME */
  1054.  
  1055. BOOL Speak(void)
  1056. {
  1057.   char *day[] =
  1058.   {
  1059.     "first",
  1060.     "second",
  1061.     "third",
  1062.     "fourth",
  1063.     "fifth",
  1064.     "sixth",
  1065.     "seventh",
  1066.     "eighth",
  1067.     "naeinth",
  1068.     "tenth",
  1069.     "eeleventh",
  1070.     "twelvth",
  1071.     "thirteenth",
  1072.     "fourtenth",
  1073.     "fifteenth",
  1074.     "sixteenth",
  1075.     "seventeenth",
  1076.     "eighteenth",
  1077.     "naeinteenth",
  1078.     "twentie eth",
  1079.     "twenty first",
  1080.     "twenty second",
  1081.     "twenty third",
  1082.     "twenty fourth",
  1083.     "twenty fifth",
  1084.     "twenty sixth",
  1085.     "twenty seventh",
  1086.     "twenty eighth",
  1087.     "twenty naeinth",
  1088.     "thirtie eth",
  1089.     "thirty first"
  1090.   };
  1091.  
  1092.   char *month[] =
  1093.   {
  1094.     "january",
  1095.     "february",
  1096.     "march",
  1097.     "aipril",
  1098.     "may",
  1099.     "june",
  1100.     "ju lie",
  1101.     "august",
  1102.     "september",
  1103.     "october",
  1104.     "november",
  1105.     "deecember"
  1106.   };
  1107.  
  1108.   char *ayear[] =
  1109.   {
  1110.     "naeinteen naeinty",
  1111.     "naeinteen naeintyone",
  1112.     "naeinteen naeinty two",
  1113.     "naeinteen naeinty three",
  1114.     "naeinteen naeinty four",
  1115.     "naeinteen naeintyfive",
  1116.     "naeinteen naeintysix",
  1117.     "naeinteen naeinty seven",
  1118.     "naeinteen naeinty eight",
  1119.     "naeinteen naeintynine"
  1120.     "twothousand",
  1121.     "twothousand one",
  1122.     "twothousand two",
  1123.     "twothousand three",
  1124.     "twothousand four",
  1125.     "twothousand five",
  1126.     "twothousand six",
  1127.     "twothousand seven",
  1128.     "twothousand eight",
  1129.     "twothousand nine",
  1130.     "twothousand ten",
  1131.   };
  1132.  
  1133.   char *awday[]=
  1134.   {
  1135.     "sunday",
  1136.     "mannday",
  1137.     "tjuesday",
  1138.     "wensday",
  1139.     "thur sday",
  1140.     "fri day",
  1141.     "saturday"
  1142.   };
  1143.  
  1144.   char *numb[]=
  1145.   {
  1146.     "zeero",
  1147.     "one",
  1148.     "two",
  1149.     "three",
  1150.     "four",
  1151.     "five",
  1152.     "six",
  1153.     "seven",
  1154.     "eight",
  1155.     "nine",
  1156.     "ten",
  1157.     "eelevenn",
  1158.     "twelve",
  1159.     "thirteen",
  1160.     "fourteen",
  1161.     "fifteen",
  1162.     "sixteen",
  1163.     "seventeen",
  1164.     "eighteen",
  1165.     "naeinteen",
  1166.     "twenty ",
  1167.     "twenty one",
  1168.     "twenty two",
  1169.     "twenty three",
  1170.     "twenty four",
  1171.     "twenty five",
  1172.     "twenty six",
  1173.     "twenty seven",
  1174.     "twenty eight",
  1175.     "twenty nine",
  1176.     "thirty",
  1177.     "thirty one",
  1178.     "thirty two",
  1179.     "thirty three",
  1180.     "thirty four",
  1181.     "thirty five",
  1182.     "thirty six",
  1183.     "thirty seven",
  1184.     "thirty eight",
  1185.     "thirty nine",
  1186.     "fourty",
  1187.     "fourty one",
  1188.     "fourty two",
  1189.     "fourty three",
  1190.     "fourty four",
  1191.     "fourty five",
  1192.     "fourty six",
  1193.     "fourty seven",
  1194.     "fourty eight",
  1195.     "fourty nine",
  1196.     "fifty",
  1197.     "fifty one",
  1198.     "fifty two",
  1199.     "fifty three",
  1200.     "fifty four",
  1201.     "fifty five",
  1202.     "fifty six",
  1203.     "fifty seven",
  1204.     "fifty eight",
  1205.     "fifty nine"
  1206.   };
  1207.  
  1208.   char *mn[]=
  1209.   {
  1210.     "minnits",
  1211.     "minnit"
  1212.   };
  1213.  
  1214.   char *sn[]=
  1215.   {
  1216.     "seccants",
  1217.     "seccant"
  1218.   };
  1219.  
  1220.   BOOL rval=FALSE;
  1221.   int handle,dummy=0,mode=1,me=0,se=0;
  1222.   char buffer[80];
  1223.  
  1224.   OffGadgets();
  1225.   handle=open("SPEAK:opt/p80/s160/m",mode,dummy);
  1226.   if(handle==-1) rval=TRUE;
  1227.   else
  1228.     {
  1229.       sprintf(buffer,"today is %s , the %s of %s, %s.",
  1230.         awday[wday],day[(mday2)-1],month[mon],
  1231.         ayear[(year)-90]);
  1232.       write(handle,buffer,strlen(buffer));
  1233.  
  1234.       if(min==1) me=1;
  1235.       if(sec==1) se=1;
  1236.  
  1237.       sprintf(buffer,"it is %s a clock , %s %s and %s %s.",
  1238.         numb[hour],numb[min],mn[me],numb[sec],sn[se]);
  1239.       write(handle,buffer,strlen(buffer));
  1240.  
  1241.       close(handle);
  1242.     }
  1243.   OnGadgets();
  1244.   return(rval);
  1245. }
  1246.  
  1247.  
  1248. /* -------------------------------------------------------- DISABLE GADGETS */
  1249.  
  1250. void OffGadgets(void)
  1251. {
  1252.   OffGadget(&p1_gadget,my_window,NULL);
  1253.   OffGadget(&p2_gadget,my_window,NULL);
  1254.   OffGadget(&p3_gadget,my_window,NULL);
  1255.   OffGadget(&p4_gadget,my_window,NULL);
  1256.   OffGadget(&p5_gadget,my_window,NULL);
  1257.   OffGadget(&p6_gadget,my_window,NULL);
  1258.   if(Mode==LANGUAGE)
  1259.   {
  1260.     OffGadget(&l1_gadget,my_window,NULL);
  1261.     OffGadget(&l2_gadget,my_window,NULL);
  1262.     OffGadget(&l3_gadget,my_window,NULL);
  1263.   }
  1264.   if(Mode==DIGITAL)
  1265.   {
  1266.     OffGadget(&alarm_gadget,my_window,NULL);
  1267.     OffGadget(&isalarm_gadget,my_window,NULL);
  1268.   }
  1269. }
  1270.  
  1271.  
  1272. /* --------------------------------------------------------- ENABLE GADGETS */
  1273.  
  1274. void OnGadgets(void)
  1275. {
  1276.   OnGadget(&p1_gadget,my_window,NULL);
  1277.   OnGadget(&p2_gadget,my_window,NULL);
  1278.   OnGadget(&p3_gadget,my_window,NULL);
  1279.   OnGadget(&p4_gadget,my_window,NULL);
  1280.   OnGadget(&p5_gadget,my_window,NULL);
  1281.   OnGadget(&p6_gadget,my_window,NULL);
  1282.   DrawGadgets();
  1283.   if(Mode==LANGUAGE)
  1284.   {
  1285.     OnGadget(&l1_gadget,my_window,NULL);
  1286.     OnGadget(&l2_gadget,my_window,NULL);
  1287.     OnGadget(&l3_gadget,my_window,NULL);
  1288.     LanguageRedraw();
  1289.   }
  1290.   if(Mode==DIGITAL)
  1291.   {
  1292.     OnGadget(&alarm_gadget,my_window,NULL);
  1293.     OnGadget(&isalarm_gadget,my_window,NULL);
  1294.   }
  1295. }
  1296.  
  1297.  
  1298. /* ------------------------------------------------------------------ ALARM */
  1299.  
  1300. void Alarm(void)
  1301. {
  1302.   int i;
  1303.  
  1304.   OffGadgets();
  1305.   for(i=0;i<10;i++)
  1306.   {
  1307.     DisplayBeep(NULL);
  1308.     Beep();
  1309.     Delay(5);
  1310.   }
  1311.   OnGadgets();
  1312. }
  1313.  
  1314.  
  1315. /* ------------------------------------------------------------------- BEEP */
  1316.  
  1317. UBYTE allocationMap[] = { 1, 8, 2, 4 };
  1318.  
  1319. void Beep(void)
  1320. {
  1321.     struct IOAudio *audioIOB;
  1322.     struct MsgPort *replyPort;
  1323.     UBYTE *beepWave;
  1324.  
  1325.     replyPort=(struct MsgPort *) CreatePort(0,0);
  1326.     beepWave=(UBYTE *)AllocMem(10,MEMF_CHIP|MEMF_CLEAR);
  1327.     if (beepWave!=0) {
  1328.         beepWave[0]=100;
  1329.         audioIOB=(struct IOAudio *)    CreateExtIO(replyPort,sizeof(struct IOAudio));
  1330.         if (audioIOB!=NULL) {
  1331.             audioIOB->ioa_Request.io_Message.mn_Node.ln_Pri=85;
  1332.             audioIOB->ioa_Data=allocationMap;
  1333.             audioIOB->ioa_Length=sizeof(allocationMap);
  1334.             if (OpenDevice("audio.device",0,(struct IORequest *)audioIOB,0)==0) {
  1335.                 audioIOB->ioa_Request.io_Command=CMD_WRITE;
  1336.                 audioIOB->ioa_Request.io_Flags=ADIOF_PERVOL;
  1337.                 audioIOB->ioa_Data=beepWave;
  1338.                 audioIOB->ioa_Length=10;
  1339.                 audioIOB->ioa_Period=3579545/10000;
  1340.                 audioIOB->ioa_Volume=64;
  1341.                 BeginIO((struct IORequest *)audioIOB);
  1342.                 Delay(50);
  1343.                 CloseDevice((struct IORequest *)audioIOB);
  1344.             }
  1345.             DeleteExtIO((struct IORequest *)audioIOB);
  1346.         }
  1347.         FreeMem(beepWave,10);
  1348.     }
  1349.     DeletePort(replyPort);
  1350. }
  1351.  
  1352. /* line 1352 - THE END */
  1353.