예제 #1
0
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']
예제 #2
0
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 {}