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,421 @@
|
|
|
1
|
+
"""按需解码新ASC/CSV原帧,并接到既有数值归一化核心。
|
|
2
|
+
|
|
3
|
+
CANTextDecodeRead消费显式CANTextSpec与本次需要的SignalDefinition,逐个交付
|
|
4
|
+
DecodedCANRecord;未知ID、未选中和非数据帧仍保原记录,仅所需帧调用cantools。
|
|
5
|
+
DBC沿用decode_choices=False/allow_truncated=True参数,但新入口先严格核已选帧长度;
|
|
6
|
+
已定义报文解码失败直接定位,不冒充未知ID。pack_text_records输出既有SignalSeries。
|
|
7
|
+
完整读取核对全部原帧时间;按需ASC仅核所需通道/ID的连续顺序,并同次统计来源范围。
|
|
8
|
+
文件不重读;DBC加载和临时对象先付预算。
|
|
9
|
+
解析文件逐个关闭,失败/取消保原错误及必要恢复owner,不改旧reader或vendor。
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from decimal import Decimal
|
|
14
|
+
from hashlib import file_digest
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from ..core.binding import SignalDefinition
|
|
18
|
+
from ..core.validation import require_identifier
|
|
19
|
+
from ..execution.history import _metadata_bytes
|
|
20
|
+
from ..legacy.records import field_to_dict
|
|
21
|
+
from ..legacy.worker import _field_metadata
|
|
22
|
+
from ..results.budget import ResourceBudget, _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
23
|
+
from ..results.errors import ResultClosedError
|
|
24
|
+
from .asc import ASCSpec, ASCRead
|
|
25
|
+
from .blf import BLFSpec, BLFRead
|
|
26
|
+
from .raw_csv import CANCSVRead
|
|
27
|
+
from .raw_can import RawCANRecord, CANTextError
|
|
28
|
+
from .can_spec import can_field_from_key
|
|
29
|
+
from .models import freeze_metadata
|
|
30
|
+
from .packing import pack_decoded
|
|
31
|
+
from .text_can_ref import CANTextSourceRef
|
|
32
|
+
from .text_can_spec import CANTextSpec
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class DecodedCANRecord:
|
|
37
|
+
"""保留一条原帧及本次所需原信号值;非decoded记录的values必须为空。"""
|
|
38
|
+
|
|
39
|
+
source: str # 当前来源名称。
|
|
40
|
+
input_index: int # 原输入列表位置。
|
|
41
|
+
sequence: int # 全部文件连续的原帧序号,不仅是参与计算的序号。
|
|
42
|
+
raw: RawCANRecord # 原文件/行/精确时间和原帧字段。
|
|
43
|
+
values: tuple[tuple[str, int | float | bool | None], ...] # 规范CAN字段键到DBC物理值。
|
|
44
|
+
status: str # decoded/unknown/unselected/non_data;不把错误记成unknown。
|
|
45
|
+
frame_values: tuple[tuple[str,int | float | bool | None],...] = () # 显式重建所需原物理字段。
|
|
46
|
+
frame_layout: tuple[tuple[str,int],...] = () # 当次复用选择器的原始码值。
|
|
47
|
+
|
|
48
|
+
def __post_init__(self):
|
|
49
|
+
"""核记录冻结结构。参数: 无。返回: None。异常: 来源、位置、状态或值结构非法。
|
|
50
|
+
"""
|
|
51
|
+
# 该模型不开放任意对象值,也不在外部构造时接受重复字段覆盖。
|
|
52
|
+
require_identifier(self.source,'decoded_can.source')
|
|
53
|
+
if (type(self.raw) is not RawCANRecord or type(self.input_index) is not int or self.input_index < 0
|
|
54
|
+
or type(self.sequence) is not int or self.sequence < 0 or type(self.values) is not tuple
|
|
55
|
+
or self.status not in ('decoded','unknown','unselected','non_data')):
|
|
56
|
+
raise ValueError('解码CAN记录结构或状态非法')
|
|
57
|
+
keys = set()
|
|
58
|
+
for pair in self.values:
|
|
59
|
+
if type(pair) is not tuple or len(pair) != 2 or type(pair[0]) is not str or type(pair[1]) not in (int,float,bool,type(None)):
|
|
60
|
+
raise TypeError('解码值需要规范字段键及原生数值/None')
|
|
61
|
+
can_field_from_key(pair[0])
|
|
62
|
+
if pair[0] in keys:
|
|
63
|
+
raise ValueError('解码CAN字段重复')
|
|
64
|
+
keys.add(pair[0])
|
|
65
|
+
if self.status != 'decoded' and self.values:
|
|
66
|
+
raise ValueError('未解码原帧不能携带信号值')
|
|
67
|
+
for pairs,kinds in ((self.frame_values,(int,float,bool,type(None))),(self.frame_layout,(int,))):
|
|
68
|
+
if type(pairs) is not tuple or len(pairs)>4096 or any(type(p) is not tuple or len(p)!=2 or type(p[0]) is not str
|
|
69
|
+
or not p[0] or type(p[1]) not in kinds for p in pairs) or len({p[0] for p in pairs})!=len(pairs):
|
|
70
|
+
raise ValueError('重建物理值或布局结构非法')
|
|
71
|
+
if self.status!='decoded' and (self.frame_values or self.frame_layout):
|
|
72
|
+
raise ValueError('未解码原帧不能伪造重建值')
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class CANTextDecodeRead:
|
|
76
|
+
"""拥有单次DBC和逐文件解析器;EOF后保有限元数据到显式close。"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, spec, budget, signals, *, check_cancel=None, database_context=None, classify_unselected=True, cycle_fields=(), metadata_fields=(), integrity=True, trace=True, retain_source_time=True, selected_ids=None, time_frame_ids=None):
|
|
79
|
+
"""只核声明并预约固定费用。参数: spec来源、budget账本、signals所需定义tuple、check_cancel取消回调;classify_unselected保旧逐帧分类,消息消费者无需区分无关ID是否在DBC中;cycle_fields只请求初始化周期,metadata_fields只请求候选,两者不加入解码投影。
|
|
80
|
+
|
|
81
|
+
time_frame_ids仅在无需完整顺序/原帧导出时传入:选中通道/ID之间必须有序,
|
|
82
|
+
其他帧仍用于同次来源最早/最晚时间统计,不交付给计算或作为单调性前点。
|
|
83
|
+
selected_ids仅供不需要全来源观测或原帧导出的纯消息计算使用:原始CSV先按ID跳过
|
|
84
|
+
无关行;None保留全部行。count保原始行计数,retained_count只数实际交付的记录。
|
|
85
|
+
|
|
86
|
+
返回: 未开始读取的owner。异常: 声明/预算错误;持续清理失败附text_can_cleanup_owner。
|
|
87
|
+
"""
|
|
88
|
+
# 构造不访问DBC/输入;只接受显式同来源、同通道且唯一的别名定义。
|
|
89
|
+
if (type(spec) is not CANTextSpec or not isinstance(budget,ResourceBudget)
|
|
90
|
+
or type(signals) is not tuple or len(signals) > 4096
|
|
91
|
+
or any(type(item) is not SignalDefinition or item.source != spec.name for item in signals)
|
|
92
|
+
or check_cancel is not None and not callable(check_cancel)):
|
|
93
|
+
raise TypeError('文本CAN读取需要静态声明、预算及所需信号定义')
|
|
94
|
+
if type(classify_unselected) is not bool:
|
|
95
|
+
raise TypeError('classify_unselected需要bool')
|
|
96
|
+
if len({item.name for item in signals}) != len(signals):
|
|
97
|
+
raise ValueError('文本CAN别名不能重复')
|
|
98
|
+
from ..legacy.dbc_cycles import require_cycle_fields
|
|
99
|
+
require_cycle_fields(cycle_fields,spec.channel)
|
|
100
|
+
require_cycle_fields(metadata_fields,spec.channel)
|
|
101
|
+
self._metadata_fields = metadata_fields
|
|
102
|
+
self._selected_ids = selected_ids
|
|
103
|
+
if time_frame_ids is not None and (type(time_frame_ids) is not tuple or len(time_frame_ids)>4096
|
|
104
|
+
or any(type(value) is not int or not 0 <= value <= 0x1fffffff for value in time_frame_ids)):
|
|
105
|
+
raise ValueError('参与时间检查的CAN ID需要有限合法整数tuple')
|
|
106
|
+
if time_frame_ids is not None and spec.input_check == 'full':
|
|
107
|
+
raise ValueError('完整输入检查不能限制时间顺序检查范围')
|
|
108
|
+
self._time_frame_ids = None if time_frame_ids is None else frozenset(time_frame_ids)
|
|
109
|
+
self._last_selected_time = None
|
|
110
|
+
parsed = tuple((item,can_field_from_key(item.field)) for item in signals)
|
|
111
|
+
if any(field.channel != spec.channel for _,field in parsed):
|
|
112
|
+
raise ValueError('文本CAN字段通道与来源声明不一致')
|
|
113
|
+
# 所有资源槽先安装,任何后续预算/读取错误均可由同一个owner关闭。
|
|
114
|
+
self.spec,self._budget,self.signals,self._fields = spec,budget,signals,parsed
|
|
115
|
+
self._cycle_fields = cycle_fields
|
|
116
|
+
if type(integrity) is not bool: raise TypeError("integrity需要bool")
|
|
117
|
+
self._integrity=integrity
|
|
118
|
+
self._trace=trace
|
|
119
|
+
self._retain_source_time=retain_source_time
|
|
120
|
+
self._check_cancel = check_cancel
|
|
121
|
+
self._classify_unselected = classify_unselected
|
|
122
|
+
self._binding_resolver = None
|
|
123
|
+
self._database_context=database_context
|
|
124
|
+
self._extra_fields=() if database_context is None else database_context.extra_fields
|
|
125
|
+
self._frame_values=self._frame_layout=()
|
|
126
|
+
self._held_cost = self._fixed_cost = self._dbc_cost = self._metadata_cost = 0
|
|
127
|
+
self._db = self._raw = self._metadata = None
|
|
128
|
+
self._input_index = 0
|
|
129
|
+
self._completed_count = 0
|
|
130
|
+
self.count = self.decode_calls = self.retained_count = 0
|
|
131
|
+
self.first_ns = self.last_ns = None
|
|
132
|
+
self._closed = self._exhausted = self._failed = self._closing = False
|
|
133
|
+
try:
|
|
134
|
+
# 固定费用包含所需字段、路径和DBC元数据;不保存随原帧数增长的列表。
|
|
135
|
+
cost = 131072 + _metadata_bytes((signals,self._extra_fields,selected_ids,time_frame_ids))*16
|
|
136
|
+
if cycle_fields or metadata_fields:
|
|
137
|
+
cost += 16384 + _metadata_bytes((cycle_fields,metadata_fields))*32
|
|
138
|
+
if database_context is not None:
|
|
139
|
+
database_context.require_open()
|
|
140
|
+
if database_context.path!=spec.dbc_path or database_context._budget is not budget:
|
|
141
|
+
raise ValueError('共用DBC上下文必须匹配当前文件和共享预算')
|
|
142
|
+
cost += sum(1024+len(str(item.path).encode('utf-8'))*16 for item in spec.inputs)
|
|
143
|
+
_reserve_owned_ram(self,cost,'_fixed_cost')
|
|
144
|
+
except BaseException as error:
|
|
145
|
+
_cleanup_owner(self,error,'text_can_cleanup_owner','文本CAN构造')
|
|
146
|
+
raise
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def closed(self):
|
|
150
|
+
"""返回真实资源关闭事实。参数: 无。返回: bool。异常: 无。
|
|
151
|
+
"""
|
|
152
|
+
return self._closed
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def exhausted(self):
|
|
156
|
+
"""区别真实全文件EOF与提前close。参数: 无。返回: bool。异常: 无。
|
|
157
|
+
"""
|
|
158
|
+
return self._exhausted
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def metadata(self):
|
|
162
|
+
"""取得本次实际DBC事实。参数: 无。返回: 冻结Mapping。异常: 未启动或已关闭时ResultClosedError。
|
|
163
|
+
"""
|
|
164
|
+
if self._metadata is None:
|
|
165
|
+
raise ResultClosedError('文本CAN尚无可用的同次DBC元数据')
|
|
166
|
+
return self._metadata
|
|
167
|
+
|
|
168
|
+
def prepare_metadata(self):
|
|
169
|
+
"""只初始化一次DBC,供计算在首帧前取得周期。
|
|
170
|
+
|
|
171
|
+
参数: 无。返回: 同次冻结元数据。异常: 失败/关闭拒绝,启动错误交实际owner清理。
|
|
172
|
+
不打开原始文件,不改变EOF状态。
|
|
173
|
+
"""
|
|
174
|
+
if self._closed or self._closing or self._failed:
|
|
175
|
+
raise ResultClosedError('文本CAN读取已关闭或失败')
|
|
176
|
+
try:
|
|
177
|
+
if self._metadata is None:
|
|
178
|
+
self._start()
|
|
179
|
+
return self.metadata
|
|
180
|
+
except BaseException as error:
|
|
181
|
+
self._failed = True
|
|
182
|
+
_cleanup_owner(self, error, 'text_can_cleanup_owner', '文本CAN初始化')
|
|
183
|
+
raise
|
|
184
|
+
|
|
185
|
+
def _start(self):
|
|
186
|
+
"""一次加载并核所需定位/单位。参数: 无。返回: None。异常: 原DBC/I/O/预算或单位不符。
|
|
187
|
+
"""
|
|
188
|
+
# 只有首次next进入此处;为库的DBC对象图和哈希缓冲预约保守费用,不声称RSS硬上限。
|
|
189
|
+
from ..can_dependencies import import_can_dependency
|
|
190
|
+
cantools = import_can_dependency('cantools')
|
|
191
|
+
if self._database_context is None:
|
|
192
|
+
size = self.spec.dbc_path.stat().st_size
|
|
193
|
+
_reserve_owned_ram(self,1048576+size*64,'_dbc_cost')
|
|
194
|
+
before_stat=self.spec.dbc_path.stat()
|
|
195
|
+
before=None
|
|
196
|
+
if self._integrity:
|
|
197
|
+
with self.spec.dbc_path.open('rb') as stream:
|
|
198
|
+
before = file_digest(stream,'sha256').hexdigest()
|
|
199
|
+
self._db = cantools.database.load_file(str(self.spec.dbc_path))
|
|
200
|
+
else:
|
|
201
|
+
# 新文本读取和新输出共用同一已付费DBC;借用结束不能替父owner释放费用。
|
|
202
|
+
self._database_context.require_open()
|
|
203
|
+
self._db=self._database_context.database; before=self._database_context.sha256
|
|
204
|
+
fields = tuple(dict.fromkeys((*[field for _,field in self._fields],*self._extra_fields)))
|
|
205
|
+
from ..legacy.binding import FrameBindingResolver
|
|
206
|
+
self._binding_resolver = FrameBindingResolver(self._db, fields)
|
|
207
|
+
if self._cycle_fields or self._metadata_fields:
|
|
208
|
+
fields=tuple(dict.fromkeys((*fields,*self._cycle_fields,*self._metadata_fields)))
|
|
209
|
+
facts=_field_metadata(self._db,fields,cycle_fields=self._cycle_fields)
|
|
210
|
+
else:
|
|
211
|
+
facts = _field_metadata(self._db,fields)
|
|
212
|
+
# 已知非空DBC单位与input_unit逐字核对;缺单位不伪装成已认证单位。
|
|
213
|
+
for definition,field in self._fields:
|
|
214
|
+
unit = next(item['unit'] for item in facts if item['locator']==field_to_dict(field))
|
|
215
|
+
if unit not in (None,'') and unit != definition.input_unit:
|
|
216
|
+
raise ValueError('DBC非空单位与input_unit不同: '+definition.name)
|
|
217
|
+
if self._database_context is None:
|
|
218
|
+
after=None
|
|
219
|
+
if self._integrity:
|
|
220
|
+
with self.spec.dbc_path.open('rb') as stream:
|
|
221
|
+
after = file_digest(stream,'sha256').hexdigest()
|
|
222
|
+
after_stat=self.spec.dbc_path.stat()
|
|
223
|
+
changed=(before_stat.st_size,before_stat.st_mtime_ns,before_stat.st_ino)!=(after_stat.st_size,after_stat.st_mtime_ns,after_stat.st_ino)
|
|
224
|
+
if changed or before != after:
|
|
225
|
+
raise ValueError('加载期间DBC内容发生变化')
|
|
226
|
+
# EOF后仍保留单位/定位等事实;与DBC对象图分开付费,不能随DBC释放而漏账。
|
|
227
|
+
_reserve_owned_ram(self,4096+_metadata_bytes(freeze_metadata(facts))*16
|
|
228
|
+
+len(str(self.spec.dbc_path).encode('utf-8'))*16,'_metadata_cost')
|
|
229
|
+
self._metadata = freeze_metadata({'profile':'can-text-v1','dbc_path':str(self.spec.dbc_path),
|
|
230
|
+
'dbc_sha256':before,'fields':facts,'decode_choices':False,'allow_truncated':True,
|
|
231
|
+
'selected_length_check':'partial' if self.spec.decode_policy=='partial' else 'exact',
|
|
232
|
+
'decode_scope':'requested','cantools_version':cantools.__version__,
|
|
233
|
+
'record_check_scope':'selected_ids' if self._selected_ids is not None and self.spec.source_type=='raw_can_csv' else 'source',
|
|
234
|
+
'time_order_check_scope':'selected_ids' if self._time_frame_ids is not None else 'source'})
|
|
235
|
+
|
|
236
|
+
def _decode(self, raw):
|
|
237
|
+
"""给本条原帧分类并按需解码。参数: raw为本次实际RawCANRecord。返回: (values,status)。异常: 已选帧结构错;legacy遇解码失败停止,新政策将DecodeError置为本条无效。
|
|
238
|
+
"""
|
|
239
|
+
frame = raw.frame
|
|
240
|
+
self._frame_values=self._frame_layout=()
|
|
241
|
+
# 远程/错误帧可供原始导出,不作为普通信号输入。
|
|
242
|
+
if frame.is_remote_frame or frame.is_error_frame:
|
|
243
|
+
return (),'non_data'
|
|
244
|
+
selected = self._binding_resolver.fields_for(frame)
|
|
245
|
+
# 共同消息消费者不需要判断无关ID是否存在于DBC,完整分类旧入口仍保留。
|
|
246
|
+
if not selected and not self._classify_unselected:
|
|
247
|
+
return (),'unselected'
|
|
248
|
+
if not selected:
|
|
249
|
+
return (), 'unselected' if any(message.frame_id == frame.arbitration_id for message in self._db.messages) else 'unknown'
|
|
250
|
+
message = self._binding_resolver.message_for(frame, selected)
|
|
251
|
+
# 复用原解码参数前先核新入口的严格长度;失败不改写成未知ID透传。
|
|
252
|
+
from ..legacy.decode_policy import check_decode_length
|
|
253
|
+
try:
|
|
254
|
+
check_decode_length(frame,message.length,
|
|
255
|
+
'strict' if self.spec.decode_policy == 'legacy' else self.spec.decode_policy)
|
|
256
|
+
except ValueError as error:
|
|
257
|
+
raise CANTextError(raw.path,raw.line_number,str(error)) from error
|
|
258
|
+
try:
|
|
259
|
+
from cantools.database.errors import DecodeError
|
|
260
|
+
self.decode_calls += 1
|
|
261
|
+
values = message.decode(frame.data, decode_choices=False, allow_truncated=True)
|
|
262
|
+
except DecodeError as error:
|
|
263
|
+
if self.spec.decode_policy == 'legacy':
|
|
264
|
+
raise CANTextError(raw.path,raw.line_number,'已定义DBC报文解码失败: '+str(error)) from error
|
|
265
|
+
# 结构已核验;未知复用编号等解码失败是本条失效,不沿用上一条值。
|
|
266
|
+
values = {}
|
|
267
|
+
except (ValueError,KeyError) as error:
|
|
268
|
+
raise CANTextError(raw.path,raw.line_number,'已定义DBC报文解码失败: '+str(error)) from error
|
|
269
|
+
if self._database_context is not None and any(rule.matches(frame) for rule in self._database_context.rules):
|
|
270
|
+
from ..legacy.binding import field_matches
|
|
271
|
+
names={field.signal for field in self._extra_fields if field_matches(field, frame)}
|
|
272
|
+
self._frame_values=tuple((name,value) for name,value in values.items() if name in names)
|
|
273
|
+
self._frame_layout=tuple((signal.name,int(signal.conversion.numeric_scaled_to_raw(values[signal.name])))
|
|
274
|
+
for signal in message.signals if signal.is_multiplexer and signal.name in values)
|
|
275
|
+
# 同一原字段可有多个分析别名;只交付一次物理值,额外转换由pack_decoded按别名执行。
|
|
276
|
+
return tuple((field.key,values.get(field.signal)) for field in dict.fromkeys(selected)),'decoded'
|
|
277
|
+
|
|
278
|
+
def __iter__(self):
|
|
279
|
+
"""迭代同次读取。参数: 无。返回: self。异常: 无。
|
|
280
|
+
"""
|
|
281
|
+
return self
|
|
282
|
+
|
|
283
|
+
def _time_selected(self, frame):
|
|
284
|
+
"""判断此帧是否属于所需通道与ID;不解码、不改时间。
|
|
285
|
+
|
|
286
|
+
参数: frame为已解析原帧。返回: bool;None选择全部帧。异常: 无。
|
|
287
|
+
同ID的帧类型仍交既有绑定解析器核对,不能用筛选隐藏歧义。
|
|
288
|
+
"""
|
|
289
|
+
return self._time_frame_ids is None or (frame.channel == self.spec.channel
|
|
290
|
+
and frame.arbitration_id in self._time_frame_ids)
|
|
291
|
+
|
|
292
|
+
def __next__(self):
|
|
293
|
+
"""逐条交付原帧和所需解码值。参数: 无。返回: DecodedCANRecord。异常: EOF/定位数据错/原I/O、预算、取消。
|
|
294
|
+
"""
|
|
295
|
+
if self._closed or self._exhausted:
|
|
296
|
+
raise StopIteration
|
|
297
|
+
if self._closing or self._failed:
|
|
298
|
+
raise ResultClosedError('文本CAN读取已失败或正在关闭')
|
|
299
|
+
try:
|
|
300
|
+
if self._check_cancel is not None:
|
|
301
|
+
self._check_cancel()
|
|
302
|
+
if self._database_context is not None:
|
|
303
|
+
self._database_context.require_open()
|
|
304
|
+
if self._db is None:
|
|
305
|
+
self._start()
|
|
306
|
+
while self._input_index < len(self.spec.inputs):
|
|
307
|
+
if self._raw is None:
|
|
308
|
+
# 实际parser owner在创建成功后安装;失败的未返回owner也必须接管清理。
|
|
309
|
+
item = self.spec.inputs[self._input_index]
|
|
310
|
+
factory = ASCRead if type(item) is ASCSpec else BLFRead if type(item) is BLFSpec else CANCSVRead
|
|
311
|
+
try:
|
|
312
|
+
self._raw = factory(item,self._budget,check_cancel=self._check_cancel,
|
|
313
|
+
retain_original=self._trace,retain_source_time=self._retain_source_time or self._trace,
|
|
314
|
+
**({'flag_resolver':self._binding_resolver.missing_flags,
|
|
315
|
+
'selected_ids':self._selected_ids} if factory is CANCSVRead else
|
|
316
|
+
{'time_selector':self._time_selected if self._time_frame_ids is not None else None,
|
|
317
|
+
'previous_exact_time':self._last_selected_time} if factory is ASCRead else {}))
|
|
318
|
+
except BaseException as error:
|
|
319
|
+
self._raw = (getattr(error,'asc_read_cleanup_owner',None)
|
|
320
|
+
or getattr(error,'raw_csv_cleanup_owner',None) or getattr(error,'blf_read_cleanup_owner',None))
|
|
321
|
+
raise
|
|
322
|
+
try:
|
|
323
|
+
raw = next(self._raw)
|
|
324
|
+
except StopIteration:
|
|
325
|
+
# 单文件真实EOF才换下一文件;不重排输入、不从头回退另一个parser。
|
|
326
|
+
self.count = self._completed_count + self._raw.count
|
|
327
|
+
self._completed_count = self.count
|
|
328
|
+
if isinstance(self._raw, ASCRead):
|
|
329
|
+
# full模式的最后元数据时刻也延续;按需模式只保所需帧,空文件不清零。
|
|
330
|
+
self._last_selected_time = self._raw.last_exact_time
|
|
331
|
+
self._raw.close()
|
|
332
|
+
self._raw = None
|
|
333
|
+
self._input_index += 1
|
|
334
|
+
continue
|
|
335
|
+
# 来源范围与时序输入不是一回事:范围取同次读到的极值,不要求无关帧有序。
|
|
336
|
+
self.first_ns = raw.time_ns if self.first_ns is None else min(self.first_ns,raw.time_ns)
|
|
337
|
+
self.last_ns = raw.time_ns if self.last_ns is None else max(self.last_ns,raw.time_ns)
|
|
338
|
+
self.count = self._completed_count + self._raw.count
|
|
339
|
+
if not self._time_selected(raw.frame):
|
|
340
|
+
continue
|
|
341
|
+
# ASC只借当前比较点,避免跨文件舍入为同一ns后漏掉精确回退。
|
|
342
|
+
# 其他格式沿用其原有整数ns精度;不在每条记录中保存双份时间。
|
|
343
|
+
current_time = (self._raw.last_exact_time if isinstance(self._raw, ASCRead)
|
|
344
|
+
else Decimal(f'{raw.time_ns}e-9'))
|
|
345
|
+
if self._last_selected_time is not None and current_time < self._last_selected_time:
|
|
346
|
+
raise CANTextError(raw.path,raw.line_number,'连续文件时间回退,需显式对齐起点')
|
|
347
|
+
self._last_selected_time = current_time
|
|
348
|
+
values,status = self._decode(raw)
|
|
349
|
+
result = DecodedCANRecord(self.spec.name,self._input_index,self._completed_count+raw.sequence,raw,values,status,self._frame_values,self._frame_layout)
|
|
350
|
+
# 来源范围已在筛选前统计;原序号和count包含跳过行,retained_count仅数交付。
|
|
351
|
+
self.retained_count += 1
|
|
352
|
+
return result
|
|
353
|
+
# EOF后释放大DBC图,有限事实保留到显式close,供父层先接收并付费。
|
|
354
|
+
self._db = self._binding_resolver = None
|
|
355
|
+
_release_owned_ram(self,self._dbc_cost,'_dbc_cost')
|
|
356
|
+
self._exhausted = True
|
|
357
|
+
raise StopIteration
|
|
358
|
+
except StopIteration:
|
|
359
|
+
raise
|
|
360
|
+
except BaseException as error:
|
|
361
|
+
self._failed = True
|
|
362
|
+
_cleanup_owner(self,error,'text_can_cleanup_owner','文本CAN读取')
|
|
363
|
+
raise
|
|
364
|
+
|
|
365
|
+
def close(self):
|
|
366
|
+
"""关闭自有解析器及DBC状态,可重试。参数: 无。返回: None。异常: 原关闭/预算错误。
|
|
367
|
+
"""
|
|
368
|
+
if self._closed:
|
|
369
|
+
return
|
|
370
|
+
self._closing = True
|
|
371
|
+
# 子文件真实关闭后才撤责任;持续失败仍由本owner保留引用。
|
|
372
|
+
if self._raw is not None:
|
|
373
|
+
self._raw.close()
|
|
374
|
+
self._raw = None
|
|
375
|
+
self._db = self._metadata = self._binding_resolver = None
|
|
376
|
+
self._time_frame_ids = None
|
|
377
|
+
self._last_selected_time = None
|
|
378
|
+
_release_owned_ram(self,self._dbc_cost,'_dbc_cost')
|
|
379
|
+
_release_owned_ram(self,self._metadata_cost,'_metadata_cost')
|
|
380
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
381
|
+
self._closed = True
|
|
382
|
+
|
|
383
|
+
def __enter__(self):
|
|
384
|
+
"""建立显式资源上下文。参数: 无。返回: self。异常: 无。
|
|
385
|
+
"""
|
|
386
|
+
return self
|
|
387
|
+
|
|
388
|
+
def __exit__(self, exception_type, error, traceback):
|
|
389
|
+
"""保原业务错误并收尾。参数: exception_type/error/traceback异常上下文。返回: False。异常: 正常退出时的关闭错误。
|
|
390
|
+
"""
|
|
391
|
+
if error is None:
|
|
392
|
+
self.close()
|
|
393
|
+
else:
|
|
394
|
+
_cleanup_owner(self,error,'text_can_cleanup_owner','文本CAN上下文')
|
|
395
|
+
return False
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def pack_text_records(definition, records, session_id, backend):
|
|
399
|
+
"""把有限已解码原帧交给现有数值核心,不再次解码或重复DBC缩放。
|
|
400
|
+
|
|
401
|
+
参数: definition为SignalDefinition;records为有限DecodedCANRecord tuple;session_id会话;backend为reference/numpy。
|
|
402
|
+
返回: SignalSeries,保精确纳秒、同刻原序号和CANTextSourceRef;调用方负责批次数组的长期预算。
|
|
403
|
+
异常: 来源/声明/记录类型不符,或既有pack_decoded类型、数值转换错误。
|
|
404
|
+
"""
|
|
405
|
+
if type(definition) is not SignalDefinition or type(records) is not tuple or any(type(item) is not DecodedCANRecord for item in records):
|
|
406
|
+
raise TypeError('文本CAN归一化需要定义及有限解码记录tuple')
|
|
407
|
+
require_identifier(session_id,'text_can.session_id')
|
|
408
|
+
samples,refs = [],[]
|
|
409
|
+
for record in records:
|
|
410
|
+
if record.source != definition.source:
|
|
411
|
+
raise ValueError('文本CAN记录与信号来源不一致')
|
|
412
|
+
# 未选中帧无该字段,不制造更新;匹配报文实际缺值则None更新,覆盖旧值。
|
|
413
|
+
values = dict(record.values)
|
|
414
|
+
if definition.field not in values:
|
|
415
|
+
continue
|
|
416
|
+
raw = record.raw
|
|
417
|
+
samples.append((raw.time_ns,record.sequence,values[definition.field]))
|
|
418
|
+
refs.append(CANTextSourceRef(session_id,record.source,definition.field,str(raw.path),
|
|
419
|
+
raw.parser_version,raw.line_number,record.input_index,raw.sequence,record.sequence,
|
|
420
|
+
raw.raw_time,raw.time_quantized))
|
|
421
|
+
return pack_decoded(definition,tuple(samples),tuple(refs),backend)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""保存新文本CAN样本的精确原行引用,供信号历史和结果白名单编码。
|
|
2
|
+
|
|
3
|
+
输入是已有规范CAN字段键和实际读取的文件/行/原时间,输出冻结SourceRef子类。
|
|
4
|
+
字段键仍区分通道、消息、信号、ID及帧型;本引用另外保留文件次序与文件内序号。
|
|
5
|
+
不打开文件、不解码、不将float秒当作精确时间,也不冒称冻结旧profile的输出。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from ..core.models import SourceRef
|
|
10
|
+
from ..core.validation import require_text
|
|
11
|
+
from .can_spec import can_field_from_key
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class CANTextSourceRef(SourceRef):
|
|
16
|
+
"""定位一个实际文本记录中的信号;通用field保存完整规范CAN定位。"""
|
|
17
|
+
|
|
18
|
+
path: str # 实际输入路径,保持读取声明,不做隐式resolve。
|
|
19
|
+
parser_version: str # ASC或原始CSV解析版本。
|
|
20
|
+
line_number: int | None # 文本物理行;BLF为None,以record_sequence定位。
|
|
21
|
+
input_index: int # 显式文件列表中的0基位置。
|
|
22
|
+
record_sequence: int # 文件内原记录序号,同刻不同帧不去重。
|
|
23
|
+
yield_sequence: int # 本次连续文件读取的全局0基原帧序号。
|
|
24
|
+
raw_time: str | None # 文本原文字;BLF没有时间文字,不构造副本。
|
|
25
|
+
time_quantized: bool # 源文字转纳秒时是否实际量化。
|
|
26
|
+
|
|
27
|
+
def __post_init__(self):
|
|
28
|
+
"""核对冻结定位的结构。参数: 无。返回: None。异常: 类型/规范字段/位置非法。
|
|
29
|
+
"""
|
|
30
|
+
# 先核会话/来源归属,再核原CAN六字段;不把原信号名改成表达式别名。
|
|
31
|
+
super().__post_init__()
|
|
32
|
+
can_field_from_key(self.field)
|
|
33
|
+
for label in ('path','parser_version'):
|
|
34
|
+
require_text(getattr(self,label),'text_can_ref.'+label)
|
|
35
|
+
if self.parser_version == 'blf-v1':
|
|
36
|
+
if self.line_number is not None or self.raw_time is not None:
|
|
37
|
+
raise ValueError('BLF引用没有物理行号或原时间文字')
|
|
38
|
+
else:
|
|
39
|
+
require_text(self.raw_time,'text_can_ref.raw_time')
|
|
40
|
+
# 物理行从1开始,其余序号从0开始,bool不能作为整数通过。
|
|
41
|
+
for label in ('line_number','input_index','record_sequence','yield_sequence'):
|
|
42
|
+
value = getattr(self,label)
|
|
43
|
+
if label == 'line_number' and self.parser_version == 'blf-v1':
|
|
44
|
+
continue
|
|
45
|
+
if type(value) is not int or value < (1 if label=='line_number' else 0):
|
|
46
|
+
raise ValueError('文本CAN引用位置非法: '+label)
|
|
47
|
+
if type(self.time_quantized) is not bool:
|
|
48
|
+
raise TypeError('文本CAN量化标志需要bool')
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""冻结ASC/BLF连续来源或原始CSV到DBC信号的声明,不在构造时读取文件。
|
|
2
|
+
|
|
3
|
+
每个输入保留A/B已校验的解析配置,文件严格按声明顺序接续,不排序或猜测换日。
|
|
4
|
+
时间在各解析器中已变为纳秒;本层不再施加偏移。通用时基由调用方显式提供。
|
|
5
|
+
混合BLF复用python-can格式读取;既有纯BLF的LegacyCANSpec调用路径保持原样。
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from ..core.models import TimebaseSpec
|
|
11
|
+
from ..core.validation import require_identifier
|
|
12
|
+
from .asc import ASCSpec
|
|
13
|
+
from .raw_csv import CANCSVSpec
|
|
14
|
+
from .blf import BLFSpec
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class CANTextSpec:
|
|
19
|
+
"""同一来源的显式连续输入、单通道/DBC和已声明的共同时间基准。"""
|
|
20
|
+
|
|
21
|
+
name: str # 来源安全名称,不是DBC消息名。
|
|
22
|
+
inputs: tuple[ASCSpec | CANCSVSpec | BLFSpec, ...] # ASC/BLF可混合;CSV需统一布局。
|
|
23
|
+
dbc_path: Path # 单次只读加载的DBC,不在构造时核存在性。
|
|
24
|
+
channel: int # 0基目标信号通道;其他通道原帧仍向导出层交付。
|
|
25
|
+
timebase: TimebaseSpec # 相同ID本身不证明物理同步。
|
|
26
|
+
|
|
27
|
+
decode_policy: str = 'legacy' # 旧文本失败停止;新strict/partial解码失败置无效继续。
|
|
28
|
+
input_check: str = 'auto' # full检查全部帧时间顺序;auto按实际消费者选择。
|
|
29
|
+
|
|
30
|
+
def __post_init__(self):
|
|
31
|
+
"""核声明与支持范围。参数: 无。返回: None。异常: 名称/类型/文件集合或时基不合法。
|
|
32
|
+
"""
|
|
33
|
+
# ASC/BLF自描述帧可连续;CSV需要专门布局,不能混入这组自动识别文件。
|
|
34
|
+
from ..legacy.decode_policy import validate_decode_policy
|
|
35
|
+
validate_decode_policy(self.decode_policy)
|
|
36
|
+
if type(self.input_check) is not str or self.input_check not in ('auto','full'):
|
|
37
|
+
raise ValueError('文本CAN input_check需要auto或full')
|
|
38
|
+
require_identifier(self.name,'text_can.name')
|
|
39
|
+
if (type(self.inputs) is not tuple or not 1 <= len(self.inputs) <= 4096
|
|
40
|
+
or any(type(item) not in (ASCSpec,CANCSVSpec,BLFSpec) for item in self.inputs)
|
|
41
|
+
or any(type(item) is CANCSVSpec for item in self.inputs)
|
|
42
|
+
and any(type(item) is not CANCSVSpec for item in self.inputs)):
|
|
43
|
+
raise ValueError('CAN需要1到4096个ASC/BLF或同布局CSV解析声明')
|
|
44
|
+
if not isinstance(self.dbc_path,Path) or not isinstance(self.timebase,TimebaseSpec):
|
|
45
|
+
raise TypeError('文本CAN需要DBC Path及TimebaseSpec')
|
|
46
|
+
if type(self.channel) is not int or self.channel < 0:
|
|
47
|
+
raise ValueError('文本CAN通道需要非负原生整数')
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def source_type(self):
|
|
51
|
+
"""区分原始来源。返回can_asc、asc_or_blf或raw_can_csv,不发生I/O。
|
|
52
|
+
"""
|
|
53
|
+
if any(type(item) is BLFSpec for item in self.inputs):
|
|
54
|
+
return 'asc_or_blf'
|
|
55
|
+
return 'can_asc' if type(self.inputs[0]) is ASCSpec else 'raw_can_csv'
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def offset_ns(self):
|
|
59
|
+
"""说明本层不再移动解析后时间。参数: 无。返回: 0。异常: 无。
|
|
60
|
+
"""
|
|
61
|
+
return 0
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""集中导出时间转换和标准库整数时间运算。
|
|
2
|
+
|
|
3
|
+
输入为明确单位的数值、ISO日期文本或整数纳秒序列;输出转换诊断或新的整数
|
|
4
|
+
序列。此文件只重导出conversion的接口,不执行计算、不读取文件、不加载NumPy。
|
|
5
|
+
实际入口检查int64范围、明确时区和最终纳秒舍入;不会推断输入时间单位或
|
|
6
|
+
机器时区。恰好半纳秒时采用最近偶数舍入,避免统一向同一方向进位。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# 标量与独立整数参考内核可在未安装NumPy/CAN时导入。
|
|
10
|
+
from .conversion import (
|
|
11
|
+
TimeConversion, TimeOverflowError, checked_add_ns, convert_time,
|
|
12
|
+
parse_datetime_ns, parse_duration, shift_times_reference, time_deltas_reference,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
# 数组实现独立放numpy_ops,由调用者显式选择。
|
|
16
|
+
__all__ = [
|
|
17
|
+
"TimeConversion", "TimeOverflowError", "checked_add_ns", "convert_time",
|
|
18
|
+
"parse_datetime_ns", "parse_duration", "shift_times_reference", "time_deltas_reference",
|
|
19
|
+
]
|