From 77d0615070d15bf86213755f3821bb2e9b29070a Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Thu, 4 Dec 2025 07:02:37 +0100 Subject: [PATCH 1/5] Autogen a basic api reference with sphinx --- Makefile | 5 +++++ docs/Makefile | 20 ++++++++++++++++++ docs/api/index.rst | 4 ++++ docs/api/python/trame_builder.rst | 1 + docs/conf.py | 12 +++++++++++ docs/index.rst | 9 ++++++++ flake.nix | 2 +- .../templates/python/trame_builder.rst.jinja | 21 +++++++++++++++++++ 8 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 docs/Makefile create mode 100644 docs/api/index.rst create mode 120000 docs/api/python/trame_builder.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 generators/templates/python/trame_builder.rst.jinja diff --git a/Makefile b/Makefile index fdc2d58..1dc2793 100644 --- a/Makefile +++ b/Makefile @@ -56,6 +56,11 @@ primitives: artefacts/trames.json @ python generators/generate_primitives.py +.PHONY: doc +doc: + $(MAKE) -C docs html + + V ?= 0 ifneq ($(V),0) Q := diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..40098da --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = ../.build/doc + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/api/index.rst b/docs/api/index.rst new file mode 100644 index 0000000..928db40 --- /dev/null +++ b/docs/api/index.rst @@ -0,0 +1,4 @@ +.. toctree:: + :maxdepth: 1 + + python/trame_builder diff --git a/docs/api/python/trame_builder.rst b/docs/api/python/trame_builder.rst new file mode 120000 index 0000000..3cd8eb3 --- /dev/null +++ b/docs/api/python/trame_builder.rst @@ -0,0 +1 @@ +../../../artefacts/python/trame_builder.rst \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..2528b96 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,12 @@ +import os +import sys + +# Allow `import ilo_primitives` if needed +sys.path.insert(0, os.path.abspath('../artefacts/primitives/python')) + +project = "Ilo Libs" + +extensions = [] + +templates_path = ["_templates"] +html_static_path = ["_static"] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..b1f28c0 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,9 @@ +Documentation +============= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + :hidden: + + api/index diff --git a/flake.nix b/flake.nix index 910549e..52ae378 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ clang-tools scom compiledb - (python3.withPackages (p: [ p.jinja2 ])) + (python3.withPackages (p: with p; [ jinja2 sphinx ])) ]; env.NIX_CFLAGS_COMPILE = diff --git a/generators/templates/python/trame_builder.rst.jinja b/generators/templates/python/trame_builder.rst.jinja new file mode 100644 index 0000000..17377b1 --- /dev/null +++ b/generators/templates/python/trame_builder.rst.jinja @@ -0,0 +1,21 @@ +Python Primitives API +===================== + +This section documents the generated Python primitives. + +{% set type_map = { + "boolean": "bool", + "integer": "int", + "string": "str", + "float": "float" +} %} + +{% for t in trames %} + +.. py:function:: {{ t.name }}({% for p in t.parameters %}{{ p.name }}: {{ type_map[p.type] }}{% if not loop.last %}, {% endif %}{% endfor %}) + + {{ t.doc or "Primitive for " ~ t.name }} + + **Returns:** ``str`` — the encoded trame. + +{% endfor %} From a8aa7b5e36b7d076353edf269e5db17c3ba18d12 Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Thu, 4 Dec 2025 07:55:39 +0100 Subject: [PATCH 2/5] Add trame spec, use furo theme --- docs/api/index.rst | 4 ++++ docs/api/trames.rst | 1 + flake.nix | 2 +- generators/generate_primitives.py | 20 ++++++++++++++++++-- generators/templates/docs/trames.rst.jinja | 18 ++++++++++++++++++ 5 files changed, 42 insertions(+), 3 deletions(-) create mode 120000 docs/api/trames.rst create mode 100644 generators/templates/docs/trames.rst.jinja diff --git a/docs/api/index.rst b/docs/api/index.rst index 928db40..b6e1cd5 100644 --- a/docs/api/index.rst +++ b/docs/api/index.rst @@ -1,4 +1,8 @@ +API +=== + .. toctree:: :maxdepth: 1 python/trame_builder + trames diff --git a/docs/api/trames.rst b/docs/api/trames.rst new file mode 120000 index 0000000..e6106c5 --- /dev/null +++ b/docs/api/trames.rst @@ -0,0 +1 @@ +../../artefacts/docs/trames.rst \ No newline at end of file diff --git a/flake.nix b/flake.nix index 52ae378..f8032f0 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,7 @@ clang-tools scom compiledb - (python3.withPackages (p: with p; [ jinja2 sphinx ])) + (python3.withPackages (p: with p; [ jinja2 sphinx furo ])) ]; env.NIX_CFLAGS_COMPILE = diff --git a/generators/generate_primitives.py b/generators/generate_primitives.py index f0aa500..b8ffc4e 100644 --- a/generators/generate_primitives.py +++ b/generators/generate_primitives.py @@ -70,9 +70,23 @@ def escape_fstring_literal(s: str) -> str: return s.replace("{", "{{").replace("}", "}}") +def format_trame(trame: Trame): + parts = [] + + for part, param in zip(trame["trame_parts"], trame["parameters"]): + parts.append(f'{part}[{param["name"]}]') + + if len(trame["trame_parts"]) > len(trame["parameters"]): + parts.append(trame["trame_parts"][-1]) + + + return '``<' + "".join(parts) + '>``' + + def main(): with TRAMES_JSON.open() as f: - trames_list = [rework_trame(trame) for trame in json.load(f)] + trames_formats = json.load(f) + trames = [rework_trame(trame) for trame in trames_formats] env = Environment( loader=FileSystemLoader(TEMPLATES_DIR), @@ -81,6 +95,7 @@ def main(): ) env.filters["escape_fstring"] = escape_fstring_literal + env.filters["format_trame"] = format_trame jinja_templates_per_langs = ( (lang_dir, template_file) @@ -96,7 +111,8 @@ def main(): template = env.get_template(str(rel_path)) rendered = template.render( - trames=trames_list, + trames=trames, + trames_formats=trames_formats, lang=lang_dir.name ) diff --git a/generators/templates/docs/trames.rst.jinja b/generators/templates/docs/trames.rst.jinja new file mode 100644 index 0000000..f27ea57 --- /dev/null +++ b/generators/templates/docs/trames.rst.jinja @@ -0,0 +1,18 @@ +======================== +ILO Trame Specification +======================== + +This table is generated automatically from ``trame.json``. + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + :class: ilo-trame-table + + * - **Name** + - **Trame Format** + + {% for t in trames %} + * - ``{{ t.name }}`` + - {{ t | format_trame }} + {% endfor %} From c40e01fb83ebe741edd806985eb7cf4122e6504c Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Thu, 4 Dec 2025 08:22:17 +0100 Subject: [PATCH 3/5] Prettify sphinx look --- .gitattributes | 2 ++ docs/_static/favicon.png | Bin 0 -> 5520 bytes docs/_static/ilo.png | Bin 0 -> 15919 bytes docs/conf.py | 13 ++++++++++++- docs/index.rst | 11 +++++++++-- 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 docs/_static/favicon.png create mode 100644 docs/_static/ilo.png diff --git a/.gitattributes b/.gitattributes index 6f7f8bc..b80c06c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,6 @@ artefacts/** linguist-generated +*.png binary + * text=lf * eol=lf diff --git a/docs/_static/favicon.png b/docs/_static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..89fca3b4454366f51d370bc9885d23967944ee92 GIT binary patch literal 5520 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py index 2528b96..fd35531 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,8 +5,19 @@ sys.path.insert(0, os.path.abspath('../artefacts/primitives/python')) project = "Ilo Libs" +copyright = author = "Intuition-rt" -extensions = [] +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.extlinks", + "sphinx.ext.napoleon", + "sphinx.ext.viewcode", +] templates_path = ["_templates"] html_static_path = ["_static"] + +html_title = project +html_theme = "furo" +html_logo = "_static/ilo.png" +html_favicon = "_static/favicon.png" diff --git a/docs/index.rst b/docs/index.rst index b1f28c0..7638a4e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,16 @@ Documentation ============= +Table of content +---------------- + .. toctree:: :maxdepth: 2 - :caption: Contents: - :hidden: api/index + + +.. toctree:: + :maxdepth: 10 + :caption: Reference + :hidden: From 0e2539bf34f6b55c36c2b182eca8288cd1706231 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 10:09:56 +0000 Subject: [PATCH 4/5] Regenerate artefacts automatically [skip ci] --- artefacts/docs/trames.rst | 160 +++++++++ artefacts/python/trame_builder.rst | 517 +++++++++++++++++++++++++++++ 2 files changed, 677 insertions(+) create mode 100644 artefacts/docs/trames.rst create mode 100644 artefacts/python/trame_builder.rst diff --git a/artefacts/docs/trames.rst b/artefacts/docs/trames.rst new file mode 100644 index 0000000..c31a826 --- /dev/null +++ b/artefacts/docs/trames.rst @@ -0,0 +1,160 @@ +======================== +ILO Trame Specification +======================== + +This table is generated automatically from ``trame.json``. + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + :class: ilo-trame-table + + * - **Name** + - **Trame Format** + + * - ``safety_stop`` + - ``<>`` + * - ``handshake_ilo`` + - ```` + * - ``get_robot_version`` + - ``<500y>`` + * - ``start_firmware_upload`` + - ``<500x[size]>`` + * - ``start_trame_s`` + - ``<0[trame_s_params]>`` + * - ``stop_tasks`` + - ``<00>`` + * - ``get_color_rgb_center`` + - ``<10c>`` + * - ``get_color_rgb_left`` + - ``<10l>`` + * - ``get_color_rgb_right`` + - ``<10d>`` + * - ``get_color_clear`` + - ``<11>`` + * - ``get_line`` + - ``<12>`` + * - ``set_line_threshold_value`` + - ``<13t[threshold]>`` + * - ``get_line_threshold_value`` + - ``<14>`` + * - ``get_accessory_status`` + - ``<15>`` + * - ``get_sensor_distance`` + - ``<20>`` + * - ``get_distance_front`` + - ``<21>`` + * - ``get_distance_right`` + - ``<22>`` + * - ``get_distance_back`` + - ``<23>`` + * - ``get_distance_left`` + - ``<24>`` + * - ``get_imu_info`` + - ``<30>`` + * - ``reset_angle`` + - ``<31>`` + * - ``get_raw_imu`` + - ``<32>`` + * - ``get_battery_info`` + - ``<40>`` + * - ``get_led_color`` + - ``<50>`` + * - ``set_led_color`` + - ``<51r[red]g[green]b[blue]>`` + * - ``set_led_shape`` + - ``<52v[shape]>`` + * - ``set_led_mode`` + - ``<53[mode]/[nb_loop]>`` + * - ``set_led_captor`` + - ``<54l[brightness]>`` + * - ``set_led_single`` + - ``<55t[type]d[id]r[red]g[green]b[blue]>`` + * - ``display_word`` + - ``<56w[word]d[delay]/[nb_loops]>`` + * - ``display_word_slide`` + - ``<57>`` + * - ``set_animation_flag_false`` + - ``<58>`` + * - ``run_command_motor`` + - ```` + * - ``ping_motor`` + - ``<60i[ping_status_0]s[ping_status_1]>`` + * - ``drive_single_motor_speed`` + - ``<610i[motor_index]a[acc]v[speed]>`` + * - ``get_single_motor_speed`` + - ``<611i[motor_index]>`` + * - ``drive_single_motor_angle`` + - ``<620i[motor_index]a[acc]v[vel]p[position]>`` + * - ``get_single_motor_angle`` + - ``<621i[motor_index]>`` + * - ``get_single_motor_temp`` + - ``<63i[motor_index]>`` + * - ``get_single_motor_volt`` + - ``<64i[motor_index]>`` + * - ``get_single_motor_load`` + - ``<65i[motor_index]>`` + * - ``get_single_motor_current`` + - ``<66i[motor_index]>`` + * - ``get_single_motor_move`` + - ``<67i[motor_index]>`` + * - ``set_motors_ilo_acc`` + - ``<680a[acc]>`` + * - ``get_motors_ilo_acc`` + - ``<681>`` + * - ``set_tempo_pos`` + - ``<690t[tempo_pos]>`` + * - ``get_tempo_pos`` + - ``<691>`` + * - ``set_pid`` + - ``<70p[Kp]i[Ki]d[Kd]>`` + * - ``get_pid`` + - ``<71>`` + * - ``check_auto_mode`` + - ``<80[current_auto_mode]>`` + * - ``set_wifi_credentials`` + - ``<90[ssid]{|||}[password]>`` + * - ``get_wifi_credentials`` + - ``<92>`` + * - ``get_hostname`` + - ``<93>`` + * - ``get_hostname_legacy`` + - ``<930>`` + * - ``set_name`` + - ``<94n[name]>`` + * - ``set_server_status`` + - ``<95s[status]>`` + * - ``get_server_status`` + - ``<96>`` + * - ``get_accessory_data`` + - ``<100>`` + * - ``get_accessory_info`` + - ``<101>`` + * - ``very_very_usefull`` + - ``<102>`` + * - ``set_debug_state`` + - ``<103s[state]>`` + * - ``start_diag`` + - ``<110>`` + * - ``get_manufacturing_date`` + - ``<120>`` + * - ``set_manufacturing_date`` + - ``<121s[date]>`` + * - ``get_first_use_date`` + - ``<130>`` + * - ``set_first_use_date`` + - ``<131s[date]>`` + * - ``get_product_version`` + - ``<140>`` + * - ``set_product_version`` + - ``<141s[version]>`` + * - ``get_product_id`` + - ``<150>`` + * - ``set_product_id`` + - ``<151s[product_id]>`` + * - ``get_review_date`` + - ``<160>`` + * - ``set_review_date`` + - ``<161s[date]>`` + * - ``set_auto_setup`` + - ``<170a[auto_setup]>`` diff --git a/artefacts/python/trame_builder.rst b/artefacts/python/trame_builder.rst new file mode 100644 index 0000000..1930a96 --- /dev/null +++ b/artefacts/python/trame_builder.rst @@ -0,0 +1,517 @@ +Python Primitives API +===================== + +This section documents the generated Python primitives. + + + +.. py:function:: safety_stop() + + Primitive for safety_stop + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: handshake_ilo() + + Primitive for handshake_ilo + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_robot_version() + + Primitive for get_robot_version + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: start_firmware_upload(size: int) + + Primitive for start_firmware_upload + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: start_trame_s(trame_s_params: str) + + Primitive for start_trame_s + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: stop_tasks() + + Primitive for stop_tasks + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_color_rgb_center() + + Primitive for get_color_rgb_center + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_color_rgb_left() + + Primitive for get_color_rgb_left + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_color_rgb_right() + + Primitive for get_color_rgb_right + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_color_clear() + + Primitive for get_color_clear + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_line() + + Primitive for get_line + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_line_threshold_value(threshold: int) + + Primitive for set_line_threshold_value + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_line_threshold_value() + + Primitive for get_line_threshold_value + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_accessory_status() + + Primitive for get_accessory_status + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_sensor_distance() + + Primitive for get_sensor_distance + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_distance_front() + + Primitive for get_distance_front + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_distance_right() + + Primitive for get_distance_right + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_distance_back() + + Primitive for get_distance_back + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_distance_left() + + Primitive for get_distance_left + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_imu_info() + + Primitive for get_imu_info + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: reset_angle() + + Primitive for reset_angle + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_raw_imu() + + Primitive for get_raw_imu + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_battery_info() + + Primitive for get_battery_info + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_led_color() + + Primitive for get_led_color + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_led_color(red: int, green: int, blue: int) + + Primitive for set_led_color + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_led_shape(shape: str) + + Primitive for set_led_shape + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_led_mode(mode: str, nb_loop: int) + + Primitive for set_led_mode + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_led_captor(brightness: int) + + Primitive for set_led_captor + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_led_single(type: str, id: int, red: int, green: int, blue: int) + + Primitive for set_led_single + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: display_word(word: str, delay: int, nb_loops: int) + + Primitive for display_word + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: display_word_slide() + + Primitive for display_word_slide + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_animation_flag_false() + + Primitive for set_animation_flag_false + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: run_command_motor(params: str) + + Primitive for run_command_motor + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: ping_motor(ping_status_0: int, ping_status_1: int) + + Primitive for ping_motor + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: drive_single_motor_speed(motor_index: int, acc: int, speed: int) + + Primitive for drive_single_motor_speed + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_speed(motor_index: int) + + Primitive for get_single_motor_speed + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: drive_single_motor_angle(motor_index: int, acc: int, vel: int, position: int) + + Primitive for drive_single_motor_angle + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_angle(motor_index: int) + + Primitive for get_single_motor_angle + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_temp(motor_index: int) + + Primitive for get_single_motor_temp + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_volt(motor_index: int) + + Primitive for get_single_motor_volt + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_load(motor_index: int) + + Primitive for get_single_motor_load + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_current(motor_index: int) + + Primitive for get_single_motor_current + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_single_motor_move(motor_index: int) + + Primitive for get_single_motor_move + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_motors_ilo_acc(acc: int) + + Primitive for set_motors_ilo_acc + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_motors_ilo_acc() + + Primitive for get_motors_ilo_acc + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_tempo_pos(tempo_pos: int) + + Primitive for set_tempo_pos + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_tempo_pos() + + Primitive for get_tempo_pos + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_pid(Kp: int, Ki: int, Kd: int) + + Primitive for set_pid + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_pid() + + Primitive for get_pid + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: check_auto_mode(current_auto_mode: int) + + Primitive for check_auto_mode + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_wifi_credentials(ssid: str, password: str) + + Primitive for set_wifi_credentials + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_wifi_credentials() + + Primitive for get_wifi_credentials + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_hostname() + + Primitive for get_hostname + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_hostname_legacy() + + Primitive for get_hostname_legacy + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_name(name: str) + + Primitive for set_name + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_server_status(status: int) + + Primitive for set_server_status + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_server_status() + + Primitive for get_server_status + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_accessory_data() + + Primitive for get_accessory_data + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_accessory_info() + + Primitive for get_accessory_info + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: very_very_usefull() + + Primitive for very_very_usefull + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_debug_state(state: int) + + Primitive for set_debug_state + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: start_diag() + + Primitive for start_diag + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_manufacturing_date() + + Primitive for get_manufacturing_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_manufacturing_date(date: str) + + Primitive for set_manufacturing_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_first_use_date() + + Primitive for get_first_use_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_first_use_date(date: str) + + Primitive for set_first_use_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_product_version() + + Primitive for get_product_version + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_product_version(version: str) + + Primitive for set_product_version + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_product_id() + + Primitive for get_product_id + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_product_id(product_id: str) + + Primitive for set_product_id + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: get_review_date() + + Primitive for get_review_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_review_date(date: str) + + Primitive for set_review_date + + **Returns:** ``str`` — the encoded trame. + + +.. py:function:: set_auto_setup(auto_setup: int) + + Primitive for set_auto_setup + + **Returns:** ``str`` — the encoded trame. + From a686a75479380b682056719b2c1a9e235b096e8e Mon Sep 17 00:00:00 2001 From: Sigmanificient Date: Thu, 4 Dec 2025 11:23:40 +0100 Subject: [PATCH 5/5] Fix corrupted images --- .gitattributes | 5 +++-- docs/_static/favicon.png | Bin 5520 -> 5521 bytes docs/_static/ilo.png | Bin 15919 -> 15914 bytes 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index b80c06c..832e560 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,6 +1,7 @@ artefacts/** linguist-generated -*.png binary - * text=lf * eol=lf + +*.png binary +*.jpg binary diff --git a/docs/_static/favicon.png b/docs/_static/favicon.png index 89fca3b4454366f51d370bc9885d23967944ee92..2de2f871d5e3a2f3b7190d4744c4a2411682fb1d 100644 GIT binary patch delta 14 VcmbQBJyDyrGr-TCcOy%WC;%c)1Wo_| delta 13 UcmbQJJwcnLGr-S%BWsT+03RO&K>z>% diff --git a/docs/_static/ilo.png b/docs/_static/ilo.png index 1a225bab6c0d9b42631355517c96a47192bfdf9c..7e9ad67d0d2c8321a9e128e4ed10618d2af5e5ab 100644 GIT binary patch delta 15592 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 VUh