From cf0ee6cf8357dba80f643b62858be48266f443e3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 00:06:11 +0000
Subject: [PATCH 1/6] Initial plan
From 0ed3083da2f8a31a1e2c31ef2bb63586c73fd5a8 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 00:18:23 +0000
Subject: [PATCH 2/6] Add C# code generator, frame parser generator, and test
files
Co-authored-by: rijesha <7819200+rijesha@users.noreply.github.com>
---
src/struct_frame/__init__.py | 8 +-
.../boilerplate/csharp/FrameBase.cs | 97 +++++
src/struct_frame/csharp_gen.py | 245 ++++++++++++
src/struct_frame/frame_parser_csharp_gen.py | 371 ++++++++++++++++++
src/struct_frame/generate.py | 44 ++-
tests/csharp/test_arrays.cs | 204 ++++++++++
tests/csharp/test_basic_types.cs | 150 +++++++
tests/test_config.json | 20 +
8 files changed, 1130 insertions(+), 9 deletions(-)
create mode 100644 src/struct_frame/boilerplate/csharp/FrameBase.cs
create mode 100644 src/struct_frame/csharp_gen.py
create mode 100644 src/struct_frame/frame_parser_csharp_gen.py
create mode 100644 tests/csharp/test_arrays.cs
create mode 100644 tests/csharp/test_basic_types.cs
diff --git a/src/struct_frame/__init__.py b/src/struct_frame/__init__.py
index ad7e287d..dc80c5ad 100644
--- a/src/struct_frame/__init__.py
+++ b/src/struct_frame/__init__.py
@@ -6,12 +6,14 @@
from .py_gen import FilePyGen
from .gql_gen import FileGqlGen
from .cpp_gen import FileCppGen
+from .csharp_gen import FileCSharpGen
from .frame_format import FrameFormat, FrameFormatCollection, parse_frame_formats
from .frame_parser_c_gen import generate_c_frame_parsers, FrameParserCGen
from .frame_parser_py_gen import generate_py_frame_parsers, FrameParserPyGen
from .frame_parser_ts_gen import generate_ts_frame_parsers, generate_js_frame_parsers, FrameParserTsGen, FrameParserJsGen
from .frame_parser_cpp_gen import generate_cpp_frame_parsers, FrameParserCppGen
+from .frame_parser_csharp_gen import generate_csharp_frame_parsers, FrameParserCSharpGen
from .generate import main
from .generate_boilerplate import (
@@ -21,12 +23,12 @@
get_boilerplate_dir
)
-__all__ = ["main", "FileCGen", "FileTsGen", "FileJsGen", "FilePyGen", "FileGqlGen", "FileCppGen", "version",
+__all__ = ["main", "FileCGen", "FileTsGen", "FileJsGen", "FilePyGen", "FileGqlGen", "FileCppGen", "FileCSharpGen", "version",
"NamingStyleC", "CamelToSnakeCase", "pascalCase",
"FrameFormat", "FrameFormatCollection", "parse_frame_formats",
"generate_c_frame_parsers", "generate_py_frame_parsers",
"generate_ts_frame_parsers", "generate_js_frame_parsers",
- "generate_cpp_frame_parsers",
- "FrameParserCGen", "FrameParserPyGen", "FrameParserTsGen", "FrameParserJsGen", "FrameParserCppGen",
+ "generate_cpp_frame_parsers", "generate_csharp_frame_parsers",
+ "FrameParserCGen", "FrameParserPyGen", "FrameParserTsGen", "FrameParserJsGen", "FrameParserCppGen", "FrameParserCSharpGen",
"generate_boilerplate_to_paths", "update_src_boilerplate",
"get_default_frame_formats_path", "get_boilerplate_dir"]
diff --git a/src/struct_frame/boilerplate/csharp/FrameBase.cs b/src/struct_frame/boilerplate/csharp/FrameBase.cs
new file mode 100644
index 00000000..c33b4ac6
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/FrameBase.cs
@@ -0,0 +1,97 @@
+// Automatically generated frame base for C#
+// This file provides base utilities for struct frame parsing and encoding
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace StructFrame
+{
+ ///
+ /// Represents the result of parsing a frame
+ ///
+ public struct FrameParseResult
+ {
+ public bool Valid;
+ public int MsgId;
+ public byte[] MsgData;
+ public int MsgSize;
+ }
+
+ ///
+ /// Base class for frame format implementations
+ ///
+ public abstract class FrameFormatBase
+ {
+ ///
+ /// Encodes a message into a byte array
+ ///
+ public abstract byte[] Encode(int msgId, byte[] msgData);
+
+ ///
+ /// Validates and parses a packet
+ ///
+ public abstract FrameParseResult ValidatePacket(byte[] data, int length);
+
+ ///
+ /// Parses a single byte (for streaming parsers)
+ ///
+ public abstract FrameParseResult ParseByte(byte b);
+
+ ///
+ /// Resets the parser state
+ ///
+ public abstract void Reset();
+ }
+
+ ///
+ /// Helper methods for struct serialization
+ ///
+ public static class StructHelper
+ {
+ ///
+ /// Converts a struct to a byte array
+ ///
+ public static byte[] StructToBytes(T structure) where T : struct
+ {
+ int size = Marshal.SizeOf(typeof(T));
+ byte[] buffer = new byte[size];
+ IntPtr ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.StructureToPtr(structure, ptr, false);
+ Marshal.Copy(ptr, buffer, 0, size);
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+ return buffer;
+ }
+
+ ///
+ /// Converts a byte array to a struct
+ ///
+ public static T BytesToStruct(byte[] buffer) where T : struct
+ {
+ return BytesToStruct(buffer, 0);
+ }
+
+ ///
+ /// Converts a byte array to a struct starting at an offset
+ ///
+ public static T BytesToStruct(byte[] buffer, int offset) where T : struct
+ {
+ int size = Marshal.SizeOf(typeof(T));
+ IntPtr ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.Copy(buffer, offset, ptr, size);
+ return Marshal.PtrToStructure(ptr);
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+ }
+ }
+}
diff --git a/src/struct_frame/csharp_gen.py b/src/struct_frame/csharp_gen.py
new file mode 100644
index 00000000..1386bcf3
--- /dev/null
+++ b/src/struct_frame/csharp_gen.py
@@ -0,0 +1,245 @@
+#!/usr/bin/env python3
+# kate: replace-tabs on; indent-width 4;
+"""
+C# code generator for struct-frame.
+
+This module generates C# code for struct serialization using
+StructLayout and MarshalAs attributes for binary compatibility.
+"""
+
+from struct_frame import version, NamingStyleC, CamelToSnakeCase, pascalCase
+import time
+
+StyleC = NamingStyleC()
+
+# Mapping from proto types to C# types
+csharp_types = {
+ "uint8": "byte",
+ "int8": "sbyte",
+ "uint16": "ushort",
+ "int16": "short",
+ "uint32": "uint",
+ "int32": "int",
+ "bool": "bool",
+ "float": "float",
+ "double": "double",
+ "uint64": "ulong",
+ "int64": "long",
+ "string": "byte", # Strings are byte arrays in C#
+}
+
+
+class EnumCSharpGen():
+ @staticmethod
+ def generate(field):
+ leading_comment = field.comments
+
+ result = ''
+ if leading_comment:
+ for c in leading_comment:
+ result += ' /// \n'
+ result += ' /// %s\n' % c.strip('/')
+ result += ' /// \n'
+
+ enumName = '%s%s' % (pascalCase(field.package), field.name)
+ result += ' public enum %s : byte\n' % enumName
+ result += ' {\n'
+
+ enum_length = len(field.data)
+ enum_values = []
+ for index, (d) in enumerate(field.data):
+ leading_comment = field.data[d][1]
+
+ if leading_comment:
+ for c in leading_comment:
+ enum_values.append(' /// ')
+ enum_values.append(' /// %s' % c.strip('/'))
+ enum_values.append(' /// ')
+
+ comma = ","
+ if index == enum_length - 1:
+ comma = ""
+
+ enum_value = " %s = %d%s" % (
+ StyleC.enum_entry(d), field.data[d][0], comma)
+ enum_values.append(enum_value)
+
+ result += '\n'.join(enum_values)
+ result += '\n }\n'
+
+ return result
+
+
+class FieldCSharpGen():
+ @staticmethod
+ def generate(field, field_offset):
+ """Generate C# field definition with FieldOffset attribute"""
+ result = ''
+ var_name = pascalCase(field.name)
+ type_name = field.fieldType
+
+ # Add leading comments
+ leading_comment = field.comments
+ if leading_comment:
+ for c in leading_comment:
+ result += ' /// \n'
+ result += ' /// %s\n' % c.strip('/')
+ result += ' /// \n'
+
+ # Handle basic type resolution
+ if type_name in csharp_types:
+ base_type = csharp_types[type_name]
+ else:
+ if field.isEnum:
+ base_type = '%s%s' % (pascalCase(field.package), type_name)
+ else:
+ base_type = '%s%s' % (pascalCase(field.package), type_name)
+
+ # Handle arrays
+ if field.is_array:
+ if field.fieldType == "string":
+ # String arrays need both array size and individual string size
+ if field.size_option is not None:
+ # Fixed string array: size_option strings, each element_size bytes
+ total_size = field.size_option * field.element_size
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {total_size})]\n'
+ result += f' public byte[] {var_name}; // Fixed string array: {field.size_option} strings, each max {field.element_size} chars\n'
+ elif field.max_size is not None:
+ # Variable string array: count byte + max_size strings of element_size bytes each
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' public byte {var_name}Count;\n'
+ total_size = field.max_size * field.element_size
+ result += f' [FieldOffset({field_offset + 1})]\n'
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {total_size})]\n'
+ result += f' public byte[] {var_name}Data; // Variable string array: up to {field.max_size} strings, each max {field.element_size} chars\n'
+ else:
+ # Non-string arrays
+ if field.size_option is not None:
+ # Fixed array
+ result += f' [FieldOffset({field_offset})]\n'
+ if field.isEnum:
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.size_option})]\n'
+ result += f' public byte[] {var_name}; // Fixed array of {base_type}: {field.size_option} elements\n'
+ else:
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.size_option})]\n'
+ result += f' public {base_type}[] {var_name}; // Fixed array: {field.size_option} elements\n'
+ elif field.max_size is not None:
+ # Variable array: count byte + max elements
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' public byte {var_name}Count;\n'
+ result += f' [FieldOffset({field_offset + 1})]\n'
+ if field.isEnum:
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.max_size})]\n'
+ result += f' public byte[] {var_name}Data; // Variable array of {base_type}: up to {field.max_size} elements\n'
+ else:
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.max_size})]\n'
+ result += f' public {base_type}[] {var_name}Data; // Variable array: up to {field.max_size} elements\n'
+
+ # Handle regular strings
+ elif field.fieldType == "string":
+ if field.size_option is not None:
+ # Fixed string: exactly size_option characters
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.size_option})]\n'
+ result += f' public byte[] {var_name}; // Fixed string: exactly {field.size_option} chars\n'
+ elif field.max_size is not None:
+ # Variable string: length byte + max characters
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' public byte {var_name}Length;\n'
+ result += f' [FieldOffset({field_offset + 1})]\n'
+ result += f' [MarshalAs(UnmanagedType.ByValArray, SizeConst = {field.max_size})]\n'
+ result += f' public byte[] {var_name}Data; // Variable string: up to {field.max_size} chars\n'
+
+ # Handle regular fields
+ else:
+ result += f' [FieldOffset({field_offset})]\n'
+ result += f' public {base_type} {var_name};\n'
+
+ return result
+
+
+class MessageCSharpGen():
+ @staticmethod
+ def generate(msg):
+ leading_comment = msg.comments
+
+ result = ''
+ if leading_comment:
+ for c in msg.comments:
+ result += ' /// \n'
+ result += ' /// %s\n' % c.strip('/')
+ result += ' /// \n'
+
+ structName = '%s%s' % (pascalCase(msg.package), msg.name)
+ defineName = '%s_%s' % (CamelToSnakeCase(
+ msg.package).upper(), CamelToSnakeCase(msg.name).upper())
+
+ result += ' [StructLayout(LayoutKind.Explicit, Pack = 1, Size = %d)]\n' % msg.size
+ result += ' public struct %s\n' % structName
+ result += ' {\n'
+
+ result += ' public const int MaxSize = %d;\n' % msg.size
+ if msg.id:
+ result += ' public const int MsgId = %d;\n' % msg.id
+ result += '\n'
+
+ if not msg.fields:
+ # Empty structs need a dummy field
+ result += ' [FieldOffset(0)]\n'
+ result += ' public byte DummyField;\n'
+ else:
+ # Calculate field offsets
+ offset = 0
+ for key, f in msg.fields.items():
+ result += FieldCSharpGen.generate(f, offset)
+ offset += f.size
+
+ result += ' }\n'
+
+ return result + '\n'
+
+
+class FileCSharpGen():
+ @staticmethod
+ def generate(package):
+ yield '// Automatically generated struct frame code for C#\n'
+ yield '// Generated by %s at %s.\n\n' % (version, time.asctime())
+
+ yield 'using System;\n'
+ yield 'using System.Runtime.InteropServices;\n\n'
+
+ namespace_name = pascalCase(package.name)
+ yield 'namespace StructFrame.%s\n' % namespace_name
+ yield '{\n'
+
+ if package.enums:
+ yield ' // Enum definitions\n'
+ for key, enum in package.enums.items():
+ yield EnumCSharpGen.generate(enum) + '\n'
+
+ if package.messages:
+ yield ' // Struct definitions\n'
+ # Need to sort messages to make sure dependencies are properly met
+ for key, msg in package.sortedMessages().items():
+ yield MessageCSharpGen.generate(msg)
+ yield '\n'
+
+ # Generate helper class with message definitions
+ if package.messages:
+ yield ' public static class MessageDefinitions\n'
+ yield ' {\n'
+ yield ' public static bool GetMessageLength(int msgId, out int size)\n'
+ yield ' {\n'
+ yield ' switch (msgId)\n'
+ yield ' {\n'
+ for key, msg in package.sortedMessages().items():
+ if msg.id:
+ structName = '%s%s' % (pascalCase(msg.package), msg.name)
+ yield ' case %s.MsgId: size = %s.MaxSize; return true;\n' % (structName, structName)
+ yield ' default: size = 0; return false;\n'
+ yield ' }\n'
+ yield ' }\n'
+ yield ' }\n'
+
+ yield '}\n'
diff --git a/src/struct_frame/frame_parser_csharp_gen.py b/src/struct_frame/frame_parser_csharp_gen.py
new file mode 100644
index 00000000..fa1e6d56
--- /dev/null
+++ b/src/struct_frame/frame_parser_csharp_gen.py
@@ -0,0 +1,371 @@
+#!/usr/bin/env python3
+# kate: replace-tabs on; indent-width 4;
+
+"""
+C# Frame Parser Generator
+
+Generates C# code for frame parsers based on frame format definitions.
+"""
+
+from struct_frame import version
+import time
+
+
+def camel_to_snake(name):
+ """Convert CamelCase to snake_case"""
+ import re
+ name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
+ name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', name)
+ return name.lower()
+
+
+def camel_to_upper_snake(name):
+ """Convert CamelCase to UPPER_SNAKE_CASE"""
+ return camel_to_snake(name).upper()
+
+
+class FrameParserCSharpGen:
+ """Generates C# code for frame parsers"""
+
+ @staticmethod
+ def generate(formats):
+ """Generate the complete frame parser C# file"""
+ yield '// Automatically generated frame parser for C#\n'
+ yield f'// Generated by {version} at {time.asctime()}.\n\n'
+ yield 'using System;\n'
+ yield 'using System.Collections.Generic;\n\n'
+ yield 'namespace StructFrame\n'
+ yield '{\n'
+
+ # Generate frame format enum
+ yield ' /// \n'
+ yield ' /// Frame format type enumeration\n'
+ yield ' /// \n'
+ yield ' public enum FrameFormatType\n'
+ yield ' {\n'
+ for i, fmt in enumerate(formats):
+ enum_name = camel_to_upper_snake(fmt.name)
+ comma = ',' if i < len(formats) - 1 else ''
+ yield f' {enum_name} = {i}{comma}\n'
+ yield ' }\n\n'
+
+ # Generate individual frame format classes
+ for fmt in formats:
+ yield from FrameParserCSharpGen.generate_format(fmt)
+ yield '\n'
+
+ yield '}\n'
+
+ @staticmethod
+ def generate_format(fmt):
+ """Generate C# code for a single frame format"""
+ name = fmt.name
+ class_name = name
+
+ yield f' /// \n'
+ yield f' /// {name} - Frame format parser and encoder\n'
+ yield f' /// \n'
+ yield f' public class {class_name} : FrameFormatBase\n'
+ yield f' {{\n'
+
+ # Generate parser state enum
+ yield f' public enum ParserState\n'
+ yield f' {{\n'
+ state_idx = 0
+ if fmt.start_bytes:
+ for i in range(len(fmt.start_bytes)):
+ state_name = f'LookingForStart{i + 1}' if len(fmt.start_bytes) > 1 else 'LookingForStart'
+ comma = ','
+ yield f' {state_name} = {state_idx}{comma}\n'
+ state_idx += 1
+ yield f' GettingMsgId = {state_idx},\n'
+ state_idx += 1
+ if fmt.has_length:
+ yield f' GettingLength = {state_idx},\n'
+ state_idx += 1
+ yield f' GettingPayload = {state_idx}\n'
+ yield f' }}\n\n'
+
+ # Constants
+ for i, (sb_name, sb_value) in enumerate(fmt.start_bytes):
+ const_name = f'StartByte{i + 1}' if len(fmt.start_bytes) > 1 else 'StartByte'
+ yield f' public const byte {const_name} = 0x{sb_value:02X};\n'
+ yield f' public const int HeaderSize = {fmt.header_size};\n'
+ yield f' public const int FooterSize = {fmt.footer_size};\n'
+ yield f' public const int Overhead = {fmt.header_size + fmt.footer_size};\n'
+ if fmt.has_length:
+ yield f' public const int LengthBytes = {fmt.length_bytes};\n'
+ yield '\n'
+
+ # Instance variables
+ yield f' private ParserState _state;\n'
+ yield f' private List _buffer;\n'
+ yield f' private int _packetSize;\n'
+ yield f' private int _msgId;\n'
+ if fmt.has_length:
+ yield f' private int _msgLength;\n'
+ if fmt.length_bytes == 2:
+ yield f' private int _lengthLo;\n'
+ yield f' private Func _getMsgLength;\n\n'
+
+ # Constructor
+ yield f' /// \n'
+ yield f' /// Initialize the {name} parser\n'
+ yield f' /// \n'
+ yield f' /// Callback function to get message length from msg_id\n'
+ yield f' public {class_name}(Func getMsgLength = null)\n'
+ yield f' {{\n'
+ yield f' _getMsgLength = getMsgLength;\n'
+ yield f' _buffer = new List();\n'
+ yield f' Reset();\n'
+ yield f' }}\n\n'
+
+ # Reset method
+ yield f' /// \n'
+ yield f' /// Reset parser state\n'
+ yield f' /// \n'
+ yield f' public override void Reset()\n'
+ yield f' {{\n'
+ if fmt.start_bytes:
+ state_name = 'LookingForStart1' if len(fmt.start_bytes) > 1 else 'LookingForStart'
+ yield f' _state = ParserState.{state_name};\n'
+ else:
+ yield f' _state = ParserState.GettingMsgId;\n'
+ yield f' _buffer.Clear();\n'
+ yield f' _packetSize = 0;\n'
+ yield f' _msgId = 0;\n'
+ if fmt.has_length:
+ yield f' _msgLength = 0;\n'
+ if fmt.length_bytes == 2:
+ yield f' _lengthLo = 0;\n'
+ yield f' }}\n\n'
+
+ # ParseByte method
+ yield f' /// \n'
+ yield f' /// Parse a single byte\n'
+ yield f' /// \n'
+ yield f' /// The byte to parse\n'
+ yield f' /// FrameParseResult with Valid=true when a complete valid message is received\n'
+ yield f' public override FrameParseResult ParseByte(byte b)\n'
+ yield f' {{\n'
+ yield f' var result = new FrameParseResult();\n\n'
+
+ # State machine
+ yield f' switch (_state)\n'
+ yield f' {{\n'
+
+ if fmt.start_bytes:
+ for i, (sb_name, sb_value) in enumerate(fmt.start_bytes):
+ state_name = f'LookingForStart{i + 1}' if len(fmt.start_bytes) > 1 else 'LookingForStart'
+ const_name = f'StartByte{i + 1}' if len(fmt.start_bytes) > 1 else 'StartByte'
+
+ yield f' case ParserState.{state_name}:\n'
+ yield f' if (b == {const_name})\n'
+ yield f' {{\n'
+
+ if i == 0:
+ yield f' _buffer.Clear();\n'
+ yield f' _buffer.Add(b);\n'
+ else:
+ yield f' _buffer.Add(b);\n'
+
+ if i + 1 < len(fmt.start_bytes):
+ next_state = f'LookingForStart{i + 2}'
+ else:
+ next_state = 'GettingMsgId'
+ yield f' _state = ParserState.{next_state};\n'
+ yield f' }}\n'
+
+ if i > 0:
+ yield f' else if (b == StartByte1)\n'
+ yield f' {{\n'
+ yield f' _buffer.Clear();\n'
+ yield f' _buffer.Add(b);\n'
+ yield f' _state = ParserState.LookingForStart2;\n'
+ yield f' }}\n'
+ yield f' else\n'
+ yield f' {{\n'
+ yield f' _state = ParserState.LookingForStart1;\n'
+ yield f' }}\n'
+ yield f' break;\n\n'
+
+ # GETTING_MSG_ID state
+ yield f' case ParserState.GettingMsgId:\n'
+ yield f' _buffer.Add(b);\n'
+ yield f' _msgId = b;\n'
+
+ if fmt.has_length:
+ yield f' _state = ParserState.GettingLength;\n'
+ else:
+ yield f' if (_getMsgLength != null)\n'
+ yield f' {{\n'
+ yield f' int? msgLength = _getMsgLength(b);\n'
+ yield f' if (msgLength.HasValue)\n'
+ yield f' {{\n'
+ yield f' _packetSize = Overhead + msgLength.Value;\n'
+ yield f' _state = ParserState.GettingPayload;\n'
+ yield f' }}\n'
+ yield f' else\n'
+ yield f' {{\n'
+ reset_state = 'LookingForStart1' if len(fmt.start_bytes) > 1 else ('LookingForStart' if fmt.start_bytes else 'GettingMsgId')
+ yield f' _state = ParserState.{reset_state};\n'
+ yield f' }}\n'
+ yield f' }}\n'
+ yield f' else\n'
+ yield f' {{\n'
+ yield f' _state = ParserState.{reset_state};\n'
+ yield f' }}\n'
+ yield f' break;\n\n'
+
+ # GETTING_LENGTH state (if applicable)
+ if fmt.has_length:
+ yield f' case ParserState.GettingLength:\n'
+ yield f' _buffer.Add(b);\n'
+ if fmt.length_bytes == 1:
+ yield f' _msgLength = b;\n'
+ yield f' _packetSize = Overhead + _msgLength;\n'
+ yield f' _state = ParserState.GettingPayload;\n'
+ else:
+ yield f' if (_buffer.Count == {len(fmt.start_bytes) + 2})\n'
+ yield f' {{\n'
+ yield f' _lengthLo = b;\n'
+ yield f' }}\n'
+ yield f' else\n'
+ yield f' {{\n'
+ yield f' _msgLength = _lengthLo | (b << 8);\n'
+ yield f' _packetSize = Overhead + _msgLength;\n'
+ yield f' _state = ParserState.GettingPayload;\n'
+ yield f' }}\n'
+ yield f' break;\n\n'
+
+ # GETTING_PAYLOAD state
+ yield f' case ParserState.GettingPayload:\n'
+ yield f' _buffer.Add(b);\n'
+ yield f' if (_buffer.Count >= _packetSize)\n'
+ yield f' {{\n'
+ yield f' result = ValidatePacket(_buffer.ToArray(), _buffer.Count);\n'
+ reset_state = 'LookingForStart1' if len(fmt.start_bytes) > 1 else ('LookingForStart' if fmt.start_bytes else 'GettingMsgId')
+ yield f' _state = ParserState.{reset_state};\n'
+ yield f' }}\n'
+ yield f' break;\n'
+
+ yield f' }}\n\n'
+ yield f' return result;\n'
+ yield f' }}\n\n'
+
+ # Encode method
+ yield f' /// \n'
+ yield f' /// Encode a message with {name} format\n'
+ yield f' /// \n'
+ yield f' /// Message ID\n'
+ yield f' /// Message data bytes\n'
+ yield f' /// Encoded frame as byte array\n'
+ yield f' public override byte[] Encode(int msgId, byte[] msgData)\n'
+ yield f' {{\n'
+ yield f' var output = new List();\n'
+
+ # Write start bytes
+ for i, (sb_name, sb_value) in enumerate(fmt.start_bytes):
+ const_name = f'StartByte{i + 1}' if len(fmt.start_bytes) > 1 else 'StartByte'
+ yield f' output.Add({const_name});\n'
+
+ if fmt.has_length and fmt.has_crc:
+ # Default format with length and CRC
+ if fmt.length_bytes == 1:
+ yield f' output.Add((byte)(msgData.Length & 0xFF));\n'
+ else:
+ yield f' output.Add((byte)(msgData.Length & 0xFF));\n'
+ yield f' output.Add((byte)((msgData.Length >> 8) & 0xFF));\n'
+ yield f' output.Add((byte)msgId);\n'
+ yield f' output.AddRange(msgData);\n\n'
+ yield f' // Calculate Fletcher checksum\n'
+ yield f' var ck = FletcherChecksum(output.ToArray(), {len(fmt.start_bytes)}, output.Count);\n'
+ yield f' output.Add(ck.Item1);\n'
+ yield f' output.Add(ck.Item2);\n'
+ elif not fmt.has_length and not fmt.has_crc:
+ # Minimal format
+ yield f' output.Add((byte)msgId);\n'
+ yield f' output.AddRange(msgData);\n'
+ else:
+ # Other formats
+ yield f' output.Add((byte)msgId);\n'
+ if fmt.has_length:
+ if fmt.length_bytes == 1:
+ yield f' output.Add((byte)(msgData.Length & 0xFF));\n'
+ else:
+ yield f' output.Add((byte)(msgData.Length & 0xFF));\n'
+ yield f' output.Add((byte)((msgData.Length >> 8) & 0xFF));\n'
+ yield f' output.AddRange(msgData);\n'
+ if fmt.has_crc:
+ yield f' var ck = FletcherChecksum(output.ToArray(), {len(fmt.start_bytes)}, output.Count);\n'
+ yield f' output.Add(ck.Item1);\n'
+ yield f' output.Add(ck.Item2);\n'
+
+ yield f' return output.ToArray();\n'
+ yield f' }}\n\n'
+
+ # ValidatePacket method
+ yield f' /// \n'
+ yield f' /// Validate a complete {name} packet in a buffer\n'
+ yield f' /// \n'
+ yield f' /// Buffer containing the complete packet\n'
+ yield f' /// Length of the data in the buffer\n'
+ yield f' /// FrameParseResult with Valid=true if packet is valid\n'
+ yield f' public override FrameParseResult ValidatePacket(byte[] data, int length)\n'
+ yield f' {{\n'
+ yield f' var result = new FrameParseResult();\n\n'
+ yield f' if (length < Overhead)\n'
+ yield f' return result;\n\n'
+
+ # Check start bytes
+ for i, (sb_name, sb_value) in enumerate(fmt.start_bytes):
+ const_name = f'StartByte{i + 1}' if len(fmt.start_bytes) > 1 else 'StartByte'
+ yield f' if (data[{i}] != {const_name})\n'
+ yield f' return result;\n'
+
+ yield f'\n'
+
+ if fmt.has_crc:
+ yield f' int msgLength = length - Overhead;\n'
+ yield f' int crcDataLen = msgLength + 1 + LengthBytes;\n'
+ yield f' var ck = FletcherChecksum(data, {len(fmt.start_bytes)}, {len(fmt.start_bytes)} + crcDataLen);\n\n'
+ yield f' if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])\n'
+ yield f' {{\n'
+ yield f' result.Valid = true;\n'
+ yield f' result.MsgId = data[HeaderSize - 1];\n'
+ yield f' result.MsgSize = msgLength;\n'
+ yield f' result.MsgData = new byte[msgLength];\n'
+ yield f' Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);\n'
+ yield f' }}\n'
+ else:
+ yield f' result.Valid = true;\n'
+ yield f' result.MsgId = data[HeaderSize - 1];\n'
+ yield f' result.MsgSize = length - HeaderSize;\n'
+ yield f' result.MsgData = new byte[result.MsgSize];\n'
+ yield f' Array.Copy(data, HeaderSize, result.MsgData, 0, result.MsgSize);\n'
+
+ yield f' return result;\n'
+ yield f' }}\n\n'
+
+ # Fletcher checksum helper
+ yield f' /// \n'
+ yield f' /// Calculate Fletcher-16 checksum\n'
+ yield f' /// \n'
+ yield f' private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)\n'
+ yield f' {{\n'
+ yield f' byte byte1 = 0;\n'
+ yield f' byte byte2 = 0;\n\n'
+ yield f' for (int i = start; i < end; i++)\n'
+ yield f' {{\n'
+ yield f' byte1 = (byte)((byte1 + buffer[i]) % 256);\n'
+ yield f' byte2 = (byte)((byte2 + byte1) % 256);\n'
+ yield f' }}\n\n'
+ yield f' return (byte1, byte2);\n'
+ yield f' }}\n'
+
+ yield f' }}\n'
+
+
+def generate_csharp_frame_parsers(formats):
+ """Generate C# frame parser code from frame format definitions"""
+ return ''.join(FrameParserCSharpGen.generate(formats))
diff --git a/src/struct_frame/generate.py b/src/struct_frame/generate.py
index 111dd93a..180e8b18 100644
--- a/src/struct_frame/generate.py
+++ b/src/struct_frame/generate.py
@@ -10,6 +10,7 @@
from struct_frame import FilePyGen
from struct_frame import FileGqlGen
from struct_frame import FileCppGen
+from struct_frame import FileCSharpGen
from proto_schema_parser.parser import Parser
from proto_schema_parser import ast
from proto_schema_parser.ast import FieldCardinality
@@ -457,12 +458,15 @@ def __str__(self):
parser.add_argument('--build_js', action='store_true')
parser.add_argument('--build_py', action='store_true')
parser.add_argument('--build_cpp', action='store_true')
+parser.add_argument('--build_csharp', action='store_true')
parser.add_argument('--c_path', nargs=1, type=str, default=['generated/c/'])
parser.add_argument('--ts_path', nargs=1, type=str, default=['generated/ts/'])
parser.add_argument('--js_path', nargs=1, type=str, default=['generated/js/'])
parser.add_argument('--py_path', nargs=1, type=str, default=['generated/py/'])
parser.add_argument('--cpp_path', nargs=1, type=str,
default=['generated/cpp/'])
+parser.add_argument('--csharp_path', nargs=1, type=str,
+ default=['generated/csharp/'])
parser.add_argument('--build_gql', action='store_true')
parser.add_argument('--gql_path', nargs=1, type=str,
default=['generated/gql/'])
@@ -572,14 +576,24 @@ def generateCppFileStrings(path):
return out
-def generateFrameParserFiles(frame_formats_file, c_path, ts_path, js_path, py_path, cpp_path,
- build_c, build_ts, build_js, build_py, build_cpp):
+def generateCSharpFileStrings(path):
+ out = {}
+ for key, value in packages.items():
+ name = os.path.join(path, value.name + ".sf.cs")
+ data = ''.join(FileCSharpGen.generate(value))
+ out[name] = data
+ return out
+
+
+def generateFrameParserFiles(frame_formats_file, c_path, ts_path, js_path, py_path, cpp_path, csharp_path,
+ build_c, build_ts, build_js, build_py, build_cpp, build_csharp):
"""Generate frame parser files from frame format definitions"""
from struct_frame.frame_format import parse_frame_formats
from struct_frame.frame_parser_c_gen import generate_c_frame_parsers
from struct_frame.frame_parser_py_gen import generate_py_frame_parsers
from struct_frame.frame_parser_ts_gen import generate_ts_frame_parsers, generate_js_frame_parsers
from struct_frame.frame_parser_cpp_gen import generate_cpp_frame_parsers
+ from struct_frame.frame_parser_csharp_gen import generate_csharp_frame_parsers
formats = parse_frame_formats(frame_formats_file)
files = {}
@@ -604,6 +618,10 @@ def generateFrameParserFiles(frame_formats_file, c_path, ts_path, js_path, py_pa
name = os.path.join(cpp_path, "frame_parsers_gen.hpp")
files[name] = generate_cpp_frame_parsers(formats)
+ if build_csharp:
+ name = os.path.join(csharp_path, "FrameParsersGen.cs")
+ files[name] = generate_csharp_frame_parsers(formats)
+
return files
@@ -660,7 +678,7 @@ def main():
# If validate mode is specified, skip build argument check and file generation
if args.validate:
print("Running in validate mode - no files will be generated")
- elif (not args.build_c and not args.build_ts and not args.build_js and not args.build_py and not args.build_cpp and not args.build_gql):
+ elif (not args.build_c and not args.build_ts and not args.build_js and not args.build_py and not args.build_cpp and not args.build_csharp and not args.build_gql):
print("Select at least one build argument")
return
@@ -700,6 +718,9 @@ def main():
if (args.build_cpp):
files.update(generateCppFileStrings(args.cpp_path[0]))
+ if (args.build_csharp):
+ files.update(generateCSharpFileStrings(args.csharp_path[0]))
+
if (args.build_gql):
for key, value in packages.items():
name = os.path.join(args.gql_path[0], value.name + '.graphql')
@@ -711,9 +732,9 @@ def main():
frame_parser_files = generateFrameParserFiles(
args.frame_formats[0],
args.c_path[0], args.ts_path[0], args.js_path[0],
- args.py_path[0], args.cpp_path[0],
+ args.py_path[0], args.cpp_path[0], args.csharp_path[0],
args.build_c, args.build_ts, args.build_js,
- args.build_py, args.build_cpp
+ args.build_py, args.build_cpp, args.build_csharp
)
files.update(frame_parser_files)
@@ -738,7 +759,8 @@ def main():
'cpp': ['frame_base.hpp'],
'ts': ['struct_base.ts', 'struct_frame.ts', 'struct_frame_types.ts', 'frame_base.ts'],
'js': ['struct_base.js', 'struct_frame.js', 'struct_frame_types.js', 'frame_base.js'],
- 'py': [] # __init__.py will be generated with the custom frame formats
+ 'py': [], # __init__.py will be generated with the custom frame formats
+ 'csharp': ['FrameBase.cs']
}
def copy_files_list(src_dir, dst_dir, files_to_copy):
@@ -789,6 +811,11 @@ def copy_all_files(src_dir, dst_dir):
copy_files_list(
os.path.join(dir_path, "boilerplate/cpp"),
args.cpp_path[0], utility_files['cpp'])
+
+ if args.build_csharp:
+ copy_files_list(
+ os.path.join(dir_path, "boilerplate/csharp"),
+ args.csharp_path[0], utility_files['csharp'])
else:
# Copy all boilerplate files (multi-file structure)
if (args.build_c):
@@ -816,6 +843,11 @@ def copy_all_files(src_dir, dst_dir):
os.path.join(dir_path, "boilerplate/cpp"),
args.cpp_path[0])
+ if (args.build_csharp):
+ copy_all_files(
+ os.path.join(dir_path, "boilerplate/csharp"),
+ args.csharp_path[0])
+
# No boilerplate for GraphQL currently
if args.debug:
diff --git a/tests/csharp/test_arrays.cs b/tests/csharp/test_arrays.cs
new file mode 100644
index 00000000..63260808
--- /dev/null
+++ b/tests/csharp/test_arrays.cs
@@ -0,0 +1,204 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace StructFrameTests
+{
+ class TestArrays
+ {
+ static void PrintFailureDetails(string label, string expected = null, string actual = null)
+ {
+ Console.WriteLine();
+ Console.WriteLine("============================================================");
+ Console.WriteLine($"FAILURE DETAILS: {label}");
+ Console.WriteLine("============================================================");
+
+ if (expected != null)
+ {
+ Console.WriteLine($"\nExpected: {expected}");
+ }
+ if (actual != null)
+ {
+ Console.WriteLine($"Actual: {actual}");
+ }
+
+ Console.WriteLine("============================================================");
+ Console.WriteLine();
+ }
+
+ static bool TestArrayOperations()
+ {
+ try
+ {
+ // Create a new message instance
+ var msg = new StructFrame.ComprehensiveArrays.ComprehensiveArraysComprehensiveArrayMessage();
+
+ // Initialize arrays
+ msg.FixedInts = new int[3];
+ msg.FixedFloats = new float[2];
+ msg.FixedBools = new bool[4];
+
+ // Set fixed array values
+ msg.FixedInts[0] = 1;
+ msg.FixedInts[1] = 2;
+ msg.FixedInts[2] = 3;
+
+ msg.FixedFloats[0] = 1.1f;
+ msg.FixedFloats[1] = 2.2f;
+
+ msg.FixedBools[0] = true;
+ msg.FixedBools[1] = false;
+ msg.FixedBools[2] = true;
+ msg.FixedBools[3] = false;
+
+ // Set bounded array values
+ msg.BoundedUintsCount = 3;
+ msg.BoundedUintsData = new ushort[3];
+ msg.BoundedUintsData[0] = 100;
+ msg.BoundedUintsData[1] = 200;
+ msg.BoundedUintsData[2] = 300;
+
+ msg.BoundedDoublesCount = 2;
+ msg.BoundedDoublesData = new double[2];
+ msg.BoundedDoublesData[0] = 1.5;
+ msg.BoundedDoublesData[1] = 2.5;
+
+ // Initialize string arrays as byte arrays
+ msg.FixedStrings = new byte[2 * 8]; // 2 strings * 8 chars
+ var str1 = System.Text.Encoding.ASCII.GetBytes("Hello");
+ var str2 = System.Text.Encoding.ASCII.GetBytes("World");
+ Array.Copy(str1, 0, msg.FixedStrings, 0, Math.Min(str1.Length, 8));
+ Array.Copy(str2, 0, msg.FixedStrings, 8, Math.Min(str2.Length, 8));
+
+ msg.BoundedStringsCount = 2;
+ msg.BoundedStringsData = new byte[2 * 12]; // 2 strings * 12 chars
+ var bstr1 = System.Text.Encoding.ASCII.GetBytes("Test1");
+ var bstr2 = System.Text.Encoding.ASCII.GetBytes("Test2");
+ Array.Copy(bstr1, 0, msg.BoundedStringsData, 0, Math.Min(bstr1.Length, 12));
+ Array.Copy(bstr2, 0, msg.BoundedStringsData, 12, Math.Min(bstr2.Length, 12));
+
+ // Initialize enum arrays
+ msg.FixedStatuses = new byte[2];
+ msg.FixedStatuses[0] = (byte)StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.ACTIVE;
+ msg.FixedStatuses[1] = (byte)StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.INACTIVE;
+
+ msg.BoundedStatusesCount = 2;
+ msg.BoundedStatusesData = new byte[2];
+ msg.BoundedStatusesData[0] = (byte)StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.ERROR;
+ msg.BoundedStatusesData[1] = (byte)StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.MAINTENANCE;
+
+ // Initialize nested message arrays
+ msg.FixedSensors = new StructFrame.ComprehensiveArrays.ComprehensiveArraysSensor[1];
+ msg.FixedSensors[0] = new StructFrame.ComprehensiveArrays.ComprehensiveArraysSensor();
+ msg.FixedSensors[0].Id = 1;
+ msg.FixedSensors[0].Value = 25.5f;
+ msg.FixedSensors[0].Status = StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.ACTIVE;
+ msg.FixedSensors[0].Name = new byte[16];
+ var sensorName = System.Text.Encoding.ASCII.GetBytes("Sensor1");
+ Array.Copy(sensorName, msg.FixedSensors[0].Name, Math.Min(sensorName.Length, 16));
+
+ msg.BoundedSensorsCount = 1;
+ msg.BoundedSensorsData = new StructFrame.ComprehensiveArrays.ComprehensiveArraysSensor[1];
+ msg.BoundedSensorsData[0] = new StructFrame.ComprehensiveArrays.ComprehensiveArraysSensor();
+ msg.BoundedSensorsData[0].Id = 2;
+ msg.BoundedSensorsData[0].Value = 30.0f;
+ msg.BoundedSensorsData[0].Status = StructFrame.ComprehensiveArrays.ComprehensiveArraysStatus.MAINTENANCE;
+ msg.BoundedSensorsData[0].Name = new byte[16];
+ var sensorName2 = System.Text.Encoding.ASCII.GetBytes("Sensor2");
+ Array.Copy(sensorName2, msg.BoundedSensorsData[0].Name, Math.Min(sensorName2.Length, 16));
+
+ // Verify struct size matches expected
+ int size = Marshal.SizeOf(typeof(StructFrame.ComprehensiveArrays.ComprehensiveArraysComprehensiveArrayMessage));
+ if (size != StructFrame.ComprehensiveArrays.ComprehensiveArraysComprehensiveArrayMessage.MaxSize)
+ {
+ PrintFailureDetails("Struct size mismatch",
+ StructFrame.ComprehensiveArrays.ComprehensiveArraysComprehensiveArrayMessage.MaxSize.ToString(),
+ size.ToString());
+ return false;
+ }
+
+ // Serialize to bytes
+ byte[] buffer = new byte[size];
+ IntPtr ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.StructureToPtr(msg, ptr, false);
+ Marshal.Copy(ptr, buffer, 0, size);
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+
+ // Deserialize back and verify
+ ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.Copy(buffer, 0, ptr, size);
+ var decoded = Marshal.PtrToStructure(ptr);
+
+ // Verify fixed int array
+ if (decoded.FixedInts[0] != 1 || decoded.FixedInts[1] != 2 || decoded.FixedInts[2] != 3)
+ {
+ PrintFailureDetails("FixedInts mismatch",
+ "1, 2, 3",
+ $"{decoded.FixedInts[0]}, {decoded.FixedInts[1]}, {decoded.FixedInts[2]}");
+ return false;
+ }
+
+ // Verify fixed float array
+ if (Math.Abs(decoded.FixedFloats[0] - 1.1f) > 0.01f ||
+ Math.Abs(decoded.FixedFloats[1] - 2.2f) > 0.01f)
+ {
+ PrintFailureDetails("FixedFloats mismatch",
+ "1.1, 2.2",
+ $"{decoded.FixedFloats[0]}, {decoded.FixedFloats[1]}");
+ return false;
+ }
+
+ // Verify bounded uint count
+ if (decoded.BoundedUintsCount != 3)
+ {
+ PrintFailureDetails("BoundedUintsCount mismatch",
+ "3", decoded.BoundedUintsCount.ToString());
+ return false;
+ }
+
+ // Verify bounded uint values
+ if (decoded.BoundedUintsData[0] != 100 ||
+ decoded.BoundedUintsData[1] != 200 ||
+ decoded.BoundedUintsData[2] != 300)
+ {
+ PrintFailureDetails("BoundedUintsData mismatch",
+ "100, 200, 300",
+ $"{decoded.BoundedUintsData[0]}, {decoded.BoundedUintsData[1]}, {decoded.BoundedUintsData[2]}");
+ return false;
+ }
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+
+ return true;
+ }
+ catch (Exception e)
+ {
+ PrintFailureDetails($"Exception: {e.GetType().Name}", "success", e.Message);
+ Console.WriteLine(e.StackTrace);
+ return false;
+ }
+ }
+
+ static int Main(string[] args)
+ {
+ Console.WriteLine("\n[TEST START] C# Array Operations");
+
+ bool success = TestArrayOperations();
+
+ string status = success ? "PASS" : "FAIL";
+ Console.WriteLine($"[TEST END] C# Array Operations: {status}\n");
+
+ return success ? 0 : 1;
+ }
+ }
+}
diff --git a/tests/csharp/test_basic_types.cs b/tests/csharp/test_basic_types.cs
new file mode 100644
index 00000000..0b4cb35f
--- /dev/null
+++ b/tests/csharp/test_basic_types.cs
@@ -0,0 +1,150 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace StructFrameTests
+{
+ class TestBasicTypes
+ {
+ static void PrintFailureDetails(string label, string expected = null, string actual = null)
+ {
+ Console.WriteLine();
+ Console.WriteLine("============================================================");
+ Console.WriteLine($"FAILURE DETAILS: {label}");
+ Console.WriteLine("============================================================");
+
+ if (expected != null)
+ {
+ Console.WriteLine($"\nExpected: {expected}");
+ }
+ if (actual != null)
+ {
+ Console.WriteLine($"Actual: {actual}");
+ }
+
+ Console.WriteLine("============================================================");
+ Console.WriteLine();
+ }
+
+ static bool TestBasicTypesMessage()
+ {
+ try
+ {
+ // Create a new message instance
+ var msg = new StructFrame.BasicTypes.BasicTypesBasicTypesMessage();
+
+ // Set values
+ msg.SmallInt = -42;
+ msg.MediumInt = -1000;
+ msg.RegularInt = -100000;
+ msg.LargeInt = -1000000000L;
+ msg.SmallUint = 255;
+ msg.MediumUint = 65535;
+ msg.RegularUint = 4294967295U;
+ msg.LargeUint = 18446744073709551615UL;
+ msg.SinglePrecision = 3.14159f;
+ msg.DoublePrecision = 2.718281828459045;
+ msg.Flag = true;
+ msg.DeviceId = new byte[32];
+ msg.DescriptionLength = 12;
+ msg.DescriptionData = new byte[128];
+
+ // Fill device id
+ var deviceIdBytes = System.Text.Encoding.ASCII.GetBytes("TEST_DEVICE_001");
+ Array.Copy(deviceIdBytes, msg.DeviceId, Math.Min(deviceIdBytes.Length, 32));
+
+ // Fill description
+ var descBytes = System.Text.Encoding.ASCII.GetBytes("Test message");
+ Array.Copy(descBytes, msg.DescriptionData, Math.Min(descBytes.Length, 128));
+
+ // Serialize to bytes using Marshal
+ int size = Marshal.SizeOf(typeof(StructFrame.BasicTypes.BasicTypesBasicTypesMessage));
+ if (size != StructFrame.BasicTypes.BasicTypesBasicTypesMessage.MaxSize)
+ {
+ PrintFailureDetails("Struct size mismatch",
+ StructFrame.BasicTypes.BasicTypesBasicTypesMessage.MaxSize.ToString(),
+ size.ToString());
+ return false;
+ }
+
+ byte[] buffer = new byte[size];
+ IntPtr ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.StructureToPtr(msg, ptr, false);
+ Marshal.Copy(ptr, buffer, 0, size);
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+
+ // Deserialize back
+ ptr = Marshal.AllocHGlobal(size);
+ try
+ {
+ Marshal.Copy(buffer, 0, ptr, size);
+ var decoded = Marshal.PtrToStructure(ptr);
+
+ // Verify values
+ if (decoded.SmallInt != msg.SmallInt)
+ {
+ PrintFailureDetails("SmallInt mismatch",
+ msg.SmallInt.ToString(), decoded.SmallInt.ToString());
+ return false;
+ }
+
+ if (decoded.MediumInt != msg.MediumInt)
+ {
+ PrintFailureDetails("MediumInt mismatch",
+ msg.MediumInt.ToString(), decoded.MediumInt.ToString());
+ return false;
+ }
+
+ if (decoded.RegularInt != msg.RegularInt)
+ {
+ PrintFailureDetails("RegularInt mismatch",
+ msg.RegularInt.ToString(), decoded.RegularInt.ToString());
+ return false;
+ }
+
+ if (decoded.Flag != msg.Flag)
+ {
+ PrintFailureDetails("Flag mismatch",
+ msg.Flag.ToString(), decoded.Flag.ToString());
+ return false;
+ }
+
+ if (Math.Abs(decoded.SinglePrecision - msg.SinglePrecision) > 0.0001f)
+ {
+ PrintFailureDetails("SinglePrecision mismatch",
+ msg.SinglePrecision.ToString(), decoded.SinglePrecision.ToString());
+ return false;
+ }
+ }
+ finally
+ {
+ Marshal.FreeHGlobal(ptr);
+ }
+
+ return true;
+ }
+ catch (Exception e)
+ {
+ PrintFailureDetails($"Exception: {e.GetType().Name}", "success", e.Message);
+ return false;
+ }
+ }
+
+ static int Main(string[] args)
+ {
+ Console.WriteLine("\n[TEST START] C# Basic Types");
+
+ bool success = TestBasicTypesMessage();
+
+ string status = success ? "PASS" : "FAIL";
+ Console.WriteLine($"[TEST END] C# Basic Types: {status}\n");
+
+ return success ? 0 : 1;
+ }
+ }
+}
diff --git a/tests/test_config.json b/tests/test_config.json
index 3f26cbab..4c4b3149 100644
--- a/tests/test_config.json
+++ b/tests/test_config.json
@@ -132,6 +132,26 @@
"enabled": false
},
"generation_only": true
+ },
+
+ "csharp": {
+ "name": "C#",
+ "enabled": true,
+ "code_generation": {
+ "flag": "--build_csharp",
+ "output_path_flag": "--csharp_path",
+ "output_dir": "tests/generated/csharp"
+ },
+ "compilation": {
+ "enabled": true,
+ "compiler": "csc",
+ "compiler_check": "csc --version 2>&1 || mcs --version 2>&1 || dotnet --version 2>&1",
+ "flags": ["-out:{output}", "{source}", "{generated_dir}/*.cs"],
+ "source_extension": ".cs",
+ "executable_extension": ".exe"
+ },
+ "test_dir": "tests/csharp",
+ "build_dir": "tests/csharp/build"
}
},
From 8680ebef8f42c183f451995e4814606c58a2a781 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 00:24:09 +0000
Subject: [PATCH 3/6] Finalize C# language support - mark as generation_only
and add project file
Co-authored-by: rijesha <7819200+rijesha@users.noreply.github.com>
---
tests/csharp/StructFrameTests.csproj | 9 ++
.../StructFrameTests.csproj.nuget.dgspec.json | 81 +++++++++++++++++
.../obj/StructFrameTests.csproj.nuget.g.props | 15 ++++
.../StructFrameTests.csproj.nuget.g.targets | 2 +
tests/csharp/obj/project.assets.json | 86 +++++++++++++++++++
tests/csharp/obj/project.nuget.cache | 12 +++
tests/test_config.json | 13 +--
7 files changed, 212 insertions(+), 6 deletions(-)
create mode 100644 tests/csharp/StructFrameTests.csproj
create mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
create mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
create mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
create mode 100644 tests/csharp/obj/project.assets.json
create mode 100644 tests/csharp/obj/project.nuget.cache
diff --git a/tests/csharp/StructFrameTests.csproj b/tests/csharp/StructFrameTests.csproj
new file mode 100644
index 00000000..87f3a726
--- /dev/null
+++ b/tests/csharp/StructFrameTests.csproj
@@ -0,0 +1,9 @@
+
+
+ net8.0
+ Exe
+ disable
+ disable
+ true
+
+
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json b/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
new file mode 100644
index 00000000..c69e424d
--- /dev/null
+++ b/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
@@ -0,0 +1,81 @@
+{
+ "format": 1,
+ "restore": {
+ "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj": {}
+ },
+ "projects": {
+ "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
+ "projectName": "StructFrameTests",
+ "projectPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
+ "packagesPath": "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages",
+ "outputPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/obj/",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "/home/runner/.nuget/NuGet/NuGet.Config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "10.0.100"
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "downloadDependencies": [
+ {
+ "name": "Microsoft.AspNetCore.App.Ref",
+ "version": "[8.0.22, 8.0.22]"
+ },
+ {
+ "name": "Microsoft.NETCore.App.Host.linux-x64",
+ "version": "[8.0.22, 8.0.22]"
+ },
+ {
+ "name": "Microsoft.NETCore.App.Ref",
+ "version": "[8.0.22, 8.0.22]"
+ }
+ ],
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
new file mode 100644
index 00000000..8bcdd199
--- /dev/null
+++ b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
@@ -0,0 +1,15 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ /home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages
+ /home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages
+ PackageReference
+ 7.0.0
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
new file mode 100644
index 00000000..3dc06ef3
--- /dev/null
+++ b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/tests/csharp/obj/project.assets.json b/tests/csharp/obj/project.assets.json
new file mode 100644
index 00000000..5926dff1
--- /dev/null
+++ b/tests/csharp/obj/project.assets.json
@@ -0,0 +1,86 @@
+{
+ "version": 3,
+ "targets": {
+ "net8.0": {}
+ },
+ "libraries": {},
+ "projectFileDependencyGroups": {
+ "net8.0": []
+ },
+ "packageFolders": {
+ "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages": {}
+ },
+ "project": {
+ "version": "1.0.0",
+ "restore": {
+ "projectUniqueName": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
+ "projectName": "StructFrameTests",
+ "projectPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
+ "packagesPath": "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages",
+ "outputPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/obj/",
+ "projectStyle": "PackageReference",
+ "configFilePaths": [
+ "/home/runner/.nuget/NuGet/NuGet.Config"
+ ],
+ "originalTargetFrameworks": [
+ "net8.0"
+ ],
+ "sources": {
+ "https://api.nuget.org/v3/index.json": {}
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "projectReferences": {}
+ }
+ },
+ "warningProperties": {
+ "warnAsError": [
+ "NU1605"
+ ]
+ },
+ "restoreAuditProperties": {
+ "enableAudit": "true",
+ "auditLevel": "low",
+ "auditMode": "direct"
+ },
+ "SdkAnalysisLevel": "10.0.100"
+ },
+ "frameworks": {
+ "net8.0": {
+ "targetAlias": "net8.0",
+ "imports": [
+ "net461",
+ "net462",
+ "net47",
+ "net471",
+ "net472",
+ "net48",
+ "net481"
+ ],
+ "assetTargetFallback": true,
+ "warn": true,
+ "downloadDependencies": [
+ {
+ "name": "Microsoft.AspNetCore.App.Ref",
+ "version": "[8.0.22, 8.0.22]"
+ },
+ {
+ "name": "Microsoft.NETCore.App.Host.linux-x64",
+ "version": "[8.0.22, 8.0.22]"
+ },
+ {
+ "name": "Microsoft.NETCore.App.Ref",
+ "version": "[8.0.22, 8.0.22]"
+ }
+ ],
+ "frameworkReferences": {
+ "Microsoft.NETCore.App": {
+ "privateAssets": "all"
+ }
+ },
+ "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.100/PortableRuntimeIdentifierGraph.json"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/csharp/obj/project.nuget.cache b/tests/csharp/obj/project.nuget.cache
new file mode 100644
index 00000000..7920a096
--- /dev/null
+++ b/tests/csharp/obj/project.nuget.cache
@@ -0,0 +1,12 @@
+{
+ "version": 2,
+ "dgSpecHash": "CQ0l+5sEQkk=",
+ "success": true,
+ "projectFilePath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
+ "expectedPackageFiles": [
+ "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.netcore.app.ref/8.0.22/microsoft.netcore.app.ref.8.0.22.nupkg.sha512",
+ "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.aspnetcore.app.ref/8.0.22/microsoft.aspnetcore.app.ref.8.0.22.nupkg.sha512",
+ "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.netcore.app.host.linux-x64/8.0.22/microsoft.netcore.app.host.linux-x64.8.0.22.nupkg.sha512"
+ ],
+ "logs": []
+}
\ No newline at end of file
diff --git a/tests/test_config.json b/tests/test_config.json
index 4c4b3149..077a4a1f 100644
--- a/tests/test_config.json
+++ b/tests/test_config.json
@@ -143,15 +143,16 @@
"output_dir": "tests/generated/csharp"
},
"compilation": {
- "enabled": true,
- "compiler": "csc",
- "compiler_check": "csc --version 2>&1 || mcs --version 2>&1 || dotnet --version 2>&1",
- "flags": ["-out:{output}", "{source}", "{generated_dir}/*.cs"],
+ "enabled": false
+ },
+ "execution": {
+ "interpreter": "dotnet",
"source_extension": ".cs",
- "executable_extension": ".exe"
+ "run_command": "dotnet run --project {test_dir}/StructFrameTests.csproj --no-build --verbosity quiet -- {test_name}"
},
"test_dir": "tests/csharp",
- "build_dir": "tests/csharp/build"
+ "build_dir": "tests/csharp/build",
+ "generation_only": true
}
},
From 2b3dbe12d403d9c62f0697382e19c26067bfc806 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 00:24:56 +0000
Subject: [PATCH 4/6] Add .NET build artifacts to .gitignore and remove
accidentally committed obj directory
Co-authored-by: rijesha <7819200+rijesha@users.noreply.github.com>
---
.gitignore | 6 ++
.../StructFrameTests.csproj.nuget.dgspec.json | 81 -----------------
.../obj/StructFrameTests.csproj.nuget.g.props | 15 ----
.../StructFrameTests.csproj.nuget.g.targets | 2 -
tests/csharp/obj/project.assets.json | 86 -------------------
tests/csharp/obj/project.nuget.cache | 12 ---
6 files changed, 6 insertions(+), 196 deletions(-)
delete mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
delete mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
delete mode 100644 tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
delete mode 100644 tests/csharp/obj/project.assets.json
delete mode 100644 tests/csharp/obj/project.nuget.cache
diff --git a/.gitignore b/.gitignore
index f09498d5..a6f4ab69 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,12 @@ main.exe
dist/
__pycache__/
+# .NET/C# build outputs
+bin/
+obj/
+*.dll
+*.exe
+
# Generated code directories
generated/
gen/
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json b/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
deleted file mode 100644
index c69e424d..00000000
--- a/tests/csharp/obj/StructFrameTests.csproj.nuget.dgspec.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "format": 1,
- "restore": {
- "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj": {}
- },
- "projects": {
- "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj": {
- "version": "1.0.0",
- "restore": {
- "projectUniqueName": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
- "projectName": "StructFrameTests",
- "projectPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
- "packagesPath": "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages",
- "outputPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/obj/",
- "projectStyle": "PackageReference",
- "configFilePaths": [
- "/home/runner/.nuget/NuGet/NuGet.Config"
- ],
- "originalTargetFrameworks": [
- "net8.0"
- ],
- "sources": {
- "https://api.nuget.org/v3/index.json": {}
- },
- "frameworks": {
- "net8.0": {
- "targetAlias": "net8.0",
- "projectReferences": {}
- }
- },
- "warningProperties": {
- "warnAsError": [
- "NU1605"
- ]
- },
- "restoreAuditProperties": {
- "enableAudit": "true",
- "auditLevel": "low",
- "auditMode": "direct"
- },
- "SdkAnalysisLevel": "10.0.100"
- },
- "frameworks": {
- "net8.0": {
- "targetAlias": "net8.0",
- "imports": [
- "net461",
- "net462",
- "net47",
- "net471",
- "net472",
- "net48",
- "net481"
- ],
- "assetTargetFallback": true,
- "warn": true,
- "downloadDependencies": [
- {
- "name": "Microsoft.AspNetCore.App.Ref",
- "version": "[8.0.22, 8.0.22]"
- },
- {
- "name": "Microsoft.NETCore.App.Host.linux-x64",
- "version": "[8.0.22, 8.0.22]"
- },
- {
- "name": "Microsoft.NETCore.App.Ref",
- "version": "[8.0.22, 8.0.22]"
- }
- ],
- "frameworkReferences": {
- "Microsoft.NETCore.App": {
- "privateAssets": "all"
- }
- },
- "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.100/PortableRuntimeIdentifierGraph.json"
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
deleted file mode 100644
index 8bcdd199..00000000
--- a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.props
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
- True
- NuGet
- $(MSBuildThisFileDirectory)project.assets.json
- /home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages
- /home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages
- PackageReference
- 7.0.0
-
-
-
-
-
\ No newline at end of file
diff --git a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets b/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
deleted file mode 100644
index 3dc06ef3..00000000
--- a/tests/csharp/obj/StructFrameTests.csproj.nuget.g.targets
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/tests/csharp/obj/project.assets.json b/tests/csharp/obj/project.assets.json
deleted file mode 100644
index 5926dff1..00000000
--- a/tests/csharp/obj/project.assets.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
- "version": 3,
- "targets": {
- "net8.0": {}
- },
- "libraries": {},
- "projectFileDependencyGroups": {
- "net8.0": []
- },
- "packageFolders": {
- "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages": {}
- },
- "project": {
- "version": "1.0.0",
- "restore": {
- "projectUniqueName": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
- "projectName": "StructFrameTests",
- "projectPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
- "packagesPath": "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages",
- "outputPath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/obj/",
- "projectStyle": "PackageReference",
- "configFilePaths": [
- "/home/runner/.nuget/NuGet/NuGet.Config"
- ],
- "originalTargetFrameworks": [
- "net8.0"
- ],
- "sources": {
- "https://api.nuget.org/v3/index.json": {}
- },
- "frameworks": {
- "net8.0": {
- "targetAlias": "net8.0",
- "projectReferences": {}
- }
- },
- "warningProperties": {
- "warnAsError": [
- "NU1605"
- ]
- },
- "restoreAuditProperties": {
- "enableAudit": "true",
- "auditLevel": "low",
- "auditMode": "direct"
- },
- "SdkAnalysisLevel": "10.0.100"
- },
- "frameworks": {
- "net8.0": {
- "targetAlias": "net8.0",
- "imports": [
- "net461",
- "net462",
- "net47",
- "net471",
- "net472",
- "net48",
- "net481"
- ],
- "assetTargetFallback": true,
- "warn": true,
- "downloadDependencies": [
- {
- "name": "Microsoft.AspNetCore.App.Ref",
- "version": "[8.0.22, 8.0.22]"
- },
- {
- "name": "Microsoft.NETCore.App.Host.linux-x64",
- "version": "[8.0.22, 8.0.22]"
- },
- {
- "name": "Microsoft.NETCore.App.Ref",
- "version": "[8.0.22, 8.0.22]"
- }
- ],
- "frameworkReferences": {
- "Microsoft.NETCore.App": {
- "privateAssets": "all"
- }
- },
- "runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/10.0.100/PortableRuntimeIdentifierGraph.json"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/tests/csharp/obj/project.nuget.cache b/tests/csharp/obj/project.nuget.cache
deleted file mode 100644
index 7920a096..00000000
--- a/tests/csharp/obj/project.nuget.cache
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "version": 2,
- "dgSpecHash": "CQ0l+5sEQkk=",
- "success": true,
- "projectFilePath": "/home/runner/work/struct-frame/struct-frame/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/_codeql_detected_source_root/tests/csharp/StructFrameTests.csproj",
- "expectedPackageFiles": [
- "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.netcore.app.ref/8.0.22/microsoft.netcore.app.ref.8.0.22.nupkg.sha512",
- "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.aspnetcore.app.ref/8.0.22/microsoft.aspnetcore.app.ref.8.0.22.nupkg.sha512",
- "/home/runner/work/struct-frame/.codeql-scratch/dbs/csharp/working/packages/microsoft.netcore.app.host.linux-x64/8.0.22/microsoft.netcore.app.host.linux-x64.8.0.22.nupkg.sha512"
- ],
- "logs": []
-}
\ No newline at end of file
From f3a0120cd7b112fbeba79aacee72d7bd8fb71e97 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 01:12:37 +0000
Subject: [PATCH 5/6] Add C# frame parser boilerplate generation
Co-authored-by: rijesha <7819200+rijesha@users.noreply.github.com>
---
.../boilerplate/c/basic_default.h | 2 +-
.../boilerplate/c/basic_extended.h | 2 +-
.../boilerplate/c/basic_extended_length.h | 2 +-
.../boilerplate/c/basic_extended_msg_ids.h | 2 +-
.../c/basic_extended_multi_system_stream.h | 2 +-
.../boilerplate/c/basic_minimal.h | 2 +-
.../boilerplate/c/basic_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/basic_seq.h | 2 +-
.../boilerplate/c/basic_sys_comp.h | 2 +-
src/struct_frame/boilerplate/c/frame_base.h | 2 +-
.../boilerplate/c/frame_format_config.h | 2 +-
.../boilerplate/c/frame_parsers.h | 2 +-
.../boilerplate/c/mavlink_v1_frame.h | 2 +-
.../boilerplate/c/mavlink_v2_frame.h | 2 +-
src/struct_frame/boilerplate/c/tiny_default.h | 2 +-
.../boilerplate/c/tiny_extended.h | 2 +-
.../boilerplate/c/tiny_extended_length.h | 2 +-
.../boilerplate/c/tiny_extended_msg_ids.h | 2 +-
.../c/tiny_extended_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/tiny_minimal.h | 2 +-
.../boilerplate/c/tiny_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/tiny_seq.h | 2 +-
.../boilerplate/c/tiny_sys_comp.h | 2 +-
src/struct_frame/boilerplate/c/ubx_frame.h | 2 +-
.../boilerplate/cpp/BasicDefault.hpp | 2 +-
.../boilerplate/cpp/BasicExtended.hpp | 2 +-
.../boilerplate/cpp/BasicExtendedLength.hpp | 2 +-
.../boilerplate/cpp/BasicExtendedMsgIds.hpp | 2 +-
.../cpp/BasicExtendedMultiSystemStream.hpp | 2 +-
.../boilerplate/cpp/BasicMinimal.hpp | 2 +-
.../cpp/BasicMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicSeq.hpp | 2 +-
.../boilerplate/cpp/BasicSysComp.hpp | 2 +-
.../boilerplate/cpp/FrameFormatConfig.hpp | 2 +-
.../boilerplate/cpp/MavlinkV1Frame.hpp | 2 +-
.../boilerplate/cpp/MavlinkV2Frame.hpp | 2 +-
.../boilerplate/cpp/TinyDefault.hpp | 2 +-
.../boilerplate/cpp/TinyExtended.hpp | 2 +-
.../boilerplate/cpp/TinyExtendedLength.hpp | 2 +-
.../boilerplate/cpp/TinyExtendedMsgIds.hpp | 2 +-
.../cpp/TinyExtendedMultiSystemStream.hpp | 2 +-
.../boilerplate/cpp/TinyMinimal.hpp | 2 +-
.../boilerplate/cpp/TinyMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinySeq.hpp | 2 +-
.../boilerplate/cpp/TinySysComp.hpp | 2 +-
src/struct_frame/boilerplate/cpp/UbxFrame.hpp | 2 +-
.../boilerplate/cpp/frame_base.hpp | 2 +-
.../boilerplate/cpp/frame_parsers.hpp | 2 +-
.../boilerplate/csharp/BasicDefault.cs | 196 +++++++++++++++++
.../boilerplate/csharp/BasicExtended.cs | 206 ++++++++++++++++++
.../boilerplate/csharp/BasicExtendedLength.cs | 206 ++++++++++++++++++
.../boilerplate/csharp/BasicExtendedMsgIds.cs | 196 +++++++++++++++++
.../csharp/BasicExtendedMultiSystemStream.cs | 206 ++++++++++++++++++
.../boilerplate/csharp/BasicMinimal.cs | 188 ++++++++++++++++
.../csharp/BasicMultiSystemStream.cs | 196 +++++++++++++++++
.../boilerplate/csharp/BasicSeq.cs | 196 +++++++++++++++++
.../boilerplate/csharp/BasicSysComp.cs | 196 +++++++++++++++++
.../boilerplate/csharp/FrameBase.cs | 1 +
.../boilerplate/csharp/FrameFormatConfig.cs | 198 +++++++++++++++++
.../boilerplate/csharp/FrameParsers.cs | 34 +++
.../boilerplate/csharp/MavlinkV1Frame.cs | 173 +++++++++++++++
.../boilerplate/csharp/MavlinkV2Frame.cs | 173 +++++++++++++++
.../boilerplate/csharp/TinyDefault.cs | 173 +++++++++++++++
.../boilerplate/csharp/TinyExtended.cs | 183 ++++++++++++++++
.../boilerplate/csharp/TinyExtendedLength.cs | 183 ++++++++++++++++
.../boilerplate/csharp/TinyExtendedMsgIds.cs | 173 +++++++++++++++
.../csharp/TinyExtendedMultiSystemStream.cs | 183 ++++++++++++++++
.../boilerplate/csharp/TinyMinimal.cs | 165 ++++++++++++++
.../csharp/TinyMultiSystemStream.cs | 173 +++++++++++++++
.../boilerplate/csharp/TinySeq.cs | 173 +++++++++++++++
.../boilerplate/csharp/TinySysComp.cs | 173 +++++++++++++++
.../boilerplate/csharp/UbxFrame.cs | 196 +++++++++++++++++
.../boilerplate/js/BasicDefault.js | 2 +-
.../boilerplate/js/BasicExtended.js | 2 +-
.../boilerplate/js/BasicExtendedLength.js | 2 +-
.../boilerplate/js/BasicExtendedMsgIds.js | 2 +-
.../js/BasicExtendedMultiSystemStream.js | 2 +-
.../boilerplate/js/BasicMinimal.js | 2 +-
.../boilerplate/js/BasicMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/BasicSeq.js | 2 +-
.../boilerplate/js/BasicSysComp.js | 2 +-
.../boilerplate/js/FrameFormatConfig.js | 2 +-
.../boilerplate/js/MavlinkV1Frame.js | 2 +-
.../boilerplate/js/MavlinkV2Frame.js | 2 +-
.../boilerplate/js/TinyDefault.js | 2 +-
.../boilerplate/js/TinyExtended.js | 2 +-
.../boilerplate/js/TinyExtendedLength.js | 2 +-
.../boilerplate/js/TinyExtendedMsgIds.js | 2 +-
.../js/TinyExtendedMultiSystemStream.js | 2 +-
.../boilerplate/js/TinyMinimal.js | 2 +-
.../boilerplate/js/TinyMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/TinySeq.js | 2 +-
.../boilerplate/js/TinySysComp.js | 2 +-
src/struct_frame/boilerplate/js/UbxFrame.js | 2 +-
src/struct_frame/boilerplate/js/frame_base.js | 2 +-
src/struct_frame/boilerplate/js/index.js | 2 +-
src/struct_frame/boilerplate/py/__init__.py | 2 +-
.../boilerplate/py/basic_default.py | 2 +-
.../boilerplate/py/basic_extended.py | 2 +-
.../boilerplate/py/basic_extended_length.py | 2 +-
.../boilerplate/py/basic_extended_msg_ids.py | 2 +-
.../py/basic_extended_multi_system_stream.py | 2 +-
.../boilerplate/py/basic_minimal.py | 2 +-
.../py/basic_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/basic_seq.py | 2 +-
.../boilerplate/py/basic_sys_comp.py | 2 +-
src/struct_frame/boilerplate/py/frame_base.py | 2 +-
.../boilerplate/py/frame_format_config.py | 2 +-
.../boilerplate/py/mavlink_v1_frame.py | 2 +-
.../boilerplate/py/mavlink_v2_frame.py | 2 +-
.../boilerplate/py/tiny_default.py | 2 +-
.../boilerplate/py/tiny_extended.py | 2 +-
.../boilerplate/py/tiny_extended_length.py | 2 +-
.../boilerplate/py/tiny_extended_msg_ids.py | 2 +-
.../py/tiny_extended_multi_system_stream.py | 2 +-
.../boilerplate/py/tiny_minimal.py | 2 +-
.../py/tiny_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/tiny_seq.py | 2 +-
.../boilerplate/py/tiny_sys_comp.py | 2 +-
src/struct_frame/boilerplate/py/ubx_frame.py | 2 +-
.../boilerplate/ts/BasicDefault.ts | 2 +-
.../boilerplate/ts/BasicExtended.ts | 2 +-
.../boilerplate/ts/BasicExtendedLength.ts | 2 +-
.../boilerplate/ts/BasicExtendedMsgIds.ts | 2 +-
.../ts/BasicExtendedMultiSystemStream.ts | 2 +-
.../boilerplate/ts/BasicMinimal.ts | 2 +-
.../boilerplate/ts/BasicMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicSeq.ts | 2 +-
.../boilerplate/ts/BasicSysComp.ts | 2 +-
.../boilerplate/ts/FrameFormatConfig.ts | 2 +-
.../boilerplate/ts/MavlinkV1Frame.ts | 2 +-
.../boilerplate/ts/MavlinkV2Frame.ts | 2 +-
.../boilerplate/ts/TinyDefault.ts | 2 +-
.../boilerplate/ts/TinyExtended.ts | 2 +-
.../boilerplate/ts/TinyExtendedLength.ts | 2 +-
.../boilerplate/ts/TinyExtendedMsgIds.ts | 2 +-
.../ts/TinyExtendedMultiSystemStream.ts | 2 +-
.../boilerplate/ts/TinyMinimal.ts | 2 +-
.../boilerplate/ts/TinyMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/TinySeq.ts | 2 +-
.../boilerplate/ts/TinySysComp.ts | 2 +-
src/struct_frame/boilerplate/ts/UbxFrame.ts | 2 +-
src/struct_frame/boilerplate/ts/frame_base.ts | 2 +-
src/struct_frame/boilerplate/ts/index.ts | 2 +-
src/struct_frame/frame_parser_csharp_gen.py | 162 ++++++++++++++
src/struct_frame/generate_boilerplate.py | 28 ++-
146 files changed, 4444 insertions(+), 126 deletions(-)
create mode 100644 src/struct_frame/boilerplate/csharp/BasicDefault.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicExtended.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicMinimal.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicSeq.cs
create mode 100644 src/struct_frame/boilerplate/csharp/BasicSysComp.cs
create mode 100644 src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
create mode 100644 src/struct_frame/boilerplate/csharp/FrameParsers.cs
create mode 100644 src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
create mode 100644 src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyDefault.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyExtended.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyMinimal.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinySeq.cs
create mode 100644 src/struct_frame/boilerplate/csharp/TinySysComp.cs
create mode 100644 src/struct_frame/boilerplate/csharp/UbxFrame.cs
diff --git a/src/struct_frame/boilerplate/c/basic_default.h b/src/struct_frame/boilerplate/c/basic_default.h
index b9be7a02..38829ae2 100644
--- a/src/struct_frame/boilerplate/c/basic_default.h
+++ b/src/struct_frame/boilerplate/c/basic_default.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended.h b/src/struct_frame/boilerplate/c/basic_extended.h
index f48a8182..80982b00 100644
--- a/src/struct_frame/boilerplate/c/basic_extended.h
+++ b/src/struct_frame/boilerplate/c/basic_extended.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_length.h b/src/struct_frame/boilerplate/c/basic_extended_length.h
index 3fe8d42e..65e1af2c 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_length.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_length.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h b/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
index b51fcc5b..cd0e3e07 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h b/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
index d6ccf9db..3106e1c2 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_minimal.h b/src/struct_frame/boilerplate/c/basic_minimal.h
index dae08c80..59241e6f 100644
--- a/src/struct_frame/boilerplate/c/basic_minimal.h
+++ b/src/struct_frame/boilerplate/c/basic_minimal.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_multi_system_stream.h b/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
index 4a99c861..3ba91530 100644
--- a/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_seq.h b/src/struct_frame/boilerplate/c/basic_seq.h
index bd1d55f3..1bd21f66 100644
--- a/src/struct_frame/boilerplate/c/basic_seq.h
+++ b/src/struct_frame/boilerplate/c/basic_seq.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_sys_comp.h b/src/struct_frame/boilerplate/c/basic_sys_comp.h
index d2559d82..de779814 100644
--- a/src/struct_frame/boilerplate/c/basic_sys_comp.h
+++ b/src/struct_frame/boilerplate/c/basic_sys_comp.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_base.h b/src/struct_frame/boilerplate/c/frame_base.h
index 729d618c..d5834fd1 100644
--- a/src/struct_frame/boilerplate/c/frame_base.h
+++ b/src/struct_frame/boilerplate/c/frame_base.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser base utilities */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_format_config.h b/src/struct_frame/boilerplate/c/frame_format_config.h
index 63dae554..ab5e11fe 100644
--- a/src/struct_frame/boilerplate/c/frame_format_config.h
+++ b/src/struct_frame/boilerplate/c/frame_format_config.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_parsers.h b/src/struct_frame/boilerplate/c/frame_parsers.h
index 0469ffd6..6f93f45c 100644
--- a/src/struct_frame/boilerplate/c/frame_parsers.h
+++ b/src/struct_frame/boilerplate/c/frame_parsers.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser main header */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/mavlink_v1_frame.h b/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
index a9d36fad..f41e0f6a 100644
--- a/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
+++ b/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/mavlink_v2_frame.h b/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
index e4732c45..1215aba0 100644
--- a/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
+++ b/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_default.h b/src/struct_frame/boilerplate/c/tiny_default.h
index 9ab9f0b8..21710cb1 100644
--- a/src/struct_frame/boilerplate/c/tiny_default.h
+++ b/src/struct_frame/boilerplate/c/tiny_default.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended.h b/src/struct_frame/boilerplate/c/tiny_extended.h
index 7284c2fb..d1446e81 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_length.h b/src/struct_frame/boilerplate/c/tiny_extended_length.h
index b2fa1893..0f398976 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_length.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_length.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h b/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
index c05f2814..dd7ea808 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h b/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
index 9ce03404..59c52a96 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_minimal.h b/src/struct_frame/boilerplate/c/tiny_minimal.h
index 85b0b1ce..1477885a 100644
--- a/src/struct_frame/boilerplate/c/tiny_minimal.h
+++ b/src/struct_frame/boilerplate/c/tiny_minimal.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h b/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
index 6787665c..74da5b27 100644
--- a/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_seq.h b/src/struct_frame/boilerplate/c/tiny_seq.h
index cd71b2b1..1dc12075 100644
--- a/src/struct_frame/boilerplate/c/tiny_seq.h
+++ b/src/struct_frame/boilerplate/c/tiny_seq.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_sys_comp.h b/src/struct_frame/boilerplate/c/tiny_sys_comp.h
index 76d55cb6..c7e4fc65 100644
--- a/src/struct_frame/boilerplate/c/tiny_sys_comp.h
+++ b/src/struct_frame/boilerplate/c/tiny_sys_comp.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/ubx_frame.h b/src/struct_frame/boilerplate/c/ubx_frame.h
index a11b7e1d..e5a26370 100644
--- a/src/struct_frame/boilerplate/c/ubx_frame.h
+++ b/src/struct_frame/boilerplate/c/ubx_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicDefault.hpp b/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
index 5efc0ba6..90314981 100644
--- a/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtended.hpp b/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
index 86996959..867a4c33 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
index 71571bd2..0181ec8c 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
index f60787d9..61e09cf8 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
index dec5924f..26ef45ab 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp b/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
index fca39b89..36955311 100644
--- a/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
index 5104d52d..f036abec 100644
--- a/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicSeq.hpp b/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
index 8c5d9842..6a527c4b 100644
--- a/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp b/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
index 7009478c..d69d9754 100644
--- a/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp b/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
index 43190d44..48d13f2c 100644
--- a/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
+++ b/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp b/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
index 32563371..a983981e 100644
--- a/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
+++ b/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp b/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
index b36003a3..b154d9f7 100644
--- a/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
+++ b/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyDefault.hpp b/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
index 2fb609e6..a9acf121 100644
--- a/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtended.hpp b/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
index 6d70497f..1736dec9 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
index 37d5acc9..c284eb16 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
index 3d32b6f8..ad4ffe22 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
index df4b81a1..6fb2c0e9 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp b/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
index e2cd4c5b..018110e0 100644
--- a/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
index 90f85688..0394f92c 100644
--- a/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinySeq.hpp b/src/struct_frame/boilerplate/cpp/TinySeq.hpp
index 8d4c6085..a2f18e71 100644
--- a/src/struct_frame/boilerplate/cpp/TinySeq.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinySeq.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinySysComp.hpp b/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
index 5b6d54a7..836e5fd7 100644
--- a/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/UbxFrame.hpp b/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
index cf7a580d..cd2cd225 100644
--- a/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
+++ b/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/frame_base.hpp b/src/struct_frame/boilerplate/cpp/frame_base.hpp
index 7c2b25a7..1a22df87 100644
--- a/src/struct_frame/boilerplate/cpp/frame_base.hpp
+++ b/src/struct_frame/boilerplate/cpp/frame_base.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser base utilities */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/frame_parsers.hpp b/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
index 38253a37..ae06d603 100644
--- a/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
+++ b/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser main header */
-/* Generated by 0.0.1 at Thu Dec 4 22:44:11 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/csharp/BasicDefault.cs b/src/struct_frame/boilerplate/csharp/BasicDefault.cs
new file mode 100644
index 00000000..7fa0b249
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicDefault.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicDefault - Frame format parser and encoder
+ ///
+ public class BasicDefault : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x71;
+ public const int HeaderSize = 4;
+ public const int FooterSize = 2;
+ public const int Overhead = 6;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicDefault parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicDefault(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicDefault format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicDefault packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtended.cs b/src/struct_frame/boilerplate/csharp/BasicExtended.cs
new file mode 100644
index 00000000..30642dda
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicExtended.cs
@@ -0,0 +1,206 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicExtended - Frame format parser and encoder
+ ///
+ public class BasicExtended : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x74;
+ public const int HeaderSize = 6;
+ public const int FooterSize = 2;
+ public const int Overhead = 8;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicExtended parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicExtended(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 4)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicExtended format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicExtended packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
new file mode 100644
index 00000000..846cb016
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
@@ -0,0 +1,206 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicExtendedLength - Frame format parser and encoder
+ ///
+ public class BasicExtendedLength : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x73;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicExtendedLength parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicExtendedLength(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 4)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicExtendedLength format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicExtendedLength packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
new file mode 100644
index 00000000..c3af9074
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicExtendedMsgIds - Frame format parser and encoder
+ ///
+ public class BasicExtendedMsgIds : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x72;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicExtendedMsgIds parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicExtendedMsgIds(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicExtendedMsgIds format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicExtendedMsgIds packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
new file mode 100644
index 00000000..fca7b63e
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
@@ -0,0 +1,206 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicExtendedMultiSystemStream - Frame format parser and encoder
+ ///
+ public class BasicExtendedMultiSystemStream : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x78;
+ public const int HeaderSize = 9;
+ public const int FooterSize = 2;
+ public const int Overhead = 11;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicExtendedMultiSystemStream parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicExtendedMultiSystemStream(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 4)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicExtendedMultiSystemStream format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicExtendedMultiSystemStream packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicMinimal.cs b/src/struct_frame/boilerplate/csharp/BasicMinimal.cs
new file mode 100644
index 00000000..af7618d4
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicMinimal.cs
@@ -0,0 +1,188 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicMinimal - Frame format parser and encoder
+ ///
+ public class BasicMinimal : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x70;
+ public const int HeaderSize = 3;
+ public const int FooterSize = 0;
+ public const int Overhead = 3;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicMinimal parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicMinimal(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ if (_getMsgLength != null)
+ {
+ int? msgLength = _getMsgLength(b);
+ if (msgLength.HasValue)
+ {
+ _packetSize = Overhead + msgLength.Value;
+ _state = ParserState.GettingPayload;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicMinimal format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicMinimal packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = length - HeaderSize;
+ result.MsgData = new byte[result.MsgSize];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, result.MsgSize);
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
new file mode 100644
index 00000000..4c09c95a
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicMultiSystemStream - Frame format parser and encoder
+ ///
+ public class BasicMultiSystemStream : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x77;
+ public const int HeaderSize = 7;
+ public const int FooterSize = 2;
+ public const int Overhead = 9;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicMultiSystemStream parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicMultiSystemStream(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicMultiSystemStream format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicMultiSystemStream packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicSeq.cs b/src/struct_frame/boilerplate/csharp/BasicSeq.cs
new file mode 100644
index 00000000..3ee3c122
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicSeq.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicSeq - Frame format parser and encoder
+ ///
+ public class BasicSeq : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x76;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicSeq parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicSeq(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicSeq format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicSeq packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/BasicSysComp.cs b/src/struct_frame/boilerplate/csharp/BasicSysComp.cs
new file mode 100644
index 00000000..bb1b70b4
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/BasicSysComp.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// BasicSysComp - Frame format parser and encoder
+ ///
+ public class BasicSysComp : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x75;
+ public const int HeaderSize = 6;
+ public const int FooterSize = 2;
+ public const int Overhead = 8;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the BasicSysComp parser
+ ///
+ /// Callback function to get message length from msg_id
+ public BasicSysComp(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with BasicSysComp format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete BasicSysComp packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/FrameBase.cs b/src/struct_frame/boilerplate/csharp/FrameBase.cs
index c33b4ac6..b44b716e 100644
--- a/src/struct_frame/boilerplate/csharp/FrameBase.cs
+++ b/src/struct_frame/boilerplate/csharp/FrameBase.cs
@@ -1,4 +1,5 @@
// Automatically generated frame base for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
// This file provides base utilities for struct frame parsing and encoding
using System;
diff --git a/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs b/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
new file mode 100644
index 00000000..58014098
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
@@ -0,0 +1,198 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// FrameFormatConfig - Frame format parser and encoder
+ ///
+ public class FrameFormatConfig : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte1 = 0x90;
+ public const byte StartByte2 = 0x71;
+ public const int HeaderSize = 2;
+ public const int FooterSize = 1;
+ public const int Overhead = 3;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the FrameFormatConfig parser
+ ///
+ /// Callback function to get message length from msg_id
+ public FrameFormatConfig(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ if (_getMsgLength != null)
+ {
+ int? msgLength = _getMsgLength(b);
+ if (msgLength.HasValue)
+ {
+ _packetSize = Overhead + msgLength.Value;
+ _state = ParserState.GettingPayload;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with FrameFormatConfig format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete FrameFormatConfig packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/FrameParsers.cs b/src/struct_frame/boilerplate/csharp/FrameParsers.cs
new file mode 100644
index 00000000..83e29865
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/FrameParsers.cs
@@ -0,0 +1,34 @@
+// Automatically generated frame parsers for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+namespace StructFrame
+{
+ ///
+ /// Frame format type enumeration
+ ///
+ public enum FrameFormatType
+ {
+ TINY_MINIMAL = 0,
+ TINY_DEFAULT = 1,
+ TINY_EXTENDED_MSG_IDS = 2,
+ TINY_EXTENDED_LENGTH = 3,
+ TINY_EXTENDED = 4,
+ TINY_SYS_COMP = 5,
+ TINY_SEQ = 6,
+ TINY_MULTI_SYSTEM_STREAM = 7,
+ TINY_EXTENDED_MULTI_SYSTEM_STREAM = 8,
+ BASIC_MINIMAL = 9,
+ BASIC_DEFAULT = 10,
+ BASIC_EXTENDED_MSG_IDS = 11,
+ BASIC_EXTENDED_LENGTH = 12,
+ BASIC_EXTENDED = 13,
+ BASIC_SYS_COMP = 14,
+ BASIC_SEQ = 15,
+ BASIC_MULTI_SYSTEM_STREAM = 16,
+ BASIC_EXTENDED_MULTI_SYSTEM_STREAM = 17,
+ UBX_FRAME = 18,
+ MAVLINK_V1_FRAME = 19,
+ MAVLINK_V2_FRAME = 20,
+ FRAME_FORMAT_CONFIG = 21
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs b/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
new file mode 100644
index 00000000..78eacd6a
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// MavlinkV1Frame - Frame format parser and encoder
+ ///
+ public class MavlinkV1Frame : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0xFE;
+ public const int HeaderSize = 6;
+ public const int FooterSize = 2;
+ public const int Overhead = 8;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the MavlinkV1Frame parser
+ ///
+ /// Callback function to get message length from msg_id
+ public MavlinkV1Frame(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with MavlinkV1Frame format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete MavlinkV1Frame packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs b/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
new file mode 100644
index 00000000..0fd6a4e8
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// MavlinkV2Frame - Frame format parser and encoder
+ ///
+ public class MavlinkV2Frame : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0xFD;
+ public const int HeaderSize = 8;
+ public const int FooterSize = 2;
+ public const int Overhead = 10;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the MavlinkV2Frame parser
+ ///
+ /// Callback function to get message length from msg_id
+ public MavlinkV2Frame(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with MavlinkV2Frame format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete MavlinkV2Frame packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyDefault.cs b/src/struct_frame/boilerplate/csharp/TinyDefault.cs
new file mode 100644
index 00000000..57e69c2d
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyDefault.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyDefault - Frame format parser and encoder
+ ///
+ public class TinyDefault : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x71;
+ public const int HeaderSize = 3;
+ public const int FooterSize = 2;
+ public const int Overhead = 5;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyDefault parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyDefault(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyDefault format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyDefault packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtended.cs b/src/struct_frame/boilerplate/csharp/TinyExtended.cs
new file mode 100644
index 00000000..ba19f381
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyExtended.cs
@@ -0,0 +1,183 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyExtended - Frame format parser and encoder
+ ///
+ public class TinyExtended : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x74;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyExtended parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyExtended(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 3)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyExtended format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyExtended packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
new file mode 100644
index 00000000..54711c58
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
@@ -0,0 +1,183 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyExtendedLength - Frame format parser and encoder
+ ///
+ public class TinyExtendedLength : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x73;
+ public const int HeaderSize = 4;
+ public const int FooterSize = 2;
+ public const int Overhead = 6;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyExtendedLength parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyExtendedLength(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 3)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyExtendedLength format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyExtendedLength packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
new file mode 100644
index 00000000..d8b0a3c8
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyExtendedMsgIds - Frame format parser and encoder
+ ///
+ public class TinyExtendedMsgIds : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x72;
+ public const int HeaderSize = 4;
+ public const int FooterSize = 2;
+ public const int Overhead = 6;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyExtendedMsgIds parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyExtendedMsgIds(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyExtendedMsgIds format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyExtendedMsgIds packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
new file mode 100644
index 00000000..0a70d051
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
@@ -0,0 +1,183 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyExtendedMultiSystemStream - Frame format parser and encoder
+ ///
+ public class TinyExtendedMultiSystemStream : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x78;
+ public const int HeaderSize = 8;
+ public const int FooterSize = 2;
+ public const int Overhead = 10;
+ public const int LengthBytes = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private int _lengthLo;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyExtendedMultiSystemStream parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyExtendedMultiSystemStream(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ _lengthLo = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ if (_buffer.Count == 3)
+ {
+ _lengthLo = b;
+ }
+ else
+ {
+ _msgLength = _lengthLo | (b << 8);
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyExtendedMultiSystemStream format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)((msgData.Length >> 8) & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyExtendedMultiSystemStream packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyMinimal.cs b/src/struct_frame/boilerplate/csharp/TinyMinimal.cs
new file mode 100644
index 00000000..21f2889f
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyMinimal.cs
@@ -0,0 +1,165 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyMinimal - Frame format parser and encoder
+ ///
+ public class TinyMinimal : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingPayload = 2
+ }
+
+ public const byte StartByte = 0x70;
+ public const int HeaderSize = 2;
+ public const int FooterSize = 0;
+ public const int Overhead = 2;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyMinimal parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyMinimal(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ if (_getMsgLength != null)
+ {
+ int? msgLength = _getMsgLength(b);
+ if (msgLength.HasValue)
+ {
+ _packetSize = Overhead + msgLength.Value;
+ _state = ParserState.GettingPayload;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart;
+ }
+ }
+ else
+ {
+ _state = ParserState.LookingForStart;
+ }
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyMinimal format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyMinimal packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = length - HeaderSize;
+ result.MsgData = new byte[result.MsgSize];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, result.MsgSize);
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
new file mode 100644
index 00000000..ec759fca
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinyMultiSystemStream - Frame format parser and encoder
+ ///
+ public class TinyMultiSystemStream : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x77;
+ public const int HeaderSize = 6;
+ public const int FooterSize = 2;
+ public const int Overhead = 8;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinyMultiSystemStream parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinyMultiSystemStream(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinyMultiSystemStream format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinyMultiSystemStream packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinySeq.cs b/src/struct_frame/boilerplate/csharp/TinySeq.cs
new file mode 100644
index 00000000..3598dc0d
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinySeq.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinySeq - Frame format parser and encoder
+ ///
+ public class TinySeq : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x76;
+ public const int HeaderSize = 4;
+ public const int FooterSize = 2;
+ public const int Overhead = 6;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinySeq parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinySeq(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinySeq format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinySeq packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/TinySysComp.cs b/src/struct_frame/boilerplate/csharp/TinySysComp.cs
new file mode 100644
index 00000000..a32f48bb
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/TinySysComp.cs
@@ -0,0 +1,173 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// TinySysComp - Frame format parser and encoder
+ ///
+ public class TinySysComp : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart = 0,
+ GettingMsgId = 1,
+ GettingLength = 2,
+ GettingPayload = 3
+ }
+
+ public const byte StartByte = 0x75;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the TinySysComp parser
+ ///
+ /// Callback function to get message length from msg_id
+ public TinySysComp(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart:
+ if (b == StartByte)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with TinySysComp format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 1, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete TinySysComp packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 1, 1 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/csharp/UbxFrame.cs b/src/struct_frame/boilerplate/csharp/UbxFrame.cs
new file mode 100644
index 00000000..d3e74d89
--- /dev/null
+++ b/src/struct_frame/boilerplate/csharp/UbxFrame.cs
@@ -0,0 +1,196 @@
+// Automatically generated frame parser for C#
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+
+using System;
+using System.Collections.Generic;
+
+namespace StructFrame
+{
+ ///
+ /// UbxFrame - Frame format parser and encoder
+ ///
+ public class UbxFrame : FrameFormatBase
+ {
+ public enum ParserState
+ {
+ LookingForStart1 = 0,
+ LookingForStart2 = 1,
+ GettingMsgId = 2,
+ GettingLength = 3,
+ GettingPayload = 4
+ }
+
+ public const byte StartByte1 = 0xB5;
+ public const byte StartByte2 = 0x62;
+ public const int HeaderSize = 5;
+ public const int FooterSize = 2;
+ public const int Overhead = 7;
+ public const int LengthBytes = 1;
+
+ private ParserState _state;
+ private List _buffer;
+ private int _packetSize;
+ private int _msgId;
+ private int _msgLength;
+ private Func _getMsgLength;
+
+ ///
+ /// Initialize the UbxFrame parser
+ ///
+ /// Callback function to get message length from msg_id
+ public UbxFrame(Func getMsgLength = null)
+ {
+ _getMsgLength = getMsgLength;
+ _buffer = new List();
+ Reset();
+ }
+
+ ///
+ /// Reset parser state
+ ///
+ public override void Reset()
+ {
+ _state = ParserState.LookingForStart1;
+ _buffer.Clear();
+ _packetSize = 0;
+ _msgId = 0;
+ _msgLength = 0;
+ }
+
+ ///
+ /// Parse a single byte
+ ///
+ /// The byte to parse
+ /// FrameParseResult with Valid=true when a complete valid message is received
+ public override FrameParseResult ParseByte(byte b)
+ {
+ var result = new FrameParseResult();
+
+ switch (_state)
+ {
+ case ParserState.LookingForStart1:
+ if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ break;
+
+ case ParserState.LookingForStart2:
+ if (b == StartByte2)
+ {
+ _buffer.Add(b);
+ _state = ParserState.GettingMsgId;
+ }
+ else if (b == StartByte1)
+ {
+ _buffer.Clear();
+ _buffer.Add(b);
+ _state = ParserState.LookingForStart2;
+ }
+ else
+ {
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+
+ case ParserState.GettingMsgId:
+ _buffer.Add(b);
+ _msgId = b;
+ _state = ParserState.GettingLength;
+ break;
+
+ case ParserState.GettingLength:
+ _buffer.Add(b);
+ _msgLength = b;
+ _packetSize = Overhead + _msgLength;
+ _state = ParserState.GettingPayload;
+ break;
+
+ case ParserState.GettingPayload:
+ _buffer.Add(b);
+ if (_buffer.Count >= _packetSize)
+ {
+ result = ValidatePacket(_buffer.ToArray(), _buffer.Count);
+ _state = ParserState.LookingForStart1;
+ }
+ break;
+ }
+
+ return result;
+ }
+
+ ///
+ /// Encode a message with UbxFrame format
+ ///
+ /// Message ID
+ /// Message data bytes
+ /// Encoded frame as byte array
+ public override byte[] Encode(int msgId, byte[] msgData)
+ {
+ var output = new List();
+ output.Add(StartByte1);
+ output.Add(StartByte2);
+ output.Add((byte)(msgData.Length & 0xFF));
+ output.Add((byte)msgId);
+ output.AddRange(msgData);
+
+ // Calculate Fletcher checksum
+ var ck = FletcherChecksum(output.ToArray(), 2, output.Count);
+ output.Add(ck.Item1);
+ output.Add(ck.Item2);
+ return output.ToArray();
+ }
+
+ ///
+ /// Validate a complete UbxFrame packet in a buffer
+ ///
+ /// Buffer containing the complete packet
+ /// Length of the data in the buffer
+ /// FrameParseResult with Valid=true if packet is valid
+ public override FrameParseResult ValidatePacket(byte[] data, int length)
+ {
+ var result = new FrameParseResult();
+
+ if (length < Overhead)
+ return result;
+
+ if (data[0] != StartByte1)
+ return result;
+ if (data[1] != StartByte2)
+ return result;
+
+ int msgLength = length - Overhead;
+ int crcDataLen = msgLength + 1 + LengthBytes;
+ var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
+
+ if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
+ {
+ result.Valid = true;
+ result.MsgId = data[HeaderSize - 1];
+ result.MsgSize = msgLength;
+ result.MsgData = new byte[msgLength];
+ Array.Copy(data, HeaderSize, result.MsgData, 0, msgLength);
+ }
+ return result;
+ }
+
+ ///
+ /// Calculate Fletcher-16 checksum
+ ///
+ private static (byte, byte) FletcherChecksum(byte[] buffer, int start, int end)
+ {
+ byte byte1 = 0;
+ byte byte2 = 0;
+
+ for (int i = start; i < end; i++)
+ {
+ byte1 = (byte)((byte1 + buffer[i]) % 256);
+ byte2 = (byte)((byte2 + byte1) % 256);
+ }
+
+ return (byte1, byte2);
+ }
+ }
+}
diff --git a/src/struct_frame/boilerplate/js/BasicDefault.js b/src/struct_frame/boilerplate/js/BasicDefault.js
index ed27c71a..a46baf6d 100644
--- a/src/struct_frame/boilerplate/js/BasicDefault.js
+++ b/src/struct_frame/boilerplate/js/BasicDefault.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtended.js b/src/struct_frame/boilerplate/js/BasicExtended.js
index 0a5f62c8..652a421e 100644
--- a/src/struct_frame/boilerplate/js/BasicExtended.js
+++ b/src/struct_frame/boilerplate/js/BasicExtended.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedLength.js b/src/struct_frame/boilerplate/js/BasicExtendedLength.js
index 6b85964b..fe10afb5 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedLength.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedLength.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js b/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
index a390d7b6..fb8405cb 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js b/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
index 5a7d88b6..42f12613 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicMinimal.js b/src/struct_frame/boilerplate/js/BasicMinimal.js
index de7765aa..292898a2 100644
--- a/src/struct_frame/boilerplate/js/BasicMinimal.js
+++ b/src/struct_frame/boilerplate/js/BasicMinimal.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js b/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
index f4709a42..0398025a 100644
--- a/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicSeq.js b/src/struct_frame/boilerplate/js/BasicSeq.js
index e7981273..828c442b 100644
--- a/src/struct_frame/boilerplate/js/BasicSeq.js
+++ b/src/struct_frame/boilerplate/js/BasicSeq.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicSysComp.js b/src/struct_frame/boilerplate/js/BasicSysComp.js
index d5239a4d..3fbaebe2 100644
--- a/src/struct_frame/boilerplate/js/BasicSysComp.js
+++ b/src/struct_frame/boilerplate/js/BasicSysComp.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/FrameFormatConfig.js b/src/struct_frame/boilerplate/js/FrameFormatConfig.js
index a327cfe4..b46f8823 100644
--- a/src/struct_frame/boilerplate/js/FrameFormatConfig.js
+++ b/src/struct_frame/boilerplate/js/FrameFormatConfig.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/MavlinkV1Frame.js b/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
index 5db888ea..cb46180b 100644
--- a/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
+++ b/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/MavlinkV2Frame.js b/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
index c76d73c1..a40790f1 100644
--- a/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
+++ b/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyDefault.js b/src/struct_frame/boilerplate/js/TinyDefault.js
index 0e89ac08..1b676d3a 100644
--- a/src/struct_frame/boilerplate/js/TinyDefault.js
+++ b/src/struct_frame/boilerplate/js/TinyDefault.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtended.js b/src/struct_frame/boilerplate/js/TinyExtended.js
index 04209afb..61cbe98d 100644
--- a/src/struct_frame/boilerplate/js/TinyExtended.js
+++ b/src/struct_frame/boilerplate/js/TinyExtended.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedLength.js b/src/struct_frame/boilerplate/js/TinyExtendedLength.js
index f62bac8d..efac9a15 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedLength.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedLength.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js b/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
index d9b3820d..add38064 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js b/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
index 0400df4b..f5b017f8 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyMinimal.js b/src/struct_frame/boilerplate/js/TinyMinimal.js
index b5b51f42..3d73a8db 100644
--- a/src/struct_frame/boilerplate/js/TinyMinimal.js
+++ b/src/struct_frame/boilerplate/js/TinyMinimal.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js b/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
index 045563c8..bc875e96 100644
--- a/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinySeq.js b/src/struct_frame/boilerplate/js/TinySeq.js
index b3cad8bc..80896e22 100644
--- a/src/struct_frame/boilerplate/js/TinySeq.js
+++ b/src/struct_frame/boilerplate/js/TinySeq.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinySysComp.js b/src/struct_frame/boilerplate/js/TinySysComp.js
index 6cebbe1f..406809ff 100644
--- a/src/struct_frame/boilerplate/js/TinySysComp.js
+++ b/src/struct_frame/boilerplate/js/TinySysComp.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/UbxFrame.js b/src/struct_frame/boilerplate/js/UbxFrame.js
index cf67599f..4b53731c 100644
--- a/src/struct_frame/boilerplate/js/UbxFrame.js
+++ b/src/struct_frame/boilerplate/js/UbxFrame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/frame_base.js b/src/struct_frame/boilerplate/js/frame_base.js
index 331d15e5..fc2ea0f3 100644
--- a/src/struct_frame/boilerplate/js/frame_base.js
+++ b/src/struct_frame/boilerplate/js/frame_base.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser base utilities
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
// Frame format type enumeration
const FrameFormatType = {
diff --git a/src/struct_frame/boilerplate/js/index.js b/src/struct_frame/boilerplate/js/index.js
index 7828c776..ed76c8f0 100644
--- a/src/struct_frame/boilerplate/js/index.js
+++ b/src/struct_frame/boilerplate/js/index.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser package
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
// Base utilities
const frameBase = require('./frame_base');
diff --git a/src/struct_frame/boilerplate/py/__init__.py b/src/struct_frame/boilerplate/py/__init__.py
index d2abe5e1..649a6e51 100644
--- a/src/struct_frame/boilerplate/py/__init__.py
+++ b/src/struct_frame/boilerplate/py/__init__.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser package
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
# Base utilities and generic parser infrastructure
from .frame_base import (
diff --git a/src/struct_frame/boilerplate/py/basic_default.py b/src/struct_frame/boilerplate/py/basic_default.py
index 4df8b5b5..9ce890c7 100644
--- a/src/struct_frame/boilerplate/py/basic_default.py
+++ b/src/struct_frame/boilerplate/py/basic_default.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended.py b/src/struct_frame/boilerplate/py/basic_extended.py
index a692d09f..035009b4 100644
--- a/src/struct_frame/boilerplate/py/basic_extended.py
+++ b/src/struct_frame/boilerplate/py/basic_extended.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_length.py b/src/struct_frame/boilerplate/py/basic_extended_length.py
index fc0a8ccd..ecf1a0bf 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_length.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_length.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py b/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
index 5ca34d0c..1b92f07f 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py b/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
index 800e93b1..8ac828e2 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_minimal.py b/src/struct_frame/boilerplate/py/basic_minimal.py
index 5fed738b..f408648e 100644
--- a/src/struct_frame/boilerplate/py/basic_minimal.py
+++ b/src/struct_frame/boilerplate/py/basic_minimal.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_multi_system_stream.py b/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
index 99ecf897..bd024a5c 100644
--- a/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_seq.py b/src/struct_frame/boilerplate/py/basic_seq.py
index ab02dfa8..5dcafbef 100644
--- a/src/struct_frame/boilerplate/py/basic_seq.py
+++ b/src/struct_frame/boilerplate/py/basic_seq.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_sys_comp.py b/src/struct_frame/boilerplate/py/basic_sys_comp.py
index ea6b6f7d..0fd187a5 100644
--- a/src/struct_frame/boilerplate/py/basic_sys_comp.py
+++ b/src/struct_frame/boilerplate/py/basic_sys_comp.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/frame_base.py b/src/struct_frame/boilerplate/py/frame_base.py
index 92370160..6ab50d68 100644
--- a/src/struct_frame/boilerplate/py/frame_base.py
+++ b/src/struct_frame/boilerplate/py/frame_base.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser base utilities
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from enum import Enum
from typing import Callable, List, Tuple, Union
diff --git a/src/struct_frame/boilerplate/py/frame_format_config.py b/src/struct_frame/boilerplate/py/frame_format_config.py
index 27328a5d..8f65c025 100644
--- a/src/struct_frame/boilerplate/py/frame_format_config.py
+++ b/src/struct_frame/boilerplate/py/frame_format_config.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/mavlink_v1_frame.py b/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
index ae8abc2f..fcb96210 100644
--- a/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
+++ b/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/mavlink_v2_frame.py b/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
index 88ff273b..4f7bf4d4 100644
--- a/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
+++ b/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_default.py b/src/struct_frame/boilerplate/py/tiny_default.py
index 9c491053..4215a8e3 100644
--- a/src/struct_frame/boilerplate/py/tiny_default.py
+++ b/src/struct_frame/boilerplate/py/tiny_default.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended.py b/src/struct_frame/boilerplate/py/tiny_extended.py
index de14acd4..c438eb81 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_length.py b/src/struct_frame/boilerplate/py/tiny_extended_length.py
index 5b231512..0c325963 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_length.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_length.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py b/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
index f0d4cf52..8c4bacdf 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py b/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
index 06ce0dd9..2d409848 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_minimal.py b/src/struct_frame/boilerplate/py/tiny_minimal.py
index d3f6ca81..61b44389 100644
--- a/src/struct_frame/boilerplate/py/tiny_minimal.py
+++ b/src/struct_frame/boilerplate/py/tiny_minimal.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py b/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
index 2cc94208..8db3787a 100644
--- a/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_seq.py b/src/struct_frame/boilerplate/py/tiny_seq.py
index c4800520..f6ac4c05 100644
--- a/src/struct_frame/boilerplate/py/tiny_seq.py
+++ b/src/struct_frame/boilerplate/py/tiny_seq.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_sys_comp.py b/src/struct_frame/boilerplate/py/tiny_sys_comp.py
index 2735a2f8..21dbb6e5 100644
--- a/src/struct_frame/boilerplate/py/tiny_sys_comp.py
+++ b/src/struct_frame/boilerplate/py/tiny_sys_comp.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/ubx_frame.py b/src/struct_frame/boilerplate/py/ubx_frame.py
index ceeb3e48..a9dd2211 100644
--- a/src/struct_frame/boilerplate/py/ubx_frame.py
+++ b/src/struct_frame/boilerplate/py/ubx_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicDefault.ts b/src/struct_frame/boilerplate/ts/BasicDefault.ts
index c43b84a1..e9c651ad 100644
--- a/src/struct_frame/boilerplate/ts/BasicDefault.ts
+++ b/src/struct_frame/boilerplate/ts/BasicDefault.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtended.ts b/src/struct_frame/boilerplate/ts/BasicExtended.ts
index 3c58f8d8..5c8bca5e 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtended.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtended.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts b/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
index fff6a52f..3a21c757 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts b/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
index 0c7f8994..7df2dd3f 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
index 73df40f8..3df939e5 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicMinimal.ts b/src/struct_frame/boilerplate/ts/BasicMinimal.ts
index ecd3e859..0b1af0f4 100644
--- a/src/struct_frame/boilerplate/ts/BasicMinimal.ts
+++ b/src/struct_frame/boilerplate/ts/BasicMinimal.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
index b41e01fe..0b410d4a 100644
--- a/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicSeq.ts b/src/struct_frame/boilerplate/ts/BasicSeq.ts
index d7af1043..916f4240 100644
--- a/src/struct_frame/boilerplate/ts/BasicSeq.ts
+++ b/src/struct_frame/boilerplate/ts/BasicSeq.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicSysComp.ts b/src/struct_frame/boilerplate/ts/BasicSysComp.ts
index d1c1f67f..8d1904ba 100644
--- a/src/struct_frame/boilerplate/ts/BasicSysComp.ts
+++ b/src/struct_frame/boilerplate/ts/BasicSysComp.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts b/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
index d0016a1b..5f1367c3 100644
--- a/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
+++ b/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts b/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
index d71b7a8f..5c31b6c3 100644
--- a/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
+++ b/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts b/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
index 265839e4..a2cd2a89 100644
--- a/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
+++ b/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyDefault.ts b/src/struct_frame/boilerplate/ts/TinyDefault.ts
index 6b312e2e..205fe7d4 100644
--- a/src/struct_frame/boilerplate/ts/TinyDefault.ts
+++ b/src/struct_frame/boilerplate/ts/TinyDefault.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtended.ts b/src/struct_frame/boilerplate/ts/TinyExtended.ts
index 7d504a31..0f864f19 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtended.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtended.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts b/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
index 9326a099..2a9ea61f 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts b/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
index e938eb1d..40aa8438 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
index 35a79adb..62d5a4cb 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyMinimal.ts b/src/struct_frame/boilerplate/ts/TinyMinimal.ts
index 51c5a920..435d054d 100644
--- a/src/struct_frame/boilerplate/ts/TinyMinimal.ts
+++ b/src/struct_frame/boilerplate/ts/TinyMinimal.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
index d4fe9a3d..dfa74403 100644
--- a/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinySeq.ts b/src/struct_frame/boilerplate/ts/TinySeq.ts
index b78dd9f1..3056e3d9 100644
--- a/src/struct_frame/boilerplate/ts/TinySeq.ts
+++ b/src/struct_frame/boilerplate/ts/TinySeq.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinySysComp.ts b/src/struct_frame/boilerplate/ts/TinySysComp.ts
index 1f55713e..0b2f7c25 100644
--- a/src/struct_frame/boilerplate/ts/TinySysComp.ts
+++ b/src/struct_frame/boilerplate/ts/TinySysComp.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/UbxFrame.ts b/src/struct_frame/boilerplate/ts/UbxFrame.ts
index 173bf7a4..650be3bc 100644
--- a/src/struct_frame/boilerplate/ts/UbxFrame.ts
+++ b/src/struct_frame/boilerplate/ts/UbxFrame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/frame_base.ts b/src/struct_frame/boilerplate/ts/frame_base.ts
index 7c369898..833d85ce 100644
--- a/src/struct_frame/boilerplate/ts/frame_base.ts
+++ b/src/struct_frame/boilerplate/ts/frame_base.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser base utilities
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
// Frame format type enumeration
export enum FrameFormatType {
diff --git a/src/struct_frame/boilerplate/ts/index.ts b/src/struct_frame/boilerplate/ts/index.ts
index d88c692f..0404435d 100644
--- a/src/struct_frame/boilerplate/ts/index.ts
+++ b/src/struct_frame/boilerplate/ts/index.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser package
-// Generated by 0.0.1 at Thu Dec 4 22:44:11 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
// Base utilities and generic parser infrastructure
export {
diff --git a/src/struct_frame/frame_parser_csharp_gen.py b/src/struct_frame/frame_parser_csharp_gen.py
index fa1e6d56..7a5f402c 100644
--- a/src/struct_frame/frame_parser_csharp_gen.py
+++ b/src/struct_frame/frame_parser_csharp_gen.py
@@ -365,7 +365,169 @@ def generate_format(fmt):
yield f' }}\n'
+ @staticmethod
+ def generate_base():
+ """Generate the base C# file with FrameParseResult, FrameFormatBase, StructHelper"""
+ yield '// Automatically generated frame base for C#\n'
+ yield f'// Generated by {version} at {time.asctime()}.\n'
+ yield '// This file provides base utilities for struct frame parsing and encoding\n\n'
+ yield 'using System;\n'
+ yield 'using System.Runtime.InteropServices;\n\n'
+ yield 'namespace StructFrame\n'
+ yield '{\n'
+
+ # FrameParseResult struct
+ yield ' /// \n'
+ yield ' /// Represents the result of parsing a frame\n'
+ yield ' /// \n'
+ yield ' public struct FrameParseResult\n'
+ yield ' {\n'
+ yield ' public bool Valid;\n'
+ yield ' public int MsgId;\n'
+ yield ' public byte[] MsgData;\n'
+ yield ' public int MsgSize;\n'
+ yield ' }\n\n'
+
+ # FrameFormatBase abstract class
+ yield ' /// \n'
+ yield ' /// Base class for frame format implementations\n'
+ yield ' /// \n'
+ yield ' public abstract class FrameFormatBase\n'
+ yield ' {\n'
+ yield ' /// \n'
+ yield ' /// Encodes a message into a byte array\n'
+ yield ' /// \n'
+ yield ' public abstract byte[] Encode(int msgId, byte[] msgData);\n\n'
+ yield ' /// \n'
+ yield ' /// Validates and parses a packet\n'
+ yield ' /// \n'
+ yield ' public abstract FrameParseResult ValidatePacket(byte[] data, int length);\n\n'
+ yield ' /// \n'
+ yield ' /// Parses a single byte (for streaming parsers)\n'
+ yield ' /// \n'
+ yield ' public abstract FrameParseResult ParseByte(byte b);\n\n'
+ yield ' /// \n'
+ yield ' /// Resets the parser state\n'
+ yield ' /// \n'
+ yield ' public abstract void Reset();\n'
+ yield ' }\n\n'
+
+ # StructHelper static class
+ yield ' /// \n'
+ yield ' /// Helper methods for struct serialization\n'
+ yield ' /// \n'
+ yield ' public static class StructHelper\n'
+ yield ' {\n'
+ yield ' /// \n'
+ yield ' /// Converts a struct to a byte array\n'
+ yield ' /// \n'
+ yield ' public static byte[] StructToBytes(T structure) where T : struct\n'
+ yield ' {\n'
+ yield ' int size = Marshal.SizeOf(typeof(T));\n'
+ yield ' byte[] buffer = new byte[size];\n'
+ yield ' IntPtr ptr = Marshal.AllocHGlobal(size);\n'
+ yield ' try\n'
+ yield ' {\n'
+ yield ' Marshal.StructureToPtr(structure, ptr, false);\n'
+ yield ' Marshal.Copy(ptr, buffer, 0, size);\n'
+ yield ' }\n'
+ yield ' finally\n'
+ yield ' {\n'
+ yield ' Marshal.FreeHGlobal(ptr);\n'
+ yield ' }\n'
+ yield ' return buffer;\n'
+ yield ' }\n\n'
+ yield ' /// \n'
+ yield ' /// Converts a byte array to a struct\n'
+ yield ' /// \n'
+ yield ' public static T BytesToStruct(byte[] buffer) where T : struct\n'
+ yield ' {\n'
+ yield ' return BytesToStruct(buffer, 0);\n'
+ yield ' }\n\n'
+ yield ' /// \n'
+ yield ' /// Converts a byte array to a struct starting at an offset\n'
+ yield ' /// \n'
+ yield ' public static T BytesToStruct(byte[] buffer, int offset) where T : struct\n'
+ yield ' {\n'
+ yield ' int size = Marshal.SizeOf(typeof(T));\n'
+ yield ' IntPtr ptr = Marshal.AllocHGlobal(size);\n'
+ yield ' try\n'
+ yield ' {\n'
+ yield ' Marshal.Copy(buffer, offset, ptr, size);\n'
+ yield ' return Marshal.PtrToStructure(ptr);\n'
+ yield ' }\n'
+ yield ' finally\n'
+ yield ' {\n'
+ yield ' Marshal.FreeHGlobal(ptr);\n'
+ yield ' }\n'
+ yield ' }\n'
+ yield ' }\n'
+
+ yield '}\n'
+
+ @staticmethod
+ def generate_format_file(fmt):
+ """Generate a single frame format C# file"""
+ yield '// Automatically generated frame parser for C#\n'
+ yield f'// Generated by {version} at {time.asctime()}.\n\n'
+ yield 'using System;\n'
+ yield 'using System.Collections.Generic;\n\n'
+ yield 'namespace StructFrame\n'
+ yield '{\n'
+
+ # Generate the frame format class
+ yield from FrameParserCSharpGen.generate_format(fmt)
+
+ yield '}\n'
+
+ @staticmethod
+ def generate_main(formats):
+ """Generate the main FrameParsers.cs file with the frame format enum"""
+ yield '// Automatically generated frame parsers for C#\n'
+ yield f'// Generated by {version} at {time.asctime()}.\n\n'
+ yield 'namespace StructFrame\n'
+ yield '{\n'
+
+ # Generate frame format enum
+ yield ' /// \n'
+ yield ' /// Frame format type enumeration\n'
+ yield ' /// \n'
+ yield ' public enum FrameFormatType\n'
+ yield ' {\n'
+ for i, fmt in enumerate(formats):
+ enum_name = camel_to_upper_snake(fmt.name)
+ comma = ',' if i < len(formats) - 1 else ''
+ yield f' {enum_name} = {i}{comma}\n'
+ yield ' }\n'
+
+ yield '}\n'
+
def generate_csharp_frame_parsers(formats):
"""Generate C# frame parser code from frame format definitions"""
return ''.join(FrameParserCSharpGen.generate(formats))
+
+
+def generate_csharp_frame_parsers_multi(formats):
+ """
+ Generate multiple C# files for frame parsers.
+
+ Returns a dictionary mapping filename to content:
+ - FrameBase.cs: Base utilities (FrameParseResult, FrameFormatBase, StructHelper)
+ - {PascalName}.cs: Individual frame format files
+ - FrameParsers.cs: Main file that includes all parsers
+ """
+ files = {}
+
+ # Generate base file with FrameParseResult, FrameFormatBase, StructHelper
+ files['FrameBase.cs'] = ''.join(FrameParserCSharpGen.generate_base())
+
+ # Generate individual frame format files
+ for fmt in formats:
+ pascal_name = fmt.name # Already PascalCase
+ files[f'{pascal_name}.cs'] = ''.join(FrameParserCSharpGen.generate_format_file(fmt))
+
+ # Generate main file that includes frame format enum
+ files['FrameParsers.cs'] = ''.join(FrameParserCSharpGen.generate_main(formats))
+
+ return files
diff --git a/src/struct_frame/generate_boilerplate.py b/src/struct_frame/generate_boilerplate.py
index 15e3c3c4..9281e501 100644
--- a/src/struct_frame/generate_boilerplate.py
+++ b/src/struct_frame/generate_boilerplate.py
@@ -37,6 +37,7 @@
from struct_frame.frame_parser_ts_gen import (generate_ts_frame_parsers, generate_js_frame_parsers,
generate_ts_frame_parsers_multi, generate_js_frame_parsers_multi)
from struct_frame.frame_parser_cpp_gen import generate_cpp_frame_parsers, generate_cpp_frame_parsers_multi
+from struct_frame.frame_parser_csharp_gen import generate_csharp_frame_parsers, generate_csharp_frame_parsers_multi
def get_default_frame_formats_path():
@@ -63,7 +64,7 @@ def write_file(path, content):
def generate_boilerplate_to_paths(frame_formats_file, c_path=None, ts_path=None,
js_path=None, py_path=None, cpp_path=None,
- multi_file=True):
+ csharp_path=None, multi_file=True):
"""
Generate frame parser boilerplate code from a frame_formats.proto file.
@@ -74,6 +75,7 @@ def generate_boilerplate_to_paths(frame_formats_file, c_path=None, ts_path=None,
js_path: Output directory for JavaScript code (if None, skip JS generation)
py_path: Output directory for Python code (if None, skip Python generation)
cpp_path: Output directory for C++ code (if None, skip C++ generation)
+ csharp_path: Output directory for C# code (if None, skip C# generation)
multi_file: If True, generate multiple files per language (default: True)
Returns:
@@ -127,6 +129,15 @@ def generate_boilerplate_to_paths(frame_formats_file, c_path=None, ts_path=None,
name = os.path.join(cpp_path, "frame_parsers_gen.hpp")
files[name] = generate_cpp_frame_parsers(formats)
+ if csharp_path:
+ if multi_file:
+ csharp_files = generate_csharp_frame_parsers_multi(formats)
+ for filename, content in csharp_files.items():
+ files[os.path.join(csharp_path, filename)] = content
+ else:
+ name = os.path.join(csharp_path, "FrameParsersGen.cs")
+ files[name] = generate_csharp_frame_parsers(formats)
+
return files
@@ -155,7 +166,8 @@ def update_src_boilerplate():
ts_path=os.path.join(boilerplate_dir, 'ts'),
js_path=os.path.join(boilerplate_dir, 'js'),
py_path=os.path.join(boilerplate_dir, 'py'),
- cpp_path=os.path.join(boilerplate_dir, 'cpp')
+ cpp_path=os.path.join(boilerplate_dir, 'cpp'),
+ csharp_path=os.path.join(boilerplate_dir, 'csharp')
)
for path, content in files.items():
@@ -179,9 +191,9 @@ def generate_to_custom_paths(args):
return False
# Check that at least one output path is specified
- if not any([args.c_path, args.ts_path, args.js_path, args.py_path, args.cpp_path]):
+ if not any([args.c_path, args.ts_path, args.js_path, args.py_path, args.cpp_path, args.csharp_path]):
print("Error: At least one output path must be specified")
- print("Use --c_path, --ts_path, --js_path, --py_path, or --cpp_path")
+ print("Use --c_path, --ts_path, --js_path, --py_path, --cpp_path, or --csharp_path")
return False
print(f"Generating boilerplate from: {frame_formats_file}")
@@ -192,7 +204,8 @@ def generate_to_custom_paths(args):
ts_path=args.ts_path[0] if args.ts_path else None,
js_path=args.js_path[0] if args.js_path else None,
py_path=args.py_path[0] if args.py_path else None,
- cpp_path=args.cpp_path[0] if args.cpp_path else None
+ cpp_path=args.cpp_path[0] if args.cpp_path else None,
+ csharp_path=args.csharp_path[0] if args.csharp_path else None
)
for path, content in files.items():
@@ -218,7 +231,7 @@ def main():
# Generate boilerplate for all languages
python generate_boilerplate.py --frame_formats my_formats.proto \\
--c_path output/c --ts_path output/ts --js_path output/js \\
- --py_path output/py --cpp_path output/cpp
+ --py_path output/py --cpp_path output/cpp --csharp_path output/csharp
"""
)
@@ -244,6 +257,9 @@ def main():
parser.add_argument('--cpp_path', nargs=1, type=str,
help='Output directory for C++ frame parser code')
+ parser.add_argument('--csharp_path', nargs=1, type=str,
+ help='Output directory for C# frame parser code')
+
args = parser.parse_args()
# If --update-src is specified, update the boilerplate in the src folder
From e991fa577488b037201c83f893fcce97caa2ac8d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 01:15:21 +0000
Subject: [PATCH 6/6] Fix LengthBytes reference for frame parsers without
length field
Co-authored-by: rijesha <7819200+rijesha@users.noreply.github.com>
---
src/struct_frame/boilerplate/c/basic_default.h | 2 +-
src/struct_frame/boilerplate/c/basic_extended.h | 2 +-
src/struct_frame/boilerplate/c/basic_extended_length.h | 2 +-
src/struct_frame/boilerplate/c/basic_extended_msg_ids.h | 2 +-
.../boilerplate/c/basic_extended_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/basic_minimal.h | 2 +-
src/struct_frame/boilerplate/c/basic_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/basic_seq.h | 2 +-
src/struct_frame/boilerplate/c/basic_sys_comp.h | 2 +-
src/struct_frame/boilerplate/c/frame_base.h | 2 +-
src/struct_frame/boilerplate/c/frame_format_config.h | 2 +-
src/struct_frame/boilerplate/c/frame_parsers.h | 2 +-
src/struct_frame/boilerplate/c/mavlink_v1_frame.h | 2 +-
src/struct_frame/boilerplate/c/mavlink_v2_frame.h | 2 +-
src/struct_frame/boilerplate/c/tiny_default.h | 2 +-
src/struct_frame/boilerplate/c/tiny_extended.h | 2 +-
src/struct_frame/boilerplate/c/tiny_extended_length.h | 2 +-
src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h | 2 +-
.../boilerplate/c/tiny_extended_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/tiny_minimal.h | 2 +-
src/struct_frame/boilerplate/c/tiny_multi_system_stream.h | 2 +-
src/struct_frame/boilerplate/c/tiny_seq.h | 2 +-
src/struct_frame/boilerplate/c/tiny_sys_comp.h | 2 +-
src/struct_frame/boilerplate/c/ubx_frame.h | 2 +-
src/struct_frame/boilerplate/cpp/BasicDefault.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicExtended.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp | 2 +-
.../boilerplate/cpp/BasicExtendedMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicMinimal.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicSeq.hpp | 2 +-
src/struct_frame/boilerplate/cpp/BasicSysComp.hpp | 2 +-
src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp | 2 +-
src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp | 2 +-
src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyDefault.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyExtended.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp | 2 +-
.../boilerplate/cpp/TinyExtendedMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyMinimal.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinySeq.hpp | 2 +-
src/struct_frame/boilerplate/cpp/TinySysComp.hpp | 2 +-
src/struct_frame/boilerplate/cpp/UbxFrame.hpp | 2 +-
src/struct_frame/boilerplate/cpp/frame_base.hpp | 2 +-
src/struct_frame/boilerplate/cpp/frame_parsers.hpp | 2 +-
src/struct_frame/boilerplate/csharp/BasicDefault.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicExtended.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs | 2 +-
.../boilerplate/csharp/BasicExtendedMultiSystemStream.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicMinimal.cs | 2 +-
.../boilerplate/csharp/BasicMultiSystemStream.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicSeq.cs | 2 +-
src/struct_frame/boilerplate/csharp/BasicSysComp.cs | 2 +-
src/struct_frame/boilerplate/csharp/FrameBase.cs | 2 +-
src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs | 4 ++--
src/struct_frame/boilerplate/csharp/FrameParsers.cs | 2 +-
src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs | 2 +-
src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyDefault.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyExtended.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs | 2 +-
.../boilerplate/csharp/TinyExtendedMultiSystemStream.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyMinimal.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinySeq.cs | 2 +-
src/struct_frame/boilerplate/csharp/TinySysComp.cs | 2 +-
src/struct_frame/boilerplate/csharp/UbxFrame.cs | 2 +-
src/struct_frame/boilerplate/js/BasicDefault.js | 2 +-
src/struct_frame/boilerplate/js/BasicExtended.js | 2 +-
src/struct_frame/boilerplate/js/BasicExtendedLength.js | 2 +-
src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js | 2 +-
.../boilerplate/js/BasicExtendedMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/BasicMinimal.js | 2 +-
src/struct_frame/boilerplate/js/BasicMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/BasicSeq.js | 2 +-
src/struct_frame/boilerplate/js/BasicSysComp.js | 2 +-
src/struct_frame/boilerplate/js/FrameFormatConfig.js | 2 +-
src/struct_frame/boilerplate/js/MavlinkV1Frame.js | 2 +-
src/struct_frame/boilerplate/js/MavlinkV2Frame.js | 2 +-
src/struct_frame/boilerplate/js/TinyDefault.js | 2 +-
src/struct_frame/boilerplate/js/TinyExtended.js | 2 +-
src/struct_frame/boilerplate/js/TinyExtendedLength.js | 2 +-
src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js | 2 +-
.../boilerplate/js/TinyExtendedMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/TinyMinimal.js | 2 +-
src/struct_frame/boilerplate/js/TinyMultiSystemStream.js | 2 +-
src/struct_frame/boilerplate/js/TinySeq.js | 2 +-
src/struct_frame/boilerplate/js/TinySysComp.js | 2 +-
src/struct_frame/boilerplate/js/UbxFrame.js | 2 +-
src/struct_frame/boilerplate/js/frame_base.js | 2 +-
src/struct_frame/boilerplate/js/index.js | 2 +-
src/struct_frame/boilerplate/py/__init__.py | 2 +-
src/struct_frame/boilerplate/py/basic_default.py | 2 +-
src/struct_frame/boilerplate/py/basic_extended.py | 2 +-
src/struct_frame/boilerplate/py/basic_extended_length.py | 2 +-
src/struct_frame/boilerplate/py/basic_extended_msg_ids.py | 2 +-
.../boilerplate/py/basic_extended_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/basic_minimal.py | 2 +-
src/struct_frame/boilerplate/py/basic_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/basic_seq.py | 2 +-
src/struct_frame/boilerplate/py/basic_sys_comp.py | 2 +-
src/struct_frame/boilerplate/py/frame_base.py | 2 +-
src/struct_frame/boilerplate/py/frame_format_config.py | 2 +-
src/struct_frame/boilerplate/py/mavlink_v1_frame.py | 2 +-
src/struct_frame/boilerplate/py/mavlink_v2_frame.py | 2 +-
src/struct_frame/boilerplate/py/tiny_default.py | 2 +-
src/struct_frame/boilerplate/py/tiny_extended.py | 2 +-
src/struct_frame/boilerplate/py/tiny_extended_length.py | 2 +-
src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py | 2 +-
.../boilerplate/py/tiny_extended_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/tiny_minimal.py | 2 +-
src/struct_frame/boilerplate/py/tiny_multi_system_stream.py | 2 +-
src/struct_frame/boilerplate/py/tiny_seq.py | 2 +-
src/struct_frame/boilerplate/py/tiny_sys_comp.py | 2 +-
src/struct_frame/boilerplate/py/ubx_frame.py | 2 +-
src/struct_frame/boilerplate/ts/BasicDefault.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicExtended.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicExtendedLength.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts | 2 +-
.../boilerplate/ts/BasicExtendedMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicMinimal.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicSeq.ts | 2 +-
src/struct_frame/boilerplate/ts/BasicSysComp.ts | 2 +-
src/struct_frame/boilerplate/ts/FrameFormatConfig.ts | 2 +-
src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts | 2 +-
src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyDefault.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyExtended.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyExtendedLength.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts | 2 +-
.../boilerplate/ts/TinyExtendedMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyMinimal.ts | 2 +-
src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts | 2 +-
src/struct_frame/boilerplate/ts/TinySeq.ts | 2 +-
src/struct_frame/boilerplate/ts/TinySysComp.ts | 2 +-
src/struct_frame/boilerplate/ts/UbxFrame.ts | 2 +-
src/struct_frame/boilerplate/ts/frame_base.ts | 2 +-
src/struct_frame/boilerplate/ts/index.ts | 2 +-
src/struct_frame/frame_parser_csharp_gen.py | 5 ++++-
145 files changed, 149 insertions(+), 146 deletions(-)
diff --git a/src/struct_frame/boilerplate/c/basic_default.h b/src/struct_frame/boilerplate/c/basic_default.h
index 38829ae2..15d05c08 100644
--- a/src/struct_frame/boilerplate/c/basic_default.h
+++ b/src/struct_frame/boilerplate/c/basic_default.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended.h b/src/struct_frame/boilerplate/c/basic_extended.h
index 80982b00..a388f8a8 100644
--- a/src/struct_frame/boilerplate/c/basic_extended.h
+++ b/src/struct_frame/boilerplate/c/basic_extended.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_length.h b/src/struct_frame/boilerplate/c/basic_extended_length.h
index 65e1af2c..cfb71fd7 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_length.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_length.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h b/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
index cd0e3e07..8a11a7a2 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_msg_ids.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h b/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
index 3106e1c2..6ca612e7 100644
--- a/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/basic_extended_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_minimal.h b/src/struct_frame/boilerplate/c/basic_minimal.h
index 59241e6f..a8964ae7 100644
--- a/src/struct_frame/boilerplate/c/basic_minimal.h
+++ b/src/struct_frame/boilerplate/c/basic_minimal.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_multi_system_stream.h b/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
index 3ba91530..9df9fbc7 100644
--- a/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/basic_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_seq.h b/src/struct_frame/boilerplate/c/basic_seq.h
index 1bd21f66..9dcb2e31 100644
--- a/src/struct_frame/boilerplate/c/basic_seq.h
+++ b/src/struct_frame/boilerplate/c/basic_seq.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/basic_sys_comp.h b/src/struct_frame/boilerplate/c/basic_sys_comp.h
index de779814..897255dd 100644
--- a/src/struct_frame/boilerplate/c/basic_sys_comp.h
+++ b/src/struct_frame/boilerplate/c/basic_sys_comp.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_base.h b/src/struct_frame/boilerplate/c/frame_base.h
index d5834fd1..39787730 100644
--- a/src/struct_frame/boilerplate/c/frame_base.h
+++ b/src/struct_frame/boilerplate/c/frame_base.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser base utilities */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_format_config.h b/src/struct_frame/boilerplate/c/frame_format_config.h
index ab5e11fe..5ef639de 100644
--- a/src/struct_frame/boilerplate/c/frame_format_config.h
+++ b/src/struct_frame/boilerplate/c/frame_format_config.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/frame_parsers.h b/src/struct_frame/boilerplate/c/frame_parsers.h
index 6f93f45c..3f2b4cc1 100644
--- a/src/struct_frame/boilerplate/c/frame_parsers.h
+++ b/src/struct_frame/boilerplate/c/frame_parsers.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser main header */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/mavlink_v1_frame.h b/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
index f41e0f6a..0acaa100 100644
--- a/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
+++ b/src/struct_frame/boilerplate/c/mavlink_v1_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/mavlink_v2_frame.h b/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
index 1215aba0..6e4858a0 100644
--- a/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
+++ b/src/struct_frame/boilerplate/c/mavlink_v2_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_default.h b/src/struct_frame/boilerplate/c/tiny_default.h
index 21710cb1..02946fa7 100644
--- a/src/struct_frame/boilerplate/c/tiny_default.h
+++ b/src/struct_frame/boilerplate/c/tiny_default.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended.h b/src/struct_frame/boilerplate/c/tiny_extended.h
index d1446e81..9765442b 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_length.h b/src/struct_frame/boilerplate/c/tiny_extended_length.h
index 0f398976..0838b73d 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_length.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_length.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h b/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
index dd7ea808..4b3b79a7 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_msg_ids.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h b/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
index 59c52a96..c69f4919 100644
--- a/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/tiny_extended_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_minimal.h b/src/struct_frame/boilerplate/c/tiny_minimal.h
index 1477885a..e5b5b298 100644
--- a/src/struct_frame/boilerplate/c/tiny_minimal.h
+++ b/src/struct_frame/boilerplate/c/tiny_minimal.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h b/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
index 74da5b27..37c8ada1 100644
--- a/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
+++ b/src/struct_frame/boilerplate/c/tiny_multi_system_stream.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_seq.h b/src/struct_frame/boilerplate/c/tiny_seq.h
index 1dc12075..5e5237ec 100644
--- a/src/struct_frame/boilerplate/c/tiny_seq.h
+++ b/src/struct_frame/boilerplate/c/tiny_seq.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/tiny_sys_comp.h b/src/struct_frame/boilerplate/c/tiny_sys_comp.h
index c7e4fc65..1ac54415 100644
--- a/src/struct_frame/boilerplate/c/tiny_sys_comp.h
+++ b/src/struct_frame/boilerplate/c/tiny_sys_comp.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/c/ubx_frame.h b/src/struct_frame/boilerplate/c/ubx_frame.h
index e5a26370..5869d9ab 100644
--- a/src/struct_frame/boilerplate/c/ubx_frame.h
+++ b/src/struct_frame/boilerplate/c/ubx_frame.h
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicDefault.hpp b/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
index 90314981..99c65ea8 100644
--- a/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicDefault.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtended.hpp b/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
index 867a4c33..0e4dfcf8 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtended.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
index 0181ec8c..3f4f570c 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedLength.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
index 61e09cf8..7c4c2f30 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedMsgIds.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
index 26ef45ab..b93c3781 100644
--- a/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicExtendedMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp b/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
index 36955311..3b9e95ae 100644
--- a/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicMinimal.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
index f036abec..76975be8 100644
--- a/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicSeq.hpp b/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
index 6a527c4b..86e89172 100644
--- a/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicSeq.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp b/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
index d69d9754..1652e57a 100644
--- a/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
+++ b/src/struct_frame/boilerplate/cpp/BasicSysComp.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp b/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
index 48d13f2c..00d08603 100644
--- a/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
+++ b/src/struct_frame/boilerplate/cpp/FrameFormatConfig.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp b/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
index a983981e..f8523265 100644
--- a/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
+++ b/src/struct_frame/boilerplate/cpp/MavlinkV1Frame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp b/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
index b154d9f7..ef95875a 100644
--- a/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
+++ b/src/struct_frame/boilerplate/cpp/MavlinkV2Frame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyDefault.hpp b/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
index a9acf121..c2527742 100644
--- a/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyDefault.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtended.hpp b/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
index 1736dec9..85bbefc6 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtended.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
index c284eb16..d60a4c1a 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedLength.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
index ad4ffe22..50498540 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedMsgIds.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
index 6fb2c0e9..c89d6ee7 100644
--- a/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyExtendedMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp b/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
index 018110e0..015787bd 100644
--- a/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyMinimal.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp b/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
index 0394f92c..a6a01e04 100644
--- a/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinyMultiSystemStream.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinySeq.hpp b/src/struct_frame/boilerplate/cpp/TinySeq.hpp
index a2f18e71..41663edb 100644
--- a/src/struct_frame/boilerplate/cpp/TinySeq.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinySeq.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/TinySysComp.hpp b/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
index 836e5fd7..bb245598 100644
--- a/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
+++ b/src/struct_frame/boilerplate/cpp/TinySysComp.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/UbxFrame.hpp b/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
index cd2cd225..efe1c410 100644
--- a/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
+++ b/src/struct_frame/boilerplate/cpp/UbxFrame.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/frame_base.hpp b/src/struct_frame/boilerplate/cpp/frame_base.hpp
index 1a22df87..1c6d4e1e 100644
--- a/src/struct_frame/boilerplate/cpp/frame_base.hpp
+++ b/src/struct_frame/boilerplate/cpp/frame_base.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser base utilities */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/cpp/frame_parsers.hpp b/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
index ae06d603..9032efe9 100644
--- a/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
+++ b/src/struct_frame/boilerplate/cpp/frame_parsers.hpp
@@ -1,5 +1,5 @@
/* Automatically generated frame parser main header */
-/* Generated by 0.0.1 at Fri Dec 5 01:11:47 2025. */
+/* Generated by 0.0.1 at Fri Dec 5 01:14:49 2025. */
#pragma once
diff --git a/src/struct_frame/boilerplate/csharp/BasicDefault.cs b/src/struct_frame/boilerplate/csharp/BasicDefault.cs
index 7fa0b249..c3fb8431 100644
--- a/src/struct_frame/boilerplate/csharp/BasicDefault.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicDefault.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtended.cs b/src/struct_frame/boilerplate/csharp/BasicExtended.cs
index 30642dda..a6f8cf80 100644
--- a/src/struct_frame/boilerplate/csharp/BasicExtended.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicExtended.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
index 846cb016..5332769b 100644
--- a/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedLength.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
index c3af9074..39c1018f 100644
--- a/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedMsgIds.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
index fca7b63e..e2310887 100644
--- a/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicExtendedMultiSystemStream.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicMinimal.cs b/src/struct_frame/boilerplate/csharp/BasicMinimal.cs
index af7618d4..b8e0dd12 100644
--- a/src/struct_frame/boilerplate/csharp/BasicMinimal.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicMinimal.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
index 4c09c95a..20516901 100644
--- a/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicMultiSystemStream.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicSeq.cs b/src/struct_frame/boilerplate/csharp/BasicSeq.cs
index 3ee3c122..5b0afb2b 100644
--- a/src/struct_frame/boilerplate/csharp/BasicSeq.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicSeq.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/BasicSysComp.cs b/src/struct_frame/boilerplate/csharp/BasicSysComp.cs
index bb1b70b4..75b3f70a 100644
--- a/src/struct_frame/boilerplate/csharp/BasicSysComp.cs
+++ b/src/struct_frame/boilerplate/csharp/BasicSysComp.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/FrameBase.cs b/src/struct_frame/boilerplate/csharp/FrameBase.cs
index b44b716e..d04a8974 100644
--- a/src/struct_frame/boilerplate/csharp/FrameBase.cs
+++ b/src/struct_frame/boilerplate/csharp/FrameBase.cs
@@ -1,5 +1,5 @@
// Automatically generated frame base for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
// This file provides base utilities for struct frame parsing and encoding
using System;
diff --git a/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs b/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
index 58014098..24ce5454 100644
--- a/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
+++ b/src/struct_frame/boilerplate/csharp/FrameFormatConfig.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
@@ -164,7 +164,7 @@ public override FrameParseResult ValidatePacket(byte[] data, int length)
return result;
int msgLength = length - Overhead;
- int crcDataLen = msgLength + 1 + LengthBytes;
+ int crcDataLen = msgLength + 1;
var ck = FletcherChecksum(data, 2, 2 + crcDataLen);
if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])
diff --git a/src/struct_frame/boilerplate/csharp/FrameParsers.cs b/src/struct_frame/boilerplate/csharp/FrameParsers.cs
index 83e29865..67a086b0 100644
--- a/src/struct_frame/boilerplate/csharp/FrameParsers.cs
+++ b/src/struct_frame/boilerplate/csharp/FrameParsers.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parsers for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
namespace StructFrame
{
diff --git a/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs b/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
index 78eacd6a..9a7e7be2 100644
--- a/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
+++ b/src/struct_frame/boilerplate/csharp/MavlinkV1Frame.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs b/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
index 0fd6a4e8..18daa1bc 100644
--- a/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
+++ b/src/struct_frame/boilerplate/csharp/MavlinkV2Frame.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyDefault.cs b/src/struct_frame/boilerplate/csharp/TinyDefault.cs
index 57e69c2d..e4512786 100644
--- a/src/struct_frame/boilerplate/csharp/TinyDefault.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyDefault.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtended.cs b/src/struct_frame/boilerplate/csharp/TinyExtended.cs
index ba19f381..8feab0ba 100644
--- a/src/struct_frame/boilerplate/csharp/TinyExtended.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyExtended.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
index 54711c58..5af47301 100644
--- a/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedLength.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
index d8b0a3c8..5f2d8ac4 100644
--- a/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedMsgIds.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
index 0a70d051..5be2c5a6 100644
--- a/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyExtendedMultiSystemStream.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyMinimal.cs b/src/struct_frame/boilerplate/csharp/TinyMinimal.cs
index 21f2889f..167185e4 100644
--- a/src/struct_frame/boilerplate/csharp/TinyMinimal.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyMinimal.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs b/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
index ec759fca..bb9056d6 100644
--- a/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
+++ b/src/struct_frame/boilerplate/csharp/TinyMultiSystemStream.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinySeq.cs b/src/struct_frame/boilerplate/csharp/TinySeq.cs
index 3598dc0d..6df13902 100644
--- a/src/struct_frame/boilerplate/csharp/TinySeq.cs
+++ b/src/struct_frame/boilerplate/csharp/TinySeq.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/TinySysComp.cs b/src/struct_frame/boilerplate/csharp/TinySysComp.cs
index a32f48bb..65deafc2 100644
--- a/src/struct_frame/boilerplate/csharp/TinySysComp.cs
+++ b/src/struct_frame/boilerplate/csharp/TinySysComp.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/csharp/UbxFrame.cs b/src/struct_frame/boilerplate/csharp/UbxFrame.cs
index d3e74d89..dc615b4b 100644
--- a/src/struct_frame/boilerplate/csharp/UbxFrame.cs
+++ b/src/struct_frame/boilerplate/csharp/UbxFrame.cs
@@ -1,5 +1,5 @@
// Automatically generated frame parser for C#
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
using System;
using System.Collections.Generic;
diff --git a/src/struct_frame/boilerplate/js/BasicDefault.js b/src/struct_frame/boilerplate/js/BasicDefault.js
index a46baf6d..e0a1048e 100644
--- a/src/struct_frame/boilerplate/js/BasicDefault.js
+++ b/src/struct_frame/boilerplate/js/BasicDefault.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtended.js b/src/struct_frame/boilerplate/js/BasicExtended.js
index 652a421e..46ec6c20 100644
--- a/src/struct_frame/boilerplate/js/BasicExtended.js
+++ b/src/struct_frame/boilerplate/js/BasicExtended.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedLength.js b/src/struct_frame/boilerplate/js/BasicExtendedLength.js
index fe10afb5..0bcc57bc 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedLength.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedLength.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js b/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
index fb8405cb..2abfeb1b 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedMsgIds.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js b/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
index 42f12613..31adfffd 100644
--- a/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/BasicExtendedMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicMinimal.js b/src/struct_frame/boilerplate/js/BasicMinimal.js
index 292898a2..b1824fcf 100644
--- a/src/struct_frame/boilerplate/js/BasicMinimal.js
+++ b/src/struct_frame/boilerplate/js/BasicMinimal.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js b/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
index 0398025a..41004d20 100644
--- a/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/BasicMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicSeq.js b/src/struct_frame/boilerplate/js/BasicSeq.js
index 828c442b..6919a7c1 100644
--- a/src/struct_frame/boilerplate/js/BasicSeq.js
+++ b/src/struct_frame/boilerplate/js/BasicSeq.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/BasicSysComp.js b/src/struct_frame/boilerplate/js/BasicSysComp.js
index 3fbaebe2..8088ea94 100644
--- a/src/struct_frame/boilerplate/js/BasicSysComp.js
+++ b/src/struct_frame/boilerplate/js/BasicSysComp.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/FrameFormatConfig.js b/src/struct_frame/boilerplate/js/FrameFormatConfig.js
index b46f8823..c1008716 100644
--- a/src/struct_frame/boilerplate/js/FrameFormatConfig.js
+++ b/src/struct_frame/boilerplate/js/FrameFormatConfig.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/MavlinkV1Frame.js b/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
index cb46180b..e954e3bf 100644
--- a/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
+++ b/src/struct_frame/boilerplate/js/MavlinkV1Frame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/MavlinkV2Frame.js b/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
index a40790f1..f434a3b0 100644
--- a/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
+++ b/src/struct_frame/boilerplate/js/MavlinkV2Frame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyDefault.js b/src/struct_frame/boilerplate/js/TinyDefault.js
index 1b676d3a..b43fbb74 100644
--- a/src/struct_frame/boilerplate/js/TinyDefault.js
+++ b/src/struct_frame/boilerplate/js/TinyDefault.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtended.js b/src/struct_frame/boilerplate/js/TinyExtended.js
index 61cbe98d..ca872415 100644
--- a/src/struct_frame/boilerplate/js/TinyExtended.js
+++ b/src/struct_frame/boilerplate/js/TinyExtended.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedLength.js b/src/struct_frame/boilerplate/js/TinyExtendedLength.js
index efac9a15..e18572f1 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedLength.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedLength.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js b/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
index add38064..122318ce 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedMsgIds.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js b/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
index f5b017f8..5858249b 100644
--- a/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/TinyExtendedMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyMinimal.js b/src/struct_frame/boilerplate/js/TinyMinimal.js
index 3d73a8db..2c297f28 100644
--- a/src/struct_frame/boilerplate/js/TinyMinimal.js
+++ b/src/struct_frame/boilerplate/js/TinyMinimal.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js b/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
index bc875e96..66f3ceb4 100644
--- a/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
+++ b/src/struct_frame/boilerplate/js/TinyMultiSystemStream.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinySeq.js b/src/struct_frame/boilerplate/js/TinySeq.js
index 80896e22..dabc1771 100644
--- a/src/struct_frame/boilerplate/js/TinySeq.js
+++ b/src/struct_frame/boilerplate/js/TinySeq.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/TinySysComp.js b/src/struct_frame/boilerplate/js/TinySysComp.js
index 406809ff..0d260d26 100644
--- a/src/struct_frame/boilerplate/js/TinySysComp.js
+++ b/src/struct_frame/boilerplate/js/TinySysComp.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/UbxFrame.js b/src/struct_frame/boilerplate/js/UbxFrame.js
index 4b53731c..d5be22d2 100644
--- a/src/struct_frame/boilerplate/js/UbxFrame.js
+++ b/src/struct_frame/boilerplate/js/UbxFrame.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
const {
createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/js/frame_base.js b/src/struct_frame/boilerplate/js/frame_base.js
index fc2ea0f3..9567d584 100644
--- a/src/struct_frame/boilerplate/js/frame_base.js
+++ b/src/struct_frame/boilerplate/js/frame_base.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser base utilities
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
// Frame format type enumeration
const FrameFormatType = {
diff --git a/src/struct_frame/boilerplate/js/index.js b/src/struct_frame/boilerplate/js/index.js
index ed76c8f0..b55cf3c3 100644
--- a/src/struct_frame/boilerplate/js/index.js
+++ b/src/struct_frame/boilerplate/js/index.js
@@ -1,5 +1,5 @@
// Automatically generated frame parser package
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
// Base utilities
const frameBase = require('./frame_base');
diff --git a/src/struct_frame/boilerplate/py/__init__.py b/src/struct_frame/boilerplate/py/__init__.py
index 649a6e51..5476ff92 100644
--- a/src/struct_frame/boilerplate/py/__init__.py
+++ b/src/struct_frame/boilerplate/py/__init__.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser package
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
# Base utilities and generic parser infrastructure
from .frame_base import (
diff --git a/src/struct_frame/boilerplate/py/basic_default.py b/src/struct_frame/boilerplate/py/basic_default.py
index 9ce890c7..dcc3a89c 100644
--- a/src/struct_frame/boilerplate/py/basic_default.py
+++ b/src/struct_frame/boilerplate/py/basic_default.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended.py b/src/struct_frame/boilerplate/py/basic_extended.py
index 035009b4..aeee5c88 100644
--- a/src/struct_frame/boilerplate/py/basic_extended.py
+++ b/src/struct_frame/boilerplate/py/basic_extended.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_length.py b/src/struct_frame/boilerplate/py/basic_extended_length.py
index ecf1a0bf..5280255f 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_length.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_length.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py b/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
index 1b92f07f..77d0b377 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_msg_ids.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py b/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
index 8ac828e2..02c8fe55 100644
--- a/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/basic_extended_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_minimal.py b/src/struct_frame/boilerplate/py/basic_minimal.py
index f408648e..f4572d06 100644
--- a/src/struct_frame/boilerplate/py/basic_minimal.py
+++ b/src/struct_frame/boilerplate/py/basic_minimal.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_multi_system_stream.py b/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
index bd024a5c..61eb0bf1 100644
--- a/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/basic_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_seq.py b/src/struct_frame/boilerplate/py/basic_seq.py
index 5dcafbef..58aec598 100644
--- a/src/struct_frame/boilerplate/py/basic_seq.py
+++ b/src/struct_frame/boilerplate/py/basic_seq.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/basic_sys_comp.py b/src/struct_frame/boilerplate/py/basic_sys_comp.py
index 0fd187a5..1285f982 100644
--- a/src/struct_frame/boilerplate/py/basic_sys_comp.py
+++ b/src/struct_frame/boilerplate/py/basic_sys_comp.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/frame_base.py b/src/struct_frame/boilerplate/py/frame_base.py
index 6ab50d68..313e0607 100644
--- a/src/struct_frame/boilerplate/py/frame_base.py
+++ b/src/struct_frame/boilerplate/py/frame_base.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser base utilities
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from enum import Enum
from typing import Callable, List, Tuple, Union
diff --git a/src/struct_frame/boilerplate/py/frame_format_config.py b/src/struct_frame/boilerplate/py/frame_format_config.py
index 8f65c025..6b9e80fe 100644
--- a/src/struct_frame/boilerplate/py/frame_format_config.py
+++ b/src/struct_frame/boilerplate/py/frame_format_config.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/mavlink_v1_frame.py b/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
index fcb96210..862391a7 100644
--- a/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
+++ b/src/struct_frame/boilerplate/py/mavlink_v1_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/mavlink_v2_frame.py b/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
index 4f7bf4d4..8fa234b8 100644
--- a/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
+++ b/src/struct_frame/boilerplate/py/mavlink_v2_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_default.py b/src/struct_frame/boilerplate/py/tiny_default.py
index 4215a8e3..f1bea2c5 100644
--- a/src/struct_frame/boilerplate/py/tiny_default.py
+++ b/src/struct_frame/boilerplate/py/tiny_default.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended.py b/src/struct_frame/boilerplate/py/tiny_extended.py
index c438eb81..1556bfab 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_length.py b/src/struct_frame/boilerplate/py/tiny_extended_length.py
index 0c325963..c7470a3d 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_length.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_length.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py b/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
index 8c4bacdf..2d8bc4a4 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_msg_ids.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py b/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
index 2d409848..c9c4503d 100644
--- a/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/tiny_extended_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_minimal.py b/src/struct_frame/boilerplate/py/tiny_minimal.py
index 61b44389..aaafdb3a 100644
--- a/src/struct_frame/boilerplate/py/tiny_minimal.py
+++ b/src/struct_frame/boilerplate/py/tiny_minimal.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py b/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
index 8db3787a..c59a8ad3 100644
--- a/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
+++ b/src/struct_frame/boilerplate/py/tiny_multi_system_stream.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_seq.py b/src/struct_frame/boilerplate/py/tiny_seq.py
index f6ac4c05..abccc4cb 100644
--- a/src/struct_frame/boilerplate/py/tiny_seq.py
+++ b/src/struct_frame/boilerplate/py/tiny_seq.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/tiny_sys_comp.py b/src/struct_frame/boilerplate/py/tiny_sys_comp.py
index 21dbb6e5..fafd0255 100644
--- a/src/struct_frame/boilerplate/py/tiny_sys_comp.py
+++ b/src/struct_frame/boilerplate/py/tiny_sys_comp.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/py/ubx_frame.py b/src/struct_frame/boilerplate/py/ubx_frame.py
index a9dd2211..4cdf93e4 100644
--- a/src/struct_frame/boilerplate/py/ubx_frame.py
+++ b/src/struct_frame/boilerplate/py/ubx_frame.py
@@ -1,5 +1,5 @@
# Automatically generated frame parser
-# Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+# Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
from .frame_base import (
FrameParserConfig, create_frame_parser_class, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicDefault.ts b/src/struct_frame/boilerplate/ts/BasicDefault.ts
index e9c651ad..b9c7522e 100644
--- a/src/struct_frame/boilerplate/ts/BasicDefault.ts
+++ b/src/struct_frame/boilerplate/ts/BasicDefault.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtended.ts b/src/struct_frame/boilerplate/ts/BasicExtended.ts
index 5c8bca5e..f26a5b9a 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtended.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtended.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts b/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
index 3a21c757..47108cd3 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedLength.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts b/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
index 7df2dd3f..989bff4f 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedMsgIds.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
index 3df939e5..0c4ae0ad 100644
--- a/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/BasicExtendedMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicMinimal.ts b/src/struct_frame/boilerplate/ts/BasicMinimal.ts
index 0b1af0f4..75fa548a 100644
--- a/src/struct_frame/boilerplate/ts/BasicMinimal.ts
+++ b/src/struct_frame/boilerplate/ts/BasicMinimal.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
index 0b410d4a..f5c6a81e 100644
--- a/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/BasicMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicSeq.ts b/src/struct_frame/boilerplate/ts/BasicSeq.ts
index 916f4240..a5c1d3af 100644
--- a/src/struct_frame/boilerplate/ts/BasicSeq.ts
+++ b/src/struct_frame/boilerplate/ts/BasicSeq.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/BasicSysComp.ts b/src/struct_frame/boilerplate/ts/BasicSysComp.ts
index 8d1904ba..0359c3cf 100644
--- a/src/struct_frame/boilerplate/ts/BasicSysComp.ts
+++ b/src/struct_frame/boilerplate/ts/BasicSysComp.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts b/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
index 5f1367c3..43952caf 100644
--- a/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
+++ b/src/struct_frame/boilerplate/ts/FrameFormatConfig.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts b/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
index 5c31b6c3..33330f84 100644
--- a/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
+++ b/src/struct_frame/boilerplate/ts/MavlinkV1Frame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts b/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
index a2cd2a89..83caeab5 100644
--- a/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
+++ b/src/struct_frame/boilerplate/ts/MavlinkV2Frame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyDefault.ts b/src/struct_frame/boilerplate/ts/TinyDefault.ts
index 205fe7d4..45d8705a 100644
--- a/src/struct_frame/boilerplate/ts/TinyDefault.ts
+++ b/src/struct_frame/boilerplate/ts/TinyDefault.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtended.ts b/src/struct_frame/boilerplate/ts/TinyExtended.ts
index 0f864f19..4d602b54 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtended.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtended.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts b/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
index 2a9ea61f..17e32e19 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedLength.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts b/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
index 40aa8438..5b7c907d 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedMsgIds.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
index 62d5a4cb..099e5e2f 100644
--- a/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/TinyExtendedMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyMinimal.ts b/src/struct_frame/boilerplate/ts/TinyMinimal.ts
index 435d054d..ce4ebaa3 100644
--- a/src/struct_frame/boilerplate/ts/TinyMinimal.ts
+++ b/src/struct_frame/boilerplate/ts/TinyMinimal.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts b/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
index dfa74403..047eef37 100644
--- a/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
+++ b/src/struct_frame/boilerplate/ts/TinyMultiSystemStream.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinySeq.ts b/src/struct_frame/boilerplate/ts/TinySeq.ts
index 3056e3d9..b70ae976 100644
--- a/src/struct_frame/boilerplate/ts/TinySeq.ts
+++ b/src/struct_frame/boilerplate/ts/TinySeq.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/TinySysComp.ts b/src/struct_frame/boilerplate/ts/TinySysComp.ts
index 0b2f7c25..63b4c18b 100644
--- a/src/struct_frame/boilerplate/ts/TinySysComp.ts
+++ b/src/struct_frame/boilerplate/ts/TinySysComp.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/UbxFrame.ts b/src/struct_frame/boilerplate/ts/UbxFrame.ts
index 650be3bc..97101c5a 100644
--- a/src/struct_frame/boilerplate/ts/UbxFrame.ts
+++ b/src/struct_frame/boilerplate/ts/UbxFrame.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
import {
FrameParserConfig, createFrameParserClass, GenericParserState,
diff --git a/src/struct_frame/boilerplate/ts/frame_base.ts b/src/struct_frame/boilerplate/ts/frame_base.ts
index 833d85ce..08bac215 100644
--- a/src/struct_frame/boilerplate/ts/frame_base.ts
+++ b/src/struct_frame/boilerplate/ts/frame_base.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser base utilities
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
// Frame format type enumeration
export enum FrameFormatType {
diff --git a/src/struct_frame/boilerplate/ts/index.ts b/src/struct_frame/boilerplate/ts/index.ts
index 0404435d..74849bd7 100644
--- a/src/struct_frame/boilerplate/ts/index.ts
+++ b/src/struct_frame/boilerplate/ts/index.ts
@@ -1,5 +1,5 @@
// Automatically generated frame parser package
-// Generated by 0.0.1 at Fri Dec 5 01:11:47 2025.
+// Generated by 0.0.1 at Fri Dec 5 01:14:49 2025.
// Base utilities and generic parser infrastructure
export {
diff --git a/src/struct_frame/frame_parser_csharp_gen.py b/src/struct_frame/frame_parser_csharp_gen.py
index 7a5f402c..ff3159f7 100644
--- a/src/struct_frame/frame_parser_csharp_gen.py
+++ b/src/struct_frame/frame_parser_csharp_gen.py
@@ -327,7 +327,10 @@ def generate_format(fmt):
if fmt.has_crc:
yield f' int msgLength = length - Overhead;\n'
- yield f' int crcDataLen = msgLength + 1 + LengthBytes;\n'
+ if fmt.has_length:
+ yield f' int crcDataLen = msgLength + 1 + LengthBytes;\n'
+ else:
+ yield f' int crcDataLen = msgLength + 1;\n'
yield f' var ck = FletcherChecksum(data, {len(fmt.start_bytes)}, {len(fmt.start_bytes)} + crcDataLen);\n\n'
yield f' if (ck.Item1 == data[length - 2] && ck.Item2 == data[length - 1])\n'
yield f' {{\n'