mirror of
https://github.com/meshtastic/firmware.git
synced 2026-10-10 23:56:25 -04:00
Under USERPREFS_BLOCK_POSITION_ON_EVENT_CHANNEL every coordinate packet a client aimed at the event channel was rejected with the "Location sharing is disabled on this channel" notification - including the phone's own location feed. Both apps hand a GPS-less node its fix as a POSITION_APP packet addressed to the node itself on channel 0; that packet never leaves the device (Router::sendLocal delivers it locally) but resolved to the event channel and was dropped before PositionModule saw it. Result: the toast on every location tick, and nodes without a GPS never learned a position to share on their private channel. Position traffic now converges on the position channel - findPositionChannel(), the first channel with non-zero on-wire precision, which is never the event channel: - From-us-to-us coordinate packets are exempt from the event block. - Local coordinate sends aimed at the event channel (phone share-location, request-position, waypoints, any module/UI originator) are moved onto the position channel in Router::sendLocal and PhoneAPI instead of rejected. The client notification is only sent when no channel carries positions at all. - A position request DM'd to us on the event channel is answered on the position channel at that channel's precision (request_id preserved, same reply throttle); the requester's coordinates are still not stored, forwarded, relayed or published. want_response from the bitfield is merged before the event-channel decode short-circuit so such requests are seen. - PositionModule::sendOurPosition, positionUnchangedSinceLastSend and MeshService::trySendPosition use the shared helper instead of three copies of the same walk. Non-event builds are unaffected: the coercion compiles out and the helper matches the previous walk. Tests: coverage-event-policy (test_event_channel_phone_api, test_event_channel_router, test_position_precision, test_mqtt, test_nexthop_routing) and the same suites with the policy off. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
31 lines
1.8 KiB
C
31 lines
1.8 KiB
C
#pragma once
|
|
|
|
#include "meshtastic/channel.pb.h"
|
|
#include "meshtastic/mesh.pb.h"
|
|
#include <stdint.h>
|
|
|
|
// Max precision on a publicly-decryptable channel. CCPA "precise geolocation" = within a ~564m (1,850ft) radius.
|
|
// Precision is bit-truncation of latitude_i/longitude_i: the latitude cell stays ~constant in meters worldwide
|
|
// (~700m at 15 bits), while only the longitude cell varies - widest at the equator, narrowing toward the poles.
|
|
// 15 also matches the MQTT map-report public precision ceiling.
|
|
#define MAX_POSITION_PRECISION_PUBLIC_KEY 15
|
|
|
|
// Configured precision as-is; does NOT apply the public-key clamp -- use the channelIndex overload for the on-wire value.
|
|
uint32_t getPositionPrecisionForChannel(const meshtastic_Channel &channel);
|
|
|
|
// Configured precision, clamped to MAX_POSITION_PRECISION_PUBLIC_KEY when the channel's effective key is publicly decryptable.
|
|
uint32_t getPositionPrecisionForChannel(uint8_t channelIndex);
|
|
|
|
// The channel our position goes out on: the lowest index with a non-zero on-wire precision (disabled and event
|
|
// channels never qualify). Returns false when position sharing is off on every channel.
|
|
bool findPositionChannel(uint8_t &channelIndex);
|
|
|
|
// Truncate a single latitude_i/longitude_i to `precision` significant bits, centered in the
|
|
// resulting grid cell (stable under GPS jitter). precision 0 or >=32 returns the value unchanged.
|
|
// The return is the coordinate (int32_t); the uint8_t overload only narrows the precision arg.
|
|
int32_t truncateCoordinate(int32_t coordinate, uint32_t precision);
|
|
int32_t truncateCoordinate(int32_t coordinate, uint8_t precision);
|
|
void applyPositionPrecision(meshtastic_Position &position, uint32_t precision);
|
|
bool applyPositionPrecision(meshtastic_MeshPacket &packet, uint32_t precision);
|
|
bool applyPositionPrecisionForChannel(meshtastic_MeshPacket &packet, uint8_t channelIndex);
|