/* DCF-77 MONITOR, 1999. by: YT2FSG, Stankovic Goran dipl.ing.el.*/ #include #include #include #include #include #include #include #include #include #include #include #include #include "defkey.h" #define PORT_OUT 0x0378 /* paralelni port */ #define PORT_IN 0x0379 /* paralelni port */ /* D0 - SCL pin 2 D1 - DATA pin 3 D2 - RCK pin 4 D3 - PULSE pin 5 B7 (BUSY) - SDA IN pin 11 */ unsigned char vr[80]={0}; unsigned char minut=0,sat=0,dan=1,d_n=1,mesec=1,god=99,zona_b=0; /*char *dan_n[8]={" ","Poned","Utora","Sreda","Cetvr","Petak","Subot","Nedel"};*/ char *dan_n[8]={" ","Po","Ut","Sr","Ce","Pe","Su","Ne"}; /* 001, 010, 011, 100, 101, 110, 111 */ char *zona[4]={"UTC ","Srednje Evropsko","Sred.Evr. Letnje","UTC+3 "}; /* 00 01 10 11 */ int br_sec=0; void send_byte (unsigned char d); void pocscr (void); /*------------------------------------------------------------*/ #if !defined( __TIMER_H ) #include #endif // __TIMER_H #if !defined( __DOS_H ) #include #endif // __DOS_H const unsigned long far * const dosTime = (const unsigned long far * const)MK_FP( 0x40, 0x6C ); unsigned Timer::adjust = calibrate(); Timer::Timer() : time_(0), running(0) { } void Timer::start() { if( !running ) { outportb( 0x43, 0x34 ); asm jmp __1; __1: outportb( 0x40, 0 ); asm jmp __2; __2: outportb( 0x40, 0 ); startTime.dosCount = *dosTime; startTime.timerCount = 0; running = 1; } } void Timer::stop() { outportb( 0x43, 0 ); unsigned char temp = inportb( 0x40 ); TIME stopTime; stopTime.timerCount = (inportb( 0x40 ) << 8) + temp; stopTime.dosCount = *dosTime; TIME elapsedTime; elapsedTime.dosCount = stopTime.dosCount - startTime.dosCount; elapsedTime.timerCount = -( stopTime.timerCount - adjust ); const double fudge = 83810.0/100000.0; time_ += ((elapsedTime.dosCount << 16) + elapsedTime.timerCount)*fudge; /* time_ += ((elapsedTime.dosCount << 16) + elapsedTime.timerCount);*/ running = 0; } void Timer::reset() { time_ = 0; if( running ) start(); } unsigned Timer::calibrate() { adjust = 0; unsigned long sum = 0; Timer w; for( int i = 0; i < 100; i++ ) { w.start(); w.stop(); sum += w.time(); w.reset(); } return (unsigned)((sum+5)/100); } void cekaj(void) { unsigned int i; for (i=0; i<100; i++) { } } unsigned char dcf_test_parity(int von , int bis) { int i; unsigned char par=0; for(i=von; i<=bis; i++) { par = par ^ vr[i]; } return par; } /*------------------------------------------------------------*/ void Racun_Vreme_1(int yp) { unsigned char p1; if (vr[0]==0 && vr[20]==1 ) { if (vr[15]==1) {gotoxy( 61,3);printf("Rezervna antena");} else {gotoxy( 61,3);printf("Normalna antena");} if (vr[16]==1) {gotoxy( 61,4);printf("Letnje vreme");} else {gotoxy( 61,4);printf("Zimsko vreme");} zona_b=vr[18]+vr[17]*2; gotoxy( 61,5);printf("%s",zona[zona_b]); p1=dcf_test_parity(21,27); if (p1==0 || p1==1) { gotoxy( 61,6); printf("P1=%1d",p1); if (vr[28]==p1) { minut=vr[21]+vr[22]*2+vr[23]*4+vr[24]*8+vr[25]*10+vr[26]*20+vr[27]*40; gotoxy( 63,yp); printf(":%02d",minut); } } } } /*------------------------------------------------------------*/ void Racun_Vreme_2(int yp) { unsigned char p2; if (vr[0]==0 && vr[20]==1) { p2=dcf_test_parity(29,34); if (p2==0 || p2==1) { gotoxy( 66,6); printf("P2=%1d",p2); if (vr[35]==p2) { sat =vr[29]+vr[30]*2+vr[31]*4+vr[32]*8+vr[33]*10+vr[34]*20; gotoxy( 61,yp); printf("%2d",sat); } } } } /*------------------------------------------------------------*/ void Racun_Vreme_3(int yp) { unsigned char p3; if (vr[0]==0 && vr[20]==1 && br_sec==58) { p3=dcf_test_parity(36,57); if (p3==0 || p3==1) { gotoxy( 71,6); printf("P3=%01d",p3); if (vr[58]==p3) { dan =vr[36]+vr[37]*2+vr[38]*4+vr[39]*8+vr[40]*10+vr[41]*20; d_n =vr[42]+vr[43]*2+vr[44]*4; mesec=vr[45]+vr[46]*2+vr[47]*4+vr[48]*8+vr[49]*10; god =vr[50]+vr[51]*2+vr[52]*4+vr[53]*8 +vr[54]*10+vr[55]*20+vr[56]*40+vr[57]*80; gotoxy( 70,yp); printf("%02d.%02d.%02d.%s",dan,mesec,god,dan_n[d_n]); } } } } /*------------------------------------------------------------*/ void main (void) /* glavni program */ { /* "0"=70...130 ms "1"=170...230 ms sec=900...1050 ms Sync=1950...2050 ms /*Definisanje impuls/pauze u ms/10 */ unsigned long far im,im1=0.05,im2=0.13,im3=0.16,im4=0.23, sm,sm1=0.90,sm2=1.05,sm3=1.95,sm4=2.05, tn,ts=0; unsigned int i,s,xp=1,yp=7,tt; unsigned char ip=0,ik=0,p1,d1,aa=0; pocscr (); struct time t; struct date d; getdate(&d); gettime(&t); Timer w; gotoxy( 61,2);printf("%2d:%02d:%02d",t.ti_hour,t.ti_min,t.ti_sec); gotoxy( 70,2);printf("%02d.%02d.%02d.",d.da_day,d.da_mon,d.da_year); outportb(PORT_OUT,255); while(1) /* beskonacna petlja*/ { p1 = inportb(PORT_IN); d1=p1&0x80; if (d1==0x80) { if(ip!=1) { gettime(&t); gotoxy( 1,1);printf("*"); tn=t.ti_min*6000+t.ti_sec*100+t.ti_hund; /* if (tn=sm1)&&(sm<=sm2)) { br_sec++;xp=br_sec+1;ts=tn; if (br_sec==29) Racun_Vreme_1(yp); else if (br_sec==36) Racun_Vreme_2(yp); else if (br_sec>58) { br_sec=0;yp=7;xp=br_sec+1; gotoxy(1,7);insline(); } else; } else if ((sm>=sm3)&&(sm<=sm4)) { Racun_Vreme_3(yp);ts=tn; br_sec=0;yp=7;xp=br_sec+1; gotoxy(1,7);insline(); } else if ((sm>sm4)) { br_sec=0;yp=7;xp=br_sec+1;ts=tn; gotoxy(1,7);insline(); } else { br_sec++;xp=br_sec+1;ts=tn; if (br_sec>59) { br_sec=0;yp=7;xp=br_sec+1; gotoxy(1,7);insline(); } aa=4;vr[br_sec]=aa; gotoxy( xp,yp);printf("%1d",aa); } gotoxy( 3,1);printf("=%6d=%6d",sm,im); gotoxy( 66,8);printf(":%02d",br_sec); gotoxy( 61,2);printf("%2d:%02d:%02d",t.ti_hour,t.ti_min,t.ti_sec); } } else { if(ik!=1) { gettime(&t); gotoxy( 1,1);printf(" "); tn=t.ti_min*6000+t.ti_sec*100+t.ti_hund; /* if (tn=im1)&&(im<=im2)) { aa=0;vr[br_sec]=aa; } else if ((im>=im3)&&(im<=im4)) { aa=1;vr[br_sec]=aa; } else { aa=2;vr[br_sec]=aa; } gotoxy( xp,yp);printf("%1d",aa); /* gotoxy( 3,1);printf("=%5d=%5d=%2d",sm,im,br_sec);*/ } } if (kbhit()) if (getch()==ESC) exit(2); }/* beskonacna petlja */ } /*------------------------------------------------------------*/ void pocscr (void) { /* char i,linija[80]= "==============================================================================="; */ clrscr (); window (1,1,80,25); printf(" ===== DCF-77 MONITOR ==== by: YT2FSG, Stankovic Goran dipl.ing.el. ====\n"); printf("0 10 20 30 40 50 58\n"); printf("| | | | | | | | | | | | |\n"); printf("+--Rezervni---++-----+Minut-++-Sat-+-Dan-++d+Mesec+Godina-+\n"); printf("| bity | 1122 | 000|| 00| 00||n|| 0| 0000|\n"); printf("M--------------RAZZAS1248124P124812P1248121241248112481248P\n"); /* gotoxy( 3,15);printf("Esc - Exit ");*/ } /*------------------------------------------------------------*/