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,277 @@
1
+ """表示旧路径一次实际求值所见的更新,并校验单来源的求值顺序。
2
+
3
+ 输入是调用方已经取得的时间、原帧身份、SourceRef、原求值序号和完整值字典;
4
+ 输出是冻结的LegacyDecodedUpdate及只保存最后事实的LegacyUpdateOrder。
5
+ 无需时间的固定周期消息累计显式使用LegacyUntimedUpdate,其time_ns只能
6
+ 为None;同一顺序器不能混用有时间和无时间更新,不补造0时间。
7
+ 模型保留原字段全文、None和非有限浮点,不推断类型、单位、缩放、TTL、缓存
8
+ 或有效性。QualityFlag.NONE只表示没有记录质量原因,不证明值的新鲜度。
9
+
10
+ 本模块只依赖标准库和共享核心模型,不读取日志、不调用旧解码器,也不提供
11
+ 旧求值点的采集接口。调用方构造这些对象不能证明真实旧生产者已经暴露求值
12
+ 过程;真实求值证据仍须由后续来源契约提供。值字典由调用方提供,本层复制
13
+ 并冻结它,不宣称该复制已有执行预算或IPC大小界限。
14
+ """
15
+
16
+ # 只复用类型、时间及标量校验;原字段不经过表达式别名或CAN线协议转换。
17
+ from collections.abc import Mapping
18
+ from dataclasses import dataclass
19
+ from types import MappingProxyType
20
+
21
+ from ..core.models import SourceRef
22
+ from ..core.types import QualityFlag
23
+ from ..core.validation import require_identifier, require_scalar
24
+ from ..timebase.conversion import require_int64_ns
25
+
26
+
27
+ def _require_nonnegative_int(value: int, field: str) -> int:
28
+ """校验原生非负整数身份,不把布尔或数值子类转成合法序号。
29
+
30
+ 参数:
31
+ value: 原生int,表示通道、帧ID、来源序号或求值序号。
32
+ field: 错误消息使用的字段名称。
33
+ 返回:
34
+ int: 输入的原整数;不重编号,也不设置额外的序号上限。
35
+ 异常:
36
+ TypeError: 输入不是精确的原生int,包括bool和整数子类。
37
+ ValueError: 输入为负数。
38
+ """
39
+ # 身份整数的协议比共享时间的Integral协议严格,不能隐式接受数组标量。
40
+ if type(value) is not int:
41
+ raise TypeError(f"{field}必须为原生非布尔整数")
42
+ if value < 0:
43
+ raise ValueError(f"{field}必须非负")
44
+ return value
45
+
46
+
47
+ @dataclass(frozen=True)
48
+ class LegacyDecodedUpdate:
49
+ """冻结一次求值的原值快照,区分原帧序号与求值序号。
50
+
51
+ time_ns按共享int64纳秒协议规范化;sequence定位原帧,evaluation_index
52
+ 定位求值点,同一帧可以有多次求值。四个原帧标志必须显式传入,不能由ID
53
+ 或载荷猜测。source_ref保留原对象并核对source,不补造旧缓存或求值证据。
54
+ values只接收精确dict或MappingProxyType,复制后冻结;键与原生不可变
55
+ 标量保持原样,空字典合法,非有限浮点不会被替换或自动附加质量原因。
56
+ """
57
+
58
+ time_ns: int # 调用方已取得的时间;仅按共享时间协议规范为Python整数。
59
+ source: str # 与SourceRef.source_name一致的来源标识。
60
+ channel: int # 原生非负通道编号,不从其他帧信息推断。
61
+ frame_id: int # 标准帧或扩展帧范围内的原CAN ID。
62
+ is_extended: bool # 原扩展帧标志,决定ID的合法上限。
63
+ is_fd: bool # 原CAN FD标志,不由数据长度推断。
64
+ is_remote: bool # 原远程帧标志,必须由调用方明确提供。
65
+ is_error: bool # 原错误帧标志,不由质量位推断。
66
+ source_ref: SourceRef # 原来源引用;允许已有SourceRef子类。
67
+ sequence: int # 原帧序号;不要求连续,也不等同于求值序号。
68
+ evaluation_index: int # 旧求值顺序;跨帧及同帧均独立递增。
69
+ values: Mapping[str, int | float | bool | str | None] # 原字段和值的独立冻结副本。
70
+ quality: QualityFlag = QualityFlag.NONE # 只保留明确记录的原因位。
71
+
72
+ def __post_init__(self) -> None:
73
+ """校验显式身份并建立不受调用方字典后续修改影响的快照。
74
+
75
+ 参数:
76
+ 无额外参数;读取构造时传入的全部字段。
77
+ 返回:
78
+ None: 成功后time_ns已规范,values为新MappingProxyType。
79
+ 异常:
80
+ TypeError: 身份、标志、来源引用、质量位、字典或标量类型不符。
81
+ ValueError: 来源不匹配、负身份、ID越界或值字典含空键。
82
+ TimeOverflowError: time_ns超出共享int64纳秒范围。
83
+ MemoryError: 复制原值快照所需的分配失败;不返回部分模型。
84
+ """
85
+ # 时间沿已有协议允许Integral并精确规范;其余身份须为原生整数。
86
+ time_ns = require_int64_ns(self.time_ns)
87
+ # 无时间子类复用同一身份/数值校验,原入口仍在此严格要求真实时间。
88
+ self._freeze_fields()
89
+ object.__setattr__(self, "time_ns", time_ns)
90
+
91
+ def _freeze_fields(self) -> None:
92
+ """校验并冻结有时间与无时间更新共有的身份、质量和原值。
93
+
94
+ 参数:
95
+ 无额外参数;读取当前模型中除time_ns外的全部字段。
96
+ 返回:
97
+ None: values被独立复制并冻结,其他身份及质量保持原值。
98
+ 异常:
99
+ TypeError: 身份、标志、来源引用、质量或原值类型不合法。
100
+ ValueError: 来源不匹配、负身份、ID越界或值字典含空键。
101
+ MemoryError: 复制失败,调用方不能得到部分构造的模型。
102
+ 副作用:
103
+ 仅在当前待构造模型上安装冻结字典,不访问或伪造时间。
104
+ """
105
+ # 两种更新的区别仅为时间需求,不放宽原帧身份或原值契约。
106
+ require_identifier(self.source, "legacy_update.source")
107
+ _require_nonnegative_int(self.channel, "channel")
108
+ _require_nonnegative_int(self.frame_id, "frame_id")
109
+ _require_nonnegative_int(self.sequence, "sequence")
110
+ _require_nonnegative_int(self.evaluation_index, "evaluation_index")
111
+
112
+ # 四个标志各自来自原帧,不用Python真值转换补齐缺失或整数标志。
113
+ for field in ("is_extended", "is_fd", "is_remote", "is_error"):
114
+ if type(getattr(self, field)) is not bool:
115
+ raise TypeError(f"{field}必须为原生bool")
116
+ maximum_id = 0x1FFFFFFF if self.is_extended else 0x7FF
117
+ if self.frame_id > maximum_id:
118
+ raise ValueError("frame_id超出对应标准帧或扩展帧范围")
119
+
120
+ # 引用只核对已有类型和来源身份,不把手工引用当作真实旧求值的证明。
121
+ if not isinstance(self.source_ref, SourceRef):
122
+ raise TypeError("source_ref必须为SourceRef")
123
+ if self.source_ref.source_name != self.source:
124
+ raise ValueError("source_ref.source_name必须与source一致")
125
+ if not isinstance(self.quality, QualityFlag):
126
+ raise TypeError("quality必须为QualityFlag")
127
+
128
+ # 边遍历边校验并复制,避免先校验后再遍历时混入未经检查的新值。
129
+ if type(self.values) not in (dict, MappingProxyType):
130
+ raise TypeError("values仅接受精确dict或MappingProxyType")
131
+ copied = {}
132
+ for key, value in self.values.items():
133
+ if type(key) is not str:
134
+ raise TypeError("values的键必须为原生str")
135
+ if not key:
136
+ raise ValueError("values的键不能为空")
137
+ require_scalar(value)
138
+ copied[key] = value
139
+
140
+ # 值均为不可变原生标量,单层独立复制已足够;不深拷贝或改写数值。
141
+ frozen_values = MappingProxyType(copied)
142
+ object.__setattr__(self, "values", frozen_values)
143
+
144
+
145
+ @dataclass(frozen=True)
146
+ class LegacyUntimedUpdate(LegacyDecodedUpdate):
147
+ """保存无需时间的固定周期消息求值,复用原更新的完整身份和原值合同。
148
+
149
+ time_ns只能显式为None,表示未采集时间;不代表0时刻或无观测数据。
150
+ sequence与evaluation_index保留实际原序及求值序,其他字段与父类一致。
151
+ 本模型仍是LegacyDecodedUpdate,可交由相同逐消息数值核求值;调用方
152
+ 必须确保没有时间消费者,并且不从本模型构造带时间的贡献或观测范围。
153
+ """
154
+
155
+ time_ns: None # 显式未采集;必填,禁止借默认0或其他占位满足时间模型。
156
+
157
+ def __post_init__(self) -> None:
158
+ """拒绝任何实数或占位时间,仅执行父类的共有字段校验。
159
+
160
+ 参数:
161
+ 无额外参数;读取构造字段,time_ns必须为None。
162
+ 返回:
163
+ None: 原值冻结,身份和质量检查与LegacyDecodedUpdate完全相同。
164
+ 异常:
165
+ TypeError: time_ns不是None,或共有字段类型不合法。
166
+ ValueError或MemoryError: 共有身份越界、来源冲突或复制失败。
167
+ 副作用:
168
+ 仅冻结当前模型,不构造虚假时间或修改调用方值字典。
169
+ """
170
+ # 调用方不能把带真实时间的输入误报为未采集时间。
171
+ if self.time_ns is not None:
172
+ raise TypeError("LegacyUntimedUpdate.time_ns必须为None")
173
+ self._freeze_fields()
174
+
175
+
176
+ class LegacyUpdateOrder:
177
+ """校验同一会话和来源的逐次求值,不累计原值或维护旧信号缓存。
178
+
179
+ session_id和source固定;last_time_ns、last_sequence、
180
+ last_evaluation_index初始为None,count初始为0。时间和原帧序号不回退,
181
+ 求值序号严格递增且允许间隙。首个更新固定是否带时间,之后禁止混用;
182
+ 无时间模式的last_time_ns始终为None,仅按原序和求值序前进。
183
+ 同一原帧序号还须保留完全相同的时间、
184
+ 通道、ID和四个标志;值、质量及section引用可不同。最后事实保存在一个
185
+ 当前状态tuple中,全部检查和新状态分配完成后才一次替换;拒绝不改状态。
186
+ """
187
+
188
+ def __init__(self, session_id: str, source: str) -> None:
189
+ """建立一个来源的空顺序状态,不接收或消费任何更新。
190
+
191
+ 参数:
192
+ session_id: 沿共享模型规则校验的会话标识。
193
+ source: 沿共享模型规则校验的来源标识。
194
+ 返回:
195
+ None: 创建只读身份及初始空状态。
196
+ 异常:
197
+ TypeError: 会话或来源不是文本。
198
+ ValueError: 会话或来源不是合法的共享简单标识符。
199
+ """
200
+ # 身份只在构造时安装,公开属性不提供可绕过来源检查的赋值入口。
201
+ self._session_id = require_identifier(session_id, "session_id")
202
+ self._source = require_identifier(source, "source")
203
+ self._state = (None, None, None, 0, None)
204
+
205
+ @property
206
+ def session_id(self) -> str:
207
+ """返回固定会话标识;参数: 无;返回: 原str;异常: 无。"""
208
+ return self._session_id
209
+
210
+ @property
211
+ def source(self) -> str:
212
+ """返回固定来源标识;参数: 无;返回: 原str;异常: 无。"""
213
+ return self._source
214
+
215
+ @property
216
+ def last_time_ns(self) -> int | None:
217
+ """读取最后接受时间;参数: 无;返回: int或初始None;异常: 无。"""
218
+ return self._state[0]
219
+
220
+ @property
221
+ def last_sequence(self) -> int | None:
222
+ """读取最后原帧序号;参数: 无;返回: int或初始None;异常: 无。"""
223
+ return self._state[1]
224
+
225
+ @property
226
+ def last_evaluation_index(self) -> int | None:
227
+ """读取最后求值序号;参数: 无;返回: int或初始None;异常: 无。"""
228
+ return self._state[2]
229
+
230
+ @property
231
+ def count(self) -> int:
232
+ """读取已接受次数;参数: 无;返回: 非负int;异常: 无。"""
233
+ return self._state[3]
234
+
235
+ def accept(self, update: LegacyDecodedUpdate) -> None:
236
+ """接受一个完整更新,仅在全部身份及顺序检查成功后提交最后事实。
237
+
238
+ 参数:
239
+ update: 已构造的LegacyDecodedUpdate或LegacyUntimedUpdate;
240
+ 同帧可携带不同值快照,同一顺序器禁止混用时间模式。
241
+ 返回:
242
+ None: 接受成功,count加一,最后事实切换到本次更新。
243
+ 异常:
244
+ TypeError: update不是LegacyDecodedUpdate。
245
+ ValueError: 会话、来源不符,时间模式混用,时间或原帧序号回退,求值序号不递增,
246
+ 或同一原帧序号的时间、通道、ID、四个标志出现冲突。
247
+ MemoryError: 新状态分配失败;旧状态仍保持不变。
248
+ """
249
+ # 只接受已验证的更新模型;序号关系不从其他帧对象或原值中猜测。
250
+ if not isinstance(update, LegacyDecodedUpdate):
251
+ raise TypeError("update必须为LegacyDecodedUpdate")
252
+ if update.source != self._source or update.source_ref.session_id != self._session_id:
253
+ raise ValueError("update必须属于本会话和来源")
254
+
255
+ # 当前帧身份不含值、质量或section引用,允许同帧多次真实求值。
256
+ frame = (
257
+ update.time_ns, update.channel, update.frame_id,
258
+ update.is_extended, update.is_fd, update.is_remote, update.is_error,
259
+ )
260
+ last_time, last_sequence, last_evaluation, count, last_frame = self._state
261
+ # count区分空状态和已接受无时间更新;保持原五元状态便于原子复制。
262
+ if count and (last_time is None) != (update.time_ns is None):
263
+ raise ValueError("同一顺序器不能混用有时间和无时间更新")
264
+ if last_time is not None and update.time_ns < last_time:
265
+ raise ValueError("time_ns不能回退")
266
+ if last_sequence is not None and update.sequence < last_sequence:
267
+ raise ValueError("sequence不能回退")
268
+ if last_evaluation is not None and update.evaluation_index <= last_evaluation:
269
+ raise ValueError("evaluation_index必须严格递增")
270
+ if update.sequence == last_sequence and frame != last_frame:
271
+ raise ValueError("同一sequence的原帧身份必须一致")
272
+
273
+ # 先完成计数和tuple分配,再以单一写入提交;拒绝路径不接触已有状态。
274
+ next_state = (
275
+ update.time_ns, update.sequence, update.evaluation_index, count + 1, frame,
276
+ )
277
+ self._state = next_state
@@ -0,0 +1,138 @@
1
+ import ast
2
+ import logging
3
+
4
+ import can
5
+ import cantools
6
+
7
+ # 配置日志
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ def build_writer(out_path, out_fmt):
12
+ """
13
+ 根据指定的输出格式和路径,创建对应的 CAN 数据写入器。
14
+
15
+ 该函数支持三种输出格式:
16
+ - 'blf':使用 can.BLFWriter 写入 BLF 格式文件
17
+ - 'asc':使用 can.ASCWriter 写入 ASC 格式文件
18
+ - 'csv':使用 can.CSVWriter 写入 CSV 格式文件
19
+
20
+ 参数:
21
+ out_path (str): 输出文件的路径
22
+ out_fmt (str): 输出文件的格式,支持 'blf'、'asc'、'csv'
23
+
24
+ 返回:
25
+ tuple: 一个包含写入器和路径的元组 (writer, out_path)
26
+ """
27
+ if out_fmt == "blf":
28
+ return can.BLFWriter(out_path), out_path
29
+ elif out_fmt == "asc":
30
+ return can.ASCWriter(out_path), out_path
31
+ elif out_fmt == "csv":
32
+ # 使用python-can官方的CSVWriter
33
+ return can.CSVWriter(out_path), out_path
34
+ else:
35
+ raise ValueError("format 必须是 blf/asc/csv")
36
+
37
+
38
+ def eval_expr(expr, sig_dict):
39
+ """
40
+ 解析并评估一个表达式,该表达式使用信号字典中的信号值。
41
+
42
+ 该函数会先对输入的表达式进行语法检查,确保只包含允许的语法节点。
43
+ 接着检查表达式中引用的信号是否都存在于信号字典中,如果有缺失则返回 False。
44
+ 最后使用安全的方式评估表达式,若评估过程中出现异常也返回 False。
45
+ 对于浮点数比较,使用近似比较来解决精度问题。
46
+
47
+ 参数:
48
+ expr (str): 需要解析和评估的表达式字符串
49
+ sig_dict (dict): 信号字典,键为信号名,值为信号值
50
+
51
+ 返回:
52
+ bool: 若表达式评估结果为真则返回 True;若表达式语法非法、引用缺失信号或评估出错,返回 False
53
+ """
54
+ try:
55
+ # 定义允许的语法节点集合,限制表达式使用的语法
56
+ allowed = {ast.Add, ast.Sub, ast.Mult, ast.Div, ast.Eq, ast.NotEq, ast.Lt, ast.LtE, ast.Gt, ast.GtE,
57
+ ast.And, ast.Or, ast.Module, ast.Expr, ast.Expression,
58
+ ast.Compare, ast.BinOp, ast.Name, ast.Load, ast.Constant}
59
+ # 将表达式解析为抽象语法树节点
60
+ node = ast.parse(expr, mode='eval')
61
+ # 遍历语法树节点,检查是否存在非法语法
62
+ for n in ast.walk(node):
63
+ if type(n) not in allowed:
64
+ raise ValueError(f"非法语法:{type(n)}")
65
+ # 缺失信号直接返回 False
66
+ for name in ast.walk(node):
67
+ if isinstance(name, ast.Name) and name.id not in sig_dict:
68
+ return False
69
+
70
+ # 处理浮点数精度问题:对信号字典中的浮点数进行四舍五入处理
71
+ # 保留足够的小数位数以保持精度,同时消除精度误差
72
+ processed_sig_dict = {}
73
+ for k, v in sig_dict.items():
74
+ if isinstance(v, float):
75
+ # 保留10位小数,足够精确且能消除大部分精度误差
76
+ processed_sig_dict[k] = round(v, 10)
77
+ else:
78
+ processed_sig_dict[k] = v
79
+
80
+ # 筛选出信号字典中数值类型或布尔类型的值,构建评估环境
81
+ env = {k: v for k, v in processed_sig_dict.items() if isinstance(v, (int, float, bool))}
82
+ logger.debug(f"原始信号字典:{sig_dict}")
83
+ logger.debug(f"处理后信号字典:{processed_sig_dict}")
84
+ # 编译并评估表达式
85
+ return eval(compile(node, '<string>', 'eval'), {"__builtins__": {}}, env)
86
+ except Exception as e:
87
+ logger.debug("eval_expr 异常:%s", e)
88
+ return False
89
+
90
+
91
+ def parse_frame(msg, db):
92
+ """
93
+ 从单帧CAN报文解析出全部信号值。
94
+
95
+ 该函数尝试使用提供的数据库对象解码CAN报文,
96
+ 解析出报文中包含的所有信号及其对应的值。
97
+ 如果解析失败,返回空字典。
98
+
99
+ 参数:
100
+ msg (can.Message): CAN报文对象,包含报文ID和数据
101
+ db (can.Database): CAN数据库对象,用于信号解码
102
+
103
+ 返回:
104
+ dict: 包含信号名和对应值的字典;如果解析失败,返回空字典
105
+
106
+ 异常:
107
+ 无显式异常抛出,所有异常都会被捕获并返回空字典
108
+ """
109
+ try:
110
+ vals = db.decode_message(msg.arbitration_id, msg.data, decode_choices=False, allow_truncated=True)
111
+ return vals
112
+ except Exception:
113
+ return {}
114
+
115
+
116
+ def get_signals_for_message_id(db, message_id):
117
+ """
118
+ 获取指定CAN报文ID包含的所有信号名称。
119
+
120
+ 该函数从数据库中查找指定ID的CAN报文定义,
121
+ 并返回该报文中包含的所有信号名称集合。
122
+ 如果未找到对应报文,返回空集合。
123
+
124
+ 参数:
125
+ db (can.Database): CAN数据库对象,包含报文和信号定义
126
+ message_id (int): CAN报文ID
127
+
128
+ 返回:
129
+ set: 包含信号名称的集合;如果未找到报文,返回空集合
130
+
131
+ 异常:
132
+ 无显式异常抛出,所有异常都会被捕获并返回空集合
133
+ """
134
+ try:
135
+ message = db.get_message_by_frame_id(message_id)
136
+ return {signal.name for signal in message.signals}
137
+ except:
138
+ return set()
@@ -0,0 +1,218 @@
1
+ import csv
2
+ import logging
3
+ import os
4
+ from datetime import datetime, timedelta
5
+ from natsort import natsorted
6
+
7
+ import can
8
+ from utils import ASCReaderForCANFD
9
+
10
+ # 配置日志
11
+ logger = logging.getLogger(__name__)
12
+
13
+ def iter_frames(path):
14
+ """
15
+ 该函数是一个统一的生成器,用于按时间顺序逐个生成 can.Message 对象。
16
+ 支持处理单个文件或整个文件夹,具体功能如下:
17
+
18
+ 1. 当输入为单个文件时:
19
+ - 检查文件扩展名,仅支持 .blf、.asc 和 .csv 格式
20
+ - 若为 .blf 文件,使用 can.BLFReader 读取并生成消息
21
+ - 若为 .asc 文件,使用 can.ASCReader 读取并生成消息
22
+ - 若为 .csv 文件,使用 can.CSVReader 读取并生成消息
23
+ - 若文件格式不支持,抛出 ValueError 异常
24
+
25
+ 2. 当输入为文件夹时:
26
+ - 筛选出文件夹内所有 .blf、.asc 和 .csv 文件,并按自然排序
27
+ - 递归调用本函数处理每个文件,逐个生成消息
28
+
29
+ 3. 若输入既不是文件也不是文件夹,抛出 FileNotFoundError 异常
30
+
31
+ 参数:
32
+ path (str): 输入的文件路径或文件夹路径
33
+
34
+ 返回:
35
+ generator: 按时间顺序生成 can.Message 对象的生成器
36
+
37
+ 异常:
38
+ ValueError: 当输入文件的格式不是 .blf、.asc 或 .csv 时抛出
39
+ FileNotFoundError: 当输入路径既不是文件也不是文件夹时抛出
40
+ """
41
+ if os.path.isfile(path):
42
+ ext = os.path.splitext(path)[1].lower()
43
+ if ext == '.blf':
44
+ for m in can.BLFReader(path): yield m
45
+ elif ext == '.asc':
46
+ try:
47
+ for m in can.ASCReader(path,relative_timestamp=False): yield m
48
+ except Exception:
49
+ for m in ASCReaderForCANFD(path, relative_timestamp=False, format_hint='auto'): yield m
50
+ elif ext == '.csv':
51
+ # 使用python-can官方的CSVReader读取CSV文件
52
+ # data需为base64编码
53
+ for m in can.CSVReader(path): yield m
54
+ else:
55
+ raise ValueError("仅支持 blf/asc/csv(data列为base64编码)")
56
+ elif os.path.isdir(path):
57
+ files = natsorted([os.path.join(path, f) for f in os.listdir(path)
58
+ if f.lower().endswith(('.blf', '.asc', '.csv'))])
59
+ for fp in files:
60
+ for m in iter_frames(fp): yield m
61
+ else:
62
+ raise FileNotFoundError("输入必须是文件或文件夹")
63
+
64
+
65
+ def check_csv_header(file_path):
66
+ """
67
+ 前置检查:csv必须含timestamp/arbitration_id/data三列,缺失则抛异常
68
+ 参数:
69
+ file_path (str): csv文件路径
70
+ 返回:
71
+ bool: 若文件头包含timestamp/arbitration_id/data三列则返回True
72
+ 异常:
73
+ ValueError: 当文件头缺失timestamp/arbitration_id/data三列时抛出
74
+ """
75
+ with open(file_path, newline='', encoding='utf-8') as f:
76
+ reader = csv.reader(f)
77
+ header = [h.lower() for h in next(reader)]
78
+ required = {'timestamp', 'arbitration_id', 'data'}
79
+ miss = required - set(header)
80
+ if miss:
81
+ raise ValueError(f"CSV 缺失列 {miss}")
82
+ return True
83
+
84
+
85
+ def merge_convert(inputs, out_base, out_fmt, db):
86
+ """
87
+ 合并输入文件/文件夹→指定格式,csv前置检查
88
+ 参数:
89
+ inputs (list): 输入文件/文件夹路径列表
90
+ out_base (str): 输出文件基础名(不含扩展名)
91
+ out_fmt (str): 输出格式,可选"blf"/"asc"/"csv"
92
+ db (can.Database): 数据库对象,用于解析报文
93
+ 返回:
94
+ None
95
+ 异常:
96
+ ValueError: 当输入文件为csv格式且缺失timestamp/id/data三列时抛出
97
+ FileNotFoundError: 当输入路径既不是文件也不是文件夹时抛出
98
+ """
99
+ from can_processor import build_writer
100
+
101
+ ext = {"blf": ".blf", "asc": ".asc", "csv": ".csv"}[out_fmt]
102
+ out_path = out_base + ext
103
+ # CSV 前置检查(单文件也检查)
104
+ if out_fmt == "csv":
105
+ for fp in inputs:
106
+ if fp.lower().endswith('.csv'): check_csv_header(fp)
107
+
108
+ # 使用build_writer创建统一的写入器
109
+ writer, _ = build_writer(out_path, out_fmt)
110
+
111
+ for fp in inputs:
112
+ for msg in iter_frames(fp):
113
+ writer.on_message_received(msg)
114
+
115
+ # 停止写入器
116
+ writer.stop()
117
+ logger.info(f"合并转换完成→{out_path}")
118
+
119
+
120
+ def output_suffix(path):
121
+ """
122
+ 生成带时间戳的输出基础名
123
+ 参数:
124
+ path (str): 输入文件路径(不含扩展名)
125
+ 返回:
126
+ str: 带时间戳的输出基础名(不含扩展名)
127
+ """
128
+ ts = datetime.now().strftime("%Y%m%d%H%M%S")
129
+ base, ext = os.path.splitext(path)
130
+ return base + f"_{ts}"
131
+
132
+
133
+ def fix_asc_header(file_path, utc_offset=0):
134
+ """
135
+ 修复ASC文件头部时间信息
136
+ 将文件前4行从:
137
+ date Tue Oct 14 16:11:16.648 2025
138
+ base hex timestamps absolute
139
+ internal events logged
140
+ Begin Triggerblock Tue Jun 10 22:35:34.949 2025
141
+
142
+ 变为:
143
+ date Tue Jun 10 22:35:34.949 2025
144
+ base hex timestamps absolute
145
+
146
+ 参数:
147
+ file_path (str): ASC文件路径
148
+ utc_offset (int): UTC偏移量(小时),如果为x,则从date时间减去x小时
149
+
150
+ 返回:
151
+ None
152
+ """
153
+ if not file_path.lower().endswith('.asc'):
154
+ logger.warning(f"{file_path} 不是ASC文件,跳过头部修复")
155
+ return
156
+
157
+ try:
158
+ # 读取文件内容
159
+ with open(file_path, 'r', encoding='utf-8') as f:
160
+ lines = f.readlines()
161
+
162
+ # 查找首行date的时间信息
163
+ header_date_str = None
164
+ if len(lines) > 0 and lines[0].startswith('date '):
165
+ header_date_str = lines[0][len('date '):].strip()
166
+
167
+ # 查找Begin Triggerblock行,提取时间信息
168
+ trigger_time_str = None
169
+ for line in lines:
170
+ if line.startswith('Begin Triggerblock '):
171
+ trigger_time_str = line[len('Begin Triggerblock '):].strip()
172
+ break
173
+
174
+ if not trigger_time_str:
175
+ logger.warning(f"在文件{file_path}中未找到Begin Triggerblock行,跳过头部修复")
176
+ return
177
+
178
+ # 解析时间字符串
179
+ # 时间格式:Tue Jun 10 22:35:34.949 2025
180
+ try:
181
+ trigger_time = datetime.strptime(trigger_time_str, '%a %b %d %H:%M:%S.%f %Y')
182
+
183
+ # 只有当Begin Triggerblock的时间早于header的date时间时才执行修复
184
+ if header_date_str:
185
+ try:
186
+ header_date = datetime.strptime(header_date_str, '%a %b %d %H:%M:%S.%f %Y')
187
+ if trigger_time >= header_date:
188
+ logger.info(f"Begin Triggerblock时间({trigger_time_str})不早于header的date时间({header_date_str}),无需修复")
189
+ return
190
+ except ValueError:
191
+ logger.warning(f"无法解析header的date时间字符串: {header_date_str},继续修复")
192
+
193
+ # 应用UTC偏移
194
+ if utc_offset != 0:
195
+ trigger_time = trigger_time - timedelta(hours=utc_offset)
196
+ # 重新格式化时间字符串
197
+ trigger_time_str = trigger_time.strftime('%a %b %d %H:%M:%S.%f')[:-3] + ' ' + str(trigger_time.year)
198
+ except ValueError:
199
+ logger.error(f"无法解析时间字符串: {trigger_time_str}")
200
+ return
201
+
202
+ # 构建新的文件内容
203
+ new_lines = []
204
+ new_lines.append(f'date {trigger_time_str}\n')
205
+ new_lines.append('base hex timestamps absolute\n')
206
+
207
+ # 跳过原始文件的前4行,添加剩余内容
208
+ if len(lines) > 4:
209
+ new_lines.extend(lines[4:])
210
+
211
+ # 写回文件
212
+ with open(file_path, 'w', encoding='utf-8') as f:
213
+ f.writelines(new_lines)
214
+
215
+ logger.info(f"已修复文件头部时间: {file_path}")
216
+
217
+ except Exception as e:
218
+ logger.error(f"修复ASC文件头部时出错: {str(e)}")