mirror of
				https://github.com/Klipper3d/klipper.git
				synced 2025-10-31 18:36:09 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Save arbitrary variables so that values can be kept across restarts.
 | |
| #
 | |
| # Copyright (C) 2020 Dushyant Ahuja <dusht.ahuja@gmail.com>
 | |
| # Copyright (C) 2016-2020  Kevin O'Connor <kevin@koconnor.net>
 | |
| #
 | |
| # This file may be distributed under the terms of the GNU GPLv3 license.
 | |
| import os, logging, ast, configparser
 | |
| 
 | |
| class SaveVariables:
 | |
|     def __init__(self, config):
 | |
|         self.printer = config.get_printer()
 | |
|         self.filename = os.path.expanduser(config.get('filename'))
 | |
|         self.allVariables = {}
 | |
|         try:
 | |
|             if not os.path.exists(self.filename):
 | |
|                 open(self.filename, "w").close()
 | |
|             self.loadVariables()
 | |
|         except self.printer.command_error as e:
 | |
|             raise config.error(str(e))
 | |
|         gcode = self.printer.lookup_object('gcode')
 | |
|         gcode.register_command('SAVE_VARIABLE', self.cmd_SAVE_VARIABLE,
 | |
|                                desc=self.cmd_SAVE_VARIABLE_help)
 | |
|     def loadVariables(self):
 | |
|         allvars = {}
 | |
|         varfile = configparser.ConfigParser()
 | |
|         try:
 | |
|             varfile.read(self.filename)
 | |
|             if varfile.has_section('Variables'):
 | |
|                 for name, val in varfile.items('Variables'):
 | |
|                     allvars[name] = ast.literal_eval(val)
 | |
|         except:
 | |
|             msg = "Unable to parse existing variable file"
 | |
|             logging.exception(msg)
 | |
|             raise self.printer.command_error(msg)
 | |
|         self.allVariables = allvars
 | |
|     cmd_SAVE_VARIABLE_help = "Save arbitrary variables to disk"
 | |
|     def cmd_SAVE_VARIABLE(self, gcmd):
 | |
|         varname = gcmd.get('VARIABLE')
 | |
|         if (varname.lower() != varname):
 | |
|             raise gcmd.error("VARIABLE must not contain upper case")
 | |
|         value = gcmd.get('VALUE')
 | |
|         try:
 | |
|             value = ast.literal_eval(value)
 | |
|         except ValueError as e:
 | |
|             raise gcmd.error("Unable to parse '%s' as a literal" % (value,))
 | |
|         newvars = dict(self.allVariables)
 | |
|         newvars[varname] = value
 | |
|         # Write file
 | |
|         varfile = configparser.ConfigParser()
 | |
|         varfile.add_section('Variables')
 | |
|         for name, val in sorted(newvars.items()):
 | |
|             varfile.set('Variables', name, repr(val))
 | |
|         try:
 | |
|             f = open(self.filename, "w")
 | |
|             varfile.write(f)
 | |
|             f.close()
 | |
|         except:
 | |
|             msg = "Unable to save variable"
 | |
|             logging.exception(msg)
 | |
|             raise gcmd.error(msg)
 | |
|         self.loadVariables()
 | |
|     def get_status(self, eventtime):
 | |
|         return {'variables': self.allVariables}
 | |
| 
 | |
| def load_config(config):
 | |
|     return SaveVariables(config)
 |