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,526 @@
|
|
|
1
|
+
"""在独立进程中逐次请求旧CAN函数,确认退出后才交付完整EOF。
|
|
2
|
+
|
|
3
|
+
输入是冻结的单BLF请求和借用ResourceBudget,输出原函数已经返回的
|
|
4
|
+
LegacyDecodedFrame。构造不启动进程;start只初始化旧DBC和公开元数据;
|
|
5
|
+
每次next只授权一个PULL,不预取下一帧,也不改变原读取或解码参数。
|
|
6
|
+
原reader没有公开的可靠关闭接口,因此本层关闭自己的管道并等待或终止
|
|
7
|
+
自己启动的进程。只有确认退出才释放进程责任;这没有修复旧reader。
|
|
8
|
+
|
|
9
|
+
固定状态、IPC最大包、元数据和当前记录分别计入新层保守RAM费用。
|
|
10
|
+
旧DBC、旧reader和解释器的整进程RSS未测,不能由本账本上限代替。
|
|
11
|
+
本层不写源文件、不导出BLF、不关闭借用账本或其他read。失败时保留原父
|
|
12
|
+
异常;清理仍失败时以can_process_read_cleanup_owner暴露同一真实owner。
|
|
13
|
+
跨进程只能保留远端异常事实,不能承诺远端异常对象与父对象相同。
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
# 进程和传输对象仅在start中建立,普通导入不加载CAN库或DBC。
|
|
17
|
+
from collections.abc import Mapping
|
|
18
|
+
import multiprocessing
|
|
19
|
+
import platform
|
|
20
|
+
from sys import getsizeof
|
|
21
|
+
from types import MappingProxyType
|
|
22
|
+
|
|
23
|
+
# 原样数据模型和有界JSON协议由worker与父进程共用,不接任意pickle对象。
|
|
24
|
+
from .records import (MAX_WIRE_BYTES, LegacyCANRequest, decode_packet,
|
|
25
|
+
decoded_from_dict, encode_packet, field_from_dict, field_to_dict)
|
|
26
|
+
from .worker import VENDOR_SHA256, worker_main
|
|
27
|
+
from ..results.budget import ResourceBudget
|
|
28
|
+
from ..results.errors import AnalysisError, ResultClosedError
|
|
29
|
+
from ..results.spool import _cleanup_owner, _release_owned_ram, _reserve_owned_ram
|
|
30
|
+
from ..sources.protocol import SourceReadError
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _wire_metadata_bytes(value):
|
|
34
|
+
"""估算已通过有界wire检查的JSON树,复制冻结前先预约保留费用。
|
|
35
|
+
|
|
36
|
+
参数: value为decode_packet得到的dict/list/原生标量。返回: 基础字节估算。
|
|
37
|
+
异常: TypeError为内部未校验类型;不借用只接受冻结tuple的历史元数据估算器。
|
|
38
|
+
"""
|
|
39
|
+
# wire的深度与总字节已校验;按原容器计数即可,不先复制成冻结树。
|
|
40
|
+
if type(value) is dict:
|
|
41
|
+
return getsizeof(value) + sum(128 + _wire_metadata_bytes(key)
|
|
42
|
+
+ _wire_metadata_bytes(item) for key, item in value.items())
|
|
43
|
+
if type(value) is list:
|
|
44
|
+
return getsizeof(value) + sum(32 + _wire_metadata_bytes(item) for item in value)
|
|
45
|
+
if value is None or type(value) in (str, int, bool, float):
|
|
46
|
+
return getsizeof(value) + 64
|
|
47
|
+
raise TypeError('旧CAN元数据只接受已校验JSON树')
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _freeze(value):
|
|
51
|
+
"""复制一份已经通过JSON边界检查的元数据,拒绝后续原地修改。
|
|
52
|
+
|
|
53
|
+
参数: value为有界协议JSON树。返回: 只读映射、tuple或原标量。
|
|
54
|
+
异常: 原分配错误传播;本函数不读取文件或保留进程对象。
|
|
55
|
+
"""
|
|
56
|
+
# 映射和数组逐层冻结,外部消费者不能修改下一次读取的合同。
|
|
57
|
+
if isinstance(value, Mapping):
|
|
58
|
+
return MappingProxyType({key: _freeze(item) for key, item in value.items()})
|
|
59
|
+
if isinstance(value, (list, tuple)):
|
|
60
|
+
return tuple(_freeze(item) for item in value)
|
|
61
|
+
return value
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class RemoteLegacyError(RuntimeError):
|
|
65
|
+
"""保存远端错误的有限事实,明确区别于父进程中的原异常对象。"""
|
|
66
|
+
|
|
67
|
+
def __init__(self, facts, phase, request_id):
|
|
68
|
+
"""将有界错误包保存为供SourceReadError引用的cause。
|
|
69
|
+
|
|
70
|
+
参数: facts为错误字段映射;phase和request_id为原协议位置。
|
|
71
|
+
返回: 新远端事实异常。异常: 原分配/格式错误,不执行清理。
|
|
72
|
+
"""
|
|
73
|
+
# 不动态import远端异常类型,也不根据类型名执行任意代码。
|
|
74
|
+
self.facts = _freeze(facts)
|
|
75
|
+
self.phase, self.request_id = phase, request_id
|
|
76
|
+
module = facts.get('module', 'unknown')
|
|
77
|
+
error_type = facts.get('type', 'unknown')
|
|
78
|
+
message = facts.get('message', '')
|
|
79
|
+
super().__init__(f'旧CAN子进程{phase}失败: {module}.{error_type}: {message}')
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class LegacyCANProcessRead:
|
|
83
|
+
"""持有一次读取的真实进程、两端连接及各自费用,不与其他read共享。
|
|
84
|
+
|
|
85
|
+
_waiting表示已有一个发送尝试尚未取得完整回应,禁止叠加许可。
|
|
86
|
+
_process_stopped只在实际确认退出后置真;关闭失败保留真实对象。
|
|
87
|
+
finished仅表示真实协议EOF、正常退出和本owner关闭均成功。
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
def __init__(self, request, budget, *, _worker_target=None):
|
|
91
|
+
"""保存请求并预约固定状态,不启动进程或访问DBC。
|
|
92
|
+
|
|
93
|
+
参数: request为LegacyCANRequest;budget为借用ResourceBudget;
|
|
94
|
+
_worker_target仅为隔离协议测试的私有spawn目标,生产使用worker_main。
|
|
95
|
+
返回: 尚未启动的独立read。异常: 配置/预算/分配错误;清理持续失败
|
|
96
|
+
在原异常上提供can_process_read_cleanup_owner,不补共享余额差。
|
|
97
|
+
"""
|
|
98
|
+
# 限定初始化包的结构规模,超出当前声明能力时明确拒绝。
|
|
99
|
+
if not isinstance(request, LegacyCANRequest) or not isinstance(budget, ResourceBudget):
|
|
100
|
+
raise TypeError('旧CAN读取需要LegacyCANRequest和ResourceBudget')
|
|
101
|
+
if len(request.fields) > 256:
|
|
102
|
+
raise ValueError('当前单CAN来源最多声明256个字段,且初始化包不能超过64KiB')
|
|
103
|
+
# 第一次预算回调前建立全部真实责任槽,覆盖未返回构造的取消。
|
|
104
|
+
self._budget, self._request = budget, request
|
|
105
|
+
self._worker_target = worker_main if _worker_target is None else _worker_target
|
|
106
|
+
self._connection = self._child_connection = self._process = None
|
|
107
|
+
self._worker_pid = self._exit_code = None
|
|
108
|
+
self._process_stopped = self._waiting = self._started = False
|
|
109
|
+
self._closed = self._closing = self._failed = self._finished = False
|
|
110
|
+
self._eof_received = False
|
|
111
|
+
self._metadata = self._current = self._pending_reply = None
|
|
112
|
+
self._fixed_cost = self._pipe_cost = self._process_cost = 0
|
|
113
|
+
self._wire_cost = self._metadata_cost = self._current_cost = self._held_cost = 0
|
|
114
|
+
self._pulls_issued = self._items_returned = self._items_accepted = 0
|
|
115
|
+
try:
|
|
116
|
+
# 有限初始化字段/路径引用和序列化临时结构均由这一固定预约覆盖。
|
|
117
|
+
_reserve_owned_ram(self, 1048576, '_fixed_cost')
|
|
118
|
+
except BaseException as exc:
|
|
119
|
+
self._failed = True
|
|
120
|
+
_cleanup_owner(self, exc, 'can_process_read_cleanup_owner', '旧CAN进程read构造')
|
|
121
|
+
raise
|
|
122
|
+
|
|
123
|
+
@property
|
|
124
|
+
def closed(self):
|
|
125
|
+
"""返回全部真实责任及费用是否已结束。
|
|
126
|
+
|
|
127
|
+
参数: 无。返回: bool。异常: 无,不触碰已关闭Process属性。
|
|
128
|
+
"""
|
|
129
|
+
return self._closed
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def finished(self):
|
|
133
|
+
"""返回本次真实协议EOF是否已完整交付。
|
|
134
|
+
|
|
135
|
+
参数: 无。返回: bool;提前close或失败永远不伪装EOF。异常: 无。
|
|
136
|
+
"""
|
|
137
|
+
return self._finished
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def worker_pid(self):
|
|
141
|
+
"""返回实际启动过的PID,进程对象关闭后仍可用于验证。
|
|
142
|
+
|
|
143
|
+
参数: 无。返回: int或None。异常: 无,不重新启动进程。
|
|
144
|
+
"""
|
|
145
|
+
return self._worker_pid
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def counters(self):
|
|
149
|
+
"""区分许可发送尝试、已接收ITEM和实际交付记录的有限计数。
|
|
150
|
+
|
|
151
|
+
参数: 无。返回: 独立dict;发送中取消时issued是已授予序号的上界,
|
|
152
|
+
不等于已被子进程接收或完成。异常: 原小字典分配错误。
|
|
153
|
+
"""
|
|
154
|
+
return {'pulls_issued': self._pulls_issued, 'items_returned': self._items_returned,
|
|
155
|
+
'items_accepted': self._items_accepted}
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def metadata(self):
|
|
159
|
+
"""读取已完成INIT的同次DBC公开元数据,不隐式启动。
|
|
160
|
+
|
|
161
|
+
参数: 无。返回: 冻结JSON映射,借用至close;长期保留须由消费者计费。
|
|
162
|
+
异常: ResultClosedError为关闭中/已关闭,RuntimeError为尚未READY。
|
|
163
|
+
"""
|
|
164
|
+
self._require_open()
|
|
165
|
+
if self._metadata is None:
|
|
166
|
+
raise RuntimeError('start完成前没有旧CAN运行元数据')
|
|
167
|
+
return self._metadata
|
|
168
|
+
|
|
169
|
+
def _require_open(self):
|
|
170
|
+
"""阻止失败或半关闭对象再次授权读取。
|
|
171
|
+
|
|
172
|
+
参数: 无。返回: None。异常: ResultClosedError为已关/正在关;
|
|
173
|
+
SourceReadError为失败后继续推进;close仍可重试。
|
|
174
|
+
"""
|
|
175
|
+
if self._closed or self._closing:
|
|
176
|
+
raise ResultClosedError('旧CAN进程read已关闭或正在关闭')
|
|
177
|
+
if self._failed:
|
|
178
|
+
raise SourceReadError('失败的旧CAN进程read只允许关闭')
|
|
179
|
+
|
|
180
|
+
def _fail(self, exc, stage):
|
|
181
|
+
"""以原父错误为主关闭实际owner,必要时包装来源位置。
|
|
182
|
+
|
|
183
|
+
参数: exc为原错误;stage为有限业务位置。返回: 不返回。
|
|
184
|
+
异常: 父KI/SystemExit、预算及来源错误原对象传播;其他错误作为
|
|
185
|
+
SourceReadError的cause,清理副错只附note/真实恢复owner。
|
|
186
|
+
"""
|
|
187
|
+
self._failed = True
|
|
188
|
+
# 先确定对外原错,再把清理证据附在调用者真正会接收到的异常上。
|
|
189
|
+
if isinstance(exc, (KeyboardInterrupt, SystemExit, AnalysisError, SourceReadError)):
|
|
190
|
+
failure = exc
|
|
191
|
+
else:
|
|
192
|
+
failure = SourceReadError(f'旧CAN进程{stage}失败: {exc}')
|
|
193
|
+
failure.__cause__ = exc
|
|
194
|
+
_cleanup_owner(self, failure, 'can_process_read_cleanup_owner', '旧CAN进程read')
|
|
195
|
+
if failure is exc:
|
|
196
|
+
raise failure
|
|
197
|
+
raise failure from exc
|
|
198
|
+
|
|
199
|
+
def start(self):
|
|
200
|
+
"""实际启动隔离进程并取得READY,不授权任何消息读取。
|
|
201
|
+
|
|
202
|
+
参数: 无。返回: self,重复成功调用不重启/重载DBC。
|
|
203
|
+
异常: 启动、协议、远端或预算错误;父取消保原对象和关闭责任。
|
|
204
|
+
"""
|
|
205
|
+
self._require_open()
|
|
206
|
+
if self._started:
|
|
207
|
+
return self
|
|
208
|
+
try:
|
|
209
|
+
# 两进程的有界wire和解码临时容器预先计费;旧DBC/RSS另列限制。
|
|
210
|
+
_reserve_owned_ram(self, 128 * MAX_WIRE_BYTES, '_wire_cost')
|
|
211
|
+
_reserve_owned_ram(self, 65536, '_pipe_cost')
|
|
212
|
+
context = multiprocessing.get_context('spawn')
|
|
213
|
+
self._connection, self._child_connection = context.Pipe(duplex=True)
|
|
214
|
+
_reserve_owned_ram(self, 65536, '_process_cost')
|
|
215
|
+
self._process = context.Process(target=self._worker_target,
|
|
216
|
+
args=(self._child_connection,), name='chronaxis-legacy-can')
|
|
217
|
+
try:
|
|
218
|
+
# Process先存真实槽;start成功后取消仍能从同owner回收PID。
|
|
219
|
+
self._process.start()
|
|
220
|
+
finally:
|
|
221
|
+
self._worker_pid = self._process.pid
|
|
222
|
+
self._close_connection('_child_connection')
|
|
223
|
+
packet = {'op': 'init', 'version': 1, 'path': str(self._request.input_path),
|
|
224
|
+
'dbc_path': str(self._request.dbc_path),
|
|
225
|
+
'fields': [field_to_dict(field) for field in self._request.fields]}
|
|
226
|
+
ready = self._exchange(packet)
|
|
227
|
+
self._check_ready(ready)
|
|
228
|
+
# 复制冻结元数据前预约实际保留量,wire预约仍覆盖旧解码包。
|
|
229
|
+
_reserve_owned_ram(self, 4096 + 16 * _wire_metadata_bytes(ready), '_metadata_cost')
|
|
230
|
+
self._metadata = _freeze(ready)
|
|
231
|
+
self._pending_reply = None
|
|
232
|
+
self._started = True
|
|
233
|
+
return self
|
|
234
|
+
except BaseException as exc:
|
|
235
|
+
self._fail(exc, '初始化')
|
|
236
|
+
|
|
237
|
+
def _check_ready(self, packet):
|
|
238
|
+
"""核INIT回应来自同一真实PID和同一字段请求,不猜元数据。
|
|
239
|
+
|
|
240
|
+
参数: packet为有界READY dict。返回: None。
|
|
241
|
+
异常: SourceReadError为profile/版本/PID/字段位置不符。
|
|
242
|
+
"""
|
|
243
|
+
if (set(packet) != {'op', 'version', 'profile', 'worker_pid', 'fields',
|
|
244
|
+
'dependency_versions', 'vendor_sha256'}
|
|
245
|
+
or packet.get('op') != 'ready' or type(packet.get('version')) is not int or packet.get('version') != 1
|
|
246
|
+
or packet.get('profile') != self._request.profile
|
|
247
|
+
or type(packet.get('worker_pid')) is not int
|
|
248
|
+
or packet.get('worker_pid') != self._worker_pid):
|
|
249
|
+
raise SourceReadError('旧CAN READY身份、版本或实际PID不符')
|
|
250
|
+
self._check_ready_metadata(packet)
|
|
251
|
+
|
|
252
|
+
def _check_ready_metadata(self, packet, *, cycle_fields=(), metadata_fields=()):
|
|
253
|
+
"""核两种READY共有的字段定位、单位、依赖与原vendor,不改协议头。
|
|
254
|
+
|
|
255
|
+
参数: packet已由对应读取入口核过完整键集、版本、profile和真实PID;
|
|
256
|
+
cycle_fields仅由确认了周期请求的新版批读取器传入,默认不允许cycle_ns;metadata_fields仅增加有限候选声明。
|
|
257
|
+
返回: None。异常: 原SourceReadError;检查顺序和错误文本沿用逐条入口。
|
|
258
|
+
默认v1和显式按需v2分别检查各自头部,不能伪造v1包绕过策略核对。
|
|
259
|
+
"""
|
|
260
|
+
expected_fields = tuple(dict.fromkeys((*self._request.fields,*cycle_fields,*metadata_fields)))
|
|
261
|
+
fields = packet.get('fields')
|
|
262
|
+
if not isinstance(fields, list) or len(fields) != len(expected_fields):
|
|
263
|
+
raise SourceReadError('旧CAN READY字段数量不符')
|
|
264
|
+
for actual, expected in zip(fields, expected_fields):
|
|
265
|
+
if (not isinstance(actual, dict)
|
|
266
|
+
or set(actual) - ({'cycle_ns'} if expected in cycle_fields else set()) - {'dbc_frames'} not in
|
|
267
|
+
({'locator', 'unit'}, {'locator', 'unit', 'frame_format_compatibility'})
|
|
268
|
+
or actual['unit'] is not None and type(actual['unit']) is not str):
|
|
269
|
+
raise SourceReadError('旧CAN READY没有对应原请求的字段定位')
|
|
270
|
+
if expected in cycle_fields and (type(actual.get('cycle_ns')) is not int
|
|
271
|
+
or not 0 < actual['cycle_ns'] <= (1 << 63)-1):
|
|
272
|
+
raise SourceReadError('DBC周期元数据缺失或不是正int64纳秒')
|
|
273
|
+
# dict相等会把False与0混同;先按原生int/bool合同重建,再比较定位。
|
|
274
|
+
try:
|
|
275
|
+
locator = field_from_dict(actual['locator'])
|
|
276
|
+
except (TypeError, ValueError) as exc:
|
|
277
|
+
raise SourceReadError('旧CAN READY字段定位类型非法') from exc
|
|
278
|
+
if locator != expected:
|
|
279
|
+
raise SourceReadError('旧CAN READY没有对应原请求的字段定位')
|
|
280
|
+
needs_candidates = locator.is_extended is None or locator.is_fd is None
|
|
281
|
+
if ('dbc_frames' in actual) != needs_candidates:
|
|
282
|
+
raise SourceReadError('旧CAN READY候选帧型与省略参数声明不符')
|
|
283
|
+
if 'dbc_frames' in actual:
|
|
284
|
+
pairs = actual['dbc_frames']
|
|
285
|
+
if (type(pairs) is not list or not 1 <= len(pairs) <= 4
|
|
286
|
+
or any(type(pair) is not list or len(pair) != 2
|
|
287
|
+
or any(type(flag) is not bool for flag in pair) for pair in pairs)):
|
|
288
|
+
raise SourceReadError('旧CAN READY候选帧型非法')
|
|
289
|
+
if len({tuple(pair) for pair in pairs}) != len(pairs) or any(
|
|
290
|
+
locator.is_extended is not None and pair[0] != locator.is_extended
|
|
291
|
+
or locator.is_fd is True and pair[1] is not True for pair in pairs):
|
|
292
|
+
raise SourceReadError('旧CAN READY候选帧型与显式参数冲突或重复')
|
|
293
|
+
if 'frame_format_compatibility' in actual:
|
|
294
|
+
# 只承认固定单向提示,不将0/1当bool,也不接受其他兼容或额外字段。
|
|
295
|
+
notice = actual['frame_format_compatibility']
|
|
296
|
+
if (type(notice) is not dict
|
|
297
|
+
or set(notice) != {'code', 'dbc_is_fd', 'requested_is_fd'}
|
|
298
|
+
or type(notice['code']) is not str or notice['code'] != 'dbc_fd_classic_selector'
|
|
299
|
+
or notice['dbc_is_fd'] is not True or notice['requested_is_fd'] is not False
|
|
300
|
+
or locator.is_fd is not False):
|
|
301
|
+
raise SourceReadError('旧CAN READY帧型兼容提示非法或与原定位不同')
|
|
302
|
+
# 此profile仅接受声明的依赖版本与读取链;不能静默接受另一条旧链。
|
|
303
|
+
expected_versions = {'python': platform.python_version(), 'python-can': '4.6.1',
|
|
304
|
+
'cantools': '39.4.3', 'natsort': '8.4.0'}
|
|
305
|
+
if packet['dependency_versions'] != expected_versions:
|
|
306
|
+
raise SourceReadError('旧CAN READY依赖版本不符合已验证profile')
|
|
307
|
+
if packet['vendor_sha256'] != VENDOR_SHA256:
|
|
308
|
+
raise SourceReadError('旧CAN READY原样vendor哈希不符')
|
|
309
|
+
|
|
310
|
+
def _exchange(self, packet):
|
|
311
|
+
"""完成一个有界请求/回应;STATUS/ACK也不隐含PULL许可。
|
|
312
|
+
|
|
313
|
+
参数: packet为协议dict。返回: 有界回应dict。
|
|
314
|
+
异常: 原父取消/管道错误、SourceReadError或明确远端cause。
|
|
315
|
+
边界: 最多一项在途,父每50ms回到Python检查取消;本方法发送后立即等待。
|
|
316
|
+
"""
|
|
317
|
+
try:
|
|
318
|
+
self._send_request(packet)
|
|
319
|
+
return self._receive_response(packet)
|
|
320
|
+
finally:
|
|
321
|
+
packet = None
|
|
322
|
+
|
|
323
|
+
def _send_request(self, packet):
|
|
324
|
+
"""发送唯一在途许可;发送中断时仍保留实际连接和未确认责任。
|
|
325
|
+
|
|
326
|
+
参数: packet为调用方已经为相应工作空间付款的协议dict。
|
|
327
|
+
返回: None。异常: 原编码/发送/取消错误;失败不可按未发送重试。
|
|
328
|
+
边界: 原逐条入口立即接收;批次入口可在消费当前批时保留这一项在途请求。
|
|
329
|
+
"""
|
|
330
|
+
payload = None
|
|
331
|
+
try:
|
|
332
|
+
if self._connection is None or self._waiting:
|
|
333
|
+
raise SourceReadError('旧CAN连接不可用或已有一个在途请求')
|
|
334
|
+
payload = encode_packet(packet)
|
|
335
|
+
self._waiting = True
|
|
336
|
+
self._connection.send_bytes(payload)
|
|
337
|
+
finally:
|
|
338
|
+
packet = payload = None
|
|
339
|
+
|
|
340
|
+
def _receive_response(self, packet):
|
|
341
|
+
"""接收先前发送的许可,并严格核对远端错误事实与请求身份。
|
|
342
|
+
|
|
343
|
+
参数: packet为同一在途许可,不再次发送。返回: 有界回应dict。
|
|
344
|
+
异常: 原连接/格式/取消错误,或带RemoteLegacyError cause的来源错误。
|
|
345
|
+
边界: 必须已有一个在途请求;没有真实协议EOF的退出仍是错误。
|
|
346
|
+
"""
|
|
347
|
+
reply = facts = remote = None
|
|
348
|
+
try:
|
|
349
|
+
if self._connection is None or not self._waiting:
|
|
350
|
+
raise SourceReadError('旧CAN连接没有对应的在途请求')
|
|
351
|
+
# poll不授予读取许可;子进程意外退出也不能当成真实EOF。
|
|
352
|
+
while not self._connection.poll(0.05):
|
|
353
|
+
if self._process is not None and not self._process.is_alive():
|
|
354
|
+
raise SourceReadError(f'旧CAN进程未交付完整协议回应便退出: {self._process.exitcode}')
|
|
355
|
+
reply = self._receive_reply()
|
|
356
|
+
self._waiting = False
|
|
357
|
+
if reply.get('op') == 'error':
|
|
358
|
+
facts = reply.get('error')
|
|
359
|
+
if (set(reply) != {'op', 'request_id', 'phase', 'error'}
|
|
360
|
+
or type(reply.get('phase')) is not str
|
|
361
|
+
or reply.get('request_id') is not None and type(reply.get('request_id')) is not int
|
|
362
|
+
or not isinstance(facts, dict)
|
|
363
|
+
or set(facts) != {'module', 'type', 'message', 'traceback', 'notes'}
|
|
364
|
+
or any(type(facts[key]) is not str for key in ('module', 'type', 'message', 'traceback'))
|
|
365
|
+
or type(facts['notes']) is not list
|
|
366
|
+
or any(type(note) is not str for note in facts['notes'])):
|
|
367
|
+
raise SourceReadError('旧CAN远端错误包缺少明确事实')
|
|
368
|
+
if reply['request_id'] != packet.get('request_id'):
|
|
369
|
+
raise SourceReadError('旧CAN远端错误不属于当前请求')
|
|
370
|
+
remote = RemoteLegacyError(facts, reply.get('phase'), reply.get('request_id'))
|
|
371
|
+
raise SourceReadError(str(remote)) from remote
|
|
372
|
+
return reply
|
|
373
|
+
finally:
|
|
374
|
+
# 原错误可留在调用方;已结束调用的临时引用不继续占有整批对象。
|
|
375
|
+
packet = reply = facts = remote = None
|
|
376
|
+
|
|
377
|
+
def _receive_reply(self):
|
|
378
|
+
"""读取本协议的一条严格JSON回应,供批次子类替换物理数据包边界。
|
|
379
|
+
|
|
380
|
+
参数: 无,使用本owner的实际Connection。
|
|
381
|
+
返回: 已校验的回应dict。异常: 原管道、长度、JSON或取消错误。
|
|
382
|
+
边界: 原逐条入口仍只接收64KiB;子类不能绕过共享接收流程的在途及远端错误检查。
|
|
383
|
+
"""
|
|
384
|
+
self._pending_reply = self._connection.recv_bytes(MAX_WIRE_BYTES)
|
|
385
|
+
return decode_packet(self._pending_reply)
|
|
386
|
+
|
|
387
|
+
def __iter__(self):
|
|
388
|
+
"""返回本次独立read,不因取得迭代器就启动或读取。
|
|
389
|
+
|
|
390
|
+
参数: 无。返回: self。异常: 原错误只在实际next/start时报告。
|
|
391
|
+
"""
|
|
392
|
+
return self
|
|
393
|
+
|
|
394
|
+
def __next__(self):
|
|
395
|
+
"""只授权并返回一帧,真实完整EOF之后才StopIteration。
|
|
396
|
+
|
|
397
|
+
参数: 无。返回: LegacyDecodedFrame;调用者保留引用须另计费。
|
|
398
|
+
异常: StopIteration为已确认EOF;源/预算/协议错误或父原取消。
|
|
399
|
+
"""
|
|
400
|
+
if self._finished:
|
|
401
|
+
raise StopIteration
|
|
402
|
+
self._require_open()
|
|
403
|
+
try:
|
|
404
|
+
self.start()
|
|
405
|
+
# 上一记录停止由本read持有后才归还其费用,失败不会继续发PULL。
|
|
406
|
+
self._current = None
|
|
407
|
+
_release_owned_ram(self, self._current_cost, '_current_cost')
|
|
408
|
+
self._pending_reply = None
|
|
409
|
+
request_id = self._items_accepted
|
|
410
|
+
self._pulls_issued += 1
|
|
411
|
+
reply = self._exchange({'op': 'pull', 'request_id': request_id})
|
|
412
|
+
if type(reply.get('request_id')) is not int or reply.get('request_id') != request_id:
|
|
413
|
+
raise SourceReadError('旧CAN回应不是本次唯一许可序号')
|
|
414
|
+
if reply.get('op') == 'eof':
|
|
415
|
+
if (set(reply) != {'op', 'request_id', 'frame_count'}
|
|
416
|
+
or type(reply.get('frame_count')) is not int
|
|
417
|
+
or reply.get('frame_count') != self._items_accepted):
|
|
418
|
+
raise SourceReadError('旧CAN EOF原帧计数不符')
|
|
419
|
+
self._eof_received = True
|
|
420
|
+
self.close()
|
|
421
|
+
if self._exit_code != 0:
|
|
422
|
+
raise SourceReadError('旧CAN虽然发EOF,但没有正常退出')
|
|
423
|
+
self._finished = True
|
|
424
|
+
elif reply.get('op') == 'item':
|
|
425
|
+
if set(reply) != {'op', 'request_id', 'record'}:
|
|
426
|
+
raise SourceReadError('旧CAN ITEM字段缺失或多余')
|
|
427
|
+
self._items_returned += 1
|
|
428
|
+
raw = reply.get('record')
|
|
429
|
+
_reserve_owned_ram(self, 4096 + 16 * _wire_metadata_bytes(raw), '_current_cost')
|
|
430
|
+
self._current = decoded_from_dict(raw)
|
|
431
|
+
if self._current.sequence != request_id:
|
|
432
|
+
raise SourceReadError('旧CAN原yield序号不连续,禁止重排或补号')
|
|
433
|
+
self._items_accepted += 1
|
|
434
|
+
self._pending_reply = None
|
|
435
|
+
return self._current
|
|
436
|
+
else:
|
|
437
|
+
raise SourceReadError('旧CAN PULL必须得到ITEM或真实EOF')
|
|
438
|
+
except BaseException as exc:
|
|
439
|
+
self._fail(exc, '逐帧读取')
|
|
440
|
+
# 正常StopIteration不进入失败清理,已关闭read也能重复返回EOF。
|
|
441
|
+
raise StopIteration
|
|
442
|
+
|
|
443
|
+
def _close_connection(self, slot):
|
|
444
|
+
"""关闭一个真实自有连接,成功后取消也不丢失其实际关闭事实。
|
|
445
|
+
|
|
446
|
+
参数: slot为本owner连接字段。返回: None。
|
|
447
|
+
异常: 原close错误;未关闭对象仍在同槽,费用稍后单独归还。
|
|
448
|
+
"""
|
|
449
|
+
connection = getattr(self, slot)
|
|
450
|
+
if connection is None:
|
|
451
|
+
return
|
|
452
|
+
try:
|
|
453
|
+
connection.close()
|
|
454
|
+
finally:
|
|
455
|
+
if connection.closed:
|
|
456
|
+
setattr(self, slot, None)
|
|
457
|
+
|
|
458
|
+
def _close_process(self):
|
|
459
|
+
"""确认自己启动的进程退出后关闭其实际句柄,不动其他read。
|
|
460
|
+
|
|
461
|
+
参数: 无。返回: None,实际exitcode保留供EOF判断。
|
|
462
|
+
异常: join/terminate/kill/close错误保原process和停止确认状态以便重试。
|
|
463
|
+
边界: 三次显式join最多约6秒;Windows kill仍是TerminateProcess,
|
|
464
|
+
必须实际取得exitcode,不能把终止请求成功当作进程已经退出。
|
|
465
|
+
"""
|
|
466
|
+
process = self._process
|
|
467
|
+
if process is None:
|
|
468
|
+
return
|
|
469
|
+
if not self._process_stopped:
|
|
470
|
+
# start前失败没有PID,仍须关闭Process自身已经建立的描述。
|
|
471
|
+
if process.pid is not None:
|
|
472
|
+
process.join(timeout=0.5)
|
|
473
|
+
if process.exitcode is None:
|
|
474
|
+
process.terminate()
|
|
475
|
+
process.join(timeout=0.5)
|
|
476
|
+
if process.exitcode is None:
|
|
477
|
+
process.kill()
|
|
478
|
+
# Windows终止后的OS清理可能晚于0.5秒;有限等待真实退出信号。
|
|
479
|
+
process.join(timeout=5.0)
|
|
480
|
+
exit_code = process.exitcode
|
|
481
|
+
if exit_code is None:
|
|
482
|
+
failure = SourceReadError('尚未确认旧CAN子进程退出,不能结束关闭责任')
|
|
483
|
+
failure.can_process_exit_state = {'pid': self._worker_pid,
|
|
484
|
+
'exit_code': None, 'join_wait_limits_seconds': (0.5, 0.5, 5.0)}
|
|
485
|
+
raise failure
|
|
486
|
+
self._exit_code = exit_code
|
|
487
|
+
self._process_stopped = True
|
|
488
|
+
# 此确认先于close,覆盖真实close后取消时已关闭Process属性不可再读的情况。
|
|
489
|
+
process.close()
|
|
490
|
+
self._process = None
|
|
491
|
+
|
|
492
|
+
def _release_closed_state(self):
|
|
493
|
+
"""实际连接和进程全部关闭后清状态、逐槽退费,供批次子类补充责任。
|
|
494
|
+
|
|
495
|
+
参数: 无;调用方必须已完成本owner实际资源关闭。返回: None。
|
|
496
|
+
异常: 原预算回调错误;费用槽保留实际入账事实,同一close可继续恢复。
|
|
497
|
+
"""
|
|
498
|
+
self._metadata = self._current = self._pending_reply = self._request = None
|
|
499
|
+
self._worker_target = None
|
|
500
|
+
self._waiting = False
|
|
501
|
+
for slot in ('_current_cost', '_metadata_cost', '_wire_cost', '_pipe_cost', '_process_cost', '_fixed_cost'):
|
|
502
|
+
_release_owned_ram(self, getattr(self, slot), slot)
|
|
503
|
+
|
|
504
|
+
def close(self):
|
|
505
|
+
"""停止授予许可,关闭自有IPC/进程,最后归还各自费用。
|
|
506
|
+
|
|
507
|
+
参数: 无。返回: None,完成后重复调用幂等。
|
|
508
|
+
异常: 实际关闭或预算回调错误;对象仍可同owner重试。
|
|
509
|
+
边界: 关管道令等待命令的child退出;在途旧IO不响应时有限等待后终止,
|
|
510
|
+
不为关闭继续next,也不把强制退出当正常分析完成。
|
|
511
|
+
"""
|
|
512
|
+
if self._closed:
|
|
513
|
+
return
|
|
514
|
+
self._closing = True
|
|
515
|
+
try:
|
|
516
|
+
# 任一真实资源未关时即保留父责任,不先释放其内存描述或借用余额。
|
|
517
|
+
self._close_connection('_child_connection')
|
|
518
|
+
self._close_connection('_connection')
|
|
519
|
+
self._close_process()
|
|
520
|
+
# 每笔实际申请有独立槽,释放后取消由既有helper确认,不重复抵销别人的费用。
|
|
521
|
+
self._release_closed_state()
|
|
522
|
+
self._closed = True
|
|
523
|
+
except BaseException as exc:
|
|
524
|
+
# 直接close的调用者也能从同一异常找到真实责任,不制造替代owner。
|
|
525
|
+
exc.can_process_read_cleanup_owner = self
|
|
526
|
+
raise
|