diff --git a/autosave.Makefile b/autosave.Makefile index 97b3c6342a4a1ff7d0e8128df168bbdcc223bbaf..bc6c1f15136bd1020a1b4d7e58f272536ef701c3 100644 --- a/autosave.Makefile +++ b/autosave.Makefile @@ -73,7 +73,7 @@ DBDS += $(ASAPPSRC)/asSupport.dbd SCRIPTS += $(wildcard ../iocsh/*.iocsh) -TEMPLATES += $(ASAAPDB)/save_restoreStatus.db +TEMPLATES += ../template/save_restoreStatus.db TEMPLATES += $(ASAAPDB)/configMenu.db TEMPLATES += $(ASAAPDB)/configMenuNames.req diff --git a/patch/001-disable-extra-save-sets.p0.patch b/patch/001-disable-extra-save-sets.p0.patch new file mode 100644 index 0000000000000000000000000000000000000000..675623c62c16b04079e2e8640caf6e83c660745f --- /dev/null +++ b/patch/001-disable-extra-save-sets.p0.patch @@ -0,0 +1,13 @@ +diff --git asApp/src/save_restore.c asApp/src/save_restore.c +index 594c039..0e31d2b 100644 +--- asApp/src/save_restore.c ++++ asApp/src/save_restore.c +@@ -280,7 +280,7 @@ epicsExportAddress(int, save_restoreDebug); + + STATIC struct chlist *lptr = NULL; /* save-set listhead */ + STATIC int listLock = 0; /* replaces long-term holding of sr_mutex */ +-#define NUM_STATUS_PV_SETS 8 ++#define NUM_STATUS_PV_SETS 2 + STATIC int statusPvsInUse[NUM_STATUS_PV_SETS] = {0}; + STATIC epicsMutexId sr_mutex = NULL; /* mut(ual) ex(clusion) for list of save sets */ + int mustSetPermissions = 0; /* use fchmod() only if save_restoreSet_FilePermissions is used */ diff --git a/patch/002-rename-autosave-pvs.p0.patch b/patch/002-rename-autosave-pvs.p0.patch new file mode 100644 index 0000000000000000000000000000000000000000..566df51fd936794ef6c542e28be14c1ad3481c8d --- /dev/null +++ b/patch/002-rename-autosave-pvs.p0.patch @@ -0,0 +1,67 @@ +diff --git asApp/src/save_restore.c asApp/src/save_restore.c +index 594c039..bdf103f 100644 +--- asApp/src/save_restore.c ++++ asApp/src/save_restore.c +@@ -884,35 +884,35 @@ STATIC int save_restore(void) + /* Build names for save_restore general status PV's with status_prefix */ + if (save_restoreUseStatusPVs && *status_prefix && (*SR_status_PV == '\0')) { + strNcpy(SR_status_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_status_PV, "SR_status", PV_NAME_LEN-1-strlen(SR_status_PV)); ++ strncat(SR_status_PV, "AutosaveStatus", PV_NAME_LEN-1-strlen(SR_status_PV)); + strNcpy(SR_heartbeat_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_heartbeat_PV, "SR_heartbeat", PV_NAME_LEN-1-strlen(SR_heartbeat_PV)); ++ strncat(SR_heartbeat_PV, "Heartbeat", PV_NAME_LEN-1-strlen(SR_heartbeat_PV)); + strNcpy(SR_statusStr_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_statusStr_PV, "SR_statusStr", PV_NAME_LEN-1-strlen(SR_statusStr_PV)); ++ strncat(SR_statusStr_PV, "WorstCaseStatus", PV_NAME_LEN-1-strlen(SR_statusStr_PV)); + strNcpy(SR_recentlyStr_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_recentlyStr_PV, "SR_recentlyStr", PV_NAME_LEN-1-strlen(SR_recentlyStr_PV)); ++ strncat(SR_recentlyStr_PV, "MostRecentStatus", PV_NAME_LEN-1-strlen(SR_recentlyStr_PV)); + TATTLE(ca_search(SR_status_PV, &SR_status_chid), "save_restore: ca_search(%s) returned %s", SR_status_PV); + TATTLE(ca_search(SR_heartbeat_PV, &SR_heartbeat_chid), "save_restore: ca_search(%s) returned %s", SR_heartbeat_PV); + TATTLE(ca_search(SR_statusStr_PV, &SR_statusStr_chid), "save_restore: ca_search(%s) returned %s", SR_statusStr_PV); + TATTLE(ca_search(SR_recentlyStr_PV, &SR_recentlyStr_chid), "save_restore: ca_search(%s) returned %s", SR_recentlyStr_PV); + + strNcpy(SR_rebootStatus_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_rebootStatus_PV, "SR_rebootStatus", PV_NAME_LEN-1-strlen(SR_rebootStatus_PV)); ++ strncat(SR_rebootStatus_PV, "RebootStatus", PV_NAME_LEN-1-strlen(SR_rebootStatus_PV)); + strNcpy(SR_rebootStatusStr_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_rebootStatusStr_PV, "SR_rebootStatusStr", PV_NAME_LEN-1-strlen(SR_rebootStatusStr_PV)); ++ strncat(SR_rebootStatusStr_PV, "RebootStatus-Msg", PV_NAME_LEN-1-strlen(SR_rebootStatusStr_PV)); + strNcpy(SR_rebootTime_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_rebootTime_PV, "SR_rebootTime", PV_NAME_LEN-1-strlen(SR_rebootTime_PV)); ++ strncat(SR_rebootTime_PV, "RebootTime", PV_NAME_LEN-1-strlen(SR_rebootTime_PV)); + TATTLE(ca_search(SR_rebootStatus_PV, &SR_rebootStatus_chid), "save_restore: ca_search(%s) returned %s", SR_rebootStatus_PV); + TATTLE(ca_search(SR_rebootStatusStr_PV, &SR_rebootStatusStr_chid), "save_restore: ca_search(%s) returned %s", SR_rebootStatusStr_PV); + TATTLE(ca_search(SR_rebootTime_PV, &SR_rebootTime_chid), "save_restore: ca_search(%s) returned %s", SR_rebootTime_PV); + + /* disable support */ + strNcpy(SR_disable_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_disable_PV, "SR_disable", PV_NAME_LEN-1-strlen(SR_disable_PV)); ++ strncat(SR_disable_PV, "Disable", PV_NAME_LEN-1-strlen(SR_disable_PV)); + TATTLE(ca_search(SR_disable_PV, &SR_disable_chid), "save_restore: ca_search(%s) returned %s", SR_disable_PV); + + strNcpy(SR_disableMaxSecs_PV, status_prefix, PV_NAME_LEN); +- strncat(SR_disableMaxSecs_PV, "SR_disableMaxSecs", PV_NAME_LEN-1-strlen(SR_disableMaxSecs_PV)); ++ strncat(SR_disableMaxSecs_PV, "DisableMaxSeconds", PV_NAME_LEN-1-strlen(SR_disableMaxSecs_PV)); + TATTLE(ca_search(SR_disableMaxSecs_PV, &SR_disableMaxSecs_chid), "save_restore: ca_search(%s) returned %s", SR_disableMaxSecs_PV); + + +@@ -1175,7 +1175,7 @@ STATIC int save_restore(void) + if (*status_prefix && (plist->status_PV[0] == '\0') && (plist->statusPvIndex < NUM_STATUS_PV_SETS)) { + /*** Build PV names ***/ + /* make common portion of PVname strings */ +- n = (PV_NAME_LEN-1) - epicsSnprintf(plist->status_PV, PV_NAME_LEN-1, "%sSR_%1d_", status_prefix, plist->statusPvIndex); ++ n = (PV_NAME_LEN-1) - epicsSnprintf(plist->status_PV, PV_NAME_LEN-1, "%sPass%1d-", status_prefix, plist->statusPvIndex); + strNcpy(plist->name_PV, plist->status_PV, PV_NAME_LEN); + strNcpy(plist->save_state_PV, plist->status_PV, PV_NAME_LEN); + strNcpy(plist->statusStr_PV, plist->status_PV, PV_NAME_LEN); +@@ -1184,7 +1184,7 @@ STATIC int save_restore(void) + strncat(plist->status_PV, "Status", n); + strncat(plist->name_PV, "Name", n); + strncat(plist->save_state_PV, "State", n); +- strncat(plist->statusStr_PV, "StatusStr", n); ++ strncat(plist->statusStr_PV, "Status-Msg", n); + strncat(plist->time_PV, "Time", n); + /* connect with PV's */ + TATTLE(ca_search(plist->status_PV, &plist->status_chid), "save_restore: ca_search(%s) returned %s", plist->status_PV); diff --git a/template/save_restoreStatus.db b/template/save_restoreStatus.db new file mode 100644 index 0000000000000000000000000000000000000000..df6cfd62bc19576666e860516ddb680eff62a088 --- /dev/null +++ b/template/save_restoreStatus.db @@ -0,0 +1,217 @@ +record(bo, "$(P)Heartbeat") { + alias("$(P)SR_heartbeat") + + field(DESC, "Autosave heartbeat") + field(DTYP, "Soft Channel") + field(ZNAM, "0") + field(ONAM, "1") + field(FLNK, "$(P)Trigger") +} + +record(bo, "$(P)Trigger") { + field(DTYP, "Soft Channel") + field(DOL, "1") + field(UDF, "0") + field(ZNAM, "0") + field(ONAM, "1") + field(OUT, "$(P)DeadIfZero.VAL PP") +} + +record(bo, "$(P)DeadIfZero") { + alias("$(P)SR_deadIfZero") + + field(DESC, "Val = One if autosave loop is running") + field(DTYP, "Soft Channel") + field(ZNAM, "0") + field(ONAM, "1") + field(HIGH, "$(DEAD_SECONDS=300)") +} + +record(mbbo, "$(P)RebootStatus") { + alias("$(P)SR_rebootStatus") + + field(DTYP, "Soft Channel") + field(NOBT, "3") + field(ONVL, "1") + field(TWVL, "2") + field(THVL, "3") + field(FRVL, "4") + field(ZRST, "No Status") + field(ONST, "Failure") + field(TWST, "Warning") + field(THST, "Seq Fail") + field(FRST, "Ok") + field(ONSV, "MAJOR") + field(TWSV, "MINOR") + field(THSV, "MAJOR") +} + +record(mbbo, "$(P)AutosaveStatus") { + alias("$(P)SR_status") + + field(DESC, "Worst-case autosave status") + field(DTYP, "Soft Channel") + field(NOBT, "3") + field(ONVL, "1") + field(TWVL, "2") + field(THVL, "3") + field(FRVL, "4") + field(ZRST, "No Status") + field(ONST, "Failure") + field(TWST, "Warning") + field(THST, "Seq Fail") + field(FRST, "Ok") + field(ONSV, "MAJOR") + field(TWSV, "MINOR") + field(THSV, "MAJOR") +} + +record(stringout, "$(P)MostRecentStatus") { + alias("$(P)SR_recentlyStr") + + field(DESC, "Most recent status") + field(DTYP, "Soft Channel") + field(VAL, "Status unknown") +} + +record(stringout, "$(P)RebootStatus-Msg") { + alias("$(P)SR_rebootStatusStr") + + field(DESC, "Most recent reboot status") + field(DTYP, "Soft Channel") + field(VAL, "Status unknown") +} + +record(stringout, "$(P)RebootTime") { + alias("$(P)SR_rebootTime") + + field(DESC, "Last autosave reboot time") + field(DTYP, "Soft Channel") + field(VAL, "Not yet saved") +} + +record(stringout, "$(P)WorstCaseStatus") { + alias("$(P)SR_statusStr") + + field(DESC, "Worst-case autosave status string") + field(DTYP, "Soft Channel") + field(VAL, "Status unknown") +} + +record(stringout, "$(P)Pass0-Name") { + alias("$(P)SR_0_Name") + + field(DESC, "Name of pass 0 request file") + field(VAL, "Not In Use") + field(DTYP, "Soft Channel") +} + +record(longout, "$(P)Pass0-Method") { + alias("$(P)SR_0_State") + + field(DESC, "Method for pass 0 save restore") + field(DTYP, "Soft Channel") +} + +record(mbbo, "$(P)Pass0-Status") { + alias("$(P)SR_0_Status") + + field(DESC, "Status of pass 0 save restore") + field(DTYP, "Soft Channel") + field(NOBT, "3") + field(ONVL, "1") + field(TWVL, "2") + field(THVL, "3") + field(FRVL, "4") + field(ZRST, "No Status") + field(ONST, "Failure") + field(TWST, "Warning") + field(THST, "Seq Fail") + field(FRST, "Ok") + field(ONSV, "MAJOR") + field(TWSV, "MINOR") + field(THSV, "MAJOR") +} + +record(stringout, "$(P)Pass0-Status-Msg") { + alias("$(P)SR_0_StatusStr") + + field(DESC, "Status of pass 0 save restore") + field(DTYP, "Soft Channel") + field(VAL, "Status unknown") +} + +record(stringout, "$(P)Pass0-Time") { + alias("$(P)SR_0_Time") + + field(DESC, "Timestamp of pass 0 save restore") + field(DTYP, "Soft Channel") + field(VAL, "Not yet saved") +} + +record(stringout, "$(P)Pass1-Name") { + alias("$(P)SR_1_Name") + + field(DESC, "Name of pass 1 request file") + field(VAL, "Not In Use") + field(DTYP, "Soft Channel") +} + +record(longout, "$(P)Pass1-State") { + alias("$(P)SR_1_State") + + field(DESC, "Method for pass 1 save restore") + field(DTYP, "Soft Channel") +} + +record(mbbo, "$(P)Pass1-Status") { + alias("$(P)SR_1_Status") + + field(DESC, "Status of pass 1 save restore") + field(DTYP, "Soft Channel") + field(NOBT, "3") + field(ONVL, "1") + field(TWVL, "2") + field(THVL, "3") + field(FRVL, "4") + field(ZRST, "No Status") + field(ONST, "Failure") + field(TWST, "Warning") + field(THST, "Seq Fail") + field(FRST, "Ok") + field(ONSV, "MAJOR") + field(TWSV, "MINOR") + field(THSV, "MAJOR") +} + +record(stringout, "$(P)Pass1-Status-Msg") { + alias("$(P)SR_1_StatusStr") + + field(DESC, "Status of pass 1 save restore") + field(DTYP, "Soft Channel") + field(VAL, "Status unknown") +} + +record(stringout, "$(P)Pass1-Time") { + alias("$(P)SR_1_Time") + + field(DESC, "Timestamp of pass 1 save restore") + field(DTYP, "Soft Channel") + field(VAL, "Not yet saved") +} + +record(longout, "$(P)DisableMaxSeconds") { + alias("$(P)SR_disableMaxSecs") + + field(DESC, "Length of time to disable autosave") + field(DTYP, "Soft Channel") +} + +record(bo, "$(P)Disable") { + alias("$(P)SR_disable") + + field(DESC, "Disable autosave support") + field(DTYP, "Soft Channel") + field(ZNAM, "Enable") + field(ONAM, "Disable") +}