/* ntp.h for Syowa operation * ========================= * * ver 1.00 * * This is a set of routines * related to NonTxPeriod(NTP) feature * which need to be implemented in RCP's * for Syowa operation * You have to include next line in RCP's * to use NTP family * #include "ntp.h" * * by Sessai@NIPR */ #define MAX_NTP_NUM 100 /* global variables for NTP routines... */ short int ntp_start[MAX_NTP_NUM]; /* hhmm */ short int ntp_end[MAX_NTP_NUM]; /* hhmm */ short int ntp_num; extern char errlog_name[]; // declared in support.c /* ------------------------- * NTP routines... by Sessai * ------------------------- */ /* NTP(NonTxPeriod) routines for Syowa operation * added by Sessai in Dec.,1996 * modified by Sessai in Oct.,1997 * modified by Sessai in Nov.,1997 * * int ntp_read(*char errlog); * a routine to read an NTP(NonTxPeriod) table file for Syowa operation * and to set the NTP entries and the entry number * to global variables * * //long int ntp_check(int hr,int mn,int sc,int ms); * int ntp_check(int hr,int mn,int sc,int ms); * a routine to check if it's now in NTP(NonTxPeriod) period or not * and to calculate the rest time (in second) * up to the end of an NTP period which we're now in * and sleep for a required period!! * for Syowa operation * */ int ntp_read(char *errlog) { /* ntp_read(char *errlog); * ====================== * a routine to read an NTP(NonTxPeriod) table file for Syowa operation * and to set the NTP entries and the entry number * to global variables * --------------------------------------------------------------------------- * environmental variable * which should be exported in /radops/scripts/rad_export * SD_NTP_TBL * : path name of your NTP table file * e.g.) export SD_NTP_TBL=/radops/tables/NTP.tbl * NTP table file which shuold be prepared for : * a text file which has NTP entries as much as you need, * each of which has following format * HHMM hhmm * where HHMM : start time (HH=hour,MM=minute) * hhmm : end time (hh=hour,mm=minute) * It's OK if NTP entry number is zero, * but the number should be less than MAX_NTP_NUM below. * (if not, entries which exceed the number, just ignored) * global defined variable * MAX_NTP_NUM ( defined in /radops/usr/include/ntp(_def).h ) * : maximun entry number in NTP table file (now it's 100) * errlog_name[]; * : extern string declared in support.c * global variables which will be set by this routine * short int ntp_start[MAX_NTP_NUM] * : start time ("hhmm") array of NTP * short int ntp_end[MAX_NTP_NUM] * : end time ("hhmm") array of NTP * short int ntp_num * : entry number in NTP table file ( < MAX_NTP_NUM ) * input value : char *errlog : errlog task name * if NULL then errlog_name will be "ERRLOG" * return value : 0 if this routine can read an NTP file successfully * : -1 if some error occurrs * * on Jan. 8, 1997 by Sessai@NIPR * on Oct.26, 1997 by Sessai@NIPR */ char *ntp_file; FILE *ntp_fp; short int scan_status; short int i; char log_message[80]=""; char *routine_name="ntp_read"; // #ifdef REPORT fprintf(stderr,"NTP(NonTxPeriod) table being read in...\n"); // #endif if (errlog !=NULL) strcpy(errlog_name,errlog); ntp_num = 0; if ((ntp_file =getenv("SD_NTP_TBL"))==NULL) { log_error(errlog_name,routine_name, "NTP: SD_NTP_TBL not defined"); return -1; } if ( (ntp_fp = fopen(ntp_file,"r"))==NULL) { log_error(errlog_name,routine_name, "NTP: NTP table file not found"); return -1; } scan_status = fscanf(ntp_fp,"%d %d", &ntp_start[ntp_num],&ntp_end[ntp_num]); while(scan_status != EOF) { ntp_num++; if(ntp_num == MAX_NTP_NUM){ log_error(errlog_name,routine_name, "NTP: NTP entry num reaches MAX!"); // break; } if(ntp_num >= MAX_NTP_NUM){ log_error(errlog_name,routine_name, "NTP: NTP entries too much!! ignored..."); // return -1; ntp_num--; break; } scan_status = fscanf(ntp_fp,"%d %d", &ntp_start[ntp_num],&ntp_end[ntp_num]); } fclose(ntp_fp); if (ntp_num==0) { sprintf(log_message, "NTP: No NTP entry in %s",ntp_file); log_error(errlog_name,routine_name,log_message); } else { for (i=0;i<ntp_num;i++) { sprintf(log_message,"NTP: %3d : %04d - %04d", i+1,ntp_start[i],ntp_end[i]); log_error(errlog_name,routine_name,log_message); } } sprintf(log_message,"NTP: ...ntp_num=%d",ntp_num); log_error(errlog_name,routine_name,log_message); return 0; } int ntp_check(int hr,int mn,int sc,int ms) { /* int ntp_check(int hr,int mn,int sc,int ms); * =========================================== * a routine to check if it's now in NTP(NonTxPeriod) period or not * and to calculate the rest time (in second) * up to the end of an NTP period which we're now in * and sleep for a required period!! * for Syowa operation * * global defined variable * MAX_NTP_NUM ( defined in /radops/usr/include/syowa_def.h ) * : maximun entry number in NTP table file (now it's 100) * global variables which are set by ntp_read routine from NTP table file * and which are used in this routine * short int ntp_start[MAX_NTP_NUM] * : start time ("hhmm") array of NTP * short int ntp_end[MAX_NTP_NUM] * : end time ("hhmm") array of NTP * short int ntp_num * : entry number in NTP table file ( < MAX_NTP_NUM ) * input value : int hr : hour now * : int mn : min now * : int sc : sec now * : int ms : msec now * //OLD! return value : 0L if it's now not in NTP period * //OLD! : >0L time to end an NTP where we're now in seconds * New!!! return value : 0 if it's now NOT in NTP period * New!!!! : 1 if it's now in NTP period!!!! * * on Jan. 8, 1997 by Sessai@NIPR * on Nov. 8, 1997 by Sessai@NIPR */ char *routine_name="ntp_check"; long int now,nows,rsec; short int i; if (ntp_num==0) return 0; now = (long)hr * 10000L + (long)mn * 100L + (long)sc; nows= (long)hr * 3600L + (long)mn * 60L + (long)sc; for (i=0;i<ntp_num;i++) { if ( ( (long)ntp_start[i]*100L <= now) && ( now < (long)ntp_end[i]*100L ) ){ rsec=(long)((ntp_end[i]/100)*60 + (ntp_end[i] % 100))*60L - nows; //#ifdef SHOW fprintf(stderr,"NTP_check : "); fprintf(stderr,"S%02d:%02d-",ntp_start[i]/100,ntp_start[i]%100); fprintf(stderr,"E%02d:%02d" ,ntp_end[i] /100,ntp_end[i] %100); fprintf(stderr,"-N%02d:%02d:%02d",hr,mn,sc); fprintf(stderr,"=>Wait%ldsec\n",rsec); //#endif if(rsec <= 2) { if(rsec>0L) sleep((unsigned int)rsec-1); delay( ((1000-ms-20)>0) ? (1000-ms-20) : 0); } else if(rsec <= 10) sleep(2); else if(rsec % 10 != 0) sleep((unsigned int)rsec % 10); else sleep(10); return 1; //return rsec; } } if(sc==59) { delay( ((1000-ms)<20) ? (1000-ms) : 20); return 1; } return 0; }