minor improvements to settings parser
Code cleanup, better validation logic, better naming of functions
This commit is contained in:
		
							
								
								
									
										124
									
								
								inkycal/config/settings_parser.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								inkycal/config/settings_parser.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| #!/usr/bin/python3 | ||||
| # -*- coding: utf-8 -*- | ||||
| """ | ||||
| Json settings parser. Currently in BETA. | ||||
| Copyright by aceisace | ||||
| """ | ||||
| import json | ||||
| import os | ||||
|  | ||||
| class settings: | ||||
|   """Load and validate settings from the settings file""" | ||||
|  | ||||
|   _supported_languages = ['en', 'de', 'ru', 'it', 'es', 'fr', 'el', 'sv', 'nl', | ||||
|                      'pl', 'ua', 'nb', 'vi', 'zh_tw', 'zh-cn', 'ja', 'ko'] | ||||
|   _supported_units = ['metric', 'imperial'] | ||||
|   _supported_hours = [12, 24] | ||||
|   _supported_display_orientation = ['normal', 'upside_down'] | ||||
|   _supported_models = [ | ||||
|   'epd_7_in_5_v2_colour', 'epd_7_in_5_v2', | ||||
|   'epd_7_in_5_colour', 'epd_7_in_5', | ||||
|   'epd_5_in_83_colour','epd_5_in_83', | ||||
|   'epd_4_in_2_colour', 'epd_4_in_2' | ||||
|   ] | ||||
|  | ||||
|   def __init__(self, settings_file_path): | ||||
|     """Load settings from path (folder or settings.json file)""" | ||||
|     try: | ||||
|       # If | ||||
|       if settings_file_path.endswith('settings.json'): | ||||
|         folder = settings_file_path.split('/settings.json')[0] | ||||
|       else: | ||||
|         folder = settings_file_path | ||||
|  | ||||
|       os.chdir(folder) | ||||
|       with open("settings.json") as file: | ||||
|         settings = json.load(file) | ||||
|         self._settings = settings | ||||
|  | ||||
|     except FileNotFoundError: | ||||
|       print('No settings file found in specified location') | ||||
|  | ||||
|     self._validate() | ||||
|  | ||||
|   def _validate(self): | ||||
|     """Validate the basic config""" | ||||
|     settings = self._settings | ||||
|  | ||||
|     required =  ['language', 'units', 'hours', 'model', 'calibration_hours', | ||||
|             'display_orientation'] | ||||
|  | ||||
|     # Check if all required settings exist | ||||
|     for param in required: | ||||
|       if not param in settings: | ||||
|         raise Exception ( | ||||
|           'required parameter: {} not found in settings file!'.format(param)) | ||||
|  | ||||
|     # Attempt to parse the parameters | ||||
|     self.language = settings['language'] | ||||
|     self.units = settings['units'] | ||||
|     self.hours = settings['hours'] | ||||
|     self.model = settings['model'] | ||||
|     self.calibration_hours = settings['calibration_hours'] | ||||
|     self.display_orientation = settings['display_orientation'] | ||||
|  | ||||
|     # Validate the parameters | ||||
|     if (not isinstance(self.language, str) or self.language not in | ||||
|         self._supported_languages): | ||||
|       print('Language not supported, switching to fallback, en') | ||||
|       self.language = 'en' | ||||
|  | ||||
|     if (not isinstance(self.units, str) or self.units not in | ||||
|         self._supported_units): | ||||
|       print('units not supported, switching to fallback, metric') | ||||
|       self.units = 'metric' | ||||
|  | ||||
|     if (not isinstance(self.hours, int) or self.hours not in | ||||
|         self._supported_hours): | ||||
|       print('hour-format not supported, switching to fallback, 24') | ||||
|       self.hours = 24 | ||||
|  | ||||
|     if (not isinstance(self.model, str) or self.model not in | ||||
|         self._supported_models): | ||||
|       print('model not supported, switching to fallback, epd_7_in_5') | ||||
|       self.model = 'epd_7_in_5' | ||||
|  | ||||
|     if (not isinstance(self.calibration_hours, list)): | ||||
|       print('calibration_hours not supported, switching to fallback, [0,12,18]') | ||||
|       self.calibration_hours = [0,12,18] | ||||
|  | ||||
|     if (not isinstance(self.display_orientation, str) or self.display_orientation not in | ||||
|         self._supported_display_orientation): | ||||
|       print('display orientation not supported, switching to fallback, normal') | ||||
|       self.display_orientation = 'normal' | ||||
|  | ||||
|     print('Settings file loaded') | ||||
|  | ||||
|   def _active_modules(self): | ||||
|     modules = [section['type'] for section in self._settings['panels']] | ||||
|     return modules | ||||
|  | ||||
|   def get_config(self, module_name): | ||||
|     """Ge the config of this module""" | ||||
|     if module_name not in self._active_modules(): | ||||
|       print('No config is available for this module') | ||||
|     else: | ||||
|       for section in self._settings['panels']: | ||||
|         if section['type'] == module_name: | ||||
|           config = section['config'] | ||||
|     return config | ||||
|  | ||||
|   def get_position(self, module_name): | ||||
|     """Get the position of this module's image on the display""" | ||||
|     if module_name not in self._active_modules(): | ||||
|       print('No position is available for this module') | ||||
|     else: | ||||
|       for section in self._settings['panels']: | ||||
|         if section['type'] == module_name: | ||||
|           position = section['location'] | ||||
|     return position | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|   print('running {0} in standalone/debug mode'.format( | ||||
|     os.path.basename(__file__).split('.py')[0])) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user