starting OTA without reconnecting the node, canceling OTA too… wow
This commit is contained in:
parent
a3f763ad35
commit
0256c061ea
2 changed files with 30 additions and 1 deletions
|
@ -16,7 +16,7 @@ from django.utils import timezone
|
||||||
|
|
||||||
from c3nav.mesh import messages
|
from c3nav.mesh import messages
|
||||||
from c3nav.mesh.messages import (MESH_BROADCAST_ADDRESS, MESH_NONE_ADDRESS, MESH_ROOT_ADDRESS, OTA_CHUNK_SIZE,
|
from c3nav.mesh.messages import (MESH_BROADCAST_ADDRESS, MESH_NONE_ADDRESS, MESH_ROOT_ADDRESS, OTA_CHUNK_SIZE,
|
||||||
MeshMessage, MeshMessageType, OTASettingMessage, OTAApplyMessage)
|
MeshMessage, MeshMessageType, OTAApplyMessage, OTASettingMessage)
|
||||||
from c3nav.mesh.models import MeshNode, MeshUplink, NodeMessage, OTARecipientStatus, OTAUpdate, OTAUpdateRecipient
|
from c3nav.mesh.models import MeshNode, MeshUplink, NodeMessage, OTARecipientStatus, OTAUpdate, OTAUpdateRecipient
|
||||||
from c3nav.mesh.utils import MESH_ALL_OTA_GROUP, MESH_ALL_UPLINKS_GROUP, UPLINK_PING, get_mesh_uplink_group
|
from c3nav.mesh.utils import MESH_ALL_OTA_GROUP, MESH_ALL_UPLINKS_GROUP, UPLINK_PING, get_mesh_uplink_group
|
||||||
from c3nav.routing.rangelocator import RangeLocator
|
from c3nav.routing.rangelocator import RangeLocator
|
||||||
|
@ -176,6 +176,9 @@ class MeshConsumer(AsyncWebsocketConsumer):
|
||||||
# add signed in uplink node to broadcast group
|
# add signed in uplink node to broadcast group
|
||||||
await self.channel_layer.group_add(MESH_ALL_UPLINKS_GROUP, self.channel_name)
|
await self.channel_layer.group_add(MESH_ALL_UPLINKS_GROUP, self.channel_name)
|
||||||
|
|
||||||
|
# OTA releases bluh bluh
|
||||||
|
await self.channel_layer.group_add(MESH_ALL_OTA_GROUP, self.channel_name)
|
||||||
|
|
||||||
# add this node as a destination that this uplink handles (duh)
|
# add this node as a destination that this uplink handles (duh)
|
||||||
await self.add_dst_nodes(nodes=(src_node, ))
|
await self.add_dst_nodes(nodes=(src_node, ))
|
||||||
self.dst_nodes[msg.src].last_msg[MeshMessageType.MESH_SIGNIN] = msg
|
self.dst_nodes[msg.src].last_msg[MeshMessageType.MESH_SIGNIN] = msg
|
||||||
|
@ -327,6 +330,14 @@ class MeshConsumer(AsyncWebsocketConsumer):
|
||||||
return
|
return
|
||||||
await self.send_msg(MeshMessage.fromjson(data["msg"]), data["sender"])
|
await self.send_msg(MeshMessage.fromjson(data["msg"]), data["sender"])
|
||||||
|
|
||||||
|
async def mesh_ota_recipients_changed(self, data):
|
||||||
|
addresses = set(data["addresses"]) - set(self.dst_nodes.keys())
|
||||||
|
print('recipients changed!')
|
||||||
|
if not addresses:
|
||||||
|
print('but none of ours')
|
||||||
|
return
|
||||||
|
await self.check_ota(addresses)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
helper functions
|
helper functions
|
||||||
"""
|
"""
|
||||||
|
@ -639,6 +650,16 @@ class MeshUIConsumer(AsyncJsonWebsocketConsumer):
|
||||||
update_id=recipient.update_id,
|
update_id=recipient.update_id,
|
||||||
reboot=(ota == "reboot"),
|
reboot=(ota == "reboot"),
|
||||||
).send()
|
).send()
|
||||||
|
elif ota == "cancel":
|
||||||
|
recipient.status = OTARecipientStatus.CANCELED
|
||||||
|
await recipient.send_status()
|
||||||
|
await OTAUpdateRecipient.objects.filter(pk=recipient.pk).aupdate(
|
||||||
|
status=OTARecipientStatus.CANCELED
|
||||||
|
)
|
||||||
|
self.channel_layer.group_send(MESH_ALL_OTA_GROUP, {
|
||||||
|
"type": "mesh.ota_recipients_changed",
|
||||||
|
"addresses": [recipient.node_id]
|
||||||
|
})
|
||||||
|
|
||||||
if "send_msg" in content:
|
if "send_msg" in content:
|
||||||
msg_to_send = self.scope["session"].pop("mesh_msg_%s" % content["send_msg"], None)
|
msg_to_send = self.scope["session"].pop("mesh_msg_%s" % content["send_msg"], None)
|
||||||
|
|
|
@ -5,6 +5,7 @@ from functools import cached_property
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from typing import Any, Sequence
|
from typing import Any, Sequence
|
||||||
|
|
||||||
|
import channels
|
||||||
from asgiref.sync import async_to_sync
|
from asgiref.sync import async_to_sync
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
@ -17,6 +18,7 @@ from c3nav.mesh.dataformats import BoardConfig, BoardType, LedType, SerialLedTyp
|
||||||
from c3nav.mesh.messages import MESH_BROADCAST_ADDRESS, MESH_ROOT_ADDRESS, MeshMessage, MeshMessageType
|
from c3nav.mesh.messages import MESH_BROADCAST_ADDRESS, MESH_ROOT_ADDRESS, MeshMessage, MeshMessageType
|
||||||
from c3nav.mesh.models import (FirmwareBuild, HardwareDescription, MeshNode, OTARecipientStatus, OTAUpdate,
|
from c3nav.mesh.models import (FirmwareBuild, HardwareDescription, MeshNode, OTARecipientStatus, OTAUpdate,
|
||||||
OTAUpdateRecipient)
|
OTAUpdateRecipient)
|
||||||
|
from c3nav.mesh.utils import MESH_ALL_OTA_GROUP
|
||||||
|
|
||||||
|
|
||||||
class MeshMessageForm(forms.Form):
|
class MeshMessageForm(forms.Form):
|
||||||
|
@ -380,6 +382,7 @@ class OTACreateForm(Form):
|
||||||
|
|
||||||
def save(self) -> list[OTAUpdate]:
|
def save(self) -> list[OTAUpdate]:
|
||||||
updates = []
|
updates = []
|
||||||
|
addresses = []
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
replaced_recipients = OTAUpdateRecipient.objects.filter(
|
replaced_recipients = OTAUpdateRecipient.objects.filter(
|
||||||
node__in=chain(*self.selected_builds.values()),
|
node__in=chain(*self.selected_builds.values()),
|
||||||
|
@ -390,5 +393,10 @@ class OTACreateForm(Form):
|
||||||
update = OTAUpdate.objects.create(build=build)
|
update = OTAUpdate.objects.create(build=build)
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
update.recipients.create(node=node)
|
update.recipients.create(node=node)
|
||||||
|
addresses.append(node.address)
|
||||||
updates.append(update)
|
updates.append(update)
|
||||||
|
async_to_sync(channels.layers.get_channel_layer().group_send)(MESH_ALL_OTA_GROUP, {
|
||||||
|
"type": "mesh.ota_recipients_changed",
|
||||||
|
"addresses": [addresses]
|
||||||
|
})
|
||||||
return updates
|
return updates
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue