
/**************************************************************************/
/*  Program	:example4.c						  */
/*  Description	:Demo program for ADAM-4500 trade show kit.		  */
/*		 Use ADAM-4500 to control ADAM-4011D,14D,21 and	ADAM-4050 */
/*		 4050(adress:01) 4011d(02) 4014d(03) 4021(04)		  */
/**************************************************************************/

#include	<stdio.h>
#include	<math.h>
#include	<dos.h>
#include	<conio.h>
#include	<tang.h>


#define	TIME_OUT	50000
static	int base0=0x3f8;
static	int base1=0x2f8;


static	char cmd01[10]={'$','0','1','6',0x0d};
static	char cmd02[10]={'#','0','2',0x0d};
static	char cmd03[10]={'#','0','3',0x0d};
static	char cmd04[10]={'#','0','4','0','0','.','0','0','0',0x0d};

static	char cmddo[10]={'#','0','1','0','0','0','0',0x0d};


static	char rec[28]={'!','7','F','0','0',
		      '+','0','2','0','.','0','0','0',
		      '+','0','0','.','0','0','0','0',
		      '0','0','.','0','0','0'};

static	char buf[10];




static	char reccom1[4];
static	char recnum1;

static	char reccom2[10];

static	int  ao_count=0;
static	char updown=1;		/* up mode */

static	char ao_table[22]={'0','0','0','1','0','2','0','3','0','4','0','5',
			   '0','6','0','7','0','8','0','9','1','0'};


static	char sec_flag=1;

static float HI_4018=30.0;
static float LO_4018=25.0;

static	float  HI_4014=7.0;
static	float  LO_4014=3.0;




read01()
{
	int i;
	unsigned long int timeout;
	char flag;

	i=0;
	flag=1;
	while (flag)
	{
		outportb(base1,cmd01[i]);	  /* Send data */
		if (cmd01[i] ==	0x0d)
			flag=0;
		i++;
	}

	i=0;
	flag=1;
	timeout=TIME_OUT;
	while (flag)
	{
		/* Check for received data on port 2 */
		if ((inportb(base1+5) &	1) !=0)
		{
			reccom2[i]=inportb(base1);  /* Receive data */
			if (reccom2[i] == 0x0d)
			{
				rec[1]=reccom2[3];
				rec[2]=reccom2[4];
				rec[3]=reccom2[1];
				rec[4]=reccom2[2];
				flag=0;
			}
			i++;
		}
		else
		{	/* Check timeout */
			timeout--;
			if (timeout == 0)
			{
				printf("\nTimeout01(read)\n");
				flag = 0;
			}
		}
	}	/* End of receive data while() */
}

write01()
{
	int i;
	unsigned long int timeout;
	char flag;

	i=0;
	flag=1;
	while (flag)
	{
		outportb(base1,cmddo[i]);	  /* Send data */
		if (cmddo[i] ==	0x0d)
			flag=0;
		i++;
	}

	i=0;
	flag=1;
	timeout=TIME_OUT;
	while (flag)
	{
		/* Check for received data on port 2 */
		if ((inportb(base1+5) &	1) !=0)
		{
			if (inportb(base1)==0x0d)
				flag=0;
		}
		else
		{	/* Check timeout */
			timeout--;
			if (timeout == 0)
			{
				flag = 0;
				printf("\nTimeout01(write)\n");
			}
		}
	}	/* End of receive data while() */

}

read02()
{
	int i;
	char flag;
	unsigned long int timeout;
	double avalue;

	i=0;
	flag=1;
	while (flag)
	{
		outportb(base1,cmd02[i]);	  /* Send data */
		if (cmd02[i] ==	0x0d)
			flag=0;
		i++;
	}

	i=0;
	flag=1;
	timeout=TIME_OUT;
	while (flag)
	{
		/* Check for received data on port 2 */
		if ((inportb(base1+5) &	1) !=0)
		{
			reccom2[i]=inportb(base1);  /* Receive data */
			if (reccom2[i] == 0x0d)
			{
				rec[5] =reccom2[1];
				rec[6] =reccom2[2];
				rec[7] =reccom2[3];
				rec[8] =reccom2[4];
				rec[9] =reccom2[5];
				rec[10]=reccom2[6];
				rec[11]=reccom2[7];

				buf[0]=rec[6];
				buf[1]=rec[7];
				buf[2]=rec[8];
				buf[3]=rec[9];
				buf[4]=rec[10];
				buf[5]=rec[11];
				buf[6]='\0';

				avalue=atof(buf);
				if (avalue > HI_4018)
				{
					rec[12]='1';
					if (rec[20]=='0')
						cmddo[5]='1';
					if (rec[20]=='1')
						cmddo[5]='5';
					if (rec[20]=='2')
						cmddo[5]='9';
					write01();
				}
				else
				{
					if (avalue<LO_4018)
					{
						rec[12]='2';
						if (rec[20]=='0')
							cmddo[5]='2';
						if (rec[20]=='1')
							cmddo[5]='6';
						if (rec[20]=='2')
							cmddo[5]='A';
						write01();
					}
					else
						rec[12]='0';
				}

				printf("\n4018read=%f\n",avalue);

				flag=0;
			}
			i++;
		}
		else
		{	/* Check timeout */
			timeout--;
			if (timeout == 0)
			{
				flag = 0;
				printf("\nTimeout02(read)\n");
			}
		}
	}	/* End of receive data while() */
}

read03()
{
	int i;
	unsigned long int timeout;
	char flag;
	double avalue;

	i=0;
	flag=1;
	while (flag)
	{
		outportb(base1,cmd03[i]);	  /* Send data */
		if (cmd03[i] ==	0x0d)
			flag=0;
		i++;
	}

	i=0;
	flag=1;
	timeout=TIME_OUT;
	while (flag)
	{
		/* Check for received data on port 2 */
		if ((inportb(base1+5) &	1) !=0)
		{
			reccom2[i]=inportb(base1);  /* Receive data */
			if (reccom2[i] == 0x0d)
			{
				rec[13]	=reccom2[1];
				rec[14]	=reccom2[2];
				rec[15]	=reccom2[3];
				rec[16]	=reccom2[4];
				rec[17]	=reccom2[5];
				rec[18]	=reccom2[6];
				rec[19]	=reccom2[7];

				buf[0]=rec[14];
				buf[1]=rec[15];
				buf[2]=rec[16];
				buf[3]=rec[17];
				buf[4]=rec[18];
				buf[5]=rec[19];
				buf[6]='\0';

				avalue=atof(buf);
				if (avalue > HI_4014)
				{
					rec[20]='1';
					if (rec[12]=='0')
						cmddo[5]='4';
					if (rec[12]=='1')
						cmddo[5]='5';
					if (rec[12]=='2')
						cmddo[5]='6';
					write01();
				}
				else
				{
					if (avalue<LO_4014)
					{
						rec[20]='2';
						if (rec[12]=='0')
							cmddo[5]='8';
						if (rec[12]=='1')
							cmddo[5]='9';
						if (rec[12]=='2')
							cmddo[5]='A';
						write01();
					}
					else
						rec[20]='0';
					
				}

				printf("\n4014read=%f LO_4014=%f \n",avalue,LO_4014);





				flag=0;
			}
			i++;
		}
		else
		{	/* Check timeout */
			timeout--;
			if (timeout == 0)
			{
				flag = 0;
				printf("\nTimeout03(read)\n");
			}
		}
	}	/* End of receive data while() */
}

write04()
{
	int i;
	char flag;
	unsigned long int timeout;

	if (sec_flag)
	{
		
		cmd04[3]=ao_table[ao_count*2];
		cmd04[4]=ao_table[ao_count*2+1];
		rec[21]	=cmd04[3];
		rec[22]	=cmd04[4];
		if (updown)
			ao_count++;
		else
			ao_count--;
		

		i=0;
		flag=1;
		while (flag)
		{
			outportb(base1,cmd04[i]);	  /* Send data */
			if (cmd04[i] ==	0x0d)
				flag=0;
			i++;
		}
		if (ao_count==11)
		{
			updown=0;		/* down	mode */
			ao_count=9;
		}
		if (ao_count<0)
		{
			updown=1;		/* up mode */
			ao_count=1;
		}

		i=0;
		flag=1;
		timeout=TIME_OUT;
		while (flag)
		{
			/* Check for received data on port 2 */
			if ((inportb(base1+5) &	1) !=0)
			{
				if (inportb(base1)==0x0d)
					flag=0;
			}
			else
			{	/* Check timeout */
				timeout--;
				if (timeout == 0)
				{
					flag = 0;
					printf("\nTimeout04(write)\n");
				}
			}
		}	/* End of receive data while() */


	}
}

void interrupt com1()
{
	char recdata;
	char i;
	disable();
	led_off();

	recdata=inportb(0x3f8);

	if (recnum1>=4)		/*== santax error ==*/
		recnum1=0;

	if( recdata != 0x0d)
	{
		if (recdata=='#')
		{
			recnum1=0;
			reccom1[recnum1]=recdata;
			recnum1++;
		}
		else
		{
			if (recnum1>0)
			{
				reccom1[recnum1]=recdata;
				recnum1++;
			}
		}
	}
	else
	{
		if (reccom1[0]=='#' &&	reccom1[1]=='0'	&& reccom1[2]=='0')
		{
			for (i=0;i<28;i++)
			{
				if (i>12)
					outportb(0x3f8,rec[i]);
				else
				{
					outportb(0x3f8,rec[i]);
					while( (inportb(0x3f8+5)&0x60)	!=0x60);
				}
			}
		}
	}

	led_on();

	enable();
	EOI();	/*  */
}

set_com1_vect()
{
	setvect(0xc, com1);
}

EOI()
{
	outport(0xff22,0x8FFC);	     /*	EOI  INT 0*/
}

enable_com1_irq()
{
	outport(0xff28,inport(0xff28) &	0xffef); /* INT0 interrupt enable*/
}
enable_com2_irq()
{
	outport(0xff28,inport(0xff28) &	0xffbf); /* INT2 interrupt enable*/
}

disable_com1_irq()
{
	outport(0xff28,inport(0xff28) |	0x0010); /* INT0 interrupt disable */
}
disable_com2_irq()
{
	outport(0xff28,inport(0xff28) |	0x0040); /* INT2 interrupt disable */
}

wdt_on()
{
	outport(0xff76,inport(0xff76) |	0x2000);	/* output mode */
	outport(0xff78,inport(0xff78) &	0xDFFF);	/* 10 */
	outport(0xff7A,inport(0xff7A) |	0x2000);	/* WDI =1 */
}

wdt_clear()
{
	outport(0xff7A,inport(0xff7A) &	0xDFFF);	/* WDI = 0 */
	outport(0xff7A,inport(0xff7A) |	0x2000);	/* WDI = 1 */
}

wdt_off()
{
	outport(0xff76,inport(0xff76) &	0xDFFF);	/* normal mode */
	outport(0xff78,inport(0xff78) &	0xDFFF);	/* 00 */
}

led_init()
{
	outport(0xff76,inport(0xff76) |	0x0400);	/* output mode */
	outport(0xff78,inport(0xff78) &	0xFBFF);	/* 10 */
}
led_on()
{
	outport(0xff7A,inport(0xff7A) |	0x0400);	/* LED = 1 */
}
led_off()
{
	outport(0xff7A,inport(0xff7A) &	0xFBFF);	/* LED = 0 */
}



void main()
{
	struct time timep;
	int i,j;
	int asec;
	char temp;

	char aauto;
	char auto_count=0;
	char man_flag1=0;
	char man_flag2=0;

	char man_count1=0;
	char man_count2=0;


	disable(); /* disable interrupt	*/

	led_init();

	gettime(&timep);
	asec=timep.ti_hund;

	rec[27]=0x0d;
	recnum1=0;


	set_coma_vect();


	outportb((0x3f8+2),0x03);	 /*	    enable COM1	FIFO */
	outportb((0x2f8+2),0x03);	 /*	    enable COM2	FIFO */

	outportb(0x3f8+3,0x80);			    /* set DLAB=1 */
	outportb(0x3f8	,0x0C);	outportb(0x3f8+1,0x0);	/* set buad = 9600   */
	outportb(0x3f8+3,0x03);			    /* set data=8 stop=1 no parity */
	outportb(0x3f8+1,0x01);			    /* enable COM1 interrupt */

	outportb(0x2f8+3,0x80);			    /* set DLAB=1 */
	outportb(0x2f8	,0x0C);	outportb(0x2f8+1,0x0);	/* set buad = 9600   */
	outportb(0x2f8+3,0x03);			    /* set data=8 stop=1 no parity */
	outportb(0x2f8+1,0x00);			    /* disable COM2 interrupt */

	 wdt_on();

	 enable(); /* enable interrupt */
	 enable_com1_irq();
	 while(1)
	 {
		read01();
		if (sec_flag)
		{
		if (rec[2]>'9')
			temp=rec[2]-'a'+10;
		else
			temp=rec[2]-0x30;
		if (temp & 1)
		{
			aauto=0;
			if (temp & 2)
				man_flag1=0;
			else
				man_flag1=1;

			if (temp & 4)
				man_flag2=0;
			else
				man_flag2=1;

		}
		else
		{
			aauto=1;
		}

		if (aauto)
		{
			if (auto_count==0)
			{
				cmddo[6]='1';
				write01();
			}
			if (auto_count==1)
			{
				cmddo[6]='2';
				write01();
			}
			if (auto_count==2)
			{
				cmddo[6]='4';
				write01();
			}
			if (auto_count==3)
			{
				cmddo[6]='8';
				write01();
			}

			auto_count++;
			if (auto_count==4)
				auto_count=0;

		}
		else
		{
			if (man_flag1)
			{
				if (man_count1==0)
				{
					if (man_flag2)

						if (man_count2==0)
							cmddo[6]='9';
						else
							cmddo[6]='5';
					else
						cmddo[6]='1';
					write01();
				}
				if (man_count1==1)
				{
					if (man_flag2)
						if (man_count2==0)
							cmddo[6]='A';
						else
							cmddo[6]='6';
					else
						cmddo[6]='2';

					write01();
				}

				man_count1++;
				if (man_count1==2)
					man_count1=0;
			}

			if (man_flag2)
			{
				if (man_count2==0)
				{
					if (man_flag1)
						if (man_count1==0)
							cmddo[6]='6';
						else
							cmddo[6]='5';
					else
						cmddo[6]='4';
					write01();
				}
				if (man_count2==1)
				{
					if (man_flag1)
						if (man_count1==0)
							cmddo[6]='A';
						else
							cmddo[6]='9';
					else
						cmddo[6]='8';

					write01();
				}

				man_count2++;
				if (man_count2==2)
					man_count2=0;


			}

		}
		}

		read02();
		wdt_clear();
		read03();
		wdt_clear();

		write04();

		gettime(&timep);

		printf("\n asec=%d ti_hund=%d\n",asec,timep.ti_hund);

		if (timep.ti_hund>asec)
		{
			sec_flag=1;
			asec=timep.ti_hund;
		}
		else
		{
			if (asec>50 && timep.ti_hund<10)
			{
				sec_flag=1;
				asec=timep.ti_hund;
			}
			else
				sec_flag=0;
		}
		wdt_clear();
		
		for (i=0;i<28;i++)
			printf("%c",rec[i]);

	     wdt_clear();
	 }

}

