diff --git a/projects/tentacles/src/python/tentacles/blueprints/admin_ui.py b/projects/tentacles/src/python/tentacles/blueprints/admin_ui.py index 9438d8a..a5e299b 100644 --- a/projects/tentacles/src/python/tentacles/blueprints/admin_ui.py +++ b/projects/tentacles/src/python/tentacles/blueprints/admin_ui.py @@ -123,7 +123,7 @@ def handle_edit_printers(): args["enabled"] = int(args["enabled"]) args["filament_id"] = int(args["filament_id"]) args["chassis_id"] = int(args["chassis_id"]) - print(args) + args["nozzle_diameter"] = float(args["nozzle_diameter"]) ctx.db.edit_printer(**args) return redirect("/admin") diff --git a/projects/tentacles/src/python/tentacles/db.py b/projects/tentacles/src/python/tentacles/db.py index 4fdf900..5dab149 100644 --- a/projects/tentacles/src/python/tentacles/db.py +++ b/projects/tentacles/src/python/tentacles/db.py @@ -213,3 +213,7 @@ class Db(Queries): def finish_job(self, *, jid: int, state: str, message: Optional[str] = None): super().finish_job(jid=jid, state=state, message=message) + + def create_filament(self, *, name: str): + super().create_filament(name=name) + return super().fetch_filament(name=name) diff --git a/projects/tentacles/src/python/tentacles/sql/jobs.sql b/projects/tentacles/src/python/tentacles/sql/jobs.sql index 301c0c5..51d5a05 100644 --- a/projects/tentacles/src/python/tentacles/sql/jobs.sql +++ b/projects/tentacles/src/python/tentacles/sql/jobs.sql @@ -78,6 +78,7 @@ SELECT , fa.max_end , fa.nozzle_diameter , fa.filament_id + , (SELECT name FROM filament WHERE id = fa.filament_id) AS filament_name FROM jobs j INNER JOIN files f ON j.file_id = f.id diff --git a/projects/tentacles/src/python/tentacles/sql/printers.sql b/projects/tentacles/src/python/tentacles/sql/printers.sql index 3901f46..054ad19 100644 --- a/projects/tentacles/src/python/tentacles/sql/printers.sql +++ b/projects/tentacles/src/python/tentacles/sql/printers.sql @@ -102,6 +102,7 @@ SELECT , p.chassis_id , p.enabled , s.name as status + , p.nozzle_diameter FROM printers p INNER JOIN printer_statuses s ON p.status_id = s.id WHERE p.id = :pid @@ -140,6 +141,7 @@ SELECT , c.limit_bed , c.limit_hotend , p.nozzle_diameter + , p.filament_id FROM printers p LEFT JOIN (SELECT id, printer_id FROM jobs WHERE finished_at IS NULL) j ON p.id = j.printer_id @@ -174,6 +176,7 @@ SET , filament_id = :filament_id , chassis_id = :chassis_id , enabled = :enabled + , nozzle_diameter = :nozzle_diameter WHERE id = :id ; @@ -202,3 +205,9 @@ VALUES ( RETURNING id ; + +-- name: fetch-filament^ +SELECT * +FROM filament +WHERE name = :name +; diff --git a/projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2 b/projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2 index 28a748f..b22cb7a 100644 --- a/projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2 +++ b/projects/tentacles/src/python/tentacles/templates/edit_printer.html.j2 @@ -4,10 +4,18 @@ <div class="row"> <form method="post"> <div class="row"> - <div class="twelve columns"> + <div class="six columns"> <label for="name">Printer name</label> <input type="text" name="name" value="{{ printer.name }}" /> </div> + <div class="six columns"> + <label for="chassis">Chassis</label> + <select name="chassis_id"> + {% for c in ctx.db.list_chassis() %} + <option value="{{c.id}}" {% if printer.chassis_id == c.id %}selected{%endif%}>{{c.name}}</option> + {% endfor %} + </select> + </div> </div> <div class="row"> <div class="twelve columns"> @@ -27,15 +35,7 @@ <input type="text" name="api_key" value="{{ printer.api_key }}" /> </div> </div> - <div class"row"> - <div class="four columns"> - <label for="chassis">Chassis</label> - <select name="chassis_id"> - {% for c in ctx.db.list_chassis() %} - <option value="{{c.id}}" {% if printer.chassis_id == c.id %}selected{%endif%}>{{c.name}}</option> - {% endfor %} - </select> - </div> + <div class="row"> <div class="four columns"> <label for="filament">Filament load</label> <select name="filament_id"> @@ -44,6 +44,10 @@ {% endfor %} </select> </div> + <div class="four columns"> + <label for="nozzle_diameter">Nozzle diameter (mm)</label> + <input type="text" name="nozzle_diameter" value="{{ printer.nozzle_diameter}}" /> + </div> <div class="four columns"> <label for="enabled">Printing enabled</label> <select name="enabled"> diff --git a/projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2 b/projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2 index ef7599c..47baa55 100644 --- a/projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2 +++ b/projects/tentacles/src/python/tentacles/templates/jobs_list.html.j2 @@ -4,7 +4,7 @@ {% if jobs %} {% for job in jobs %} <div class="job row u-flex"> - <div class="details six columns u-flex"> + <div class="details six columns u-flex u-flex-wrap"> <div class="job-filename u-flex"> <label for="filename">File</label> <span name="filename">{{ctx.db.fetch_file(ctx.uid, job.file_id).filename or "it's a secret"}}</span> @@ -20,6 +20,15 @@ <label for="runtime">Runtime</label> <span name="Runtime">{{ (datetime.now() - datetime.fromisoformat(job.started_at)) }}</span> </div> + {% else %} + <div class="job-constraint u-flex"> + <label>Material</label> + {{ job.filament_name }} + </div> + <div class="job-constraint u-flex"> + <label>Limits</label> + {{ job.max_x }}mm x{{ job.max_y }}mm x{{ job.max_z }}mm, bed {{ job.max_bed }}c, end {{ job.max_end }}c, nozzle {{ "%.2f"|format(job.nozzle_diameter) }}mm + </div> {% endif %} </div> <div class="two columns"> diff --git a/projects/tentacles/src/python/tentacles/templates/streams.html.j2 b/projects/tentacles/src/python/tentacles/templates/streams.html.j2 index 450ca89..da4af58 100644 --- a/projects/tentacles/src/python/tentacles/templates/streams.html.j2 +++ b/projects/tentacles/src/python/tentacles/templates/streams.html.j2 @@ -9,6 +9,7 @@ <span><label>Status</label>{{printer.status}}, {% if printer.enabled %}accepting jobs{%else%}not scheduling{%endif%}</span> <span><label>Loaded material</label>{{printer.filament_name}}</span> <span><label>Machine</label>{{printer.machine_name}}</span> + <span><label>Nozzle</label>{{ "%.2f"|format(printer.nozzle_diameter) }}mm</span> <span><label>Limits</label>{{printer.limit_x}}mm x{{printer.limit_y}}mm x{{printer.limit_z}}mm, bed {{printer.limit_bed}}c, end {{printer.limit_hotend}}c</span> </div> {% endfor %} diff --git a/projects/tentacles/src/python/tentacles/workers.py b/projects/tentacles/src/python/tentacles/workers.py index 6763aa0..bc34ae2 100644 --- a/projects/tentacles/src/python/tentacles/workers.py +++ b/projects/tentacles/src/python/tentacles/workers.py @@ -152,7 +152,8 @@ def assign_jobs(app: App, db: Db) -> None: for job in db.list_job_queue(uid=None): for printer in db.list_idle_printers(): if ( - printer.limit_x >= job.max_x + job.analysis_id is not None + and printer.limit_x >= job.max_x and printer.limit_y >= job.max_y and printer.limit_z >= job.max_z and printer.limit_hotend >= job.max_end @@ -163,6 +164,8 @@ def assign_jobs(app: App, db: Db) -> None: db.assign_job(jid=job.id, pid=printer.id) log.info(f"Mapped job {job.id} to printer {printer.id}") break + else: + print("Could not map\n", job, "\n", printer) def push_jobs(app: App, db: Db) -> None: @@ -336,6 +339,7 @@ def analyze_files(app: App, db: Db): continue + log.info(f"Analyzed {file}") db.create_analysis( file_id=file.id, max_x=record.max_x, @@ -344,7 +348,7 @@ def analyze_files(app: App, db: Db): max_end=record.max_end, max_bed=record.max_bed, nozzle=record.nozzle, - filament_id=db.create_filament(record.filament), + filament_id=db.create_filament(name=record.filament).id, )