/*
 *  callbacks.c 
 *
 *  Callback-Definitionen fuer stopwatch.fd/stopwatch.c
 *
 *  (C) 9/1995 Tilman Kuepper (tilman@tilli.tng.oche.de)
 */


#include "forms.h"
#include "stopwatch.h"
#include <signal.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h>


/* RCS-Infos */
/*
static char RCSdat[]="$Date: 1995/09/06 16:27:35 $";
static char RCSrev[]="$Revision: 1.0 $"; 
static char RCSsta[]="$State: Released $";
*/


/*
 *  globale Variablen
 */
static time_t diff=0; /* Differenz zwischen Systemzeit und angezeigter Zeit */
static time_t anz=0; /* angezeigte Zeit */
static time_t old_anz=-1; /* vorherige angezeigte Zeit */
static int run=0; /* 1: Uhr laeuft; 0: Uhr steht */
static FL_OBJECT *t_time=NULL; /* Textfeld mit Zeit */


/*
 *  Signalhandler fuer SIGALRM
 */
void sighandler()
{
    char labelstring[100]; /* String fuer Anzeige */
  
    /* Naechsten SIGALRM anfordern */
    signal(SIGALRM,sighandler);
    alarm(1);

    old_anz=anz; /* alten Sekundenwert merken */
    if(run==1) /* neue Zeit nur berechnen, falls Uhr laeuft */
    {
        anz=time(NULL)-diff;
    }
    
    /* Nur anzeigen, falls neuer Wert vorhanden */
    if(anz!=old_anz)
    {
        sprintf(labelstring,"%02li min, %02li sec",anz/60,anz%60);
        fl_set_object_label(t_time,labelstring);     
    }

    return;
}
    

/* callbacks for form f_stopwatch */
void cb_stop(FL_OBJECT *ob, long data)
{
    /* STOP-Knopf gedrueckt */
    run=0;

    return;
}


void cb_null(FL_OBJECT *ob, long data)
{
    char labelstring[100]; /* String fuer Anzeige */
    
    /* NULL-Knopf gedrueckt */
    anz=0;
    diff=time(NULL);
    
    /* Anzeige ruecksetzen */
    if(t_time!=NULL)
    {
        sprintf(labelstring,"%02i min, %02i sec",0,0);
        fl_set_object_label(t_time,labelstring);     
    }

    return;
}


void cb_ende(FL_OBJECT *ob, long data)
{
    /* ENDE-Knopf gedrueckt */
    alarm(0); /* evtl. vorhandenen Timer stoppen */
    
    fl_finish();
    exit(0);
}


void cb_start(FL_OBJECT *ob, long data)
{
    /* START-Knopf gedruekct */
    FD_f_stopwatch *fds=ob->u_vdata; /* Form ermitteln */
    
    t_time=fds->t_time; /* Textfeld ermitteln und in glob. Variable merken */

    diff=time(NULL)-anz; /* Differenz fuer Zeitberechnung holen */
    run=1; /* Uhr laeuft! */
    
    /* Jetzt den Signal-Handler einsetzen */
    signal(SIGALRM,sighandler);
    alarm(1);

    return;
}
