/**************************************************************************
 *
 *      Demonstrationsprogramm :
 *      TIMER
 *
 *      im Rahmen des C-Kurses auf der GetiT
 *
 * Beschreibung :
 * TIMER öffnet ein kleines Fenster in der Titelzeile des WBench-Screens
 * und stellt dort eine Uhr dar. Beendet wird das Programm durch
 * Mausklick auf CLOSEGADGET. Das Fenster kann beliebig verschoben
 * werden.
 *
 * Geschrieben von Peter Fischer, RP.-Ebert-Str. 6, 3257 Springe 1
 *
 ***********************************************************************/

/* Include-Files einladen. */
#include <devices/timer.h>

/* Nur für Aztec-Compiler : 
 * Es wird ein eigener Prozeß gestartet, da mit detach.o gelinkt wird.
 */
ULONG _stack = 4000L;
long _priority = 1L;
long _BackGroundIO = 0L;
char *_procname = "GetiT-Uhr";

/* Struktur zum Speichern der Zeit. */
struct timeval;

/* Eigenes Fenster : */
struct NewWindow
  NewWindow =
  { 400,0,105,10,1,0,CLOSEWINDOW,
    WINDOWCLOSE | WINDOWDRAG | NOCAREREFRESH | RMBTRAP,
    NULL,NULL,NULL,NULL,NULL,0,0,0,0,WBENCHSCREEN
  };
struct Window
  *Window = NULL;

/* Die Zeiger auf die Libraries. */
struct IntuitionBase *IntuitionBase = NULL;
struct GfxBase *GfxBase = NULL;
/* Die Struktur für die Befehle an das TIMER.DEVICE. */
struct timerequest *tr = NULL;
/* Briefkasten für Antworten vom TIMER.DEVICE. */
struct MsgPort *TimerPort = NULL;
/* Flag, ob TIMER.DEVICE geöffnet werden konnte. */
BOOL timerOpen = FALSE;

main()
{ /* Zähler */
  int i;
  /* Uhrzeit als String */
  char buff[12];
  /* Zeiger auf empfangene Message. */
  struct IntuiMessage *msg;

  /* Öffnen der Intuition.library */
  IntuitionBase = OpenLibrary ( "intuition.library",33 );
  if ( IntuitionBase == NULL )
    Ausgang();

  /* Öffnen der Graphics.library */
  GfxBase = OpenLibrary ( "graphics.library",33 );
  if ( GfxBase == NULL )
    Ausgang();

  /* Briefkasten vom System anfordern. */
  TimerPort = CreatePort ( 0,0 );
  if ( TimerPort == NULL )
    Ausgang();

  /* Befehlsstruktur für Geräte anfordern. */
  tr = CreateExtIO ( TimerPort,sizeof( struct timerequest ) );
  if ( tr == NULL )
    Ausgang();

  /* TIMER.DEVICE öffnen. */
  if ( timerOpen = OpenDevice( TIMERNAME,UNIT_VBLANK,tr,0 ) )
    Ausgang();

  /* Mini-Fenster öffnen. */
  Window = OpenWindow ( &NewWindow );
  if ( Window == NULL )
    Ausgang();

  /* Fenster für Ausgaben vorbereiten. */
  SetWindowTitles ( Window,-1,_procname );
  SetAPen ( Window->RPort,1 );
  SetBPen ( Window->RPort,3 );
  SetDrMd ( Window->RPort,JAM2 );

  /* In Endlosschleife Uhrzeit anzeigen. */
  while ( TRUE )
  { /* Befehl an das Device spezifizieren. Eine Sekunde warten. */
    tr->tr_node.io_Command = TR_ADDREQUEST;
    tr->tr_time.tv_secs = 1;
    tr->tr_time.tv_micro = 0L;
    /* Und abschicken und auf Antwort warten. */
    DoIO ( tr );
    /* Die Erfolgsmessage aus dem Briefkasten entfernen. */
    GetMsg ( TimerPort );
    /* Systemzeit anfordern. */
    tr->tr_node.io_Command = TR_GETSYSTIME;
    /* Und abschicken und auf Antwort warten. */
    DoIO ( tr );
    /* Zeit formatieren und in Buffer übertragen. */
    sprintf ( buff,"%02d:%02d'%02d\42",
              (tr->tr_time.tv_secs/3600)%24,
              (tr->tr_time.tv_secs/60)%60,
              tr->tr_time.tv_secs%60 );
    /* Ausgeben ins Fenster. */
    Move( Window->RPort,30,7 );
    Text ( Window->RPort,buff,strlen(buff) );
    /* Nachricht aus Briefkasten entfernen. */
    GetMsg ( TimerPort );
    /* Falls Nachricht vom Fenster kam ( CLOSEGADGET ), dann
     * Schleife verlassen.
     */
    if ( msg = GetMsg( Window->UserPort ) )
      break;
  }
  /* ALLE Nachrichten aus Fenster-eigenem Briefkasten entfernen. */
  while ( msg != NULL )
  { ReplyMsg ( msg );
    msg = GetMsg( Window->UserPort );
  }

  /* Und System aufräumen. */
  Ausgang();
}

/* Routine, um das System wieder in Ordnung zu bringen. */
Ausgang()
{ if ( Window != NULL )
    CloseWindow ( Window );
  if ( timerOpen )
    CloseDevice ( tr );
  if ( TimerPort != NULL )
    DeletePort ( TimerPort );
  if ( tr != NULL )
    DeleteExtIO ( tr );
  if ( GfxBase != NULL )
    CloseLibrary ( GfxBase );
  if ( IntuitionBase != NULL )
    CloseLibrary ( IntuitionBase );
  exit();
}
