From b58748e6717d8b620898c6bb1228dc2bc455b170 Mon Sep 17 00:00:00 2001 From: N07070 Date: Sat, 26 Dec 2020 23:34:22 +0100 Subject: [PATCH] Removed old code, added new files in src/ using classes for each moving part. --- configuration/hello_world.png | Bin 0 -> 63458 bytes littleprynter.py | 135 ---------------------------------- mastodon_writing_prompt.py | 0 src/main.py | 51 +++++++++++++ src/printer.py | 95 ++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 135 deletions(-) create mode 100644 configuration/hello_world.png delete mode 100644 littleprynter.py delete mode 100644 mastodon_writing_prompt.py create mode 100644 src/main.py create mode 100644 src/printer.py diff --git a/configuration/hello_world.png b/configuration/hello_world.png new file mode 100644 index 0000000000000000000000000000000000000000..4adb4c53a629aaf5295f962f9135c49fae1a6220 GIT binary patch literal 63458 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 be8eIo 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 jkDQ=@`193nW[D\xa4\xd4\xd0K\xab?oM.`\x98' -limiter = Limiter( - app, - key_func=get_remote_address, - default_limits=["200 per day", "50 per hour"] -) - -SERIAL_PORT = '/dev/ttyAMA0' -BAUDRATE = 19200 - -# session['logged_in'] = False - -def error_handler_limiter(): - flash("Trop de requêtes !!! CANNOT PRINT !!! HAAAAAAAAAA",'dark') - return redirect(url_for('display_index_page')) - -@app.errorhandler(418) -def i_m_a_tea_pot(error): - return make_response('☕\n', 418) - -@app.route('/tea') -def tea(): - abort(418) - -@app.route('/') -@limiter.exempt -def display_index_page(): - if session.get('logged_in'): - return render_template('index.html') - else: - return redirect(url_for('login')) - -@app.route('/login', methods=['POST','GET']) -@limiter.limit("100 per minute", error_message=error_handler_limiter) -def login(): - if request.method == 'POST': - if not session.get('logged_in'): - if request.form['username'] and request.form['password']: - # Get the json - with open('users.json') as f: - users_file = json.load(f) - for user in users_file["users"]: - if users_file["users"][user] == request.form['password']: - session['logged_in'] = True - session['user'] = request.form['username'] - - if not session.get('logged_in'): - flash('Mot de passe ou pseudo invalide.','danger') - return redirect(url_for('login')) - else: - return redirect(url_for('display_index_page')) - else: - flash('Incorrect logins') - return render_template('password.html') - else: - return render_template('password.html') - else: - return render_template('password.html') - -@app.route("/logout") -def logout(): - session['logged_in'] = False - flash('Tu est déconnecté', 'info') - return redirect(url_for('login')) - -# @app.route('/print/image') -# @limiter.limit("5 per minute", error_message=error_handler_limiter) -# def print_image(): -# if session.get('logged_in'): -# img = random.choice(os.listdir("static/images/")) #change dir name to whatever -# # call(["lp", "-o fit-to-page", "static/images/" + img]) -# printer = Adafruit_Thermal(SERIAL_PORT, BAUDRATE, timeout=5) -# printer.begin() -# printer.feed(1) -# printer.printImage("static/images/" + img, True) -# printer.feed(2) -# return redirect(url_for('display_index_page')) -# else: -# return redirect(url_for('login')) - -@app.route('/print/text', methods=['POST']) -@limiter.limit("3: per minute", error_message=error_handler_limiter) -def print_text(): - if session.get('logged_in'): - if len(request.form['message']) < 200: - printer.set_defaults() - printer.print((request.form['message'])) - printer.print("From" + session['user']) - printer.feed(2) - - return redirect(url_for('display_index_page')) - else: - flash('Le text est trop long, 200 caractères au maximum stp !') - return redirect(url_for('display_index_page')) - else: - return redirect(url_for('login')) diff --git a/mastodon_writing_prompt.py b/mastodon_writing_prompt.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..d5126b3 --- /dev/null +++ b/src/main.py @@ -0,0 +1,51 @@ +# Welcome to the LittlePrynter's source code. +# This program expose a web interface, with user authentification, that makes it possible to print messages from the web. +# It also exposes a API, making it possible to print and interface with much of the printer's abilities. + +# We first define the connection to the printer itself, +# Then we build the API around Flask, +# Then we build the web interface, using the simple Jinja2 templating. + +# Following are the librairies we import, +from flask import Flask # Used for the web framework +from printer import Printer + +# We define the app module used by Flask +app = Flask(__name__) +app.secret_key = b'\x98>3nM[D\xa4\xd4\xd0K\xab?oM.`\x98' +# TODO: Get this secret key from a config file + + +# Printer connection +# Uses the class defined in the printer.py file + +# Define the USB connections here. +# TODO: move this to a config file +vendor_id = 0x04b8 +device_id = 0x0e28 + + +printer = Printer(app) + +if not printer.init_printer(vendor_id, device_id): + app.logger.error('Could not init printer, aborting.') + exit(-1) + +# API routes +# The api has the following methods +# api/print/{sms,img,letter,qr,barcode} +# api/auth/{login,logout} +# api/status/{paper,ping,stats} + +# If you just call the api route, you get a help back. +@app.route('/api') +def api_help(): + return "Welcome to the API's help page" + +@app.route('/api/print') +def index(): + return "Printing..." + +@app.route('/api/print/sms') +def api_print_sms(): + return "Printing short message." diff --git a/src/printer.py b/src/printer.py new file mode 100644 index 0000000..5099345 --- /dev/null +++ b/src/printer.py @@ -0,0 +1,95 @@ +# Importing the module to mage the connection to the printer. +from escpos.printer import Usb, USBNotFoundError +from time import sleep, gmtime, strftime +import os.path + + +class Printer(object): + """ + # The connection is based on the ESC/POS library + + ## Connection to the USB printer + + ## Making sure the printer is alive + + ## Making sure it has paper + + ## Define default print settings + + ## Print starting message, log time of first print, cut. + + ## Annonce readyness : return a positive pong message. + """ + + # Is the printer ready to accept a new print ? + ready = False + + def __init__(self, app): + super(Printer, self).__init__() + self.app = app + self.ready = False + self.printer = None + + def init_printer(self, device_id,vendor_id): + try: + p = Usb(vendor_id, device_id) + except USBNotFoundError as e: + self.app.logger.error("The USB device is not plugged in, aborting...") + exit(-1) + waiting_elapsed = 10 + + # Is the printer online ? Is the communication with the printer successfull ? + while not p.is_online(): + self.app.logger.debug('Waiting for printer to get online...') + sleep(1) + waiting_elapsed -= 1 + if waiting_elapsed < 1: + self.app.logger.error('Printer took more than 10 seconds to get online, aborting...') + return False + + # Let's check paper status. + ps = p.paper_status() + if ps == 0: + self.app.logger.error('Printer has no more paper, aborting...') + return False + elif ps == 1: + self.app.logger.warning('Printer needs paper to be changed very soon ! ') + sleep(5) + elif ps == 0: + self.app.logger.debug('Printer has paper, good to go') + + # We're going to print a little text to let know that we're good, as a final check. + p.textln("Hello world ! \nStarting up at " + strftime("%Y-%m-%d %H:%M:%S", gmtime())) + p.set(align='center', font='a', bold=False, underline=0, width=1, height=1, density=9, invert=False, smooth=False, flip=False, double_width=False, double_height=False, custom_size=False) + p.textln("------------------") + p.qr("Hello World ! :)") + p.image("../configuration/hello_world.png",center=True) + p.cut() + + self.printer = p; + self.ready = True; + return True + + def print_sms(self, msg): + clean_msg = str(msg) + + if len(clean_msg) > 256 or len(clean_msg) < 10 : + self.app.logger.warning("Could not print message of this length :" + len(clean_msg)) + return False + else : + self.printer.textln(strftime("%Y-%m-%d %H:%M:%S", gmtime())) + self.printer.textln(clean_msg) + + def print_img(self, path): + + if os.path.isfile(str(path)): + pass + else: + self.app.logger.warning("File does not exist : " + str(path)) + + try: + self.printer.image(path) + except Exception as e: + return e + else: + self.app.logging.debug("Printed an image : " + str(path))