File: monitor.py

package info (click to toggle)
solo1-cli 0.1.1-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 464 kB
  • sloc: python: 2,168; makefile: 36
file content (49 lines) | stat: -rw-r--r-- 1,379 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# -*- coding: utf-8 -*-
#
# Copyright 2019 SoloKeys Developers
#
# Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
# http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
# http://opensource.org/licenses/MIT>, at your option. This file may not be
# copied, modified, or distributed except according to those terms.

import sys
import time

import click
import serial


@click.command()
@click.argument("serial_port")
def monitor(serial_port):
    """Reads Solo Hacker serial output from USB serial port SERIAL_PORT.

    SERIAL-PORT is something like /dev/ttyACM0 or COM10.
    Automatically reconnects. Baud rate is 115200.
    """

    ser = None

    def reconnect():
        while True:
            time.sleep(0.02)
            try:
                ser = serial.Serial(serial_port, 115200, timeout=0.05)
                return ser
            except serial.SerialException:
                pass

    while True:
        try:
            if ser is None:
                ser = serial.Serial(serial_port, 115200, timeout=0.05)
            data = ser.read(1)
            sys.stdout.buffer.write(data)
            sys.stdout.flush()
        except serial.SerialException:
            if ser is not None:
                ser.close()
            print(f"reconnecting {serial_port}...")
            ser = reconnect()
            print("done")