/* Time code decoder v0.x */ #include #define hlno 150 #define UNREADABLE 8 #define MKR 4 #define ONE 2 #define ZERO 1 #define min04 8 #define max04 16 #define min07 17 #define max07 25 #define min10 26 #define max10 34 #define min13 35 #define max13 43 #define min16 44 #define max16 52 int pmserch(char c); void display(int sec, char dat); /* Initialize routine Set max count value Set system timer */ void main(int argc, char *argv[]){ static char usage[] = "\tusage: eva infile\n\0"; /* static char cr = '\r'; */ FILE *fp; int i, ic; char hl[hlno]; int hlptr, hlptrx, hcount; int pmresult; char prevlevel; int sec; char dat; int count; char ref[60]; prevlevel = 'X'; sec = -1; dat = UNREADABLE; count = 100; ref[0] = MKR; ref[1] = ONE | ZERO; ref[2] = ONE | ZERO; ref[3] = ONE | ZERO; ref[4] = ZERO; ref[5] = ONE | ZERO; ref[6] = ONE | ZERO; ref[7] = ONE | ZERO; ref[8] = ONE | ZERO; ref[9] = MKR; ref[10] = ZERO; ref[11] = ZERO; ref[12] = ONE | ZERO; ref[13] = ONE | ZERO; ref[14] = ZERO; ref[15] = ONE | ZERO; ref[16] = ONE | ZERO; ref[17] = ONE | ZERO; ref[18] = ONE | ZERO; ref[19] = MKR; ref[20] = ZERO; ref[21] = ZERO; ref[22] = ONE | ZERO; ref[23] = ONE | ZERO; ref[24] = ZERO; ref[25] = ONE | ZERO; ref[26] = ONE | ZERO; ref[27] = ONE | ZERO; ref[28] = ONE | ZERO; ref[29] = MKR; ref[30] = ONE | ZERO; ref[31] = ONE | ZERO; ref[32] = ONE | ZERO; ref[33] = ONE | ZERO; ref[34] = ZERO; ref[35] = ZERO; ref[36] = ONE | ZERO; ref[37] = ONE | ZERO; ref[38] = ONE | ZERO; ref[39] = MKR; ref[40] = ONE | ZERO; ref[41] = ONE | ZERO; ref[42] = ONE | ZERO; ref[43] = ONE | ZERO; ref[44] = ONE | ZERO; ref[45] = ONE | ZERO; ref[46] = ONE | ZERO; ref[47] = ONE | ZERO; ref[48] = ONE | ZERO; ref[49] = MKR; ref[50] = ONE | ZERO; ref[51] = ONE | ZERO; ref[52] = ONE | ZERO; ref[53] = ONE | ZERO; ref[54] = ONE | ZERO; ref[55] = ZERO; ref[56] = ZERO; ref[57] = ZERO; ref[58] = ZERO; ref[59] = MKR; for (i = 0; i < hlno; i++) hl[i] = 'X'; hlptr = 0; /* current ptr for hl[] */ hcount = 0; /* preceeding 'H' count */ if(argc != 2){ fprintf(stderr, "%s", usage); return; } /* From here --- printf("%d, ", argc); for (i=0; i < argc; i++){ printf("%s, ", &argv[i][0]); } printf("\n"); ---- to here, comand line arguments aquire section debug routine */ /* Open input file */ if (NULL == (fp = fopen(&argv[1][0], "r+b"))){ fprintf(stderr, "File open error. Program terminated.\n"); return; } /* Main routine start */ while (1){ ic = getc(fp); if ((ic == EOF) | (ic > 255)) break; if ((ic == ',') | (ic == '\n') | (ic == '\r')) continue; /* start of noise rejection */ /* putchar(ic); /***/ /* putchar(' '); /***/ if (ic < '4') /* 1-3 => 0 --> L, 4-7 => 8 --> H */{ hl[hlptr] = 'L'; if (hcount < 5) /* previous continued 'H' < 5, fix them to 'L' */{ for (i = hcount; i > 0; i--){ if ((hlptrx = hlptr -i) < 0) hlptrx = hlno + hlptrx; hl[hlptrx] = 'L'; } } hcount = 0; }else{ hl[hlptr] = 'H'; hcount++; } hlptr = (hlptr + 1) % hlno; /* end of noise rejection */ /* Write data */ if ((hlptrx = hlptr - 5) < 0) hlptrx = hlno + hlptrx; /* putchar(hl[hlptrx]);/***/ count++; /* if((sec > -1) && (sec < 60)) printf(" ref=%d", ref[sec]);/***/ /* printf(" count=%d", count);/***/ pmresult = pmserch(hl[hlptrx]); if((prevlevel == 'H') && (hl[hlptrx] == 'L')){ if(pmresult == 02){ dat = MKR; sec = 0; printf(" sec=%02d dat=MKR", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else{ switch(dat){ case MKR: /* printf(" case=MKR");/***/ if(count < min10){ break; }else if((ref[sec] & MKR) && (count <= max10)){ dat = MKR; printf(" sec=%02d dat=MKR", sec);/***/ display(sec, dat); /* putchar('\n');/***/ if(sec != -1) if(++sec == 60) sec = 0; count = 0; }else if((ref[sec] & ONE) && (count <= max13)){ dat = ONE; printf(" sec=%02d dat=1", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else if((ref[sec] & ZERO) && (count <= max16)){ dat = ZERO; printf(" sec=%02d dat=0", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; } break; case ONE: /* printf(" case=ONE");/***/ if(count < min07){ break; }else if((ref[sec] & MKR) && (count <= max07)){ dat = MKR; printf(" sec=%02d dat=MKR", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else if((ref[sec] & ONE) && (count <= max10)){ dat = ONE; printf(" sec=%02d dat=1", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else if((ref[sec] & ZERO) && (count <= max13)){ dat = ZERO; printf(" sec=%02d dat=0", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; } break; case ZERO: /* printf(" case=ZERO");/***/ case UNREADABLE: /* printf(" case=UNREADABLE");/***/ if(count < min04){ break; }else if((ref[sec] & MKR) && (count <= max04)){ dat = MKR; printf(" sec=%02d dat=MKR", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else if((ref[sec] & ONE) && (count <= max07)){ dat = ONE; printf(" sec=%02d dat=1", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; }else if((ref[sec] & ZERO) && (count <= max10)){ dat = ZERO; printf(" sec=%02d dat=0", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 0; } break; default: } } }else{ if((dat == MKR) && (count > max16)){ dat = UNREADABLE; printf(" sec=%02d dat=?", sec);/***/ display(sec, dat); /* putchar('\n');/***/ if(sec != -1) if(++sec == 60) sec = 0; count = 1; }else if((dat == ONE) && (count > max13)){ dat = UNREADABLE; printf(" sec=%02d dat=?", sec);/***/ display(sec, dat); /* putchar('\n');/***/ sec++; count = 1; }else if(((dat == ZERO) || (dat == UNREADABLE)) && (count > max10)){ dat = UNREADABLE; printf(" sec=%02d dat=?", sec);/***/ display(sec, dat); /* putchar('\n');/***/ if(sec != -1) if(++sec == 60) sec = 0; count = 1; } } /* putchar('\n');/***/ prevlevel = hl[hlptrx]; /* Main routine end */ } /* Close input file automatically -- so I don't issue fclose */ } int pmserch(char c){ #define zeroHmin 22 #define zeroHmax 26 #define zeroLmin 3 #define zeroLmax 8 #define PHmin 3 #define PHmax 8 #define PLmin 22 #define PLmax 26 static int PMstate; static int levelperiod; if(c == 'X') PMstate = -1; switch(PMstate){ case 155: if(c == 'H') break; else /* c == 'L' */ { if(levelperiod >= zeroHmin){ PMstate = 55; levelperiod = 0; }else PMstate = -1; } break; case 55: if(c == 'L'){ if(levelperiod < zeroLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= zeroLmin){ PMstate = 156; levelperiod = 0; }else PMstate = -1; } break; case 156: if(c == 'H'){ if(levelperiod < zeroHmax) break; else PMstate = -1; }else /* c == 'L' */ { if(levelperiod >= zeroHmin){ PMstate = 56; levelperiod = 0; }else PMstate = -1; } break; case 56: if(c == 'L'){ if(levelperiod < zeroLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= zeroLmin){ PMstate = 157; levelperiod = 0; }else PMstate = -1; } break; case 157: if(c == 'H'){ if(levelperiod < zeroHmax) break; else PMstate = -1; }else /* c == 'L' */ { if(levelperiod >= zeroHmin){ PMstate = 57; levelperiod = 0; }else PMstate = -1; } break; case 57: if(c == 'L'){ if(levelperiod < zeroLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= zeroLmin){ PMstate = 158; levelperiod = 0; }else PMstate = -1; } break; case 158: if(c == 'H'){ if(levelperiod < zeroHmax) break; else PMstate = -1; }else /* c == 'L' */ { if(levelperiod >= zeroHmin){ PMstate = 58; levelperiod = 0; }else PMstate = -1; } break; case 58: if(c == 'L'){ if(levelperiod < zeroLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= zeroLmin){ PMstate = 159; levelperiod = 0; }else PMstate = -1; } break; case 159: if(c == 'H'){ if(levelperiod < PHmax) break; else PMstate = 158; }else /* c == 'L' */ { if(levelperiod >= PHmin){ PMstate = 59; levelperiod = 0; }else PMstate = -1; } break; case 59: if(c == 'L'){ if(levelperiod < PLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= PLmin){ PMstate = 100; levelperiod = 0; }else PMstate = 59+1; } break; case (59+1): if(c == 'L'){ if(levelperiod < PLmax) PMstate = 59; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod < PLmax) break; else /* levelperiod == PLmax */ { PMstate = 100; levelperiod = (PLmax - PLmin)/2 - 1; } } break; case 100: if(c == 'H'){ if(levelperiod < PHmax) break; else PMstate = -1; }else /* c == 'L' */ { if(levelperiod >= PHmin){ PMstate = 02; levelperiod = 0; }else PMstate = -1; } break; case 02: if(c == 'L'){ if(levelperiod < PLmax){ PMstate = 00; break; }else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= PLmin){ PMstate = -1; levelperiod = 0; }else PMstate = 00+1; } break; case 00: if(c == 'L'){ if(levelperiod < PLmax) break; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod >= PLmin){ PMstate = -1; levelperiod = 0; }else PMstate = 00+1; } break; case (00+1): if(c == 'L'){ if(levelperiod < PLmax) PMstate = 00; else PMstate = -1; }else /* c == 'H' */ { if(levelperiod < PLmax) break; else /* levelperiod == PLmax */ PMstate = -1; } break; default: if(c == 'H') PMstate = 155; levelperiod = 0; } levelperiod++; /*printf(" PMstate=%d", PMstate);/***/ return(PMstate); } void display(int sec, char dat){ static int date[12] = { -1,/*[0] min*/ -1,/*[1] hour*/ -1,/*[2] date*/ -1,/*[3] PA1*/ -1,/*[4] PA2*/ -1,/*[5] SU1*/ -1,/*[6] SU2*/ -1,/*[7] year*/ -1,/*[8] day_of_a_week*/ -1 /*[9] leap_second*/ /*[10] month*/ /*[11] day*/ }; switch(sec){ case 0: putchar('\n'); break; case 1:/* 40 min */ if(dat == ONE){ date[0] = 40; date[4] = 1; }else if(dat == ZERO){ date[0] = 0; date[4] = 0; }else date[0] = -1; putchar('\n'); break; case 2:/* 20 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 20; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; putchar('\n'); break; case 3:/* 10 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 10; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; putchar('\n'); break; case 4: putchar('\n'); break; case 5:/* 8 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 8; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; putchar('\n'); break; case 6:/* 4 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 4; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; putchar('\n'); break; case 7:/* 2 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 2; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; putchar('\n'); break; case 8:/* 1 min */ if(date[0] != -1) if(dat == ONE){ date[0] += 1; date[4]++; }else if(dat == UNREADABLE) date[0] = -1; else; else; if(date[0] != -1) printf("\t%02d minute(s)\n", date[0]); else printf("\t?? minute(s)\n"); break; case 9: putchar('\n'); break; case 10: putchar('\n'); break; case 11: putchar('\n'); break; case 12:/* 20 o'clock */ if(dat == ONE){ date[1] = 20; date[3] = 1; }else if(dat == UNREADABLE) date[1] = -1; else{ date[1] = 0; date[3] = 0; } putchar('\n'); break; case 13:/* 10 o'clock */ if(date[1] != -1) if(dat == ONE){ date[1] += 10; date[3]++; }else if(dat == UNREADABLE) date[1] = -1; else; else; putchar('\n'); break; case 14: putchar('\n'); break; case 15:/* 8 o'clock */ if(date[1] != -1) if(dat == ONE){ date[1] += 8; date[3]++; }else if(dat == UNREADABLE) date[1] = -1; else; else; putchar('\n'); break; case 16:/* 4 o'clock */ if(date[1] != -1) if(dat == ONE){ date[1] += 4; date[3]++; }else if(dat == UNREADABLE) date[1] = -1; else; else; putchar('\n'); break; case 17:/* 2 o'clock */ if(date[1] != -1) if(dat == ONE){ date[1] += 2; date[3]++; }else if(dat == UNREADABLE) date[1] = -1; else; else; putchar('\n'); break; case 18:/* 1 o'clock */ if(date[1] != -1) if(dat == ONE){ date[1] += 1; date[3]++; }else if(dat == UNREADABLE) date[1] = -1; else; else; if(date[1] != -1) printf("\t%02d o\'clock\n", date[1]); else printf("\t?? o\'clock\n"); break; case 19: putchar('\n'); break; case 20: putchar('\n'); break; case 21: putchar('\n'); break; case 22:/* 200 days since Jan. 1st. */ if(dat == ONE) date[2] = 200; else if(dat == UNREADABLE) date[2] = -1; else date[2] = 0; putchar('\n'); break; case 23:/* 100 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 100; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 24: putchar('\n'); break; case 25:/* 80 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 80; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 26:/* 40 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 40; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 27:/* 20 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 20; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 28:/* 10 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 10; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 29: putchar('\n'); break; case 30:/* 8 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 8; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 31:/* 4 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 4; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 32:/* 2 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 2; else if(dat == UNREADABLE) date[2] = -1; else; else; putchar('\n'); break; case 33:/* 1 days since Jan. 1st. */ if(date[2] != -1) if(dat == ONE) date[2] += 1; else if(dat == UNREADABLE) date[2] = -1; else; else; if(date[2] != -1) printf("\t%02d days since Jan. 1.\n", date[2]); else printf("\t?? days since Jan. 1.\n"); break; case 34: putchar('\n'); break; case 35: putchar('\n'); break; case 36:/* o'clock parity */ if((dat == UNREADABLE) || (date[1] == -1)) printf("\tlost parity or hour data\n"); else{ if(dat == ONE) date[3]++; if(date[3] % 2) printf("\thour data parity check failed\n"); else printf("\thour data parity check passed\n"); } break; case 37:/* minute parity */ if((dat == UNREADABLE) || (date[0] == -1)) printf("\tlost parity or minutes data\n"); else{ if(dat == ONE) date[4]++; if(date[4] % 2) printf("\tminutes data parity check failed\n"); else printf("\tminutes data parity check passed\n"); } break; case 38: putchar('\n'); break; case 39: putchar('\n'); break; case 40: putchar('\n'); break; case 41:/* 80 years of lower 2 digits */ if(dat == ONE) date[7] = 80; else if(dat == UNREADABLE) date[7] = -1; else date[7] = 0; putchar('\n'); break; case 42:/* 40 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 40; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 43:/* 20 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 20; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 44:/* 10 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 10; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 45:/* 8 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 8; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 46:/* 4 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 4; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 47:/* 2 years of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 2; else if(dat == UNREADABLE) date[7] = -1; else; else; putchar('\n'); break; case 48:/* 1 date[7] of lower 2 digits */ if(date[7] != -1) if(dat == ONE) date[7] += 1; else if(dat == UNREADABLE) date[7] = -1; else; else; if(date[7] != -1) printf("\t\'%02d year\n", date[7]); else printf("\t\'?? year\n"); break; case 49: putchar('\n'); break; case 50:/* day of the week code */ if(dat == ONE) date[8] = 104; else if(dat == UNREADABLE) date[8] = -1; else date[8] = 100; putchar('\n'); break; case 51:/* day of the week code */ if(date[8] != -1) if(dat == ONE) date[8] += 2; else if(dat == UNREADABLE) date[8] = -1; else; else; putchar('\n'); break; case 52:/* day of the week code */ if(date[8] != -1) if(dat == ONE) date[8] += 1; else if(dat == UNREADABLE) date[8] = -1; else; else; if(date[8] != -1){ switch(date[8]){ case 100: printf("\tSUN\n"); break; case 101: printf("\tMON\n"); break; case 102: printf("\tTUE\n"); break; case 103: printf("\tWED\n"); break; case 104: printf("\tTHU\n"); break; case 105: printf("\tFRI\n"); break; case 106: printf("\tSAT\n"); break; default: printf("\t!?!\n"); } }else printf("\t\???day\n"); break; case 53:/* LS1 leap second code */ if(dat == ONE) date[9] = 2; else if(dat == UNREADABLE) date[9] = -1; else date[9] = 0; putchar('\n'); break; case 54:/* LS2 leap second code */ if(date[9] != -1) if(dat == ONE) date[9] += 1; else if(dat == UNREADABLE) date[9] = -1; else; else; if(date[9] == 0) printf("\tno leap seconnd in a month\n"); else if(date[9] == 3) printf("\t+ leap second in a month\n"); else if(date[9] == 2) printf("\t- leap second in a month\n"); else printf("\tmiss catch leap second info\n"); break; case 55: putchar('\n'); break; case 56: putchar('\n'); break; case 57: putchar('\n'); break; case 58: putchar('\n'); break; case 59: putchar('\t'); if(date[7] != -1){ printf("YY=%02d", date[7]); if(date[2] != -1){ if(date[7] % 4){ if(date[2] <= (31 + 28)){/* Jan or Feb */ date[10] = date[2] / 32 + 1; if(date[10] = 2) date[11] = date[2] - 31; else date[11] = date[2]; }else{/* Mar to Dec */ date[11] = date[2] - (31 + 28); if(date[11] > (31 + 30 + 31 + 30 + 31)){ date[10] = 8; date[11] -= (31 + 30 + 31 + 30 + 31); }else date[10] = 3; date[10] += ((int) (date[11] / (31 + 30))) * 2; if((date[11] %= (31 + 30)) == 0){ date[10]--; date[11] == 30; }else if(date[11] > 31){ date[10]++; date[11] -= 31; }else; } }else{ if(date[2] <= (31 + 29)){/* Jan or Feb */ date[10] = date[2] / 32 + 1; if(date[10] = 2) date[11] = date[2] - 31; else date[11] = date[2]; }else{/* Mar to Dec */ date[11] = date[2] - (31 + 29); if(date[11] > (31 + 30 + 31 + 30 + 31)){ date[10] = 8; date[11] -= (31 + 30 + 31 + 30 + 31); }else date[10] = 3; date[10] += ((int) (date[11] / (31 + 30))) * 2; if((date[11] %= (31 + 30)) == 0){ date[10]--; date[11] == 30; }else if(date[11] > 31){ date[10]++; date[11] -= 31; }else; } } printf(" MM=%02d DD=%02d", date[10], date[11]); } if(date[8] != -1){ switch(date[8]){ case 100: printf(" SUN"); break; case 101: printf(" MON"); break; case 102: printf(" TUE"); break; case 103: printf(" WED"); break; case 104: printf(" THU"); break; case 105: printf(" FRI"); break; case 106: printf(" SAT"); break; default: printf(" !?!"); } } if(date[1] != -1) printf(" HR=%02d", date[1]); else printf(" HR=??"); if(date[0] != -1) printf(" MIN=%02d", date[0]); else printf(" MIN=??"); } putchar('\n'); break; default: putchar('\n'); } return; }