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.
- chronaxis/__init__.py +72 -0
- chronaxis/__main__.py +12 -0
- chronaxis/analysis_cli.py +181 -0
- chronaxis/batch/__init__.py +14 -0
- chronaxis/batch/api.py +46 -0
- chronaxis/batch/cli.py +48 -0
- chronaxis/batch/config.py +37 -0
- chronaxis/batch/models.py +202 -0
- chronaxis/batch/process_transport.py +149 -0
- chronaxis/batch/process_tree.py +72 -0
- chronaxis/batch/publication.py +41 -0
- chronaxis/batch/runner.py +236 -0
- chronaxis/batch/templates.py +42 -0
- chronaxis/can_dependencies.py +42 -0
- chronaxis/cli.py +193 -0
- chronaxis/configuration/__init__.py +46 -0
- chronaxis/configuration/cli.py +41 -0
- chronaxis/configuration/diagnostics.py +107 -0
- chronaxis/configuration/explanation.py +233 -0
- chronaxis/configuration/file_tools.py +140 -0
- chronaxis/configuration/imports.py +144 -0
- chronaxis/configuration/initialization.py +36 -0
- chronaxis/configuration/json_parser.py +114 -0
- chronaxis/configuration/models.py +74 -0
- chronaxis/configuration/origins.py +90 -0
- chronaxis/configuration/overrides.py +55 -0
- chronaxis/configuration/resolution.py +150 -0
- chronaxis/configuration/template_catalog.py +68 -0
- chronaxis/configuration/templates/batch/analysis-annotated.yaml +18 -0
- chronaxis/configuration/templates/batch/analysis-minimal.yaml +18 -0
- chronaxis/configuration/templates/batch/annotated.yaml +6 -0
- chronaxis/configuration/templates/batch/minimal.yaml +6 -0
- chronaxis/configuration/templates/can-asc/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-asc/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-blf/annotated.yaml +18 -0
- chronaxis/configuration/templates/can-blf/minimal.yaml +18 -0
- chronaxis/configuration/templates/can-export/annotated.yaml +23 -0
- chronaxis/configuration/templates/can-export/minimal.yaml +23 -0
- chronaxis/configuration/templates/catalog.json +233 -0
- chronaxis/configuration/templates/charge-session/annotated.yaml +38 -0
- chronaxis/configuration/templates/charge-session/minimal.yaml +38 -0
- chronaxis/configuration/templates/command-response/annotated.yaml +32 -0
- chronaxis/configuration/templates/command-response/minimal.yaml +36 -0
- chronaxis/configuration/templates/fault-window/annotated.yaml +25 -0
- chronaxis/configuration/templates/fault-window/minimal.yaml +27 -0
- chronaxis/configuration/templates/ini-mapping/annotated.yaml +20 -0
- chronaxis/configuration/templates/ini-mapping/minimal.yaml +20 -0
- chronaxis/configuration/templates/raw-can-csv/annotated.yaml +34 -0
- chronaxis/configuration/templates/raw-can-csv/minimal.yaml +35 -0
- chronaxis/configuration/templates/shared/charge-session.asc +5 -0
- chronaxis/configuration/templates/shared/command-response.asc +8 -0
- chronaxis/configuration/templates/shared/fault-window.asc +5 -0
- chronaxis/configuration/templates/shared/power.asc +7 -0
- chronaxis/configuration/templates/shared/sample.asc +6 -0
- chronaxis/configuration/templates/shared/sample.blf +0 -0
- chronaxis/configuration/templates/shared/sample.csv +5 -0
- chronaxis/configuration/templates/shared/sample.dbc +11 -0
- chronaxis/configuration/templates/shared/signals.csv +6 -0
- chronaxis/configuration/templates/shared/source.ini +5 -0
- chronaxis/configuration/templates/shared/stability.asc +9 -0
- chronaxis/configuration/templates/shared/teaching.dbc +27 -0
- chronaxis/configuration/templates/shared/threshold.asc +7 -0
- chronaxis/configuration/templates/signal-csv/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-csv/minimal.yaml +27 -0
- chronaxis/configuration/templates/signal-export/annotated.yaml +27 -0
- chronaxis/configuration/templates/signal-export/minimal.yaml +29 -0
- chronaxis/configuration/templates/stability/annotated.yaml +35 -0
- chronaxis/configuration/templates/stability/minimal.yaml +35 -0
- chronaxis/configuration/templates/threshold/annotated.yaml +22 -0
- chronaxis/configuration/templates/threshold/minimal.yaml +22 -0
- chronaxis/configuration/yaml_parser.py +125 -0
- chronaxis/core/__init__.py +71 -0
- chronaxis/core/binding.py +449 -0
- chronaxis/core/calculation_series_join.py +106 -0
- chronaxis/core/calculations.py +435 -0
- chronaxis/core/calculations_memory_numpy.py +136 -0
- chronaxis/core/calculations_memory_reference.py +165 -0
- chronaxis/core/calculations_numpy.py +298 -0
- chronaxis/core/calculations_reference.py +294 -0
- chronaxis/core/condition_evidence.py +182 -0
- chronaxis/core/conditional_integral_result.py +43 -0
- chronaxis/core/conditional_integral_terms.py +146 -0
- chronaxis/core/conditional_integral_terms_numpy.py +148 -0
- chronaxis/core/conditional_integral_terms_reference.py +111 -0
- chronaxis/core/conditional_time_reduction.py +118 -0
- chronaxis/core/conditional_time_reduction_numpy.py +223 -0
- chronaxis/core/conditional_time_reduction_reference.py +213 -0
- chronaxis/core/declarations.py +192 -0
- chronaxis/core/decoded_binding.py +197 -0
- chronaxis/core/direct_message.py +387 -0
- chronaxis/core/export_interpolation.py +54 -0
- chronaxis/core/expression.py +642 -0
- chronaxis/core/expression_numpy.py +314 -0
- chronaxis/core/expression_reference.py +272 -0
- chronaxis/core/integral_result.py +53 -0
- chronaxis/core/integral_sum.py +77 -0
- chronaxis/core/integral_sum_numpy.py +224 -0
- chronaxis/core/integral_sum_reference.py +148 -0
- chronaxis/core/integral_terms.py +119 -0
- chronaxis/core/integral_terms_numpy.py +127 -0
- chronaxis/core/integral_terms_reference.py +91 -0
- chronaxis/core/mean_weights_numpy.py +29 -0
- chronaxis/core/mean_weights_reference.py +27 -0
- chronaxis/core/message_binding.py +305 -0
- chronaxis/core/models.py +485 -0
- chronaxis/core/normalize_numpy.py +396 -0
- chronaxis/core/numeric.py +472 -0
- chronaxis/core/numeric_numpy.py +440 -0
- chronaxis/core/record_intervals.py +115 -0
- chronaxis/core/sample_reduction.py +161 -0
- chronaxis/core/sample_reduction_numpy.py +160 -0
- chronaxis/core/sample_reduction_reference.py +154 -0
- chronaxis/core/selection.py +74 -0
- chronaxis/core/sequence.py +160 -0
- chronaxis/core/sequence_reference.py +248 -0
- chronaxis/core/stability.py +249 -0
- chronaxis/core/start_end.py +169 -0
- chronaxis/core/state.py +494 -0
- chronaxis/core/state_numpy.py +296 -0
- chronaxis/core/temporal.py +373 -0
- chronaxis/core/temporal_clock.py +25 -0
- chronaxis/core/temporal_memory_numpy.py +163 -0
- chronaxis/core/temporal_memory_reference.py +161 -0
- chronaxis/core/temporal_numpy.py +345 -0
- chronaxis/core/temporal_reference.py +304 -0
- chronaxis/core/time_reduction.py +190 -0
- chronaxis/core/time_reduction_numpy.py +205 -0
- chronaxis/core/time_reduction_reference.py +203 -0
- chronaxis/core/types.py +105 -0
- chronaxis/core/units.py +81 -0
- chronaxis/core/validation.py +94 -0
- chronaxis/core/window_delta.py +123 -0
- chronaxis/core/window_delta_numpy.py +78 -0
- chronaxis/core/window_delta_reference.py +69 -0
- chronaxis/core/windows.py +224 -0
- chronaxis/core/windows_numpy.py +78 -0
- chronaxis/core/windows_reference.py +61 -0
- chronaxis/execution/__init__.py +6 -0
- chronaxis/execution/batch_signal_groups.py +122 -0
- chronaxis/execution/bindings.py +296 -0
- chronaxis/execution/boundaries.py +568 -0
- chronaxis/execution/calculation_blocks.py +338 -0
- chronaxis/execution/calculation_values.py +55 -0
- chronaxis/execution/can_batch_reader.py +356 -0
- chronaxis/execution/can_reader.py +948 -0
- chronaxis/execution/can_reference_template.py +61 -0
- chronaxis/execution/condition_evidence.py +370 -0
- chronaxis/execution/conditional_integral_facts.py +310 -0
- chronaxis/execution/conditional_integral_reduction.py +216 -0
- chronaxis/execution/csv_observation.py +524 -0
- chronaxis/execution/csv_reader.py +662 -0
- chronaxis/execution/current_message_calculation.py +225 -0
- chronaxis/execution/driver_expression.py +274 -0
- chronaxis/execution/expressions.py +618 -0
- chronaxis/execution/frame_capture.py +245 -0
- chronaxis/execution/groups.py +236 -0
- chronaxis/execution/historical_conditional_blocks.py +264 -0
- chronaxis/execution/historical_conditional_integral.py +226 -0
- chronaxis/execution/historical_conditional_time_calculation.py +368 -0
- chronaxis/execution/historical_integral.py +219 -0
- chronaxis/execution/historical_observation.py +372 -0
- chronaxis/execution/historical_sample_calculation.py +338 -0
- chronaxis/execution/historical_selection_rows.py +300 -0
- chronaxis/execution/historical_time_calculation.py +341 -0
- chronaxis/execution/history.py +572 -0
- chronaxis/execution/history_records.py +225 -0
- chronaxis/execution/hold.py +448 -0
- chronaxis/execution/integral_facts.py +311 -0
- chronaxis/execution/integral_reduction.py +216 -0
- chronaxis/execution/legacy_frame_samples.py +94 -0
- chronaxis/execution/memory_reader.py +247 -0
- chronaxis/execution/message_bindings.py +293 -0
- chronaxis/execution/message_delivery.py +37 -0
- chronaxis/execution/observed_ingestion.py +551 -0
- chronaxis/execution/raw_signal_groups.py +192 -0
- chronaxis/execution/record_alarm_duration.py +114 -0
- chronaxis/execution/record_delta_condition.py +167 -0
- chronaxis/execution/record_diagnostics.py +87 -0
- chronaxis/execution/record_event_durations.py +143 -0
- chronaxis/execution/record_export_samples.py +94 -0
- chronaxis/execution/record_exports.py +155 -0
- chronaxis/execution/record_integral.py +196 -0
- chronaxis/execution/record_point_buffer.py +101 -0
- chronaxis/execution/record_rule_timeline.py +344 -0
- chronaxis/execution/record_sample.py +46 -0
- chronaxis/execution/record_sample_series.py +29 -0
- chronaxis/execution/record_scope_calculations.py +290 -0
- chronaxis/execution/record_selection.py +62 -0
- chronaxis/execution/record_sequences.py +199 -0
- chronaxis/execution/record_session_calculations.py +778 -0
- chronaxis/execution/record_signal_export.py +133 -0
- chronaxis/execution/record_source_cursor.py +295 -0
- chronaxis/execution/record_time_calculation.py +322 -0
- chronaxis/execution/record_time_indexes.py +143 -0
- chronaxis/execution/record_value_history.py +160 -0
- chronaxis/execution/record_windows.py +229 -0
- chronaxis/execution/required_expression.py +52 -0
- chronaxis/execution/retained_metadata.py +71 -0
- chronaxis/execution/run_session.py +402 -0
- chronaxis/execution/scanned_signal_proof.py +550 -0
- chronaxis/execution/signal_validity.py +40 -0
- chronaxis/execution/state.py +280 -0
- chronaxis/execution/temporal_buffer.py +508 -0
- chronaxis/execution/text_can_reader.py +359 -0
- chronaxis/execution/timeline.py +309 -0
- chronaxis/execution/timeline_multi.py +415 -0
- chronaxis/execution/window_delta_events.py +220 -0
- chronaxis/execution/window_replay.py +350 -0
- chronaxis/execution/windows.py +173 -0
- chronaxis/guide/README.md +70 -0
- chronaxis/guide/api/AnalysisError.md +14 -0
- chronaxis/guide/api/AnalysisPlan.md +96 -0
- chronaxis/guide/api/AnalysisResult.md +398 -0
- chronaxis/guide/api/AnalysisRunner.md +155 -0
- chronaxis/guide/api/BatchJob.md +19 -0
- chronaxis/guide/api/BatchJobResult.md +61 -0
- chronaxis/guide/api/BatchPlan.md +48 -0
- chronaxis/guide/api/BatchReport.md +108 -0
- chronaxis/guide/api/BatchRunner.md +84 -0
- chronaxis/guide/api/OutputManifest.md +23 -0
- chronaxis/guide/api/PlanFragment.md +47 -0
- chronaxis/guide/api/PlanValidationError.md +98 -0
- chronaxis/guide/api/PresetSpec.md +63 -0
- chronaxis/guide/api/ResultClosedError.md +14 -0
- chronaxis/guide/api/RunMetadata.md +100 -0
- chronaxis/guide/api/TimeConversion.md +29 -0
- chronaxis/guide/api/TimeOverflowError.md +17 -0
- chronaxis/guide/api/build_preset.md +36 -0
- chronaxis/guide/api/checked_add_ns.md +30 -0
- chronaxis/guide/api/convert_time.md +40 -0
- chronaxis/guide/api/explain_analysis_plan.md +38 -0
- chronaxis/guide/api/index.json +185 -0
- chronaxis/guide/api/load_analysis_plan.md +34 -0
- chronaxis/guide/api/load_batch_plan.md +36 -0
- chronaxis/guide/api/parse_datetime_ns.md +35 -0
- chronaxis/guide/api/parse_duration.md +30 -0
- chronaxis/guide/api/resolve_preset_roles.md +37 -0
- chronaxis/guide/api/run_batch.md +38 -0
- chronaxis/guide/api/shift_times_reference.md +33 -0
- chronaxis/guide/api/time_deltas_reference.md +37 -0
- chronaxis/guide/api/validate_analysis_plan.md +38 -0
- chronaxis/guide/en/README.md +74 -0
- chronaxis/guide/en/api/AnalysisError.md +14 -0
- chronaxis/guide/en/api/AnalysisPlan.md +93 -0
- chronaxis/guide/en/api/AnalysisResult.md +398 -0
- chronaxis/guide/en/api/AnalysisRunner.md +191 -0
- chronaxis/guide/en/api/BatchJob.md +17 -0
- chronaxis/guide/en/api/BatchJobResult.md +43 -0
- chronaxis/guide/en/api/BatchPlan.md +37 -0
- chronaxis/guide/en/api/BatchReport.md +52 -0
- chronaxis/guide/en/api/BatchRunner.md +51 -0
- chronaxis/guide/en/api/OutputManifest.md +23 -0
- chronaxis/guide/en/api/PlanFragment.md +33 -0
- chronaxis/guide/en/api/PlanValidationError.md +58 -0
- chronaxis/guide/en/api/PresetSpec.md +51 -0
- chronaxis/guide/en/api/ResultClosedError.md +14 -0
- chronaxis/guide/en/api/RunMetadata.md +100 -0
- chronaxis/guide/en/api/TimeConversion.md +23 -0
- chronaxis/guide/en/api/TimeOverflowError.md +14 -0
- chronaxis/guide/en/api/build_preset.md +23 -0
- chronaxis/guide/en/api/checked_add_ns.md +21 -0
- chronaxis/guide/en/api/convert_time.md +25 -0
- chronaxis/guide/en/api/explain_analysis_plan.md +30 -0
- chronaxis/guide/en/api/index.json +185 -0
- chronaxis/guide/en/api/load_analysis_plan.md +27 -0
- chronaxis/guide/en/api/load_batch_plan.md +28 -0
- chronaxis/guide/en/api/parse_datetime_ns.md +23 -0
- chronaxis/guide/en/api/parse_duration.md +20 -0
- chronaxis/guide/en/api/resolve_preset_roles.md +23 -0
- chronaxis/guide/en/api/run_batch.md +39 -0
- chronaxis/guide/en/api/shift_times_reference.md +21 -0
- chronaxis/guide/en/api/time_deltas_reference.md +22 -0
- chronaxis/guide/en/api/validate_analysis_plan.md +29 -0
- chronaxis/guide/en/fields/analysis/calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/calculations-all-2.json +300 -0
- chronaxis/guide/en/fields/analysis/calculations-all-3.json +84 -0
- chronaxis/guide/en/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/en/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/en/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/en/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/en/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/en/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-1.json +345 -0
- chronaxis/guide/en/fields/analysis/message_calculations-all-2.json +270 -0
- chronaxis/guide/en/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/en/fields/analysis/outputs-all-1.json +332 -0
- chronaxis/guide/en/fields/analysis/outputs-all-2.json +319 -0
- chronaxis/guide/en/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/en/fields/analysis/outputs-all-4.json +236 -0
- chronaxis/guide/en/fields/analysis/outputs-all-5.json +246 -0
- chronaxis/guide/en/fields/analysis/outputs-all-6.json +214 -0
- chronaxis/guide/en/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/en/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/en/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/en/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/en/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/en/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/en/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/en/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-1.json +333 -0
- chronaxis/guide/en/fields/analysis/rules-start_end-2.json +60 -0
- chronaxis/guide/en/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-1.json +338 -0
- chronaxis/guide/en/fields/analysis/rules-window_delta-2.json +96 -0
- chronaxis/guide/en/fields/analysis/sequences-all-1.json +378 -0
- chronaxis/guide/en/fields/analysis/sequences-all-2.json +70 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-3.json +323 -0
- chronaxis/guide/en/fields/analysis/signals-variant-1-4.json +192 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-2.json +312 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-3.json +294 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-4.json +253 -0
- chronaxis/guide/en/fields/analysis/signals-variant-2-5.json +44 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/en/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/en/fields/analysis/sources-memory-1.json +332 -0
- chronaxis/guide/en/fields/analysis/sources-memory-2.json +125 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/en/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-signal_csv-3.json +315 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-2.json +307 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-3.json +312 -0
- chronaxis/guide/en/fields/analysis/sources-variant-6-4.json +113 -0
- chronaxis/guide/en/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/en/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/en/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/en/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/en/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/en/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/en/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/en/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/en/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/en/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/en/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/en/fields/definitions/signals-all-3.json +290 -0
- chronaxis/guide/en/fields/definitions/signals-all-4.json +347 -0
- chronaxis/guide/en/fields/definitions/signals-all-5.json +297 -0
- chronaxis/guide/en/fields/definitions/signals-all-6.json +259 -0
- chronaxis/guide/en/fields/definitions/signals-all-7.json +117 -0
- chronaxis/guide/en/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/en/fields/definitions/sources-all-10.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-11.json +294 -0
- chronaxis/guide/en/fields/definitions/sources-all-12.json +212 -0
- chronaxis/guide/en/fields/definitions/sources-all-13.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-15.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-16.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-18.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-19.json +213 -0
- chronaxis/guide/en/fields/definitions/sources-all-2.json +323 -0
- chronaxis/guide/en/fields/definitions/sources-all-20.json +217 -0
- chronaxis/guide/en/fields/definitions/sources-all-21.json +210 -0
- chronaxis/guide/en/fields/definitions/sources-all-22.json +214 -0
- chronaxis/guide/en/fields/definitions/sources-all-23.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-24.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-25.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-26.json +218 -0
- chronaxis/guide/en/fields/definitions/sources-all-27.json +224 -0
- chronaxis/guide/en/fields/definitions/sources-all-28.json +215 -0
- chronaxis/guide/en/fields/definitions/sources-all-29.json +205 -0
- chronaxis/guide/en/fields/definitions/sources-all-3.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-30.json +298 -0
- chronaxis/guide/en/fields/definitions/sources-all-31.json +315 -0
- chronaxis/guide/en/fields/definitions/sources-all-32.json +306 -0
- chronaxis/guide/en/fields/definitions/sources-all-33.json +209 -0
- chronaxis/guide/en/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/en/fields/definitions/sources-all-5.json +299 -0
- chronaxis/guide/en/fields/definitions/sources-all-6.json +307 -0
- chronaxis/guide/en/fields/definitions/sources-all-7.json +320 -0
- chronaxis/guide/en/fields/definitions/sources-all-8.json +303 -0
- chronaxis/guide/en/fields/definitions/sources-all-9.json +315 -0
- chronaxis/guide/en/fields/index.json +3450 -0
- chronaxis/guide/en/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/en/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/en/fields/mapping/analysis-all-10.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-11.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-12.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-13.json +314 -0
- chronaxis/guide/en/fields/mapping/analysis-all-14.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-15.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-16.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-18.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-19.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-2.json +323 -0
- chronaxis/guide/en/fields/mapping/analysis-all-20.json +221 -0
- chronaxis/guide/en/fields/mapping/analysis-all-21.json +237 -0
- chronaxis/guide/en/fields/mapping/analysis-all-22.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-23.json +222 -0
- chronaxis/guide/en/fields/mapping/analysis-all-24.json +231 -0
- chronaxis/guide/en/fields/mapping/analysis-all-25.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-27.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-28.json +230 -0
- chronaxis/guide/en/fields/mapping/analysis-all-29.json +223 -0
- chronaxis/guide/en/fields/mapping/analysis-all-3.json +318 -0
- chronaxis/guide/en/fields/mapping/analysis-all-30.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-31.json +218 -0
- chronaxis/guide/en/fields/mapping/analysis-all-32.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-33.json +233 -0
- chronaxis/guide/en/fields/mapping/analysis-all-34.json +225 -0
- chronaxis/guide/en/fields/mapping/analysis-all-35.json +228 -0
- chronaxis/guide/en/fields/mapping/analysis-all-36.json +226 -0
- chronaxis/guide/en/fields/mapping/analysis-all-37.json +244 -0
- chronaxis/guide/en/fields/mapping/analysis-all-38.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-39.json +299 -0
- chronaxis/guide/en/fields/mapping/analysis-all-4.json +297 -0
- chronaxis/guide/en/fields/mapping/analysis-all-40.json +311 -0
- chronaxis/guide/en/fields/mapping/analysis-all-41.json +310 -0
- chronaxis/guide/en/fields/mapping/analysis-all-42.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-43.json +267 -0
- chronaxis/guide/en/fields/mapping/analysis-all-44.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-45.json +279 -0
- chronaxis/guide/en/fields/mapping/analysis-all-46.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-47.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-48.json +294 -0
- chronaxis/guide/en/fields/mapping/analysis-all-49.json +253 -0
- chronaxis/guide/en/fields/mapping/analysis-all-5.json +312 -0
- chronaxis/guide/en/fields/mapping/analysis-all-50.json +346 -0
- chronaxis/guide/en/fields/mapping/analysis-all-51.json +324 -0
- chronaxis/guide/en/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/en/fields/mapping/analysis-all-53.json +317 -0
- chronaxis/guide/en/fields/mapping/analysis-all-54.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-55.json +302 -0
- chronaxis/guide/en/fields/mapping/analysis-all-56.json +319 -0
- chronaxis/guide/en/fields/mapping/analysis-all-57.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/en/fields/mapping/analysis-all-59.json +359 -0
- chronaxis/guide/en/fields/mapping/analysis-all-6.json +327 -0
- chronaxis/guide/en/fields/mapping/analysis-all-60.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-61.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-62.json +301 -0
- chronaxis/guide/en/fields/mapping/analysis-all-63.json +326 -0
- chronaxis/guide/en/fields/mapping/analysis-all-64.json +367 -0
- chronaxis/guide/en/fields/mapping/analysis-all-65.json +334 -0
- chronaxis/guide/en/fields/mapping/analysis-all-66.json +358 -0
- chronaxis/guide/en/fields/mapping/analysis-all-67.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-68.json +331 -0
- chronaxis/guide/en/fields/mapping/analysis-all-69.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-7.json +303 -0
- chronaxis/guide/en/fields/mapping/analysis-all-70.json +349 -0
- chronaxis/guide/en/fields/mapping/analysis-all-71.json +288 -0
- chronaxis/guide/en/fields/mapping/analysis-all-72.json +316 -0
- chronaxis/guide/en/fields/mapping/analysis-all-73.json +266 -0
- chronaxis/guide/en/fields/mapping/analysis-all-74.json +227 -0
- chronaxis/guide/en/fields/mapping/analysis-all-75.json +239 -0
- chronaxis/guide/en/fields/mapping/analysis-all-76.json +274 -0
- chronaxis/guide/en/fields/mapping/analysis-all-77.json +380 -0
- chronaxis/guide/en/fields/mapping/analysis-all-78.json +313 -0
- chronaxis/guide/en/fields/mapping/analysis-all-79.json +338 -0
- chronaxis/guide/en/fields/mapping/analysis-all-8.json +292 -0
- chronaxis/guide/en/fields/mapping/analysis-all-80.json +304 -0
- chronaxis/guide/en/fields/mapping/analysis-all-81.json +140 -0
- chronaxis/guide/en/fields/mapping/analysis-all-9.json +332 -0
- chronaxis/guide/en/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/en/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/en/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/en/semantics.md +70 -0
- chronaxis/guide/en/tasks.json +290 -0
- chronaxis/guide/en/workflow.md +41 -0
- chronaxis/guide/examples/analysis-imports.yaml +22 -0
- chronaxis/guide/examples/analysis.yaml +23 -0
- chronaxis/guide/examples/batch-minimal.yaml +3 -0
- chronaxis/guide/examples/conditional-energy.yaml +36 -0
- chronaxis/guide/examples/data/activity.csv +6 -0
- chronaxis/guide/examples/data/can/activity.asc +11 -0
- chronaxis/guide/examples/data/can/calculation-minimal.asc +6 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-1.asc +92 -0
- chronaxis/guide/examples/data/can/conditional-energy/part-2.asc +36 -0
- chronaxis/guide/examples/data/can/conditional-energy/signals.dbc +10 -0
- chronaxis/guide/examples/data/can/execution-comparison.asc +12 -0
- chronaxis/guide/examples/data/can/execution-report.asc +4 -0
- chronaxis/guide/examples/data/can/expression-extended.asc +11 -0
- chronaxis/guide/examples/data/can/interval-actual.asc +6 -0
- chronaxis/guide/examples/data/can/preset-charge-energy.asc +15 -0
- chronaxis/guide/examples/data/can/preset-charge-minimal.asc +11 -0
- chronaxis/guide/examples/data/can/preset-command-automatic.asc +11 -0
- chronaxis/guide/examples/data/can/preset-fault-context.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-delay.asc +7 -0
- chronaxis/guide/examples/data/can/preset-threshold-partial.asc +7 -0
- chronaxis/guide/examples/data/can/quality.asc +6 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part1.asc +4 -0
- chronaxis/guide/examples/data/can/quickstart-parts/part2.asc +3 -0
- chronaxis/guide/examples/data/can/quickstart.asc +6 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-condition_duration-minimal.asc +19 -0
- chronaxis/guide/examples/data/can/rule-debounce-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-falling_edge-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-hysteresis-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-start_end-extended.asc +35 -0
- chronaxis/guide/examples/data/can/rule-start_only-extended.asc +19 -0
- chronaxis/guide/examples/data/can/rule-window_delta-extended.asc +19 -0
- chronaxis/guide/examples/data/can/sequence-outcomes.asc +19 -0
- chronaxis/guide/examples/data/can/signal-types.asc +13 -0
- chronaxis/guide/examples/data/can/start-end.asc +30 -0
- chronaxis/guide/examples/data/can/teaching-base.asc +58 -0
- chronaxis/guide/examples/data/can/teaching.dbc +53 -0
- chronaxis/guide/examples/data/joint-current.csv +5 -0
- chronaxis/guide/examples/data/joint.asc +5 -0
- chronaxis/guide/examples/data/joint.dbc +7 -0
- chronaxis/guide/examples/data/message-clean.asc +6 -0
- chronaxis/guide/examples/data/message-direction.asc +7 -0
- chronaxis/guide/examples/data/message-direction.dbc +7 -0
- chronaxis/guide/examples/data/power.blf +0 -0
- chronaxis/guide/examples/data/power.dbc +6 -0
- chronaxis/guide/examples/data/quality.csv +5 -0
- chronaxis/guide/examples/data/raw-can-example.csv +5 -0
- chronaxis/guide/examples/data/signal-types.csv +5 -0
- chronaxis/guide/examples/data/signals.csv +6 -0
- chronaxis/guide/examples/data/timing.asc +6 -0
- chronaxis/guide/examples/data/timing.dbc +11 -0
- chronaxis/guide/examples/export-can-minimal.yaml +24 -0
- chronaxis/guide/examples/input-csv-minimal.yaml +23 -0
- chronaxis/guide/examples/preset-charge-energy.yaml +41 -0
- chronaxis/guide/examples/preset-charge-minimal.yaml +31 -0
- chronaxis/guide/examples/preset-fault-context.yaml +27 -0
- chronaxis/guide/examples/quality.yaml +19 -0
- chronaxis/guide/examples/sequence-outcomes.yaml +39 -0
- chronaxis/guide/examples/shared/definitions.yaml +14 -0
- chronaxis/guide/examples/signal-enum-minimal.yaml +19 -0
- chronaxis/guide/examples/signal-number-conversion.yaml +24 -0
- chronaxis/guide/examples/window-merged.yaml +28 -0
- chronaxis/guide/fields/analysis/calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/calculations-all-2.json +299 -0
- chronaxis/guide/fields/analysis/calculations-all-3.json +70 -0
- chronaxis/guide/fields/analysis/config_version-all-1.json +24 -0
- chronaxis/guide/fields/analysis/dataset-all-1.json +344 -0
- chronaxis/guide/fields/analysis/derived-all-1.json +147 -0
- chronaxis/guide/fields/analysis/diagnostics-all-1.json +69 -0
- chronaxis/guide/fields/analysis/execution-all-1.json +167 -0
- chronaxis/guide/fields/analysis/imports-all-1.json +39 -0
- chronaxis/guide/fields/analysis/intervals-all-1.json +173 -0
- chronaxis/guide/fields/analysis/message_calculations-all-1.json +360 -0
- chronaxis/guide/fields/analysis/message_calculations-all-2.json +255 -0
- chronaxis/guide/fields/analysis/metadata-all-1.json +24 -0
- chronaxis/guide/fields/analysis/outputs-all-1.json +349 -0
- chronaxis/guide/fields/analysis/outputs-all-2.json +302 -0
- chronaxis/guide/fields/analysis/outputs-all-3.json +321 -0
- chronaxis/guide/fields/analysis/outputs-all-4.json +253 -0
- chronaxis/guide/fields/analysis/outputs-all-5.json +244 -0
- chronaxis/guide/fields/analysis/outputs-all-6.json +199 -0
- chronaxis/guide/fields/analysis/overrides-all-1.json +104 -0
- chronaxis/guide/fields/analysis/presets-charge_session-1.json +398 -0
- chronaxis/guide/fields/analysis/presets-charge_session-2.json +114 -0
- chronaxis/guide/fields/analysis/presets-command_response-1.json +376 -0
- chronaxis/guide/fields/analysis/presets-fault_context-1.json +285 -0
- chronaxis/guide/fields/analysis/presets-threshold_excursion-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-1.json +344 -0
- chronaxis/guide/fields/analysis/rules-condition_duration-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-debounce-1.json +335 -0
- chronaxis/guide/fields/analysis/rules-falling_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-hysteresis-2.json +27 -0
- chronaxis/guide/fields/analysis/rules-rising_edge-1.json +317 -0
- chronaxis/guide/fields/analysis/rules-start_end-1.json +349 -0
- chronaxis/guide/fields/analysis/rules-start_end-2.json +44 -0
- chronaxis/guide/fields/analysis/rules-start_only-1.json +334 -0
- chronaxis/guide/fields/analysis/rules-window_delta-1.json +356 -0
- chronaxis/guide/fields/analysis/rules-window_delta-2.json +78 -0
- chronaxis/guide/fields/analysis/sequences-all-1.json +394 -0
- chronaxis/guide/fields/analysis/sequences-all-2.json +54 -0
- chronaxis/guide/fields/analysis/signals-variant-1-1.json +349 -0
- chronaxis/guide/fields/analysis/signals-variant-1-2.json +297 -0
- chronaxis/guide/fields/analysis/signals-variant-1-3.json +340 -0
- chronaxis/guide/fields/analysis/signals-variant-1-4.json +175 -0
- chronaxis/guide/fields/analysis/signals-variant-2-1.json +327 -0
- chronaxis/guide/fields/analysis/signals-variant-2-2.json +335 -0
- chronaxis/guide/fields/analysis/signals-variant-2-3.json +289 -0
- chronaxis/guide/fields/analysis/signals-variant-2-4.json +270 -0
- chronaxis/guide/fields/analysis/sources-can_asc-1.json +318 -0
- chronaxis/guide/fields/analysis/sources-can_asc-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_asc-3.json +311 -0
- chronaxis/guide/fields/analysis/sources-can_asc-4.json +69 -0
- chronaxis/guide/fields/analysis/sources-can_blf-1.json +317 -0
- chronaxis/guide/fields/analysis/sources-can_blf-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-can_blf-3.json +317 -0
- chronaxis/guide/fields/analysis/sources-memory-1.json +347 -0
- chronaxis/guide/fields/analysis/sources-memory-2.json +110 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-1.json +330 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-10.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-11.json +225 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-12.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-13.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-14.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-15.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-16.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-17.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-18.json +239 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-19.json +233 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-2.json +310 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-20.json +242 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-21.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-22.json +228 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-23.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-24.json +223 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-25.json +290 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-26.json +131 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-3.json +297 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-4.json +226 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-5.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-6.json +227 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-7.json +230 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-8.json +238 -0
- chronaxis/guide/fields/analysis/sources-raw_can_csv-9.json +239 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-1.json +331 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-signal_csv-3.json +295 -0
- chronaxis/guide/fields/analysis/sources-variant-6-1.json +319 -0
- chronaxis/guide/fields/analysis/sources-variant-6-2.json +327 -0
- chronaxis/guide/fields/analysis/sources-variant-6-3.json +314 -0
- chronaxis/guide/fields/analysis/sources-variant-6-4.json +91 -0
- chronaxis/guide/fields/analysis/windows-all-1.json +361 -0
- chronaxis/guide/fields/analysis/windows-all-2.json +187 -0
- chronaxis/guide/fields/batch/backend-all-1.json +26 -0
- chronaxis/guide/fields/batch/batch_version-all-1.json +22 -0
- chronaxis/guide/fields/batch/fail_fast-all-1.json +22 -0
- chronaxis/guide/fields/batch/inputs-all-1.json +161 -0
- chronaxis/guide/fields/batch/jobs-all-1.json +58 -0
- chronaxis/guide/fields/batch/process_count-all-1.json +23 -0
- chronaxis/guide/fields/batch/source-all-1.json +22 -0
- chronaxis/guide/fields/batch/template-all-1.json +22 -0
- chronaxis/guide/fields/definitions/derived-all-1.json +121 -0
- chronaxis/guide/fields/definitions/signals-all-1.json +336 -0
- chronaxis/guide/fields/definitions/signals-all-2.json +307 -0
- chronaxis/guide/fields/definitions/signals-all-3.json +305 -0
- chronaxis/guide/fields/definitions/signals-all-4.json +352 -0
- chronaxis/guide/fields/definitions/signals-all-5.json +311 -0
- chronaxis/guide/fields/definitions/signals-all-6.json +254 -0
- chronaxis/guide/fields/definitions/signals-all-7.json +88 -0
- chronaxis/guide/fields/definitions/sources-all-1.json +332 -0
- chronaxis/guide/fields/definitions/sources-all-10.json +307 -0
- chronaxis/guide/fields/definitions/sources-all-11.json +280 -0
- chronaxis/guide/fields/definitions/sources-all-12.json +209 -0
- chronaxis/guide/fields/definitions/sources-all-13.json +219 -0
- chronaxis/guide/fields/definitions/sources-all-14.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-15.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-16.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-17.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-18.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-19.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-2.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-20.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-21.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-22.json +232 -0
- chronaxis/guide/fields/definitions/sources-all-23.json +213 -0
- chronaxis/guide/fields/definitions/sources-all-24.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-25.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-26.json +228 -0
- chronaxis/guide/fields/definitions/sources-all-27.json +212 -0
- chronaxis/guide/fields/definitions/sources-all-28.json +217 -0
- chronaxis/guide/fields/definitions/sources-all-29.json +227 -0
- chronaxis/guide/fields/definitions/sources-all-3.json +306 -0
- chronaxis/guide/fields/definitions/sources-all-30.json +333 -0
- chronaxis/guide/fields/definitions/sources-all-31.json +302 -0
- chronaxis/guide/fields/definitions/sources-all-32.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-33.json +89 -0
- chronaxis/guide/fields/definitions/sources-all-4.json +336 -0
- chronaxis/guide/fields/definitions/sources-all-5.json +313 -0
- chronaxis/guide/fields/definitions/sources-all-6.json +292 -0
- chronaxis/guide/fields/definitions/sources-all-7.json +319 -0
- chronaxis/guide/fields/definitions/sources-all-8.json +315 -0
- chronaxis/guide/fields/definitions/sources-all-9.json +318 -0
- chronaxis/guide/fields/index.json +3432 -0
- chronaxis/guide/fields/mapping/aliases-all-1.json +91 -0
- chronaxis/guide/fields/mapping/analysis-all-1.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-10.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-11.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-12.json +329 -0
- chronaxis/guide/fields/mapping/analysis-all-13.json +294 -0
- chronaxis/guide/fields/mapping/analysis-all-14.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-15.json +280 -0
- chronaxis/guide/fields/mapping/analysis-all-16.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-17.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-18.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-19.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-2.json +342 -0
- chronaxis/guide/fields/mapping/analysis-all-20.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-21.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-22.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-23.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-24.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-25.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-26.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-27.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-28.json +237 -0
- chronaxis/guide/fields/mapping/analysis-all-29.json +233 -0
- chronaxis/guide/fields/mapping/analysis-all-3.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-30.json +244 -0
- chronaxis/guide/fields/mapping/analysis-all-31.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-32.json +226 -0
- chronaxis/guide/fields/mapping/analysis-all-33.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-34.json +227 -0
- chronaxis/guide/fields/mapping/analysis-all-35.json +230 -0
- chronaxis/guide/fields/mapping/analysis-all-36.json +221 -0
- chronaxis/guide/fields/mapping/analysis-all-37.json +291 -0
- chronaxis/guide/fields/mapping/analysis-all-38.json +315 -0
- chronaxis/guide/fields/mapping/analysis-all-39.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-4.json +312 -0
- chronaxis/guide/fields/mapping/analysis-all-40.json +307 -0
- chronaxis/guide/fields/mapping/analysis-all-41.json +292 -0
- chronaxis/guide/fields/mapping/analysis-all-42.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-43.json +296 -0
- chronaxis/guide/fields/mapping/analysis-all-44.json +322 -0
- chronaxis/guide/fields/mapping/analysis-all-45.json +298 -0
- chronaxis/guide/fields/mapping/analysis-all-46.json +347 -0
- chronaxis/guide/fields/mapping/analysis-all-47.json +302 -0
- chronaxis/guide/fields/mapping/analysis-all-48.json +263 -0
- chronaxis/guide/fields/mapping/analysis-all-49.json +301 -0
- chronaxis/guide/fields/mapping/analysis-all-5.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-50.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-51.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-52.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-53.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-54.json +339 -0
- chronaxis/guide/fields/mapping/analysis-all-55.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-56.json +336 -0
- chronaxis/guide/fields/mapping/analysis-all-57.json +335 -0
- chronaxis/guide/fields/mapping/analysis-all-58.json +333 -0
- chronaxis/guide/fields/mapping/analysis-all-59.json +325 -0
- chronaxis/guide/fields/mapping/analysis-all-6.json +323 -0
- chronaxis/guide/fields/mapping/analysis-all-60.json +334 -0
- chronaxis/guide/fields/mapping/analysis-all-61.json +311 -0
- chronaxis/guide/fields/mapping/analysis-all-62.json +289 -0
- chronaxis/guide/fields/mapping/analysis-all-63.json +383 -0
- chronaxis/guide/fields/mapping/analysis-all-64.json +357 -0
- chronaxis/guide/fields/mapping/analysis-all-65.json +375 -0
- chronaxis/guide/fields/mapping/analysis-all-66.json +351 -0
- chronaxis/guide/fields/mapping/analysis-all-67.json +346 -0
- chronaxis/guide/fields/mapping/analysis-all-68.json +317 -0
- chronaxis/guide/fields/mapping/analysis-all-69.json +313 -0
- chronaxis/guide/fields/mapping/analysis-all-7.json +306 -0
- chronaxis/guide/fields/mapping/analysis-all-70.json +326 -0
- chronaxis/guide/fields/mapping/analysis-all-71.json +316 -0
- chronaxis/guide/fields/mapping/analysis-all-72.json +264 -0
- chronaxis/guide/fields/mapping/analysis-all-73.json +228 -0
- chronaxis/guide/fields/mapping/analysis-all-74.json +241 -0
- chronaxis/guide/fields/mapping/analysis-all-75.json +273 -0
- chronaxis/guide/fields/mapping/analysis-all-76.json +382 -0
- chronaxis/guide/fields/mapping/analysis-all-77.json +328 -0
- chronaxis/guide/fields/mapping/analysis-all-78.json +338 -0
- chronaxis/guide/fields/mapping/analysis-all-79.json +304 -0
- chronaxis/guide/fields/mapping/analysis-all-8.json +309 -0
- chronaxis/guide/fields/mapping/analysis-all-80.json +140 -0
- chronaxis/guide/fields/mapping/analysis-all-9.json +329 -0
- chronaxis/guide/fields/mapping/io_policy-all-1.json +19 -0
- chronaxis/guide/fields/mapping/mapping_version-all-1.json +19 -0
- chronaxis/guide/fields/mapping/path_base-all-1.json +19 -0
- chronaxis/guide/fields/mapping/sections-all-1.json +402 -0
- chronaxis/guide/fields/mapping/sections-all-2.json +232 -0
- chronaxis/guide/lookup.py +90 -0
- chronaxis/guide/manifest.json +614 -0
- chronaxis/guide/run_analysis.py +34 -0
- chronaxis/guide/schemas/analysis.schema.json +8451 -0
- chronaxis/guide/schemas/batch-v1.schema.json +172 -0
- chronaxis/guide/schemas/definitions.schema.json +29 -0
- chronaxis/guide/schemas/legacy-import-v1.schema.json +143 -0
- chronaxis/guide/semantics.md +62 -0
- chronaxis/guide/tasks.json +290 -0
- chronaxis/guide/workflow.md +38 -0
- chronaxis/legacy/__init__.py +46 -0
- chronaxis/legacy/batch_read.py +412 -0
- chronaxis/legacy/batch_validation.py +134 -0
- chronaxis/legacy/batch_wire.py +264 -0
- chronaxis/legacy/batch_worker.py +417 -0
- chronaxis/legacy/binding.py +154 -0
- chronaxis/legacy/dbc_cycles.py +47 -0
- chronaxis/legacy/decode_policy.py +28 -0
- chronaxis/legacy/disjunction.py +79 -0
- chronaxis/legacy/export_worker.py +147 -0
- chronaxis/legacy/export_write.py +378 -0
- chronaxis/legacy/message_store.py +562 -0
- chronaxis/legacy/process_read.py +526 -0
- chronaxis/legacy/raw_store.py +341 -0
- chronaxis/legacy/records.py +709 -0
- chronaxis/legacy/required_records.py +122 -0
- chronaxis/legacy/sum.py +403 -0
- chronaxis/legacy/sum_numpy.py +43 -0
- chronaxis/legacy/updates.py +277 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/can_processor.py +138 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/file_processor.py +218 -0
- chronaxis/legacy/vendor/sclicer_functions_v1/utils.py +447 -0
- chronaxis/legacy/worker.py +352 -0
- chronaxis/migration/__init__.py +11 -0
- chronaxis/migration/api.py +270 -0
- chronaxis/migration/ini.py +110 -0
- chronaxis/migration/legacy_sum.py +304 -0
- chronaxis/migration/models.py +83 -0
- chronaxis/migration/publication.py +230 -0
- chronaxis/migration/sclicer.py +241 -0
- chronaxis/migration/slope.py +78 -0
- chronaxis/migration/start_end.py +48 -0
- chronaxis/planning/__init__.py +19 -0
- chronaxis/planning/channels.py +30 -0
- chronaxis/planning/checks.py +447 -0
- chronaxis/planning/config_groups.py +215 -0
- chronaxis/planning/dbc_defaults.py +88 -0
- chronaxis/planning/export_options.py +247 -0
- chronaxis/planning/input_defaults.py +62 -0
- chronaxis/planning/input_paths.py +124 -0
- chronaxis/planning/input_requirements.py +250 -0
- chronaxis/planning/inputs.py +306 -0
- chronaxis/planning/intervals.py +242 -0
- chronaxis/planning/legacy_execution.py +38 -0
- chronaxis/planning/message_calculations.py +171 -0
- chronaxis/planning/models.py +369 -0
- chronaxis/planning/nodes.py +355 -0
- chronaxis/planning/plan.py +294 -0
- chronaxis/planning/preset_models.py +211 -0
- chronaxis/planning/record_execution.py +76 -0
- chronaxis/planning/reports.py +523 -0
- chronaxis/planning/sequences.py +91 -0
- chronaxis/planning/signal_groups.py +61 -0
- chronaxis/planning/signal_validity.py +46 -0
- chronaxis/planning/text_inputs.py +110 -0
- chronaxis/presets.py +270 -0
- chronaxis/results/__init__.py +34 -0
- chronaxis/results/analysis_outcome.py +67 -0
- chronaxis/results/artifact_exports.py +212 -0
- chronaxis/results/binding_metadata.py +54 -0
- chronaxis/results/budget.py +138 -0
- chronaxis/results/can_metadata.py +247 -0
- chronaxis/results/codec.py +246 -0
- chronaxis/results/errors.py +25 -0
- chronaxis/results/export_files.py +216 -0
- chronaxis/results/frame_exports.py +299 -0
- chronaxis/results/frame_patch.py +186 -0
- chronaxis/results/frame_rebuild.py +458 -0
- chronaxis/results/frame_sort.py +223 -0
- chronaxis/results/input_diagnostics.py +51 -0
- chronaxis/results/manifest.py +343 -0
- chronaxis/results/merge_runs.py +207 -0
- chronaxis/results/owned_directory.py +32 -0
- chronaxis/results/raw_exports.py +689 -0
- chronaxis/results/readable.py +355 -0
- chronaxis/results/readable_format.py +94 -0
- chronaxis/results/result.py +734 -0
- chronaxis/results/rows.py +57 -0
- chronaxis/results/signal_exports.py +209 -0
- chronaxis/results/signal_grid.py +219 -0
- chronaxis/results/spool.py +421 -0
- chronaxis/results/summary.py +350 -0
- chronaxis/results/text_can_metadata.py +64 -0
- chronaxis/results/threshold_metadata.py +105 -0
- chronaxis/runner.py +121 -0
- chronaxis/sources/__init__.py +23 -0
- chronaxis/sources/asc.py +412 -0
- chronaxis/sources/blf.py +101 -0
- chronaxis/sources/can_spec.py +179 -0
- chronaxis/sources/can_updates.py +160 -0
- chronaxis/sources/csv_spec.py +133 -0
- chronaxis/sources/descriptions.py +65 -0
- chronaxis/sources/memory.py +299 -0
- chronaxis/sources/models.py +497 -0
- chronaxis/sources/packing.py +170 -0
- chronaxis/sources/protocol.py +221 -0
- chronaxis/sources/raw_can.py +62 -0
- chronaxis/sources/raw_csv.py +470 -0
- chronaxis/sources/raw_csv_layout.py +310 -0
- chronaxis/sources/signal_csv.py +608 -0
- chronaxis/sources/text_can_decode.py +421 -0
- chronaxis/sources/text_can_ref.py +48 -0
- chronaxis/sources/text_can_spec.py +61 -0
- chronaxis/timebase/__init__.py +19 -0
- chronaxis/timebase/conversion.py +364 -0
- chronaxis/timebase/numpy_ops.py +104 -0
- chronaxis/user_guide.py +81 -0
- chronaxis-0.1.0.dev0.dist-info/METADATA +172 -0
- chronaxis-0.1.0.dev0.dist-info/RECORD +917 -0
- chronaxis-0.1.0.dev0.dist-info/WHEEL +5 -0
- chronaxis-0.1.0.dev0.dist-info/entry_points.txt +2 -0
- chronaxis-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
- 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
|