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,417 @@
|
|
|
1
|
+
"""在隔离子进程按有限批次调用原CAN函数,默认仍解码全部报文。
|
|
2
|
+
|
|
3
|
+
INIT仍仅加载原DBC和公开字段元数据;每次pull_batch明确许可原帧条数与字节上限。
|
|
4
|
+
默认每条执行原next/parse一次。显式decode_frame_ids限制允许解码的ID,只有其中
|
|
5
|
+
实际请求了字段的ID才调用parse;纯常量触发帧不调用parse。全部原帧仍
|
|
6
|
+
顺序读取并保留原时间、字段校验;所选帧仍一次调用原parse,参数不变。按需模式在
|
|
7
|
+
原parse返回后立即只取INIT所需字段,缺失键保持缺失;v3 READY确认这一投影策略。
|
|
8
|
+
原帧保留集合与解码集合独立,导出原始帧可保留全部帧而不解码无需求ID。
|
|
9
|
+
auto模式在原生消息ID不匹配时先跳过;仅source需要读其时间。selected/none目标
|
|
10
|
+
只保存必要身份与所需值;非原生消息沿完整原帧检查并计入新包的回退数量。
|
|
11
|
+
字节不足容纳下一条最大记录时先结束当前批,不提前读取再丢弃。真正StopIteration
|
|
12
|
+
可与最后批数据一起报告,子实际退出及资源回收仍由父确认。没有后台预读或pickle。
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from collections.abc import Mapping
|
|
16
|
+
from collections import Counter
|
|
17
|
+
from importlib import metadata
|
|
18
|
+
import json
|
|
19
|
+
from math import isfinite
|
|
20
|
+
import os
|
|
21
|
+
import platform
|
|
22
|
+
|
|
23
|
+
from . import worker
|
|
24
|
+
from .records import (PROFILE_ID, MAX_WIRE_BYTES, LegacyDecodedFrame, decoded_to_dict,
|
|
25
|
+
_decoded_values_size)
|
|
26
|
+
from .batch_wire import (HEADER, DEMAND_HEADER, LENGTH, MIN_BATCH_BYTES, MAX_BATCH_BYTES,
|
|
27
|
+
MAX_BATCH_ROWS, FILE_HEADER, FILE_MAGIC, encode_batch)
|
|
28
|
+
from .batch_validation import validate_discarded, _item_base_size
|
|
29
|
+
from .required_records import RequiredCANFrame, RequiredDecodedFrame, required_to_dict
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# [home] READY明确区分按字段投影与旧v2的整条消息values,不能把两种检查范围混同。
|
|
33
|
+
REQUESTED_VALUES_POLICY = 'requested_fields-v1'
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _parse_selected(processor, db, frame, message, duplicate_ids):
|
|
37
|
+
"""普通ID复用原解码入口,同ID多定义时直接调用选中的同库解码实现。
|
|
38
|
+
|
|
39
|
+
参数: processor旧入口、db同次数据库、frame原帧、message已选定义、duplicate_ids重复ID集合。
|
|
40
|
+
返回: 原物理值dict;DBC解码失败为空dict。异常: 非DBC结构错误由外层传播。
|
|
41
|
+
"""
|
|
42
|
+
if message is None or frame.arbitration_id not in duplicate_ids:
|
|
43
|
+
return processor.parse_frame(frame, db)
|
|
44
|
+
# 不改冻结旧函数;其仅按整数ID查表会选错定义,此处使用相同库参数和解码方法。
|
|
45
|
+
from cantools.database.errors import DecodeError
|
|
46
|
+
try:
|
|
47
|
+
return message.decode(frame.data, decode_choices=False, allow_truncated=True)
|
|
48
|
+
except DecodeError:
|
|
49
|
+
return {}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _requested_fields(fields, decode_ids):
|
|
53
|
+
"""按固定报文ID整理所需信号名,不读取输入或遍历解码结果。
|
|
54
|
+
|
|
55
|
+
参数: fields为INIT已校验的字段tuple;decode_ids为固定解码ID集合。
|
|
56
|
+
返回: ID到去重信号名字典的有限映射,名字次序保持请求顺序。
|
|
57
|
+
异常: ValueError表示字段所在报文不在解码范围;原分配/取消错误直接传播。
|
|
58
|
+
父策略费用为每个字段另付1024B,覆盖此表及构建临时槽;名称借自原请求。
|
|
59
|
+
"""
|
|
60
|
+
projected = field = None
|
|
61
|
+
try:
|
|
62
|
+
projected = {}
|
|
63
|
+
for field in fields:
|
|
64
|
+
if field.frame_id not in decode_ids:
|
|
65
|
+
raise ValueError('所需字段的报文ID必须属于固定解码集合')
|
|
66
|
+
projected.setdefault(field.frame_id, {})[field.signal] = None
|
|
67
|
+
return projected
|
|
68
|
+
finally:
|
|
69
|
+
# 构建失败的traceback不能在父关闭并归还策略费用后继续借用投影表。
|
|
70
|
+
projected = field = fields = decode_ids = None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _project_values(values, names):
|
|
74
|
+
"""只读取本报文所需的原值,让后续完整模型只检查这些值。
|
|
75
|
+
|
|
76
|
+
参数: values为原parse返回值;names为本ID需要的名字映射或空tuple。
|
|
77
|
+
返回: 新dict,保留实际存在的所需键;KeyError代表缺失,不补None或零。
|
|
78
|
+
异常: 有字段需求时非Mapping报TypeError;所需键访问和取消错误原样传播。
|
|
79
|
+
无字段的常量触发报文直接返回空dict,不遍历或校验没有用途的原values。
|
|
80
|
+
"""
|
|
81
|
+
projected = name = value = None
|
|
82
|
+
try:
|
|
83
|
+
if not names:
|
|
84
|
+
return {}
|
|
85
|
+
if not isinstance(values, Mapping):
|
|
86
|
+
raise TypeError('解码记录需要LegacyRawFrame与数值Mapping')
|
|
87
|
+
projected = {}
|
|
88
|
+
for name in names:
|
|
89
|
+
try:
|
|
90
|
+
value = values[name]
|
|
91
|
+
except KeyError:
|
|
92
|
+
continue
|
|
93
|
+
projected[name] = value
|
|
94
|
+
return projected
|
|
95
|
+
finally:
|
|
96
|
+
# 后续模型负责所需值的类型、诊断浮点和ITEM上限;本层不保留原结果引用。
|
|
97
|
+
values = names = projected = name = value = None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _encode_fresh_packet(packet):
|
|
101
|
+
"""编码本worker刚完成完整检查的记录,省去同一JSON树的再次遍历。
|
|
102
|
+
|
|
103
|
+
参数: packet只能是紧邻LegacyDecodedFrame成功构造后由原decoded_to_dict生成的
|
|
104
|
+
私有dict;两者之间没有用户回调或对象交付。不是任意外部JSON的编码入口。
|
|
105
|
+
返回: 与公开encode_packet相同的UTF-8 bytes,不带换行。
|
|
106
|
+
异常: 原JSON/UTF-8编码错误、实际超过65536字节的ValueError或原取消异常。
|
|
107
|
+
完整模型已检查全部帧字段、含ITEM外壳的长度及收到的Mapping两遍,再复制冻结数值;
|
|
108
|
+
原转换只生成固定字段与非有限数值标签。沿用原批许可费用,不保留跨记录状态。
|
|
109
|
+
"""
|
|
110
|
+
payload = None
|
|
111
|
+
try:
|
|
112
|
+
# 保持原JSON参数和实际字节复核;复用的是前面的检查,不放宽最终传输上限。
|
|
113
|
+
payload = json.dumps(packet, ensure_ascii=False, allow_nan=False, sort_keys=True,
|
|
114
|
+
separators=(',', ':')).encode('utf-8')
|
|
115
|
+
if len(payload) > MAX_WIRE_BYTES:
|
|
116
|
+
raise ValueError('wire包超过65536字节')
|
|
117
|
+
return payload
|
|
118
|
+
finally:
|
|
119
|
+
# 调用方可保留取消的traceback,本层不再借用记录树或编码缓冲。
|
|
120
|
+
packet = payload = None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _limits(packet, frames_returned):
|
|
124
|
+
"""验证本次批许可及解码后投影,非法许可不能推进旧读取器。
|
|
125
|
+
|
|
126
|
+
参数: packet为已检查JSON;frames_returned为已发送的原帧数。
|
|
127
|
+
返回: (原帧上限,字节上限,保留ID集合或None)。异常: TypeError/ValueError。
|
|
128
|
+
"""
|
|
129
|
+
worker._exact(packet, ('op', 'request_id', 'rows', 'bytes', 'frame_ids'))
|
|
130
|
+
if type(packet['request_id']) is not int or packet['request_id'] != frames_returned:
|
|
131
|
+
raise ValueError('批次许可必须按原帧序号连续')
|
|
132
|
+
rows, size, ids = packet['rows'], packet['bytes'], packet['frame_ids']
|
|
133
|
+
if (type(rows) is not int or not 1 <= rows <= MAX_BATCH_ROWS
|
|
134
|
+
or type(size) is not int or not MIN_BATCH_BYTES <= size <= MAX_BATCH_BYTES):
|
|
135
|
+
raise ValueError('批次许可条数或字节上限非法')
|
|
136
|
+
if ids is not None and (type(ids) is not list or len(ids) > 4096
|
|
137
|
+
or any(type(value) is not int or not 0 <= value <= 0x1fffffff for value in ids)
|
|
138
|
+
or len(set(ids)) != len(ids)):
|
|
139
|
+
raise ValueError('解码后保留ID必须是无重复29位整数列表或None')
|
|
140
|
+
return rows, size, None if ids is None else frozenset(ids)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def batch_worker_main(connection, *, decode_frame_ids=None, input_check='full', time_scope='source',
|
|
144
|
+
input_paths=None, decode_policy='legacy', cycle_fields=(), metadata_fields=()):
|
|
145
|
+
"""处理一次独立批次会话,沿用原INIT、元数据和有限远端错误格式。
|
|
146
|
+
|
|
147
|
+
参数: connection为spawn交付的独立连接;decode_frame_ids=None沿用全解码,
|
|
148
|
+
原生tuple明确本次固定解码ID,允许空集合;input_check默认full保持旧行为,
|
|
149
|
+
auto必须固定解码ID;time_scope为source/selected/none,full必须source。
|
|
150
|
+
input_paths为原序路径文本tuple或None;decode_policy为legacy/strict/partial。
|
|
151
|
+
cycle_fields显式请求同次DBC周期,metadata_fields仅取候选;不改变request.fields或原parse调用集合。
|
|
152
|
+
新政策只核有字段需求的帧长度,非数据帧不解码;解码空值不继承前值。
|
|
153
|
+
返回: 正常STOP或真实EOF时None。
|
|
154
|
+
异常: 失败发送有限事实并以SystemExit(1)退出;清理副错不替代原错误。
|
|
155
|
+
副作用: 子进程内一次load_file,每个声明文件一次iter_frames;每原帧顺序next,默认全部parse,
|
|
156
|
+
显式按需只对固定集合内有字段需求的帧调用parse,并立即投影所需字段。未解码帧不产生或检查
|
|
157
|
+
解码值,仍检查原帧;原始帧保留范围不扩大解码范围。
|
|
158
|
+
只关闭自己连接和原生成器;不声称原reader已有可靠公开close实现。
|
|
159
|
+
"""
|
|
160
|
+
iterator = failure = request_id = None
|
|
161
|
+
phase, frames_returned, pulls_received, parse_calls = 'init', 0, 0, 0
|
|
162
|
+
timestamps = encoded = record = frame = msg = values = payload = None
|
|
163
|
+
decode_ids = projected_fields = ready = None
|
|
164
|
+
try:
|
|
165
|
+
request = worker._request(worker._receive(connection))
|
|
166
|
+
from .decode_policy import validate_decode_policy, check_decode_length
|
|
167
|
+
validate_decode_policy(decode_policy)
|
|
168
|
+
paths = (str(request.input_path),) if input_paths is None else input_paths
|
|
169
|
+
if (type(paths) is not tuple or not 1 <= len(paths) <= 4096
|
|
170
|
+
or any(type(p) is not str or not p or len(p) > 4096 for p in paths)
|
|
171
|
+
or paths[0] != str(request.input_path)):
|
|
172
|
+
raise ValueError('连续文件声明须与INIT首路径一致')
|
|
173
|
+
input_index = 0
|
|
174
|
+
envelope_size = FILE_HEADER.size if len(paths) > 1 else 0
|
|
175
|
+
if (input_check not in ('auto', 'full') or time_scope not in ('none', 'selected', 'source')
|
|
176
|
+
or input_check == 'full' and time_scope != 'source'
|
|
177
|
+
or input_check == 'auto' and decode_frame_ids is None):
|
|
178
|
+
raise ValueError('输入检查与时间范围必须匹配固定按需解码策略')
|
|
179
|
+
if decode_frame_ids is not None:
|
|
180
|
+
# 策略来自启动实参,不能由后续PULL更改;无策略时保持原INIT和执行先后。
|
|
181
|
+
if (type(decode_frame_ids) is not tuple or len(decode_frame_ids) > 4096
|
|
182
|
+
or any(type(value) is not int or not 0 <= value <= 0x1fffffff
|
|
183
|
+
for value in decode_frame_ids)
|
|
184
|
+
or len(set(decode_frame_ids)) != len(decode_frame_ids)):
|
|
185
|
+
raise ValueError('按需解码ID必须是无重复29位整数tuple')
|
|
186
|
+
decode_ids = frozenset(decode_frame_ids)
|
|
187
|
+
projected_fields = _requested_fields(request.fields, decode_ids)
|
|
188
|
+
phase = 'vendor'
|
|
189
|
+
files, processor, vendor = worker._load_vendor()
|
|
190
|
+
# 仅取旧模块已加载的真实类,不提前导入CAN库;测试替身没有此类时沿用原字段路径。
|
|
191
|
+
native_message_type = getattr(getattr(files, 'can', None), 'Message', None)
|
|
192
|
+
phase = 'dbc'
|
|
193
|
+
db = processor.cantools.database.load_file(str(request.dbc_path))
|
|
194
|
+
phase = 'metadata'
|
|
195
|
+
from .binding import FrameBindingResolver
|
|
196
|
+
resolver = FrameBindingResolver(db, request.fields)
|
|
197
|
+
duplicate_ids = {frame_id for frame_id, count in Counter(message.frame_id for message in db.messages).items()
|
|
198
|
+
if count > 1}
|
|
199
|
+
phase = 'metadata'
|
|
200
|
+
if cycle_fields or metadata_fields:
|
|
201
|
+
from .dbc_cycles import require_cycle_fields
|
|
202
|
+
require_cycle_fields(cycle_fields)
|
|
203
|
+
require_cycle_fields(metadata_fields)
|
|
204
|
+
all_fields = tuple(dict.fromkeys((*request.fields,*cycle_fields,*metadata_fields)))
|
|
205
|
+
fields = worker._field_metadata(db,all_fields,cycle_fields=cycle_fields)
|
|
206
|
+
else:
|
|
207
|
+
fields = worker._field_metadata(db, request.fields)
|
|
208
|
+
# 长度表只在新政策且字段确有需求时建立,旧调用不增加DBC查询。
|
|
209
|
+
if (input_paths is not None or decode_policy != 'legacy') and os.path.isdir(paths[0]):
|
|
210
|
+
raise ValueError('新原始报文入口需要文件,不能隐式扫描目录')
|
|
211
|
+
iterator = files.iter_frames(paths[0])
|
|
212
|
+
versions = {'python': platform.python_version(), 'python-can': metadata.version('python-can'),
|
|
213
|
+
'cantools': metadata.version('cantools'), 'natsort': metadata.version('natsort')}
|
|
214
|
+
ready = {'op': 'ready', 'version': 1, 'profile': PROFILE_ID,
|
|
215
|
+
'worker_pid': os.getpid(), 'fields': fields, 'dependency_versions': versions,
|
|
216
|
+
'vendor_sha256': vendor}
|
|
217
|
+
if decode_ids is not None:
|
|
218
|
+
ready.update(version=3, decode_scope='requested', decode_frame_ids=list(decode_frame_ids),
|
|
219
|
+
decoded_values_policy=REQUESTED_VALUES_POLICY)
|
|
220
|
+
if input_check == 'auto':
|
|
221
|
+
ready.update(version=4, input_check=input_check, time_scope=time_scope)
|
|
222
|
+
if input_paths is not None or decode_policy != 'legacy' or cycle_fields or metadata_fields:
|
|
223
|
+
ready.update(base_version=ready['version'], version=5, input_paths=list(paths),
|
|
224
|
+
decode_policy=decode_policy)
|
|
225
|
+
if cycle_fields:
|
|
226
|
+
ready['cycle_fields'] = [worker.field_to_dict(f) for f in cycle_fields]
|
|
227
|
+
if metadata_fields:
|
|
228
|
+
ready['metadata_fields'] = [worker.field_to_dict(f) for f in metadata_fields]
|
|
229
|
+
worker._send(connection, ready)
|
|
230
|
+
ready = None
|
|
231
|
+
while True:
|
|
232
|
+
phase, request_id = 'control', None
|
|
233
|
+
packet = worker._receive(connection)
|
|
234
|
+
if packet.get('op') == 'stop':
|
|
235
|
+
worker._exact(packet, ('op',))
|
|
236
|
+
break
|
|
237
|
+
if packet.get('op') == 'status':
|
|
238
|
+
worker._exact(packet, ('op',))
|
|
239
|
+
worker._send(connection, {'op': 'status', 'pulls_received': pulls_received,
|
|
240
|
+
'frames_returned': frames_returned, 'parse_calls': parse_calls})
|
|
241
|
+
continue
|
|
242
|
+
if packet.get('op') != 'pull_batch':
|
|
243
|
+
raise ValueError('未知批次控制操作')
|
|
244
|
+
rows, byte_limit, selected = _limits(packet, frames_returned)
|
|
245
|
+
byte_limit -= envelope_size
|
|
246
|
+
if byte_limit < MIN_BATCH_BYTES:
|
|
247
|
+
raise ValueError('连续批次字节许可不足')
|
|
248
|
+
if (input_check == 'auto' and time_scope == 'source'
|
|
249
|
+
and byte_limit < MIN_BATCH_BYTES+DEMAND_HEADER.size-HEADER.size):
|
|
250
|
+
raise ValueError('全来源按需批次字节许可不足以容纳一条最大记录')
|
|
251
|
+
request_id = frames_returned
|
|
252
|
+
pulls_received += 1
|
|
253
|
+
timestamps, encoded = [], []
|
|
254
|
+
raw_count, full_checks = 0, 0
|
|
255
|
+
encoded_size, eof = (DEMAND_HEADER.size if input_check == 'auto' else HEADER.size), False
|
|
256
|
+
while raw_count < rows:
|
|
257
|
+
# 预留最坏单条空间后才授权next;未知是否匹配时不能先读再丢掉。
|
|
258
|
+
if encoded_size + (8 if time_scope == 'source' else 0) + LENGTH.size + MAX_WIRE_BYTES > byte_limit:
|
|
259
|
+
break
|
|
260
|
+
phase = 'next'
|
|
261
|
+
if iterator is None:
|
|
262
|
+
input_index += 1
|
|
263
|
+
if os.path.isdir(paths[input_index]):
|
|
264
|
+
raise ValueError('连续原始报文需要文件,不能隐式扫描目录')
|
|
265
|
+
iterator = files.iter_frames(paths[input_index])
|
|
266
|
+
try:
|
|
267
|
+
msg = next(iterator)
|
|
268
|
+
except StopIteration:
|
|
269
|
+
if input_index == len(paths)-1:
|
|
270
|
+
# 最后输入保持原收尾顺序:发EOF后在finally关闭。
|
|
271
|
+
eof = True
|
|
272
|
+
break
|
|
273
|
+
iterator.close()
|
|
274
|
+
iterator = None
|
|
275
|
+
if raw_count:
|
|
276
|
+
# 一批只来自一个文件;下次许可才开始下个文件。
|
|
277
|
+
break
|
|
278
|
+
continue
|
|
279
|
+
sequence = frames_returned + raw_count
|
|
280
|
+
raw_count += 1
|
|
281
|
+
if input_check == 'auto':
|
|
282
|
+
# 先读取ID;精确原生消息的不相关帧在此跳过,不能碰时间或其他属性。
|
|
283
|
+
frame_id = msg.arbitration_id
|
|
284
|
+
retained = selected is None or frame_id in selected
|
|
285
|
+
needed = frame_id in decode_ids
|
|
286
|
+
native = native_message_type is not None and type(msg) is native_message_type
|
|
287
|
+
if not native:
|
|
288
|
+
# 自定义消息可能有属性副作用,沿完整旧帧检查;实际回退数写入新包。
|
|
289
|
+
frame = worker._frame(msg)
|
|
290
|
+
full_checks += 1
|
|
291
|
+
if time_scope == 'source':
|
|
292
|
+
timestamp = msg.timestamp if native else frame.timestamp
|
|
293
|
+
if type(timestamp) is not float or not isfinite(timestamp):
|
|
294
|
+
raise ValueError('原报文timestamp需要有限float秒')
|
|
295
|
+
timestamps.append(timestamp)
|
|
296
|
+
encoded_size += 8
|
|
297
|
+
if not retained and not needed:
|
|
298
|
+
if not native:
|
|
299
|
+
# _frame只核类型/字符数,旧完整检查还核UTF-8与ITEM总字节。
|
|
300
|
+
# 复用同次快照,不为此再次读取自定义消息的属性或调用解码。
|
|
301
|
+
_item_base_size(frame, sequence)
|
|
302
|
+
msg = frame = None
|
|
303
|
+
continue
|
|
304
|
+
phase = 'parse'
|
|
305
|
+
if (projected_fields.get(frame_id) and (decode_policy == 'legacy'
|
|
306
|
+
or not (msg.is_remote_frame or msg.is_error_frame))):
|
|
307
|
+
active = resolver.fields_for(msg)
|
|
308
|
+
message = resolver.message_for(msg, active)
|
|
309
|
+
if message is None:
|
|
310
|
+
values = {}
|
|
311
|
+
else:
|
|
312
|
+
check_decode_length(msg, message.length, decode_policy)
|
|
313
|
+
parse_calls += 1
|
|
314
|
+
values = _parse_selected(processor, db, msg, message, duplicate_ids)
|
|
315
|
+
else:
|
|
316
|
+
values = {}
|
|
317
|
+
phase = 'batch'
|
|
318
|
+
values = _project_values(values, projected_fields.get(frame_id, ()))
|
|
319
|
+
if not native:
|
|
320
|
+
# 非原生完整回退按旧原帧外壳计算所需值余量;不能用较小的
|
|
321
|
+
# Required外壳放过原ITEM已超限的输入,也不能重复构造_frame。
|
|
322
|
+
available = MAX_WIRE_BYTES-_item_base_size(frame, sequence)+2
|
|
323
|
+
_decoded_values_size(values, available)
|
|
324
|
+
if time_scope == 'source':
|
|
325
|
+
# source仍需完整原记录承载现有时序/导出消费者;只处理真正所需ID。
|
|
326
|
+
record = LegacyDecodedFrame(sequence, worker._frame(msg) if native else frame, values)
|
|
327
|
+
packet_tree = decoded_to_dict(record)
|
|
328
|
+
else:
|
|
329
|
+
# none不读取目标时间;selected仅读取目标时间。没有载荷/DLC副本。
|
|
330
|
+
frame = RequiredCANFrame(None if time_scope == 'none' else msg.timestamp,
|
|
331
|
+
frame_id, msg.channel, msg.is_extended_id, msg.is_fd,
|
|
332
|
+
msg.is_remote_frame, msg.is_error_frame)
|
|
333
|
+
record = RequiredDecodedFrame(sequence, frame, values)
|
|
334
|
+
packet_tree = required_to_dict(record)
|
|
335
|
+
if retained:
|
|
336
|
+
payload = _encode_fresh_packet(packet_tree)
|
|
337
|
+
encoded.append(payload)
|
|
338
|
+
encoded_size += LENGTH.size + len(payload)
|
|
339
|
+
if time_scope == 'selected':
|
|
340
|
+
timestamps.append(record.frame.timestamp)
|
|
341
|
+
msg = values = record = frame = payload = packet_tree = None
|
|
342
|
+
continue
|
|
343
|
+
phase = 'parse'
|
|
344
|
+
if ((decode_ids is None or projected_fields.get(msg.arbitration_id))
|
|
345
|
+
and (decode_policy == 'legacy' or not (msg.is_remote_frame or msg.is_error_frame))):
|
|
346
|
+
active = resolver.fields_for(msg)
|
|
347
|
+
message = resolver.message_for(msg, active)
|
|
348
|
+
if message is not None:
|
|
349
|
+
check_decode_length(msg, message.length, decode_policy)
|
|
350
|
+
if message is not None or decode_ids is None:
|
|
351
|
+
parse_calls += 1
|
|
352
|
+
values = _parse_selected(processor, db, msg, message, duplicate_ids)
|
|
353
|
+
else:
|
|
354
|
+
values = {}
|
|
355
|
+
else:
|
|
356
|
+
values = {}
|
|
357
|
+
phase = 'batch'
|
|
358
|
+
timestamp = msg.timestamp
|
|
359
|
+
if type(timestamp) is not float or not isfinite(timestamp):
|
|
360
|
+
raise ValueError('原报文timestamp需要有限float秒')
|
|
361
|
+
timestamps.append(timestamp)
|
|
362
|
+
encoded_size += 8
|
|
363
|
+
retained = selected is None or msg.arbitration_id in selected
|
|
364
|
+
if projected_fields is not None and (retained or msg.arbitration_id in decode_ids):
|
|
365
|
+
# 先保原时间/帧字段错误,再投影解码值;不能让Mapping访问抢先失败。
|
|
366
|
+
# 所需ID即使本批不保留,仍完整检查需要的值;原始导出额外帧只含空值。
|
|
367
|
+
frame = worker._frame(msg)
|
|
368
|
+
values = _project_values(values, projected_fields.get(msg.arbitration_id, ()))
|
|
369
|
+
record = LegacyDecodedFrame(sequence, frame, values)
|
|
370
|
+
if retained:
|
|
371
|
+
# all仍逐项检查完整原values;requested使用刚核过的投影记录。
|
|
372
|
+
if projected_fields is None:
|
|
373
|
+
record = LegacyDecodedFrame(sequence, worker._frame(msg), values)
|
|
374
|
+
payload = _encode_fresh_packet(decoded_to_dict(record))
|
|
375
|
+
encoded.append(payload)
|
|
376
|
+
encoded_size += LENGTH.size + len(payload)
|
|
377
|
+
elif record is None:
|
|
378
|
+
# 默认核全部原值;按需跳过解码时只存在空values,原帧检查仍执行。
|
|
379
|
+
validate_discarded(msg, values, sequence, native_message_type=native_message_type)
|
|
380
|
+
msg = values = record = frame = payload = None
|
|
381
|
+
phase = 'send_batch'
|
|
382
|
+
payload = encode_batch(frames_returned, timestamps, encoded, eof, byte_limit,
|
|
383
|
+
raw_count=raw_count, time_scope=time_scope, input_check=input_check,
|
|
384
|
+
full_check_count=full_checks)
|
|
385
|
+
if envelope_size:
|
|
386
|
+
payload = FILE_HEADER.pack(FILE_MAGIC,input_index) + payload
|
|
387
|
+
connection.send_bytes(payload)
|
|
388
|
+
frames_returned += raw_count
|
|
389
|
+
timestamps = encoded = payload = None
|
|
390
|
+
if eof:
|
|
391
|
+
break
|
|
392
|
+
except BaseException as exc:
|
|
393
|
+
failure = exc
|
|
394
|
+
worker._report_error(connection, exc, phase, request_id)
|
|
395
|
+
finally:
|
|
396
|
+
# 父等待实际退出才能释放资源责任;不窥原generator局部变量来关未知句柄。
|
|
397
|
+
timestamps = encoded = record = frame = msg = values = payload = None
|
|
398
|
+
packet_tree = None
|
|
399
|
+
decode_ids = decode_frame_ids = projected_fields = ready = None
|
|
400
|
+
if iterator is not None:
|
|
401
|
+
try:
|
|
402
|
+
iterator.close()
|
|
403
|
+
except BaseException as cleanup:
|
|
404
|
+
if failure is None:
|
|
405
|
+
failure = cleanup
|
|
406
|
+
worker._report_error(connection, cleanup, 'generator_close', request_id)
|
|
407
|
+
else:
|
|
408
|
+
failure.add_note('旧生成器关闭附加失败: ' + type(cleanup).__name__)
|
|
409
|
+
try:
|
|
410
|
+
connection.close()
|
|
411
|
+
except BaseException as cleanup:
|
|
412
|
+
if failure is None:
|
|
413
|
+
failure = cleanup
|
|
414
|
+
else:
|
|
415
|
+
failure.add_note('旧CAN子连接关闭附加失败: ' + type(cleanup).__name__)
|
|
416
|
+
if failure is not None:
|
|
417
|
+
raise SystemExit(1)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""用报文 ID、所需信号和实际帧类型选择 DBC 定义。
|
|
2
|
+
|
|
3
|
+
本模块只使用调用方已加载的数据库,不打开 DBC 或日志。候选表仅覆盖当前
|
|
4
|
+
请求字段;每次运行保存有限的已见身份,避免省略帧型时混合两种同 ID 报文。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def field_matches(field, frame):
|
|
9
|
+
"""检查声明是否接受当前实际帧。参数: field定位、frame原帧。返回: bool。异常: 属性错误。
|
|
10
|
+
"""
|
|
11
|
+
# 只把未填写的类型当作开放条件;False是明确的标准帧或经典CAN约束。
|
|
12
|
+
return (field.channel == frame.channel and field.frame_id == frame.arbitration_id
|
|
13
|
+
and (field.is_extended is None or field.is_extended == frame.is_extended_id)
|
|
14
|
+
and (field.is_fd is None or field.is_fd == frame.is_fd))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def dbc_candidates(db, frame_id, signal_names=(), is_extended=None, is_fd=None):
|
|
18
|
+
"""筛出定义候选,保留同 ID 不同帧型,不采用数据库的最后一项覆盖。
|
|
19
|
+
|
|
20
|
+
参数: db为已加载数据库;frame_id整数;signal_names所需名称;两个帧型可省略。
|
|
21
|
+
返回: 候选消息tuple。异常: ValueError为报文或信号不存在;不读取日志。
|
|
22
|
+
"""
|
|
23
|
+
# 同数值ID可以同时有标准帧和扩展帧定义,不能使用只保留其中一项的ID字典。
|
|
24
|
+
messages = tuple(message for message in db.messages if message.frame_id == frame_id)
|
|
25
|
+
if not messages:
|
|
26
|
+
raise ValueError('DBC中没有报文ID: ' + str(frame_id))
|
|
27
|
+
# 先区分缺失信号,避免把错误名称误报为缺少帧型。
|
|
28
|
+
named = tuple(message for message in messages
|
|
29
|
+
if all(sum(signal.name == name for signal in message.signals) == 1
|
|
30
|
+
for name in signal_names))
|
|
31
|
+
if not named:
|
|
32
|
+
raise ValueError('DBC报文中没有唯一的所需信号: ' + ', '.join(signal_names))
|
|
33
|
+
# 保留用户批准的单向兼容:DBC标为FD、实际选择经典CAN;反方向不放宽。
|
|
34
|
+
selected = tuple(message for message in named
|
|
35
|
+
if (is_extended is None or message.is_extended_frame == is_extended)
|
|
36
|
+
and (is_fd is None or message.is_fd == is_fd
|
|
37
|
+
or message.is_fd is True and is_fd is False))
|
|
38
|
+
if not selected:
|
|
39
|
+
raise ValueError('DBC报文与指定标准/扩展帧或CAN/FD不匹配: ' + str(frame_id))
|
|
40
|
+
# 同一帧型仍有两份定义时,之后读取实际帧也无法消除歧义,须现在拒绝。
|
|
41
|
+
kinds = [(message.is_extended_frame, message.is_fd) for message in selected]
|
|
42
|
+
if len(set(kinds)) != len(kinds):
|
|
43
|
+
raise ValueError('DBC报文在相同ID、信号和帧型下仍不唯一,请修正DBC')
|
|
44
|
+
return selected
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def select_message(candidates, frame):
|
|
48
|
+
"""按实际类型选唯一定义,允许已批准的 DBC FD 与实际经典 CAN 差异。
|
|
49
|
+
|
|
50
|
+
参数: candidates消息tuple、frame实际帧。返回: 唯一消息或None表示不匹配。
|
|
51
|
+
异常: ValueError为实际类型仍不能消除多定义歧义。
|
|
52
|
+
"""
|
|
53
|
+
# 按文件中真实帧型筛选,不用载荷长度或ID大小推测类型。
|
|
54
|
+
typed = tuple(message for message in candidates
|
|
55
|
+
if message.is_extended_frame == frame.is_extended_id
|
|
56
|
+
and (message.is_fd == frame.is_fd or message.is_fd and not frame.is_fd))
|
|
57
|
+
# 同型定义优先,只有没有同型定义时才使用已批准的单向兼容。
|
|
58
|
+
exact = tuple(message for message in typed if message.is_fd == frame.is_fd)
|
|
59
|
+
selected = exact or typed
|
|
60
|
+
if len(selected) > 1:
|
|
61
|
+
raise ValueError('DBC中同ID和帧型仍有多个定义,请修正DBC或信号绑定')
|
|
62
|
+
return selected[0] if selected else None
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class FrameBindingResolver:
|
|
66
|
+
"""持有本次所需定义及已见身份;不保存报文载荷或无关信号。
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self, db, fields):
|
|
70
|
+
"""建立有限候选表。参数: db已有DBC、fields字段tuple。返回: None。异常: 定位错误。
|
|
71
|
+
"""
|
|
72
|
+
# 候选与缓存只属于本次读取;按ID缩小逐帧工作范围,不保存原帧内容。
|
|
73
|
+
self.by_id = {}
|
|
74
|
+
self.database = db
|
|
75
|
+
self.candidates = {}
|
|
76
|
+
self.seen = {}
|
|
77
|
+
self.resolved = {}
|
|
78
|
+
for field in dict.fromkeys(fields):
|
|
79
|
+
self.candidates[field] = dbc_candidates(db, field.frame_id, (field.signal,),
|
|
80
|
+
field.is_extended, field.is_fd)
|
|
81
|
+
self.by_id.setdefault(field.frame_id, []).append(field)
|
|
82
|
+
|
|
83
|
+
def fields_for(self, frame):
|
|
84
|
+
"""取得真实匹配字段,并拒绝后续帧改变同一省略型绑定的身份。
|
|
85
|
+
|
|
86
|
+
参数: frame实际数据帧。返回: 匹配字段tuple。异常: ValueError为运行中出现歧义。
|
|
87
|
+
"""
|
|
88
|
+
# 远程帧和错误帧没有普通信号更新;成功匹配的身份可在后续同型帧复用。
|
|
89
|
+
if frame.is_remote_frame or frame.is_error_frame:
|
|
90
|
+
return ()
|
|
91
|
+
key = (frame.channel, frame.arbitration_id, frame.is_extended_id, frame.is_fd)
|
|
92
|
+
if key in self.resolved:
|
|
93
|
+
return self.resolved[key][0]
|
|
94
|
+
# 对每个实际包含目标信号的候选检查身份;无关类型不清掉原信号的有效值。
|
|
95
|
+
result = []
|
|
96
|
+
for field in self.by_id.get(frame.arbitration_id, ()):
|
|
97
|
+
if not field_matches(field, frame) or select_message(self.candidates[field], frame) is None:
|
|
98
|
+
continue
|
|
99
|
+
identity = (frame.is_extended_id, frame.is_fd)
|
|
100
|
+
previous = self.seen.get(field)
|
|
101
|
+
if previous is not None and previous != identity:
|
|
102
|
+
missing = 'is_extended' if previous[0] != identity[0] else 'is_fd'
|
|
103
|
+
raise ValueError('同一绑定匹配多种实际帧,请补充 ' + missing + ': ' + field.signal)
|
|
104
|
+
self.seen[field] = identity
|
|
105
|
+
result.append(field)
|
|
106
|
+
# 只缓存匹配到已声明字段的帧,避免无关ID使缓存随日志规模增长。
|
|
107
|
+
fields = tuple(result)
|
|
108
|
+
if fields:
|
|
109
|
+
self.resolved[key] = (fields, self.message_for(frame, fields))
|
|
110
|
+
return fields
|
|
111
|
+
|
|
112
|
+
def message_for(self, frame, fields):
|
|
113
|
+
"""核同一帧的字段来自同一解码定义。参数: frame原帧、fields匹配字段。返回: 消息或None。异常: 歧义。
|
|
114
|
+
"""
|
|
115
|
+
# 同一帧的多个目标信号必须共用同一DBC消息对象,不能拼接不同定义的结果。
|
|
116
|
+
key = (frame.channel, frame.arbitration_id, frame.is_extended_id, frame.is_fd)
|
|
117
|
+
if key in self.resolved:
|
|
118
|
+
return self.resolved[key][1]
|
|
119
|
+
messages = []
|
|
120
|
+
for field in fields:
|
|
121
|
+
message = select_message(self.candidates[field], frame)
|
|
122
|
+
if message is not None and all(message is not other for other in messages):
|
|
123
|
+
messages.append(message)
|
|
124
|
+
if len(messages) > 1:
|
|
125
|
+
raise ValueError('同一帧的信号指向多个DBC定义,无法唯一解码')
|
|
126
|
+
return messages[0] if messages else None
|
|
127
|
+
|
|
128
|
+
def missing_flags(self, channel, frame_id, extended, fd):
|
|
129
|
+
"""为缺少帧型列的原始CSV寻找唯一声明,绝不按小ID或短载荷猜经典帧。
|
|
130
|
+
|
|
131
|
+
参数: channel/frame_id为已解析身份;extended/fd为实际列值或None。
|
|
132
|
+
返回: 两个已确定bool。异常: ValueError提示缺失的源列或绑定帧型。
|
|
133
|
+
"""
|
|
134
|
+
# 已绑定字段先提供候选;DBC为FD时不能据此猜实际CSV一定是FD。
|
|
135
|
+
choices = set()
|
|
136
|
+
fields = tuple(field for field in self.by_id.get(frame_id, ()) if field.channel == channel)
|
|
137
|
+
for field in fields:
|
|
138
|
+
for message in self.candidates[field]:
|
|
139
|
+
for candidate_fd in ((field.is_fd,) if field.is_fd is not None
|
|
140
|
+
else (False, True) if message.is_fd else (False,)):
|
|
141
|
+
choices.add((message.is_extended_frame, candidate_fd))
|
|
142
|
+
if not fields:
|
|
143
|
+
# 导出未绑定的原帧仍需完整身份,不能替无关帧伪造标准/经典标记。
|
|
144
|
+
for message in self.database.messages:
|
|
145
|
+
if message.frame_id == frame_id:
|
|
146
|
+
for candidate_fd in ((False, True) if message.is_fd else (False,)):
|
|
147
|
+
choices.add((message.is_extended_frame, candidate_fd))
|
|
148
|
+
# 有列值时以实际列值收窄;只有唯一剩余组合才能补齐缺列。
|
|
149
|
+
choices = {pair for pair in choices if (extended is None or pair[0] == extended)
|
|
150
|
+
and (fd is None or pair[1] == fd)}
|
|
151
|
+
if len(choices) != 1:
|
|
152
|
+
missing = 'is_extended_id / is_extended' if extended is None and len({p[0] for p in choices}) != 1 else 'is_fd'
|
|
153
|
+
raise ValueError('CSV缺少可唯一确定的帧型,请补充列映射或绑定参数 ' + missing)
|
|
154
|
+
return next(iter(choices))
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""核验明确请求的DBC报文周期,不读文件、不解码报文或生成逐条诊断。
|
|
2
|
+
|
|
3
|
+
周期取同次已加载DBC的message.cycle_time(毫秒),精确换算一次供运行状态复用。
|
|
4
|
+
缺失或非法周期直接拒绝,不用快速发送周期、信号周期或实际差作替代。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from decimal import Decimal
|
|
8
|
+
from math import isfinite
|
|
9
|
+
|
|
10
|
+
from .records import LegacyCANField
|
|
11
|
+
from ..timebase.conversion import require_int64_ns
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def require_cycle_fields(fields, channel=None):
|
|
15
|
+
"""核周期定位声明,不加载DBC。
|
|
16
|
+
|
|
17
|
+
参数: fields为无重复LegacyCANField tuple;channel为可选固定通道。
|
|
18
|
+
返回: 原tuple。异常: TypeError/ValueError为类型、数量、重复或通道不符。
|
|
19
|
+
"""
|
|
20
|
+
if (type(fields) is not tuple or len(fields)>4096
|
|
21
|
+
or any(type(field) is not LegacyCANField for field in fields)):
|
|
22
|
+
raise TypeError('DBC周期字段需要有限LegacyCANField tuple')
|
|
23
|
+
if len(set(fields)) != len(fields) or channel is not None and any(f.channel != channel for f in fields):
|
|
24
|
+
raise ValueError('DBC周期字段不能重复且必须属于声明通道')
|
|
25
|
+
return fields
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def cycle_time_ns(value):
|
|
29
|
+
"""将DBC报文毫秒周期转为正整数纳秒,拒绝有损舍入。
|
|
30
|
+
|
|
31
|
+
参数: value为message.cycle_time,允许原生int或有限float毫秒。
|
|
32
|
+
返回: 正int64纳秒。异常: TypeError/ValueError/TimeOverflowError为缺失、类型、
|
|
33
|
+
非正、非有限、不能精确到纳秒或越界;不为非法值选择默认周期。
|
|
34
|
+
"""
|
|
35
|
+
if value is None:
|
|
36
|
+
raise ValueError('所选DBC报文缺少cycle_time周期,请填写period或valid_for;DBC间隔消费者需改选固定间隔')
|
|
37
|
+
if type(value) not in (int,float):
|
|
38
|
+
raise TypeError('DBC报文周期需要数值毫秒,不能为bool或文本')
|
|
39
|
+
if type(value) is float and not isfinite(value) or value <= 0:
|
|
40
|
+
raise ValueError('DBC报文周期必须为有限正数')
|
|
41
|
+
if type(value) is int:
|
|
42
|
+
return require_int64_ns(value*1_000_000,'dbc.cycle_ns')
|
|
43
|
+
# 用DBC公开十进制值转换,不引入二进制浮点乘法误差或静默截断。
|
|
44
|
+
ns=Decimal(str(value))*1_000_000
|
|
45
|
+
if ns != ns.to_integral_value():
|
|
46
|
+
raise ValueError('DBC报文周期不能精确表示为整数纳秒')
|
|
47
|
+
return require_int64_ns(int(ns),'dbc.cycle_ns')
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""新原始报文入口的长度政策;只检查实际需要解码的数据帧。
|
|
2
|
+
|
|
3
|
+
不改旧解码函数,也不再次解码。旧函数返回空值时,下游把所需字段置为无效;
|
|
4
|
+
旧接口没有暴露失败原因,本层不猜测原因。legacy保留原来的调用行为。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def validate_decode_policy(value):
|
|
9
|
+
"""核验长度政策。参数: value为政策名。返回: 原字符串。异常: ValueError。
|
|
10
|
+
"""
|
|
11
|
+
if type(value) is not str or value not in ('legacy', 'strict', 'partial'):
|
|
12
|
+
raise ValueError('decode_policy需要legacy、strict或partial')
|
|
13
|
+
return value
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def check_decode_length(frame, expected, policy):
|
|
17
|
+
"""解码前检查所需帧长度,不复制载荷或检查无关报文。
|
|
18
|
+
|
|
19
|
+
参数: frame为当前原帧;expected为DBC长度;policy已经过静态核验。
|
|
20
|
+
返回: None;partial仅允许载荷短于DBC,不能掩盖DLC与实际字节不一致。
|
|
21
|
+
异常: ValueError表示结构或所选长度政策不符;属性访问错误原样传播。
|
|
22
|
+
"""
|
|
23
|
+
if policy == 'legacy':
|
|
24
|
+
return
|
|
25
|
+
size = len(frame.data)
|
|
26
|
+
if (type(frame.dlc) is not int or not 0 <= frame.dlc <= 64 or frame.dlc != size
|
|
27
|
+
or (size != expected if policy == 'strict' else size > expected)):
|
|
28
|
+
raise ValueError('已选DBC报文载荷长度不一致')
|