/*
	
	WATCH   v1.4		［呼び出し関数・他」
	
		Programed by Keijiro Takahashi (novice)
	
*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <guidbg.h>
#include <dos.h>

typedef struct dostime_t dtime_t;
typedef struct dosdate_t ddate_t;


int	baseWin = -1 ;
int	baseDlg = -1 ;
int	dspIcn[5] = -1 ;
int	dateBtn = -1 ;
int	dspBtn = -1 ;
int dateSw = 0;
int h12Sw = 0;
int blinkSw;
int upDateSw=1;
dtime_t time1,time2;
ddate_t date;

extern saveRsm();
void setNumIcn(int *id,int n,int sw);
void idleTask();






int	shell(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int ret=ILLEGAL_FUNCTION;

	switch (messId)
	{
		case GM_QUIT:
			saveRsm();
			MMI_SetHaltFlag(TRUE);
			ret = NOERR;
			break;
		
		case GM_WAKE:
			MMI_SendMessage(baseWin,MM_WAKE,0);
			ret = NOERR;
			break;
		
		case GM_SLEEP:
			MMI_SendMessage(baseWin,MM_SLEEP,0);
			ret = NOERR;
			break;
	}

	return(ret);
}






int	baseWinFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if (messId==MM_ERASE)
	{
		saveRsm();
		MMI_SetHaltFlag(TRUE);
	}

	return(ILLEGAL_FUNCTION);
}






int	dateBtnFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	dateSw ^= 1;
	
	if (dateSw)
	{
		blinkSw=0;
		MMI_SendMessage(dspIcn[2],MM_SETSHAPE,1,512);
		
		_dos_getdate(&date);
		setNumIcn(&(dspIcn[4]),date.day,1);
		setNumIcn(&(dspIcn[1]),date.month,1);
		
		MMI_SendMessage(baseDlg,MM_SHOW,0);
	}
	else
	{
		upDateSw=1;
		idleTask();
	}

	return NOERR ;
}






int	dspBtnFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	h12Sw ^= 1;
	upDateSw=1;
	idleTask();

	return NOERR ;
}





void idleTask()
{
	if ( dateSw )
	{
		return;
	}

	_dos_gettime(&time2);
	
	if (time2.second != time1.second || upDateSw!=0)
	{
		blinkSw^=1;
		time1.second=time2.second;
		MMI_SendMessage(dspIcn[2],MM_SETSHAPE,1,512+blinkSw);
		MMI_SendMessage(dspIcn[2],MM_SHOW,0);
		
		if (time2.minute != time1.minute || upDateSw!=0)
		{
			time1.minute=time2.minute;
			setNumIcn(&(dspIcn[4]),time1.minute,0);
		
			if (time2.hour != time1.hour || upDateSw!=0)
			{
				upDateSw=0;
				time1.hour=time2.hour;
				
				if (h12Sw!=0 && time1.hour>11)
				{
					setNumIcn(&(dspIcn[1]),time1.hour-12,1);
				}
				else
				{
					setNumIcn(&(dspIcn[1]),time1.hour,1);
				}
			}
		}
	}

	return;
}






void setNumIcn(int *id,int n,int sw)
{
	MMI_SendMessage(*id,MM_SETSHAPE,1,514+n%10);
	
	if (n<10 && sw!=0)
	{
		MMI_SendMessage(*(id-1),MM_SETSHAPE,1,512);
	}
	else
	{
		MMI_SendMessage(*(id-1),MM_SETSHAPE,1,514+n/10);
	}

	MMI_SendMessage(*id,MM_SHOW,0);
	MMI_SendMessage(*(id-1),MM_SHOW,0);

	return;
}
