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,412 @@
1
+ """在共享预算内按批取得原CAN解码结果,保全量观测时间与需要的完整原记录。
2
+
3
+ 复用逐条read的INIT/READY验证、实际进程关闭和失败恢复,不改变原逐条入口。
4
+ 父在授予一批许可前预付两端缓冲、解析模型和时间数组的保守费用;同时只一批在途。
5
+ 每批最多4096原帧且256KiB,预算较小时缩字节上限。默认同步;显式开启预取时,
6
+ 当前批交付前可再预付并授权一批,使子读取与父计算重叠。取消或当前批处理失败时
7
+ 可能额外读出这一批;预约/发送失败则当前批也不交付。预算不足时同步读取。
8
+ 最后数据批可含真实EOF,下一次next完成退出/关闭才finished。
9
+ 低层默认full/source保旧协议;auto结合固定requested范围使用v4 READY与CXB2,
10
+ 原帧数独立于时间数量,计数和预取不会因跳过无用时间而丢失读取进度。
11
+ """
12
+
13
+ from functools import partial
14
+ from dataclasses import replace
15
+ from pathlib import Path
16
+
17
+ from .batch_wire import (BATCH_MAGIC, DEMAND_MAGIC, HEADER, DEMAND_HEADER, MAX_BATCH_BYTES, MAX_BATCH_ROWS, MIN_BATCH_BYTES,
18
+ FILE_HEADER, FILE_MAGIC, decode_batch)
19
+ from .batch_worker import REQUESTED_VALUES_POLICY, batch_worker_main
20
+ from .process_read import LegacyCANProcessRead
21
+ from .records import MAX_WIRE_BYTES, decode_packet
22
+ from ..results.budget import _reserve_owned_ram, _release_owned_ram
23
+ from ..results.errors import BudgetExceededError
24
+ from ..sources.protocol import SourceReadError
25
+
26
+
27
+ class LegacyCANBatchRead(LegacyCANProcessRead):
28
+ """持有当前借用结果及可选下一批许可,全部费用由共享关闭流程归还。
29
+
30
+ _current保存已验证批次,_current_cost预付两端全部批次工作空间;
31
+ _prefetch_packet/_prefetch_cost独立持有至多一个下一批许可及其完整费用,
32
+ 所有共享账本操作均在父调用线程完成,没有后台线程预约或无界队列。
33
+ _batch_eof仅表示收到EOF候选,实际.finished仍要求子正常退出和父关闭成功。
34
+ """
35
+
36
+ def __init__(self, request, budget, *, frame_ids=None, batch_rows=MAX_BATCH_ROWS,
37
+ consumer_headroom_bytes=0, prefetch=False, decode_scope='all',
38
+ decode_frame_ids=None, input_check='full', time_scope='source', _worker_target=None,
39
+ input_paths=None, decode_policy='legacy', cycle_fields=(), metadata_fields=()):
40
+ """保存批次上限与解码后选择,不打开文件或启动子进程。
41
+
42
+ 参数: request/budget同逐条read;frame_ids=None保全部原记录,tuple仅保这些ID;
43
+ batch_rows为1至4096原帧上限;consumer_headroom_bytes为调用方处理本批时
44
+ 仍需预约的工作空间,此处只留余量、不代其付款;prefetch为显式bool,
45
+ True允许额外一个已付批次在途;_worker_target仅供真实spawn故障测试。
46
+ decode_scope='all'沿用原全解码与v1 READY,此时decode_frame_ids须为None;
47
+ 'requested'须给固定原生tuple ID,fields只能属于这些ID,使用严格v3 READY;
48
+ 此时frame_ids仍可为None或其他ID,保留原始帧不扩大固定解码范围。
49
+ input_paths为原序BLF Path tuple或None;decode_policy默认legacy,strict/partial
50
+ 采用新长度政策。两者启用时v5 READY确认文件和政策,多文件批带文件位置。
51
+ cycle_fields为另行请求周期的有限字段tuple;metadata_fields仅取候选。两者不加入值解码,v5确认声明。
52
+ input_check默认full/source保旧行为;auto启用ID优先和v4 READY,
53
+ time_scope为source/selected/none,后两者只传所需身份不能供原始片段导出。
54
+ 返回: 尚未启动read。异常: 原配置/预算错误,未返回owner仍可恢复close。
55
+ """
56
+ self._frame_ids, self._batch_rows = frame_ids, batch_rows
57
+ self._consumer_headroom_bytes = consumer_headroom_bytes
58
+ self._batch_limit = MAX_WIRE_BYTES
59
+ self._batch_eof = False
60
+ self._frames_authorized = self._records_returned = 0
61
+ self._prefetch = prefetch
62
+ self._prefetch_packet = None
63
+ self._prefetch_cost = 0
64
+ self._prefetch_headroom_bytes = 0
65
+ # 内部来源证明可借用刚核完的原包;默认无观察者,不复制包或另收取散列费用。
66
+ self._validated_packet_consumer = None
67
+ # 基类构造取消会动态调用本类close,先建立策略引用与独立费用责任槽。
68
+ self._decode_scope, self._decode_frame_ids = decode_scope, decode_frame_ids
69
+ self._input_check, self._time_scope = input_check, time_scope
70
+ self._minimum_batch_bytes = MIN_BATCH_BYTES + (
71
+ DEMAND_HEADER.size-HEADER.size if input_check == 'auto' and time_scope == 'source' else 0)
72
+ self._cycle_fields = cycle_fields
73
+ self._metadata_fields = metadata_fields
74
+ self._input_paths, self._decode_policy = input_paths, decode_policy
75
+ self._input_index_accepted = 0
76
+ self._source_policy_cost = 0
77
+ self._file_envelope = False
78
+ self._full_checks_accepted = 0
79
+ self._decode_policy_cost = 0
80
+ super().__init__(request, budget,
81
+ _worker_target=batch_worker_main if _worker_target is None else _worker_target)
82
+ try:
83
+ if type(prefetch) is not bool:
84
+ raise TypeError('CAN批次预取开关必须是bool')
85
+ if type(batch_rows) is not int or not 1 <= batch_rows <= MAX_BATCH_ROWS:
86
+ raise ValueError('批次需要1至4096条原帧上限')
87
+ if type(consumer_headroom_bytes) is not int or consumer_headroom_bytes < 0:
88
+ raise ValueError('消费批次的后续工作余量必须是非负整数')
89
+ if frame_ids is not None and (type(frame_ids) is not tuple or len(frame_ids) > 4096
90
+ or any(type(value) is not int or not 0 <= value <= 0x1fffffff for value in frame_ids)
91
+ or len(set(frame_ids)) != len(frame_ids)):
92
+ raise ValueError('解码后保留ID必须是无重复29位整数tuple或None')
93
+ if type(decode_scope) is not str or decode_scope not in ('all', 'requested'):
94
+ raise ValueError('CAN解码范围需要all或requested')
95
+ if type(input_check) is not str or input_check not in ('auto', 'full'):
96
+ raise ValueError('CAN输入检查需要auto/full')
97
+ if type(time_scope) is not str or time_scope not in ('source', 'selected', 'none'):
98
+ raise ValueError('CAN时间范围需要source/selected/none')
99
+ if input_check == 'full' and time_scope != 'source':
100
+ raise ValueError('完整检查必须保留全来源时间')
101
+ if input_check == 'auto' and decode_scope != 'requested':
102
+ raise ValueError('自动按需检查需要固定requested解码范围')
103
+ if decode_scope == 'all':
104
+ if decode_frame_ids is not None:
105
+ raise ValueError('全解码模式不能另设固定解码ID')
106
+ else:
107
+ if (type(decode_frame_ids) is not tuple or len(decode_frame_ids) > 4096
108
+ or any(type(value) is not int or not 0 <= value <= 0x1fffffff
109
+ for value in decode_frame_ids)):
110
+ raise ValueError('按需解码ID必须是无重复29位整数tuple')
111
+ # 独立预付父/子tuple、集合、partial及策略元数据;不挪用消费批次余量。
112
+ # 每ID 256B覆盖两侧容器槽,8192B覆盖空容器/函数描述;每字段1024B
113
+ # 另覆盖子侧投影表和构建临时槽,名称借自已付请求,不复制其文本。
114
+ _reserve_owned_ram(self, 8192 + 256 * len(decode_frame_ids)
115
+ + 1024 * len(request.fields), '_decode_policy_cost')
116
+ if len(set(decode_frame_ids)) != len(decode_frame_ids):
117
+ raise ValueError('按需解码ID必须是无重复29位整数tuple')
118
+ if any(field.frame_id not in decode_frame_ids for field in request.fields):
119
+ raise ValueError('所需字段的报文ID必须属于固定解码集合')
120
+ if _worker_target is None:
121
+ self._worker_target = partial(batch_worker_main, decode_frame_ids=decode_frame_ids,
122
+ input_check=input_check, time_scope=time_scope)
123
+ from .decode_policy import validate_decode_policy
124
+ validate_decode_policy(decode_policy)
125
+ from .dbc_cycles import require_cycle_fields
126
+ require_cycle_fields(cycle_fields)
127
+ require_cycle_fields(metadata_fields)
128
+ if input_paths is not None:
129
+ if (type(input_paths) is not tuple or not 1 <= len(input_paths) <= 4096
130
+ or any(not isinstance(p,Path) or p.suffix.lower() != '.blf'
131
+ or len(str(p)) > 4096 for p in input_paths)
132
+ or input_paths[0] != request.input_path):
133
+ raise ValueError('连续输入需要原序BLF Path tuple,首路径须与INIT一致')
134
+ if input_paths is not None or decode_policy != 'legacy' or cycle_fields or metadata_fields:
135
+ paths = input_paths or (request.input_path,)
136
+ _reserve_owned_ram(self,16384 + sum(512+len(str(p))*32 for p in paths)
137
+ + len(request.fields)*512
138
+ + sum(8192+128*len(f.signal) for f in (*cycle_fields,*metadata_fields)),'_source_policy_cost')
139
+ self._file_envelope = len(paths) > 1
140
+ self._minimum_batch_bytes += FILE_HEADER.size if self._file_envelope else 0
141
+ if _worker_target is None:
142
+ self._worker_target = partial(batch_worker_main,
143
+ decode_frame_ids=decode_frame_ids,input_check=input_check,time_scope=time_scope,
144
+ input_paths=None if input_paths is None else tuple(str(p) for p in input_paths),
145
+ decode_policy=decode_policy,cycle_fields=cycle_fields,metadata_fields=metadata_fields)
146
+ except BaseException as exc:
147
+ self._fail(exc, '批次构造')
148
+
149
+ def _check_ready(self, packet):
150
+ """默认沿用原v1验证;requested核v3,auto核v4及检查/时间范围。
151
+
152
+ 参数: packet为严格wire解码后的READY。返回: None。异常: SourceReadError。
153
+ ID先逐项核原生int再比较tuple,拒绝bool/int混同、缺项、额外字段或顺序改变;
154
+ 显式测试worker也必须确认同策略,不能用旧v1/v2应答冒充字段已裁剪。
155
+ """
156
+ if self._input_paths is not None or self._decode_policy != 'legacy' or self._cycle_fields or self._metadata_fields:
157
+ expected_paths = [str(p) for p in (self._input_paths or (self._request.input_path,))]
158
+ base_version = 1 if self._decode_scope == 'all' else (4 if self._input_check == 'auto' else 3)
159
+ if (type(packet.get('version')) is not int or packet['version'] != 5
160
+ or type(packet.get('base_version')) is not int or packet['base_version'] != base_version
161
+ or packet.get('input_paths') != expected_paths
162
+ or packet.get('decode_policy') != self._decode_policy):
163
+ raise SourceReadError('连续CAN READY文件或解码政策不符')
164
+ if self._cycle_fields:
165
+ from .records import field_from_dict
166
+ actual = packet.get('cycle_fields')
167
+ if type(actual) is not list or tuple(field_from_dict(f) for f in actual) != self._cycle_fields:
168
+ raise SourceReadError('CAN READY周期请求与声明不同')
169
+ if self._metadata_fields:
170
+ from .records import field_from_dict
171
+ actual = packet.get('metadata_fields')
172
+ if type(actual) is not list or tuple(field_from_dict(f) for f in actual) != self._metadata_fields:
173
+ raise SourceReadError('CAN READY字段候选请求与声明不同')
174
+ packet = dict(packet)
175
+ if self._metadata_fields:
176
+ packet.pop('metadata_fields')
177
+ if self._cycle_fields:
178
+ packet.pop('cycle_fields')
179
+ packet['version'] = packet.pop('base_version')
180
+ packet.pop('input_paths'); packet.pop('decode_policy')
181
+ if self._decode_scope == 'all':
182
+ return super()._check_ready(packet)
183
+ required_keys = {'op', 'version', 'profile', 'worker_pid', 'fields',
184
+ 'dependency_versions', 'vendor_sha256', 'decode_scope', 'decode_frame_ids',
185
+ 'decoded_values_policy'}
186
+ if self._input_check == 'auto':
187
+ required_keys.update(('input_check', 'time_scope'))
188
+ if (set(packet) != required_keys
189
+ or packet.get('op') != 'ready' or type(packet.get('version')) is not int
190
+ or packet.get('version') != (4 if self._input_check == 'auto' else 3)
191
+ or packet.get('profile') != self._request.profile
192
+ or type(packet.get('worker_pid')) is not int
193
+ or packet.get('worker_pid') != self._worker_pid):
194
+ raise SourceReadError('按需CAN READY身份、版本或实际PID不符')
195
+ ids = packet['decode_frame_ids']
196
+ if (type(packet['decode_scope']) is not str or packet['decode_scope'] != 'requested'
197
+ or type(ids) is not list or len(ids) != len(self._decode_frame_ids)
198
+ or any(type(value) is not int for value in ids)
199
+ or tuple(ids) != self._decode_frame_ids
200
+ or type(packet['decoded_values_policy']) is not str
201
+ or packet['decoded_values_policy'] != REQUESTED_VALUES_POLICY):
202
+ raise SourceReadError('按需CAN READY解码策略或固定ID与启动请求不同')
203
+ if self._input_check == 'auto' and (packet['input_check'] != 'auto'
204
+ or packet['time_scope'] != self._time_scope):
205
+ raise SourceReadError('按需CAN READY检查或时间范围与启动请求不同')
206
+ self._check_ready_metadata(packet)
207
+
208
+ def _check_ready_metadata(self, packet):
209
+ """周期只为显式请求字段核验;默认维持原元数据契约。
210
+
211
+ 参数: packet为已核READY。返回: None。异常: 原字段、周期或依赖校验错误。
212
+ """
213
+ return super()._check_ready_metadata(packet,cycle_fields=self._cycle_fields,metadata_fields=self._metadata_fields)
214
+
215
+ @property
216
+ def counters(self):
217
+ """区分批次许可上界、收到的原帧与保留记录,不把未消费批次伪称已完成。
218
+
219
+ 参数: 无。返回: 独立dict;frames_authorized包含许可但可能没读到的余量。
220
+ 异常: 原小字典分配错误。边界: items计全部原帧;accepted为接收校验完成,
221
+ returned为已交付,records_returned计已交付的保留记录,预取失败不会虚增交付数。
222
+ """
223
+ # 完整保留历史诊断字典形状,新检查事实通过独立属性与版本化批次发布。
224
+ return dict(super().counters, frames_authorized=self._frames_authorized,
225
+ records_returned=self._records_returned)
226
+
227
+ @property
228
+ def full_check_count(self):
229
+ """读取已验收批次中非原生输入执行完整检查的实际回退数。
230
+
231
+ 参数: 无。返回: 非负int;不计尚在预取中的包,关闭后仍保留统计。
232
+ 异常: 无。此属性不把完整检查默认模式中的原帧数误作按需回退数量。
233
+ """
234
+ return self._full_checks_accepted
235
+
236
+ def _receive_reply(self):
237
+ """在已预付的上限内接收批数据或原严格控制JSON,拒绝错误版本和超长包。
238
+
239
+ 参数: 无。返回: 批次回应dict或原READY/ERROR/STATUS。异常: 原管道/格式/取消错误。
240
+ 内部观察者仅在整包严格解码成功后调用一次;只借用本槽中的payload与batch,
241
+ 不改变所有权。回调失败沿next的同一read清理,不交付或再次处理该批。
242
+ """
243
+ batch = None
244
+ try:
245
+ self._pending_reply = self._connection.recv_bytes(self._batch_limit)
246
+ if self._pending_reply.startswith((BATCH_MAGIC, DEMAND_MAGIC, FILE_MAGIC)):
247
+ if self._current_cost == 0:
248
+ raise SourceReadError('未授予/付费的批次数据')
249
+ payload = self._pending_reply
250
+ index, allowance = 0, self._batch_limit
251
+ if self._file_envelope:
252
+ if len(payload) < FILE_HEADER.size or not payload.startswith(FILE_MAGIC):
253
+ raise SourceReadError('连续CAN缺少文件位置')
254
+ _, index = FILE_HEADER.unpack_from(payload)
255
+ if not self._input_index_accepted <= index < len(self._input_paths):
256
+ raise SourceReadError('连续CAN文件位置越界或倒退')
257
+ payload = payload[FILE_HEADER.size:]
258
+ allowance -= FILE_HEADER.size
259
+ elif payload.startswith(FILE_MAGIC):
260
+ raise SourceReadError('单文件CAN收到未声明的连续包')
261
+ batch, eof = decode_batch(payload, expected_start=self._items_accepted,
262
+ row_limit=self._batch_rows, byte_limit=allowance, frame_ids=self._frame_ids,
263
+ time_scope=self._time_scope, input_check=self._input_check)
264
+ if self._file_envelope:
265
+ if eof and index != len(self._input_paths)-1:
266
+ raise SourceReadError('连续CAN在最后文件前报告EOF')
267
+ batch = replace(batch,input_index=index)
268
+ self._input_index_accepted = index
269
+ if self._validated_packet_consumer is not None:
270
+ self._validated_packet_consumer(self, self._pending_reply, batch)
271
+ return {'op': 'batch', 'request_id': batch.start_sequence, 'batch': batch, 'eof': eof}
272
+ # 控制包即使在批读取时也保持原64KiB与严格JSON边界。
273
+ return decode_packet(self._pending_reply)
274
+ finally:
275
+ # 原错误可留在调用方;已结束调用的临时引用不继续占有整批对象。
276
+ batch = payload = None
277
+
278
+ def __next__(self):
279
+ """授予一批有界许可并交付原序数据;确认真实EOF及退出后才结束迭代。
280
+
281
+ 参数: 无。返回: LegacyDecodedBatch,借至下次next或close。
282
+ 异常: 真StopIteration、原预算/来源/取消错误;持续清理失败保同一owner。
283
+ """
284
+ if self._finished:
285
+ raise StopIteration
286
+ self._require_open()
287
+ reply = batch = packet = None
288
+ try:
289
+ self.start()
290
+ # 同步入口保持原归还时机;预取入口的最后批费用在实际关闭后归还。
291
+ if not (self._prefetch and self._batch_eof):
292
+ self._current = self._pending_reply = None
293
+ _release_owned_ram(self, self._current_cost, '_current_cost')
294
+ if self._batch_eof:
295
+ self._eof_received = True
296
+ self.close()
297
+ if self._exit_code != 0:
298
+ raise SourceReadError('旧CAN批次发EOF但没有正常退出')
299
+ self._finished = True
300
+ else:
301
+ if self._prefetch_packet is not None:
302
+ packet = self._prefetch_packet
303
+ if packet['request_id'] != self._items_accepted:
304
+ raise SourceReadError('预取许可与实际已消费位置不符')
305
+ self._batch_limit = packet['bytes']
306
+ # 同一owner的两槽之间移交已付责任,没有新的预算回调或线程。
307
+ self._current_cost, self._prefetch_cost = self._prefetch_cost, 0
308
+ self._prefetch_packet = None
309
+ reply = self._receive_response(packet)
310
+ else:
311
+ self._batch_limit = self._available_limit()
312
+ if self._batch_limit < self._minimum_batch_bytes:
313
+ raise BudgetExceededError('CAN批次预算不足以保留一条最大记录及两端工作空间')
314
+ _reserve_owned_ram(self, 128*self._batch_limit, '_current_cost')
315
+ packet = self._new_packet(self._batch_limit)
316
+ self._pulls_issued += 1
317
+ self._frames_authorized += self._batch_rows
318
+ reply = self._exchange(packet)
319
+ if reply.get('op') != 'batch' or reply.get('request_id') != packet['request_id']:
320
+ raise SourceReadError('批次许可未得到对应批次回应')
321
+ batch = reply['batch']
322
+ self._batch_eof = reply['eof']
323
+ self._items_accepted += batch.frame_count
324
+ self._full_checks_accepted += batch.full_check_count
325
+ self._current = batch
326
+ self._pending_reply = None
327
+ if self._prefetch:
328
+ self._try_prefetch()
329
+ # 预取预约/发送失败时当前批未交付;accepted保接收事实,returned不提前增加。
330
+ self._items_returned += batch.frame_count
331
+ self._records_returned += len(batch.records)
332
+ return batch
333
+ except BaseException as exc:
334
+ # 清掉本frame对大批对象的额外引用;真正持有关系由父_current负责清理。
335
+ reply = batch = packet = None
336
+ self._fail(exc, '批次读取')
337
+ finally:
338
+ reply = batch = packet = None
339
+ raise StopIteration
340
+
341
+ def _new_packet(self, byte_limit):
342
+ """为下一原序号建立有限批次许可,不触碰管道。
343
+
344
+ 参数: 已确定并付费的字节上限。返回: 小dict。异常: 原分配错误。
345
+ """
346
+ return {'op': 'pull_batch', 'request_id': self._items_accepted,
347
+ 'rows': self._batch_rows, 'bytes': byte_limit,
348
+ 'frame_ids': None if self._frame_ids is None else list(self._frame_ids)}
349
+
350
+ def _set_prefetch_headroom(self, extra_bytes):
351
+ """更新仅供下一次额外预取的动态消费余量,不收费且不改变同步许可。
352
+
353
+ 参数: extra_bytes为调用方证明所需的非负原生int,在每次next前更新。
354
+ 返回: None。异常: TypeError/ValueError为非法余量;关闭后拒绝更新。
355
+ 边界: 本线程直接设置有限整数,没有后台预算回调;不足时只停预取。
356
+ """
357
+ self._require_open()
358
+ if type(extra_bytes) is not int:
359
+ raise TypeError('预取额外消费余量必须是原生int')
360
+ if extra_bytes < 0:
361
+ raise ValueError('预取额外消费余量不能为负数')
362
+ self._prefetch_headroom_bytes = extra_bytes
363
+
364
+ def _available_limit(self, *, additional_headroom=0):
365
+ """在当前共享余额中留下消费者余量,计算完整可付款的批次上限。
366
+
367
+ 参数: additional_headroom为预取专用额外余量,原同步读取固定为0。
368
+ 返回: 不超过MAX_BATCH_BYTES的整数,可能不足一条。
369
+ 异常: 原账本读取错误;这里只看余额,不取得额外空间。
370
+ """
371
+ available = (self._budget.memory_budget_bytes - self._budget.ram_bytes
372
+ - self._consumer_headroom_bytes - additional_headroom)
373
+ return min(MAX_BATCH_BYTES, available // 128)
374
+
375
+ def _try_prefetch(self):
376
+ """余量足够时全额预付并发送下一批;否则留到下一次同步读取。
377
+
378
+ 参数: 无,当前批已完成全部接包校验。返回: None。
379
+ 异常: 原预约/发送/取消错误;失败不重发,也不交付当前批,由next统一清理。
380
+ 边界: EOF不再发许可;至多一个在途批,消费余量不用于预付。
381
+ """
382
+ if self._batch_eof:
383
+ return
384
+ if self._waiting or self._prefetch_packet is not None or self._prefetch_cost:
385
+ raise SourceReadError('预取已有一个在途请求或费用责任')
386
+ limit = self._available_limit(additional_headroom=self._prefetch_headroom_bytes)
387
+ if limit < self._minimum_batch_bytes:
388
+ return
389
+ # 只有付款前的余额不足可以回退;预约实际入账或发送中断不可猜测成功程度。
390
+ _reserve_owned_ram(self, 128*limit, '_prefetch_cost')
391
+ self._prefetch_packet = self._new_packet(limit)
392
+ self._pulls_issued += 1
393
+ self._frames_authorized += self._batch_rows
394
+ self._send_request(self._prefetch_packet)
395
+
396
+ def _release_closed_state(self):
397
+ """共享close确认实际资源全关后清预取责任,再按原槽逐笔归还。
398
+
399
+ 参数: 无。返回: None。异常: 原退费错误;同一close可从实际剩余槽恢复。
400
+ """
401
+ self._prefetch_packet = self._frame_ids = None
402
+ self._validated_packet_consumer = None
403
+ # 实际进程已结束才清策略与partial;退款失败仍保本owner费用槽供重复close。
404
+ self._decode_frame_ids = None
405
+ self._worker_target = None
406
+ self._input_paths = None
407
+ self._cycle_fields = ()
408
+ self._metadata_fields = ()
409
+ _release_owned_ram(self,self._source_policy_cost,'_source_policy_cost')
410
+ _release_owned_ram(self, self._decode_policy_cost, '_decode_policy_cost')
411
+ _release_owned_ram(self, self._prefetch_cost, '_prefetch_cost')
412
+ super()._release_closed_state()
@@ -0,0 +1,134 @@
1
+ """校验批次中不再保存的原报文,避免为丢弃的数据建立完整解码记录副本。
2
+
3
+ 输入是旧parse_frame刚返回的原msg、完整values和原yield序号;成功返回None。
4
+ 先沿用原公开帧字段检查。常见原生消息用安全上界证明完整ITEM不超过64KiB;
5
+ 无法证明时,精确计算原ITEM包字节并检查完整values,保留原类型和非有限诊断。
6
+ 本模块不读取或解码报文,不改公共records模型,不写文件或保留输入引用。
7
+ 原帧临时对象和标量编码的费用由调用方在批次许可前预约;不承诺旧库RSS受控。
8
+ """
9
+
10
+ from collections.abc import Mapping
11
+ from math import isfinite
12
+
13
+ from .records import (MAX_WIRE_BYTES, _decoded_values_size, _integer, _scalar_size,
14
+ _ITEM_FIXED_BYTES, _SMALL_ITEM_BASE_UPPER, _small_item_fits)
15
+ from .worker import _frame
16
+
17
+
18
+ def _item_base_size(frame, sequence):
19
+ """计算合法原帧的ITEM空值包大小,不建立固定字段的多层JSON字典。
20
+
21
+ 参数: frame为本次_frame刚校验的LegacyRawFrame;sequence为已校验原生非负int。
22
+ 返回: 含空values字典的精确UTF-8字节数。异常: 原整数转换、文本编码或大小错误。
23
+ 边界: 标志按true/false计长,未知is_rx按null计长;原浮点repr保负零和指数,data每字节为两位hex。
24
+ """
25
+ # 序号在request_id和record.sequence各出现一次;沿用原标量的超大整数限制。
26
+ size = (_ITEM_FIXED_BYTES + 2 * _scalar_size(sequence, MAX_WIRE_BYTES)
27
+ + len(repr(frame.timestamp)) + len(str(frame.arbitration_id))
28
+ + len(str(frame.dlc)) + 2 * len(frame.data))
29
+ # 六个严格bool及可未知的is_rx:false为5字节,true/null均4字节。
30
+ size += 35 - sum((frame.is_extended_id, frame.is_remote_frame, frame.is_error_frame,
31
+ frame.is_fd, frame.is_rx is not False, frame.bitrate_switch, frame.error_state_indicator))
32
+ # channel可能是Unicode/转义文本、int或None,继续使用原精确标量编码规则。
33
+ size += _scalar_size(frame.channel, MAX_WIRE_BYTES)
34
+ if size > MAX_WIRE_BYTES:
35
+ raise ValueError('wire包超过65536字节')
36
+ return size
37
+
38
+
39
+ def _validate_native_frame(msg, values, sequence):
40
+ """校验原生CAN消息的字段快照,不为不会保存的帧构造冻结模型。
41
+
42
+ 参数: msg已由调用方确认是同次旧库的精确Message类型;values和sequence仍未校验。
43
+ 返回: None。异常: 与原_frame及未选记录检查一致的字段、值、编码或大小错误。
44
+ 流程: 按原构造实参顺序读取字段和转换data,随后保持原模型的校验先后。
45
+ 常见完整值字典可用安全上界证明合法;无法证明时仍走原精确检查函数。
46
+ """
47
+ timestamp = arbitration_id = extended = remote = error = channel = dlc = data = None
48
+ fd = rx = bitrate = indicator = name = value = None
49
+ try:
50
+ if len(msg.data) > 64:
51
+ raise ValueError('原报文data超过64字节,不能先复制再拒绝')
52
+ timestamp = msg.timestamp
53
+ arbitration_id = msg.arbitration_id
54
+ extended = msg.is_extended_id
55
+ remote = msg.is_remote_frame
56
+ error = msg.is_error_frame
57
+ channel = msg.channel
58
+ dlc = msg.dlc
59
+ # bytes转换在后四个标志取值之前;自定义data的异常和副作用不得被提前校验改变。
60
+ data = bytes(msg.data)
61
+ fd = msg.is_fd
62
+ rx = msg.is_rx
63
+ bitrate = msg.bitrate_switch
64
+ indicator = msg.error_state_indicator
65
+ if type(timestamp) is not float or not isfinite(timestamp):
66
+ raise ValueError('原报文timestamp需要有限float秒')
67
+ _integer(arbitration_id, 'arbitration_id', maximum=0x1FFFFFFF)
68
+ _integer(dlc, 'dlc', maximum=64)
69
+ if type(data) is not bytes or len(data) > 64:
70
+ raise ValueError('原报文data需要不超过64字节的bytes')
71
+ if channel is not None and type(channel) not in (int, str):
72
+ raise TypeError('原报文channel需要int/str/None')
73
+ if type(channel) is str and len(channel) > MAX_WIRE_BYTES:
74
+ raise ValueError('原报文channel文本过长')
75
+ # 公共原帧先检查可未知方向,再检查其余严格布尔标志。
76
+ if rx is not None and type(rx) is not bool:
77
+ raise TypeError('is_rx需要bool或未知None')
78
+ if not (type(extended) is bool and type(remote) is bool and type(error) is bool
79
+ and type(fd) is bool and (type(rx) is bool or rx is None) and type(bitrate) is bool
80
+ and type(indicator) is bool):
81
+ # 只在错误路径建立名称对照,仍报告原循环遇到的第一个坏标志。
82
+ for name, value in (('is_extended_id', extended), ('is_remote_frame', remote),
83
+ ('is_error_frame', error), ('is_fd', fd), ('is_rx', rx),
84
+ ('bitrate_switch', bitrate), ('error_state_indicator', indicator)):
85
+ if name == 'is_rx':
86
+ if type(value) is not bool and value is not None:
87
+ raise TypeError('is_rx需要bool或未知None')
88
+ elif type(value) is not bool:
89
+ raise TypeError(name + '需要bool')
90
+ _integer(sequence, 'sequence')
91
+ if not isinstance(values, Mapping):
92
+ raise TypeError('解码记录需要LegacyRawFrame与数值Mapping')
93
+ # 只保存校验结论,没有后续编码或复制;完整上界已足够时无需算出精确长度。
94
+ if _small_item_fits(values, sequence, channel):
95
+ return
96
+ # 与_item_base_size相同的原ITEM外壳;直接使用刚核过的局部快照,不重读消息。
97
+ size = (_ITEM_FIXED_BYTES + 2 * _scalar_size(sequence, MAX_WIRE_BYTES)
98
+ + len(repr(timestamp)) + len(str(arbitration_id)) + len(str(dlc)) + 2 * len(data)
99
+ + 35 - (extended + remote + error + fd + (rx is not False) + bitrate + indicator))
100
+ size += _scalar_size(channel, MAX_WIRE_BYTES)
101
+ if size > MAX_WIRE_BYTES:
102
+ raise ValueError('wire包超过65536字节')
103
+ _decoded_values_size(values, MAX_WIRE_BYTES - size + 2)
104
+ finally:
105
+ # 上层保留原异常时,traceback不继续占用当前消息、完整值或原payload快照。
106
+ msg = values = sequence = timestamp = arbitration_id = extended = remote = error = channel = None
107
+ dlc = data = fd = rx = bitrate = indicator = name = value = None
108
+
109
+
110
+ def validate_discarded(msg, values, sequence, *, native_message_type=None):
111
+ """确认未保留原消息仍满足完整记录边界,不因批次选择跳过坏数据。
112
+
113
+ 参数: msg为本次原yield消息;values为原parse返回的完整Mapping;sequence为原序号。
114
+ native_message_type可由worker在旧库加载完成后传入其真实Message类;默认不启用快路。
115
+ 返回: None;既不复制values,也不持有通过检查的数据。
116
+ 异常: 原帧、序号、Mapping、信号名称/类型、Unicode或单条超限错误原样传播。
117
+ 处理流程: 原字段校验→安全上界正证明,或原ITEM精确计长与完整values检查。没有待保存副本,
118
+ 所以不执行公共LegacyDecodedFrame为防止复制时Mapping变化而进行的第二遍检查。
119
+ """
120
+ frame = None
121
+ try:
122
+ if native_message_type is not None and type(msg) is native_message_type:
123
+ return _validate_native_frame(msg, values, sequence)
124
+ # 保留原调用表达式的检查先后:先构造原帧,再检查序号和返回值容器。
125
+ frame = _frame(msg)
126
+ _integer(sequence, 'sequence')
127
+ if not isinstance(values, Mapping):
128
+ raise TypeError('解码记录需要LegacyRawFrame与数值Mapping')
129
+ # 外壳已含{}的两个字节,扣除外壳后须还给values这两个字节的可用量。
130
+ available = MAX_WIRE_BYTES - _item_base_size(frame, sequence) + 2
131
+ _decoded_values_size(values, available)
132
+ finally:
133
+ # 调用方可能保存原异常,辅助函数的traceback不额外保活本条msg/values/原帧。
134
+ msg = values = frame = None