129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | #!/usr/bin/python3 | ||
|  | # -*- coding: utf-8 -*- | ||
|  | """
 | ||
|  | Inky-Calendar epaper functions | ||
|  | Copyright by aceisace | ||
|  | """
 | ||
|  | from importlib import import_module | ||
|  | from PIL import Image | ||
|  | 
 | ||
|  | from inkycal.custom import top_level | ||
|  | import glob | ||
|  | 
 | ||
|  | class Display: | ||
|  |   """Display class for inkycal
 | ||
|  |   Handles rendering on display"""
 | ||
|  | 
 | ||
|  |   def __init__(self, epaper_model): | ||
|  |     """Load the drivers for this epaper model""" | ||
|  | 
 | ||
|  |     if 'colour' in epaper_model: | ||
|  |       self.supports_colour = True | ||
|  |     else: | ||
|  |       self.supports_colour = False | ||
|  | 
 | ||
|  |     try: | ||
|  |       driver_path = f'inkycal.display.drivers.{epaper_model}' | ||
|  |       driver = import_module(driver_path) | ||
|  |       self._epaper = driver.EPD() | ||
|  |       self.model_name = epaper_model | ||
|  | 
 | ||
|  |     except ImportError: | ||
|  |       raise Exception('This module is not supported. Check your spellings?') | ||
|  | 
 | ||
|  |     except FileNotFoundError: | ||
|  |       raise Exception('SPI could not be found. Please check if SPI is enabled') | ||
|  | 
 | ||
|  |   def render(self, im_black, im_colour = None): | ||
|  |     """Render an image on the epaper
 | ||
|  |     im_colour is required for three-colour epapers"""
 | ||
|  | 
 | ||
|  |     epaper = self._epaper | ||
|  | 
 | ||
|  |     if self.supports_colour == False: | ||
|  |       print('Initialising..', end = '') | ||
|  |       epaper.init() | ||
|  |       # For the 9.7" ePaper, the image needs to be flipped by 90 deg first | ||
|  |       # The other displays flip the image automatically | ||
|  |       if self.model_name == "9_in_7": | ||
|  |         im_black.rotate(90, expand=True) | ||
|  |       print('Updating display......', end = '') | ||
|  |       epaper.display(epaper.getbuffer(im_black)) | ||
|  |       print('Done') | ||
|  | 
 | ||
|  |     elif self.supports_colour == True: | ||
|  |       if not im_colour: | ||
|  |         raise Exception('im_colour is required for coloured epaper displays') | ||
|  |       print('Initialising..', end = '') | ||
|  |       epaper.init() | ||
|  |       print('Updating display......', end = '') | ||
|  |       epaper.display(epaper.getbuffer(im_black), epaper.getbuffer(im_colour)) | ||
|  |       print('Done') | ||
|  | 
 | ||
|  |     print('Sending E-Paper to deep sleep...', end = '') | ||
|  |     epaper.sleep() | ||
|  |     print('Done') | ||
|  | 
 | ||
|  |   def calibrate(self, cycles=3): | ||
|  |     """Flush display with single colour to prevent burn-ins (ghosting)
 | ||
|  |     cycles -> int. How many times should each colour be flushed? | ||
|  |     recommended cycles = 3"""
 | ||
|  | 
 | ||
|  |     epaper = self._epaper | ||
|  |     epaper.init() | ||
|  | 
 | ||
|  |     white = Image.new('1', (epaper.width, epaper.height), 'white') | ||
|  |     black = Image.new('1', (epaper.width, epaper.height), 'black') | ||
|  | 
 | ||
|  |     print('----------Started calibration of ePaper display----------') | ||
|  |     if self.supports_colour == True: | ||
|  |       for _ in range(cycles): | ||
|  |         print('Calibrating...', end= ' ') | ||
|  |         print('black...', end= ' ') | ||
|  |         epaper.display(epaper.getbuffer(black), epaper.getbuffer(white)) | ||
|  |         print('colour...', end = ' ') | ||
|  |         epaper.display(epaper.getbuffer(white), epaper.getbuffer(black)) | ||
|  |         print('white...') | ||
|  |         epaper.display(epaper.getbuffer(white), epaper.getbuffer(white)) | ||
|  |         print('Cycle {0} of {1} complete'.format(_+1, cycles)) | ||
|  | 
 | ||
|  |     if self.supports_colour == False: | ||
|  |       for _ in range(cycles): | ||
|  |         print('Calibrating...', end= ' ') | ||
|  |         print('black...', end = ' ') | ||
|  |         epaper.display(epaper.getbuffer(black)) | ||
|  |         print('white...') | ||
|  |         epaper.display(epaper.getbuffer(white)), | ||
|  |         print('Cycle {0} of {1} complete'.format(_+1, cycles)) | ||
|  | 
 | ||
|  |       print('-----------Calibration complete----------') | ||
|  |       epaper.sleep() | ||
|  | 
 | ||
|  | 
 | ||
|  |   @classmethod | ||
|  |   def get_display_size(cls, model_name): | ||
|  |     "returns (width, height) of given display" | ||
|  |     if not isinstance(model_name, str): | ||
|  |       print('model_name should be a string') | ||
|  |       return | ||
|  |     else: | ||
|  |       driver_files = top_level+'/inkycal/display/drivers/*.py' | ||
|  |       drivers = glob.glob(driver_files) | ||
|  |       drivers = [i.split('/')[-1].split('.')[0] for i in drivers] | ||
|  |       if model_name not in drivers: | ||
|  |         print('This model name was not found. Please double check your spellings') | ||
|  |         return | ||
|  |       else: | ||
|  |         with open(top_level+'/inkycal/display/drivers/'+model_name+'.py') as file: | ||
|  |           for line in file: | ||
|  |             if 'EPD_WIDTH=' in line.replace(" ", ""): | ||
|  |               width = int(line.rstrip().replace(" ", "").split('=')[-1]) | ||
|  |             if 'EPD_HEIGHT=' in line.replace(" ", ""): | ||
|  |               height = int(line.rstrip().replace(" ", "").split('=')[-1]) | ||
|  |         return width, height | ||
|  | 
 | ||
|  |              | ||
|  | if __name__ == '__main__': | ||
|  |   print("Running Display class in standalone mode") | ||
|  |    |