class Calendar: printer = None url = 'GOOGLE_CALENDAR_URL' def __enter__(self): return self def __exit__(self, *_): pass def start(self): """ La méthode qui s'occupe de tout gérer. """ events = self.get_events() if events: if not self.set_printer(): return 1 self.print_data(events) return 0 def set_printer(self): """ Connection to the printer. """ self.printer = ThermalPrinter() return self.printer.status()['paper'] def get_events(self): """ Retrieve events of the day. """ now = utc.localize(datetime.utcnow()) events = icalevents.events(url=self.url, end=now + timedelta(days=1)) data = [] for event in events: data.append((event.start.strftime('%H:%M'), event.end.strftime('%H:%M'), event.summary)) return sorted(set(data), key=lambda x: x[0]) def print_data(self, events): """ Just print. """ def header(): """ Print the header. """ self.printer.codepage(CodePage.ISO_8859_1) self.printer.feed() self.printer.image(Image.open('agenda.png')) self.printer.feed() def line(evt, first_line=False, last_line=False): """ Impression d'un événement. """ start, end, sumary = evt hour = '{} - {}'.format(start, end) if start == end: hour = 'Whole day' if first_line: self.printer.out(b'\xd5', line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xcd' * (self.printer.max_column - 2), line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xb8', codepage=CodePage.CP437) self.printer.out(b'\xb3', line_feed=False, codepage=CodePage.CP437) self.printer.out(' {0: <{1}} '.format(hour, self.printer.max_column - 4), line_feed=False, codepage=CodePage.ISO_8859_1) self.printer.out(b'\xb3', codepage=CodePage.CP437) for line_ in wrap(sumary, self.printer.max_column - 4): self.printer.out(b'\xb3', line_feed=False, codepage=CodePage.CP437) self.printer.out(' {0: <{1}} '.format( line_, self.printer.max_column - 4), line_feed=False, codepage=CodePage.ISO_8859_1) self.printer.out(b'\xb3', codepage=CodePage.CP437) if not last_line: self.printer.out(b'\xc3', line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xc4' * (self.printer.max_column - 2), line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xb4', codepage=CodePage.CP437) else: self.printer.out(b'\xd4', line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xcd' * (self.printer.max_column - 2), line_feed=False, codepage=CodePage.CP437) self.printer.out(b'\xbe', codepage=CodePage.CP437) def footer(): """ Printed the footer. """ self.printer.feed() self.printer.out('Have a nice day :)', justify='C', codepage=CodePage.ISO_8859_1) self.printer.feed(4) header() if events: first, last = events[0], events[-1] for event in events: line(event, first_line=event is first, last_line=event is last) footer() return self.printer.status()['paper']
class PrinterWrapper: def __init__(self, print_welcome=True): self.printer = ThermalPrinter("/dev/serial0", 9600, heat_time=60, heat_interval=15) if check_printer_status(self.printer): if print_welcome: self.print_boot_image() self.printer.sleep() def print_boot_image(self): self.printer.image(Image.open(image_path), True) self.printer.feed(3) # function also wraps by words # look at string, count characters def print_line(self, text, formatting=None): if formatting is None: formatting = { 'justify': 'C', 'size': 'L', 'bold': False, 'upside_down': False, 'underline': 0 } if check_printer_status(self.printer): max_col = (self.printer.max_column / (2 if formatting['size'] == 'L' else 1)) - 1 print("Max col", self.printer.max_column) text = textwrap.fill(text, max_col) self.printer.wake() self.printer.out(text, justify=formatting['justify'], size=formatting['size'], bold=formatting['bold'], upside_down=formatting['upside_down'], underline=formatting['underline']) self.printer.feed(1) self.printer.sleep() else: self.printer.sleep() raise RuntimeError("Printer is out of paper") def print_image(self, image_data, is_data_uri=True): if is_data_uri: image = get_image_from_data_uri(data_uri=image_data) else: image = image_data self.printer.wake() self.printer.image(image) self.printer.sleep() def print_signature(self, sig): self.printer.wake() date_string = get_date_string() # padding to right-justify the timestamp (date_sting) space_padding = ' ' * (self.printer.max_column - 1 - (len(date_string) + len(sig))) self.printer.out('', line_feed=True) self.printer.out(f'{sig}{space_padding}{date_string}'.strip(), justify='L', size='S', underline=False) self.printer.feed(3) self.printer.sleep() def get_status(self): try: return self.printer.status() except: return {}