diff --git a/src/rec/recScan.c b/src/rec/recScan.c index 4a948fa33..ea51ac86a 100644 --- a/src/rec/recScan.c +++ b/src/rec/recScan.c @@ -43,9 +43,11 @@ * .07 10-21-94 nda changed linear scan parameter algorithms so changing * start/end modifies step/width unless frozen. This * seems more intuitive. + * .08 12-06-94 nda added support for .FFO .When set to 1, frzFlag values + * are saved in recPvtStruct. Restored when FFO set to 0. */ -#define VERSION 1.07 +#define VERSION 1.08 @@ -144,6 +146,28 @@ struct recPvtStruct { struct p_limits *pP2Limits; struct p_limits *pP3Limits; struct p_limits *pP4Limits; + short pffo; /* previouss state of ffo */ + short fpts; /* backup copy of all freeze flags */ + short p1fs; + short p1fi; + short p1fc; + short p1fe; + short p1fw; + short p2fs; + short p2fi; + short p2fc; + short p2fe; + short p2fw; + short p3fs; + short p3fi; + short p3fc; + short p3fe; + short p3fw; + short p4fs; + short p4fi; + short p4fc; + short p4fe; + short p4fw; unsigned long tickStart; /* used to time the scan */ unsigned char scanErr; unsigned char nptsCause; /* who caused the "# of points to change: @@ -208,6 +232,9 @@ static void adjLinParms(); static void changedNpts(); static void checkScanLimits(); static void drawPos1Scan(); +static void saveFrzFlags(); +static void resetFrzFlags(); +static void restoreFrzFlags(); /* variables ... */ long scanRecDebug=0; long viewScanPos=0; @@ -286,6 +313,11 @@ static long init_record(pscan,pass) precPvt->nptsCause = 0; /* resolve all positioner parameters */ changedNpts(pscan); + if(pscan->ffo) { + saveFrzFlags(pscan); + resetFrzFlags(pscan); + } + /* init field values */ pscan->exsc = 0; pscan->pxsc = 0; @@ -344,6 +376,7 @@ static long special(paddr,after) unsigned char prevAlrt; if(!after) { + precPvt->pffo = pscan->ffo; /* save previous ffo flag */ return(0); } switch(special_type) { @@ -417,6 +450,25 @@ static long special(paddr,after) } break; + case(SPC_SC_FFO): + /* Freeze Flag Override field */ + if((pscan->ffo) && (!precPvt->pffo)) { + saveFrzFlags(pscan); + resetFrzFlags(pscan); + } + else if(!pscan->ffo && precPvt->pffo) /* only on 1->0 */ + restoreFrzFlags(pscan); + + break; + + case(SPC_SC_F): + /* Freeze Flag Override field */ + if(pscan->ffo) + resetFrzFlags(pscan); + + break; + + default: /* recGblDbaddrError(S_db_badChoice,paddr,"scan: special"); return(S_db_badChoice); @@ -1993,3 +2045,267 @@ static void drawPos1Scan(pscan) } +static void saveFrzFlags(pscan) + struct scanRecord *pscan; +{ + + struct recPvtStruct *precPvt = (struct recPvtStruct *)pscan->rpvt; + + /* save state of each freeze flag */ + precPvt->fpts = pscan->fpts; + precPvt->p1fs = pscan->p1fs; + precPvt->p1fi = pscan->p1fi; + precPvt->p1fc = pscan->p1fc; + precPvt->p1fe = pscan->p1fe; + precPvt->p1fw = pscan->p1fw; + precPvt->p2fs = pscan->p2fs; + precPvt->p2fi = pscan->p2fi; + precPvt->p2fc = pscan->p2fc; + precPvt->p2fe = pscan->p2fe; + precPvt->p2fw = pscan->p2fw; + precPvt->p3fs = pscan->p3fs; + precPvt->p3fi = pscan->p3fi; + precPvt->p3fc = pscan->p3fc; + precPvt->p3fe = pscan->p3fe; + precPvt->p3fw = pscan->p3fw; + precPvt->p4fs = pscan->p4fs; + precPvt->p4fi = pscan->p4fi; + precPvt->p4fc = pscan->p4fc; + precPvt->p4fe = pscan->p4fe; + precPvt->p4fw = pscan->p4fw; +} + +static void resetFrzFlags(pscan) + struct scanRecord *pscan; +{ + + struct recPvtStruct *precPvt = (struct recPvtStruct *)pscan->rpvt; + + /* reset each frzFlag, post monitor if changed */ + + if(pscan->fpts) { + pscan->fpts = 0; + db_post_events(pscan,&pscan->fpts, DBE_VALUE); + } + + if(pscan->p1fs) { + pscan->p1fs = 0; + db_post_events(pscan,&pscan->p1fs, DBE_VALUE); + } + + if(pscan->p1fi) { + pscan->p1fi = 0; + db_post_events(pscan,&pscan->p1fi, DBE_VALUE); + } + + if(pscan->p1fc) { + pscan->p1fc = 0; + db_post_events(pscan,&pscan->p1fc, DBE_VALUE); + } + + if(pscan->p1fe) { + pscan->p1fe = 0; + db_post_events(pscan,&pscan->p1fe, DBE_VALUE); + } + + if(pscan->p1fw) { + pscan->p1fw = 0; + db_post_events(pscan,&pscan->p1fw, DBE_VALUE); + } + + if(pscan->p2fs) { + pscan->p2fs = 0; + db_post_events(pscan,&pscan->p2fs, DBE_VALUE); + } + + if(pscan->p2fi) { + pscan->p2fi = 0; + db_post_events(pscan,&pscan->p2fi, DBE_VALUE); + } + + if(pscan->p2fc) { + pscan->p2fc = 0; + db_post_events(pscan,&pscan->p2fc, DBE_VALUE); + } + + if(pscan->p2fe) { + pscan->p2fe = 0; + db_post_events(pscan,&pscan->p2fe, DBE_VALUE); + } + + if(pscan->p2fw) { + pscan->p2fw = 0; + db_post_events(pscan,&pscan->p2fw, DBE_VALUE); + } + + if(pscan->p3fs) { + pscan->p3fs = 0; + db_post_events(pscan,&pscan->p3fs, DBE_VALUE); + } + + if(pscan->p3fi) { + pscan->p3fi = 0; + db_post_events(pscan,&pscan->p3fi, DBE_VALUE); + } + + if(pscan->p3fc) { + pscan->p3fc = 0; + db_post_events(pscan,&pscan->p3fc, DBE_VALUE); + } + + if(pscan->p3fe) { + pscan->p3fe = 0; + db_post_events(pscan,&pscan->p3fe, DBE_VALUE); + } + + if(pscan->p3fw) { + pscan->p3fw = 0; + db_post_events(pscan,&pscan->p3fw, DBE_VALUE); + } + + if(pscan->p4fs) { + pscan->p4fs = 0; + db_post_events(pscan,&pscan->p4fs, DBE_VALUE); + } + + if(pscan->p4fi) { + pscan->p4fi = 0; + db_post_events(pscan,&pscan->p4fi, DBE_VALUE); + } + + if(pscan->p4fc) { + pscan->p4fc = 0; + db_post_events(pscan,&pscan->p4fc, DBE_VALUE); + } + + if(pscan->p4fe) { + pscan->p4fe = 0; + db_post_events(pscan,&pscan->p4fe, DBE_VALUE); + } + + if(pscan->p4fw) { + pscan->p4fw = 0; + db_post_events(pscan,&pscan->p4fw, DBE_VALUE); + } +} + + + + + +/* Restores Freeze Flags to the state they were in */ +static void restoreFrzFlags(pscan) + struct scanRecord *pscan; +{ + + struct recPvtStruct *precPvt = (struct recPvtStruct *)pscan->rpvt; + + /* restore state of each freeze flag, post if changed */ + pscan->fpts = precPvt->fpts; + if(pscan->fpts) { + db_post_events(pscan,&pscan->fpts, DBE_VALUE); + } + + pscan->p1fs = precPvt->p1fs; + if(pscan->p1fs) { + db_post_events(pscan,&pscan->p1fs, DBE_VALUE); + } + + pscan->p1fi = precPvt->p1fi; + if(pscan->p1fi) { + db_post_events(pscan,&pscan->p1fi, DBE_VALUE); + } + + pscan->p1fc = precPvt->p1fc; + if(pscan->p1fc) { + db_post_events(pscan,&pscan->p1fc, DBE_VALUE); + } + + pscan->p1fe = precPvt->p1fe; + if(pscan->p1fe) { + db_post_events(pscan,&pscan->p1fe, DBE_VALUE); + } + + pscan->p1fw = precPvt->p1fw; + if(pscan->p1fw) { + db_post_events(pscan,&pscan->p1fw, DBE_VALUE); + } + + pscan->p2fs = precPvt->p2fs; + if(pscan->p2fs) { + db_post_events(pscan,&pscan->p2fs, DBE_VALUE); + } + + pscan->p2fi = precPvt->p2fi; + if(pscan->p2fi) { + db_post_events(pscan,&pscan->p2fi, DBE_VALUE); + } + + pscan->p2fc = precPvt->p2fc; + if(pscan->p2fc) { + db_post_events(pscan,&pscan->p2fc, DBE_VALUE); + } + + pscan->p2fe = precPvt->p2fe; + if(pscan->p2fe) { + db_post_events(pscan,&pscan->p2fe, DBE_VALUE); + } + + pscan->p2fw = precPvt->p2fw; + if(pscan->p2fw) { + db_post_events(pscan,&pscan->p2fw, DBE_VALUE); + } + + pscan->p3fs = precPvt->p3fs; + if(pscan->p3fs) { + db_post_events(pscan,&pscan->p3fs, DBE_VALUE); + } + + pscan->p3fi = precPvt->p3fi; + if(pscan->p3fi) { + db_post_events(pscan,&pscan->p3fi, DBE_VALUE); + } + + pscan->p3fc = precPvt->p3fc; + if(pscan->p3fc) { + db_post_events(pscan,&pscan->p3fc, DBE_VALUE); + } + + pscan->p3fe = precPvt->p3fe; + if(pscan->p3fe) { + db_post_events(pscan,&pscan->p3fe, DBE_VALUE); + } + + pscan->p3fw = precPvt->p3fw; + if(pscan->p3fw) { + db_post_events(pscan,&pscan->p3fw, DBE_VALUE); + } + + pscan->p4fs = precPvt->p4fs; + if(pscan->p4fs) { + db_post_events(pscan,&pscan->p4fs, DBE_VALUE); + } + + pscan->p4fi = precPvt->p4fi; + if(pscan->p4fi) { + db_post_events(pscan,&pscan->p4fi, DBE_VALUE); + } + + pscan->p4fc = precPvt->p4fc; + if(pscan->p4fc) { + db_post_events(pscan,&pscan->p4fc, DBE_VALUE); + } + + pscan->p4fe = precPvt->p4fe; + if(pscan->p4fe) { + db_post_events(pscan,&pscan->p4fe, DBE_VALUE); + } + + pscan->p4fw = precPvt->p4fw; + if(pscan->p4fw) { + db_post_events(pscan,&pscan->p4fw, DBE_VALUE); + } + +} + +