chronaxis 0.1.0.dev0__py3-none-any.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 (917) hide show
  1. chronaxis/__init__.py +72 -0
  2. chronaxis/__main__.py +12 -0
  3. chronaxis/analysis_cli.py +181 -0
  4. chronaxis/batch/__init__.py +14 -0
  5. chronaxis/batch/api.py +46 -0
  6. chronaxis/batch/cli.py +48 -0
  7. chronaxis/batch/config.py +37 -0
  8. chronaxis/batch/models.py +202 -0
  9. chronaxis/batch/process_transport.py +149 -0
  10. chronaxis/batch/process_tree.py +72 -0
  11. chronaxis/batch/publication.py +41 -0
  12. chronaxis/batch/runner.py +236 -0
  13. chronaxis/batch/templates.py +42 -0
  14. chronaxis/can_dependencies.py +42 -0
  15. chronaxis/cli.py +193 -0
  16. chronaxis/configuration/__init__.py +46 -0
  17. chronaxis/configuration/cli.py +41 -0
  18. chronaxis/configuration/diagnostics.py +107 -0
  19. chronaxis/configuration/explanation.py +233 -0
  20. chronaxis/configuration/file_tools.py +140 -0
  21. chronaxis/configuration/imports.py +144 -0
  22. chronaxis/configuration/initialization.py +36 -0
  23. chronaxis/configuration/json_parser.py +114 -0
  24. chronaxis/configuration/models.py +74 -0
  25. chronaxis/configuration/origins.py +90 -0
  26. chronaxis/configuration/overrides.py +55 -0
  27. chronaxis/configuration/resolution.py +150 -0
  28. chronaxis/configuration/template_catalog.py +68 -0
  29. chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
  30. chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
  31. chronaxis/configuration/templates/batch/annotated.yaml +6 -0
  32. chronaxis/configuration/templates/batch/minimal.yaml +6 -0
  33. chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
  34. chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
  35. chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
  36. chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
  37. chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
  38. chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
  39. chronaxis/configuration/templates/catalog.json +233 -0
  40. chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
  41. chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
  42. chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
  43. chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
  44. chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
  45. chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
  46. chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
  47. chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
  48. chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
  49. chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
  50. chronaxis/configuration/templates/shared/charge-session.asc +5 -0
  51. chronaxis/configuration/templates/shared/command-response.asc +8 -0
  52. chronaxis/configuration/templates/shared/fault-window.asc +5 -0
  53. chronaxis/configuration/templates/shared/power.asc +7 -0
  54. chronaxis/configuration/templates/shared/sample.asc +6 -0
  55. chronaxis/configuration/templates/shared/sample.blf +0 -0
  56. chronaxis/configuration/templates/shared/sample.csv +5 -0
  57. chronaxis/configuration/templates/shared/sample.dbc +11 -0
  58. chronaxis/configuration/templates/shared/signals.csv +6 -0
  59. chronaxis/configuration/templates/shared/source.ini +5 -0
  60. chronaxis/configuration/templates/shared/stability.asc +9 -0
  61. chronaxis/configuration/templates/shared/teaching.dbc +27 -0
  62. chronaxis/configuration/templates/shared/threshold.asc +7 -0
  63. chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
  64. chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
  65. chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
  66. chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
  67. chronaxis/configuration/templates/stability/annotated.yaml +35 -0
  68. chronaxis/configuration/templates/stability/minimal.yaml +35 -0
  69. chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
  70. chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
  71. chronaxis/configuration/yaml_parser.py +125 -0
  72. chronaxis/core/__init__.py +71 -0
  73. chronaxis/core/binding.py +449 -0
  74. chronaxis/core/calculation_series_join.py +106 -0
  75. chronaxis/core/calculations.py +435 -0
  76. chronaxis/core/calculations_memory_numpy.py +136 -0
  77. chronaxis/core/calculations_memory_reference.py +165 -0
  78. chronaxis/core/calculations_numpy.py +298 -0
  79. chronaxis/core/calculations_reference.py +294 -0
  80. chronaxis/core/condition_evidence.py +182 -0
  81. chronaxis/core/conditional_integral_result.py +43 -0
  82. chronaxis/core/conditional_integral_terms.py +146 -0
  83. chronaxis/core/conditional_integral_terms_numpy.py +148 -0
  84. chronaxis/core/conditional_integral_terms_reference.py +111 -0
  85. chronaxis/core/conditional_time_reduction.py +118 -0
  86. chronaxis/core/conditional_time_reduction_numpy.py +223 -0
  87. chronaxis/core/conditional_time_reduction_reference.py +213 -0
  88. chronaxis/core/declarations.py +192 -0
  89. chronaxis/core/decoded_binding.py +197 -0
  90. chronaxis/core/direct_message.py +387 -0
  91. chronaxis/core/export_interpolation.py +54 -0
  92. chronaxis/core/expression.py +642 -0
  93. chronaxis/core/expression_numpy.py +314 -0
  94. chronaxis/core/expression_reference.py +272 -0
  95. chronaxis/core/integral_result.py +53 -0
  96. chronaxis/core/integral_sum.py +77 -0
  97. chronaxis/core/integral_sum_numpy.py +224 -0
  98. chronaxis/core/integral_sum_reference.py +148 -0
  99. chronaxis/core/integral_terms.py +119 -0
  100. chronaxis/core/integral_terms_numpy.py +127 -0
  101. chronaxis/core/integral_terms_reference.py +91 -0
  102. chronaxis/core/mean_weights_numpy.py +29 -0
  103. chronaxis/core/mean_weights_reference.py +27 -0
  104. chronaxis/core/message_binding.py +305 -0
  105. chronaxis/core/models.py +485 -0
  106. chronaxis/core/normalize_numpy.py +396 -0
  107. chronaxis/core/numeric.py +472 -0
  108. chronaxis/core/numeric_numpy.py +440 -0
  109. chronaxis/core/record_intervals.py +115 -0
  110. chronaxis/core/sample_reduction.py +161 -0
  111. chronaxis/core/sample_reduction_numpy.py +160 -0
  112. chronaxis/core/sample_reduction_reference.py +154 -0
  113. chronaxis/core/selection.py +74 -0
  114. chronaxis/core/sequence.py +160 -0
  115. chronaxis/core/sequence_reference.py +248 -0
  116. chronaxis/core/stability.py +249 -0
  117. chronaxis/core/start_end.py +169 -0
  118. chronaxis/core/state.py +494 -0
  119. chronaxis/core/state_numpy.py +296 -0
  120. chronaxis/core/temporal.py +373 -0
  121. chronaxis/core/temporal_clock.py +25 -0
  122. chronaxis/core/temporal_memory_numpy.py +163 -0
  123. chronaxis/core/temporal_memory_reference.py +161 -0
  124. chronaxis/core/temporal_numpy.py +345 -0
  125. chronaxis/core/temporal_reference.py +304 -0
  126. chronaxis/core/time_reduction.py +190 -0
  127. chronaxis/core/time_reduction_numpy.py +205 -0
  128. chronaxis/core/time_reduction_reference.py +203 -0
  129. chronaxis/core/types.py +105 -0
  130. chronaxis/core/units.py +81 -0
  131. chronaxis/core/validation.py +94 -0
  132. chronaxis/core/window_delta.py +123 -0
  133. chronaxis/core/window_delta_numpy.py +78 -0
  134. chronaxis/core/window_delta_reference.py +69 -0
  135. chronaxis/core/windows.py +224 -0
  136. chronaxis/core/windows_numpy.py +78 -0
  137. chronaxis/core/windows_reference.py +61 -0
  138. chronaxis/execution/__init__.py +6 -0
  139. chronaxis/execution/batch_signal_groups.py +122 -0
  140. chronaxis/execution/bindings.py +296 -0
  141. chronaxis/execution/boundaries.py +568 -0
  142. chronaxis/execution/calculation_blocks.py +338 -0
  143. chronaxis/execution/calculation_values.py +55 -0
  144. chronaxis/execution/can_batch_reader.py +356 -0
  145. chronaxis/execution/can_reader.py +948 -0
  146. chronaxis/execution/can_reference_template.py +61 -0
  147. chronaxis/execution/condition_evidence.py +370 -0
  148. chronaxis/execution/conditional_integral_facts.py +310 -0
  149. chronaxis/execution/conditional_integral_reduction.py +216 -0
  150. chronaxis/execution/csv_observation.py +524 -0
  151. chronaxis/execution/csv_reader.py +662 -0
  152. chronaxis/execution/current_message_calculation.py +225 -0
  153. chronaxis/execution/driver_expression.py +274 -0
  154. chronaxis/execution/expressions.py +618 -0
  155. chronaxis/execution/frame_capture.py +245 -0
  156. chronaxis/execution/groups.py +236 -0
  157. chronaxis/execution/historical_conditional_blocks.py +264 -0
  158. chronaxis/execution/historical_conditional_integral.py +226 -0
  159. chronaxis/execution/historical_conditional_time_calculation.py +368 -0
  160. chronaxis/execution/historical_integral.py +219 -0
  161. chronaxis/execution/historical_observation.py +372 -0
  162. chronaxis/execution/historical_sample_calculation.py +338 -0
  163. chronaxis/execution/historical_selection_rows.py +300 -0
  164. chronaxis/execution/historical_time_calculation.py +341 -0
  165. chronaxis/execution/history.py +572 -0
  166. chronaxis/execution/history_records.py +225 -0
  167. chronaxis/execution/hold.py +448 -0
  168. chronaxis/execution/integral_facts.py +311 -0
  169. chronaxis/execution/integral_reduction.py +216 -0
  170. chronaxis/execution/legacy_frame_samples.py +94 -0
  171. chronaxis/execution/memory_reader.py +247 -0
  172. chronaxis/execution/message_bindings.py +293 -0
  173. chronaxis/execution/message_delivery.py +37 -0
  174. chronaxis/execution/observed_ingestion.py +551 -0
  175. chronaxis/execution/raw_signal_groups.py +192 -0
  176. chronaxis/execution/record_alarm_duration.py +114 -0
  177. chronaxis/execution/record_delta_condition.py +167 -0
  178. chronaxis/execution/record_diagnostics.py +87 -0
  179. chronaxis/execution/record_event_durations.py +143 -0
  180. chronaxis/execution/record_export_samples.py +94 -0
  181. chronaxis/execution/record_exports.py +155 -0
  182. chronaxis/execution/record_integral.py +196 -0
  183. chronaxis/execution/record_point_buffer.py +101 -0
  184. chronaxis/execution/record_rule_timeline.py +344 -0
  185. chronaxis/execution/record_sample.py +46 -0
  186. chronaxis/execution/record_sample_series.py +29 -0
  187. chronaxis/execution/record_scope_calculations.py +290 -0
  188. chronaxis/execution/record_selection.py +62 -0
  189. chronaxis/execution/record_sequences.py +199 -0
  190. chronaxis/execution/record_session_calculations.py +778 -0
  191. chronaxis/execution/record_signal_export.py +133 -0
  192. chronaxis/execution/record_source_cursor.py +295 -0
  193. chronaxis/execution/record_time_calculation.py +322 -0
  194. chronaxis/execution/record_time_indexes.py +143 -0
  195. chronaxis/execution/record_value_history.py +160 -0
  196. chronaxis/execution/record_windows.py +229 -0
  197. chronaxis/execution/required_expression.py +52 -0
  198. chronaxis/execution/retained_metadata.py +71 -0
  199. chronaxis/execution/run_session.py +402 -0
  200. chronaxis/execution/scanned_signal_proof.py +550 -0
  201. chronaxis/execution/signal_validity.py +40 -0
  202. chronaxis/execution/state.py +280 -0
  203. chronaxis/execution/temporal_buffer.py +508 -0
  204. chronaxis/execution/text_can_reader.py +359 -0
  205. chronaxis/execution/timeline.py +309 -0
  206. chronaxis/execution/timeline_multi.py +415 -0
  207. chronaxis/execution/window_delta_events.py +220 -0
  208. chronaxis/execution/window_replay.py +350 -0
  209. chronaxis/execution/windows.py +173 -0
  210. chronaxis/guide/README.md +70 -0
  211. chronaxis/guide/api/AnalysisError.md +14 -0
  212. chronaxis/guide/api/AnalysisPlan.md +96 -0
  213. chronaxis/guide/api/AnalysisResult.md +398 -0
  214. chronaxis/guide/api/AnalysisRunner.md +155 -0
  215. chronaxis/guide/api/BatchJob.md +19 -0
  216. chronaxis/guide/api/BatchJobResult.md +61 -0
  217. chronaxis/guide/api/BatchPlan.md +48 -0
  218. chronaxis/guide/api/BatchReport.md +108 -0
  219. chronaxis/guide/api/BatchRunner.md +84 -0
  220. chronaxis/guide/api/OutputManifest.md +23 -0
  221. chronaxis/guide/api/PlanFragment.md +47 -0
  222. chronaxis/guide/api/PlanValidationError.md +98 -0
  223. chronaxis/guide/api/PresetSpec.md +63 -0
  224. chronaxis/guide/api/ResultClosedError.md +14 -0
  225. chronaxis/guide/api/RunMetadata.md +100 -0
  226. chronaxis/guide/api/TimeConversion.md +29 -0
  227. chronaxis/guide/api/TimeOverflowError.md +17 -0
  228. chronaxis/guide/api/build_preset.md +36 -0
  229. chronaxis/guide/api/checked_add_ns.md +30 -0
  230. chronaxis/guide/api/convert_time.md +40 -0
  231. chronaxis/guide/api/explain_analysis_plan.md +38 -0
  232. chronaxis/guide/api/index.json +185 -0
  233. chronaxis/guide/api/load_analysis_plan.md +34 -0
  234. chronaxis/guide/api/load_batch_plan.md +36 -0
  235. chronaxis/guide/api/parse_datetime_ns.md +35 -0
  236. chronaxis/guide/api/parse_duration.md +30 -0
  237. chronaxis/guide/api/resolve_preset_roles.md +37 -0
  238. chronaxis/guide/api/run_batch.md +38 -0
  239. chronaxis/guide/api/shift_times_reference.md +33 -0
  240. chronaxis/guide/api/time_deltas_reference.md +37 -0
  241. chronaxis/guide/api/validate_analysis_plan.md +38 -0
  242. chronaxis/guide/en/README.md +74 -0
  243. chronaxis/guide/en/api/AnalysisError.md +14 -0
  244. chronaxis/guide/en/api/AnalysisPlan.md +93 -0
  245. chronaxis/guide/en/api/AnalysisResult.md +398 -0
  246. chronaxis/guide/en/api/AnalysisRunner.md +191 -0
  247. chronaxis/guide/en/api/BatchJob.md +17 -0
  248. chronaxis/guide/en/api/BatchJobResult.md +43 -0
  249. chronaxis/guide/en/api/BatchPlan.md +37 -0
  250. chronaxis/guide/en/api/BatchReport.md +52 -0
  251. chronaxis/guide/en/api/BatchRunner.md +51 -0
  252. chronaxis/guide/en/api/OutputManifest.md +23 -0
  253. chronaxis/guide/en/api/PlanFragment.md +33 -0
  254. chronaxis/guide/en/api/PlanValidationError.md +58 -0
  255. chronaxis/guide/en/api/PresetSpec.md +51 -0
  256. chronaxis/guide/en/api/ResultClosedError.md +14 -0
  257. chronaxis/guide/en/api/RunMetadata.md +100 -0
  258. chronaxis/guide/en/api/TimeConversion.md +23 -0
  259. chronaxis/guide/en/api/TimeOverflowError.md +14 -0
  260. chronaxis/guide/en/api/build_preset.md +23 -0
  261. chronaxis/guide/en/api/checked_add_ns.md +21 -0
  262. chronaxis/guide/en/api/convert_time.md +25 -0
  263. chronaxis/guide/en/api/explain_analysis_plan.md +30 -0
  264. chronaxis/guide/en/api/index.json +185 -0
  265. chronaxis/guide/en/api/load_analysis_plan.md +27 -0
  266. chronaxis/guide/en/api/load_batch_plan.md +28 -0
  267. chronaxis/guide/en/api/parse_datetime_ns.md +23 -0
  268. chronaxis/guide/en/api/parse_duration.md +20 -0
  269. chronaxis/guide/en/api/resolve_preset_roles.md +23 -0
  270. chronaxis/guide/en/api/run_batch.md +39 -0
  271. chronaxis/guide/en/api/shift_times_reference.md +21 -0
  272. chronaxis/guide/en/api/time_deltas_reference.md +22 -0
  273. chronaxis/guide/en/api/validate_analysis_plan.md +29 -0
  274. chronaxis/guide/en/fields/analysis/calculations-all-1.json +345 -0
  275. chronaxis/guide/en/fields/analysis/calculations-all-2.json +300 -0
  276. chronaxis/guide/en/fields/analysis/calculations-all-3.json +84 -0
  277. chronaxis/guide/en/fields/analysis/config_version-all-1.json +24 -0
  278. chronaxis/guide/en/fields/analysis/dataset-all-1.json +344 -0
  279. chronaxis/guide/en/fields/analysis/derived-all-1.json +147 -0
  280. chronaxis/guide/en/fields/analysis/diagnostics-all-1.json +69 -0
  281. chronaxis/guide/en/fields/analysis/execution-all-1.json +167 -0
  282. chronaxis/guide/en/fields/analysis/imports-all-1.json +39 -0
  283. chronaxis/guide/en/fields/analysis/intervals-all-1.json +173 -0
  284. chronaxis/guide/en/fields/analysis/message_calculations-all-1.json +345 -0
  285. chronaxis/guide/en/fields/analysis/message_calculations-all-2.json +270 -0
  286. chronaxis/guide/en/fields/analysis/metadata-all-1.json +24 -0
  287. chronaxis/guide/en/fields/analysis/outputs-all-1.json +332 -0
  288. chronaxis/guide/en/fields/analysis/outputs-all-2.json +319 -0
  289. chronaxis/guide/en/fields/analysis/outputs-all-3.json +321 -0
  290. chronaxis/guide/en/fields/analysis/outputs-all-4.json +236 -0
  291. chronaxis/guide/en/fields/analysis/outputs-all-5.json +246 -0
  292. chronaxis/guide/en/fields/analysis/outputs-all-6.json +214 -0
  293. chronaxis/guide/en/fields/analysis/overrides-all-1.json +104 -0
  294. chronaxis/guide/en/fields/analysis/presets-charge_session-1.json +398 -0
  295. chronaxis/guide/en/fields/analysis/presets-charge_session-2.json +114 -0
  296. chronaxis/guide/en/fields/analysis/presets-command_response-1.json +376 -0
  297. chronaxis/guide/en/fields/analysis/presets-fault_context-1.json +285 -0
  298. chronaxis/guide/en/fields/analysis/presets-threshold_excursion-1.json +317 -0
  299. chronaxis/guide/en/fields/analysis/rules-condition_duration-1.json +344 -0
  300. chronaxis/guide/en/fields/analysis/rules-condition_duration-2.json +27 -0
  301. chronaxis/guide/en/fields/analysis/rules-debounce-1.json +335 -0
  302. chronaxis/guide/en/fields/analysis/rules-falling_edge-1.json +317 -0
  303. chronaxis/guide/en/fields/analysis/rules-hysteresis-1.json +334 -0
  304. chronaxis/guide/en/fields/analysis/rules-hysteresis-2.json +27 -0
  305. chronaxis/guide/en/fields/analysis/rules-rising_edge-1.json +317 -0
  306. chronaxis/guide/en/fields/analysis/rules-start_end-1.json +333 -0
  307. chronaxis/guide/en/fields/analysis/rules-start_end-2.json +60 -0
  308. chronaxis/guide/en/fields/analysis/rules-start_only-1.json +334 -0
  309. chronaxis/guide/en/fields/analysis/rules-window_delta-1.json +338 -0
  310. chronaxis/guide/en/fields/analysis/rules-window_delta-2.json +96 -0
  311. chronaxis/guide/en/fields/analysis/sequences-all-1.json +378 -0
  312. chronaxis/guide/en/fields/analysis/sequences-all-2.json +70 -0
  313. chronaxis/guide/en/fields/analysis/signals-variant-1-1.json +349 -0
  314. chronaxis/guide/en/fields/analysis/signals-variant-1-2.json +297 -0
  315. chronaxis/guide/en/fields/analysis/signals-variant-1-3.json +323 -0
  316. chronaxis/guide/en/fields/analysis/signals-variant-1-4.json +192 -0
  317. chronaxis/guide/en/fields/analysis/signals-variant-2-1.json +327 -0
  318. chronaxis/guide/en/fields/analysis/signals-variant-2-2.json +312 -0
  319. chronaxis/guide/en/fields/analysis/signals-variant-2-3.json +294 -0
  320. chronaxis/guide/en/fields/analysis/signals-variant-2-4.json +253 -0
  321. chronaxis/guide/en/fields/analysis/signals-variant-2-5.json +44 -0
  322. chronaxis/guide/en/fields/analysis/sources-can_asc-1.json +318 -0
  323. chronaxis/guide/en/fields/analysis/sources-can_asc-2.json +310 -0
  324. chronaxis/guide/en/fields/analysis/sources-can_asc-3.json +311 -0
  325. chronaxis/guide/en/fields/analysis/sources-can_asc-4.json +69 -0
  326. chronaxis/guide/en/fields/analysis/sources-can_blf-1.json +317 -0
  327. chronaxis/guide/en/fields/analysis/sources-can_blf-2.json +310 -0
  328. chronaxis/guide/en/fields/analysis/sources-can_blf-3.json +317 -0
  329. chronaxis/guide/en/fields/analysis/sources-memory-1.json +332 -0
  330. chronaxis/guide/en/fields/analysis/sources-memory-2.json +125 -0
  331. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-1.json +330 -0
  332. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-10.json +233 -0
  333. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-11.json +225 -0
  334. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-12.json +228 -0
  335. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-13.json +226 -0
  336. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-14.json +230 -0
  337. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-15.json +227 -0
  338. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-16.json +230 -0
  339. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-17.json +238 -0
  340. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-18.json +239 -0
  341. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-19.json +233 -0
  342. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-2.json +310 -0
  343. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-20.json +242 -0
  344. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-21.json +230 -0
  345. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-22.json +228 -0
  346. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-23.json +230 -0
  347. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-24.json +223 -0
  348. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-25.json +290 -0
  349. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-26.json +131 -0
  350. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-3.json +297 -0
  351. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-4.json +226 -0
  352. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-5.json +230 -0
  353. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-6.json +227 -0
  354. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-7.json +230 -0
  355. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-8.json +238 -0
  356. chronaxis/guide/en/fields/analysis/sources-raw_can_csv-9.json +239 -0
  357. chronaxis/guide/en/fields/analysis/sources-signal_csv-1.json +331 -0
  358. chronaxis/guide/en/fields/analysis/sources-signal_csv-2.json +307 -0
  359. chronaxis/guide/en/fields/analysis/sources-signal_csv-3.json +315 -0
  360. chronaxis/guide/en/fields/analysis/sources-variant-6-1.json +319 -0
  361. chronaxis/guide/en/fields/analysis/sources-variant-6-2.json +307 -0
  362. chronaxis/guide/en/fields/analysis/sources-variant-6-3.json +312 -0
  363. chronaxis/guide/en/fields/analysis/sources-variant-6-4.json +113 -0
  364. chronaxis/guide/en/fields/analysis/windows-all-1.json +361 -0
  365. chronaxis/guide/en/fields/analysis/windows-all-2.json +187 -0
  366. chronaxis/guide/en/fields/batch/backend-all-1.json +26 -0
  367. chronaxis/guide/en/fields/batch/batch_version-all-1.json +22 -0
  368. chronaxis/guide/en/fields/batch/fail_fast-all-1.json +22 -0
  369. chronaxis/guide/en/fields/batch/inputs-all-1.json +161 -0
  370. chronaxis/guide/en/fields/batch/jobs-all-1.json +58 -0
  371. chronaxis/guide/en/fields/batch/process_count-all-1.json +23 -0
  372. chronaxis/guide/en/fields/batch/source-all-1.json +22 -0
  373. chronaxis/guide/en/fields/batch/template-all-1.json +22 -0
  374. chronaxis/guide/en/fields/definitions/derived-all-1.json +121 -0
  375. chronaxis/guide/en/fields/definitions/signals-all-1.json +336 -0
  376. chronaxis/guide/en/fields/definitions/signals-all-2.json +307 -0
  377. chronaxis/guide/en/fields/definitions/signals-all-3.json +290 -0
  378. chronaxis/guide/en/fields/definitions/signals-all-4.json +347 -0
  379. chronaxis/guide/en/fields/definitions/signals-all-5.json +297 -0
  380. chronaxis/guide/en/fields/definitions/signals-all-6.json +259 -0
  381. chronaxis/guide/en/fields/definitions/signals-all-7.json +117 -0
  382. chronaxis/guide/en/fields/definitions/sources-all-1.json +332 -0
  383. chronaxis/guide/en/fields/definitions/sources-all-10.json +306 -0
  384. chronaxis/guide/en/fields/definitions/sources-all-11.json +294 -0
  385. chronaxis/guide/en/fields/definitions/sources-all-12.json +212 -0
  386. chronaxis/guide/en/fields/definitions/sources-all-13.json +217 -0
  387. chronaxis/guide/en/fields/definitions/sources-all-14.json +213 -0
  388. chronaxis/guide/en/fields/definitions/sources-all-15.json +214 -0
  389. chronaxis/guide/en/fields/definitions/sources-all-16.json +215 -0
  390. chronaxis/guide/en/fields/definitions/sources-all-17.json +213 -0
  391. chronaxis/guide/en/fields/definitions/sources-all-18.json +214 -0
  392. chronaxis/guide/en/fields/definitions/sources-all-19.json +213 -0
  393. chronaxis/guide/en/fields/definitions/sources-all-2.json +323 -0
  394. chronaxis/guide/en/fields/definitions/sources-all-20.json +217 -0
  395. chronaxis/guide/en/fields/definitions/sources-all-21.json +210 -0
  396. chronaxis/guide/en/fields/definitions/sources-all-22.json +214 -0
  397. chronaxis/guide/en/fields/definitions/sources-all-23.json +218 -0
  398. chronaxis/guide/en/fields/definitions/sources-all-24.json +209 -0
  399. chronaxis/guide/en/fields/definitions/sources-all-25.json +215 -0
  400. chronaxis/guide/en/fields/definitions/sources-all-26.json +218 -0
  401. chronaxis/guide/en/fields/definitions/sources-all-27.json +224 -0
  402. chronaxis/guide/en/fields/definitions/sources-all-28.json +215 -0
  403. chronaxis/guide/en/fields/definitions/sources-all-29.json +205 -0
  404. chronaxis/guide/en/fields/definitions/sources-all-3.json +303 -0
  405. chronaxis/guide/en/fields/definitions/sources-all-30.json +298 -0
  406. chronaxis/guide/en/fields/definitions/sources-all-31.json +315 -0
  407. chronaxis/guide/en/fields/definitions/sources-all-32.json +306 -0
  408. chronaxis/guide/en/fields/definitions/sources-all-33.json +209 -0
  409. chronaxis/guide/en/fields/definitions/sources-all-4.json +336 -0
  410. chronaxis/guide/en/fields/definitions/sources-all-5.json +299 -0
  411. chronaxis/guide/en/fields/definitions/sources-all-6.json +307 -0
  412. chronaxis/guide/en/fields/definitions/sources-all-7.json +320 -0
  413. chronaxis/guide/en/fields/definitions/sources-all-8.json +303 -0
  414. chronaxis/guide/en/fields/definitions/sources-all-9.json +315 -0
  415. chronaxis/guide/en/fields/index.json +3450 -0
  416. chronaxis/guide/en/fields/mapping/aliases-all-1.json +91 -0
  417. chronaxis/guide/en/fields/mapping/analysis-all-1.json +382 -0
  418. chronaxis/guide/en/fields/mapping/analysis-all-10.json +301 -0
  419. chronaxis/guide/en/fields/mapping/analysis-all-11.json +312 -0
  420. chronaxis/guide/en/fields/mapping/analysis-all-12.json +311 -0
  421. chronaxis/guide/en/fields/mapping/analysis-all-13.json +314 -0
  422. chronaxis/guide/en/fields/mapping/analysis-all-14.json +310 -0
  423. chronaxis/guide/en/fields/mapping/analysis-all-15.json +297 -0
  424. chronaxis/guide/en/fields/mapping/analysis-all-16.json +226 -0
  425. chronaxis/guide/en/fields/mapping/analysis-all-17.json +230 -0
  426. chronaxis/guide/en/fields/mapping/analysis-all-18.json +227 -0
  427. chronaxis/guide/en/fields/mapping/analysis-all-19.json +230 -0
  428. chronaxis/guide/en/fields/mapping/analysis-all-2.json +323 -0
  429. chronaxis/guide/en/fields/mapping/analysis-all-20.json +221 -0
  430. chronaxis/guide/en/fields/mapping/analysis-all-21.json +237 -0
  431. chronaxis/guide/en/fields/mapping/analysis-all-22.json +233 -0
  432. chronaxis/guide/en/fields/mapping/analysis-all-23.json +222 -0
  433. chronaxis/guide/en/fields/mapping/analysis-all-24.json +231 -0
  434. chronaxis/guide/en/fields/mapping/analysis-all-25.json +225 -0
  435. chronaxis/guide/en/fields/mapping/analysis-all-26.json +230 -0
  436. chronaxis/guide/en/fields/mapping/analysis-all-27.json +228 -0
  437. chronaxis/guide/en/fields/mapping/analysis-all-28.json +230 -0
  438. chronaxis/guide/en/fields/mapping/analysis-all-29.json +223 -0
  439. chronaxis/guide/en/fields/mapping/analysis-all-3.json +318 -0
  440. chronaxis/guide/en/fields/mapping/analysis-all-30.json +233 -0
  441. chronaxis/guide/en/fields/mapping/analysis-all-31.json +218 -0
  442. chronaxis/guide/en/fields/mapping/analysis-all-32.json +239 -0
  443. chronaxis/guide/en/fields/mapping/analysis-all-33.json +233 -0
  444. chronaxis/guide/en/fields/mapping/analysis-all-34.json +225 -0
  445. chronaxis/guide/en/fields/mapping/analysis-all-35.json +228 -0
  446. chronaxis/guide/en/fields/mapping/analysis-all-36.json +226 -0
  447. chronaxis/guide/en/fields/mapping/analysis-all-37.json +244 -0
  448. chronaxis/guide/en/fields/mapping/analysis-all-38.json +326 -0
  449. chronaxis/guide/en/fields/mapping/analysis-all-39.json +299 -0
  450. chronaxis/guide/en/fields/mapping/analysis-all-4.json +297 -0
  451. chronaxis/guide/en/fields/mapping/analysis-all-40.json +311 -0
  452. chronaxis/guide/en/fields/mapping/analysis-all-41.json +310 -0
  453. chronaxis/guide/en/fields/mapping/analysis-all-42.json +346 -0
  454. chronaxis/guide/en/fields/mapping/analysis-all-43.json +267 -0
  455. chronaxis/guide/en/fields/mapping/analysis-all-44.json +327 -0
  456. chronaxis/guide/en/fields/mapping/analysis-all-45.json +279 -0
  457. chronaxis/guide/en/fields/mapping/analysis-all-46.json +327 -0
  458. chronaxis/guide/en/fields/mapping/analysis-all-47.json +312 -0
  459. chronaxis/guide/en/fields/mapping/analysis-all-48.json +294 -0
  460. chronaxis/guide/en/fields/mapping/analysis-all-49.json +253 -0
  461. chronaxis/guide/en/fields/mapping/analysis-all-5.json +312 -0
  462. chronaxis/guide/en/fields/mapping/analysis-all-50.json +346 -0
  463. chronaxis/guide/en/fields/mapping/analysis-all-51.json +324 -0
  464. chronaxis/guide/en/fields/mapping/analysis-all-52.json +335 -0
  465. chronaxis/guide/en/fields/mapping/analysis-all-53.json +317 -0
  466. chronaxis/guide/en/fields/mapping/analysis-all-54.json +316 -0
  467. chronaxis/guide/en/fields/mapping/analysis-all-55.json +302 -0
  468. chronaxis/guide/en/fields/mapping/analysis-all-56.json +319 -0
  469. chronaxis/guide/en/fields/mapping/analysis-all-57.json +334 -0
  470. chronaxis/guide/en/fields/mapping/analysis-all-58.json +333 -0
  471. chronaxis/guide/en/fields/mapping/analysis-all-59.json +359 -0
  472. chronaxis/guide/en/fields/mapping/analysis-all-6.json +327 -0
  473. chronaxis/guide/en/fields/mapping/analysis-all-60.json +303 -0
  474. chronaxis/guide/en/fields/mapping/analysis-all-61.json +326 -0
  475. chronaxis/guide/en/fields/mapping/analysis-all-62.json +301 -0
  476. chronaxis/guide/en/fields/mapping/analysis-all-63.json +326 -0
  477. chronaxis/guide/en/fields/mapping/analysis-all-64.json +367 -0
  478. chronaxis/guide/en/fields/mapping/analysis-all-65.json +334 -0
  479. chronaxis/guide/en/fields/mapping/analysis-all-66.json +358 -0
  480. chronaxis/guide/en/fields/mapping/analysis-all-67.json +349 -0
  481. chronaxis/guide/en/fields/mapping/analysis-all-68.json +331 -0
  482. chronaxis/guide/en/fields/mapping/analysis-all-69.json +304 -0
  483. chronaxis/guide/en/fields/mapping/analysis-all-7.json +303 -0
  484. chronaxis/guide/en/fields/mapping/analysis-all-70.json +349 -0
  485. chronaxis/guide/en/fields/mapping/analysis-all-71.json +288 -0
  486. chronaxis/guide/en/fields/mapping/analysis-all-72.json +316 -0
  487. chronaxis/guide/en/fields/mapping/analysis-all-73.json +266 -0
  488. chronaxis/guide/en/fields/mapping/analysis-all-74.json +227 -0
  489. chronaxis/guide/en/fields/mapping/analysis-all-75.json +239 -0
  490. chronaxis/guide/en/fields/mapping/analysis-all-76.json +274 -0
  491. chronaxis/guide/en/fields/mapping/analysis-all-77.json +380 -0
  492. chronaxis/guide/en/fields/mapping/analysis-all-78.json +313 -0
  493. chronaxis/guide/en/fields/mapping/analysis-all-79.json +338 -0
  494. chronaxis/guide/en/fields/mapping/analysis-all-8.json +292 -0
  495. chronaxis/guide/en/fields/mapping/analysis-all-80.json +304 -0
  496. chronaxis/guide/en/fields/mapping/analysis-all-81.json +140 -0
  497. chronaxis/guide/en/fields/mapping/analysis-all-9.json +332 -0
  498. chronaxis/guide/en/fields/mapping/io_policy-all-1.json +19 -0
  499. chronaxis/guide/en/fields/mapping/mapping_version-all-1.json +19 -0
  500. chronaxis/guide/en/fields/mapping/path_base-all-1.json +19 -0
  501. chronaxis/guide/en/fields/mapping/sections-all-1.json +402 -0
  502. chronaxis/guide/en/fields/mapping/sections-all-2.json +232 -0
  503. chronaxis/guide/en/semantics.md +70 -0
  504. chronaxis/guide/en/tasks.json +290 -0
  505. chronaxis/guide/en/workflow.md +41 -0
  506. chronaxis/guide/examples/analysis-imports.yaml +22 -0
  507. chronaxis/guide/examples/analysis.yaml +23 -0
  508. chronaxis/guide/examples/batch-minimal.yaml +3 -0
  509. chronaxis/guide/examples/conditional-energy.yaml +36 -0
  510. chronaxis/guide/examples/data/activity.csv +6 -0
  511. chronaxis/guide/examples/data/can/activity.asc +11 -0
  512. chronaxis/guide/examples/data/can/calculation-minimal.asc +6 -0
  513. chronaxis/guide/examples/data/can/conditional-energy/part-1.asc +92 -0
  514. chronaxis/guide/examples/data/can/conditional-energy/part-2.asc +36 -0
  515. chronaxis/guide/examples/data/can/conditional-energy/signals.dbc +10 -0
  516. chronaxis/guide/examples/data/can/execution-comparison.asc +12 -0
  517. chronaxis/guide/examples/data/can/execution-report.asc +4 -0
  518. chronaxis/guide/examples/data/can/expression-extended.asc +11 -0
  519. chronaxis/guide/examples/data/can/interval-actual.asc +6 -0
  520. chronaxis/guide/examples/data/can/preset-charge-energy.asc +15 -0
  521. chronaxis/guide/examples/data/can/preset-charge-minimal.asc +11 -0
  522. chronaxis/guide/examples/data/can/preset-command-automatic.asc +11 -0
  523. chronaxis/guide/examples/data/can/preset-fault-context.asc +7 -0
  524. chronaxis/guide/examples/data/can/preset-threshold-delay.asc +7 -0
  525. chronaxis/guide/examples/data/can/preset-threshold-partial.asc +7 -0
  526. chronaxis/guide/examples/data/can/quality.asc +6 -0
  527. chronaxis/guide/examples/data/can/quickstart-parts/part1.asc +4 -0
  528. chronaxis/guide/examples/data/can/quickstart-parts/part2.asc +3 -0
  529. chronaxis/guide/examples/data/can/quickstart.asc +6 -0
  530. chronaxis/guide/examples/data/can/rule-condition_duration-extended.asc +35 -0
  531. chronaxis/guide/examples/data/can/rule-condition_duration-minimal.asc +19 -0
  532. chronaxis/guide/examples/data/can/rule-debounce-extended.asc +19 -0
  533. chronaxis/guide/examples/data/can/rule-falling_edge-extended.asc +35 -0
  534. chronaxis/guide/examples/data/can/rule-hysteresis-extended.asc +19 -0
  535. chronaxis/guide/examples/data/can/rule-start_end-extended.asc +35 -0
  536. chronaxis/guide/examples/data/can/rule-start_only-extended.asc +19 -0
  537. chronaxis/guide/examples/data/can/rule-window_delta-extended.asc +19 -0
  538. chronaxis/guide/examples/data/can/sequence-outcomes.asc +19 -0
  539. chronaxis/guide/examples/data/can/signal-types.asc +13 -0
  540. chronaxis/guide/examples/data/can/start-end.asc +30 -0
  541. chronaxis/guide/examples/data/can/teaching-base.asc +58 -0
  542. chronaxis/guide/examples/data/can/teaching.dbc +53 -0
  543. chronaxis/guide/examples/data/joint-current.csv +5 -0
  544. chronaxis/guide/examples/data/joint.asc +5 -0
  545. chronaxis/guide/examples/data/joint.dbc +7 -0
  546. chronaxis/guide/examples/data/message-clean.asc +6 -0
  547. chronaxis/guide/examples/data/message-direction.asc +7 -0
  548. chronaxis/guide/examples/data/message-direction.dbc +7 -0
  549. chronaxis/guide/examples/data/power.blf +0 -0
  550. chronaxis/guide/examples/data/power.dbc +6 -0
  551. chronaxis/guide/examples/data/quality.csv +5 -0
  552. chronaxis/guide/examples/data/raw-can-example.csv +5 -0
  553. chronaxis/guide/examples/data/signal-types.csv +5 -0
  554. chronaxis/guide/examples/data/signals.csv +6 -0
  555. chronaxis/guide/examples/data/timing.asc +6 -0
  556. chronaxis/guide/examples/data/timing.dbc +11 -0
  557. chronaxis/guide/examples/export-can-minimal.yaml +24 -0
  558. chronaxis/guide/examples/input-csv-minimal.yaml +23 -0
  559. chronaxis/guide/examples/preset-charge-energy.yaml +41 -0
  560. chronaxis/guide/examples/preset-charge-minimal.yaml +31 -0
  561. chronaxis/guide/examples/preset-fault-context.yaml +27 -0
  562. chronaxis/guide/examples/quality.yaml +19 -0
  563. chronaxis/guide/examples/sequence-outcomes.yaml +39 -0
  564. chronaxis/guide/examples/shared/definitions.yaml +14 -0
  565. chronaxis/guide/examples/signal-enum-minimal.yaml +19 -0
  566. chronaxis/guide/examples/signal-number-conversion.yaml +24 -0
  567. chronaxis/guide/examples/window-merged.yaml +28 -0
  568. chronaxis/guide/fields/analysis/calculations-all-1.json +360 -0
  569. chronaxis/guide/fields/analysis/calculations-all-2.json +299 -0
  570. chronaxis/guide/fields/analysis/calculations-all-3.json +70 -0
  571. chronaxis/guide/fields/analysis/config_version-all-1.json +24 -0
  572. chronaxis/guide/fields/analysis/dataset-all-1.json +344 -0
  573. chronaxis/guide/fields/analysis/derived-all-1.json +147 -0
  574. chronaxis/guide/fields/analysis/diagnostics-all-1.json +69 -0
  575. chronaxis/guide/fields/analysis/execution-all-1.json +167 -0
  576. chronaxis/guide/fields/analysis/imports-all-1.json +39 -0
  577. chronaxis/guide/fields/analysis/intervals-all-1.json +173 -0
  578. chronaxis/guide/fields/analysis/message_calculations-all-1.json +360 -0
  579. chronaxis/guide/fields/analysis/message_calculations-all-2.json +255 -0
  580. chronaxis/guide/fields/analysis/metadata-all-1.json +24 -0
  581. chronaxis/guide/fields/analysis/outputs-all-1.json +349 -0
  582. chronaxis/guide/fields/analysis/outputs-all-2.json +302 -0
  583. chronaxis/guide/fields/analysis/outputs-all-3.json +321 -0
  584. chronaxis/guide/fields/analysis/outputs-all-4.json +253 -0
  585. chronaxis/guide/fields/analysis/outputs-all-5.json +244 -0
  586. chronaxis/guide/fields/analysis/outputs-all-6.json +199 -0
  587. chronaxis/guide/fields/analysis/overrides-all-1.json +104 -0
  588. chronaxis/guide/fields/analysis/presets-charge_session-1.json +398 -0
  589. chronaxis/guide/fields/analysis/presets-charge_session-2.json +114 -0
  590. chronaxis/guide/fields/analysis/presets-command_response-1.json +376 -0
  591. chronaxis/guide/fields/analysis/presets-fault_context-1.json +285 -0
  592. chronaxis/guide/fields/analysis/presets-threshold_excursion-1.json +317 -0
  593. chronaxis/guide/fields/analysis/rules-condition_duration-1.json +344 -0
  594. chronaxis/guide/fields/analysis/rules-condition_duration-2.json +27 -0
  595. chronaxis/guide/fields/analysis/rules-debounce-1.json +335 -0
  596. chronaxis/guide/fields/analysis/rules-falling_edge-1.json +317 -0
  597. chronaxis/guide/fields/analysis/rules-hysteresis-1.json +334 -0
  598. chronaxis/guide/fields/analysis/rules-hysteresis-2.json +27 -0
  599. chronaxis/guide/fields/analysis/rules-rising_edge-1.json +317 -0
  600. chronaxis/guide/fields/analysis/rules-start_end-1.json +349 -0
  601. chronaxis/guide/fields/analysis/rules-start_end-2.json +44 -0
  602. chronaxis/guide/fields/analysis/rules-start_only-1.json +334 -0
  603. chronaxis/guide/fields/analysis/rules-window_delta-1.json +356 -0
  604. chronaxis/guide/fields/analysis/rules-window_delta-2.json +78 -0
  605. chronaxis/guide/fields/analysis/sequences-all-1.json +394 -0
  606. chronaxis/guide/fields/analysis/sequences-all-2.json +54 -0
  607. chronaxis/guide/fields/analysis/signals-variant-1-1.json +349 -0
  608. chronaxis/guide/fields/analysis/signals-variant-1-2.json +297 -0
  609. chronaxis/guide/fields/analysis/signals-variant-1-3.json +340 -0
  610. chronaxis/guide/fields/analysis/signals-variant-1-4.json +175 -0
  611. chronaxis/guide/fields/analysis/signals-variant-2-1.json +327 -0
  612. chronaxis/guide/fields/analysis/signals-variant-2-2.json +335 -0
  613. chronaxis/guide/fields/analysis/signals-variant-2-3.json +289 -0
  614. chronaxis/guide/fields/analysis/signals-variant-2-4.json +270 -0
  615. chronaxis/guide/fields/analysis/sources-can_asc-1.json +318 -0
  616. chronaxis/guide/fields/analysis/sources-can_asc-2.json +310 -0
  617. chronaxis/guide/fields/analysis/sources-can_asc-3.json +311 -0
  618. chronaxis/guide/fields/analysis/sources-can_asc-4.json +69 -0
  619. chronaxis/guide/fields/analysis/sources-can_blf-1.json +317 -0
  620. chronaxis/guide/fields/analysis/sources-can_blf-2.json +310 -0
  621. chronaxis/guide/fields/analysis/sources-can_blf-3.json +317 -0
  622. chronaxis/guide/fields/analysis/sources-memory-1.json +347 -0
  623. chronaxis/guide/fields/analysis/sources-memory-2.json +110 -0
  624. chronaxis/guide/fields/analysis/sources-raw_can_csv-1.json +330 -0
  625. chronaxis/guide/fields/analysis/sources-raw_can_csv-10.json +233 -0
  626. chronaxis/guide/fields/analysis/sources-raw_can_csv-11.json +225 -0
  627. chronaxis/guide/fields/analysis/sources-raw_can_csv-12.json +228 -0
  628. chronaxis/guide/fields/analysis/sources-raw_can_csv-13.json +226 -0
  629. chronaxis/guide/fields/analysis/sources-raw_can_csv-14.json +230 -0
  630. chronaxis/guide/fields/analysis/sources-raw_can_csv-15.json +227 -0
  631. chronaxis/guide/fields/analysis/sources-raw_can_csv-16.json +230 -0
  632. chronaxis/guide/fields/analysis/sources-raw_can_csv-17.json +238 -0
  633. chronaxis/guide/fields/analysis/sources-raw_can_csv-18.json +239 -0
  634. chronaxis/guide/fields/analysis/sources-raw_can_csv-19.json +233 -0
  635. chronaxis/guide/fields/analysis/sources-raw_can_csv-2.json +310 -0
  636. chronaxis/guide/fields/analysis/sources-raw_can_csv-20.json +242 -0
  637. chronaxis/guide/fields/analysis/sources-raw_can_csv-21.json +230 -0
  638. chronaxis/guide/fields/analysis/sources-raw_can_csv-22.json +228 -0
  639. chronaxis/guide/fields/analysis/sources-raw_can_csv-23.json +230 -0
  640. chronaxis/guide/fields/analysis/sources-raw_can_csv-24.json +223 -0
  641. chronaxis/guide/fields/analysis/sources-raw_can_csv-25.json +290 -0
  642. chronaxis/guide/fields/analysis/sources-raw_can_csv-26.json +131 -0
  643. chronaxis/guide/fields/analysis/sources-raw_can_csv-3.json +297 -0
  644. chronaxis/guide/fields/analysis/sources-raw_can_csv-4.json +226 -0
  645. chronaxis/guide/fields/analysis/sources-raw_can_csv-5.json +230 -0
  646. chronaxis/guide/fields/analysis/sources-raw_can_csv-6.json +227 -0
  647. chronaxis/guide/fields/analysis/sources-raw_can_csv-7.json +230 -0
  648. chronaxis/guide/fields/analysis/sources-raw_can_csv-8.json +238 -0
  649. chronaxis/guide/fields/analysis/sources-raw_can_csv-9.json +239 -0
  650. chronaxis/guide/fields/analysis/sources-signal_csv-1.json +331 -0
  651. chronaxis/guide/fields/analysis/sources-signal_csv-2.json +327 -0
  652. chronaxis/guide/fields/analysis/sources-signal_csv-3.json +295 -0
  653. chronaxis/guide/fields/analysis/sources-variant-6-1.json +319 -0
  654. chronaxis/guide/fields/analysis/sources-variant-6-2.json +327 -0
  655. chronaxis/guide/fields/analysis/sources-variant-6-3.json +314 -0
  656. chronaxis/guide/fields/analysis/sources-variant-6-4.json +91 -0
  657. chronaxis/guide/fields/analysis/windows-all-1.json +361 -0
  658. chronaxis/guide/fields/analysis/windows-all-2.json +187 -0
  659. chronaxis/guide/fields/batch/backend-all-1.json +26 -0
  660. chronaxis/guide/fields/batch/batch_version-all-1.json +22 -0
  661. chronaxis/guide/fields/batch/fail_fast-all-1.json +22 -0
  662. chronaxis/guide/fields/batch/inputs-all-1.json +161 -0
  663. chronaxis/guide/fields/batch/jobs-all-1.json +58 -0
  664. chronaxis/guide/fields/batch/process_count-all-1.json +23 -0
  665. chronaxis/guide/fields/batch/source-all-1.json +22 -0
  666. chronaxis/guide/fields/batch/template-all-1.json +22 -0
  667. chronaxis/guide/fields/definitions/derived-all-1.json +121 -0
  668. chronaxis/guide/fields/definitions/signals-all-1.json +336 -0
  669. chronaxis/guide/fields/definitions/signals-all-2.json +307 -0
  670. chronaxis/guide/fields/definitions/signals-all-3.json +305 -0
  671. chronaxis/guide/fields/definitions/signals-all-4.json +352 -0
  672. chronaxis/guide/fields/definitions/signals-all-5.json +311 -0
  673. chronaxis/guide/fields/definitions/signals-all-6.json +254 -0
  674. chronaxis/guide/fields/definitions/signals-all-7.json +88 -0
  675. chronaxis/guide/fields/definitions/sources-all-1.json +332 -0
  676. chronaxis/guide/fields/definitions/sources-all-10.json +307 -0
  677. chronaxis/guide/fields/definitions/sources-all-11.json +280 -0
  678. chronaxis/guide/fields/definitions/sources-all-12.json +209 -0
  679. chronaxis/guide/fields/definitions/sources-all-13.json +219 -0
  680. chronaxis/guide/fields/definitions/sources-all-14.json +213 -0
  681. chronaxis/guide/fields/definitions/sources-all-15.json +212 -0
  682. chronaxis/guide/fields/definitions/sources-all-16.json +232 -0
  683. chronaxis/guide/fields/definitions/sources-all-17.json +213 -0
  684. chronaxis/guide/fields/definitions/sources-all-18.json +212 -0
  685. chronaxis/guide/fields/definitions/sources-all-19.json +217 -0
  686. chronaxis/guide/fields/definitions/sources-all-2.json +336 -0
  687. chronaxis/guide/fields/definitions/sources-all-20.json +228 -0
  688. chronaxis/guide/fields/definitions/sources-all-21.json +212 -0
  689. chronaxis/guide/fields/definitions/sources-all-22.json +232 -0
  690. chronaxis/guide/fields/definitions/sources-all-23.json +213 -0
  691. chronaxis/guide/fields/definitions/sources-all-24.json +212 -0
  692. chronaxis/guide/fields/definitions/sources-all-25.json +217 -0
  693. chronaxis/guide/fields/definitions/sources-all-26.json +228 -0
  694. chronaxis/guide/fields/definitions/sources-all-27.json +212 -0
  695. chronaxis/guide/fields/definitions/sources-all-28.json +217 -0
  696. chronaxis/guide/fields/definitions/sources-all-29.json +227 -0
  697. chronaxis/guide/fields/definitions/sources-all-3.json +306 -0
  698. chronaxis/guide/fields/definitions/sources-all-30.json +333 -0
  699. chronaxis/guide/fields/definitions/sources-all-31.json +302 -0
  700. chronaxis/guide/fields/definitions/sources-all-32.json +319 -0
  701. chronaxis/guide/fields/definitions/sources-all-33.json +89 -0
  702. chronaxis/guide/fields/definitions/sources-all-4.json +336 -0
  703. chronaxis/guide/fields/definitions/sources-all-5.json +313 -0
  704. chronaxis/guide/fields/definitions/sources-all-6.json +292 -0
  705. chronaxis/guide/fields/definitions/sources-all-7.json +319 -0
  706. chronaxis/guide/fields/definitions/sources-all-8.json +315 -0
  707. chronaxis/guide/fields/definitions/sources-all-9.json +318 -0
  708. chronaxis/guide/fields/index.json +3432 -0
  709. chronaxis/guide/fields/mapping/aliases-all-1.json +91 -0
  710. chronaxis/guide/fields/mapping/analysis-all-1.json +382 -0
  711. chronaxis/guide/fields/mapping/analysis-all-10.json +307 -0
  712. chronaxis/guide/fields/mapping/analysis-all-11.json +311 -0
  713. chronaxis/guide/fields/mapping/analysis-all-12.json +329 -0
  714. chronaxis/guide/fields/mapping/analysis-all-13.json +294 -0
  715. chronaxis/guide/fields/mapping/analysis-all-14.json +311 -0
  716. chronaxis/guide/fields/mapping/analysis-all-15.json +280 -0
  717. chronaxis/guide/fields/mapping/analysis-all-16.json +227 -0
  718. chronaxis/guide/fields/mapping/analysis-all-17.json +230 -0
  719. chronaxis/guide/fields/mapping/analysis-all-18.json +221 -0
  720. chronaxis/guide/fields/mapping/analysis-all-19.json +237 -0
  721. chronaxis/guide/fields/mapping/analysis-all-2.json +342 -0
  722. chronaxis/guide/fields/mapping/analysis-all-20.json +233 -0
  723. chronaxis/guide/fields/mapping/analysis-all-21.json +244 -0
  724. chronaxis/guide/fields/mapping/analysis-all-22.json +228 -0
  725. chronaxis/guide/fields/mapping/analysis-all-23.json +226 -0
  726. chronaxis/guide/fields/mapping/analysis-all-24.json +230 -0
  727. chronaxis/guide/fields/mapping/analysis-all-25.json +227 -0
  728. chronaxis/guide/fields/mapping/analysis-all-26.json +230 -0
  729. chronaxis/guide/fields/mapping/analysis-all-27.json +221 -0
  730. chronaxis/guide/fields/mapping/analysis-all-28.json +237 -0
  731. chronaxis/guide/fields/mapping/analysis-all-29.json +233 -0
  732. chronaxis/guide/fields/mapping/analysis-all-3.json +322 -0
  733. chronaxis/guide/fields/mapping/analysis-all-30.json +244 -0
  734. chronaxis/guide/fields/mapping/analysis-all-31.json +228 -0
  735. chronaxis/guide/fields/mapping/analysis-all-32.json +226 -0
  736. chronaxis/guide/fields/mapping/analysis-all-33.json +230 -0
  737. chronaxis/guide/fields/mapping/analysis-all-34.json +227 -0
  738. chronaxis/guide/fields/mapping/analysis-all-35.json +230 -0
  739. chronaxis/guide/fields/mapping/analysis-all-36.json +221 -0
  740. chronaxis/guide/fields/mapping/analysis-all-37.json +291 -0
  741. chronaxis/guide/fields/mapping/analysis-all-38.json +315 -0
  742. chronaxis/guide/fields/mapping/analysis-all-39.json +304 -0
  743. chronaxis/guide/fields/mapping/analysis-all-4.json +312 -0
  744. chronaxis/guide/fields/mapping/analysis-all-40.json +307 -0
  745. chronaxis/guide/fields/mapping/analysis-all-41.json +292 -0
  746. chronaxis/guide/fields/mapping/analysis-all-42.json +333 -0
  747. chronaxis/guide/fields/mapping/analysis-all-43.json +296 -0
  748. chronaxis/guide/fields/mapping/analysis-all-44.json +322 -0
  749. chronaxis/guide/fields/mapping/analysis-all-45.json +298 -0
  750. chronaxis/guide/fields/mapping/analysis-all-46.json +347 -0
  751. chronaxis/guide/fields/mapping/analysis-all-47.json +302 -0
  752. chronaxis/guide/fields/mapping/analysis-all-48.json +263 -0
  753. chronaxis/guide/fields/mapping/analysis-all-49.json +301 -0
  754. chronaxis/guide/fields/mapping/analysis-all-5.json +313 -0
  755. chronaxis/guide/fields/mapping/analysis-all-50.json +336 -0
  756. chronaxis/guide/fields/mapping/analysis-all-51.json +335 -0
  757. chronaxis/guide/fields/mapping/analysis-all-52.json +335 -0
  758. chronaxis/guide/fields/mapping/analysis-all-53.json +334 -0
  759. chronaxis/guide/fields/mapping/analysis-all-54.json +339 -0
  760. chronaxis/guide/fields/mapping/analysis-all-55.json +335 -0
  761. chronaxis/guide/fields/mapping/analysis-all-56.json +336 -0
  762. chronaxis/guide/fields/mapping/analysis-all-57.json +335 -0
  763. chronaxis/guide/fields/mapping/analysis-all-58.json +333 -0
  764. chronaxis/guide/fields/mapping/analysis-all-59.json +325 -0
  765. chronaxis/guide/fields/mapping/analysis-all-6.json +323 -0
  766. chronaxis/guide/fields/mapping/analysis-all-60.json +334 -0
  767. chronaxis/guide/fields/mapping/analysis-all-61.json +311 -0
  768. chronaxis/guide/fields/mapping/analysis-all-62.json +289 -0
  769. chronaxis/guide/fields/mapping/analysis-all-63.json +383 -0
  770. chronaxis/guide/fields/mapping/analysis-all-64.json +357 -0
  771. chronaxis/guide/fields/mapping/analysis-all-65.json +375 -0
  772. chronaxis/guide/fields/mapping/analysis-all-66.json +351 -0
  773. chronaxis/guide/fields/mapping/analysis-all-67.json +346 -0
  774. chronaxis/guide/fields/mapping/analysis-all-68.json +317 -0
  775. chronaxis/guide/fields/mapping/analysis-all-69.json +313 -0
  776. chronaxis/guide/fields/mapping/analysis-all-7.json +306 -0
  777. chronaxis/guide/fields/mapping/analysis-all-70.json +326 -0
  778. chronaxis/guide/fields/mapping/analysis-all-71.json +316 -0
  779. chronaxis/guide/fields/mapping/analysis-all-72.json +264 -0
  780. chronaxis/guide/fields/mapping/analysis-all-73.json +228 -0
  781. chronaxis/guide/fields/mapping/analysis-all-74.json +241 -0
  782. chronaxis/guide/fields/mapping/analysis-all-75.json +273 -0
  783. chronaxis/guide/fields/mapping/analysis-all-76.json +382 -0
  784. chronaxis/guide/fields/mapping/analysis-all-77.json +328 -0
  785. chronaxis/guide/fields/mapping/analysis-all-78.json +338 -0
  786. chronaxis/guide/fields/mapping/analysis-all-79.json +304 -0
  787. chronaxis/guide/fields/mapping/analysis-all-8.json +309 -0
  788. chronaxis/guide/fields/mapping/analysis-all-80.json +140 -0
  789. chronaxis/guide/fields/mapping/analysis-all-9.json +329 -0
  790. chronaxis/guide/fields/mapping/io_policy-all-1.json +19 -0
  791. chronaxis/guide/fields/mapping/mapping_version-all-1.json +19 -0
  792. chronaxis/guide/fields/mapping/path_base-all-1.json +19 -0
  793. chronaxis/guide/fields/mapping/sections-all-1.json +402 -0
  794. chronaxis/guide/fields/mapping/sections-all-2.json +232 -0
  795. chronaxis/guide/lookup.py +90 -0
  796. chronaxis/guide/manifest.json +614 -0
  797. chronaxis/guide/run_analysis.py +34 -0
  798. chronaxis/guide/schemas/analysis.schema.json +8451 -0
  799. chronaxis/guide/schemas/batch-v1.schema.json +172 -0
  800. chronaxis/guide/schemas/definitions.schema.json +29 -0
  801. chronaxis/guide/schemas/legacy-import-v1.schema.json +143 -0
  802. chronaxis/guide/semantics.md +62 -0
  803. chronaxis/guide/tasks.json +290 -0
  804. chronaxis/guide/workflow.md +38 -0
  805. chronaxis/legacy/__init__.py +46 -0
  806. chronaxis/legacy/batch_read.py +412 -0
  807. chronaxis/legacy/batch_validation.py +134 -0
  808. chronaxis/legacy/batch_wire.py +264 -0
  809. chronaxis/legacy/batch_worker.py +417 -0
  810. chronaxis/legacy/binding.py +154 -0
  811. chronaxis/legacy/dbc_cycles.py +47 -0
  812. chronaxis/legacy/decode_policy.py +28 -0
  813. chronaxis/legacy/disjunction.py +79 -0
  814. chronaxis/legacy/export_worker.py +147 -0
  815. chronaxis/legacy/export_write.py +378 -0
  816. chronaxis/legacy/message_store.py +562 -0
  817. chronaxis/legacy/process_read.py +526 -0
  818. chronaxis/legacy/raw_store.py +341 -0
  819. chronaxis/legacy/records.py +709 -0
  820. chronaxis/legacy/required_records.py +122 -0
  821. chronaxis/legacy/sum.py +403 -0
  822. chronaxis/legacy/sum_numpy.py +43 -0
  823. chronaxis/legacy/updates.py +277 -0
  824. chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
  825. chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
  826. chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
  827. chronaxis/legacy/worker.py +352 -0
  828. chronaxis/migration/__init__.py +11 -0
  829. chronaxis/migration/api.py +270 -0
  830. chronaxis/migration/ini.py +110 -0
  831. chronaxis/migration/legacy_sum.py +304 -0
  832. chronaxis/migration/models.py +83 -0
  833. chronaxis/migration/publication.py +230 -0
  834. chronaxis/migration/sclicer.py +241 -0
  835. chronaxis/migration/slope.py +78 -0
  836. chronaxis/migration/start_end.py +48 -0
  837. chronaxis/planning/__init__.py +19 -0
  838. chronaxis/planning/channels.py +30 -0
  839. chronaxis/planning/checks.py +447 -0
  840. chronaxis/planning/config_groups.py +215 -0
  841. chronaxis/planning/dbc_defaults.py +88 -0
  842. chronaxis/planning/export_options.py +247 -0
  843. chronaxis/planning/input_defaults.py +62 -0
  844. chronaxis/planning/input_paths.py +124 -0
  845. chronaxis/planning/input_requirements.py +250 -0
  846. chronaxis/planning/inputs.py +306 -0
  847. chronaxis/planning/intervals.py +242 -0
  848. chronaxis/planning/legacy_execution.py +38 -0
  849. chronaxis/planning/message_calculations.py +171 -0
  850. chronaxis/planning/models.py +369 -0
  851. chronaxis/planning/nodes.py +355 -0
  852. chronaxis/planning/plan.py +294 -0
  853. chronaxis/planning/preset_models.py +211 -0
  854. chronaxis/planning/record_execution.py +76 -0
  855. chronaxis/planning/reports.py +523 -0
  856. chronaxis/planning/sequences.py +91 -0
  857. chronaxis/planning/signal_groups.py +61 -0
  858. chronaxis/planning/signal_validity.py +46 -0
  859. chronaxis/planning/text_inputs.py +110 -0
  860. chronaxis/presets.py +270 -0
  861. chronaxis/results/__init__.py +34 -0
  862. chronaxis/results/analysis_outcome.py +67 -0
  863. chronaxis/results/artifact_exports.py +212 -0
  864. chronaxis/results/binding_metadata.py +54 -0
  865. chronaxis/results/budget.py +138 -0
  866. chronaxis/results/can_metadata.py +247 -0
  867. chronaxis/results/codec.py +246 -0
  868. chronaxis/results/errors.py +25 -0
  869. chronaxis/results/export_files.py +216 -0
  870. chronaxis/results/frame_exports.py +299 -0
  871. chronaxis/results/frame_patch.py +186 -0
  872. chronaxis/results/frame_rebuild.py +458 -0
  873. chronaxis/results/frame_sort.py +223 -0
  874. chronaxis/results/input_diagnostics.py +51 -0
  875. chronaxis/results/manifest.py +343 -0
  876. chronaxis/results/merge_runs.py +207 -0
  877. chronaxis/results/owned_directory.py +32 -0
  878. chronaxis/results/raw_exports.py +689 -0
  879. chronaxis/results/readable.py +355 -0
  880. chronaxis/results/readable_format.py +94 -0
  881. chronaxis/results/result.py +734 -0
  882. chronaxis/results/rows.py +57 -0
  883. chronaxis/results/signal_exports.py +209 -0
  884. chronaxis/results/signal_grid.py +219 -0
  885. chronaxis/results/spool.py +421 -0
  886. chronaxis/results/summary.py +350 -0
  887. chronaxis/results/text_can_metadata.py +64 -0
  888. chronaxis/results/threshold_metadata.py +105 -0
  889. chronaxis/runner.py +121 -0
  890. chronaxis/sources/__init__.py +23 -0
  891. chronaxis/sources/asc.py +412 -0
  892. chronaxis/sources/blf.py +101 -0
  893. chronaxis/sources/can_spec.py +179 -0
  894. chronaxis/sources/can_updates.py +160 -0
  895. chronaxis/sources/csv_spec.py +133 -0
  896. chronaxis/sources/descriptions.py +65 -0
  897. chronaxis/sources/memory.py +299 -0
  898. chronaxis/sources/models.py +497 -0
  899. chronaxis/sources/packing.py +170 -0
  900. chronaxis/sources/protocol.py +221 -0
  901. chronaxis/sources/raw_can.py +62 -0
  902. chronaxis/sources/raw_csv.py +470 -0
  903. chronaxis/sources/raw_csv_layout.py +310 -0
  904. chronaxis/sources/signal_csv.py +608 -0
  905. chronaxis/sources/text_can_decode.py +421 -0
  906. chronaxis/sources/text_can_ref.py +48 -0
  907. chronaxis/sources/text_can_spec.py +61 -0
  908. chronaxis/timebase/__init__.py +19 -0
  909. chronaxis/timebase/conversion.py +364 -0
  910. chronaxis/timebase/numpy_ops.py +104 -0
  911. chronaxis/user_guide.py +81 -0
  912. chronaxis-0.1.0.dev0.dist-info/METADATA +172 -0
  913. chronaxis-0.1.0.dev0.dist-info/RECORD +917 -0
  914. chronaxis-0.1.0.dev0.dist-info/WHEEL +5 -0
  915. chronaxis-0.1.0.dev0.dist-info/entry_points.txt +2 -0
  916. chronaxis-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
  917. chronaxis-0.1.0.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,179 @@
1
+ """声明固定旧函数链的有序BLF来源,并保存解码样本的完整CAN定位。
2
+
3
+ LegacyCANSpec接收首个Path、可选连续paths、一个DBC Path、明确通道、TimebaseSpec和原浮点秒
4
+ 表示,输出冻结声明;构造只查类型、后缀和纳秒偏移,不open/stat/resolve,不加载
5
+ 旧模块、CAN库或DBC,也不猜时区、单位、方向、实际观测范围和解码质量。
6
+ CANSourceRef在通用会话/来源/field上保留原路径、profile、通道、信号、实际帧型、
7
+ yield序号、原浮点秒及时间量化标志。field是ID/信号及可选帧类型的规范JSON,
8
+ 不能把原名称当DSL变量、隐藏改名、再次施加DBC缩放或声称原物理行号。
9
+ 仅依赖通用模型和基于标准库的CAN读取记录协议;无文件、子进程、reader或预算生命周期。
10
+ """
11
+
12
+ # 冻结声明和显式路径不访问文件;原浮点秒只检查有限性,不恢复丢失精度。
13
+ from dataclasses import dataclass
14
+ from math import isfinite
15
+ from pathlib import Path
16
+ from ..core.models import SourceRef, TimebaseSpec
17
+ from ..core.validation import require_identifier, require_text
18
+ from ..legacy.records import (LegacyCANField, MAX_WIRE_BYTES, PROFILE_ID, decode_packet, field_from_dict)
19
+ from ..timebase.conversion import require_int64_ns
20
+
21
+
22
+ def _nonnegative_integer(value, name):
23
+ """检查原生非负通道/序号,不接受bool或外部整数子类替代。
24
+
25
+ 参数: value为候选值;name为字段诊断名。返回: None,不重编号或转换类型。
26
+ 异常: TypeError为非原生int,ValueError为负数;无I/O。
27
+ """
28
+ if type(value) is not int:
29
+ raise TypeError(name + '需要原生int')
30
+ if value < 0:
31
+ raise ValueError(name + '需要非负整数')
32
+
33
+
34
+ def can_field_from_key(text):
35
+ """从严格规范JSON恢复完整原定位,复用CAN定位模型,不解析DBC。
36
+
37
+ 参数: text为LegacyCANField.key生成的原生str,UTF-8包不超过65536字节。
38
+ 返回: LegacyCANField,保信号名大小写、点号及可选帧类型,不读取DBC。
39
+ 异常: TypeError/ValueError/UnicodeError为类型、JSON、重复键、字段、数值或非规范键;
40
+ 不接受仅语义相同但空白、键序或转义不同的文本,不eval或反序列化任意对象。
41
+ """
42
+ if type(text) is not str:
43
+ raise TypeError('CAN field需要规范JSON str')
44
+ # 先以字符数拒绝明显超长输入,再核UTF-8字节、JSON树和唯一定位字段。
45
+ if not text or len(text) > MAX_WIRE_BYTES:
46
+ raise ValueError('CAN field为空或超过wire上限')
47
+ field = field_from_dict(decode_packet(text.encode('utf-8')))
48
+ if text != field.key:
49
+ raise ValueError('CAN field不是规范JSON定位键')
50
+ return field
51
+
52
+
53
+ @dataclass(frozen=True)
54
+ class LegacyCANSpec:
55
+ """冻结有序同格式BLF、单通道和单DBC声明,不认证输入文件或实际旧链能力。"""
56
+
57
+ name: str # 当前计划来源的安全简单名称,不是DBC消息名。
58
+ path: Path # 首个BLF声明;不扫描目录,连续文件由paths显式提供。
59
+ dbc_path: Path # 同次worker原load_file的唯一DBC声明,不在此读取。
60
+ channel: int # 明确单通道,非负原生int,不猜缺失通道。
61
+ timebase: TimebaseSpec # 完整时基声明,来源名称相同不自动证明同步。
62
+ unit: str = 's' # 原函数返回浮点秒,首版只接受s,不按文件名推断。
63
+ offset_ns: int = 0 # 明确int64固定纳秒偏移,不更改原timestamp。
64
+ legacy_profile: str = PROFILE_ID # 唯一冻结sclicer-functions-v1,不自动回退profile。
65
+ decode_scope: str = 'requested' # 默认仅处理本次实际需要的报文/字段;all显式保留完整诊断。
66
+ input_check: str = 'auto' # auto按实际消费者检查;full显式检查全部原帧和时间。
67
+
68
+ paths: tuple[Path, ...] = () # 显式连续BLF;空tuple沿用path单文件,首项必须等于path。
69
+ decode_policy: str = 'legacy' # 新版本默认strict;旧调用保原宽松解码。
70
+
71
+ @property
72
+ def input_paths(self):
73
+ """取得原序文件。参数: 无。返回: tuple。异常: 无;不扫描目录。"""
74
+ return self.paths or (self.path,)
75
+
76
+ def __post_init__(self):
77
+ """检查静态来源约束,路径和时基对象均原样保留。
78
+
79
+ 参数: 无,读取本冻结声明字段。返回: None。
80
+ 异常: TypeError为路径/通道/时基/单位/profile/偏移/解码范围类型错误;ValueError为名称、
81
+ 后缀、通道、单位、profile或解码/检查范围不符;OverflowError为offset_ns超出int64。
82
+ 副作用: 无open/stat/resolve/DBC/依赖加载,不核实存在性或实际BLF内容。
83
+ """
84
+ require_identifier(self.name, 'can.name')
85
+ # 后缀只限定本次支持范围;DBC保Path,不额外猜格式、改路径或检查内容。
86
+ if not isinstance(self.path, Path) or not isinstance(self.dbc_path, Path):
87
+ raise TypeError('CAN path/dbc_path需要Path')
88
+ if self.path.suffix.lower() != '.blf':
89
+ raise ValueError('首版CAN仅声明单BLF来源')
90
+ from ..legacy.decode_policy import validate_decode_policy
91
+ validate_decode_policy(self.decode_policy)
92
+ if (type(self.paths) is not tuple or len(self.paths) > 4096
93
+ or any(not isinstance(p, Path) or p.suffix.lower() != '.blf' for p in self.paths)
94
+ or self.paths and self.paths[0] != self.path):
95
+ raise ValueError('连续BLF需要原序Path tuple且首项等于path')
96
+ _nonnegative_integer(self.channel, 'can.channel')
97
+ if not isinstance(self.timebase, TimebaseSpec):
98
+ raise TypeError('CAN timebase需要TimebaseSpec')
99
+ if type(self.unit) is not str or type(self.legacy_profile) is not str:
100
+ raise TypeError('CAN unit/legacy_profile需要原生str')
101
+ if self.unit != 's' or self.legacy_profile != PROFILE_ID:
102
+ raise ValueError('CAN仅支持原浮点秒与sclicer-functions-v1')
103
+ # 通用时间校验允许其他Integral;此静态契约额外要求原生int而非隐式归一化。
104
+ if type(self.offset_ns) is not int:
105
+ raise TypeError('CAN offset_ns需要原生int')
106
+ require_int64_ns(self.offset_ns, 'can.offset_ns')
107
+ # 本模型只检查选项值;requested与整个计划的兼容性由静态规划统一检查。
108
+ if type(self.decode_scope) is not str:
109
+ raise TypeError('CAN decode_scope需要原生str')
110
+ if self.decode_scope not in ('all', 'requested'):
111
+ raise ValueError('CAN decode_scope需要all或requested')
112
+ # 检查策略与解码范围分开;完整计划负责确定实际时间消费者。
113
+ if type(self.input_check) is not str:
114
+ raise TypeError('CAN input_check需要原生str')
115
+ if self.input_check not in ('auto', 'full'):
116
+ raise ValueError('CAN input_check需要auto或full')
117
+
118
+
119
+ @dataclass(frozen=True)
120
+ class CANSourceRef(SourceRef):
121
+ """保留一次原yield对应样本的CAN身份,不替代实际绑定或质量检查。
122
+
123
+ 继承session_id/source_name/field;实际定位须满足field声明的可选类型约束。
124
+ yield_sequence从0开始且保原来源顺序,同刻消息不会被去重;不是物理行号。
125
+ 原timestamp和量化标志同时保留,不用新纳秒坐标覆盖原浮点诊断。
126
+ """
127
+
128
+ path: str # 原单BLF路径文本,是否真实打开由实际read证明。
129
+ profile: str # 实际固定旧函数链标识。
130
+ channel: int # 明确来源通道。
131
+ signal: str # 原DBC信号名,不裁剪、替换点号或改大小写。
132
+ frame_id: int # 原报文ID,与field一致。
133
+ is_extended: bool # 原定位标准/扩展帧标志。
134
+ is_fd: bool # 原定位经典CAN/FD标志。
135
+ yield_sequence: int # 0起原函数yield序号,不是legacy_sum的历史求值序号。
136
+ timestamp: float # 有限原浮点秒,可保负数和-0.0;精度已损失时不能恢复。
137
+ time_quantized: bool # 显式时间转换是否按纳秒量化,不等于浮点精度完好。
138
+
139
+ def __post_init__(self):
140
+ """校验通用身份与完整原定位相等,不访问路径或重新解码。
141
+
142
+ 参数: 无。返回: None,全部原声明保持冻结。
143
+ 异常: TypeError/ValueError/UnicodeError为身份、profile、JSON定位、序号、原时间
144
+ 或量化标志非法,或field与附加定位冲突;没有失效补零或隐式别名。
145
+ """
146
+ super().__post_init__()
147
+ require_text(self.path, 'can_ref.path')
148
+ if type(self.profile) is not str or self.profile != PROFILE_ID:
149
+ raise ValueError('CANSourceRef仅支持sclicer-functions-v1')
150
+ # field保留用户的可选选择器,附加帧类型记录实际帧;无需逐条重新解析JSON。
151
+ _nonnegative_integer(self.channel, 'can_ref.channel')
152
+ if type(self.frame_id) is not int or type(self.signal) is not str:
153
+ raise TypeError('CANSourceRef实际ID需要int、信号名需要str')
154
+ if type(self.is_extended) is not bool or type(self.is_fd) is not bool:
155
+ raise TypeError('CANSourceRef必须保存实际帧类型bool')
156
+ actual = LegacyCANField(self.channel, self.signal, self.frame_id, self.is_extended, self.is_fd).key
157
+ # 规范键按名称排序,这两个字段都在signal之前;只删除完整键值及逗号。
158
+ # 信号文本中的双引号会被JSON转义,因此不能误删文本中的相似片段。
159
+ extended = '"is_extended":' + str(self.is_extended).lower() + ','
160
+ fd = '"is_fd":' + str(self.is_fd).lower() + ','
161
+ if type(self.field) is not str or self.field not in (
162
+ actual, actual.replace(extended, ''), actual.replace(fd, ''),
163
+ actual.replace(extended, '').replace(fd, '')):
164
+ raise ValueError('CANSourceRef实际帧与绑定定位不一致')
165
+ _nonnegative_integer(self.yield_sequence, 'can_ref.yield_sequence')
166
+ if type(self.timestamp) is not float:
167
+ raise TypeError('CANSourceRef timestamp需要原生float秒')
168
+ if not isfinite(self.timestamp):
169
+ raise ValueError('CANSourceRef timestamp必须有限')
170
+ if type(self.time_quantized) is not bool:
171
+ raise TypeError('CANSourceRef time_quantized需要bool')
172
+
173
+ @property
174
+ def evaluation_index(self):
175
+ """提供本次原yield位置的只读别名,明确不声称legacy_sum求值流已存在。
176
+
177
+ 参数: 无。返回: 与yield_sequence完全相同的int。异常: 无;不产生额外求值或计数。
178
+ """
179
+ return self.yield_sequence
@@ -0,0 +1,160 @@
1
+ """把三种原始报文入口的必要值交付给同一个逐消息计算模型。
2
+
3
+ 投影只保存有限字段定位和可共享的来源引用。BLF交付的键是DBC信号名,
4
+ 文本入口交付的键是规范字段;转换后均为原DBC信号名,不保留载荷副本、
5
+ 原时间字符串或第二套时间。LegacyDecodedUpdate是已有计算模型的名称,
6
+ 使用它不代表复现旧程序的缓存行为。
7
+ """
8
+
9
+ from types import MappingProxyType
10
+
11
+ from ..core.models import SourceRef
12
+ from ..core.validation import require_identifier
13
+ from ..legacy.records import LegacyCANField
14
+ from ..legacy.updates import LegacyDecodedUpdate, LegacyUntimedUpdate
15
+
16
+
17
+ def require_message_keys(keys, *, channel=None):
18
+ """校验有限触发声明。参数: keys完整定位tuple、可选来源通道。返回: 原tuple。异常: ValueError。"""
19
+ if type(keys) is not tuple or len(keys) > 4096:
20
+ raise ValueError('消息触发定位需要最多4096项tuple')
21
+ for key in keys:
22
+ if (type(key) is not tuple or len(key) != 4 or type(key[0]) is not int or key[0] < 0
23
+ or type(key[1]) is not int or key[2] is not None and type(key[2]) is not bool
24
+ or key[3] is not None and type(key[3]) is not bool
25
+ or not 0 <= key[1] <= (0x7ff if key[2] is False else 0x1fffffff)
26
+ or channel is not None and key[0] != channel):
27
+ raise ValueError('消息触发定位需要合法通道、ID、扩展及FD标志,且属于当前来源通道')
28
+ return keys
29
+
30
+
31
+ class CANUpdateProjection:
32
+ """按完整报文身份索引所需字段;同一帧的多个别名只传一次物理值。"""
33
+
34
+ def __init__(self, source, session_id, fields, *, message_keys=(), clock_fields=()):
35
+ """建立有限投影,不读取DBC或输入文件。
36
+
37
+ 参数: source/session_id为来源和会话;fields为所需LegacyCANField元组;
38
+ message_keys为无值公式仍需触发的(channel,id,extended,fd)元组;
39
+ clock_fields只借DBC候选确定驱动帧,不加入值解码或值输出。
40
+ 返回: None;初始化实例状态。异常: TypeError/ValueError为字段、身份或同帧信号定位冲突。
41
+ """
42
+ if (type(fields) is not tuple or type(clock_fields) is not tuple
43
+ or any(type(field) is not LegacyCANField for field in (*fields,*clock_fields))):
44
+ raise TypeError('消息投影需要LegacyCANField tuple')
45
+ require_identifier(source, 'message.source')
46
+ require_identifier(session_id, 'message.session_id')
47
+ groups = {}
48
+ for key in require_message_keys(message_keys):
49
+ groups.setdefault(key, {})
50
+ self._value_fields = frozenset(fields)
51
+ for field in dict.fromkeys((*fields, *clock_fields)):
52
+ key = (field.channel, field.frame_id, field.is_extended, field.is_fd)
53
+ group = groups.setdefault(key, {})
54
+ if field.signal in group and group[field.signal] != field:
55
+ raise ValueError('同一报文信号存在不同定位')
56
+ group[field.signal] = field
57
+ # 引用只标识必需的来源及代表字段,逐帧序号由已有更新模型保存一次。
58
+ self._groups = MappingProxyType({key: (tuple(group.values()),
59
+ SourceRef(session_id, source, next(iter(group.values())).key if group else '__raw_message__'))
60
+ for key, group in groups.items()})
61
+ self.source = source
62
+ self._seen = {}
63
+ self._resolved = {}
64
+ self._dbc_frames = {}
65
+ self.compatibility_fields = {}
66
+
67
+ def configure_metadata(self, facts):
68
+ """安装同次DBC的有限候选。参数: facts字段事实。返回: None。异常: 非法定位错误。
69
+ """
70
+ from ..legacy.records import field_from_dict
71
+ self._dbc_frames = {field_from_dict(dict(fact['locator'])): tuple(tuple(pair) for pair in fact['dbc_frames'])
72
+ for fact in facts if 'dbc_frames' in fact}
73
+
74
+ def for_read(self, facts):
75
+ """为单次读取隔离已见状态。参数: facts同次DBC事实。返回: 新投影。异常: 元数据错误。
76
+ """
77
+ from copy import copy
78
+ result = copy(self)
79
+ result._seen = {}
80
+ result._resolved = {}
81
+ result.compatibility_fields = {}
82
+ result.configure_metadata(facts)
83
+ return result
84
+
85
+ def _matching(self, frame):
86
+ """匹配四种可选选择器,记录唯一实际身份。参数: frame。返回: 字段和引用或None。异常: 迟到歧义。
87
+ """
88
+ if frame.is_remote_frame or frame.is_error_frame:
89
+ return None
90
+ frame_key = (frame.channel, frame.arbitration_id, frame.is_extended_id, frame.is_fd)
91
+ if frame_key in self._resolved:
92
+ return self._resolved[frame_key]
93
+ actual = (frame.is_extended_id, frame.is_fd)
94
+ fields, reference = {}, None
95
+ for extended in (frame.is_extended_id, None):
96
+ for fd in (frame.is_fd, None):
97
+ key = (frame.channel, frame.arbitration_id, extended, fd)
98
+ item = self._groups.get(key)
99
+ if item is None:
100
+ continue
101
+ # 候选定义里没有该信号的另一种同ID帧属于无关输入,不制造失效更新。
102
+ selected = []
103
+ for field in item[0]:
104
+ candidates = self._dbc_frames.get(field)
105
+ if candidates is not None and not any(e == actual[0] and (f == actual[1] or f and not actual[1])
106
+ for e, f in candidates):
107
+ continue
108
+ selected.append(field)
109
+ if candidates is not None and not actual[1] and (actual[0], False) not in candidates:
110
+ self.compatibility_fields[field] = actual[0]
111
+ if item[0] and not selected:
112
+ continue
113
+ for identity_key in selected or (key,):
114
+ previous = self._seen.get(identity_key)
115
+ if previous is not None and previous != actual:
116
+ missing = 'is_extended' if previous[0] != actual[0] else 'is_fd'
117
+ raise ValueError('同一报文绑定匹配多种实际帧,请补充 ' + missing)
118
+ self._seen[identity_key] = actual
119
+ fields.update((field, None) for field in selected)
120
+ reference = reference or item[1]
121
+ if reference is None:
122
+ return None
123
+ result = (tuple(fields), reference)
124
+ # 只缓存已声明且成功匹配的身份,最多每声明四种,不随无关报文数量增长。
125
+ self._resolved[frame_key] = result
126
+ return result
127
+
128
+ def accepts_frame(self, frame):
129
+ """判断是否有值或触发需求。参数: 原帧。返回: bool。异常: 非原帧属性错。"""
130
+ return self._matching(frame) is not None
131
+
132
+ def fields_for(self, frame):
133
+ """定位目标数据帧,未知ID/其他通道或帧型不参与本投影。
134
+
135
+ 参数: frame为实际读取器交付且已校验的原帧。返回: 字段元组,非目标为空。
136
+ 异常: 非原帧对象缺少必需属性时AttributeError;不吞读取错误。
137
+ """
138
+ item = self._matching(frame)
139
+ return () if item is None else item[0]
140
+
141
+ def build(self, frame, sequence, values, time_ns, *, canonical_keys=False):
142
+ """只拣选计算字段,复用已有有时间/无时间更新及其严格值检查。
143
+
144
+ 参数: frame为原帧,sequence为本来源原序号,values为已解码映射,
145
+ time_ns为实际映射时间或明确未采集的None;canonical_keys说明文本字段键。
146
+ 返回: LegacyDecodedUpdate/LegacyUntimedUpdate;非目标数据帧返回None。
147
+ 异常: 类型/数值/身份错误原样传播,不缓存前条值补齐缺失。
148
+ """
149
+ if type(canonical_keys) is not bool:
150
+ raise TypeError('canonical_keys需要bool')
151
+ item = self._matching(frame)
152
+ if item is None:
153
+ return None
154
+ fields, reference = item
155
+ selected = {field.signal: values.get(field.key if canonical_keys else field.signal)
156
+ for field in fields if field in self._value_fields}
157
+ update_type = LegacyUntimedUpdate if time_ns is None else LegacyDecodedUpdate
158
+ return update_type(time_ns, self.source, frame.channel, frame.arbitration_id,
159
+ frame.is_extended_id, frame.is_fd, frame.is_remote_frame,
160
+ frame.is_error_frame, reference, sequence, sequence, selected)
@@ -0,0 +1,133 @@
1
+ """声明独立已解码信号表的格式,并保存每个CSV样本的位置。
2
+
3
+ SignalCSVSpec接收有序路径、时间列、时间单位、时区、编码、分隔符和
4
+ 缺失标记,输出冻结配置;构造仅检查声明,不打开文件或根据后缀猜格式。
5
+ CSVSourceRef在通用来源引用上增加文件路径、记录末物理行和原始单元格
6
+ 文本,供实际读取后追溯。时间量化诊断单独保留,不从文件名推断观测范围。
7
+ """
8
+
9
+ # encoding合法性可以静态检查,不读取输入表内容。
10
+ import codecs
11
+ # 冻结配置与继承来源引用,不创建可变全局状态。
12
+ from dataclasses import dataclass
13
+ # 绝对日期没有自身时区偏移时需要明确tzinfo,不能采用机器当前时区。
14
+ from datetime import tzinfo
15
+ # 文件路径只作声明,不查询文件状态、不打开文件,也不重新排序。
16
+ from pathlib import Path
17
+ # 每样本引用沿用已验收的会话/来源/字段校验。
18
+ from ..core.models import SourceRef, TimebaseSpec
19
+ # 时间类型区别于表示单位,不能互相猜测。
20
+ from ..core.types import TimeType
21
+ # 字段保留原文,来源名是简单标识。
22
+ from ..core.validation import require_identifier, require_text
23
+ # offset遵守精确纳秒范围。
24
+ from ..timebase.conversion import require_int64_ns
25
+
26
+
27
+ @dataclass(frozen=True)
28
+ class SignalCSVSpec:
29
+ """保存已解码信号表的格式和时钟声明,保留paths的给定顺序。
30
+
31
+ name标识来源,paths指定连续输入文件;timebase给出相对公共起点或绝对
32
+ 时钟,time_column与unit解释时间单元格,offset_ns是显式纳秒偏移。
33
+ timezone只用于缺少自身时区的绝对日期。encoding、sep和missing_values
34
+ 明确表格解析规则;声明检查不会核实文件存在性或实际表头。
35
+
36
+ 实际适配器把每行每个请求列当作一次观测。缺失文本精确匹配后转None,
37
+ 表示明确缺失更新;旧Filter输出中的空白未更新含义须另按旧来源契约接入。
38
+ """
39
+
40
+ name: str # 当前计划来源名。
41
+ paths: tuple[Path, ...] # 明确连续文件顺序,不扫描目录自动排序。
42
+ timebase: TimebaseSpec # relative公共起点/absolute明确声明。
43
+ time_column: str # 原时间列名,必须在每个表头存在。
44
+ unit: str # s/ms/us/ns或absolute的ISO8601。
45
+ offset_ns: int = 0 # 显式固定偏移,不能证明同步。
46
+ timezone: tzinfo | None = None # ISO无offset时明确采用的时区。
47
+ encoding: str = 'utf-8' # 不猜文件编码。
48
+ delimiter: str = ',' # 单字符分隔符,不自动sniff。
49
+ missing_values: tuple[str, ...] = ('',) # 精确匹配原cell,不strip标记。
50
+
51
+ def __post_init__(self) -> None:
52
+ """检查表格格式与时间声明,保持路径和缺失标记的原顺序。
53
+
54
+ 参数:
55
+ 无。使用name、paths、timebase、time_column、unit、offset_ns、
56
+ timezone、encoding、sep和missing_values字段。
57
+ 返回:
58
+ None。只检查冻结实例,不读取表头或数据。
59
+ 异常:
60
+ TypeError: 路径、时区或声明结构类型错误。
61
+ ValueError: 时间单位、名称、分隔符或缺失标记不合法。
62
+ LookupError: 编码名称不受本机编码注册表支持。
63
+ OverflowError: offset_ns超出整数纳秒范围。
64
+ """
65
+ # 来源名必须是计划内安全别名。
66
+ require_identifier(self.name, 'csv.name')
67
+ # paths必须明确非空,不能接受字符串作为可迭代字符路径。
68
+ if not isinstance(self.paths, tuple) or not self.paths or any(not isinstance(path, Path) for path in self.paths):
69
+ # 不从目录猜测会话/文件顺序。
70
+ raise TypeError('csv.paths需要非空tuple[Path]')
71
+ # 必须明确时基/表示单位,ISO只用于absolute。
72
+ if not isinstance(self.timebase, TimebaseSpec) or self.unit not in ('s', 'ms', 'us', 'ns', 'ISO8601') or self.unit == 'ISO8601' and self.timebase.time_type is not TimeType.ABSOLUTE:
73
+ # 原始报文时间策略不在此通用表接口猜测。
74
+ raise ValueError('csv时基/时间单位错误')
75
+ # 原列名完整保留,不自动改名。
76
+ require_text(self.time_column, 'csv.time_column')
77
+ # 合法偏移也不会自动证明与另一来源已同步。
78
+ require_int64_ns(self.offset_ns, 'csv.offset_ns')
79
+ # 时区仅接受已经解析的显式tzinfo。
80
+ if self.timezone is not None and not isinstance(self.timezone, tzinfo):
81
+ # 配置解析层负责把地区时区名称或固定偏移文本转换为tzinfo。
82
+ raise TypeError('csv.timezone需要tzinfo')
83
+ # 编码名称是明确配置,查询注册表不会读取CSV文件。
84
+ require_text(self.encoding, 'csv.encoding')
85
+ # 未知编码在执行前报告,不尝试自动检测。
86
+ codecs.lookup(self.encoding)
87
+ # csv标准reader只接一个非换行分隔符。
88
+ if type(self.delimiter) is not str or len(self.delimiter) != 1 or self.delimiter in '\r\n':
89
+ # TSV可显式用tab,任意多字符分隔拒绝。
90
+ raise ValueError('csv.delimiter需要单个非换行字符')
91
+ # 标记可为空字符串但必须原生str、唯一冻结tuple。
92
+ if not isinstance(self.missing_values, tuple) or any(type(item) is not str for item in self.missing_values) or len(set(self.missing_values)) != len(self.missing_values):
93
+ # 不把未知格式猜为无效0。
94
+ raise ValueError('csv.missing_values需要唯一字符串tuple')
95
+
96
+
97
+ @dataclass(frozen=True)
98
+ class CSVSourceRef(SourceRef):
99
+ """保留单个已读取样本的文件位置和原始文本。
100
+
101
+ 继承的session_id、source_name和field确定会话、来源及原字段。
102
+ path指出文件,line_number是CSV记录结束的物理行,time_text和value_text
103
+ 保留原单元格文本;time_quantized标记时间是否发生纳秒量化。
104
+ 引用不保存sequence,稳定原行序号由SignalSeries的sequence列另行保存。
105
+ 引号内跨多行的记录以最后物理行为位置,不能把它解释成记录首行。
106
+ """
107
+
108
+ path: str # 实际读取路径原文。
109
+ line_number: int # csv reader给出的记录末物理行,1开始。
110
+ time_text: str # 原时间cell文本。
111
+ value_text: str # 原字段cell文本,解析异常诊断不丢原文。
112
+ time_quantized: bool # 时间转换曾按纳秒half-even量化。
113
+
114
+ def __post_init__(self) -> None:
115
+ """检查继承的来源身份和CSV附加定位,不访问路径。
116
+
117
+ 参数:
118
+ 无。读取来源身份、path、line_number、time_text、value_text和time_quantized。
119
+ 返回:
120
+ None。文本保持原样,缺失单元格允许value_text为空字符串。
121
+ 异常:
122
+ TypeError或ValueError: 来源名称、字段、路径、正整数行号或附加字段类型错误。
123
+ 副作用:
124
+ 无文件访问;引用构造本身不能证明path已经成功打开。
125
+ """
126
+ # 基类校验会话/来源/原字段,不能省略而只留下行号。
127
+ super().__post_init__()
128
+ # 路径文本必须非空;是否成功打开由实际读取适配器另行核实。
129
+ require_text(self.path, 'csv_ref.path')
130
+ # 物理行号明确正数,不接受True或0。
131
+ if type(self.line_number) is not int or self.line_number <= 0 or type(self.time_text) is not str or type(self.value_text) is not str or type(self.time_quantized) is not bool:
132
+ # 缺失cell可以value_text为空,不因此丢来源。
133
+ raise ValueError('CSVSourceRef行号/文本/量化类型错误')
@@ -0,0 +1,65 @@
1
+ """把显式信号定义转成来源的静态字段描述。
2
+
3
+ 输入是来源名称、SignalDefinition元组和可选定位信息,输出FieldDescription
4
+ 元组。每项保留表达式别名、原字段、输出类型与单位,并保存转换、有效期、
5
+ 可选语义、方向、测量位置和枚举标签。内存来源与已解码CSV共用该转换。
6
+ 本模块不读取输入文件或DBC,也不核实声明是否与实际表头或物理测量一致。
7
+ """
8
+
9
+ # 自由元数据仍使用JSON结构,类型在模型边界深冻结。
10
+ from collections.abc import Mapping
11
+ # 完整配置契约只保存稳定摘要,避免把原无效NaN等塞进JSON元数据。
12
+ from hashlib import sha256
13
+ # 明确绑定定义是已验收的配置契约。
14
+ from ..core.binding import SignalDefinition, _identity
15
+ from ..core.models import TimebaseSpec
16
+ from ..timebase.conversion import require_int64_ns
17
+ # enum固定域由声明提供,不能在batch内猜测。
18
+ from ..core.types import SignalDType
19
+ # 公开字段描述保留原定位,与表达式别名分开。
20
+ from .models import FieldDescription, FieldLocation, JsonValue
21
+
22
+
23
+ def source_timebase_identity(timebase: TimebaseSpec, offset_ns: int) -> str:
24
+ """为实际适配器使用的时基种类/原点/固定偏移生成独立摘要。
25
+
26
+ 参数: timebase已校验TimebaseSpec;offset_ns为整数纳秒偏移。
27
+ 返回: SHA256文本,仅标识配置,不证明物理时钟同步已核实。
28
+ 异常: TypeError/OverflowError为未声明时基或非法偏移;不读取输入。
29
+ """
30
+ if not isinstance(timebase, TimebaseSpec):
31
+ raise TypeError('时基身份需要TimebaseSpec')
32
+ offset = require_int64_ns(offset_ns, 'source.offset_ns')
33
+ # 单凭相同ID不能证明相同起点;完整原点/种类进入配置指纹。
34
+ payload = ('source-timebase-v1', timebase.timebase_id, timebase.time_type.value, timebase.origin, offset)
35
+ return sha256(_identity(payload).encode('utf-8')).hexdigest()
36
+
37
+
38
+ def describe_fields(source: str, signals: tuple[SignalDefinition, ...], locator: Mapping[str, JsonValue] | None = None) -> tuple[FieldDescription, ...]:
39
+ """逐项保存字段定位和转换声明,不把声明当作实际数据核实。
40
+
41
+ 参数:
42
+ source (str): 当前来源名称。
43
+ signals (tuple[SignalDefinition, ...]): 该来源已解析的显式信号定义。
44
+ locator (Mapping | None): 可附加的静态定位信息,默认None,使用空对象。
45
+ 返回:
46
+ tuple[FieldDescription, ...]。保持定义顺序,元数据和定位映射深度冻结。
47
+ valid_for_ns是有效值最多保持的时长声明;本函数不在此执行保持或过期判断。
48
+ 原始CAN的None表示等待同次DBC周期解析,不表示无限保持。
49
+ 异常:
50
+ TypeError或ValueError: 字段描述或定位信息不符合公共模型要求。
51
+ 副作用:
52
+ 无输入扫描;同一原字段的多个别名分别保留自己的显式转换。
53
+ """
54
+ # 未给定位时为空对象,不从路径猜通道/消息或工程语义。
55
+ location = {} if locator is None else locator
56
+ # 每别名描述自己的转换,允许同原字段显式不同映射。
57
+ return tuple(FieldDescription(item.name, FieldLocation(source, item.field, location), item.dtype, item.unit,
58
+ {'normalization_sha256': sha256(_identity(('normalization-v1', item.identity())).encode('utf-8')).hexdigest(),
59
+ 'input_unit': item.input_unit, 'scale': item.scale, 'offset': item.offset,
60
+ 'valid_for_ns': item.valid_for_ns, 'semantic_id': item.semantic_id, 'unit_status': item.unit_status,
61
+ 'mapping_version': item.mapping_version, 'semantic_contract_version': item.semantic_contract_version,
62
+ 'sign_convention': item.sign_convention, 'input_sign_convention': item.input_sign_convention,
63
+ 'direction_factor': item.direction_factor, 'measurement_location': item.measurement_location,
64
+ 'same_time_policy': item.same_time_policy,
65
+ 'labels': tuple(dict.fromkeys(label for _, label in item.choices)) if item.dtype is SignalDType.ENUM else ()}) for item in signals)