mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-11 23:52:14 +00:00
Adds support for position_precision
This commit is contained in:
parent
790f100620
commit
eb2fa727a7
@ -87,6 +87,7 @@ void Channels::initDefaultChannel(ChannelIndex chIndex)
|
|||||||
channelSettings.psk.bytes[0] = defaultpskIndex;
|
channelSettings.psk.bytes[0] = defaultpskIndex;
|
||||||
channelSettings.psk.size = 1;
|
channelSettings.psk.size = 1;
|
||||||
strncpy(channelSettings.name, "", sizeof(channelSettings.name));
|
strncpy(channelSettings.name, "", sizeof(channelSettings.name));
|
||||||
|
channelSettings.module_settings.position_precision = 32; // default to sending location on the primary channel
|
||||||
|
|
||||||
ch.has_settings = true;
|
ch.has_settings = true;
|
||||||
ch.role = meshtastic_Channel_Role_PRIMARY;
|
ch.role = meshtastic_Channel_Role_PRIMARY;
|
||||||
|
@ -23,6 +23,7 @@ PositionModule::PositionModule()
|
|||||||
: ProtobufModule("position", meshtastic_PortNum_POSITION_APP, &meshtastic_Position_msg),
|
: ProtobufModule("position", meshtastic_PortNum_POSITION_APP, &meshtastic_Position_msg),
|
||||||
concurrency::OSThread("PositionModule")
|
concurrency::OSThread("PositionModule")
|
||||||
{
|
{
|
||||||
|
precision = 0; // safe starting value
|
||||||
isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others
|
isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others
|
||||||
if (config.device.role != meshtastic_Config_DeviceConfig_Role_TRACKER &&
|
if (config.device.role != meshtastic_Config_DeviceConfig_Role_TRACKER &&
|
||||||
config.device.role != meshtastic_Config_DeviceConfig_Role_TAK_TRACKER)
|
config.device.role != meshtastic_Config_DeviceConfig_Role_TAK_TRACKER)
|
||||||
@ -83,20 +84,13 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
|
|||||||
|
|
||||||
nodeDB.updatePosition(getFrom(&mp), p);
|
nodeDB.updatePosition(getFrom(&mp), p);
|
||||||
|
|
||||||
// Only respond to location requests on the channel where we broadcast location.
|
|
||||||
if (channels.getByIndex(mp.channel).role == meshtastic_Channel_Role_PRIMARY) {
|
|
||||||
ignoreRequest = false;
|
|
||||||
} else {
|
|
||||||
ignoreRequest = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false; // Let others look at this message also if they want
|
return false; // Let others look at this message also if they want
|
||||||
}
|
}
|
||||||
|
|
||||||
meshtastic_MeshPacket *PositionModule::allocReply()
|
meshtastic_MeshPacket *PositionModule::allocReply()
|
||||||
{
|
{
|
||||||
if (ignoreRequest) {
|
if (precision == 0) {
|
||||||
ignoreRequest = false; // Reset for next request
|
LOG_DEBUG("Skipping location send because precision is set to 0!\n");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,8 +110,10 @@ meshtastic_MeshPacket *PositionModule::allocReply()
|
|||||||
localPosition.seq_number++;
|
localPosition.seq_number++;
|
||||||
|
|
||||||
// lat/lon are unconditionally included - IF AVAILABLE!
|
// lat/lon are unconditionally included - IF AVAILABLE!
|
||||||
p.latitude_i = localPosition.latitude_i;
|
LOG_DEBUG("Sending location with precision %i\n", precision);
|
||||||
p.longitude_i = localPosition.longitude_i;
|
p.latitude_i = localPosition.latitude_i & (INT32_MAX << (32 - precision));
|
||||||
|
p.longitude_i = localPosition.longitude_i & (INT32_MAX << (32 - precision));
|
||||||
|
p.precision_bits = precision;
|
||||||
p.time = localPosition.time;
|
p.time = localPosition.time;
|
||||||
|
|
||||||
if (pos_flags & meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE) {
|
if (pos_flags & meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE) {
|
||||||
@ -213,9 +209,12 @@ void PositionModule::sendOurPosition(NodeNum dest, bool wantReplies, uint8_t cha
|
|||||||
if (prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal)
|
if (prevPacketId) // if we wrap around to zero, we'll simply fail to cancel in that rare case (no big deal)
|
||||||
service.cancelSending(prevPacketId);
|
service.cancelSending(prevPacketId);
|
||||||
|
|
||||||
|
// Set's the class precision value for this particular packet
|
||||||
|
precision = channels.getByIndex(channel).settings.module_settings.position_precision;
|
||||||
|
|
||||||
meshtastic_MeshPacket *p = allocReply();
|
meshtastic_MeshPacket *p = allocReply();
|
||||||
if (p == nullptr) {
|
if (p == nullptr) {
|
||||||
LOG_WARN("allocReply returned a nullptr\n");
|
LOG_DEBUG("allocReply returned a nullptr\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,6 +50,7 @@ class PositionModule : public ProtobufModule<meshtastic_Position>, private concu
|
|||||||
private:
|
private:
|
||||||
struct SmartPosition getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition);
|
struct SmartPosition getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition);
|
||||||
meshtastic_MeshPacket *allocAtakPli();
|
meshtastic_MeshPacket *allocAtakPli();
|
||||||
|
uint32_t precision;
|
||||||
|
|
||||||
/** Only used in power saving trackers for now */
|
/** Only used in power saving trackers for now */
|
||||||
void clearPosition();
|
void clearPosition();
|
||||||
|
Loading…
Reference in New Issue
Block a user