diff --git a/src/c3nav/control/templates/control/mesh_message_send.html b/src/c3nav/control/templates/control/mesh_message_send.html index 29a84a65..a6d1cbb4 100644 --- a/src/c3nav/control/templates/control/mesh_message_send.html +++ b/src/c3nav/control/templates/control/mesh_message_send.html @@ -16,8 +16,42 @@ {% block subcontent %}
{% csrf_token %} - {{ form }} - + {{ form.as_div }} + {{ form.conditionals | json_script:"form-conditionals" }} + +
diff --git a/src/c3nav/control/templates/control/mesh_messages.html b/src/c3nav/control/templates/control/mesh_messages.html index f8b102ce..640dc8cd 100644 --- a/src/c3nav/control/templates/control/mesh_messages.html +++ b/src/c3nav/control/templates/control/mesh_messages.html @@ -34,9 +34,10 @@ {{ msg.src_node }} {{ msg.get_message_type_display }} - {% if msg.get_message_type_display == "CONFIG_FIRMWARE" %} + {% if msg.get_message_type_display == "CONFIG_HARDWARE" %} Chip: {{ msg.parsed.get_chip_display }} rev{{ msg.parsed.revision_major }}.{{ msg.parsed.revision_minor }} -
+ + {% elif msg.get_message_type_display == "CONFIG_FIRMWARE" %} Firmware: {{ msg.parsed.app_desc.project_name }} {{ msg.parsed.app_desc.version }} (IDF {{ msg.parsed.app_desc.idf_version }})
Compile Date: {{ msg.parsed.app_desc.compile_date }} {{ msg.parsed.app_desc.compile_time }} diff --git a/src/c3nav/control/templates/control/mesh_node_detail.html b/src/c3nav/control/templates/control/mesh_node_detail.html index f4ff538d..e3baf7c2 100644 --- a/src/c3nav/control/templates/control/mesh_node_detail.html +++ b/src/c3nav/control/templates/control/mesh_node_detail.html @@ -40,11 +40,13 @@

+

Hardware

+

+ Chip: {{ node.last_messages.CONFIG_HARDWARE.parsed.get_chip_display }} + rev{{ node.last_messages.CONFIG_HARDWARE.parsed.revision_major }}.{{ node.last_messages.CONFIG_HARDWARE.parsed.revision_minor }} +

Firmware

- Chip: {{ node.last_messages.CONFIG_FIRMWARE.parsed.get_chip_display }} - rev{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_major }}.{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_minor }} -
Firmware: {{ node.last_messages.CONFIG_FIRMWARE.parsed.app_desc.project_name }} {{ node.last_messages.CONFIG_FIRMWARE.parsed.version }} (IDF {{ node.last_messages.CONFIG_FIRMWARE.parsed.app_desc.idf_version }})
Compile Date: {{ node.last_messages.CONFIG_FIRMWARE.parsed.app_desc.compile_date }} {{ node.last_messages.CONFIG_FIRMWARE.parsed.app_desc.compile_time }} diff --git a/src/c3nav/control/templates/control/mesh_nodes.html b/src/c3nav/control/templates/control/mesh_nodes.html index 60f799a7..d15d6a90 100644 --- a/src/c3nav/control/templates/control/mesh_nodes.html +++ b/src/c3nav/control/templates/control/mesh_nodes.html @@ -45,8 +45,8 @@ {{ node }} - {{ node.last_messages.CONFIG_FIRMWARE.parsed.get_chip_display }} - rev{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_major }}.{{ node.last_messages.CONFIG_FIRMWARE.parsed.revision_minor }} + {{ node.last_messages.CONFIG_HARDWARE.parsed.get_chip_display }} + rev{{ node.last_messages.CONFIG_HARDWARE.parsed.revision_major }}.{{ node.last_messages.CONFIG_HARDWARE.parsed.revision_minor }} {{ node.last_messages.CONFIG_FIRMWARE.parsed.app_desc.version }} diff --git a/src/c3nav/control/views/mesh.py b/src/c3nav/control/views/mesh.py index aa15533e..904fea29 100644 --- a/src/c3nav/control/views/mesh.py +++ b/src/c3nav/control/views/mesh.py @@ -145,6 +145,10 @@ class MeshMessageSendView(ControlPanelMixin, FormView): messages.success(self.request, _('Message sent successfully(?)')) super().form_valid(form) uuid = uuid4() + from pprint import pprint + pprint(form.get_msg_data()) + pprint(MeshMessage.fromjson(form.get_msg_data())) + 1/0 self.request.session["mesh_msg_%s" % uuid] = { "success_url": self.get_success_url(), "recipients": form.get_recipients(), diff --git a/src/c3nav/mesh/forms.py b/src/c3nav/mesh/forms.py index 84db29d2..70a127d1 100644 --- a/src/c3nav/mesh/forms.py +++ b/src/c3nav/mesh/forms.py @@ -6,7 +6,7 @@ from django.core.exceptions import ValidationError from django.http import Http404 from django.utils.translation import gettext_lazy as _ -from c3nav.mesh.dataformats import LedConfig +from c3nav.mesh.dataformats import LedConfig, LedType, SerialLedType, BoardType, BoardConfig from c3nav.mesh.messages import MESH_BROADCAST_ADDRESS, MESH_ROOT_ADDRESS, MeshMessage, MeshMessageType from c3nav.mesh.models import MeshNode @@ -121,29 +121,83 @@ class ConfigUplinkMessageForm(MeshMessageForm): port = forms.IntegerField(min_value=1, max_value=65535, label=_('port')) -class ConfigLedMessageForm(MeshMessageForm): - msg_type = MeshMessageType.CONFIG_LED +class ConfigBoardMessageForm(MeshMessageForm): + msg_type = MeshMessageType.CONFIG_BOARD - led_type = forms.ChoiceField(choices=( - ('', _('no LED')), - (1, _('serial LED')), - (2, _('multipin LED')) - )) - gpio = forms.IntegerField(min_value=0, max_value=48, required=False, - label=_('gpio pin'), help_text=_('serial only')) - rmt = forms.IntegerField(min_value=0, max_value=7, required=False, - label=_('rmt'), help_text=_('serial only')) - gpio_r = forms.IntegerField(min_value=0, max_value=48, required=False, - label=_('gpio red'), help_text=_('multipin only')) - gpio_g = forms.IntegerField(min_value=0, max_value=48, required=False, - label=_('gpio green'), help_text=_('multipin only')) - gpio_b = forms.IntegerField(min_value=0, max_value=48, required=False, - label=_('gpio blue'), help_text=_('multipin only')) + # todo: don't use numerical values + board = forms.ChoiceField(choices=((item.value, item.name) for item in BoardType), + label=_('board')) + led_type = forms.ChoiceField(choices=((item.value, item.name) for item in LedType), + label=_('LED type')) + led_serial_type = forms.ChoiceField(choices=((item.value or '', item.name) for item in SerialLedType), + label=_('serial LED type'), help_text=_('serial LED only')) + # todo: make this use the modern messages + led_serial_gpio = forms.IntegerField(min_value=0, max_value=48, required=False, + label=_('serial LED GPIO pin'), help_text=_('serial LED only')) + led_multipin_gpio_r = forms.IntegerField(min_value=0, max_value=48, required=False, + label=_('multpin LED GPIO red'), help_text=_('multipin LED only')) + led_multipin_gpio_g = forms.IntegerField(min_value=0, max_value=48, required=False, + label=_('multpin LED GPIO green'), help_text=_('multipin LED only')) + led_multipin_gpio_b = forms.IntegerField(min_value=0, max_value=48, required=False, + label=_('multpin LED GPIO blue'), help_text=_('multipin LED only')) + + uwb_enable = forms.BooleanField(required=False, label=_('UWB enable')) + uwb_gpio_miso = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO MISO'), help_text=_('UWB only')) + uwb_gpio_mosi = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO MOSI'), help_text=_('UWB only')) + uwb_gpio_clk = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO CLK'), help_text=_('UWB only')) + uwb_gpio_cs = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO CS'), help_text=_('UWB only')) + uwb_gpio_irq = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO IRQ'), help_text=_('UWB only')) + uwb_gpio_rst = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO RST'), help_text=_('UWB only')) + uwb_gpio_wakeup = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO WAKEUP'), help_text=_('UWB only')) + uwb_gpio_exton = forms.IntegerField(min_value=-1, max_value=48, required=False, + label=_('UWB GPIO EXTON'), help_text=_('UWB only')) + + conditionals = ( + { + "prefix": "led_", + "field": "board", + "values": tuple( + str(cfg.board.value) for cfg in BoardConfig._union_options["board"].values() + if "led" in cfg.__dataclass_fields__ + ), + }, + { + "prefix": "led_serial_", + "field": "led_type", + "values": (str(LedType.SERIAL.value),), + }, + { + "prefix": "led_multipin_", + "field": "led_type", + "values": (str(LedType.MULTIPIN.value),), + }, + { + "prefix": "uwb_", + "field": "board", + "values": tuple( + str(cfg.board.value) for cfg in BoardConfig._union_options["board"].values() + if "uwb" in cfg.__dataclass_fields__ + ), + }, + { + "prefix": "uwb_gpio_", + "field": "uwb_enable", + "values": (True,) + }, + ) def clean(self): cleaned_data = super().clean() led_type = int(cleaned_data["led_type"]) + if led_type: required_fields = set(field.name for field in dataclass_fields(LedConfig.ledconfig_types[led_type])) else: @@ -154,7 +208,7 @@ class ConfigLedMessageForm(MeshMessageForm): "led_type": led_type } - for key, value in cleaned_data.items(): + """for key, value in cleaned_data.items(): if key == "recipients": continue if value and key not in required_fields: @@ -164,7 +218,7 @@ class ConfigLedMessageForm(MeshMessageForm): value = cleaned_data.pop(key, "") if value == "": errors[key] = _("this field is required for this LED type") - led_config[key] = value + led_config[key] = value""" cleaned_data["led_config"] = led_config diff --git a/src/c3nav/mesh/messages.py b/src/c3nav/mesh/messages.py index 3ce85780..2e7de544 100644 --- a/src/c3nav/mesh/messages.py +++ b/src/c3nav/mesh/messages.py @@ -227,7 +227,7 @@ class BoardType(IntEnum): @dataclass class ConfigBoardMessage(MeshMessage, msg_id=MeshMessageType.CONFIG_BOARD): """ set/respond board config """ - board_config: BoardConfig = field(metadata={"c_embed": True}) + board_config: BoardConfig = field(metadata={"c_embed": True, "json_embed": True}) @dataclass