diff --git a/kitchentext.py b/kitchentext.py deleted file mode 100755 index e3a70e1..0000000 --- a/kitchentext.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python3 -# -# kitchentext: Read text from stdin and put it on the Kitchenlight. -# -# Author: Shy -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation, either version 3 of the License, or (at your option) any later -# version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -# details. -# -# You should have received a copy of the GNU General Public License along with -# this program. If not, see . - -def kitchentext(delay=200, single=False, wait=False, restore=False, - poweron=False, verbose=False, debug=False): - - import sys - from c4ctrl import C4Interface, Kitchenlight - - charwidth = { # Width of characters. - 'a' : 5, 'A' : 5, 'b' : 4, 'B' : 5, 'c' : 3, 'C' : 5, - 'd' : 4, 'D' : 5, 'e' : 4, 'E' : 5, 'f' : 3, 'F' : 5, - 'g' : 3, 'G' : 5, 'h' : 3, 'H' : 5, 'i' : 1, 'I' : 5, - 'j' : 2, 'J' : 5, 'k' : 3, 'K' : 5, 'l' : 3, 'L' : 5, - 'm' : 5, 'M' : 5, 'n' : 4, 'N' : 5, 'o' : 3, 'O' : 5, - 'p' : 3, 'P' : 5, 'q' : 3, 'Q' : 5, 'r' : 3, 'R' : 5, - 's' : 4, 'S' : 5, 't' : 3, 'T' : 5, 'u' : 3, 'U' : 5, - 'v' : 3, 'V' : 5, 'w' : 5, 'W' : 5, 'x' : 3, 'X' : 5, - 'y' : 3, 'Y' : 5, 'z' : 3, 'Z' : 5, '0' : 5, '1' : 4, - '2' : 5, '3' : 5, '4' : 5, '5' : 5, '6' : 5, '7' : 5, - '8' : 5, '9' : 5, '@' : 5, '=' : 3, '!' : 1, '"' : 3, - '_' : 5, '-' : 3, '.' : 2, ',' : 2, '*' : 5, ':' : 2, - '\'' : 1, '/' : 5, '(' : 2, ')' : 2, '{' : 3, '}' : 3, - '[' : 2, ']' : 2, '<' : 3, '>' : 4, '+' : 5, '#' : 5, - '$' : 5, '%' : 5, '$' : 5, '~' : 5, '?' : 3, ';' : 2, - '\\' : 5, '^' : 3, '|' : 1, '`' : 2, ' ' : 3, '\t' : 5 - } - - C4Interface.debug = debug - kl = Kitchenlight(autopower=poweron) - - # Enforce wait=True if restore=True or single=False. - wait = wait or restore or not single - - # Store previous state. - if restore: - c4 = C4Interface() - saved_state = c4.pull([kl.topic, kl.powertopic]) - - try: - while True: - - try: - text = sys.stdin.readline() - except KeyboardInterrupt: # Exit a bit more graceful on CTRL-C. - verbose and print("\nInterrupted by user.", file=sys.stderr) - sys.exit(1) - - if single and text.rstrip('\n') == "": - verbose and sys.stderr.write("Error: empty input!\n") - sys.exit(1) - elif text == "\n": # Empty line. - verbose and print("Info: skipping empty line") - continue - elif text == "": # EOF. - break - - # Strip chars Kitchenlight can not display. - text = text.rstrip('\n').encode("ascii", "ignore").decode("ascii") - - try: # We might well get interrupted while waiting. - kl.text(text, delay) - - if wait: - from time import sleep - # How long shall we wait? - # Kitchenlight has 30 columns, each char uses 2-5 columns - # followed by an empty one. The traversal of one column - # takes 30 * ms. - twidth = 0 - for c in text: - try: - twidth += (charwidth[c] + 1) - except KeyError: - twidth += 4 # Fallback - wait_for = ((30 * delay) + (twidth * delay)) / 1000 - verbose and print("Waiting for {} seconds ...".format(wait_for)) - sleep(wait_for) - - except KeyboardInterrupt: - verbose and print("\nInterrupted by user.", file=sys.stderr) - sys.exit(1) - - finally: - # Always restore privious state if "restore" is set. - if restore: - re = [] - for top in saved_state: re.append((top.topic, top.payload)) - c4.push(re) - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser( - description="Read text from stdin and put it on the Kitchenlight") - parser.add_argument( - "-d", "--delay", type=int, default=200, - help="delay in ms (speed of the text, default is 200)") - parser.add_argument( - "-s", "--single", action="store_true", - help="only read a single line") - parser.add_argument( - "-w", "--wait", action="store_true", default=False, - help="wait until the text has been displayed") - parser.add_argument( - "-r", "--restore", action="store_true", default=False, - help="restore the Kitchenlight to its prior state after the text has \ - been displayed (implies --wait)") - parser.add_argument( - "-p", "--power-on", action="store_true", default=False, - help="turn on Kitchenlight if it is powered off") - parser.add_argument( - "-f", "--fork", action="store_true", - help="fork to background") - parser.add_argument( - "-v", "--verbose", action="store_true", - help="be (not much) more verbose") - parser.add_argument( - "--debug", action="store_true", - help="display what would be send to the MQTT broker, but do not \ - actually connect") - args = parser.parse_args() - - if args.fork: - import sys - from posix import fork - - if sys.stdin.isatty(): - print("Error: cannot fork when stdin is connected to a terminal!", - file=sys.stderr) - sys.exit(1) - - child_pid = fork() - if child_pid != 0: - args.verbose and print("Forked to PID", child_pid) - sys.exit() - - kitchentext(delay=args.delay, - single=args.single, - wait=args.wait, - restore=args.restore, - poweron=args.power_on, - verbose=args.verbose, - debug=args.debug) -