example 'meshtastic': fix node map

This commit is contained in:
pls.153 2024-06-08 18:26:08 +02:00
parent e6eb418cab
commit 8a9fb55850
9 changed files with 53 additions and 29 deletions

View file

@ -62,7 +62,7 @@ Item {
if (pos) {
var marker = markers.itemAt(n)
marker.radioName = name
marker.customName = customName
marker.customName = (customName === "~") ? "" : customName
marker.coordinate = coordinate(pos)
marker.visible = true
}
@ -71,7 +71,7 @@ Item {
function updatePositions(myNum, myName, group) {
var n = 0
showMarker(n++, myNum, myName)
for (var i = 0; i < group.count; i++) {
for (var i = 1; i < group.count; i++) {
var data = group.get(i)
showMarker(n++, data.nodeNum, data.radioName, data.customName)
}

View file

@ -56,8 +56,9 @@ Item {
Com.MenuItem {
objectName: "share_location"
text: qsTr("Share my location...")
onTriggered: Lisp.call("loc:share-my-location")
text: qsTr("Share my location")
checkable: true
onTriggered: Lisp.call("loc:share-my-location", checked)
}
MenuSeparator {}
@ -179,6 +180,7 @@ Item {
property double lat: 0
property double lon: 0
property double alt: 0
property string time: "0" // no 'long' in JS
onPositionChanged: {
@ -186,6 +188,7 @@ Item {
var coor = position.coordinate;
lat = coor.latitude
lon = coor.longitude
alt = position.altitudeValid ? coor.altitude : 0
if (position.timestamp) {
var stime = String(position.timestamp.getTime())
time = stime.substring(0, stime.length - 3)
@ -196,7 +199,7 @@ Item {
}
function lastPosition() {
return [lat, lon, time]
return [lat, lon, alt, time]
}
}

View file

@ -101,6 +101,7 @@ QVariant QT::lastPosition() {
QVariantList pos;
pos << getDoubleField("position_lat")
<< getDoubleField("position_lon")
<< getDoubleField("position_alt")
<< getLongField("position_time");
return pos;
}

View file

@ -1,13 +1,17 @@
(in-package :loc)
(defvar *share-location* nil)
(defvar *positions* nil)
(defvar *manual-position* nil)
(defvar *gps-position* nil)
(defvar *last-updated* 0)
(defparameter *default-position* (list :lat 41.89193 :lon 12.51133 :time 0) ; Rome
(defparameter *default-position* (list :lat 41.89193 :lon 12.51133 :alt 0 :time 0) ; Rome
"Position of map center for manual position selection (no GPS).")
(defun ini ()
(setf *share-location* (app:setting :share-location))
(q> |checked| ui:*share-location* *share-location*)
#+android (qt:ini-positioning qt:*cpp*)
#+(or ios sfos) (q> |active| ui:*position-source* t)
(x:when-it (app:setting :selected-position)
@ -22,30 +26,37 @@
(setf (third pos) (parse-integer time))) ; see QML
pos))
(defun share-my-location () ; see QML
(defun share-my-location (share) ; see QML
"Share GPS position (ad hoc only)."
(app:confirm-dialog (tr "Share my location now?") 'do-share-my-location)
(setf *share-location* share)
(app:change-setting :share-location share)
(send-to-radio)
(values))
(defun do-share-my-location (share)
(when share
(send-to-radio)))
#+(or android ios sfos)
(defun update-my-position (&optional (sec 60)) ; try for 1 min
"Store current position internally, without sharing it, so we have a base for
eventual manual position setting."
(destructuring-bind (lat lon time)
(destructuring-bind (lat lon alt time)
(latest-gps-position)
(if (zerop lat)
(unless (zerop sec)
(qsingle-shot 1000 (lambda () (update-my-position (1- sec)))))
(let ((pos (list :lat lat :lon lon :time time)))
(let ((pos (list :lat lat :lon lon :alt alt :time time)))
(setf *gps-position* pos)
(qlog "position-updated: ~A" pos)))))
(qlog "position-updated: ~A" pos)
(send-to-radio)))))
(defun check-position-update ()
#+(or android ios sfos)
(let ((now (get-universal-time))
(15min 900))
(when (> (- now *last-updated*) 15min)
(setf *last-updated* now)
(update-my-position))))
(defun send-to-radio ()
(when (app:setting :share-location)
(when *share-location*
(if lora:*config-complete*
(lora:send-position (or *manual-position* *gps-position*))
(qsingle-shot (* 15 1000) 'send-to-radio))))
@ -71,6 +82,7 @@
(app:change-setting :selected-position *manual-position*)
(qlog "position-updated: ~A" pos))
(q> |visible| ui:*remove-marker* t)
(qlater 'send-to-radio)
(values))
(defun remove-marker () ; see QML

View file

@ -15,7 +15,8 @@
#-mobile t
"Print all sent/received protobuf packets as json to terminal.")
(defvar *log-packets* t
(defvar *log-packets* #+mobile nil
#-mobile t
"Write all raw protobuf data sent/received to a file.")
(defun ini ()
@ -176,7 +177,8 @@
(qt:write* qt:*cpp* bytes)))
((:usb :wifi)
(qrun*
(qt:write* qt:*cpp* (concatenate 'vector header bytes)))))))
(qt:write* qt:*cpp* (concatenate 'vector header bytes))))))
(loc:check-position-update))
(let (queue)
(defun send-enqueued (&rest functions) ; see Qt
@ -379,7 +381,8 @@
(me:name (me:settings *my-channel*))))
(qlater 'config-device))
(radios:choose-region))))))
(setf *received* nil)))
(setf *received* nil)
(loc:check-position-update)))
(defun radio-ready-p ()
(or (and *config-complete*
@ -485,7 +488,7 @@
(me:make-position
:latitude-i (to-int (getf pos :lat))
:longitude-i (to-int (getf pos :lon))
:time (getf pos :time))
:altitude (max 0 (min #.(expt 10 5) (floor (or (getf pos :alt) 0)))))
(me:make-position))) ; unset
:want-response t)))))

View file

@ -31,8 +31,9 @@
:hidden"
(x:when-it (getf message (if (getf message :me) :receiver :sender))
(unless (or loading (getf message :me))
(x:when-it* (app:setting (getf message :sender) :custom-name)
(setf (getf message :sender-name) x:it*)))
(let ((name (app:setting (getf message :sender) :custom-name)))
(when (and name (string/= "~" name))
(setf (getf message :sender-name) name))))
(unless loading
(let ((id (getf message :mid)))
(remf message :mid)

View file

@ -142,6 +142,7 @@
#:*positions*
#:activate-map
#:add-manual-marker
#:check-position-update
#:distance
#:extract-map-bin
#:ini

View file

@ -59,7 +59,7 @@ Item {
if (pos) {
var marker = markers.itemAt(n)
marker.radioName = name
marker.customName = customName
marker.customName = (customName === "~") ? "" : customName
marker.coordinate = coordinate(pos)
marker.visible = true
}
@ -68,7 +68,7 @@ Item {
function updatePositions(myNum, myName, group) {
var n = 0
showMarker(n++, myNum, myName)
for (var i = 0; i < group.count; i++) {
for (var i = 1; i < group.count; i++) {
var data = group.get(i)
showMarker(n++, data.nodeNum, data.radioName, data.customName)
}

View file

@ -55,8 +55,9 @@ Item {
Com.MenuItem {
objectName: "share_location"
text: qsTr("Share my location...")
onTriggered: Lisp.call("loc:share-my-location")
text: qsTr("Share my location")
checkable: true
onTriggered: Lisp.call("loc:share-my-location", checked)
}
MenuSeparator {}
@ -178,6 +179,7 @@ Item {
property double lat: 0
property double lon: 0
property double alt: 0
property string time: "0" // no 'long' in JS
onPositionChanged: {
@ -185,6 +187,7 @@ Item {
var coor = position.coordinate;
lat = coor.latitude
lon = coor.longitude
alt = position.altitudeValid ? coor.altitude : 0
if (position.timestamp) {
var stime = String(position.timestamp.getTime())
time = stime.substring(0, stime.length - 3)
@ -195,7 +198,7 @@ Item {
}
function lastPosition() {
return [lat, lon, time]
return [lat, lon, alt, time]
}
}