#!/local/www/bin/newlisp (load "/local/lib/newlisp/web.lsp") (load "/local/lib/newlisp/km.lsp") (setq Web:headers '(("Content-type" "text/plain;charset=utf-8"))) (Web:send-headers) (define (die msg) (println msg) (exit)) (set 'params '(imei lat long speed heading alt)) (dolist (x params) (let (y (string (or (Web:post (string x)) (Web:get (string x))))) (when (regex {^(undef|nan|nil|\(\))$} y 1) (set 'y nil)) ; (println x " = " y) (set x y))) (unless (and imei (find imei KM:auth-imei)) (die (string "NO (unauthorized IMEI '" imei "')"))) (define (degrees x) (format "%.5f" (if (regex {^(\d+)(\d\d\.\d+)([NSEW])$} (string x)) (let ((degr (int $1)) (mins (float $2)) (nsew $3)) (mul (if (or (= nsew "S") (= nsew "W")) -1 1) (add degr (div mins 60)))) (float x)))) (set 'lat (degrees lat)) (set 'long (degrees long)) (sql3:open KM:pos-db-file) (setq last-update (sql3:sql "SELECT timestamp FROM gps_data WHERE id=? ORDER BY timestamp DESC LIMIT 1" (list (int imei)))) (when (and (not (empty? last-update)) (< (- (date-value) 60) (last-update 0 0))) (sql3:close) (die (string "NO (last update " (- (date-value) (last-update 0 0)) " sec ago)"))) (when (and (> (float lat) 0) (> (float long) 0)) ; timestamp id latitude longitude altitude speed direction message (sql3:sql "INSERT INTO gps_data VALUES (?, ?, ?, ?, ?, ?, ?, NULL)" (list (date-value) (int imei) lat long alt speed heading)) (println "OK")) (sql3:close) (exit) ; vim: set tw=76 ts=2 encoding=utf8 fileencoding=utf8 ft=lisp et: