#!/usr/bin/env python3 import sqlite3, json, time, os from flask import Flask, render_template, request, Response, redirect, url_for DB_PATH = "/home/naue/rtk/rtk_rover.db" CMD_FILE = "/home/naue/rtk/rtk_rover_cmd.json" app = Flask(__name__) def db(): con = sqlite3.connect(DB_PATH) con.row_factory = sqlite3.Row return con def write_cmd(cmd): tmp = CMD_FILE + ".tmp" with open(tmp, "w", encoding="utf-8") as f: json.dump({"cmd": cmd, "note": "web", "ts": time.time()}, f) os.replace(tmp, CMD_FILE) @app.route("/", methods=["GET"]) def index(): con = db() sessions = con.execute(""" SELECT session_id, datetime(start_ts,'unixepoch','localtime') AS start_time, CASE WHEN end_ts IS NULL THEN '' ELSE datetime(end_ts,'unixepoch','localtime') END AS end_time, note, end_ts FROM sessions ORDER BY start_ts DESC LIMIT 50 """).fetchall() active_session = con.execute(""" SELECT session_id, datetime(start_ts,'unixepoch','localtime') AS start_time, note FROM sessions WHERE end_ts IS NULL ORDER BY start_ts DESC LIMIT 1 """).fetchone() session_id = request.args.get("session_id") or (sessions[0]["session_id"] if sessions else "") only_fix = request.args.get("only_fix", "0") == "1" params = [] where = "" if session_id: where += " WHERE session_id=?" params.append(session_id) if only_fix: where += " AND carr_soln=2" if where else " WHERE carr_soln=2" points = con.execute(f""" SELECT datetime(unix_ts,'unixepoch','localtime') AS t, lat, lon, hmsl_corr_m, hacc_m, vacc_m, carr_soln, num_sats, source FROM gnss_pvt {where} ORDER BY unix_ts DESC LIMIT 200 """, params).fetchall() count = con.execute(f"SELECT COUNT(*) AS n FROM gnss_pvt {where}", params).fetchone()["n"] return render_template("index.html", sessions=sessions, session_id=session_id, only_fix=only_fix, points=points, count=count, active_session=active_session) @app.route("/record/start", methods=["POST"]) def record_start(): write_cmd("start") return redirect(url_for("index")) @app.route("/record/stop", methods=["POST"]) def record_stop(): write_cmd("stop") return redirect(url_for("index")) @app.route("/export.csv") def export_csv(): session_id = request.args.get("session_id") only_fix = request.args.get("only_fix", "0") == "1" params = [] where = "" if session_id: where += " WHERE session_id=?" params.append(session_id) if only_fix: where += " AND carr_soln=2" if where else " WHERE carr_soln=2" con = db() rows = con.execute(f""" SELECT datetime(unix_ts,'unixepoch','localtime') AS t, lat, lon, hmsl_m, hmsl_corr_m, hacc_m, vacc_m, fix_type, carr_soln, diff_soln, gnss_ok, num_sats, source FROM gnss_pvt {where} ORDER BY unix_ts ASC """, params).fetchall() def generate(): yield "time,lat,lon,hmsl_m,hmsl_corr_m,hacc_m,vacc_m,fix_type,carr_soln,diff_soln,gnss_ok,num_sats,source\n" for r in rows: yield ",".join(str(r[k]) if r[k] is not None else "" for k in r.keys()) + "\n" return Response(generate(), mimetype="text/csv", headers={"Content-Disposition": "attachment; filename=rtk_export.csv"}) if __name__ == "__main__": app.run(host="0.0.0.0", port=8080)