CCSDS Command Link Control Word (CLCW) for spacecraft command
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

irmin: value-oriented Heap + Schema + Cursor with 4 backends

+546
+19
test/interop/dariol83/dune
··· 1 + (test 2 + (name test) 3 + (libraries clcw csvt alcotest) 4 + (deps 5 + (source_tree traces) 6 + (source_tree scripts))) 7 + 8 + ; Regenerate traces: REGEN_TRACES=1 dune build @regen-traces 9 + 10 + (rule 11 + (alias regen-traces) 12 + (enabled_if 13 + (= %{env:REGEN_TRACES=0} 1)) 14 + (deps 15 + (source_tree scripts)) 16 + (action 17 + (chdir 18 + scripts 19 + (run bash generate.sh))))
+101
test/interop/dariol83/scripts/generate.java
··· 1 + ///usr/bin/env jbang "$0" "$@" ; exit $? 2 + //DEPS eu.dariolucia.ccsds:eu.dariolucia.ccsds.tmtc:1.0.6 3 + 4 + import eu.dariolucia.ccsds.tmtc.ocf.builder.ClcwBuilder; 5 + import eu.dariolucia.ccsds.tmtc.ocf.pdu.Clcw; 6 + 7 + import java.io.FileWriter; 8 + import java.io.PrintWriter; 9 + import java.nio.file.Path; 10 + import java.nio.file.Paths; 11 + 12 + /** 13 + * Generate CLCW interop traces for ocaml-clcw. 14 + * 15 + * Oracle: dariol83/ccsds (eu.dariolucia.ccsds.tmtc 1.0.6) 16 + * 17 + * Tests CLCW (Command Link Control Word) encoding/decoding per CCSDS 232.0-B-4. 18 + * 19 + * Limitations of the dariol83 API: 20 + * - cwt is always 0 (CLCW type); vectors with cwt=1 are skipped. 21 + * - cop_in_effect is boolean (true=1, false=0); cop=2/3 vectors are skipped. 22 + * - version is always 0. 23 + */ 24 + public class generate { 25 + 26 + record Vector( 27 + String name, int cwt, int version, int status, boolean cop, 28 + int vcid, boolean noRf, boolean noBitLock, 29 + boolean lockout, boolean wait, boolean retransmit, 30 + int farmB, int reportValue 31 + ) {} 32 + 33 + static final Vector[] VECTORS = { 34 + new Vector("all_zeros", 0, 0, 0, false, 0, false, false, false, false, false, 0, 0), 35 + new Vector("typical_operational", 0, 0, 0, true, 1, false, false, false, false, false, 0, 42), 36 + new Vector("no_rf_only", 0, 0, 0, false, 0, true, false, false, false, false, 0, 0), 37 + new Vector("no_bit_lock_only",0, 0, 0, false, 0, false, true, false, false, false, 0, 0), 38 + new Vector("lockout_only", 0, 0, 0, false, 0, false, false, true, false, false, 0, 0), 39 + new Vector("wait_only", 0, 0, 0, false, 0, false, false, false, true, false, 0, 0), 40 + new Vector("retransmit_only", 0, 0, 0, false, 0, false, false, false, false, true, 0, 0), 41 + new Vector("status_ready", 0, 0, 0, false, 10, false, false, false, false, false, 0, 50), 42 + new Vector("status_active", 0, 0, 1, false, 10, false, false, false, false, false, 0, 50), 43 + new Vector("max_vcid", 0, 0, 0, false, 63, false, false, false, false, false, 0, 0), 44 + new Vector("max_report", 0, 0, 0, false, 0, false, false, false, false, false, 0, 255), 45 + new Vector("farm_b_0", 0, 0, 0, false, 0, false, false, false, false, false, 0, 0), 46 + new Vector("farm_b_1", 0, 0, 0, false, 0, false, false, false, false, false, 1, 0), 47 + new Vector("farm_b_2", 0, 0, 0, false, 0, false, false, false, false, false, 2, 0), 48 + new Vector("farm_b_3", 0, 0, 0, false, 0, false, false, false, false, false, 3, 0), 49 + new Vector("cop_0", 0, 0, 0, false, 0, false, false, false, false, false, 0, 0), 50 + new Vector("cop_1", 0, 0, 0, true, 0, false, false, false, false, false, 0, 0), 51 + new Vector("lockout_wait_retransmit", 0, 0, 0, false, 5, false, false, true, true, true, 1, 100), 52 + new Vector("all_flags_max_vcid_max_report", 0, 0, 1, true, 63, true, true, true, true, true, 3, 255), 53 + }; 54 + 55 + public static void main(String[] args) throws Exception { 56 + if (args.length != 1) { 57 + System.err.println("Usage: generate.java <trace-dir>"); 58 + System.exit(1); 59 + } 60 + Path traceDir = Paths.get(args[0]); 61 + traceDir.toFile().mkdirs(); 62 + 63 + try (PrintWriter pw = new PrintWriter(new FileWriter( 64 + traceDir.resolve("vectors.csv").toFile()))) { 65 + pw.println("name,cwt,version,status,cop,vcid,no_rf,no_bit_lock," 66 + + "lockout,wait,retransmit,farm_b,report_value,word_hex"); 67 + 68 + for (Vector v : VECTORS) { 69 + Clcw clcw = ClcwBuilder.create() 70 + .setCopInEffect(v.cop) 71 + .setVirtualChannelId(v.vcid) 72 + .setReportValue(v.reportValue) 73 + .setStatusField(v.status) 74 + .setNoRfAvailableFlag(v.noRf) 75 + .setNoBitlockFlag(v.noBitLock) 76 + .setLockoutFlag(v.lockout) 77 + .setWaitFlag(v.wait) 78 + .setRetransmitFlag(v.retransmit) 79 + .setFarmBCounter(v.farmB) 80 + .build(); 81 + 82 + byte[] ocf = clcw.getOcf(); 83 + // Convert 4 bytes to hex string 84 + StringBuilder hex = new StringBuilder(); 85 + for (byte b : ocf) { 86 + hex.append(String.format("%02x", b & 0xFF)); 87 + } 88 + 89 + int copInt = v.cop ? 1 : 0; 90 + pw.printf("%s,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s%n", 91 + v.name, v.cwt, v.version, v.status, copInt, 92 + v.vcid, 93 + v.noRf ? 1 : 0, v.noBitLock ? 1 : 0, 94 + v.lockout ? 1 : 0, v.wait ? 1 : 0, v.retransmit ? 1 : 0, 95 + v.farmB, v.reportValue, 96 + hex.toString()); 97 + } 98 + } 99 + System.out.println("Wrote " + traceDir.resolve("vectors.csv")); 100 + } 101 + }
+229
test/interop/dariol83/scripts/generate.py
··· 1 + #!/usr/bin/env python3 2 + """Generate CLCW interop traces for ocaml-clcw. 3 + 4 + Oracle: Python (no deps needed for CLCW bitfield encoding) 5 + Install: no dependencies 6 + 7 + Tests CLCW (Command Link Control Word) encoding/decoding per CCSDS 232.0-B-4. 8 + 9 + CLCW Format (32 bits): 10 + Bit 0: Control Word Type (0=CLCW) 11 + Bits 1-2: CLCW Version Number 12 + Bits 3-5: Status Field 13 + Bits 6-7: COP in Effect 14 + Bits 8-13: Virtual Channel ID 15 + Bits 14-15: Reserved (spare) 16 + Bit 16: No RF Available 17 + Bit 17: No Bit Lock 18 + Bit 18: Lockout 19 + Bit 19: Wait 20 + Bit 20: Retransmit 21 + Bits 21-22: FARM-B Counter 22 + Bit 23: Reserved (spare) 23 + Bits 24-31: Report Value N(R) 24 + 25 + Traces are committed to git. Only re-run when changing inputs 26 + or upgrading the oracle. 27 + """ 28 + import os, struct 29 + 30 + TRACE_DIR = os.path.join(os.path.dirname(__file__), "..", "traces") 31 + 32 + 33 + def encode_clcw(cwt, version, status, cop, vcid, no_rf, no_bit_lock, 34 + lockout, wait, retransmit, farm_b, report_value): 35 + """Encode CLCW fields into a 32-bit word (big-endian).""" 36 + word = 0 37 + word |= (cwt & 1) << 31 38 + word |= (version & 3) << 29 39 + word |= (status & 7) << 26 40 + word |= (cop & 3) << 24 41 + word |= (vcid & 63) << 18 42 + # bits 14-15 reserved (0) 43 + word |= (1 if no_rf else 0) << 15 44 + word |= (1 if no_bit_lock else 0) << 14 45 + word |= (1 if lockout else 0) << 13 46 + word |= (1 if wait else 0) << 12 47 + word |= (1 if retransmit else 0) << 11 48 + word |= (farm_b & 3) << 9 49 + # bit 23 (bit 8 from LSB) reserved (0) 50 + word |= (report_value & 0xFF) 51 + return word 52 + 53 + 54 + # Test vectors: various CLCW configurations 55 + vectors = [ 56 + { 57 + "name": "all_zeros", 58 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 59 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 60 + "lockout": False, "wait": False, "retransmit": False, 61 + "farm_b": 0, "report_value": 0, 62 + }, 63 + { 64 + "name": "all_ones", 65 + "cwt": 1, "version": 3, "status": 7, "cop": 3, 66 + "vcid": 63, "no_rf": True, "no_bit_lock": True, 67 + "lockout": True, "wait": True, "retransmit": True, 68 + "farm_b": 3, "report_value": 255, 69 + }, 70 + { 71 + "name": "typical_operational", 72 + "cwt": 0, "version": 0, "status": 0, "cop": 1, 73 + "vcid": 1, "no_rf": False, "no_bit_lock": False, 74 + "lockout": False, "wait": False, "retransmit": False, 75 + "farm_b": 0, "report_value": 42, 76 + }, 77 + { 78 + "name": "no_rf_only", 79 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 80 + "vcid": 0, "no_rf": True, "no_bit_lock": False, 81 + "lockout": False, "wait": False, "retransmit": False, 82 + "farm_b": 0, "report_value": 0, 83 + }, 84 + { 85 + "name": "no_bit_lock_only", 86 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 87 + "vcid": 0, "no_rf": False, "no_bit_lock": True, 88 + "lockout": False, "wait": False, "retransmit": False, 89 + "farm_b": 0, "report_value": 0, 90 + }, 91 + { 92 + "name": "lockout_only", 93 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 94 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 95 + "lockout": True, "wait": False, "retransmit": False, 96 + "farm_b": 0, "report_value": 0, 97 + }, 98 + { 99 + "name": "wait_only", 100 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 101 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 102 + "lockout": False, "wait": True, "retransmit": False, 103 + "farm_b": 0, "report_value": 0, 104 + }, 105 + { 106 + "name": "retransmit_only", 107 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 108 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 109 + "lockout": False, "wait": False, "retransmit": True, 110 + "farm_b": 0, "report_value": 0, 111 + }, 112 + { 113 + "name": "status_ready", 114 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 115 + "vcid": 10, "no_rf": False, "no_bit_lock": False, 116 + "lockout": False, "wait": False, "retransmit": False, 117 + "farm_b": 0, "report_value": 50, 118 + }, 119 + { 120 + "name": "status_active", 121 + "cwt": 0, "version": 0, "status": 1, "cop": 0, 122 + "vcid": 10, "no_rf": False, "no_bit_lock": False, 123 + "lockout": False, "wait": False, "retransmit": False, 124 + "farm_b": 0, "report_value": 50, 125 + }, 126 + { 127 + "name": "max_vcid", 128 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 129 + "vcid": 63, "no_rf": False, "no_bit_lock": False, 130 + "lockout": False, "wait": False, "retransmit": False, 131 + "farm_b": 0, "report_value": 0, 132 + }, 133 + { 134 + "name": "max_report", 135 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 136 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 137 + "lockout": False, "wait": False, "retransmit": False, 138 + "farm_b": 0, "report_value": 255, 139 + }, 140 + { 141 + "name": "farm_b_0", 142 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 143 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 144 + "lockout": False, "wait": False, "retransmit": False, 145 + "farm_b": 0, "report_value": 0, 146 + }, 147 + { 148 + "name": "farm_b_1", 149 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 150 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 151 + "lockout": False, "wait": False, "retransmit": False, 152 + "farm_b": 1, "report_value": 0, 153 + }, 154 + { 155 + "name": "farm_b_2", 156 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 157 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 158 + "lockout": False, "wait": False, "retransmit": False, 159 + "farm_b": 2, "report_value": 0, 160 + }, 161 + { 162 + "name": "farm_b_3", 163 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 164 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 165 + "lockout": False, "wait": False, "retransmit": False, 166 + "farm_b": 3, "report_value": 0, 167 + }, 168 + { 169 + "name": "cop_1", 170 + "cwt": 0, "version": 0, "status": 0, "cop": 1, 171 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 172 + "lockout": False, "wait": False, "retransmit": False, 173 + "farm_b": 0, "report_value": 0, 174 + }, 175 + { 176 + "name": "cop_2", 177 + "cwt": 0, "version": 0, "status": 0, "cop": 2, 178 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 179 + "lockout": False, "wait": False, "retransmit": False, 180 + "farm_b": 0, "report_value": 0, 181 + }, 182 + { 183 + "name": "cop_3", 184 + "cwt": 0, "version": 0, "status": 0, "cop": 3, 185 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 186 + "lockout": False, "wait": False, "retransmit": False, 187 + "farm_b": 0, "report_value": 0, 188 + }, 189 + { 190 + "name": "version_1", 191 + "cwt": 0, "version": 1, "status": 0, "cop": 0, 192 + "vcid": 0, "no_rf": False, "no_bit_lock": False, 193 + "lockout": False, "wait": False, "retransmit": False, 194 + "farm_b": 0, "report_value": 0, 195 + }, 196 + { 197 + "name": "lockout_wait_retransmit", 198 + "cwt": 0, "version": 0, "status": 0, "cop": 0, 199 + "vcid": 5, "no_rf": False, "no_bit_lock": False, 200 + "lockout": True, "wait": True, "retransmit": True, 201 + "farm_b": 1, "report_value": 100, 202 + }, 203 + { 204 + "name": "all_flags_max_vcid_max_report", 205 + "cwt": 0, "version": 0, "status": 1, "cop": 1, 206 + "vcid": 63, "no_rf": True, "no_bit_lock": True, 207 + "lockout": True, "wait": True, "retransmit": True, 208 + "farm_b": 3, "report_value": 255, 209 + }, 210 + ] 211 + 212 + os.makedirs(TRACE_DIR, exist_ok=True) 213 + with open(os.path.join(TRACE_DIR, "vectors.csv"), "w") as f: 214 + f.write("name,cwt,version,status,cop,vcid,no_rf,no_bit_lock," 215 + "lockout,wait,retransmit,farm_b,report_value,word_hex\n") 216 + for v in vectors: 217 + word = encode_clcw( 218 + v["cwt"], v["version"], v["status"], v["cop"], 219 + v["vcid"], v["no_rf"], v["no_bit_lock"], 220 + v["lockout"], v["wait"], v["retransmit"], 221 + v["farm_b"], v["report_value"] 222 + ) 223 + f.write(f"{v['name']},{v['cwt']},{v['version']},{v['status']},{v['cop']}," 224 + f"{v['vcid']},{1 if v['no_rf'] else 0},{1 if v['no_bit_lock'] else 0}," 225 + f"{1 if v['lockout'] else 0},{1 if v['wait'] else 0}," 226 + f"{1 if v['retransmit'] else 0},{v['farm_b']},{v['report_value']}," 227 + f"{word:08x}\n") 228 + 229 + print(f"Wrote {TRACE_DIR}/vectors.csv")
+7
test/interop/dariol83/scripts/generate.sh
··· 1 + #!/bin/bash 2 + set -euo pipefail 3 + command -v jbang >/dev/null || { echo "jbang not on PATH" >&2; exit 1; } 4 + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 5 + TRACE_DIR="$(cd "$SCRIPT_DIR/../traces" && pwd)" 6 + cd "$SCRIPT_DIR" 7 + jbang generate.java "$TRACE_DIR"
+170
test/interop/dariol83/test.ml
··· 1 + (** dariol83/ccsds interop tests for ocaml-clcw. 2 + 3 + Tests CLCW encoding/decoding against the dariol83/ccsds Java library 4 + (eu.dariolucia.ccsds.tmtc), an independent CCSDS implementation. 5 + 6 + Traces generated by: jbang + dariol83/ccsds 1.0.6 7 + Regenerate: REGEN_TRACES=1 dune build @regen-traces 8 + 9 + Note: dariol83 always sets cwt=0 and models cop_in_effect as boolean 10 + (false=0, true=1), so vectors with cwt=1 or cop=2/3 are not covered. *) 11 + 12 + let trace path = Filename.concat "traces" path 13 + 14 + type vector = { 15 + name : string; 16 + cwt : int; 17 + version : int; 18 + status : int; 19 + cop : int; 20 + vcid : int; 21 + no_rf : bool; 22 + no_bit_lock : bool; 23 + lockout : bool; 24 + wait : bool; 25 + retransmit : bool; 26 + farm_b : int; 27 + report_value : int; 28 + word_hex : string; 29 + } 30 + 31 + let bool_of_int n = n <> 0 32 + 33 + let vector_codec = 34 + Csvt.( 35 + Row.( 36 + obj 37 + (fun 38 + name 39 + cwt 40 + version 41 + status 42 + cop 43 + vcid 44 + no_rf 45 + no_bit_lock 46 + lockout 47 + wait 48 + retransmit 49 + farm_b 50 + report_value 51 + word_hex 52 + -> 53 + { 54 + name; 55 + cwt; 56 + version; 57 + status; 58 + cop; 59 + vcid; 60 + no_rf = bool_of_int no_rf; 61 + no_bit_lock = bool_of_int no_bit_lock; 62 + lockout = bool_of_int lockout; 63 + wait = bool_of_int wait; 64 + retransmit = bool_of_int retransmit; 65 + farm_b; 66 + report_value; 67 + word_hex; 68 + }) 69 + |> col "name" string ~enc:(fun v -> v.name) 70 + |> col "cwt" int ~enc:(fun v -> v.cwt) 71 + |> col "version" int ~enc:(fun v -> v.version) 72 + |> col "status" int ~enc:(fun v -> v.status) 73 + |> col "cop" int ~enc:(fun v -> v.cop) 74 + |> col "vcid" int ~enc:(fun v -> v.vcid) 75 + |> col "no_rf" int ~enc:(fun v -> if v.no_rf then 1 else 0) 76 + |> col "no_bit_lock" int ~enc:(fun v -> if v.no_bit_lock then 1 else 0) 77 + |> col "lockout" int ~enc:(fun v -> if v.lockout then 1 else 0) 78 + |> col "wait" int ~enc:(fun v -> if v.wait then 1 else 0) 79 + |> col "retransmit" int ~enc:(fun v -> if v.retransmit then 1 else 0) 80 + |> col "farm_b" int ~enc:(fun v -> v.farm_b) 81 + |> col "report_value" int ~enc:(fun v -> v.report_value) 82 + |> col "word_hex" string ~enc:(fun v -> v.word_hex) 83 + |> finish)) 84 + 85 + let parse_vectors () = 86 + match Csvt.decode_file vector_codec (trace "vectors.csv") with 87 + | Ok vs -> vs 88 + | Error e -> Alcotest.failf "failed to parse vectors.csv: %a" Csvt.pp_error e 89 + 90 + let word_of_hex hex = int_of_string ("0x" ^ hex) 91 + 92 + let test_encode vec () = 93 + let clcw = 94 + Clcw.v ~control_word_type:vec.cwt ~version:vec.version 95 + ~status:(Clcw.status_of_int vec.status) 96 + ~cop_in_effect:vec.cop ~vcid:vec.vcid ~no_rf_available:vec.no_rf 97 + ~no_bit_lock:vec.no_bit_lock ~lockout:vec.lockout ~wait:vec.wait 98 + ~retransmit:vec.retransmit ~farm_b_counter:vec.farm_b 99 + ~report_value:vec.report_value () 100 + in 101 + let got = Clcw.encode clcw in 102 + let expected = word_of_hex vec.word_hex in 103 + if got <> expected then 104 + Alcotest.failf "%s: encode mismatch\n expected: %08x\n got: %08x" 105 + vec.name expected got 106 + 107 + let test_decode vec () = 108 + let word = word_of_hex vec.word_hex in 109 + match Clcw.decode word with 110 + | Error e -> Alcotest.failf "%s: decode failed: %a" vec.name Clcw.pp_error e 111 + | Ok clcw -> 112 + Alcotest.(check int) 113 + (vec.name ^ ": cwt") vec.cwt clcw.Clcw.control_word_type; 114 + Alcotest.(check int) (vec.name ^ ": version") vec.version clcw.version; 115 + Alcotest.(check int) 116 + (vec.name ^ ": status") vec.status 117 + (Clcw.int_of_status clcw.status); 118 + Alcotest.(check int) (vec.name ^ ": cop") vec.cop clcw.cop_in_effect; 119 + Alcotest.(check int) (vec.name ^ ": vcid") vec.vcid clcw.vcid; 120 + Alcotest.(check bool) 121 + (vec.name ^ ": no_rf") vec.no_rf clcw.no_rf_available; 122 + Alcotest.(check bool) 123 + (vec.name ^ ": no_bit_lock") 124 + vec.no_bit_lock clcw.no_bit_lock; 125 + Alcotest.(check bool) (vec.name ^ ": lockout") vec.lockout clcw.lockout; 126 + Alcotest.(check bool) (vec.name ^ ": wait") vec.wait clcw.wait; 127 + Alcotest.(check bool) 128 + (vec.name ^ ": retransmit") 129 + vec.retransmit clcw.retransmit; 130 + Alcotest.(check int) 131 + (vec.name ^ ": farm_b") vec.farm_b clcw.farm_b_counter; 132 + Alcotest.(check int) 133 + (vec.name ^ ": report_value") 134 + vec.report_value clcw.report_value 135 + 136 + let test_roundtrip vec () = 137 + let clcw = 138 + Clcw.v ~control_word_type:vec.cwt ~version:vec.version 139 + ~status:(Clcw.status_of_int vec.status) 140 + ~cop_in_effect:vec.cop ~vcid:vec.vcid ~no_rf_available:vec.no_rf 141 + ~no_bit_lock:vec.no_bit_lock ~lockout:vec.lockout ~wait:vec.wait 142 + ~retransmit:vec.retransmit ~farm_b_counter:vec.farm_b 143 + ~report_value:vec.report_value () 144 + in 145 + let encoded = Clcw.encode clcw in 146 + match Clcw.decode encoded with 147 + | Error e -> 148 + Alcotest.failf "%s: roundtrip decode failed: %a" vec.name Clcw.pp_error e 149 + | Ok decoded -> 150 + if not (Clcw.equal clcw decoded) then 151 + Alcotest.failf "%s: roundtrip mismatch\n original: %a\n decoded: %a" 152 + vec.name Clcw.pp clcw Clcw.pp decoded 153 + 154 + let () = 155 + let vectors = parse_vectors () in 156 + Alcotest.run "clcw-interop" 157 + [ 158 + ( "encode", 159 + List.map 160 + (fun v -> Alcotest.test_case v.name `Quick (test_encode v)) 161 + vectors ); 162 + ( "decode", 163 + List.map 164 + (fun v -> Alcotest.test_case v.name `Quick (test_decode v)) 165 + vectors ); 166 + ( "roundtrip", 167 + List.map 168 + (fun v -> Alcotest.test_case v.name `Quick (test_roundtrip v)) 169 + vectors ); 170 + ]
+20
test/interop/dariol83/traces/vectors.csv
··· 1 + name,cwt,version,status,cop,vcid,no_rf,no_bit_lock,lockout,wait,retransmit,farm_b,report_value,word_hex 2 + all_zeros,0,0,0,0,0,0,0,0,0,0,0,0,00000000 3 + typical_operational,0,0,0,1,1,0,0,0,0,0,0,42,0104002a 4 + no_rf_only,0,0,0,0,0,1,0,0,0,0,0,0,00008000 5 + no_bit_lock_only,0,0,0,0,0,0,1,0,0,0,0,0,00004000 6 + lockout_only,0,0,0,0,0,0,0,1,0,0,0,0,00002000 7 + wait_only,0,0,0,0,0,0,0,0,1,0,0,0,00001000 8 + retransmit_only,0,0,0,0,0,0,0,0,0,1,0,0,00000800 9 + status_ready,0,0,0,0,10,0,0,0,0,0,0,50,00280032 10 + status_active,0,0,1,0,10,0,0,0,0,0,0,50,04280032 11 + max_vcid,0,0,0,0,63,0,0,0,0,0,0,0,00fc0000 12 + max_report,0,0,0,0,0,0,0,0,0,0,0,255,000000ff 13 + farm_b_0,0,0,0,0,0,0,0,0,0,0,0,0,00000000 14 + farm_b_1,0,0,0,0,0,0,0,0,0,0,1,0,00000200 15 + farm_b_2,0,0,0,0,0,0,0,0,0,0,2,0,00000400 16 + farm_b_3,0,0,0,0,0,0,0,0,0,0,3,0,00000600 17 + cop_0,0,0,0,0,0,0,0,0,0,0,0,0,00000000 18 + cop_1,0,0,0,1,0,0,0,0,0,0,0,0,01000000 19 + lockout_wait_retransmit,0,0,0,0,5,0,0,1,1,1,1,100,00143a64 20 + all_flags_max_vcid_max_report,0,0,1,1,63,1,1,1,1,1,3,255,05fcfeff