Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ Versioning after 1.0 and uses prerelease versions while conformance is incomplet

## Unreleased

- Added strongly typed SISO-REF-010-2025 v36 enumerations for every DIS v7
schema reference, with .NET-style public names.
- Added structured bitfield value types with validated accessors, immutable
mutation helpers, and preservation of unknown or reserved bits.
- Added a typed Signal encoding scheme API for encoding class, audio type, and
tactical-data-link message count.
- Added deterministic import of the official SISO v36 machine-readable data and
lossless unknown-value compatibility tests.
- Made descriptive PDU names such as `AcknowledgeReliablePdu` canonical and
removed 20 empty acronym-based alias shells from the public model surface.
- Added solution foundation, DIS v7 framing, binary primitives, and defensive
unknown-PDU parsing.
- Added typed Entity State, Fire, and Detonation PDU parsing and serialization.
Expand Down
25 changes: 23 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dotnet add package OpenDisNet

```csharp
using OpenDisNet;
using OpenDisNet.Enumerations;
using OpenDisNet.Pdus;

if (DisSerializer.TryDeserialize<SignalPdu>(datagram, out SignalPdu? signal, out DisParseError error))
Expand Down Expand Up @@ -56,8 +57,8 @@ var signal = new SignalPdu
ExerciseId = 1,
Timestamp = 42,
Radio = new RadioId(new EntityId(1, 10, 42), number: 7),
EncodingScheme = 1,
TdlType = 0,
EncodingScheme = SignalEncodingScheme.EncodedAudio(SignalEncodingType.Opus),
TdlType = SignalTdlType.Other,
SampleRate = 8_000,
SampleCount = 1,
};
Expand All @@ -72,6 +73,26 @@ application because DIS can carry many audio encodings and tactical data-link
formats. For the uncommon case of a non-byte-aligned payload, `SetData` also
accepts an explicit meaningful bit length.

## Typed wire values

Fields defined by SISO-REF-010 v36 use generated enums instead of unexplained
integers. Composite bitfields expose named properties and immutable `With...`
methods while retaining their complete wire value:

```csharp
using OpenDisNet.Enumerations;

signal.TdlType = SignalTdlType.Link16StandardizedFormatJtidsMidsTadilJ;

var behavior = StopFreezeFrozenBehavior.None
.WithRunSimulationClock(true)
.WithProcessUpdates(true);
```

Forward compatibility is lossless. An unrecognized enumeration can be assigned
with a normal enum cast, and unknown or reserved bitfield bits remain available
through `Value`; parsing and reserialization preserve both exactly.

## Standards and provenance

- Wire format target: IEEE Std 1278.1-2012 (DIS v7).
Expand Down
5 changes: 5 additions & 0 deletions THIRD-PARTY-NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,8 @@ OpenDisNet's implementation was independently designed with reference to:

IEEE and SISO specification names are used only to identify interoperability
targets. No endorsement is implied. Specification text is not redistributed.

The generated enumeration API and its compact source catalog are derived from
the SISO-REF-010-2025 v36 machine-readable schema/API data under its general,
royalty-free derivative-works license. “Reprinted with permission from SISO
Inc.” The full SISO documentation is not redistributed.
8 changes: 5 additions & 3 deletions docs/api-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ untrusted network input.
octets are represented. Callers never update a parallel count property.
5. Known records are strongly typed. Standard-defined open or system-specific
payloads use an explicit raw-octet value that round-trips unchanged.
6. Unknown PDU types and vendor data are preserved when their framing is valid.
7. Parsing is bounded, big-endian, deterministic, and independent of reflection.
8. Public APIs do not expose generator metadata, source XML terminology, or
6. SISO-defined values use enums and structured bitfield value types. Unknown
enumeration values and reserved bits always round-trip losslessly.
7. Unknown PDU types and vendor data are preserved when their framing is valid.
8. Parsing is bounded, big-endian, deterministic, and independent of reflection.
9. Public APIs do not expose generator metadata, source XML terminology, or
classes copied from another DIS implementation.

## Compatibility
Expand Down
5 changes: 3 additions & 2 deletions docs/conformance.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@ input tests, and round-trip tests.
- [x] Big-endian integer and IEEE-754 primitives
- [x] Defensive length and version validation
- [x] Unknown/future PDU preservation
- [x] Public protocol models for all 253 reviewed DIS v7 schema classes
- [x] Public protocol models for all 233 concrete DIS v7 wire classes
- [x] Machine-verified catalog of all 72 standardized PDU model types
- [x] Binary dispatch, parsing, and serialization for PDU types 1-72
- [x] Default construction and byte-identical round trip for PDU types 1-72
- [x] Automatic synchronization of list, octet, and bit-length fields
- [x] Populated Signal, Transmitter, Intercom Control, and Minefield Data cases
- [ ] Independent populated vectors for every variable-layout PDU
- [ ] Truncation-at-every-boundary and mutation coverage for every PDU family
- [ ] SISO-REF-010-2025 v36 generated enumerations
- [x] SISO-REF-010-2025 v36 typed enumerations and structured bitfields
- [x] Lossless round trip of unknown enumeration values and reserved bitfield bits

## PDU families

Expand Down
Loading
Loading