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,245 @@
|
|
|
1
|
+
"""为显式报文导出保存同次记录和新编码所需DBC上下文。
|
|
2
|
+
|
|
3
|
+
默认关闭时不创建这些对象。TextFrameStore只保存本次文本读取已交付的原帧、
|
|
4
|
+
物理值和定位,可为多个窗口有限回放;不重新读原文件。FrameDBCContext负责
|
|
5
|
+
新编码的DBC身份/字段声明,可借给新文本解码器共用一次加载。旧BLF链自身的
|
|
6
|
+
DBC加载和解码不改变;为新增编码另加载同一哈希的定义属于新输出的显式成本。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from hashlib import file_digest
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from ..legacy.records import LegacyCANField
|
|
13
|
+
from ..legacy.binding import dbc_candidates, select_message
|
|
14
|
+
from ..results.budget import _reserve_owned_ram,_release_owned_ram,_cleanup_owner
|
|
15
|
+
from ..results.errors import ResultClosedError
|
|
16
|
+
from ..results.frame_exports import as_export_frame
|
|
17
|
+
from ..results.frame_patch import DBCFramePatch
|
|
18
|
+
from ..results.frame_rebuild import FrameSample,_sample_packet,_restore_sample
|
|
19
|
+
from ..results.frame_sort import FrameSort
|
|
20
|
+
from .history import _metadata_bytes
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FrameDBCContext:
|
|
24
|
+
"""拥有供新输出使用的DBC定义、摘要和额外请求字段,借用者不负责释放。"""
|
|
25
|
+
|
|
26
|
+
def __init__(self,path,rules,budget,*,cycle_periods=False,integrity=True):
|
|
27
|
+
"""加载并核身份,生成连续量/选择器请求。参数: path、规则tuple、budget。返回: owner。异常: DBC/预算/字段/I/O错。
|
|
28
|
+
"""
|
|
29
|
+
if type(integrity) is not bool: raise TypeError("integrity需要bool")
|
|
30
|
+
self.path=Path(path); self.rules=rules; self._budget=budget
|
|
31
|
+
self._held_cost=self._fixed_cost=0; self.closed=self._closed=False
|
|
32
|
+
self.database=self._handle=self._patcher=None; self.sha256=None; self.extra_fields=();self.periods=None
|
|
33
|
+
self._candidates=(); self._selected=[]; self._identities=[]; self._cycle_periods=cycle_periods
|
|
34
|
+
self._by_frame_id={}; self._cycle_values={}
|
|
35
|
+
try:
|
|
36
|
+
size=self.path.stat().st_size
|
|
37
|
+
_reserve_owned_ram(self,1048576+size*64+_metadata_bytes(rules)*32,'_fixed_cost')
|
|
38
|
+
before_stat=self.path.stat()
|
|
39
|
+
before=self._hash() if integrity else None
|
|
40
|
+
from ..can_dependencies import import_can_dependency
|
|
41
|
+
cantools = import_can_dependency('cantools')
|
|
42
|
+
self.database=cantools.database.load_file(str(self.path))
|
|
43
|
+
# 导出的未知报文策略需要判断DBC是否认识该帧;一次建索引,不逐帧扫描DBC。
|
|
44
|
+
for message in self.database.messages:
|
|
45
|
+
self._by_frame_id.setdefault(message.frame_id,[]).append(message)
|
|
46
|
+
after_stat=self.path.stat()
|
|
47
|
+
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)
|
|
48
|
+
if changed or integrity and self._hash()!=before:
|
|
49
|
+
raise ValueError('新增编码加载DBC期间内容发生变化')
|
|
50
|
+
self.sha256=before; self.version=cantools.__version__
|
|
51
|
+
fields=[]; candidates=[]
|
|
52
|
+
for rule in rules:
|
|
53
|
+
choices=dbc_candidates(self.database,rule.frame_id,(*rule.continuous,*rule.protected),rule.is_extended,rule.is_fd)
|
|
54
|
+
if not choices:
|
|
55
|
+
raise ValueError('DBC缺少重建报文或指定信号: '+str(rule.frame_id))
|
|
56
|
+
candidates.append(choices)
|
|
57
|
+
# 候选定义均须可重建;最终选择等实际帧到达,不按DBC顺序取第一个。
|
|
58
|
+
for message in choices:
|
|
59
|
+
if cycle_periods and id(message) not in self._cycle_values:
|
|
60
|
+
# 声明DBC网格时,在打开日志前拒绝缺失或非法周期;只读取一次。
|
|
61
|
+
from ..legacy.dbc_cycles import cycle_time_ns
|
|
62
|
+
self._cycle_values[id(message)]=cycle_time_ns(message.cycle_time)
|
|
63
|
+
try:
|
|
64
|
+
self._patcher=DBCFramePatch(rule,message,budget)
|
|
65
|
+
except BaseException as error:
|
|
66
|
+
self._patcher=getattr(error,'frame_patch_cleanup_owner',None)
|
|
67
|
+
raise
|
|
68
|
+
self._patcher.close(); self._patcher=None
|
|
69
|
+
names=tuple(dict.fromkeys((*rule.continuous,*(s.name for s in message.signals if s.is_multiplexer))))
|
|
70
|
+
fields.extend(LegacyCANField(rule.channel,name,rule.frame_id,message.is_extended_frame,rule.is_fd) for name in names)
|
|
71
|
+
self.extra_fields=tuple(dict.fromkeys(fields))
|
|
72
|
+
self._candidates=tuple(candidates)
|
|
73
|
+
self._selected=[None]*len(rules); self._identities=[None]*len(rules)
|
|
74
|
+
except BaseException as error:
|
|
75
|
+
_cleanup_owner(self,error,'frame_dbc_cleanup_owner','导出DBC上下文')
|
|
76
|
+
raise
|
|
77
|
+
|
|
78
|
+
def _hash(self):
|
|
79
|
+
"""核同一文件的完整内容身份。参数: 无。返回: SHA256文本。异常: 打开/读取/真实关闭错。
|
|
80
|
+
"""
|
|
81
|
+
self._handle=self.path.open('rb')
|
|
82
|
+
digest=file_digest(self._handle,'sha256').hexdigest()
|
|
83
|
+
self._handle.close(); self._handle=None
|
|
84
|
+
return digest
|
|
85
|
+
|
|
86
|
+
def require_open(self):
|
|
87
|
+
"""禁止使用已释放DBC。参数: 无。返回: None。异常: ResultClosedError。
|
|
88
|
+
"""
|
|
89
|
+
if self.closed:
|
|
90
|
+
raise ResultClosedError('导出DBC上下文已关闭')
|
|
91
|
+
|
|
92
|
+
def pairs(self):
|
|
93
|
+
"""交付规则与同次定义的有限借用。参数: 无。返回: tuple。异常: 已关闭或身份缺失。
|
|
94
|
+
"""
|
|
95
|
+
self.require_open()
|
|
96
|
+
pairs=[]
|
|
97
|
+
for index,rule in enumerate(self.rules):
|
|
98
|
+
message=self._selected[index]
|
|
99
|
+
if message is None:
|
|
100
|
+
choices=self._candidates[index]
|
|
101
|
+
# 从未收到该报文时无需构造一个猜测的多候选输出规则。
|
|
102
|
+
if len(choices)!=1:
|
|
103
|
+
continue
|
|
104
|
+
message=choices[0]
|
|
105
|
+
pairs.append((rule,message))
|
|
106
|
+
if self._cycle_periods:
|
|
107
|
+
self.periods=tuple(self._cycle_values[id(message)] for _,message in pairs)
|
|
108
|
+
return tuple(pairs)
|
|
109
|
+
|
|
110
|
+
def observe(self,frame):
|
|
111
|
+
"""用正在读取的实际帧确定输出定义,禁止一条自动规则混用两种身份。
|
|
112
|
+
|
|
113
|
+
参数: frame为原始帧。返回: 匹配的DBC Message或None。异常: DBC或实际身份歧义。
|
|
114
|
+
副作用: 每条规则只保存一个已识别定义和身份,不保留额外帧或扫描文件。
|
|
115
|
+
"""
|
|
116
|
+
self.require_open()
|
|
117
|
+
if frame.is_remote_frame or frame.is_error_frame:
|
|
118
|
+
return None
|
|
119
|
+
selected=[]
|
|
120
|
+
for index,rule in enumerate(self.rules):
|
|
121
|
+
if not rule.matches(frame):
|
|
122
|
+
continue
|
|
123
|
+
message=select_message(self._candidates[index],frame)
|
|
124
|
+
if message is None:
|
|
125
|
+
continue
|
|
126
|
+
identity=(frame.is_extended_id,frame.is_fd)
|
|
127
|
+
prior=self._identities[index]
|
|
128
|
+
if prior is not None and prior!=identity:
|
|
129
|
+
differing='is_extended' if prior[0]!=identity[0] else 'is_fd'
|
|
130
|
+
raise ValueError('报文重建规则匹配到多种实际帧,请补充'+differing)
|
|
131
|
+
self._identities[index]=identity; self._selected[index]=message
|
|
132
|
+
selected.append(message)
|
|
133
|
+
if len(selected)>1:
|
|
134
|
+
raise ValueError('同一实际报文匹配多个重建规则,请收紧帧类型约束')
|
|
135
|
+
return selected[0] if selected else None
|
|
136
|
+
|
|
137
|
+
def is_known_frame(self,frame):
|
|
138
|
+
"""只判断未知报文输出策略,不要求未选报文的信号或定义唯一。
|
|
139
|
+
|
|
140
|
+
参数: frame为原始帧。返回: bool。异常: 已关闭时ResultClosedError。
|
|
141
|
+
副作用: 无,不解码或记录帧内容。
|
|
142
|
+
"""
|
|
143
|
+
self.require_open()
|
|
144
|
+
return any(message.is_extended_frame==frame.is_extended_id
|
|
145
|
+
and (not frame.is_fd or message.is_fd)
|
|
146
|
+
for message in self._by_frame_id.get(frame.arbitration_id,()))
|
|
147
|
+
|
|
148
|
+
def close(self):
|
|
149
|
+
"""在借用者关闭后释放定义和实际句柄。参数: 无。返回: None。异常: 原关闭/释放错可恢复。
|
|
150
|
+
"""
|
|
151
|
+
if self.closed:
|
|
152
|
+
return
|
|
153
|
+
if self._handle is not None:
|
|
154
|
+
self._handle.close(); self._handle=None
|
|
155
|
+
if self._patcher is not None:
|
|
156
|
+
self._patcher.close(); self._patcher=None
|
|
157
|
+
self.database=None; self.extra_fields=();self.periods=None
|
|
158
|
+
self._candidates=(); self._selected=[]; self._identities=[]; self._by_frame_id={}; self._cycle_values={}
|
|
159
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost'); self.closed=self._closed=True
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class TextFrameStore:
|
|
163
|
+
"""保存连续原序的同次文本CAN事实;封口后允许多个窗口逐个回放。"""
|
|
164
|
+
|
|
165
|
+
def __init__(self,path,budget,source,session_id,read_identity,*,database_context=None,channel=None,integrity=True,trace=True):
|
|
166
|
+
"""建立有限排序暂存及真实读取身份。参数: 新路径、budget、源/会话/read身份,可借用重建DBC及声明通道。返回: owner。异常: I/O/预算错。
|
|
167
|
+
"""
|
|
168
|
+
self.path=Path(path); self._budget=budget; self._held_cost=self._fixed_cost=self._row_cost=0
|
|
169
|
+
self.source_name=source; self.session_id=session_id; self.read_identity=read_identity
|
|
170
|
+
self.database_context=database_context; self.channel=channel; self.trace=trace
|
|
171
|
+
self.sort=None; self.count=0; self.last_ns=None; self.state='building'; self.closed=self._closed=False
|
|
172
|
+
try:
|
|
173
|
+
_reserve_owned_ram(self,131072,'_fixed_cost')
|
|
174
|
+
try:
|
|
175
|
+
self.sort=FrameSort(self.path,budget,integrity=integrity)
|
|
176
|
+
except BaseException as error:
|
|
177
|
+
self.sort=getattr(error,'frame_sort_cleanup_owner',None)
|
|
178
|
+
raise
|
|
179
|
+
except BaseException as error:
|
|
180
|
+
_cleanup_owner(self,error,'text_frame_store_cleanup_owner','文本原帧暂存构造')
|
|
181
|
+
raise
|
|
182
|
+
|
|
183
|
+
def append(self,record):
|
|
184
|
+
"""保原序原时间,不让排序掩盖回退。参数: DecodedCANRecord同次记录。返回: None。异常: 时序/状态/预算/I/O错。
|
|
185
|
+
"""
|
|
186
|
+
if self.closed or self.state!='building' or record.sequence!=self.count:
|
|
187
|
+
raise ValueError('文本原帧仓状态或连续序号不符')
|
|
188
|
+
if self.last_ns is not None and record.raw.time_ns<self.last_ns:
|
|
189
|
+
raise ValueError('文本原帧时间回退')
|
|
190
|
+
_reserve_owned_ram(self,1048576+_metadata_bytes((record.values,record.frame_values,record.frame_layout))*32,'_row_cost')
|
|
191
|
+
try:
|
|
192
|
+
known=record.status!='unknown'
|
|
193
|
+
if self.database_context is not None:
|
|
194
|
+
self.database_context.require_open()
|
|
195
|
+
frame=record.raw.frame
|
|
196
|
+
# 实际类型只在同次读取中匹配,输出不使用按ID覆盖的DBC字典。
|
|
197
|
+
message=self.database_context.observe(frame)
|
|
198
|
+
known=frame.channel==self.channel and self.database_context.is_known_frame(frame)
|
|
199
|
+
sample=FrameSample(as_export_frame(record,compact=not self.trace),record.frame_values,record.frame_layout,known)
|
|
200
|
+
self.sort.append((record.sequence,),_sample_packet(sample))
|
|
201
|
+
self.count+=1; self.last_ns=record.raw.time_ns
|
|
202
|
+
finally:
|
|
203
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
204
|
+
|
|
205
|
+
def seal(self):
|
|
206
|
+
"""完整真实EOF后封口。参数: 无。返回: None。异常: 状态/配额/I/O错。
|
|
207
|
+
"""
|
|
208
|
+
if self.closed or self.state!='building':
|
|
209
|
+
raise ResultClosedError('文本原帧仓不能重复封口')
|
|
210
|
+
self.sort.seal(); self.state='sealed'
|
|
211
|
+
|
|
212
|
+
def iter_samples(self):
|
|
213
|
+
"""打开一个有界完整回放,提前关闭不声称完整核验。参数: 无。返回: FrameSample生成器。异常: 仓状态/篡改/I/O错。
|
|
214
|
+
"""
|
|
215
|
+
if self.closed or self.state!='sealed':
|
|
216
|
+
raise ResultClosedError('文本原帧仓不可读')
|
|
217
|
+
cursor=self.sort._read(self.sort.path/f'{self.sort.level}-0.jsonl')
|
|
218
|
+
try:
|
|
219
|
+
for _,sequence,packet in cursor:
|
|
220
|
+
sample=_restore_sample(packet)
|
|
221
|
+
if sample.record.sequence!=sequence:
|
|
222
|
+
raise ValueError('文本原帧暂存序号不一致')
|
|
223
|
+
yield sample
|
|
224
|
+
finally:
|
|
225
|
+
cursor.close()
|
|
226
|
+
|
|
227
|
+
def iter_frames(self):
|
|
228
|
+
"""只交付原帧及定位,不重新解码。参数: 无。返回: ExportCANFrame生成器。异常: 原回放错。
|
|
229
|
+
"""
|
|
230
|
+
cursor=self.iter_samples()
|
|
231
|
+
try:
|
|
232
|
+
for sample in cursor:
|
|
233
|
+
yield sample.record
|
|
234
|
+
finally:
|
|
235
|
+
cursor.close()
|
|
236
|
+
|
|
237
|
+
def close(self):
|
|
238
|
+
"""关闭全部真实回放FD和排序仓,保诊断文件。参数: 无。返回: None。异常: 清理错可重试。
|
|
239
|
+
"""
|
|
240
|
+
if self.closed:
|
|
241
|
+
return
|
|
242
|
+
if self.sort is not None:
|
|
243
|
+
self.sort.close()
|
|
244
|
+
_release_owned_ram(self,self._row_cost,'_row_cost')
|
|
245
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost'); self.closed=self._closed=True
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""把已封存且全部来源EOF的历史归并为完整同刻更新组。
|
|
2
|
+
|
|
3
|
+
输入只来自已解码磁盘历史,整数纳秒排序不会重读或重排旧文件链。
|
|
4
|
+
每来源一个前瞻样本,跨批同刻更新全部收入同一组;不同原序号不collapse。
|
|
5
|
+
游标、有限堆和当前组计入共享账本,超大组明确失败,不缓存全量历史。
|
|
6
|
+
本组件是离线封存重放,不冒充未完成输入的在线watermark调度或算子执行。
|
|
7
|
+
返回组须即时消费,调用方自行长期保留输出的内存不在内部预算保证内。
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
# 冻结组模型、有限堆与复用既有行估算,不依赖任何数值后端。
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
import heapq
|
|
13
|
+
from sys import getsizeof
|
|
14
|
+
from ..timebase.conversion import require_int64_ns
|
|
15
|
+
from ..results.codec import _estimate
|
|
16
|
+
from ..results.errors import AnalysisError, ResultClosedError, ResultFormatError
|
|
17
|
+
from ..results.spool import _cleanup_owner, _reserve_owned_ram, _release_owned_ram
|
|
18
|
+
from .record_sample import RecordSample
|
|
19
|
+
from .history_records import HistorySample, HistoryProgress, estimate_record_bytes
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class DecodedTimeGroup:
|
|
24
|
+
"""保存一个session在同一整数ns的全部更新;来源和原sequence仍独立。"""
|
|
25
|
+
|
|
26
|
+
time_ns: int # 完整组的共同纳秒坐标。
|
|
27
|
+
samples: tuple[HistorySample, ...] # 同组全部原观测,不套用last_by_sequence策略。
|
|
28
|
+
|
|
29
|
+
def __post_init__(self) -> None:
|
|
30
|
+
"""检查同刻、同会话和唯一原身份,不执行绑定或表达式。
|
|
31
|
+
|
|
32
|
+
参数: 无;读取time_ns/samples。返回: None。
|
|
33
|
+
异常: TypeError/ValueError/OverflowError为结构或身份错误。
|
|
34
|
+
"""
|
|
35
|
+
require_int64_ns(self.time_ns)
|
|
36
|
+
if type(self.samples) is not tuple or not self.samples or any(type(item) not in (HistorySample,RecordSample) for item in self.samples):
|
|
37
|
+
raise TypeError('完整时间组需要非空HistorySample tuple')
|
|
38
|
+
if any(item.time_ns != self.time_ns for item in self.samples) or len({item.source_ref.session_id for item in self.samples}) != 1:
|
|
39
|
+
raise ValueError('时间组不能混用时间或session')
|
|
40
|
+
# 每别名原来源/sequence定位唯一,同原行不同列仍各自保留。
|
|
41
|
+
identities = {(item.source_ref, item.name, item.sequence) for item in self.samples}
|
|
42
|
+
if len(identities) != len(self.samples):
|
|
43
|
+
raise ValueError('完整时间组重复原观测')
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class _TimeGroupIterator:
|
|
47
|
+
"""保留有限来源前瞻、当前组预算及活动游标。
|
|
48
|
+
|
|
49
|
+
readers为预分配槽位,未安装子游标由_uninstalled_reader单独持有。
|
|
50
|
+
close中断后保留尚未释放的句柄、组登记和预算,_closing期间只允许重试close。
|
|
51
|
+
closed只在真实子资源关闭且组预算抵销后成立,不能凭尝试关闭就解除所有权。
|
|
52
|
+
_held_cost仅含本层_state_cost与_group_cost,不包含子reader或借用history金额。
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, owner, *, sources=None):
|
|
56
|
+
"""先申请状态预算,再为已封存历史打开各来源独立游标。
|
|
57
|
+
|
|
58
|
+
参数: owner为DecodedHistoryStore;sources为唯一已知来源名tuple,None选择全部。
|
|
59
|
+
返回: 新组迭代器,只有所选来源参与完整同刻组。
|
|
60
|
+
异常: 生命周期/预算/打开或解析原错;持续清理失败从time_group_iterator_cleanup_owner恢复。
|
|
61
|
+
"""
|
|
62
|
+
owner._check('sealed')
|
|
63
|
+
# 子集输入先做常量附加空间校验;禁止字符串/列表、未知或重复名偷偷扩充来源。
|
|
64
|
+
# 重复检查不预先建立set,按来源数增长的临时容器必须等预算预约成功后再创建。
|
|
65
|
+
if sources is not None:
|
|
66
|
+
if type(sources) is not tuple or any(type(name) is not str for name in sources):
|
|
67
|
+
raise TypeError('时间组来源子集需要来源名tuple或None')
|
|
68
|
+
for index, name in enumerate(sources):
|
|
69
|
+
if name not in owner.validators:
|
|
70
|
+
raise ValueError('时间组来源子集包含未知来源')
|
|
71
|
+
if any(sources[previous] == name for previous in range(index)):
|
|
72
|
+
raise ValueError('时间组来源子集不能重复')
|
|
73
|
+
# 常量空间计算原tuple估算,不在预留前构造按来源数增长的排序列表或tuple。
|
|
74
|
+
selected = owner.validators if sources is None else sources
|
|
75
|
+
count = len(selected)
|
|
76
|
+
tuple_bytes = getsizeof(()) + count * (getsizeof((None,)) - getsizeof(()))
|
|
77
|
+
names_cost = tuple_bytes + sum(_estimate(name) + 32 for name in selected)
|
|
78
|
+
state_cost = 8192 + count * 2048 + names_cost * 16
|
|
79
|
+
# 最小清理字段先建立,按来源数分配的结构、真实申请及打开都在保护区内。
|
|
80
|
+
self.owner, self.closed = owner, False
|
|
81
|
+
self._budget, self._held_cost = owner.budget, 0
|
|
82
|
+
self._closing = False
|
|
83
|
+
self._state_cost = self._group_cost = 0
|
|
84
|
+
self.readers, self.heap, self.last_times = [], [], []
|
|
85
|
+
self._current_group = None
|
|
86
|
+
self._uninstalled_reader = None
|
|
87
|
+
try:
|
|
88
|
+
# 仅围绕本层单笔预约检查实际账本,不从深子失败后的共享总额反推费用。
|
|
89
|
+
_reserve_owned_ram(self, state_cost, '_state_cost')
|
|
90
|
+
# 排序只规范所选来源顺序;未选来源不打开游标,也不并入相同时刻的更新。
|
|
91
|
+
names = tuple(sorted(selected))
|
|
92
|
+
self.readers = [None] * count
|
|
93
|
+
self.last_times = [None] * len(names)
|
|
94
|
+
for index, source in enumerate(names):
|
|
95
|
+
# 保存真实子游标以后才安装;安装前后失败都保有可关闭的句柄。
|
|
96
|
+
self._uninstalled_reader = owner.iter_records(source)
|
|
97
|
+
self.readers[index] = self._uninstalled_reader
|
|
98
|
+
self._uninstalled_reader = None
|
|
99
|
+
for index in range(len(self.readers)):
|
|
100
|
+
self._advance(index)
|
|
101
|
+
except BaseException as exc:
|
|
102
|
+
# 子reader构造或注册失败可能尚未赋值;只接管尚未在本组槽位拥有的实际恢复句柄。
|
|
103
|
+
reader = getattr(exc, 'history_iterator_cleanup_owner', None)
|
|
104
|
+
if (reader is not None and self._uninstalled_reader is None
|
|
105
|
+
and not any(reader is installed for installed in self.readers)):
|
|
106
|
+
self._uninstalled_reader = reader
|
|
107
|
+
_cleanup_owner(self, exc, 'time_group_iterator_cleanup_owner', '时间组游标构造')
|
|
108
|
+
raise
|
|
109
|
+
|
|
110
|
+
def _advance(self, index: int) -> None:
|
|
111
|
+
"""略过保留在历史中的批次进度,读取该来源下一个真实更新。
|
|
112
|
+
|
|
113
|
+
参数: index为固定来源游标编号。返回: None,必要时heap增加一个前瞻。
|
|
114
|
+
异常: 历史损坏/读取错误传播;真实EOF由游标校验完整计数与摘要。
|
|
115
|
+
"""
|
|
116
|
+
for record in self.readers[index]:
|
|
117
|
+
# 所有来源已经EOF并seal,略过进度不会凭单批推断在线组完整。
|
|
118
|
+
if isinstance(record, HistoryProgress):
|
|
119
|
+
continue
|
|
120
|
+
previous = self.last_times[index]
|
|
121
|
+
if previous is not None and record.time_ns < previous:
|
|
122
|
+
raise ResultFormatError('解码历史重放时间回退')
|
|
123
|
+
self.last_times[index] = record.time_ns
|
|
124
|
+
# 一来源最多一个前瞻,index确保不同来源之间无需比较模型对象。
|
|
125
|
+
heapq.heappush(self.heap, (record.time_ns, index, record))
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
def __iter__(self) -> '_TimeGroupIterator':
|
|
129
|
+
"""返回当前独立组游标。
|
|
130
|
+
|
|
131
|
+
参数: 无。返回: self。异常: 无。
|
|
132
|
+
"""
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def __next__(self) -> DecodedTimeGroup:
|
|
136
|
+
"""一次提交全部同刻更新,跨批/跨来源不拆成部分上下文。
|
|
137
|
+
|
|
138
|
+
参数: 无。返回: 一个DecodedTimeGroup。
|
|
139
|
+
异常: StopIteration为全部历史校验完成;预算/损坏/关闭错误不丢组继续。
|
|
140
|
+
"""
|
|
141
|
+
if self.owner.closed:
|
|
142
|
+
raise ResultClosedError('解码历史已关闭')
|
|
143
|
+
if self.closed:
|
|
144
|
+
raise StopIteration
|
|
145
|
+
if self._closing:
|
|
146
|
+
raise ResultClosedError('完整时间组游标正在关闭')
|
|
147
|
+
# 上个组只在请求下一组或关闭时释放;调用方长期持有返回对象须自行预算。
|
|
148
|
+
self._current_group = None
|
|
149
|
+
if self._group_cost:
|
|
150
|
+
# 上个组实际释放后即清槽,返回取消也不能在close时再次扣同一笔借用金额。
|
|
151
|
+
_release_owned_ram(self, self._group_cost, '_group_cost')
|
|
152
|
+
if not self.heap:
|
|
153
|
+
self.close()
|
|
154
|
+
raise StopIteration
|
|
155
|
+
samples = []
|
|
156
|
+
time = self.heap[0][0]
|
|
157
|
+
try:
|
|
158
|
+
while self.heap and self.heap[0][0] == time:
|
|
159
|
+
_, index, record = heapq.heappop(self.heap)
|
|
160
|
+
cost = estimate_record_bytes(record)
|
|
161
|
+
# 每个record的直接预约成功后即登记,即使返回取消也由当前group唯一清理。
|
|
162
|
+
_reserve_owned_ram(self, cost, '_group_cost')
|
|
163
|
+
samples.append(record)
|
|
164
|
+
# 继续同来源直到更晚样本或真正EOF,确保跨批同刻组全部读齐。
|
|
165
|
+
self._advance(index)
|
|
166
|
+
# 排序仅规范同组跨列输出顺序,事件执行时仍原子应用整组而非按此顺序触发。
|
|
167
|
+
samples.sort(key=lambda item: (item.source_ref.source_name, item.sequence, item.name))
|
|
168
|
+
self._current_group = DecodedTimeGroup(time, tuple(samples))
|
|
169
|
+
return self._current_group
|
|
170
|
+
except BaseException as exc:
|
|
171
|
+
_cleanup_owner(self, exc, 'time_group_iterator_cleanup_owner', '时间组重放')
|
|
172
|
+
# 取消和既有AnalysisError原样传播,不用错误空组代替。
|
|
173
|
+
if isinstance(exc, (KeyboardInterrupt, SystemExit, AnalysisError)):
|
|
174
|
+
raise
|
|
175
|
+
error = AnalysisError('完整时间组重放失败')
|
|
176
|
+
# 保持已有AnalysisError包装合同;持续清理的顶层恢复入口在外层和原cause均可达。
|
|
177
|
+
recovery = getattr(exc, 'time_group_iterator_cleanup_owner', None)
|
|
178
|
+
if recovery is not None:
|
|
179
|
+
error.time_group_iterator_cleanup_owner = recovery
|
|
180
|
+
for note in getattr(exc, '__notes__', ()):
|
|
181
|
+
error.add_note(note)
|
|
182
|
+
raise error from exc
|
|
183
|
+
|
|
184
|
+
def close(self) -> None:
|
|
185
|
+
"""幂等关闭全部源游标并释放当前组/固定状态,不删除历史文件。
|
|
186
|
+
|
|
187
|
+
参数: 无。返回: None,重复关闭安全。
|
|
188
|
+
异常: 首个真实子关闭错误,仍尝试其余游标;预算/取消传播。
|
|
189
|
+
动作前失败保留所有权供重试,实际释放后的取消只完成最小关闭。
|
|
190
|
+
"""
|
|
191
|
+
if self.closed:
|
|
192
|
+
# 释放后登记移除中断可能留下已关闭孤儿,重试只修登记而不再扣账。
|
|
193
|
+
self.owner._groups.discard(self)
|
|
194
|
+
return
|
|
195
|
+
self._closing = True
|
|
196
|
+
first_error = None
|
|
197
|
+
try:
|
|
198
|
+
# 安装失败可能只留下局部子游标;即使同时在槽位中,子close也须幂等。
|
|
199
|
+
if self._uninstalled_reader is not None:
|
|
200
|
+
try:
|
|
201
|
+
self._uninstalled_reader.close()
|
|
202
|
+
except BaseException as exc:
|
|
203
|
+
first_error = exc
|
|
204
|
+
for reader in self.readers:
|
|
205
|
+
if reader is None:
|
|
206
|
+
continue
|
|
207
|
+
try:
|
|
208
|
+
reader.close()
|
|
209
|
+
except BaseException as exc:
|
|
210
|
+
if first_error is None:
|
|
211
|
+
first_error = exc
|
|
212
|
+
finally:
|
|
213
|
+
# 子资源未真正关闭时保留所有字段和组成本,不能丢句柄或提前解除登记。
|
|
214
|
+
children_closed = all(reader is None or reader.closed for reader in self.readers)
|
|
215
|
+
uninstalled_closed = self._uninstalled_reader is None or self._uninstalled_reader.closed
|
|
216
|
+
if children_closed and uninstalled_closed:
|
|
217
|
+
budget, cost = self.owner.budget, self._state_cost + self._group_cost
|
|
218
|
+
before, released = budget.ram_bytes, False
|
|
219
|
+
try:
|
|
220
|
+
# 本层两槽合计一次归还;空owner无需调用外部预算,也不扣任何子/借用金额。
|
|
221
|
+
if cost:
|
|
222
|
+
budget.release_ram(cost)
|
|
223
|
+
released = True
|
|
224
|
+
finally:
|
|
225
|
+
# 已抵销后先清成本/closed,再解除登记;动作前失败则完整保留供重试。
|
|
226
|
+
if released or budget.ram_bytes == before - cost:
|
|
227
|
+
self._held_cost -= cost
|
|
228
|
+
self.closed = True
|
|
229
|
+
self._state_cost = self._group_cost = 0
|
|
230
|
+
self.readers.clear()
|
|
231
|
+
self.heap.clear()
|
|
232
|
+
self.last_times.clear()
|
|
233
|
+
self._current_group = self._uninstalled_reader = None
|
|
234
|
+
self.owner._groups.discard(self)
|
|
235
|
+
if first_error is not None:
|
|
236
|
+
raise first_error
|