mirror of
https://github.com/meshtastic/python.git
synced 2026-01-02 12:57:56 -05:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
872fbef5d6 | ||
|
|
ec4fbe3a59 | ||
|
|
6bab385380 | ||
|
|
b8178d513a | ||
|
|
f4c085fc50 | ||
|
|
57f0598082 | ||
|
|
55d3188408 | ||
|
|
7b64fbb71b | ||
|
|
7f85eb0285 | ||
|
|
d05ef17ab3 | ||
|
|
d161291ca4 | ||
|
|
4e267c75b0 | ||
|
|
7cc18e9df6 | ||
|
|
9284a848f2 |
55
examples/waypoint.py
Normal file
55
examples/waypoint.py
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
"""Program to create and delete waypoint
|
||||||
|
To run:
|
||||||
|
python3 examples/waypoint.py --port /dev/ttyUSB0 create 45 test the_desc_2 '2024-12-18T23:05:23' 48.74 7.35
|
||||||
|
python3 examples/waypoint.py delete 45
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import datetime
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import meshtastic
|
||||||
|
import meshtastic.serial_interface
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
prog='waypoint',
|
||||||
|
description='Create and delete Meshtastic waypoint')
|
||||||
|
parser.add_argument('--port', default=None)
|
||||||
|
parser.add_argument('--debug', default=False, action='store_true')
|
||||||
|
|
||||||
|
subparsers = parser.add_subparsers(dest='cmd')
|
||||||
|
parser_delete = subparsers.add_parser('delete', help='Delete a waypoint')
|
||||||
|
parser_delete.add_argument('id', help="id of the waypoint")
|
||||||
|
|
||||||
|
parser_create = subparsers.add_parser('create', help='Create a new waypoint')
|
||||||
|
parser_create.add_argument('id', help="id of the waypoint")
|
||||||
|
parser_create.add_argument('name', help="name of the waypoint")
|
||||||
|
parser_create.add_argument('description', help="description of the waypoint")
|
||||||
|
parser_create.add_argument('expire', help="expiration date of the waypoint as interpreted by datetime.fromisoformat")
|
||||||
|
parser_create.add_argument('latitude', help="latitude of the waypoint")
|
||||||
|
parser_create.add_argument('longitude', help="longitude of the waypoint")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
print(args)
|
||||||
|
|
||||||
|
# By default will try to find a meshtastic device,
|
||||||
|
# otherwise provide a device path like /dev/ttyUSB0
|
||||||
|
if args.debug:
|
||||||
|
d = sys.stderr
|
||||||
|
else:
|
||||||
|
d = None
|
||||||
|
with meshtastic.serial_interface.SerialInterface(args.port, debugOut=d) as iface:
|
||||||
|
if args.cmd == 'create':
|
||||||
|
p = iface.sendWaypoint(
|
||||||
|
waypoint_id=int(args.id),
|
||||||
|
name=args.name,
|
||||||
|
description=args.description,
|
||||||
|
expire=int(datetime.datetime.fromisoformat(args.expire).timestamp()),
|
||||||
|
latitude=float(args.latitude),
|
||||||
|
longitude=float(args.longitude),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
p = iface.deleteWaypoint(int(args.id))
|
||||||
|
print(p)
|
||||||
|
|
||||||
|
# iface.close()
|
||||||
@@ -74,7 +74,7 @@ def onReceive(packet, interface) -> None:
|
|||||||
args
|
args
|
||||||
and args.sendtext
|
and args.sendtext
|
||||||
and packet["to"] == interface.myInfo.my_node_num
|
and packet["to"] == interface.myInfo.my_node_num
|
||||||
and d["portnum"] == portnums_pb2.PortNum.TEXT_MESSAGE_APP
|
and d.get("portnum", portnums_pb2.PortNum.UNKNOWN_APP) == portnums_pb2.PortNum.TEXT_MESSAGE_APP
|
||||||
):
|
):
|
||||||
interface.close() # after running command then exit
|
interface.close() # after running command then exit
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ def onReceive(packet, interface) -> None:
|
|||||||
interface.sendText(reply)
|
interface.sendText(reply)
|
||||||
|
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
print(f"Warning: There is no field {ex} in the packet.")
|
print(f"Warning: Error processing received packet: {ex}.")
|
||||||
|
|
||||||
|
|
||||||
def onConnection(interface, topic=pub.AUTO_TOPIC) -> None: # pylint: disable=W0613
|
def onConnection(interface, topic=pub.AUTO_TOPIC) -> None: # pylint: disable=W0613
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
import collections
|
import collections
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
|
import math
|
||||||
import random
|
import random
|
||||||
|
import secrets
|
||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
@@ -389,6 +391,40 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
channelIndex=channelIndex,
|
channelIndex=channelIndex,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def sendAlert(
|
||||||
|
self,
|
||||||
|
text: str,
|
||||||
|
destinationId: Union[int, str] = BROADCAST_ADDR,
|
||||||
|
onResponse: Optional[Callable[[dict], Any]] = None,
|
||||||
|
channelIndex: int = 0,
|
||||||
|
):
|
||||||
|
"""Send an alert text to some other node. This is similar to a text message,
|
||||||
|
but carries a higher priority and is capable of generating special notifications
|
||||||
|
on certain clients.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
text {string} -- The text of the alert to send
|
||||||
|
|
||||||
|
Keyword Arguments:
|
||||||
|
destinationId {nodeId or nodeNum} -- where to send this
|
||||||
|
message (default: {BROADCAST_ADDR})
|
||||||
|
|
||||||
|
Returns the sent packet. The id field will be populated in this packet
|
||||||
|
and can be used to track future message acks/naks.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return self.sendData(
|
||||||
|
text.encode("utf-8"),
|
||||||
|
destinationId,
|
||||||
|
portNum=portnums_pb2.PortNum.ALERT_APP,
|
||||||
|
wantAck=False,
|
||||||
|
wantResponse=False,
|
||||||
|
onResponse=onResponse,
|
||||||
|
channelIndex=channelIndex,
|
||||||
|
priority=mesh_pb2.MeshPacket.Priority.ALERT
|
||||||
|
)
|
||||||
|
|
||||||
def sendData(
|
def sendData(
|
||||||
self,
|
self,
|
||||||
data,
|
data,
|
||||||
@@ -402,6 +438,7 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
hopLimit: Optional[int]=None,
|
hopLimit: Optional[int]=None,
|
||||||
pkiEncrypted: Optional[bool]=False,
|
pkiEncrypted: Optional[bool]=False,
|
||||||
publicKey: Optional[bytes]=None,
|
publicKey: Optional[bytes]=None,
|
||||||
|
priority: mesh_pb2.MeshPacket.Priority.ValueType=mesh_pb2.MeshPacket.Priority.RELIABLE,
|
||||||
): # pylint: disable=R0913
|
): # pylint: disable=R0913
|
||||||
"""Send a data packet to some other node
|
"""Send a data packet to some other node
|
||||||
|
|
||||||
@@ -453,6 +490,8 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
meshPacket.decoded.portnum = portNum
|
meshPacket.decoded.portnum = portNum
|
||||||
meshPacket.decoded.want_response = wantResponse
|
meshPacket.decoded.want_response = wantResponse
|
||||||
meshPacket.id = self._generatePacketId()
|
meshPacket.id = self._generatePacketId()
|
||||||
|
if priority is not None:
|
||||||
|
meshPacket.priority = priority
|
||||||
|
|
||||||
if onResponse is not None:
|
if onResponse is not None:
|
||||||
logging.debug(f"Setting a response handler for requestId {meshPacket.id}")
|
logging.debug(f"Setting a response handler for requestId {meshPacket.id}")
|
||||||
@@ -700,6 +739,113 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
"No response from node. At least firmware 2.1.22 is required on the destination node."
|
"No response from node. At least firmware 2.1.22 is required on the destination node."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def onResponseWaypoint(self, p: dict):
|
||||||
|
"""on response for waypoint"""
|
||||||
|
if p["decoded"]["portnum"] == "WAYPOINT_APP":
|
||||||
|
self._acknowledgment.receivedWaypoint = True
|
||||||
|
w = mesh_pb2.Waypoint()
|
||||||
|
w.ParseFromString(p["decoded"]["payload"])
|
||||||
|
print(f"Waypoint received: {w}")
|
||||||
|
elif p["decoded"]["portnum"] == "ROUTING_APP":
|
||||||
|
if p["decoded"]["routing"]["errorReason"] == "NO_RESPONSE":
|
||||||
|
our_exit(
|
||||||
|
"No response from node. At least firmware 2.1.22 is required on the destination node."
|
||||||
|
)
|
||||||
|
|
||||||
|
def sendWaypoint(
|
||||||
|
self,
|
||||||
|
name,
|
||||||
|
description,
|
||||||
|
expire: int,
|
||||||
|
waypoint_id: Optional[int] = None,
|
||||||
|
latitude: float = 0.0,
|
||||||
|
longitude: float = 0.0,
|
||||||
|
destinationId: Union[int, str] = BROADCAST_ADDR,
|
||||||
|
wantAck: bool = True,
|
||||||
|
wantResponse: bool = False,
|
||||||
|
channelIndex: int = 0,
|
||||||
|
): # pylint: disable=R0913
|
||||||
|
"""
|
||||||
|
Send a waypoint packet to some other node (normally a broadcast)
|
||||||
|
|
||||||
|
Returns the sent packet. The id field will be populated in this packet and
|
||||||
|
can be used to track future message acks/naks.
|
||||||
|
"""
|
||||||
|
w = mesh_pb2.Waypoint()
|
||||||
|
w.name = name
|
||||||
|
w.description = description
|
||||||
|
w.expire = expire
|
||||||
|
if waypoint_id is None:
|
||||||
|
# Generate a waypoint's id, NOT a packet ID.
|
||||||
|
# same algorithm as https://github.com/meshtastic/js/blob/715e35d2374276a43ffa93c628e3710875d43907/src/meshDevice.ts#L791
|
||||||
|
seed = secrets.randbits(32)
|
||||||
|
w.id = math.floor(seed * math.pow(2, -32) * 1e9)
|
||||||
|
logging.debug(f"w.id:{w.id}")
|
||||||
|
else:
|
||||||
|
w.id = waypoint_id
|
||||||
|
if latitude != 0.0:
|
||||||
|
w.latitude_i = int(latitude * 1e7)
|
||||||
|
logging.debug(f"w.latitude_i:{w.latitude_i}")
|
||||||
|
if longitude != 0.0:
|
||||||
|
w.longitude_i = int(longitude * 1e7)
|
||||||
|
logging.debug(f"w.longitude_i:{w.longitude_i}")
|
||||||
|
|
||||||
|
if wantResponse:
|
||||||
|
onResponse = self.onResponseWaypoint
|
||||||
|
else:
|
||||||
|
onResponse = None
|
||||||
|
|
||||||
|
d = self.sendData(
|
||||||
|
w,
|
||||||
|
destinationId,
|
||||||
|
portNum=portnums_pb2.PortNum.WAYPOINT_APP,
|
||||||
|
wantAck=wantAck,
|
||||||
|
wantResponse=wantResponse,
|
||||||
|
onResponse=onResponse,
|
||||||
|
channelIndex=channelIndex,
|
||||||
|
)
|
||||||
|
if wantResponse:
|
||||||
|
self.waitForWaypoint()
|
||||||
|
return d
|
||||||
|
|
||||||
|
def deleteWaypoint(
|
||||||
|
self,
|
||||||
|
waypoint_id: int,
|
||||||
|
destinationId: Union[int, str] = BROADCAST_ADDR,
|
||||||
|
wantAck: bool = True,
|
||||||
|
wantResponse: bool = False,
|
||||||
|
channelIndex: int = 0,
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Send a waypoint deletion packet to some other node (normally a broadcast)
|
||||||
|
|
||||||
|
NB: The id must be the waypoint's id and not the id of the packet creation.
|
||||||
|
|
||||||
|
Returns the sent packet. The id field will be populated in this packet and
|
||||||
|
can be used to track future message acks/naks.
|
||||||
|
"""
|
||||||
|
p = mesh_pb2.Waypoint()
|
||||||
|
p.id = waypoint_id
|
||||||
|
p.expire = 0
|
||||||
|
|
||||||
|
if wantResponse:
|
||||||
|
onResponse = self.onResponseWaypoint
|
||||||
|
else:
|
||||||
|
onResponse = None
|
||||||
|
|
||||||
|
d = self.sendData(
|
||||||
|
p,
|
||||||
|
destinationId,
|
||||||
|
portNum=portnums_pb2.PortNum.WAYPOINT_APP,
|
||||||
|
wantAck=wantAck,
|
||||||
|
wantResponse=wantResponse,
|
||||||
|
onResponse=onResponse,
|
||||||
|
channelIndex=channelIndex,
|
||||||
|
)
|
||||||
|
if wantResponse:
|
||||||
|
self.waitForWaypoint()
|
||||||
|
return d
|
||||||
|
|
||||||
def _addResponseHandler(
|
def _addResponseHandler(
|
||||||
self,
|
self,
|
||||||
requestId: int,
|
requestId: int,
|
||||||
@@ -824,6 +970,12 @@ class MeshInterface: # pylint: disable=R0902
|
|||||||
if not success:
|
if not success:
|
||||||
raise MeshInterface.MeshInterfaceError("Timed out waiting for position")
|
raise MeshInterface.MeshInterfaceError("Timed out waiting for position")
|
||||||
|
|
||||||
|
def waitForWaypoint(self):
|
||||||
|
"""Wait for waypoint"""
|
||||||
|
success = self._timeout.waitForWaypoint(self._acknowledgment)
|
||||||
|
if not success:
|
||||||
|
raise MeshInterface.MeshInterfaceError("Timed out waiting for waypoint")
|
||||||
|
|
||||||
def getMyNodeInfo(self) -> Optional[Dict]:
|
def getMyNodeInfo(self) -> Optional[Dict]:
|
||||||
"""Get info about my node."""
|
"""Get info about my node."""
|
||||||
if self.myInfo is None or self.nodesByNum is None:
|
if self.myInfo is None or self.nodesByNum is None:
|
||||||
|
|||||||
92
meshtastic/protobuf/config_pb2.py
generated
92
meshtastic/protobuf/config_pb2.py
generated
File diff suppressed because one or more lines are too long
16
meshtastic/protobuf/config_pb2.pyi
generated
16
meshtastic/protobuf/config_pb2.pyi
generated
@@ -108,6 +108,14 @@ class Config(google.protobuf.message.Message):
|
|||||||
and automatic TAK PLI (position location information) broadcasts.
|
and automatic TAK PLI (position location information) broadcasts.
|
||||||
Uses position module configuration to determine TAK PLI broadcast interval.
|
Uses position module configuration to determine TAK PLI broadcast interval.
|
||||||
"""
|
"""
|
||||||
|
ROUTER_LATE: Config.DeviceConfig._Role.ValueType # 11
|
||||||
|
"""
|
||||||
|
Description: Will always rebroadcast packets, but will do so after all other modes.
|
||||||
|
Technical Details: Used for router nodes that are intended to provide additional coverage
|
||||||
|
in areas not already covered by other routers, or to bridge around problematic terrain,
|
||||||
|
but should not be given priority over other routers in order to avoid unnecessaraily
|
||||||
|
consuming hops.
|
||||||
|
"""
|
||||||
|
|
||||||
class Role(_Role, metaclass=_RoleEnumTypeWrapper):
|
class Role(_Role, metaclass=_RoleEnumTypeWrapper):
|
||||||
"""
|
"""
|
||||||
@@ -184,6 +192,14 @@ class Config(google.protobuf.message.Message):
|
|||||||
and automatic TAK PLI (position location information) broadcasts.
|
and automatic TAK PLI (position location information) broadcasts.
|
||||||
Uses position module configuration to determine TAK PLI broadcast interval.
|
Uses position module configuration to determine TAK PLI broadcast interval.
|
||||||
"""
|
"""
|
||||||
|
ROUTER_LATE: Config.DeviceConfig.Role.ValueType # 11
|
||||||
|
"""
|
||||||
|
Description: Will always rebroadcast packets, but will do so after all other modes.
|
||||||
|
Technical Details: Used for router nodes that are intended to provide additional coverage
|
||||||
|
in areas not already covered by other routers, or to bridge around problematic terrain,
|
||||||
|
but should not be given priority over other routers in order to avoid unnecessaraily
|
||||||
|
consuming hops.
|
||||||
|
"""
|
||||||
|
|
||||||
class _RebroadcastMode:
|
class _RebroadcastMode:
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ValueType = typing.NewType("ValueType", builtins.int)
|
||||||
|
|||||||
100
meshtastic/protobuf/mesh_pb2.py
generated
100
meshtastic/protobuf/mesh_pb2.py
generated
File diff suppressed because one or more lines are too long
10
meshtastic/protobuf/mesh_pb2.pyi
generated
10
meshtastic/protobuf/mesh_pb2.pyi
generated
@@ -2083,6 +2083,7 @@ class MeshPacket(google.protobuf.message.Message):
|
|||||||
PKI_ENCRYPTED_FIELD_NUMBER: builtins.int
|
PKI_ENCRYPTED_FIELD_NUMBER: builtins.int
|
||||||
NEXT_HOP_FIELD_NUMBER: builtins.int
|
NEXT_HOP_FIELD_NUMBER: builtins.int
|
||||||
RELAY_NODE_FIELD_NUMBER: builtins.int
|
RELAY_NODE_FIELD_NUMBER: builtins.int
|
||||||
|
TX_AFTER_FIELD_NUMBER: builtins.int
|
||||||
to: builtins.int
|
to: builtins.int
|
||||||
"""
|
"""
|
||||||
The (immediate) destination for this packet
|
The (immediate) destination for this packet
|
||||||
@@ -2184,6 +2185,12 @@ class MeshPacket(google.protobuf.message.Message):
|
|||||||
Last byte of the node number of the node that will relay/relayed this packet.
|
Last byte of the node number of the node that will relay/relayed this packet.
|
||||||
Set by the firmware internally, clients are not supposed to set this.
|
Set by the firmware internally, clients are not supposed to set this.
|
||||||
"""
|
"""
|
||||||
|
tx_after: builtins.int
|
||||||
|
"""
|
||||||
|
*Never* sent over the radio links.
|
||||||
|
Timestamp after which this packet may be sent.
|
||||||
|
Set by the firmware internally, clients are not supposed to set this.
|
||||||
|
"""
|
||||||
@property
|
@property
|
||||||
def decoded(self) -> global___Data:
|
def decoded(self) -> global___Data:
|
||||||
"""
|
"""
|
||||||
@@ -2211,9 +2218,10 @@ class MeshPacket(google.protobuf.message.Message):
|
|||||||
pki_encrypted: builtins.bool = ...,
|
pki_encrypted: builtins.bool = ...,
|
||||||
next_hop: builtins.int = ...,
|
next_hop: builtins.int = ...,
|
||||||
relay_node: builtins.int = ...,
|
relay_node: builtins.int = ...,
|
||||||
|
tx_after: builtins.int = ...,
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
def HasField(self, field_name: typing.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ...
|
def HasField(self, field_name: typing.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ...
|
||||||
def ClearField(self, field_name: typing.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "next_hop", b"next_hop", "payload_variant", b"payload_variant", "pki_encrypted", b"pki_encrypted", "priority", b"priority", "public_key", b"public_key", "relay_node", b"relay_node", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ...
|
def ClearField(self, field_name: typing.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "next_hop", b"next_hop", "payload_variant", b"payload_variant", "pki_encrypted", b"pki_encrypted", "priority", b"priority", "public_key", b"public_key", "relay_node", b"relay_node", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "tx_after", b"tx_after", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ...
|
||||||
def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["decoded", "encrypted"] | None: ...
|
def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["decoded", "encrypted"] | None: ...
|
||||||
|
|
||||||
global___MeshPacket = MeshPacket
|
global___MeshPacket = MeshPacket
|
||||||
|
|||||||
@@ -1608,7 +1608,7 @@ def test_main_onReceive_empty(caplog, capsys):
|
|||||||
assert re.search(r"in onReceive", caplog.text, re.MULTILINE)
|
assert re.search(r"in onReceive", caplog.text, re.MULTILINE)
|
||||||
out, err = capsys.readouterr()
|
out, err = capsys.readouterr()
|
||||||
assert re.search(
|
assert re.search(
|
||||||
r"Warning: There is no field 'to' in the packet.", out, re.MULTILINE
|
r"Warning: Error processing received packet: 'to'.", out, re.MULTILINE
|
||||||
)
|
)
|
||||||
assert err == ""
|
assert err == ""
|
||||||
|
|
||||||
|
|||||||
@@ -254,6 +254,16 @@ class Timeout:
|
|||||||
time.sleep(self.sleepInterval)
|
time.sleep(self.sleepInterval)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def waitForWaypoint(self, acknowledgment) -> bool:
|
||||||
|
"""Block until waypoint response is received. Returns True if waypoint response has been received."""
|
||||||
|
self.reset()
|
||||||
|
while time.time() < self.expireTime:
|
||||||
|
if getattr(acknowledgment, "receivedWaypoint", None):
|
||||||
|
acknowledgment.reset()
|
||||||
|
return True
|
||||||
|
time.sleep(self.sleepInterval)
|
||||||
|
return False
|
||||||
|
|
||||||
class Acknowledgment:
|
class Acknowledgment:
|
||||||
"A class that records which type of acknowledgment was just received, if any."
|
"A class that records which type of acknowledgment was just received, if any."
|
||||||
|
|
||||||
@@ -265,6 +275,7 @@ class Acknowledgment:
|
|||||||
self.receivedTraceRoute = False
|
self.receivedTraceRoute = False
|
||||||
self.receivedTelemetry = False
|
self.receivedTelemetry = False
|
||||||
self.receivedPosition = False
|
self.receivedPosition = False
|
||||||
|
self.receivedWaypoint = False
|
||||||
|
|
||||||
def reset(self) -> None:
|
def reset(self) -> None:
|
||||||
"""reset"""
|
"""reset"""
|
||||||
@@ -274,6 +285,7 @@ class Acknowledgment:
|
|||||||
self.receivedTraceRoute = False
|
self.receivedTraceRoute = False
|
||||||
self.receivedTelemetry = False
|
self.receivedTelemetry = False
|
||||||
self.receivedPosition = False
|
self.receivedPosition = False
|
||||||
|
self.receivedWaypoint = False
|
||||||
|
|
||||||
|
|
||||||
class DeferredExecution:
|
class DeferredExecution:
|
||||||
|
|||||||
8
poetry.lock
generated
8
poetry.lock
generated
@@ -1,4 +1,4 @@
|
|||||||
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand.
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "altgraph"
|
name = "altgraph"
|
||||||
@@ -1459,13 +1459,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jinja2"
|
name = "jinja2"
|
||||||
version = "3.1.4"
|
version = "3.1.5"
|
||||||
description = "A very fast and expressive template engine."
|
description = "A very fast and expressive template engine."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
|
{file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
|
||||||
{file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
|
{file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
|||||||
Submodule protobufs updated: 2cffaf53e3...c55f120a9c
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "meshtastic"
|
name = "meshtastic"
|
||||||
version = "2.5.7"
|
version = "2.5.9"
|
||||||
description = "Python API & client shell for talking to Meshtastic devices"
|
description = "Python API & client shell for talking to Meshtastic devices"
|
||||||
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
|
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
|
|||||||
Reference in New Issue
Block a user