Fork of https://github.com/Zepheus/catprinter combined with my own python tarot printer thing. Additional decks are from mcnuttandrew and occultify. Please don't redistribute those.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.0 KiB
119 lines
4.0 KiB
import asyncio |
|
import logging |
|
import sys |
|
import os |
|
|
|
import click |
|
|
|
from catprinter.cmds import PRINT_WIDTH, cmds_print_img |
|
from catprinter.ble import run_ble |
|
from catprinter.img import read_img, text_to_img |
|
|
|
def make_logger(log_level): |
|
logger = logging.getLogger('catprinter') |
|
logger.setLevel(log_level) |
|
h = logging.StreamHandler(sys.stdout) |
|
h.setLevel(log_level) |
|
logger.addHandler(h) |
|
return logger |
|
|
|
@click.group() |
|
def cli(): |
|
pass |
|
|
|
def print_img( |
|
img, |
|
devicename, |
|
darker, |
|
logger |
|
): |
|
logger.info(f'✅ Read image: {img.shape} (h, w) pixels') |
|
data = cmds_print_img(img, dark_mode=darker) |
|
logger.info(f'✅ Generated BLE commands: {len(data)} bytes') |
|
|
|
# Try to autodiscover a printer if --devicename is not specified. |
|
autodiscover = not devicename |
|
return asyncio.run(run_ble(data, devicename, autodiscover, logger)) |
|
|
|
@click.command() |
|
@click.option("--filename", type=str, required=True) |
|
@click.option('--log-level', |
|
type=click.Choice(['debug', 'info', 'warn', 'error'], case_sensitive=False), default="info") # TODO generalise for all functions |
|
@click.option('--img-binarization-algo', |
|
type=click.Choice(['mean-threshold', 'floyd-steinberg', 'halftone', 'none'], case_sensitive=False), |
|
default='floyd-steinberg', |
|
help=f'Which image binarization algorithm to use. If \'none\' is used, no binarization will be used. In this case the image has to have a width of {PRINT_WIDTH} px.' |
|
) |
|
@click.option('--show-preview/--skip-preview', default=False) |
|
@click.option("--devicename", type=str, |
|
help='Specify the Bluetooth Low Energy (BLE) device name to \ |
|
search for. If not specified, the script will try to \ |
|
auto discover the printer based on its advertised BLE \ |
|
service UUIDs. Common names are similar to "GT01", "GB02", \ |
|
"GB03".' |
|
) |
|
@click.option('--darker/--not-darker', default=False, |
|
help="Print the image in text mode. This leads to more contrast, but slower speed.") |
|
def image(filename, log_level, img_binarization_algo, show_preview, devicename, darker): |
|
log_level = getattr(logging, log_level.upper()) |
|
logger = make_logger(log_level) |
|
|
|
if not os.path.exists(filename): |
|
logger.info('🛑 File not found. Exiting.') |
|
return |
|
|
|
bin_img = read_img(filename, PRINT_WIDTH, |
|
logger, img_binarization_algo, show_preview) |
|
if bin_img is None: |
|
logger.info(f'🛑 No image generated. Exiting.') |
|
return |
|
|
|
return print_img( |
|
img=bin_img, |
|
devicename=devicename, |
|
darker=darker, |
|
logger=logger |
|
) |
|
|
|
@click.command() |
|
@click.option("--text", type=str, required=True) |
|
@click.option("--font", type=str, default="Verdana Bold.ttf") |
|
@click.option("--font-size", type=int, default=30) |
|
@click.option('--log-level', |
|
type=click.Choice(['debug', 'info', 'warn', 'error'], case_sensitive=False), default="info") # TODO generalise for all functions |
|
@click.option('--show-preview/--skip-preview', default=False) |
|
@click.option('--bold/--no-bold', default=False) |
|
@click.option("--devicename", type=str, |
|
help='Specify the Bluetooth Low Energy (BLE) device name to \ |
|
search for. If not specified, the script will try to \ |
|
auto discover the printer based on its advertised BLE \ |
|
service UUIDs. Common names are similar to "GT01", "GB02", \ |
|
"GB03".' |
|
) |
|
def text(text, font, font_size, log_level, show_preview, bold, devicename): |
|
log_level = getattr(logging, log_level.upper()) |
|
logger = make_logger(log_level) |
|
|
|
bin_img = text_to_img( |
|
text=text.replace("\\n", "\n"), |
|
font_name=font, |
|
font_size=font_size, |
|
show_preview=show_preview, |
|
bold=bold, |
|
logger=logger |
|
) |
|
if bin_img is None: |
|
logger.info(f'🛑 No text image generated. Exiting.') |
|
return |
|
|
|
return print_img( |
|
img=bin_img, |
|
devicename=devicename, |
|
darker=True, # Text mode |
|
logger=logger |
|
) |
|
|
|
if __name__ == '__main__': |
|
cli.add_command(image) |
|
cli.add_command(text) |
|
cli()
|
|
|