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,299 @@
|
|
|
1
|
+
"""把明确范围内的原帧写成新ASC或复用旧封装的BLF,同时保精确逐帧索引。
|
|
2
|
+
|
|
3
|
+
输入来自同次读取的新暂存,包含未参与分析和DBC未知的帧;不重新读日志/解码。
|
|
4
|
+
ASC时间用整数纳秒文本;BLF沿现有writer及float秒接口,其精度和错误帧能力限制
|
|
5
|
+
在清单记录,精确源时间和全部原字段保存在frames.jsonl。筛选使用分析坐标,
|
|
6
|
+
写出仍保原坐标,只有显式output_offset_ns才移动输出时间。关闭后独占发布目录。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, replace
|
|
10
|
+
from datetime import date, datetime, timedelta, timezone
|
|
11
|
+
from fractions import Fraction
|
|
12
|
+
import json
|
|
13
|
+
from math import isfinite
|
|
14
|
+
|
|
15
|
+
from ..core.models import Interval
|
|
16
|
+
from ..core.validation import require_identifier
|
|
17
|
+
from ..execution.history import _metadata_bytes
|
|
18
|
+
from ..legacy.records import LegacyRawFrame, StoredRawFrame, frame_to_dict
|
|
19
|
+
from ..legacy.export_write import LegacyCANProcessWrite
|
|
20
|
+
from ..sources.raw_can import RawCANRecord
|
|
21
|
+
from ..sources.text_can_decode import DecodedCANRecord
|
|
22
|
+
from ..timebase.conversion import require_int64_ns, checked_add_ns, convert_time
|
|
23
|
+
from .budget import _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
24
|
+
from .export_files import ExportFiles
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True)
|
|
28
|
+
class FrameExportSpec:
|
|
29
|
+
"""选择目标格式及明确的输出时间平移;范围仍使用分析坐标,不随平移变化。"""
|
|
30
|
+
|
|
31
|
+
format: str = 'asc'
|
|
32
|
+
output_offset_ns: int = 0
|
|
33
|
+
source_time_reference: str = 'relative'
|
|
34
|
+
capture_date: str | None = None
|
|
35
|
+
timezone_offset_minutes: int | None = None
|
|
36
|
+
|
|
37
|
+
def __post_init__(self):
|
|
38
|
+
"""核格式与时间。参数: 无。返回: None。异常: 不支持格式或非法偏移。
|
|
39
|
+
"""
|
|
40
|
+
if self.format not in ('asc','blf') or type(self.output_offset_ns) is not int:
|
|
41
|
+
raise ValueError('原帧导出需要asc/blf和整数偏移')
|
|
42
|
+
require_int64_ns(self.output_offset_ns,'frame_export.output_offset_ns')
|
|
43
|
+
# 时间基准是声明事实,不能用偏移或大数值绕过用户要求的真实日期。
|
|
44
|
+
if self.source_time_reference not in ('relative','epoch'):
|
|
45
|
+
raise ValueError('必须明确源时间为relative或epoch,不能按数字大小猜日期')
|
|
46
|
+
if (self.capture_date is None)!=(self.timezone_offset_minutes is None):
|
|
47
|
+
raise ValueError('采集日期和时区必须一起填写')
|
|
48
|
+
if self.capture_date is not None:
|
|
49
|
+
if (type(self.capture_date) is not str or len(self.capture_date)!=10
|
|
50
|
+
or date.fromisoformat(self.capture_date).isoformat()!=self.capture_date
|
|
51
|
+
or type(self.timezone_offset_minutes) is not int
|
|
52
|
+
or not -1439<=self.timezone_offset_minutes<=1439):
|
|
53
|
+
raise ValueError('需要YYYY-MM-DD实际采集日期及合法整数时区分钟')
|
|
54
|
+
if self.source_time_reference=='epoch':
|
|
55
|
+
raise ValueError('已有绝对时间不能重复叠加采集日期')
|
|
56
|
+
if self.format=='blf' and self.source_time_reference=='relative' and self.capture_date is None:
|
|
57
|
+
raise ValueError('BLF导出前必须填写实际采集日期和时区')
|
|
58
|
+
|
|
59
|
+
def date_origin_ns(self):
|
|
60
|
+
"""把日内零点映射到实际当地午夜。参数: 无。返回: 精确UTC纳秒或0。异常: int64溢出。
|
|
61
|
+
"""
|
|
62
|
+
if self.capture_date is None:
|
|
63
|
+
return 0
|
|
64
|
+
# 用整数日/秒换算;机器本地时区及浮点timestamp都不参与日期映射。
|
|
65
|
+
midnight=datetime.combine(date.fromisoformat(self.capture_date),datetime.min.time(),
|
|
66
|
+
timezone(timedelta(minutes=self.timezone_offset_minutes)))
|
|
67
|
+
delta=midnight-datetime(1970,1,1,tzinfo=timezone.utc)
|
|
68
|
+
value=(delta.days*86400+delta.seconds)*10**9
|
|
69
|
+
require_int64_ns(value,'frame_export.date_origin_ns')
|
|
70
|
+
return value
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class ExportCANFrame:
|
|
75
|
+
"""统一真实/生成记录;保分析坐标、原输出坐标、完整原帧和有限原始定位。"""
|
|
76
|
+
|
|
77
|
+
sequence: int
|
|
78
|
+
time_ns: int
|
|
79
|
+
output_time_ns: int
|
|
80
|
+
frame: LegacyRawFrame
|
|
81
|
+
provenance: tuple[tuple[str,str | int | float | bool | None],...]
|
|
82
|
+
frame_origin: str = 'passthrough'
|
|
83
|
+
|
|
84
|
+
def __post_init__(self):
|
|
85
|
+
"""核静态字段。参数: 无。返回: None。异常: 类型、范围、重复定位或非有限值。
|
|
86
|
+
"""
|
|
87
|
+
if type(self.sequence) is not int or self.sequence<0 or type(self.frame) is not LegacyRawFrame:
|
|
88
|
+
raise TypeError('导出帧需要非负原序及LegacyRawFrame')
|
|
89
|
+
require_int64_ns(self.time_ns); require_int64_ns(self.output_time_ns)
|
|
90
|
+
if self.frame_origin not in ('passthrough','generated') or type(self.provenance) is not tuple or len(self.provenance)>32:
|
|
91
|
+
raise ValueError('导出帧种类或定位非法')
|
|
92
|
+
keys=set()
|
|
93
|
+
for pair in self.provenance:
|
|
94
|
+
if (type(pair) is not tuple or len(pair)!=2 or type(pair[0]) is not str or not pair[0]
|
|
95
|
+
or type(pair[1]) not in (str,int,float,bool,type(None))):
|
|
96
|
+
raise TypeError('帧定位需要有限键值tuple')
|
|
97
|
+
if pair[0] in keys or type(pair[1]) is float and not isfinite(pair[1]):
|
|
98
|
+
raise ValueError('帧定位重复或非有限')
|
|
99
|
+
keys.add(pair[0])
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
@dataclass(frozen=True)
|
|
103
|
+
class SkippedCANFrame:
|
|
104
|
+
"""保存重建未生成的网格点;不是原帧,不进入ASC/BLF,也不伪装成零载荷。"""
|
|
105
|
+
|
|
106
|
+
time_ns: int
|
|
107
|
+
reason: str
|
|
108
|
+
details: str
|
|
109
|
+
|
|
110
|
+
def __post_init__(self):
|
|
111
|
+
"""核有界诊断。参数: 无。返回: None。异常: 时间、原因或文本非法。
|
|
112
|
+
"""
|
|
113
|
+
require_int64_ns(self.time_ns)
|
|
114
|
+
if type(self.reason) is not str or not self.reason or type(self.details) is not str or len(self.details.encode('utf-8'))>60000:
|
|
115
|
+
raise ValueError('未生成帧需要有限原因及JSON说明文本')
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def as_export_frame(record, *, compact=False):
|
|
119
|
+
"""保既有原帧及原坐标,转换有限导出外壳。参数: 真实文本/暂存/已统一帧,compact不构造追溯。返回: ExportCANFrame。异常: 类型错。
|
|
120
|
+
"""
|
|
121
|
+
if type(record) is ExportCANFrame:
|
|
122
|
+
return record
|
|
123
|
+
if type(record) is StoredRawFrame:
|
|
124
|
+
# 旧BLF原float秒与分析offset分开,不把映射后的时间回写原报文。
|
|
125
|
+
converted=convert_time(record.frame.timestamp,'s')
|
|
126
|
+
return ExportCANFrame(record.sequence,record.time_ns,converted.time_ns,record.frame,
|
|
127
|
+
() if compact else (('profile','sclicer-functions-v1'),('yield_sequence',record.sequence),
|
|
128
|
+
('timestamp',record.frame.timestamp),('time_quantized',converted.quantized)))
|
|
129
|
+
if type(record) in (RawCANRecord,DecodedCANRecord):
|
|
130
|
+
raw=record.raw if type(record) is DecodedCANRecord else record
|
|
131
|
+
provenance=() if compact else (('path',str(raw.path)),('line_number',raw.line_number),('parser_version',raw.parser_version),
|
|
132
|
+
('record_sequence',raw.sequence),('raw_time',raw.raw_time),('time_quantized',raw.time_quantized))
|
|
133
|
+
if not compact and type(record) is DecodedCANRecord:
|
|
134
|
+
provenance+=(('input_index',record.input_index),('decode_status',record.status))
|
|
135
|
+
# 分析offset只决定筛选位置;导出日期应叠加原始日内时间,不能叠加归零后的分析时间。
|
|
136
|
+
source_ns=raw.time_ns if raw.source_time_ns is None else raw.source_time_ns
|
|
137
|
+
return ExportCANFrame(record.sequence,raw.time_ns,source_ns,raw.frame,provenance)
|
|
138
|
+
raise TypeError('帧导出需要同次原始/解码暂存记录')
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _asc_line(record,output_ns):
|
|
142
|
+
"""写标准ASC数据行及无法表达的原字段名单。参数: record、非负精确输出ns。返回: (bytes,losses)。异常: 格式不可表达。
|
|
143
|
+
"""
|
|
144
|
+
frame=record.frame
|
|
145
|
+
if frame.is_rx is None:
|
|
146
|
+
raise ValueError('原始报文导出需要收发方向is_rx,不能把未知方向写为Tx或Rx')
|
|
147
|
+
if output_ns<0 or type(frame.channel) is not int or not 0<=frame.channel<65536:
|
|
148
|
+
raise ValueError('ASC需要非负时间和明确0基整数通道')
|
|
149
|
+
seconds,nanos=divmod(output_ns,10**9)
|
|
150
|
+
prefix=f'{seconds}.{nanos:09d}'
|
|
151
|
+
channel=str(frame.channel+1); direction='Rx' if frame.is_rx else 'Tx'
|
|
152
|
+
identifier=format(frame.arbitration_id,'x')+('x' if frame.is_extended_id else '')
|
|
153
|
+
if not frame.is_extended_id and frame.arbitration_id>0x7ff:
|
|
154
|
+
raise ValueError('ASC标准帧ID超出11位')
|
|
155
|
+
if frame.is_error_frame:
|
|
156
|
+
# 标准错误行不能保存数据帧附加字段;完整原值保在索引,清单明确格式损失。
|
|
157
|
+
expected={'arbitration_id':0,'is_extended_id':False,'dlc':0,'data':b'',
|
|
158
|
+
'bitrate_switch':False,'error_state_indicator':False,'is_remote_frame':False}
|
|
159
|
+
if not frame.is_fd:
|
|
160
|
+
expected['is_rx']=True
|
|
161
|
+
losses=tuple(k for k,v in expected.items() if getattr(frame,k)!=v)
|
|
162
|
+
body=f'CANFD {channel} {direction} ErrorFrame' if frame.is_fd else f'{channel} ErrorFrame'
|
|
163
|
+
else:
|
|
164
|
+
losses=()
|
|
165
|
+
if frame.is_remote_frame:
|
|
166
|
+
if frame.is_fd or frame.data or not 0<=frame.dlc<=8:
|
|
167
|
+
raise ValueError('ASC远程帧需要经典CAN、空数据和0至8 DLC')
|
|
168
|
+
body=f'{channel} {identifier} {direction} r {frame.dlc:x}'
|
|
169
|
+
elif frame.is_fd:
|
|
170
|
+
lengths=(0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64)
|
|
171
|
+
if frame.dlc!=len(frame.data) or frame.dlc not in lengths:
|
|
172
|
+
raise ValueError('ASC FD长度或DLC不一致')
|
|
173
|
+
body=f'CANFD {channel} {direction} {identifier} {int(frame.bitrate_switch)} {int(frame.error_state_indicator)} {lengths.index(frame.dlc):x} {frame.dlc} '+frame.data.hex(' ')
|
|
174
|
+
else:
|
|
175
|
+
if frame.dlc!=len(frame.data) or frame.dlc>8:
|
|
176
|
+
raise ValueError('ASC经典帧长度不一致')
|
|
177
|
+
body=f'{channel} {identifier} {direction} d {frame.dlc:x} '+frame.data.hex(' ')
|
|
178
|
+
if not frame.is_fd:
|
|
179
|
+
losses=tuple(k for k in ('bitrate_switch','error_state_indicator') if getattr(frame,k))
|
|
180
|
+
return (prefix+' '+body.rstrip()+'\n').encode('ascii'),losses
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def export_can_frames(records,spec,interval,destination,budget,*,source,device_label,check_cancel=None,compact=False,integrity=True,file_consumer=None):
|
|
184
|
+
"""逐条筛选并写出原始范围,完整消费新暂存后发布。
|
|
185
|
+
|
|
186
|
+
参数: records同次可关闭原帧流;spec格式/偏移;interval半开分析范围;destination新目录;
|
|
187
|
+
budget共享账本;source来源名;device_label设备;check_cancel取消回调;
|
|
188
|
+
compact关闭逐帧副本/三时间/误差计算,仅保目标帧和必要清单。
|
|
189
|
+
返回: 已发布目录Path,含frames.asc/blf和manifest.json;旧完整模式另有frames.jsonl。
|
|
190
|
+
异常: 格式/时间/原历史/I/O/预算/取消错;持续清理失败保export_cleanup_owner。
|
|
191
|
+
"""
|
|
192
|
+
if type(compact) is not bool:
|
|
193
|
+
raise TypeError('compact必须为bool')
|
|
194
|
+
if type(spec) is not FrameExportSpec or type(interval) is not Interval:
|
|
195
|
+
raise TypeError('帧导出需要FrameExportSpec和Interval')
|
|
196
|
+
require_identifier(source,'frame_export.source')
|
|
197
|
+
if device_label not in ('home','work') or check_cancel is not None and not callable(check_cancel):
|
|
198
|
+
raise ValueError('帧导出需要实际设备及可选取消回调')
|
|
199
|
+
date_origin=spec.date_origin_ns()
|
|
200
|
+
output_offset=checked_add_ns(date_origin,spec.output_offset_ns)
|
|
201
|
+
if file_consumer is not None and not callable(file_consumer):
|
|
202
|
+
raise TypeError('file_consumer须为回调')
|
|
203
|
+
owner=ExportFiles(destination,budget,integrity=integrity)
|
|
204
|
+
try:
|
|
205
|
+
if not compact:
|
|
206
|
+
owner.open_file('frames.jsonl')
|
|
207
|
+
if spec.format=='asc':
|
|
208
|
+
owner.select_file('frames.asc')
|
|
209
|
+
owner.append(b'base hex timestamps absolute\nno internal events logged\n')
|
|
210
|
+
else:
|
|
211
|
+
try:
|
|
212
|
+
owner.worker=LegacyCANProcessWrite(budget,owner.temporary/'frames.blf')
|
|
213
|
+
except BaseException as error:
|
|
214
|
+
owner.worker=getattr(error,'can_process_write_cleanup_owner',None)
|
|
215
|
+
raise
|
|
216
|
+
owner.reader=iter(records)
|
|
217
|
+
reconstruction=getattr(owner.reader,'export_metadata',None)
|
|
218
|
+
if reconstruction is not None:
|
|
219
|
+
_reserve_owned_ram(owner,_metadata_bytes(reconstruction)*16,'_fixed_cost')
|
|
220
|
+
count=generated=limited=skipped=0
|
|
221
|
+
max_float_error=0
|
|
222
|
+
last=None
|
|
223
|
+
for raw in owner.reader:
|
|
224
|
+
if check_cancel is not None:
|
|
225
|
+
check_cancel()
|
|
226
|
+
_reserve_owned_ram(owner,1048576+(_metadata_bytes(raw.provenance)*16
|
|
227
|
+
if type(raw) is ExportCANFrame else len(raw.details.encode('utf-8'))*16
|
|
228
|
+
if type(raw) is SkippedCANFrame else 0),'_row_cost')
|
|
229
|
+
try:
|
|
230
|
+
if type(raw) is SkippedCANFrame:
|
|
231
|
+
if last is not None and raw.time_ns<last:
|
|
232
|
+
raise ValueError('未生成帧记录时间回退')
|
|
233
|
+
last=raw.time_ns
|
|
234
|
+
if interval.start_ns<=raw.time_ns<interval.end_ns:
|
|
235
|
+
if not compact:
|
|
236
|
+
owner.select_file('skipped_frames.jsonl')
|
|
237
|
+
owner.append((json.dumps({'time_ns':raw.time_ns,'reason':raw.reason,'details':raw.details},
|
|
238
|
+
ensure_ascii=False,separators=(',',':'))+'\n').encode('utf-8'))
|
|
239
|
+
skipped+=1
|
|
240
|
+
continue
|
|
241
|
+
record=as_export_frame(raw,compact=True) if compact else as_export_frame(raw)
|
|
242
|
+
if last is not None and record.time_ns<last:
|
|
243
|
+
raise ValueError('导出帧时间回退,不能重排原记录')
|
|
244
|
+
last=record.time_ns
|
|
245
|
+
if not interval.start_ns<=record.time_ns<interval.end_ns:
|
|
246
|
+
continue
|
|
247
|
+
if record.frame.is_rx is None:
|
|
248
|
+
raise ValueError('原始报文导出需要收发方向is_rx')
|
|
249
|
+
output_ns=checked_add_ns(record.output_time_ns,output_offset)
|
|
250
|
+
if spec.format=='asc':
|
|
251
|
+
payload,losses=_asc_line(record,output_ns)
|
|
252
|
+
owner.select_file('frames.asc'); owner.append(payload)
|
|
253
|
+
else:
|
|
254
|
+
# 不调用旧库的隐式“相对时间头归零”分支;缺日期先要求显式映射。
|
|
255
|
+
if output_ns<631152000*10**9:
|
|
256
|
+
raise ValueError('现有BLF写库不支持1990年以前的日期,不能改写为固定参考日期')
|
|
257
|
+
if type(record.frame.channel) is not int or not 0<=record.frame.channel<65535:
|
|
258
|
+
raise ValueError('BLF需要0至65534的明确整数通道,避免写库隐式改通道')
|
|
259
|
+
# 库接口仅接受float秒;记录转换误差,同时以整数索引保留精确真值。
|
|
260
|
+
timestamp=output_ns/10**9
|
|
261
|
+
if not compact:
|
|
262
|
+
delta=abs(Fraction(timestamp)*10**9-output_ns)
|
|
263
|
+
max_float_error=max(max_float_error,(delta.numerator+delta.denominator-1)//delta.denominator)
|
|
264
|
+
owner.worker.write(replace(record.frame,timestamp=timestamp))
|
|
265
|
+
losses=('error_frame_flags_or_payload',) if record.frame.is_error_frame else ()
|
|
266
|
+
if not compact:
|
|
267
|
+
owner.select_file('frames.jsonl')
|
|
268
|
+
packet={'index':count,'source':source,'sequence':record.sequence,'analysis_time_ns':record.time_ns,
|
|
269
|
+
'source_time_ns':record.output_time_ns,'output_time_ns':output_ns,'frame_origin':record.frame_origin,
|
|
270
|
+
'provenance':dict(record.provenance),'frame':frame_to_dict(record.frame),'format_limits':losses}
|
|
271
|
+
owner.append((json.dumps(packet,ensure_ascii=False,allow_nan=False,separators=(',',':'))+'\n').encode('utf-8'))
|
|
272
|
+
count+=1; generated+=record.frame_origin=='generated'; limited+=bool(losses)
|
|
273
|
+
finally:
|
|
274
|
+
_release_owned_ram(owner,owner._row_cost,'_row_cost')
|
|
275
|
+
owner.close_reader()
|
|
276
|
+
# 旧写进程真正结束后才能回读摘要;文件没关、摘要失败均不发布正式目录。
|
|
277
|
+
if owner.worker is not None:
|
|
278
|
+
owner.worker.finish()
|
|
279
|
+
owner.worker=None
|
|
280
|
+
owner.register_external('frames.blf')
|
|
281
|
+
metadata={'frame_origin':'can_frames','device_label':device_label,'source':source,'format':spec.format,
|
|
282
|
+
'range_ns':(interval.start_ns,interval.end_ns),'output_offset_ns':spec.output_offset_ns,
|
|
283
|
+
'source_time_reference':spec.source_time_reference,'capture_date':spec.capture_date,
|
|
284
|
+
'timezone_offset_minutes':spec.timezone_offset_minutes,'date_origin_ns':date_origin,
|
|
285
|
+
'frames':count,'generated':generated,'passthrough':count-generated,'format_limited_frames':limited,
|
|
286
|
+
'skipped_grid_points':skipped,
|
|
287
|
+
'reconstruction':reconstruction,
|
|
288
|
+
'time_precision':'integer_ns_text' if spec.format=='asc' else 'legacy_float_seconds',
|
|
289
|
+
}
|
|
290
|
+
if compact:
|
|
291
|
+
metadata['row_format']='compact-v2'
|
|
292
|
+
else:
|
|
293
|
+
metadata.update(max_float_conversion_error_ns=max_float_error,exact_source_index='frames.jsonl')
|
|
294
|
+
output=owner.finish(metadata)
|
|
295
|
+
if file_consumer is not None: file_consumer(tuple(owner.files))
|
|
296
|
+
return output
|
|
297
|
+
except BaseException as error:
|
|
298
|
+
_cleanup_owner(owner,error,'export_cleanup_owner','原始报文导出')
|
|
299
|
+
raise
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""用已有DBC位域工具更新明确的连续信号,其他位沿用同一基础帧。
|
|
2
|
+
|
|
3
|
+
调用者传入本次已加载的cantools Message及本次已解码的物理值,不再次读取DBC
|
|
4
|
+
或解码原帧。整数按nearest_even-v1量化,浮点沿DBC编码后核实际表示误差。
|
|
5
|
+
码值或物理值越界立即拒绝。只更新选中位的掩码,计数、校验及未知位保持;
|
|
6
|
+
这些生成帧不承诺校验码有效或可用于车辆回放。
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, replace
|
|
10
|
+
from fractions import Fraction
|
|
11
|
+
from math import isfinite
|
|
12
|
+
|
|
13
|
+
from .budget import _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
14
|
+
from ..legacy.records import normalize_frame_id
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class FrameRebuildRule:
|
|
19
|
+
"""明确报文身份、连续字段及禁止插值的字段;声明不能从名字猜业务含义。"""
|
|
20
|
+
|
|
21
|
+
channel: int
|
|
22
|
+
frame_id: int
|
|
23
|
+
continuous: tuple[str,...]
|
|
24
|
+
is_extended: bool | None = None # 省略时按实际帧与DBC确定,不等同标准帧。
|
|
25
|
+
is_fd: bool | None = None # 省略时保留输入帧的实际CAN/FD类型。
|
|
26
|
+
protected: tuple[str,...] = ()
|
|
27
|
+
same_time_policy: str = 'error'
|
|
28
|
+
|
|
29
|
+
def __post_init__(self):
|
|
30
|
+
"""核身份和字段分类。参数: 无。返回: None。异常: 非法/重复/保护字段冲突。
|
|
31
|
+
"""
|
|
32
|
+
# ID只在规则建立时归一化,避免每个输出帧重新解释进制。
|
|
33
|
+
object.__setattr__(self,'frame_id',normalize_frame_id(self.frame_id))
|
|
34
|
+
if (type(self.channel) is not int or self.channel<0
|
|
35
|
+
or self.is_extended is False and self.frame_id>0x7ff
|
|
36
|
+
or self.is_extended is not None and type(self.is_extended) is not bool
|
|
37
|
+
or self.is_fd is not None and type(self.is_fd) is not bool
|
|
38
|
+
or self.same_time_policy not in ('error','last_by_sequence')):
|
|
39
|
+
raise ValueError('报文重建身份或同刻策略非法')
|
|
40
|
+
for names in (self.continuous,self.protected):
|
|
41
|
+
if type(names) is not tuple or len(names)>4096 or any(type(n) is not str or not n for n in names) or len(set(names))!=len(names):
|
|
42
|
+
raise ValueError('报文重建字段需要唯一非空名称tuple')
|
|
43
|
+
if not self.continuous or set(self.continuous)&set(self.protected):
|
|
44
|
+
raise ValueError('必须选择连续量,且不能插值保护的计数或校验字段')
|
|
45
|
+
|
|
46
|
+
def matches(self,frame):
|
|
47
|
+
"""按实际帧身份匹配。参数: frame原帧。返回: bool。异常: 原模型访问错。
|
|
48
|
+
"""
|
|
49
|
+
return (frame.channel==self.channel and frame.arbitration_id==self.frame_id
|
|
50
|
+
and (self.is_extended is None or frame.is_extended_id==self.is_extended)
|
|
51
|
+
and (self.is_fd is None or frame.is_fd==self.is_fd))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class DBCFramePatch:
|
|
55
|
+
"""借用一条已加载DBC定义,拥有选中位格式与预算;只缓存当前复用布局。"""
|
|
56
|
+
|
|
57
|
+
def __init__(self,rule,message,budget):
|
|
58
|
+
"""核DBC身份与连续字段并预约格式空间。参数: rule/message/budget。返回: patcher。异常: 不匹配或预算错。
|
|
59
|
+
"""
|
|
60
|
+
if type(rule) is not FrameRebuildRule:
|
|
61
|
+
raise TypeError('需要FrameRebuildRule')
|
|
62
|
+
self.rule=rule; self.message=message; self._budget=budget
|
|
63
|
+
self._held_cost=self._fixed_cost=0; self._closed=False
|
|
64
|
+
self.signals={}; self.formats=None; self.active=(); self.mask=0
|
|
65
|
+
self._identity=None
|
|
66
|
+
try:
|
|
67
|
+
_reserve_owned_ram(self,262144+len(message.signals)*16384,'_fixed_cost')
|
|
68
|
+
if (message.frame_id!=rule.frame_id
|
|
69
|
+
or rule.is_extended is not None and message.is_extended_frame!=rule.is_extended
|
|
70
|
+
or rule.is_fd is True and not message.is_fd
|
|
71
|
+
or not 0<message.length<=64 or message.is_container):
|
|
72
|
+
raise ValueError('重建规则与DBC报文身份/载荷不符或为容器报文')
|
|
73
|
+
self.signals={signal.name:signal for signal in message.signals}
|
|
74
|
+
for name in (*rule.continuous,*rule.protected):
|
|
75
|
+
if name not in self.signals:
|
|
76
|
+
raise ValueError('DBC缺少重建声明字段: '+name)
|
|
77
|
+
for name in rule.continuous:
|
|
78
|
+
signal=self.signals[name]
|
|
79
|
+
if signal.is_multiplexer or signal.choices or not signal.scale or signal.length==1:
|
|
80
|
+
raise ValueError('复用选择器、枚举/布尔或零倍率不能当连续量: '+name)
|
|
81
|
+
except BaseException as error:
|
|
82
|
+
_cleanup_owner(self,error,'frame_patch_cleanup_owner','DBC位域重建构造')
|
|
83
|
+
raise
|
|
84
|
+
|
|
85
|
+
def accept_frame(self,frame):
|
|
86
|
+
"""检查实际基础帧与选定DBC,并识别自动规则后续出现的帧型冲突。
|
|
87
|
+
|
|
88
|
+
参数: frame为同次输入原帧。返回: None。异常: ValueError为类型不匹配或歧义。
|
|
89
|
+
副作用: 只记录首次匹配的两个类型标志,后续同型帧不扩大状态。
|
|
90
|
+
"""
|
|
91
|
+
if (not self.rule.matches(frame) or frame.is_extended_id!=self.message.is_extended_frame
|
|
92
|
+
or frame.is_fd and not self.message.is_fd):
|
|
93
|
+
raise ValueError('重建实际帧与已选DBC类型不符')
|
|
94
|
+
identity=(frame.is_extended_id,frame.is_fd)
|
|
95
|
+
if self._identity is not None and self._identity!=identity:
|
|
96
|
+
flag='is_extended' if self._identity[0]!=identity[0] else 'is_fd'
|
|
97
|
+
raise ValueError('重建规则匹配多种实际帧类型,请补充'+flag)
|
|
98
|
+
self._identity=identity
|
|
99
|
+
|
|
100
|
+
def selected(self,layout):
|
|
101
|
+
"""只取当前复用分支适用的连续字段。参数: layout原生选择器码值tuple。返回: 名称tuple。异常: 布局非法。
|
|
102
|
+
"""
|
|
103
|
+
selectors=dict(layout)
|
|
104
|
+
if len(selectors)!=len(layout) or any(name not in self.signals or not self.signals[name].is_multiplexer
|
|
105
|
+
or type(value) is not int for name,value in layout):
|
|
106
|
+
raise ValueError('报文复用布局不合法')
|
|
107
|
+
selected=[]
|
|
108
|
+
for name in self.rule.continuous:
|
|
109
|
+
signal=self.signals[name]; visited=set(); applicable=True
|
|
110
|
+
# 沿真实父选择器判断,避免将另一分支同位置的位当作本连续量。
|
|
111
|
+
while signal.multiplexer_signal is not None:
|
|
112
|
+
parent=signal.multiplexer_signal
|
|
113
|
+
if parent in visited or parent not in self.signals:
|
|
114
|
+
raise ValueError('DBC复用父链非法')
|
|
115
|
+
visited.add(parent)
|
|
116
|
+
if parent not in selectors or selectors[parent] not in signal.multiplexer_ids:
|
|
117
|
+
applicable=False; break
|
|
118
|
+
signal=self.signals[parent]
|
|
119
|
+
if applicable:
|
|
120
|
+
selected.append(name)
|
|
121
|
+
return tuple(selected)
|
|
122
|
+
|
|
123
|
+
def patch(self,base,values,layout,*,exact_values=None,trace=True):
|
|
124
|
+
"""仅按允许掩码更新载荷并记录量化误差。
|
|
125
|
+
|
|
126
|
+
参数: base同一基础LegacyRawFrame;values所需物理估计dict;layout实际复用布局;
|
|
127
|
+
exact_values可选的有理数编码目标,用于避免中间float改变半码决策。
|
|
128
|
+
返回: (新帧, 每字段目标/码值/实际值/误差tuple)。异常: 缺值、范围/格式/编码错误。
|
|
129
|
+
"""
|
|
130
|
+
if self._closed or not self.rule.matches(base) or base.dlc!=self.message.length or len(base.data)!=self.message.length:
|
|
131
|
+
raise ValueError('重建基础帧已关闭、身份或长度不符')
|
|
132
|
+
self.accept_frame(base)
|
|
133
|
+
selected=self.selected(layout)
|
|
134
|
+
if not selected or set(values)!=set(selected):
|
|
135
|
+
raise ValueError('当前复用布局缺少必须的连续值')
|
|
136
|
+
if exact_values is not None and (set(exact_values)!=set(selected) or any(type(v) is not Fraction for v in exact_values.values())):
|
|
137
|
+
raise ValueError('精确量化目标需要同组Fraction字段')
|
|
138
|
+
from cantools.database.utils import create_encode_decode_formats,encode_data,decode_data
|
|
139
|
+
if selected!=self.active:
|
|
140
|
+
# 编解码格式来自现有库;仅所选信号的非padding位允许改变。
|
|
141
|
+
self.formats=create_encode_decode_formats([self.signals[n] for n in selected],self.message.length)
|
|
142
|
+
self.mask=((1<<(self.message.length*8))-1)^self.formats.padding_mask
|
|
143
|
+
self.active=selected
|
|
144
|
+
raw={}
|
|
145
|
+
for name in selected:
|
|
146
|
+
signal=self.signals[name]; value=values[name]
|
|
147
|
+
if type(value) not in (int,float) or not isfinite(value):
|
|
148
|
+
raise ValueError('重建物理值必须有限: '+name)
|
|
149
|
+
physical=Fraction(str(value)) if exact_values is None else exact_values[name]
|
|
150
|
+
scale=Fraction(str(signal.scale)); offset=Fraction(str(signal.offset))
|
|
151
|
+
if ((signal.minimum is not None and physical<Fraction(str(signal.minimum)))
|
|
152
|
+
or (signal.maximum is not None and physical>Fraction(str(signal.maximum)))):
|
|
153
|
+
raise ValueError('重建目标物理值越界: '+name)
|
|
154
|
+
code=(physical-offset)/scale
|
|
155
|
+
if signal.is_float:
|
|
156
|
+
raw[name]=float(code)
|
|
157
|
+
else:
|
|
158
|
+
# Fraction的round精确实现最近整数/恰半取偶,负倍率和负值同样适用。
|
|
159
|
+
integer=round(code)
|
|
160
|
+
low=-(1<<(signal.length-1)) if signal.is_signed else 0
|
|
161
|
+
high=(1<<(signal.length-int(signal.is_signed)))-1
|
|
162
|
+
if not low<=integer<=high:
|
|
163
|
+
raise ValueError('重建码值超出位宽: '+name)
|
|
164
|
+
raw[name]=integer
|
|
165
|
+
fields=[self.signals[n] for n in selected]
|
|
166
|
+
encoded=encode_data(raw,fields,self.formats,scaling=False)
|
|
167
|
+
payload=((int.from_bytes(base.data,'big')&~self.mask)|(encoded&self.mask)).to_bytes(self.message.length,'big')
|
|
168
|
+
decoded=decode_data(payload,self.message.length,fields,self.formats,False,True,False,False)
|
|
169
|
+
facts=[]
|
|
170
|
+
for name in selected:
|
|
171
|
+
signal=self.signals[name]; actual=decoded[name]
|
|
172
|
+
if (not isfinite(actual) or signal.minimum is not None and actual<signal.minimum
|
|
173
|
+
or signal.maximum is not None and actual>signal.maximum):
|
|
174
|
+
raise ValueError('重建量化后物理值越界: '+name)
|
|
175
|
+
if trace:
|
|
176
|
+
target=Fraction(str(values[name])) if exact_values is None else exact_values[name]
|
|
177
|
+
facts.append((name,float(target),raw[name],actual,float(Fraction(str(actual))-target)))
|
|
178
|
+
return replace(base,data=payload),tuple(facts)
|
|
179
|
+
|
|
180
|
+
def close(self):
|
|
181
|
+
"""释放本格式缓存,不关闭借用DBC。参数: 无。返回: None。异常: 费用释放错可重试。
|
|
182
|
+
"""
|
|
183
|
+
if self._closed:
|
|
184
|
+
return
|
|
185
|
+
self.signals.clear(); self.formats=None; self.message=None; self.active=()
|
|
186
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost'); self._closed=True
|