Skip to content

Commit f519d1f

Browse files
authored
Merge pull request #818 from pdxlocations/check-module-bitmask
Fix Getting and Setting Excluded Modules: Ringtone and Canned Messages
2 parents 8b36561 + 7e3d347 commit f519d1f

File tree

2 files changed

+36
-7
lines changed

2 files changed

+36
-7
lines changed

meshtastic/__main__.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
have_powermon = False
6060
powermon_exception = e
6161
meter = None
62-
from meshtastic.protobuf import channel_pb2, config_pb2, portnums_pb2
62+
from meshtastic.protobuf import channel_pb2, config_pb2, portnums_pb2, mesh_pb2
6363
from meshtastic.version import get_active_version
6464

6565
def onReceive(packet, interface) -> None:
@@ -377,16 +377,22 @@ def onConnected(interface):
377377
if args.set_canned_message:
378378
closeNow = True
379379
waitForAckNak = True
380-
print(f"Setting canned plugin message to {args.set_canned_message}")
381-
interface.getNode(args.dest, False, **getNode_kwargs).set_canned_message(
382-
args.set_canned_message
383-
)
380+
node = interface.getNode(args.dest, False, **getNode_kwargs)
381+
if node.module_available(mesh_pb2.CANNEDMSG_CONFIG):
382+
print(f"Setting canned plugin message to {args.set_canned_message}")
383+
node.set_canned_message(args.set_canned_message)
384+
else:
385+
print("Canned Message module is excluded by firmware; skipping set.")
384386

385387
if args.set_ringtone:
386388
closeNow = True
387389
waitForAckNak = True
388-
print(f"Setting ringtone to {args.set_ringtone}")
389-
interface.getNode(args.dest, False, **getNode_kwargs).set_ringtone(args.set_ringtone)
390+
node = interface.getNode(args.dest, False, **getNode_kwargs)
391+
if node.module_available(mesh_pb2.EXTNOTIF_CONFIG):
392+
print(f"Setting ringtone to {args.set_ringtone}")
393+
node.set_ringtone(args.set_ringtone)
394+
else:
395+
print("External Notification is excluded by firmware; skipping ringtone set.")
390396

391397
if args.pos_fields:
392398
# If --pos-fields invoked with args, set position fields

meshtastic/node.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ def __repr__(self):
5151
r += ")"
5252
return r
5353

54+
def module_available(self, excluded_bit: int) -> bool:
55+
"""Check DeviceMetadata.excluded_modules to see if a module is available."""
56+
meta = getattr(self.iface, "metadata", None)
57+
if meta is None:
58+
return True
59+
try:
60+
return (meta.excluded_modules & excluded_bit) == 0
61+
except Exception:
62+
return True
63+
5464
def showChannels(self):
5565
"""Show human readable description of our channels."""
5666
print("Channels:")
@@ -441,6 +451,10 @@ def onResponseRequestRingtone(self, p):
441451
def get_ringtone(self):
442452
"""Get the ringtone. Concatenate all pieces together and return a single string."""
443453
logging.debug(f"in get_ringtone()")
454+
if not self.module_available(mesh_pb2.EXTNOTIF_CONFIG):
455+
logging.warning("External Notification module not present (excluded by firmware)")
456+
return None
457+
444458
if not self.ringtone:
445459
p1 = admin_pb2.AdminMessage()
446460
p1.get_ringtone_request = True
@@ -462,6 +476,9 @@ def get_ringtone(self):
462476

463477
def set_ringtone(self, ringtone):
464478
"""Set the ringtone. The ringtone length must be less than 230 character."""
479+
if not self.module_available(mesh_pb2.EXTNOTIF_CONFIG):
480+
logging.warning("External Notification module not present (excluded by firmware)")
481+
return None
465482

466483
if len(ringtone) > 230:
467484
our_exit("Warning: The ringtone must be less than 230 characters.")
@@ -512,6 +529,9 @@ def onResponseRequestCannedMessagePluginMessageMessages(self, p):
512529
def get_canned_message(self):
513530
"""Get the canned message string. Concatenate all pieces together and return a single string."""
514531
logging.debug(f"in get_canned_message()")
532+
if not self.module_available(mesh_pb2.CANNEDMSG_CONFIG):
533+
logging.warning("Canned Message module not present (excluded by firmware)")
534+
return None
515535
if not self.cannedPluginMessage:
516536
p1 = admin_pb2.AdminMessage()
517537
p1.get_canned_message_module_messages_request = True
@@ -537,6 +557,9 @@ def get_canned_message(self):
537557

538558
def set_canned_message(self, message):
539559
"""Set the canned message. The canned messages length must be less than 200 character."""
560+
if not self.module_available(mesh_pb2.CANNEDMSG_CONFIG):
561+
logging.warning("Canned Message module not present (excluded by firmware)")
562+
return None
540563

541564
if len(message) > 200:
542565
our_exit("Warning: The canned message must be less than 200 characters.")

0 commit comments

Comments
 (0)