Skip to content

Commit fcdd838

Browse files
authored
Merge pull request #795 from pdxlocations/canned-config
Add Ringtone and Canned Messages to --export-config and --configure
2 parents 58967e1 + 68a2009 commit fcdd838

File tree

6 files changed

+99
-7
lines changed

6 files changed

+99
-7
lines changed

example_config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ owner_short: BOB
44

55
channel_url: https://www.meshtastic.org/e/#CgMSAQESCDgBQANIAVAe
66

7+
canned_messages: Hi|Bye|Yes|No|Ok
8+
ringtone: 24:d=32,o=5,b=565:f6,p,f6,4p,p,f6,p,f6,2p,p,b6,p,b6,p,b6,p,b6,p,b,p,b,p,b,p,b,p,b,p,b,p,b,p,b,1p.,2p.,p
9+
710
location:
811
lat: 35.88888
912
lon: -93.88888

meshtastic/__main__.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,6 @@ def onConnected(interface):
375375
short_name=args.set_owner_short, is_unmessagable=unmessagable
376376
)
377377

378-
# TODO: add to export-config and configure
379378
if args.set_canned_message:
380379
closeNow = True
381380
waitForAckNak = True
@@ -384,7 +383,6 @@ def onConnected(interface):
384383
args.set_canned_message
385384
)
386385

387-
# TODO: add to export-config and configure
388386
if args.set_ringtone:
389387
closeNow = True
390388
waitForAckNak = True
@@ -718,6 +716,16 @@ def onConnected(interface):
718716
interface.getNode(args.dest, **getNode_kwargs).setURL(configuration["channelUrl"])
719717
time.sleep(0.5)
720718

719+
if "canned_messages" in configuration:
720+
print("Setting canned message messages to", configuration["canned_messages"])
721+
interface.getNode(args.dest, **getNode_kwargs).set_canned_message(configuration["canned_messages"])
722+
time.sleep(0.5)
723+
724+
if "ringtone" in configuration:
725+
print("Setting ringtone to", configuration["ringtone"])
726+
interface.getNode(args.dest, **getNode_kwargs).set_ringtone(configuration["ringtone"])
727+
time.sleep(0.5)
728+
721729
if "location" in configuration:
722730
alt = 0
723731
lat = 0.0
@@ -952,12 +960,14 @@ def setSimpleConfig(modem_preset):
952960
if args.get_canned_message:
953961
closeNow = True
954962
print("")
955-
interface.getNode(args.dest, **getNode_kwargs).get_canned_message()
963+
messages = interface.getNode(args.dest, **getNode_kwargs).get_canned_message()
964+
print(f"canned_plugin_message:{messages}")
956965

957966
if args.get_ringtone:
958967
closeNow = True
959968
print("")
960-
interface.getNode(args.dest, **getNode_kwargs).get_ringtone()
969+
ringtone = interface.getNode(args.dest, **getNode_kwargs).get_ringtone()
970+
print(f"ringtone:{ringtone}")
961971

962972
if args.info:
963973
print("")
@@ -1121,6 +1131,8 @@ def export_config(interface) -> str:
11211131
owner_short = interface.getShortName()
11221132
channel_url = interface.localNode.getURL()
11231133
myinfo = interface.getMyNodeInfo()
1134+
canned_messages = interface.getCannedMessage()
1135+
ringtone = interface.getRingtone()
11241136
pos = myinfo.get("position")
11251137
lat = None
11261138
lon = None
@@ -1139,6 +1151,10 @@ def export_config(interface) -> str:
11391151
configObj["channelUrl"] = channel_url
11401152
else:
11411153
configObj["channel_url"] = channel_url
1154+
if canned_messages:
1155+
configObj["canned_messages"] = canned_messages
1156+
if ringtone:
1157+
configObj["ringtone"] = ringtone
11421158
# lat and lon don't make much sense without the other (so fill with 0s), and alt isn't meaningful without both
11431159
if lat or lon:
11441160
configObj["location"] = {"lat": lat or float(0), "lon": lon or float(0)}

meshtastic/mesh_interface.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,20 @@ def getPublicKey(self):
10841084
return user.get("publicKey", None)
10851085
return None
10861086

1087+
def getCannedMessage(self):
1088+
"""Get canned message"""
1089+
node = self.localNode
1090+
if node is not None:
1091+
return node.get_canned_message()
1092+
return None
1093+
1094+
def getRingtone(self):
1095+
"""Get ringtone"""
1096+
node = self.localNode
1097+
if node is not None:
1098+
return node.get_ringtone()
1099+
return None
1100+
10871101
def _waitConnected(self, timeout=30.0):
10881102
"""Block until the initial node db download is complete, or timeout
10891103
and raise an exception"""

meshtastic/node.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,6 @@ def get_ringtone(self):
457457
if self.ringtonePart:
458458
self.ringtone += self.ringtonePart
459459

460-
print(f"ringtone:{self.ringtone}")
461460
logging.debug(f"ringtone:{self.ringtone}")
462461
return self.ringtone
463462

@@ -533,7 +532,6 @@ def get_canned_message(self):
533532
if self.cannedPluginMessageMessages:
534533
self.cannedPluginMessage += self.cannedPluginMessageMessages
535534

536-
print(f"canned_plugin_message:{self.cannedPluginMessage}")
537535
logging.debug(f"canned_plugin_message:{self.cannedPluginMessage}")
538536
return self.cannedPluginMessage
539537

meshtastic/tests/test_main.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,44 @@ def test_main_get_canned_messages(capsys, caplog, iface_with_nodes):
525525
assert err == ""
526526
mo.assert_called()
527527

528+
@pytest.mark.unit
529+
@pytest.mark.usefixtures("reset_mt_config")
530+
def test_main_set_ringtone(capsys):
531+
"""Test --set-ringtone"""
532+
sys.argv = ["", "--set-ringtone", "foo,bar"]
533+
mt_config.args = sys.argv
534+
535+
iface = MagicMock(autospec=SerialInterface)
536+
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
537+
main()
538+
out, err = capsys.readouterr()
539+
assert re.search(r"Connected to radio", out, re.MULTILINE)
540+
assert re.search(r"Setting ringtone to foo,bar", out, re.MULTILINE)
541+
assert err == ""
542+
mo.assert_called()
543+
544+
@pytest.mark.unit
545+
@pytest.mark.usefixtures("reset_mt_config")
546+
def test_main_get_ringtone(capsys, caplog, iface_with_nodes):
547+
"""Test --get-ringtone"""
548+
sys.argv = ["", "--get-ringtone"]
549+
mt_config.args = sys.argv
550+
551+
iface = iface_with_nodes
552+
iface.devPath = "bar"
553+
554+
mocked_node = MagicMock(autospec=Node)
555+
mocked_node.get_ringtone.return_value = "foo,bar"
556+
iface.localNode = mocked_node
557+
558+
with caplog.at_level(logging.DEBUG):
559+
with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo:
560+
main()
561+
out, err = capsys.readouterr()
562+
assert re.search(r"Connected to radio", out, re.MULTILINE)
563+
assert re.search(r"ringtone:foo,bar", out, re.MULTILINE)
564+
assert err == ""
565+
mo.assert_called()
528566

529567
@pytest.mark.unit
530568
@pytest.mark.usefixtures("reset_mt_config")
@@ -1755,6 +1793,8 @@ def test_main_export_config(capsys):
17551793
mo.getLongName.return_value = "foo"
17561794
mo.getShortName.return_value = "oof"
17571795
mo.localNode.getURL.return_value = "bar"
1796+
mo.getCannedMessage.return_value = "foo|bar"
1797+
mo.getRingtone.return_value = "24:d=32,o=5"
17581798
mo.getMyNodeInfo().get.return_value = {
17591799
"latitudeI": 1100000000,
17601800
"longitudeI": 1200000000,

meshtastic/tests/test_mesh_interface.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,28 @@ def test_getMyNodeInfo():
525525
myinfo = iface.getMyNodeInfo()
526526
assert myinfo == anode
527527

528+
@pytest.mark.unit
529+
@pytest.mark.usefixtures("reset_mt_config")
530+
def test_getCannedMessage():
531+
"""Test MeshInterface.getCannedMessage()"""
532+
iface = MeshInterface(noProto=True)
533+
node = MagicMock()
534+
node.get_canned_message.return_value = "Hi|Bye|Yes"
535+
iface.localNode = node
536+
result = iface.getCannedMessage()
537+
assert result == "Hi|Bye|Yes"
538+
539+
540+
@pytest.mark.unit
541+
@pytest.mark.usefixtures("reset_mt_config")
542+
def test_getRingtone():
543+
"""Test MeshInterface.getRingtone()"""
544+
iface = MeshInterface(noProto=True)
545+
node = MagicMock()
546+
node.get_ringtone.return_value = "foo,bar"
547+
iface.localNode = node
548+
result = iface.getRingtone()
549+
assert result == "foo,bar"
528550

529551
@pytest.mark.unit
530552
@pytest.mark.usefixtures("reset_mt_config")
@@ -543,7 +565,6 @@ def test_generatePacketId(capsys):
543565
assert err == ""
544566
assert pytest_wrapped_e.type == MeshInterface.MeshInterfaceError
545567

546-
547568
@pytest.mark.unit
548569
@pytest.mark.usefixtures("reset_mt_config")
549570
def test_fixupPosition_empty_pos():

0 commit comments

Comments
 (0)