/****************************************/
/****  Seven Segment Clock  *************/
/****  April 25, 2006       *************/
/****                       *************/
/****  Made By DAEWOO RYU   *************/
/****  daewooryu@yahoo.co.kr ************/
/****************************************/

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <dos.h>

#define sizeX	100
#define sizeY   160
#define thick	12
#define thick2	50
#define ON		1
#define OFF		0
#define offsetX	40
#define offsetY 200

int charcolor=YELLOW;
unsigned int toggle = ON;
struct times{
	char hours;
	char min;
	char sec;
	char oldhoursh;
	char oldhoursl;
	char oldminh;
	char oldminl;
	char oldsec;
};


void garo(int originX, int originY, int onoff){
	line(originX+0,originY+thick,originX+thick,originY);
	line(originX+0,originY+thick,originX+thick,originY+thick*2);
	line(originX+thick,originY,originX+sizeX-thick,originY);
	line(originX+thick,originY+thick*2,originX+sizeX-thick,originY+thick*2);
	line(originX+sizeX-thick,originY,originX+sizeX,originY+thick);
	line(originX+sizeX-thick,originY+thick*2,originX+sizeX,originY+thick);
	if(onoff == ON){
		setfillstyle(1,charcolor);
	}else{
		setfillstyle(1,BLACK);
	}

	floodfill(originX+thick,originY+thick,WHITE);
}

void sero(int originX, int originY, int onoff){
	line(originX,originY+2*thick,originX-thick,originY+3*thick);
	line(originX,originY+2*thick,originX+thick,originY+3*thick);
	line(originX-thick,originY+3*thick,originX-thick,originY+sizeY/2+thick);
	line(originX+thick,originY+3*thick,originX+thick,originY+sizeY/2+thick);
	line(originX-thick,originY+sizeY/2+thick,originX,originY+sizeY/2+2*thick);
	line(originX+thick,originY+sizeY/2+thick,originX,originY+sizeY/2+2*thick);
	if(onoff == ON){
		setfillstyle(1,charcolor);
	}else{
		setfillstyle(1,BLACK);
	}

	floodfill(originX,originY+3*thick,WHITE);
}

void bar_a(int place,int onoff){
	switch(place){
		case 0:
		case 1: garo(offsetX+place*(sizeX+3*thick),offsetY,onoff);
				break;
		case 2:
		case 3: garo(offsetX+place*(sizeX+3*thick)+thick2,offsetY,onoff);
				break;
		default:break;
	}
}

void bar_b(int place,int onoff){
	switch(place){
		case 0:
		case 1: sero(offsetX+place*(sizeX+3*thick)+sizeX,offsetY,onoff);
				break;
		case 2:
		case 3: sero(offsetX+place*(sizeX+3*thick)+sizeX+thick2,offsetY,onoff);
				break;
		default:break;
	}
}

void bar_c(int place,int onoff){
	switch(place){
		case 0:
		case 1: sero(offsetX+place*(sizeX+3*thick)+sizeX,offsetY+sizeY/2+thick*2,onoff);
				break;
		case 2:
		case 3: sero(offsetX+place*(sizeX+3*thick)+sizeX+thick2,offsetY+sizeY/2+thick*2,onoff);
				break;
		default:break;
	}
}

void bar_d(int place,int onoff){
	switch(place){
		case 0:
		case 1: garo(offsetX+place*(sizeX+3*thick),offsetY+sizeY+thick*4,onoff);
				break;
		case 2:
		case 3: garo(offsetX+place*(sizeX+3*thick)+thick2,offsetY+sizeY+thick*4,onoff);
				break;
		default:break;
	}
}

void bar_e(int place,int onoff){
	switch(place){
		case 0:
		case 1: sero(offsetX+place*(sizeX+3*thick),offsetY+sizeY/2+thick*2,onoff);
				break;
		case 2:
		case 3: sero(offsetX+place*(sizeX+3*thick)+thick2,offsetY+sizeY/2+thick*2,onoff);
				break;
		default:break;
	}
}

void bar_f(int place,int onoff){
	switch(place){
		case 0:
		case 1: sero(offsetX+place*(sizeX+3*thick),offsetY,onoff);
				break;
		case 2:
		case 3: sero(offsetX+place*(sizeX+3*thick)+thick2,offsetY,onoff);
				break;
		default:break;
	}
}

void bar_g(int place,int onoff){
	 switch(place){
		case 0:
		case 1: garo(offsetX+place*(sizeX+3*thick),offsetY+sizeY/2+thick*2,onoff);
				break;
		case 2:
		case 3: garo(offsetX+place*(sizeX+3*thick)+thick2,offsetY+sizeY/2+thick*2,onoff);
				break;
		default:break;
	 }
}

void togglef(void){
	if(toggle == ON){
		toggle = OFF;
	}else{
		toggle = ON;
	}
}

void JumJum(void){
	setcolor(WHITE);

	togglef();

	if(toggle == ON){
		circle(offsetX+2*(sizeX+3*thick),offsetY+sizeY/2,15);
		circle(offsetX+2*(sizeX+3*thick),offsetY+sizeY,15);
		setfillstyle(1,charcolor);
		floodfill(offsetX+2*(sizeX+3*thick),offsetY+sizeY/2,WHITE);
		floodfill(offsetX+2*(sizeX+3*thick),offsetY+sizeY,WHITE);
	}else{
		setfillstyle(1,BLACK);
		bar(offsetX+2*(sizeX+3*thick)-thick,offsetY+sizeY/2-thick,offsetX+2*(sizeX+3*thick)+thick,offsetY+sizeY+thick);
		circle(offsetX+2*(sizeX+3*thick),offsetY+sizeY/2,15);
		circle(offsetX+2*(sizeX+3*thick),offsetY+sizeY,15);
	}

}

void N0(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,ON);
	bar_e(place,ON);
	bar_f(place,ON);
	bar_g(place,OFF);
}

void N1(int place){
	bar_a(place,OFF);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,OFF);
	bar_e(place,OFF);
	bar_f(place,OFF);
	bar_g(place,OFF);
}

void N2(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,OFF);
	bar_d(place,ON);
	bar_e(place,ON);
	bar_f(place,OFF);
	bar_g(place,ON);
}

void N3(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,ON);
	bar_e(place,OFF);
	bar_f(place,OFF);
	bar_g(place,ON);
}

void N4(int place){
	bar_a(place,OFF);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,OFF);
	bar_e(place,OFF);
	bar_f(place,ON);
	bar_g(place,ON);
}

void N5(int place){
	bar_a(place,ON);
	bar_b(place,OFF);
	bar_c(place,ON);
	bar_d(place,ON);
	bar_e(place,OFF);
	bar_f(place,ON);
	bar_g(place,ON);
}

void N6(int place){
	bar_a(place,ON);
	bar_b(place,OFF);
	bar_c(place,ON);
	bar_d(place,ON);
	bar_e(place,ON);
	bar_f(place,ON);
	bar_g(place,ON);
}

void N7(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,OFF);
	bar_e(place,OFF);
	bar_f(place,ON);
	bar_g(place,OFF);
}

void N8(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,ON);
	bar_e(place,ON);
	bar_f(place,ON);
	bar_g(place,ON);
}

void N9(int place){
	bar_a(place,ON);
	bar_b(place,ON);
	bar_c(place,ON);
	bar_d(place,OFF);
	bar_e(place,OFF);
	bar_f(place,ON);
	bar_g(place,ON);
}

struct times get_time(void){
	struct times now;
	union REGS r;
	r.h.ah = 0x02;
	int86(0x1a, &r, &r);
	now.hours = r.h.ch;
	now.min = r.h.cl;
	now.sec = r.h.dh;
	return(now);
}

void click(void){
	sound(500);
	delay(2);
	sound(2000);
	delay(2);
	nosound();
}

void main(void)
{
	int gd=DETECT, gm;
	struct times current;
	int i;
	initgraph(&gd, &gm,"");
	toggle = ON;

	while(!kbhit()){
		settextstyle(7,0,7);
		outtextxy(50,15,"DIGITAL CLOCK");
		settextstyle(7,0,4);
		outtextxy(60,80,"- http://www.NewTC.co.kr");
		settextstyle(5,0,4);
		outtextxy(60,120,"- made by Daewoo Ryu");


		current = get_time();
		//window(1,1,10,2);
		//printf("%x:%x:%x",current.hours,current.min, current.sec);
		//printf("   %d%d:%d%d:%d%d",(current.hours/16),current.hours - (current.hours/16)*16,
		   //						(current.min/16),current.min - (current.min/16)*16,
			 //					(current.sec/16),current.sec - (current.sec/16)*16);
		switch(current.hours/16){
			case 0: N0(0);
					break;
			case 1: N1(0);
					break;
			case 2: N2(0);
					break;
			default:break;
		}

		switch(current.hours - (current.hours/16)*16){
			case 0: N0(1);
					break;
			case 1: N1(1);
					break;
			case 2: N2(1);
					break;
			case 3: N3(1);
					break;
			case 4: N4(1);
					break;
			case 5: N5(1);
					break;
			case 6: N6(1);
					break;
			case 7: N7(1);
					break;
			case 8: N8(1);
					break;
			case 9: N9(1);
					break;
			default:break;
		}
		switch(current.min/16){
			case 0: N0(2);
					break;
			case 1: N1(2);
					break;
			case 2: N2(2);
					break;
			case 3: N3(2);
					break;
			case 4: N4(2);
					break;
			case 5: N5(2);
					break;
			case 6: N6(2);
					break;
			case 7: N7(2);
					break;
			case 8: N8(2);
					break;
			case 9: N9(2);
					break;
			default:break;
		}
		switch(current.min - (current.min/16)*16){
			case 0: N0(3);
					break;
			case 1: N1(3);
					break;
			case 2: N2(3);
					break;
			case 3: N3(3);
					break;
			case 4: N4(3);
					break;
			case 5: N5(3);
					break;
			case 6: N6(3);
					break;
			case 7: N7(3);
					break;
			case 8: N8(3);
					break;
			case 9: N9(3);
					break;
			default:break;

		}
		switch(current.sec/16){
			case 0: N0(4);
					break;
			case 1: N1(4);
					break;
			case 2: N2(4);
					break;
			case 3: N3(4);
					break;
			case 4: N4(4);
					break;
			case 5: N5(4);
					break;
			case 6: N6(4);
					break;
			case 7: N7(4);
					break;
			case 8: N8(4);
					break;
			case 9: N9(4);
					break;
			default:break;
		}
		switch(current.sec - (current.sec/16)*16){
			case 0: N0(5);
					break;
			case 1: N1(5);
					break;
			case 2: N2(5);
					break;
			case 3: N3(5);
					break;
			case 4: N4(5);
					break;
			case 5: N5(5);
					break;
			case 6: N6(5);
					break;
			case 7: N7(5);
					break;
			case 8: N8(5);
					break;
			case 9: N9(5);
					break;
			default:break;
		}

		//charcolor=charcolor++;
		JumJum();
		click();
		delay(1000);
		setfillstyle(1,BLACK);
		bar(offsetX-thick,offsetY-thick,offsetX+5*sizeX+4*thick+thick2,offsetY+sizeY+4*thick);
	}
	getch();
	closegraph();
}

