Auto save for experiment files
juri
// autosave V1
// author: Junis Rindermann
// these functions are used for the auto save functionality
//
// description: put this code in a separate procedure file into the "Igor Procedures folder". It will then generate a Menu item under "Misc" where an autosave feature can be enabled. If enabled, the autosave background task saves a copy of the current experiment "frequencyDrift.pxp" under "_autosave_frequencyDrift.pxp" in the same folder, and subsequently overwrite this copy every 10 minutes. The background task can be disabled from the same menu. The user receives a warning if he disabled autosave, or deletes the root:Package:autosave datafolder. Autosave resumes when an experiment is opened where autosave was enabled the last time it was open. It is ON PURPOSE that the background task DOES NOT save the open experiment. In this way the user keeps the responsibility about his data.
//
// notes:
// the autosave interval is set to 10 min by default. by changing the global variable root:Packages:Autosave:saveintervalmin to another value (in minutes) this can be changed at any time
#pragma IndependentModule=Autosave
Function UpdateAutosaveMenu()
NVAR AutoSaveON=root:Packages:AutoSave:AutoSaveON
// SVAR menustr = root:Packages:AutoSave:AutosaveMenu
if (AutoSaveON==1)
String/G root:Packages:AutoSave:AutosaveMenu = "Turn auto save OFF"
else
String/G root:Packages:AutoSave:AutosaveMenu = "Turn auto save ON"
endif
BuildMenu "Misc"
End
Function ToggleAutoSave()
if (datafolderexists("root:Packages:AutoSave:")) // it is set up
NVAR AutoSaveON = root:Packages:AutoSave:Autosaveon
NVAR saveIntervalMin = root:Packages:AutoSave:saveIntervalMin
variable numTicks
if (Autosaveon == 1) // we switch it OFF
CtrlNamedBackground AutosaveBgrTsk, stop
Autosaveon = 0
print "Auto save was turned OFF."
AutoSaveWarning()
else // we switch if ON
numTicks = 60 * 60 * saveintervalmin // every 10 minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
Autosaveon = 1
print "Auto save was turned ON. A copy of your experiment file is saved every 10 min under the name "+"_autosave_"+IgorInfo(1)+".pxp"
endif
else // it is not set up yet, we will set it up now
if (datafolderexists("root:Packages"))
NewDatafolder/O root:Packages:AutoSave
else
NewDatafolder/O root:Packages
NewDatafolder/O root:Packages:AutoSave
endif
Variable/G root:Packages:AutoSave:AutoSaveON=1
Variable/G root:Packages:AutoSave:saveIntervalMin = 10
NVAR saveintervalmin = root:Packages:AutoSave:saveIntervalMin
UpdateAutosaveMenu()
//saveexperiment
numTicks = 60 * 60 * saveintervalmin // every saveintervalmin minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
// String
print "Auto save was turned ON. A copy of your experiment file is saved every 10 min under the name "+"_autosave_"+IgorInfo(1)+".pxp"
AutosaveON=1
Endif
UpdateAutosaveMenu()
BuildMenu "Misc"
End
Menu "Misc"
StrVarOrDefault("root:Packages:AutoSave:AutoSaveMenu","Initialize and start autosave"), /Q, ToggleAutoSave()
End
Function SaveBackUpNow(s)
STRUCT WMBackgroundStruct &s
// Printf "Task %s called, ticks=%d\r", s.name, s.curRunTicks
if (exists("root:Packages:AutoSave:AutoSaveOn") == 2)
// do nothing
NVAR autosaveon = root:Packages:AutoSave:AutoSaveOn
// if desired the date of the saved version can be added to the file name. this greatly increases the space wasted by the autosaved file copies.
// use this only with great care!! and find a way to remove the oldest autosaved file copies.
//string datestr = time()+" "+date()
//datestr=replacestring(":", datestr, "-")
//datestr=replacestring(",", datestr, "-")
//datestr=replacestring(".", datestr, "-")
String filename = "_autosave_"+IgorInfo(1)+".pxp"
if (HomePathdefined() == 0)
DoAlert/T="Igor asks you..." 0, "This experiment was NOT saved yet. It needs to be saved for AUTO SAVE to work."
Endif
SaveExperiment/C/P=home as filename
if (HomePathdefined() == 0) // clicked cancel
autosaveon = 0
UpdateAutosaveMenu()
BuildMenu "Misc"
CtrlNamedBackground AutosaveBgrTsk, stop
print "This experiment was NOT saved yet. AUTO SAVE cannot work."
DoAlert/T="Detected Cancel:" 0, "The experiment was NOT saved. AUTO SAVE is OFF."
return 0
else
PathInfo home
print "A copy of the experiment file was automatically saved as "+S_path+filename+" on "+time()+" "+date()
endif
// else
// do nothing, wait until auto save is turned ON
// endif
else // stops itself if package folders have been deleted
AutoSaveWarning()
endif
return 0 // Continue background task
End
Function HomePathdefined()
variable HomePathDefined=0
PathInfo home
if (stringmatch(S_path, "")) // home path not defined
HomePathDefined=0
else
HomePathDefined=1
endif
return HomePathDefined
End
Function AutoSaveWarning()
DoAlert/T="Igor asks you..." 1, "It seems you want to turn OFF autosave. Do you want to CONTINUE AUTO SAVE??"
if (v_flag == 1) // YES
ToggleAutoSave()
else // NO
CtrlNamedBackground AutosaveBgrTsk, stop
endif
End
//#pragma rtGlobals=1 // Use modern global access method.
//#pragma moduleName=startup // traditional for static functions
//
Static Function AfterFileOpenHook(refNum, fileNameStr, pathNameStr, fileTypeStr, fileCreatorStr, fileKind )
variable refnum
string filenamestr,pathnamestr,filetypestr, filecreatorstr
variable filekind
if (filekind == 1 || filekind == 2)
if (exists("root:Packages:AutoSave:AutoSaveOn") == 2)
NVAR AutoSaveON = root:Packages:AutoSave:Autosaveon
NVAR saveIntervalMin = root:Packages:AutoSave:saveIntervalMin
variable numTicks
if (Autosaveon == 1) // we resume auto save
numTicks = 60 * 60 * saveintervalmin // every 10 minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
Print "Opened file "+igorinfo(1)+".pxp"+" with active auto save. Auto save is resumed."// Do Stuff
endif
else
//print "Auto save is OFF."
endif
endif
End
// author: Junis Rindermann
// these functions are used for the auto save functionality
//
// description: put this code in a separate procedure file into the "Igor Procedures folder". It will then generate a Menu item under "Misc" where an autosave feature can be enabled. If enabled, the autosave background task saves a copy of the current experiment "frequencyDrift.pxp" under "_autosave_frequencyDrift.pxp" in the same folder, and subsequently overwrite this copy every 10 minutes. The background task can be disabled from the same menu. The user receives a warning if he disabled autosave, or deletes the root:Package:autosave datafolder. Autosave resumes when an experiment is opened where autosave was enabled the last time it was open. It is ON PURPOSE that the background task DOES NOT save the open experiment. In this way the user keeps the responsibility about his data.
//
// notes:
// the autosave interval is set to 10 min by default. by changing the global variable root:Packages:Autosave:saveintervalmin to another value (in minutes) this can be changed at any time
#pragma IndependentModule=Autosave
Function UpdateAutosaveMenu()
NVAR AutoSaveON=root:Packages:AutoSave:AutoSaveON
// SVAR menustr = root:Packages:AutoSave:AutosaveMenu
if (AutoSaveON==1)
String/G root:Packages:AutoSave:AutosaveMenu = "Turn auto save OFF"
else
String/G root:Packages:AutoSave:AutosaveMenu = "Turn auto save ON"
endif
BuildMenu "Misc"
End
Function ToggleAutoSave()
if (datafolderexists("root:Packages:AutoSave:")) // it is set up
NVAR AutoSaveON = root:Packages:AutoSave:Autosaveon
NVAR saveIntervalMin = root:Packages:AutoSave:saveIntervalMin
variable numTicks
if (Autosaveon == 1) // we switch it OFF
CtrlNamedBackground AutosaveBgrTsk, stop
Autosaveon = 0
print "Auto save was turned OFF."
AutoSaveWarning()
else // we switch if ON
numTicks = 60 * 60 * saveintervalmin // every 10 minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
Autosaveon = 1
print "Auto save was turned ON. A copy of your experiment file is saved every 10 min under the name "+"_autosave_"+IgorInfo(1)+".pxp"
endif
else // it is not set up yet, we will set it up now
if (datafolderexists("root:Packages"))
NewDatafolder/O root:Packages:AutoSave
else
NewDatafolder/O root:Packages
NewDatafolder/O root:Packages:AutoSave
endif
Variable/G root:Packages:AutoSave:AutoSaveON=1
Variable/G root:Packages:AutoSave:saveIntervalMin = 10
NVAR saveintervalmin = root:Packages:AutoSave:saveIntervalMin
UpdateAutosaveMenu()
//saveexperiment
numTicks = 60 * 60 * saveintervalmin // every saveintervalmin minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
// String
print "Auto save was turned ON. A copy of your experiment file is saved every 10 min under the name "+"_autosave_"+IgorInfo(1)+".pxp"
AutosaveON=1
Endif
UpdateAutosaveMenu()
BuildMenu "Misc"
End
Menu "Misc"
StrVarOrDefault("root:Packages:AutoSave:AutoSaveMenu","Initialize and start autosave"), /Q, ToggleAutoSave()
End
Function SaveBackUpNow(s)
STRUCT WMBackgroundStruct &s
// Printf "Task %s called, ticks=%d\r", s.name, s.curRunTicks
if (exists("root:Packages:AutoSave:AutoSaveOn") == 2)
// do nothing
NVAR autosaveon = root:Packages:AutoSave:AutoSaveOn
// if desired the date of the saved version can be added to the file name. this greatly increases the space wasted by the autosaved file copies.
// use this only with great care!! and find a way to remove the oldest autosaved file copies.
//string datestr = time()+" "+date()
//datestr=replacestring(":", datestr, "-")
//datestr=replacestring(",", datestr, "-")
//datestr=replacestring(".", datestr, "-")
String filename = "_autosave_"+IgorInfo(1)+".pxp"
if (HomePathdefined() == 0)
DoAlert/T="Igor asks you..." 0, "This experiment was NOT saved yet. It needs to be saved for AUTO SAVE to work."
Endif
SaveExperiment/C/P=home as filename
if (HomePathdefined() == 0) // clicked cancel
autosaveon = 0
UpdateAutosaveMenu()
BuildMenu "Misc"
CtrlNamedBackground AutosaveBgrTsk, stop
print "This experiment was NOT saved yet. AUTO SAVE cannot work."
DoAlert/T="Detected Cancel:" 0, "The experiment was NOT saved. AUTO SAVE is OFF."
return 0
else
PathInfo home
print "A copy of the experiment file was automatically saved as "+S_path+filename+" on "+time()+" "+date()
endif
// else
// do nothing, wait until auto save is turned ON
// endif
else // stops itself if package folders have been deleted
AutoSaveWarning()
endif
return 0 // Continue background task
End
Function HomePathdefined()
variable HomePathDefined=0
PathInfo home
if (stringmatch(S_path, "")) // home path not defined
HomePathDefined=0
else
HomePathDefined=1
endif
return HomePathDefined
End
Function AutoSaveWarning()
DoAlert/T="Igor asks you..." 1, "It seems you want to turn OFF autosave. Do you want to CONTINUE AUTO SAVE??"
if (v_flag == 1) // YES
ToggleAutoSave()
else // NO
CtrlNamedBackground AutosaveBgrTsk, stop
endif
End
//#pragma rtGlobals=1 // Use modern global access method.
//#pragma moduleName=startup // traditional for static functions
//
Static Function AfterFileOpenHook(refNum, fileNameStr, pathNameStr, fileTypeStr, fileCreatorStr, fileKind )
variable refnum
string filenamestr,pathnamestr,filetypestr, filecreatorstr
variable filekind
if (filekind == 1 || filekind == 2)
if (exists("root:Packages:AutoSave:AutoSaveOn") == 2)
NVAR AutoSaveON = root:Packages:AutoSave:Autosaveon
NVAR saveIntervalMin = root:Packages:AutoSave:saveIntervalMin
variable numTicks
if (Autosaveon == 1) // we resume auto save
numTicks = 60 * 60 * saveintervalmin // every 10 minutes
CtrlNamedBackground AutosaveBgrTsk, period = numticks, proc = SaveBackUpNow
CtrlNamedBackground AutosaveBgrTsk, start
Print "Opened file "+igorinfo(1)+".pxp"+" with active auto save. Auto save is resumed."// Do Stuff
endif
else
//print "Auto save is OFF."
endif
endif
End
Forum
Support
Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More