CANConfigPython 0.1.0a1__py3-none-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. canconfigpython/__init__.py +7 -0
  2. canconfigpython/__main__.py +3 -0
  3. canconfigpython/cli.py +111 -0
  4. canconfigpython/client.py +243 -0
  5. canconfigpython/commands.py +57 -0
  6. canconfigpython/errors.py +19 -0
  7. canconfigpython/resources/docs/native-source.tar.gz +0 -0
  8. canconfigpython/resources/docs/user-guide.en.md +274 -0
  9. canconfigpython/resources/docs/user-guide.zh-CN.md +265 -0
  10. canconfigpython/resources/skill/canconfig-python/SKILL.md +71 -0
  11. canconfigpython/resources/skill/canconfig-python/agents/openai.yaml +4 -0
  12. canconfigpython/resources/skill/canconfig-python/assets/changes.schema.json +832 -0
  13. canconfigpython/resources/skill/canconfig-python/assets/examples/bridge_dual_rates.json +18 -0
  14. canconfigpython/resources/skill/canconfig-python/assets/examples/bridge_mapping.json +13 -0
  15. canconfigpython/resources/skill/canconfig-python/assets/examples/cancom_115200_8n1.json +10 -0
  16. canconfigpython/resources/skill/canconfig-python/assets/examples/cancom_format_crc.json +8 -0
  17. canconfigpython/resources/skill/canconfig-python/assets/examples/cancom_gap.json +8 -0
  18. canconfigpython/resources/skill/canconfig-python/assets/examples/cancom_transparent_id.json +10 -0
  19. canconfigpython/resources/skill/canconfig-python/assets/examples/fb_1m.json +12 -0
  20. canconfigpython/resources/skill/canconfig-python/assets/examples/fb_500k.json +12 -0
  21. canconfigpython/resources/skill/canconfig-python/assets/examples/fb_adaptive_single.json +7 -0
  22. canconfigpython/resources/skill/canconfig-python/assets/examples/fb_return_manual.json +22 -0
  23. canconfigpython/resources/skill/canconfig-python/assets/examples/fb_silent_adaptive_option.json +7 -0
  24. canconfigpython/resources/skill/canconfig-python/assets/examples/filter_blacklist.json +7 -0
  25. canconfigpython/resources/skill/canconfig-python/assets/examples/filter_mask.json +12 -0
  26. canconfigpython/resources/skill/canconfig-python/assets/examples/filter_range.json +12 -0
  27. canconfigpython/resources/skill/canconfig-python/assets/examples/hub_h_external.json +13 -0
  28. canconfigpython/resources/skill/canconfig-python/assets/examples/hub_input_filter.json +13 -0
  29. canconfigpython/resources/skill/canconfig-python/assets/examples/hub_l_external.json +13 -0
  30. canconfigpython/resources/skill/canconfig-python/assets/examples/hub_mapping.json +46 -0
  31. canconfigpython/resources/skill/canconfig-python/assets/examples/hub_routing.json +8 -0
  32. canconfigpython/resources/skill/canconfig-python/assets/examples/index.en.md +55 -0
  33. canconfigpython/resources/skill/canconfig-python/assets/examples/index.json +661 -0
  34. canconfigpython/resources/skill/canconfig-python/assets/examples/index.zh-CN.md +55 -0
  35. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/adaptive_mixed.json +8 -0
  36. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/hub_missing_ps.json +12 -0
  37. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/restricted_inheritance.json +12 -0
  38. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/short_user_data.json +7 -0
  39. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/string_numeric_id.json +7 -0
  40. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/unknown_field.json +7 -0
  41. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/unsupported_adaptive.json +7 -0
  42. canconfigpython/resources/skill/canconfig-python/assets/examples/negative/wrong_uid.json +7 -0
  43. canconfigpython/resources/skill/canconfig-python/assets/examples/rpt_adaptive_all.json +12 -0
  44. canconfigpython/resources/skill/canconfig-python/assets/examples/rpt_silent.json +7 -0
  45. canconfigpython/resources/skill/canconfig-python/assets/examples/user_data.json +7 -0
  46. canconfigpython/resources/skill/canconfig-python/references/operations.md +68 -0
  47. canconfigpython/resources.py +17 -0
  48. canconfigpython/runtime/Qt5Core.dll +0 -0
  49. canconfigpython/runtime/Qt5Network.dll +0 -0
  50. canconfigpython/runtime/Qt5SerialPort.dll +0 -0
  51. canconfigpython/runtime/WIICAN.dll +0 -0
  52. canconfigpython/runtime/canconfigconsole.exe +0 -0
  53. canconfigpython/runtime/libgcc_s_dw2-1.dll +0 -0
  54. canconfigpython/runtime/libstdc++-6.dll +0 -0
  55. canconfigpython/runtime/libwinpthread-1.dll +0 -0
  56. canconfigpython/runtime/manifest.json +19 -0
  57. canconfigpython/runtime.py +61 -0
  58. canconfigpython-0.1.0a1.dist-info/GPL-3.0.txt +674 -0
  59. canconfigpython-0.1.0a1.dist-info/LICENSE +21 -0
  60. canconfigpython-0.1.0a1.dist-info/METADATA +197 -0
  61. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-LICENSE.txt +866 -0
  62. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.FDL.txt +450 -0
  63. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.GPL2.txt +339 -0
  64. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.GPL3-EXCEPT.txt +704 -0
  65. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.GPL3.txt +674 -0
  66. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.GPLv3.txt +686 -0
  67. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.LGPL3.txt +165 -0
  68. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.LGPLv21.txt +514 -0
  69. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.LGPLv3.txt +175 -0
  70. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-LICENSE.PREVIEW.COMMERCIAL.txt +626 -0
  71. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__LICENSE.txt +32 -0
  72. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__libANGLE__renderer__d3d__d3d11__dxgi_support_data.json.txt +1164 -0
  73. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__libANGLE__renderer__d3d__d3d11__load_functions_data.json.txt +1116 -0
  74. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__libANGLE__renderer__d3d__d3d11__swizzle_format_data.json.txt +77 -0
  75. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__libANGLE__renderer__d3d__d3d11__texture_format_data.json.txt +692 -0
  76. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__third_party__compiler__LICENSE.txt +22 -0
  77. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__angle__src__third_party__murmurhash__LICENSE.txt +2 -0
  78. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__double-conversion__LICENSE.txt +26 -0
  79. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__easing__easing.cpp.txt +670 -0
  80. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__easing__legal.qdoc.txt +35 -0
  81. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__forkfd__forkfd.c.txt +875 -0
  82. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__forkfd__forkfd.h.txt +66 -0
  83. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__forkfd__forkfd_gcc.h.txt +63 -0
  84. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freebsd__0001-Patch-the-FreeBSD-strto-u-ll-functions-to-work-insid.patch.txt +151 -0
  85. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freebsd__strtoll.c.txt +134 -0
  86. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freebsd__strtoull.c.txt +112 -0
  87. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freetype__docs__LICENSE.TXT.txt +37 -0
  88. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freetype__src__tools__no-copyright.txt +61 -0
  89. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freetype__src__tools__update-copyright-year.txt +135 -0
  90. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__freetype__src__tools__update-copyright.txt +14 -0
  91. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__harfbuzz-ng__COPYING.txt +36 -0
  92. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__harfbuzz__COPYING.txt +24 -0
  93. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__libpng__LICENSE.txt +112 -0
  94. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__md4__md4.cpp.txt +265 -0
  95. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__md4__md4.h.txt +31 -0
  96. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__md5__md5.cpp.txt +247 -0
  97. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__md5__md5.h.txt +48 -0
  98. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__pcre__COPYING.txt +5 -0
  99. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__pcre__LICENCE.txt +93 -0
  100. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__rfc6234__patches__0001-Fix-compilation-MSVC-warning-in-3rdparty-rfc6234.patch.txt +86 -0
  101. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__rfc6234__sha-private.h.txt +28 -0
  102. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__rfc6234__sha.h.txt +357 -0
  103. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__rfc6234__sha224-256.c.txt +583 -0
  104. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__rfc6234__sha384-512.c.txt +1034 -0
  105. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha1__sha1.cpp.txt +261 -0
  106. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-32-rvk.macros.txt +555 -0
  107. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-32.macros.txt +26 -0
  108. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-64.macros.txt +728 -0
  109. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-int-set.h.txt +6 -0
  110. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-interface.h.txt +46 -0
  111. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-opt32-settings.h.txt +4 -0
  112. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-opt32.c.txt +524 -0
  113. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-opt64-settings.h.txt +7 -0
  114. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-opt64.c.txt +512 -0
  115. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakF-1600-unrolling.macros.txt +124 -0
  116. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakNISTInterface.c.txt +82 -0
  117. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakNISTInterface.h.txt +70 -0
  118. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakSponge.c.txt +266 -0
  119. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__KeccakSponge.h.txt +80 -0
  120. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__sha3__brg_endian.h.txt +142 -0
  121. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtbase-src__3rdparty__xkbcommon__COPYING.txt +188 -0
  122. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.FDL.txt +450 -0
  123. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.GPL2.txt +339 -0
  124. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.GPL3-EXCEPT.txt +704 -0
  125. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.GPL3.txt +674 -0
  126. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.GPLv2.txt +292 -0
  127. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.GPLv3.txt +686 -0
  128. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.LGPL3.txt +165 -0
  129. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.LGPLv21.txt +514 -0
  130. canconfigpython-0.1.0a1.dist-info/Qt-5.7.1-qtserialport-LICENSE.LGPLv3.txt +175 -0
  131. canconfigpython-0.1.0a1.dist-info/RECORD +165 -0
  132. canconfigpython-0.1.0a1.dist-info/THIRD_PARTY_NOTICES.md +69 -0
  133. canconfigpython-0.1.0a1.dist-info/WHEEL +5 -0
  134. canconfigpython-0.1.0a1.dist-info/entry_points.txt +3 -0
  135. canconfigpython-0.1.0a1.dist-info/gcc-COPYING.RUNTIME.txt +73 -0
  136. canconfigpython-0.1.0a1.dist-info/gcc-COPYING3.LIB.txt +165 -0
  137. canconfigpython-0.1.0a1.dist-info/gcc-COPYING3.txt +674 -0
  138. canconfigpython-0.1.0a1.dist-info/linux-libc6-copyright.txt +529 -0
  139. canconfigpython-0.1.0a1.dist-info/linux-libcap2-copyright.txt +112 -0
  140. canconfigpython-0.1.0a1.dist-info/linux-libcom-err2-copyright.txt +403 -0
  141. canconfigpython-0.1.0a1.dist-info/linux-libdouble-conversion3-copyright.txt +41 -0
  142. canconfigpython-0.1.0a1.dist-info/linux-libgcc-s1-copyright.txt +1532 -0
  143. canconfigpython-0.1.0a1.dist-info/linux-libglib2.0-0t64-copyright.txt +1250 -0
  144. canconfigpython-0.1.0a1.dist-info/linux-libgssapi-krb5-2-copyright.txt +1374 -0
  145. canconfigpython-0.1.0a1.dist-info/linux-libicu74-copyright.txt +49 -0
  146. canconfigpython-0.1.0a1.dist-info/linux-libk5crypto3-copyright.txt +1374 -0
  147. canconfigpython-0.1.0a1.dist-info/linux-libkeyutils1-copyright.txt +52 -0
  148. canconfigpython-0.1.0a1.dist-info/linux-libkrb5-3-copyright.txt +1374 -0
  149. canconfigpython-0.1.0a1.dist-info/linux-libkrb5support0-copyright.txt +1374 -0
  150. canconfigpython-0.1.0a1.dist-info/linux-libpcre2-16-0-copyright.txt +122 -0
  151. canconfigpython-0.1.0a1.dist-info/linux-libpcre2-8-0-copyright.txt +122 -0
  152. canconfigpython-0.1.0a1.dist-info/linux-libqt5core5t64-copyright.txt +2932 -0
  153. canconfigpython-0.1.0a1.dist-info/linux-libqt5network5t64-copyright.txt +2932 -0
  154. canconfigpython-0.1.0a1.dist-info/linux-libqt5serialport5-copyright.txt +134 -0
  155. canconfigpython-0.1.0a1.dist-info/linux-libstdc++6-copyright.txt +1532 -0
  156. canconfigpython-0.1.0a1.dist-info/linux-libudev1-copyright.txt +287 -0
  157. canconfigpython-0.1.0a1.dist-info/linux-libzstd1-copyright.txt +123 -0
  158. canconfigpython-0.1.0a1.dist-info/linux-packages.json +102 -0
  159. canconfigpython-0.1.0a1.dist-info/linux-zlib1g-copyright.txt +84 -0
  160. canconfigpython-0.1.0a1.dist-info/mingw-w64-COPYING.MinGW-w64-runtime.txt.txt +240 -0
  161. canconfigpython-0.1.0a1.dist-info/mingw-w64-COPYING.MinGW-w64.txt.txt +135 -0
  162. canconfigpython-0.1.0a1.dist-info/mingw-w64-COPYING.txt +43 -0
  163. canconfigpython-0.1.0a1.dist-info/qt-source-notices.json +278 -0
  164. canconfigpython-0.1.0a1.dist-info/top_level.txt +1 -0
  165. canconfigpython-0.1.0a1.dist-info/winpthreads-COPYING.txt +57 -0
@@ -0,0 +1,661 @@
1
+ {
2
+ "schema_version": 1,
3
+ "cli_version": "2.3",
4
+ "placeholder_uid": "0000-0000-0000-0000-0000-0000",
5
+ "fixture_uid": "8081-8283-8485-8687-8889-8a8b",
6
+ "fixture_versions": {
7
+ "13": "HW03.00/SW03.07",
8
+ "24": "HW03.00/SW03.07",
9
+ "26": "HW04.00/SW05.10",
10
+ "30": "HW03.00/SW03.07",
11
+ "35": "HW03.00/SW01.20",
12
+ "36": "HW03.00/SW01.20"
13
+ },
14
+ "examples": [
15
+ {
16
+ "id": "fb_500k",
17
+ "title": "CANFB CAN1 固定 500 kbit/s",
18
+ "file": "fb_500k.json",
19
+ "device_type": 26,
20
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
21
+ "schema_valid": true,
22
+ "fixture": {
23
+ "type": 26,
24
+ "case": null
25
+ },
26
+ "expected": {
27
+ "exit_code": 0,
28
+ "write_count": 2,
29
+ "save_domains": [
30
+ "SAVE/1/1"
31
+ ],
32
+ "readback": "matched"
33
+ },
34
+ "title_en": "CANFB CAN1: fixed 500 kbit/s",
35
+ "precondition_en": "All channels manual and fully readable; no DIP override."
36
+ },
37
+ {
38
+ "id": "fb_1m",
39
+ "title": "CANFB CAN1 固定 1 Mbit/s",
40
+ "file": "fb_1m.json",
41
+ "device_type": 26,
42
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
43
+ "schema_valid": true,
44
+ "fixture": {
45
+ "type": 26,
46
+ "case": null
47
+ },
48
+ "expected": {
49
+ "exit_code": 0,
50
+ "write_count": 2,
51
+ "save_domains": [
52
+ "SAVE/1/1"
53
+ ],
54
+ "readback": "matched"
55
+ },
56
+ "title_en": "CANFB CAN1: fixed 1 Mbit/s",
57
+ "precondition_en": "All channels manual and fully readable; no DIP override."
58
+ },
59
+ {
60
+ "id": "bridge_dual_rates",
61
+ "title": "CANBridge 两路不同波特率",
62
+ "file": "bridge_dual_rates.json",
63
+ "device_type": 13,
64
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
65
+ "schema_valid": true,
66
+ "fixture": {
67
+ "type": 13,
68
+ "case": null
69
+ },
70
+ "expected": {
71
+ "exit_code": 0,
72
+ "write_count": 2,
73
+ "save_domains": [
74
+ "SAVE/1/0"
75
+ ],
76
+ "readback": "matched"
77
+ },
78
+ "title_en": "CANBridge: different rates on two channels",
79
+ "precondition_en": "All channels manual and fully readable; no DIP override."
80
+ },
81
+ {
82
+ "id": "rpt_silent",
83
+ "title": "CANRPT-600 CAN3 静默模式",
84
+ "file": "rpt_silent.json",
85
+ "device_type": 30,
86
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
87
+ "schema_valid": true,
88
+ "fixture": {
89
+ "type": 30,
90
+ "case": null
91
+ },
92
+ "expected": {
93
+ "exit_code": 0,
94
+ "write_count": 6,
95
+ "save_domains": [
96
+ "SAVE/1/0"
97
+ ],
98
+ "readback": "matched"
99
+ },
100
+ "title_en": "CANRPT-600: CAN3 silent mode",
101
+ "precondition_en": "All channels manual and fully readable; no DIP override."
102
+ },
103
+ {
104
+ "id": "hub_h_external",
105
+ "title": "CANHub-X6H 外部 CAN3 500 kbit/s",
106
+ "file": "hub_h_external.json",
107
+ "device_type": 35,
108
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
109
+ "schema_valid": true,
110
+ "fixture": {
111
+ "type": 35,
112
+ "case": null
113
+ },
114
+ "expected": {
115
+ "exit_code": 0,
116
+ "write_count": 6,
117
+ "save_domains": [
118
+ "SAVE/1/1"
119
+ ],
120
+ "readback": "matched"
121
+ },
122
+ "title_en": "CANHub-X6H: external CAN3 at 500 kbit/s",
123
+ "precondition_en": "All channels manual and fully readable; no DIP override."
124
+ },
125
+ {
126
+ "id": "hub_l_external",
127
+ "title": "CANHub-X6L 外部 CAN3 500 kbit/s",
128
+ "file": "hub_l_external.json",
129
+ "device_type": 36,
130
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
131
+ "schema_valid": true,
132
+ "fixture": {
133
+ "type": 36,
134
+ "case": null
135
+ },
136
+ "expected": {
137
+ "exit_code": 0,
138
+ "write_count": 6,
139
+ "save_domains": [
140
+ "SAVE/1/1"
141
+ ],
142
+ "readback": "matched"
143
+ },
144
+ "title_en": "CANHub-X6L: external CAN3 at 500 kbit/s",
145
+ "precondition_en": "All channels manual and fully readable; no DIP override."
146
+ },
147
+ {
148
+ "id": "fb_adaptive_single",
149
+ "title": "CANFB CAN1 开启自适应",
150
+ "file": "fb_adaptive_single.json",
151
+ "device_type": 26,
152
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
153
+ "schema_valid": true,
154
+ "fixture": {
155
+ "type": 26,
156
+ "case": "learn_after_enable"
157
+ },
158
+ "expected": {
159
+ "exit_code": 0,
160
+ "write_count": 1,
161
+ "save_domains": [
162
+ "SAVE/1/1"
163
+ ],
164
+ "readback": "adaptive_flags_matched"
165
+ },
166
+ "title_en": "CANFB: enable adaptive mode on CAN1",
167
+ "precondition_en": "All channels manual and fully readable; no DIP override."
168
+ },
169
+ {
170
+ "id": "rpt_adaptive_all",
171
+ "title": "CANRPT-600 全部六路开启自适应",
172
+ "file": "rpt_adaptive_all.json",
173
+ "device_type": 30,
174
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
175
+ "schema_valid": true,
176
+ "fixture": {
177
+ "type": 30,
178
+ "case": "learn_after_enable"
179
+ },
180
+ "expected": {
181
+ "exit_code": 0,
182
+ "write_count": 6,
183
+ "save_domains": [
184
+ "SAVE/1/0"
185
+ ],
186
+ "readback": "adaptive_flags_matched"
187
+ },
188
+ "title_en": "CANRPT-600: enable adaptive mode on all six channels",
189
+ "precondition_en": "All channels manual and fully readable; no DIP override."
190
+ },
191
+ {
192
+ "id": "fb_return_manual",
193
+ "title": "CANFB 从自适应切回两路明确手动参数",
194
+ "file": "fb_return_manual.json",
195
+ "device_type": 26,
196
+ "precondition": "允许当前为自适应;明确授权覆盖全部两路参数,使用用户指定的新手动值;无 DIP 接管。",
197
+ "schema_valid": true,
198
+ "fixture": {
199
+ "type": 26,
200
+ "case": "auto"
201
+ },
202
+ "expected": {
203
+ "exit_code": 0,
204
+ "write_count": 2,
205
+ "save_domains": [
206
+ "SAVE/1/1"
207
+ ],
208
+ "readback": "matched"
209
+ },
210
+ "title_en": "CANFB: return both channels to explicit manual settings",
211
+ "precondition_en": "Adaptive state is allowed; explicitly authorize overwriting both channels with new manual values; no DIP override."
212
+ },
213
+ {
214
+ "id": "filter_mask",
215
+ "title": "CANBridge CAN1 掩码过滤 ID 0x123",
216
+ "file": "filter_mask.json",
217
+ "device_type": 13,
218
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
219
+ "schema_valid": true,
220
+ "fixture": {
221
+ "type": 13,
222
+ "case": null
223
+ },
224
+ "expected": {
225
+ "exit_code": 0,
226
+ "write_count": 32,
227
+ "save_domains": [
228
+ "SAVE/1/0"
229
+ ],
230
+ "readback": "matched"
231
+ },
232
+ "title_en": "CANBridge CAN1: mask filter for ID 0x123",
233
+ "precondition_en": "All channels manual and fully readable; no DIP override."
234
+ },
235
+ {
236
+ "id": "filter_range",
237
+ "title": "CANBridge CAN1 范围过滤 0x100–0x1FF",
238
+ "file": "filter_range.json",
239
+ "device_type": 13,
240
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
241
+ "schema_valid": true,
242
+ "fixture": {
243
+ "type": 13,
244
+ "case": null
245
+ },
246
+ "expected": {
247
+ "exit_code": 0,
248
+ "write_count": 32,
249
+ "save_domains": [
250
+ "SAVE/1/0"
251
+ ],
252
+ "readback": "matched"
253
+ },
254
+ "title_en": "CANBridge CAN1: range filter 0x100-0x1FF",
255
+ "precondition_en": "All channels manual and fully readable; no DIP override."
256
+ },
257
+ {
258
+ "id": "filter_blacklist",
259
+ "title": "CANBridge 切换黑名单",
260
+ "file": "filter_blacklist.json",
261
+ "device_type": 13,
262
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
263
+ "schema_valid": true,
264
+ "fixture": {
265
+ "type": 13,
266
+ "case": null
267
+ },
268
+ "expected": {
269
+ "exit_code": 0,
270
+ "write_count": 1,
271
+ "save_domains": [
272
+ "SAVE/1/0"
273
+ ],
274
+ "readback": "matched"
275
+ },
276
+ "title_en": "CANBridge: select blacklist mode",
277
+ "precondition_en": "All channels manual and fully readable; no DIP override."
278
+ },
279
+ {
280
+ "id": "hub_input_filter",
281
+ "title": "CANHub 两路输入过滤并启用",
282
+ "file": "hub_input_filter.json",
283
+ "device_type": 35,
284
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
285
+ "schema_valid": true,
286
+ "fixture": {
287
+ "type": 35,
288
+ "case": null
289
+ },
290
+ "expected": {
291
+ "exit_code": 0,
292
+ "write_count": 257,
293
+ "save_domains": [
294
+ "SAVE/1/2",
295
+ "SAVE/1/5"
296
+ ],
297
+ "readback": "matched"
298
+ },
299
+ "title_en": "CANHub: enable an input filter on two channels",
300
+ "precondition_en": "All channels manual and fully readable; no DIP override."
301
+ },
302
+ {
303
+ "id": "bridge_mapping",
304
+ "title": "CANBridge 标准 ID 0x123 映射为 0x321",
305
+ "file": "bridge_mapping.json",
306
+ "device_type": 13,
307
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
308
+ "schema_valid": true,
309
+ "fixture": {
310
+ "type": 13,
311
+ "case": null
312
+ },
313
+ "expected": {
314
+ "exit_code": 0,
315
+ "write_count": 128,
316
+ "save_domains": [
317
+ "SAVE/5"
318
+ ],
319
+ "readback": "matched"
320
+ },
321
+ "title_en": "CANBridge: map standard ID 0x123 to 0x321",
322
+ "precondition_en": "All channels manual and fully readable; no DIP override."
323
+ },
324
+ {
325
+ "id": "hub_mapping",
326
+ "title": "CANHub 映射并转发到 CAN2",
327
+ "file": "hub_mapping.json",
328
+ "device_type": 35,
329
+ "precondition": "Hub 固件 01.16 及以上(mapping_format=3);所有通道当前为手动、参数可完整读取。",
330
+ "schema_valid": true,
331
+ "fixture": {
332
+ "type": 35,
333
+ "case": null
334
+ },
335
+ "expected": {
336
+ "exit_code": 0,
337
+ "write_count": 257,
338
+ "save_domains": [
339
+ "SAVE/1/3",
340
+ "SAVE/1/5"
341
+ ],
342
+ "readback": "matched"
343
+ },
344
+ "title_en": "CANHub: map and forward to CAN2",
345
+ "precondition_en": "Hub firmware 01.16 or later (mapping_format=3); all channels manual and fully readable."
346
+ },
347
+ {
348
+ "id": "hub_routing",
349
+ "title": "CANHub CAN1 路由到 CAN2 与 CAN3",
350
+ "file": "hub_routing.json",
351
+ "device_type": 35,
352
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
353
+ "schema_valid": true,
354
+ "fixture": {
355
+ "type": 35,
356
+ "case": null
357
+ },
358
+ "expected": {
359
+ "exit_code": 0,
360
+ "write_count": 2,
361
+ "save_domains": [
362
+ "SAVE/1/4",
363
+ "SAVE/1/5"
364
+ ],
365
+ "readback": "matched"
366
+ },
367
+ "title_en": "CANHub: route CAN1 to CAN2 and CAN3",
368
+ "precondition_en": "All channels manual and fully readable; no DIP override."
369
+ },
370
+ {
371
+ "id": "fb_silent_adaptive_option",
372
+ "title": "CANFB 静默自适应选项",
373
+ "file": "fb_silent_adaptive_option.json",
374
+ "device_type": 26,
375
+ "precondition": "CANFB 固件 05.09/05.10 支持该位;该选项不等于 BRT_AUTO 开启命令。",
376
+ "schema_valid": true,
377
+ "fixture": {
378
+ "type": 26,
379
+ "case": null
380
+ },
381
+ "expected": {
382
+ "exit_code": 0,
383
+ "write_count": 1,
384
+ "save_domains": [
385
+ "SAVE/1/5"
386
+ ],
387
+ "readback": "matched"
388
+ },
389
+ "title_en": "CANFB: silent adaptive option",
390
+ "precondition_en": "CANFB 05.09/05.10 supports this bit; setting it does not enable BRT_AUTO."
391
+ },
392
+ {
393
+ "id": "cancom_115200_8n1",
394
+ "title": "CANCOM 串口 115200 8N1",
395
+ "file": "cancom_115200_8n1.json",
396
+ "device_type": 24,
397
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
398
+ "schema_valid": true,
399
+ "fixture": {
400
+ "type": 24,
401
+ "case": null
402
+ },
403
+ "expected": {
404
+ "exit_code": 0,
405
+ "write_count": 1,
406
+ "save_domains": [
407
+ "SAVE/4"
408
+ ],
409
+ "readback": "matched"
410
+ },
411
+ "title_en": "CANCOM: serial 115200 8N1",
412
+ "precondition_en": "All channels manual and fully readable; no DIP override."
413
+ },
414
+ {
415
+ "id": "cancom_transparent_id",
416
+ "title": "CANCOM 双向透明转换与标准 ID",
417
+ "file": "cancom_transparent_id.json",
418
+ "device_type": 24,
419
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
420
+ "schema_valid": true,
421
+ "fixture": {
422
+ "type": 24,
423
+ "case": null
424
+ },
425
+ "expected": {
426
+ "exit_code": 0,
427
+ "write_count": 1,
428
+ "save_domains": [
429
+ "SAVE/4"
430
+ ],
431
+ "readback": "matched"
432
+ },
433
+ "title_en": "CANCOM: bidirectional transparent conversion and standard ID",
434
+ "precondition_en": "All channels manual and fully readable; no DIP override."
435
+ },
436
+ {
437
+ "id": "cancom_format_crc",
438
+ "title": "CANCOM 格式转换并启用 CRC",
439
+ "file": "cancom_format_crc.json",
440
+ "device_type": 24,
441
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
442
+ "schema_valid": true,
443
+ "fixture": {
444
+ "type": 24,
445
+ "case": null
446
+ },
447
+ "expected": {
448
+ "exit_code": 0,
449
+ "write_count": 1,
450
+ "save_domains": [
451
+ "SAVE/4"
452
+ ],
453
+ "readback": "matched"
454
+ },
455
+ "title_en": "CANCOM: format conversion with CRC",
456
+ "precondition_en": "All channels manual and fully readable; no DIP override."
457
+ },
458
+ {
459
+ "id": "cancom_gap",
460
+ "title": "CANCOM 字符流与消息间隔",
461
+ "file": "cancom_gap.json",
462
+ "device_type": 24,
463
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
464
+ "schema_valid": true,
465
+ "fixture": {
466
+ "type": 24,
467
+ "case": null
468
+ },
469
+ "expected": {
470
+ "exit_code": 0,
471
+ "write_count": 1,
472
+ "save_domains": [
473
+ "SAVE/4"
474
+ ],
475
+ "readback": "matched"
476
+ },
477
+ "title_en": "CANCOM: stream and message gaps",
478
+ "precondition_en": "All channels manual and fully readable; no DIP override."
479
+ },
480
+ {
481
+ "id": "user_data",
482
+ "title": "写入 USER_DATA 第一块 32 字节",
483
+ "file": "user_data.json",
484
+ "device_type": 13,
485
+ "precondition": "所有通道当前为手动、参数可完整读取;无 DIP 开关接管。",
486
+ "schema_valid": true,
487
+ "fixture": {
488
+ "type": 13,
489
+ "case": null
490
+ },
491
+ "expected": {
492
+ "exit_code": 0,
493
+ "write_count": 2,
494
+ "save_domains": [],
495
+ "readback": "matched"
496
+ },
497
+ "title_en": "Write the first 32-byte USER_DATA block",
498
+ "precondition_en": "All channels manual and fully readable; no DIP override."
499
+ },
500
+ {
501
+ "id": "wrong_uid",
502
+ "title": "目标 UID 不匹配",
503
+ "file": "negative/wrong_uid.json",
504
+ "device_type": 13,
505
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
506
+ "schema_valid": true,
507
+ "fixture": {
508
+ "type": 13,
509
+ "case": null,
510
+ "replace_uid": false
511
+ },
512
+ "expected": {
513
+ "exit_code": 6,
514
+ "error_code": "uid_mismatch",
515
+ "writes": 0
516
+ },
517
+ "title_en": "Target UID mismatch",
518
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
519
+ },
520
+ {
521
+ "id": "string_numeric_id",
522
+ "title": "把数值 ID 写成字符串",
523
+ "file": "negative/string_numeric_id.json",
524
+ "device_type": 24,
525
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
526
+ "schema_valid": false,
527
+ "fixture": {
528
+ "type": 24,
529
+ "case": null,
530
+ "replace_uid": true
531
+ },
532
+ "expected": {
533
+ "exit_code": 7,
534
+ "error_code": "invalid_patch_value",
535
+ "writes": 0
536
+ },
537
+ "title_en": "A string used for a numeric ID",
538
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
539
+ },
540
+ {
541
+ "id": "unknown_field",
542
+ "title": "不存在的参数名",
543
+ "file": "negative/unknown_field.json",
544
+ "device_type": 13,
545
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
546
+ "schema_valid": false,
547
+ "fixture": {
548
+ "type": 13,
549
+ "case": null,
550
+ "replace_uid": true
551
+ },
552
+ "expected": {
553
+ "exit_code": 7,
554
+ "error_code": "invalid_patch_field",
555
+ "writes": 0
556
+ },
557
+ "title_en": "Unknown parameter name",
558
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
559
+ },
560
+ {
561
+ "id": "adaptive_mixed",
562
+ "title": "自适应开启与其他修改混合",
563
+ "file": "negative/adaptive_mixed.json",
564
+ "device_type": 26,
565
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
566
+ "schema_valid": false,
567
+ "fixture": {
568
+ "type": 26,
569
+ "case": null,
570
+ "replace_uid": true
571
+ },
572
+ "expected": {
573
+ "exit_code": 7,
574
+ "error_code": "adaptive_enable_only",
575
+ "writes": 0
576
+ },
577
+ "title_en": "Adaptive enable mixed with another change",
578
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
579
+ },
580
+ {
581
+ "id": "restricted_inheritance",
582
+ "title": "从自适应读回继承参数",
583
+ "file": "negative/restricted_inheritance.json",
584
+ "device_type": 26,
585
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
586
+ "schema_valid": true,
587
+ "fixture": {
588
+ "type": 26,
589
+ "case": "auto",
590
+ "replace_uid": true
591
+ },
592
+ "expected": {
593
+ "exit_code": 7,
594
+ "error_code": "readonly_parameters",
595
+ "writes": 0
596
+ },
597
+ "title_en": "Inheritance from adaptive readback",
598
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
599
+ },
600
+ {
601
+ "id": "unsupported_adaptive",
602
+ "title": "CANCOM 不支持开启自适应",
603
+ "file": "negative/unsupported_adaptive.json",
604
+ "device_type": 24,
605
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
606
+ "schema_valid": true,
607
+ "fixture": {
608
+ "type": 24,
609
+ "case": null,
610
+ "replace_uid": true
611
+ },
612
+ "expected": {
613
+ "exit_code": 5,
614
+ "error_code": "adaptive_not_supported",
615
+ "writes": 0
616
+ },
617
+ "title_en": "Adaptive enable on unsupported CANCOM",
618
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
619
+ },
620
+ {
621
+ "id": "hub_missing_ps",
622
+ "title": "Hub 的 BRT 缺少 PS",
623
+ "file": "negative/hub_missing_ps.json",
624
+ "device_type": 35,
625
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
626
+ "schema_valid": true,
627
+ "fixture": {
628
+ "type": 35,
629
+ "case": null,
630
+ "replace_uid": true
631
+ },
632
+ "expected": {
633
+ "exit_code": 7,
634
+ "error_code": "invalid_configuration",
635
+ "writes": 0
636
+ },
637
+ "title_en": "Hub BRT missing PS",
638
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
639
+ },
640
+ {
641
+ "id": "short_user_data",
642
+ "title": "USER_DATA 不足 32 字节",
643
+ "file": "negative/short_user_data.json",
644
+ "device_type": 13,
645
+ "precondition": "负例仅用于离线 Schema 或隔离假驱动验收,禁止向真实设备试写。",
646
+ "schema_valid": false,
647
+ "fixture": {
648
+ "type": 13,
649
+ "case": null,
650
+ "replace_uid": true
651
+ },
652
+ "expected": {
653
+ "exit_code": 7,
654
+ "error_code": "invalid_patch_value",
655
+ "writes": 0
656
+ },
657
+ "title_en": "USER_DATA shorter than 32 bytes",
658
+ "precondition_en": "Negative test only: offline schema or isolated fake-driver acceptance; never try on a physical device."
659
+ }
660
+ ]
661
+ }