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,470 @@
|
|
|
1
|
+
"""直接把原始报文CSV/TXT读成带原行定位的CAN记录,不经过ASC中间文件。
|
|
2
|
+
|
|
3
|
+
CANCSVSpec使用不可变的原始报文列布局并声明时间/进制/通道起点。CANCSVRead只读打开一次,
|
|
4
|
+
逐记录经标准库CSV语法解析后提取所需列,严格核时间、ID、帧型、DLC和载荷。
|
|
5
|
+
CSV记录可以跨物理行,但整条记录字节数有界;任何错误停止并关闭,不静默跳过。
|
|
6
|
+
数字时间必须明确单位,日内时间默认禁止回退。clock-ms-us-v1明确把最后两段
|
|
7
|
+
分别解释为毫秒和微秒,例如.151.2为.151002秒;普通clock不自动采用这一规则。
|
|
8
|
+
模块不加载DBC/旧reader,不解码或保存整文件,已返回记录的长期保留由消费层计费。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import codecs
|
|
12
|
+
import csv
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from datetime import timezone, timedelta
|
|
15
|
+
from decimal import Decimal, localcontext
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
import re
|
|
18
|
+
|
|
19
|
+
from ..legacy.records import LegacyRawFrame
|
|
20
|
+
from ..results.budget import ResourceBudget, _reserve_owned_ram, _release_owned_ram, _cleanup_owner
|
|
21
|
+
from ..timebase.conversion import convert_time, checked_add_ns, parse_datetime_ns, require_int64_ns
|
|
22
|
+
from .raw_can import RawCANRecord, CANTextError
|
|
23
|
+
from .raw_csv_layout import CANCSVLayout, MAX_COLUMNS
|
|
24
|
+
|
|
25
|
+
# 同一表记录即使引号未闭合也不能无限累积;预算按整条记录的最坏文本/分列开销预约。
|
|
26
|
+
MAX_CSV_RECORD_BYTES = 65536
|
|
27
|
+
DAY_NS = 86400 * 10**9
|
|
28
|
+
FD_LENGTHS = (0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class CSVTimeSpec:
|
|
33
|
+
"""声明时间文字含义,固定偏移只施加一次,不用电脑日期或时区补值。"""
|
|
34
|
+
|
|
35
|
+
format: str = 'numeric' # numeric、clock、clock-ms-us-v1或iso8601,必须显式选择。
|
|
36
|
+
unit: str = 's' # numeric的s/ms/us/ns,其他格式只接受默认s,避免无效配置。
|
|
37
|
+
offset_ns: int = 0 # 数值固定平移;日内时间可据明确原点映射到会话。
|
|
38
|
+
timezone_offset_minutes: int | None = None # 仅ISO无时区文本的显式补充。
|
|
39
|
+
rollover_min_drop_ns: int | None = None # 两种日内格式可选:回退至少此纳秒数才按次日解释。
|
|
40
|
+
|
|
41
|
+
def __post_init__(self):
|
|
42
|
+
"""校验时间政策。参数: 无。返回: None。异常: 类型、格式、单位、时区或午夜规则非法。
|
|
43
|
+
"""
|
|
44
|
+
# 每种写法只采用一种含义;不依文字长度猜秒/毫秒,也不默认跨午夜。
|
|
45
|
+
if self.format not in ('numeric','clock','clock-ms-us-v1','iso8601') or self.unit not in ('s','ms','us','ns'):
|
|
46
|
+
raise ValueError('CSV时间格式或单位不支持')
|
|
47
|
+
# 日内和ISO文字已有单位,不能再额外乘一次numeric单位。
|
|
48
|
+
if self.format != 'numeric' and self.unit != 's':
|
|
49
|
+
raise ValueError('非数值时间不能额外声明数值单位')
|
|
50
|
+
# 偏移必须能进入纳秒时间轴;只有无时区ISO文字可补显式时区。
|
|
51
|
+
require_int64_ns(self.offset_ns)
|
|
52
|
+
zone = self.timezone_offset_minutes
|
|
53
|
+
if zone is not None and (self.format != 'iso8601' or type(zone) is not int or not -1439 <= zone <= 1439):
|
|
54
|
+
raise ValueError('只有ISO时间可声明整数分钟时区偏移')
|
|
55
|
+
# 午夜只适用于日内时钟;阈值为严格正值且小于一天,避免把任意乱序当作换日。
|
|
56
|
+
drop = self.rollover_min_drop_ns
|
|
57
|
+
if drop is not None and (self.format not in ('clock','clock-ms-us-v1') or type(drop) is not int or not 0 < drop < DAY_NS):
|
|
58
|
+
raise ValueError('跨午夜阈值需日内时间格式的0到一天之间整数纳秒')
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@dataclass(frozen=True)
|
|
62
|
+
class CANCSVSpec:
|
|
63
|
+
"""冻结单文件原始报文来源;布局/时间声明不打开输入或加载DBC。"""
|
|
64
|
+
|
|
65
|
+
path: Path # CSV/TXT只是文件名,不用于推断格式。
|
|
66
|
+
layout: CANCSVLayout # 编码、分隔符、列/中文映射及明确固定值。
|
|
67
|
+
time: CSVTimeSpec = field(default_factory=CSVTimeSpec) # 时间解释单独声明。
|
|
68
|
+
id_base: int | str = 'auto' # 0x十六进制、0b二进制、无前缀十进制;裸十六进制表可显式选16。
|
|
69
|
+
length_base: int = 10 # DLC/字节数列的明确进制,原始CSV的0x08应设16。
|
|
70
|
+
channel_origin: int = 0 # 原列从0或1开始,统一转换为0基通道。
|
|
71
|
+
payload_style: str = 'spaced' # spaced逐字节,或contiguous连续偶数位十六进制。
|
|
72
|
+
|
|
73
|
+
def __post_init__(self):
|
|
74
|
+
"""核静态来源契约。参数: 无。返回: None。异常: 声明类型或不支持选项。
|
|
75
|
+
"""
|
|
76
|
+
if not isinstance(self.path,Path) or type(self.layout) is not CANCSVLayout or type(self.time) is not CSVTimeSpec:
|
|
77
|
+
raise TypeError('CANCSVSpec需要Path、CANCSVLayout及CSVTimeSpec')
|
|
78
|
+
# 逐物理行字节定位要求LF可单字节分隔,其他编码不能假报准确行号。
|
|
79
|
+
if codecs.lookup(self.layout.encoding).name not in ('utf-8','utf-8-sig','ascii','gbk','cp1252','iso8859-1'):
|
|
80
|
+
raise ValueError('原始CAN CSV当前不支持该逐行编码')
|
|
81
|
+
# 进制与通道起点由配置决定,bool不能借Python的整数继承关系混入。
|
|
82
|
+
if not (type(self.id_base) is str and self.id_base == 'auto'
|
|
83
|
+
or type(self.id_base) is int and self.id_base in (10,16)):
|
|
84
|
+
raise ValueError('CSV ID进制需要auto、10或16')
|
|
85
|
+
if type(self.length_base) is not int or self.length_base not in (10,16):
|
|
86
|
+
raise ValueError('CSV长度进制需要10或16')
|
|
87
|
+
if type(self.channel_origin) is not int or self.channel_origin not in (0,1) or self.payload_style not in ('spaced','contiguous'):
|
|
88
|
+
raise ValueError('CSV通道起点或载荷布局错误')
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _uint(value, base, maximum, label):
|
|
92
|
+
"""解析明确进制的非负整数。参数: value文字/int;base进制;maximum上限;label定位。
|
|
93
|
+
|
|
94
|
+
返回: int。异常: ValueError为符号/字符/隐式转换或越界,不允许bool/下划线。
|
|
95
|
+
"""
|
|
96
|
+
# 已映射整数直接校范围;文字仅允许声明进制的数字,不隐式接受float或bool。
|
|
97
|
+
if type(value) is int:
|
|
98
|
+
result = value
|
|
99
|
+
elif type(value) is str:
|
|
100
|
+
if base == 'auto':
|
|
101
|
+
prefix = value[:2].lower()
|
|
102
|
+
base = 16 if prefix == '0x' else 2 if prefix == '0b' else 10
|
|
103
|
+
if prefix == '0b':
|
|
104
|
+
value = value[2:]
|
|
105
|
+
text = value[2:] if base == 16 and value[:2].lower() == '0x' else value
|
|
106
|
+
pattern = r'[0-9a-fA-F]+' if base == 16 else r'[01]+' if base == 2 else r'[0-9]+'
|
|
107
|
+
if not re.fullmatch(pattern,text):
|
|
108
|
+
raise ValueError(label+'字符或进制无效')
|
|
109
|
+
result = int(text,base)
|
|
110
|
+
else:
|
|
111
|
+
raise ValueError(label+'需要文字或整数')
|
|
112
|
+
# 不按ID大小改变标准/扩展标志,也不截断超出字段范围的数值。
|
|
113
|
+
if not 0 <= result <= maximum:
|
|
114
|
+
raise ValueError(label+'越界')
|
|
115
|
+
return result
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _payload(text, style):
|
|
119
|
+
"""严格读取十六进制载荷,不补零/截短。参数: text原文字、style布局。返回: bytes。异常: 格式/长度错误。
|
|
120
|
+
"""
|
|
121
|
+
# 连续格式必须完整匹配偶数字符数,不能把缺半字节的文字补成一个字节。
|
|
122
|
+
if style == 'contiguous':
|
|
123
|
+
if len(text) > 128 or not re.fullmatch(r'(?:[0-9a-fA-F]{2})*',text):
|
|
124
|
+
raise ValueError('连续载荷需不超过64字节的偶数位十六进制')
|
|
125
|
+
return bytes.fromhex(text)
|
|
126
|
+
# 每字节允许一或两位hex,内部空白分隔;不吞0x前缀、控制字段或额外坏字节。
|
|
127
|
+
parts = text.split()
|
|
128
|
+
if len(parts) > 64 or any(not re.fullmatch(r'[0-9a-fA-F]{1,2}',value) for value in parts):
|
|
129
|
+
raise ValueError('分隔载荷需不超过64个十六进制字节')
|
|
130
|
+
return bytes(int(value,16) for value in parts)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class CSVClock:
|
|
134
|
+
"""保存一次来源的时间进度,默认拒绝回退,显式阈值才把大幅日内回退解释为次日。"""
|
|
135
|
+
|
|
136
|
+
def __init__(self, spec):
|
|
137
|
+
"""只建立状态。参数: spec为CSVTimeSpec。返回: 时钟。异常: 类型错误。
|
|
138
|
+
"""
|
|
139
|
+
if type(spec) is not CSVTimeSpec:
|
|
140
|
+
raise TypeError('CSVClock需要CSVTimeSpec')
|
|
141
|
+
self.spec, self._last_ns, self._last_clock_ns, self._day_offset = spec, None, None, 0
|
|
142
|
+
|
|
143
|
+
def parse(self, value):
|
|
144
|
+
"""按声明转换并推进。参数: value映射后的时间文字/int。返回: (int64纳秒,量化bool)。异常: 格式/时区/回退/越界。
|
|
145
|
+
"""
|
|
146
|
+
# 失败前只修改局部候选状态,错误时间不能污染下一次显式调用。
|
|
147
|
+
if type(value) not in (str,int) or type(value) is str and len(value) > MAX_CSV_RECORD_BYTES:
|
|
148
|
+
raise ValueError('CSV时间需要有限文字或整数')
|
|
149
|
+
day_offset,last_clock = self._day_offset,self._last_clock_ns
|
|
150
|
+
if self.spec.format == 'numeric':
|
|
151
|
+
result = convert_time(value,self.spec.unit)
|
|
152
|
+
ns, quantized = result.time_ns, result.quantized
|
|
153
|
+
elif self.spec.format == 'iso8601':
|
|
154
|
+
# 仅用声明的时区补充无时区ISO输入,不读取执行电脑的时区。
|
|
155
|
+
zone = self.spec.timezone_offset_minutes
|
|
156
|
+
tz = None if zone is None else timezone(timedelta(minutes=zone))
|
|
157
|
+
result = parse_datetime_ns(value,source_timezone=tz)
|
|
158
|
+
ns, quantized = result.time_ns, result.quantized
|
|
159
|
+
else:
|
|
160
|
+
# 两种日内格式各自严格匹配;不能根据一行文字临时切换时间含义。
|
|
161
|
+
if type(value) is not str:
|
|
162
|
+
raise ValueError('日内时间需要明确时分秒文字')
|
|
163
|
+
grouped = self.spec.format == 'clock-ms-us-v1'
|
|
164
|
+
pattern = (r'([0-9]{2}):([0-9]{2}):([0-9]{2})\.([0-9]{1,3})\.([0-9]{1,3})'
|
|
165
|
+
if grouped else r'(\d{2}):(\d{2}):(\d{2})(\.\d+)?')
|
|
166
|
+
match = re.fullmatch(pattern,value)
|
|
167
|
+
if match is None:
|
|
168
|
+
expected = 'HH:MM:SS.毫秒.微秒,各末段为0到999' if grouped else 'HH:MM:SS[.小数];多段小数需显式clock-ms-us-v1'
|
|
169
|
+
raise ValueError('日内时间需'+expected)
|
|
170
|
+
hour,minute,second = (int(match[index]) for index in (1,2,3))
|
|
171
|
+
if hour > 23 or minute > 59 or second > 59:
|
|
172
|
+
raise ValueError('日内时分秒越界')
|
|
173
|
+
if grouped:
|
|
174
|
+
# 两段是各自的整数单位,不按字符拼接小数;微秒规则不引入float舍入。
|
|
175
|
+
clock_ns = (hour*3600+minute*60+second)*10**9 + int(match[4])*10**6 + int(match[5])*1000
|
|
176
|
+
quantized = False
|
|
177
|
+
else:
|
|
178
|
+
# 普通小数秒仍沿既有Decimal转纳秒协议,保留更细输入的量化事实。
|
|
179
|
+
with localcontext() as context:
|
|
180
|
+
context.prec = MAX_CSV_RECORD_BYTES + 32
|
|
181
|
+
seconds = Decimal(hour*3600+minute*60+second) + Decimal(match[4] or '0')
|
|
182
|
+
result = convert_time(seconds,'s')
|
|
183
|
+
clock_ns, quantized = result.time_ns, result.quantized
|
|
184
|
+
# 只在明确允许且回退量达到阈值时进入次日;小幅乱序仍是错误。
|
|
185
|
+
if self._last_clock_ns is not None and clock_ns < self._last_clock_ns:
|
|
186
|
+
drop = self.spec.rollover_min_drop_ns
|
|
187
|
+
if drop is None or self._last_clock_ns-clock_ns < drop:
|
|
188
|
+
raise ValueError('CSV日内时间回退,未满足明确跨午夜规则')
|
|
189
|
+
day_offset = checked_add_ns(day_offset,DAY_NS)
|
|
190
|
+
ns = checked_add_ns(day_offset,clock_ns)
|
|
191
|
+
last_clock = clock_ns
|
|
192
|
+
ns = checked_add_ns(ns,self.spec.offset_ns)
|
|
193
|
+
# 排序在公开纳秒时间轴核对;更细的文本精度由quantized和raw_time明确保留。
|
|
194
|
+
if self._last_ns is not None and ns < self._last_ns:
|
|
195
|
+
raise ValueError('CSV来源时间回退')
|
|
196
|
+
self._last_ns,self._day_offset,self._last_clock_ns = ns,day_offset,last_clock
|
|
197
|
+
return ns,quantized
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def _csv_frame(values, spec, time_ns, flag_resolver=None):
|
|
201
|
+
"""把已明确映射的列转换成原帧,不按载荷/ID大小猜帧型。
|
|
202
|
+
|
|
203
|
+
参数: values规范字段映射、spec来源声明、time_ns精确纳秒;flag_resolver仅补缺少的帧型。
|
|
204
|
+
返回: (LegacyRawFrame, DLC编码或None)。异常: ID/通道/载荷/标志/DLC不一致。
|
|
205
|
+
"""
|
|
206
|
+
# 布局已校验身份枚举;ID范围按显式标准/扩展标志决定,通道转为0基。
|
|
207
|
+
fd,extended,frame_type = values.get('is_fd'),values.get('is_extended'),values['frame_kind']
|
|
208
|
+
identifier = _uint(values['frame_id'],spec.id_base,0x1fffffff,'CSV ID')
|
|
209
|
+
channel = _uint(values['channel'],10,65536,'CSV通道') - spec.channel_origin
|
|
210
|
+
if channel < 0:
|
|
211
|
+
raise ValueError('CSV通道低于明确起点')
|
|
212
|
+
if fd is None or extended is None:
|
|
213
|
+
if flag_resolver is None:
|
|
214
|
+
raise ValueError('CSV缺少is_extended或is_fd;请补列映射,或通过带DBC的分析入口自动识别')
|
|
215
|
+
extended, fd = flag_resolver(channel, identifier, extended, fd)
|
|
216
|
+
if type(extended) is not bool or type(fd) is not bool or not extended and identifier > 0x7ff:
|
|
217
|
+
raise ValueError('CSV报文ID与标准/扩展帧声明不符')
|
|
218
|
+
# DLC编码和载荷字节数分别解析,CAN FD的编码9对应12字节,不能混用。
|
|
219
|
+
data = _payload(values['data'],spec.payload_style)
|
|
220
|
+
code = (_uint(values['dlc_code'],spec.length_base,15 if fd else 8,'CSV DLC编码')
|
|
221
|
+
if 'dlc_code' in values else None)
|
|
222
|
+
length = (_uint(values['payload_length'],spec.length_base,64 if fd else 8,'CSV载荷长度')
|
|
223
|
+
if 'payload_length' in values else len(data))
|
|
224
|
+
if len(data) != length:
|
|
225
|
+
raise ValueError('CSV声明载荷长度与实际字节数不一致')
|
|
226
|
+
if frame_type == 'remote':
|
|
227
|
+
# 远程请求的DLC可非零,实际载荷必须为空;FD协议没有远程帧。
|
|
228
|
+
if fd or data or code is None:
|
|
229
|
+
raise ValueError('远程帧需经典CAN、空载荷和明确DLC编码')
|
|
230
|
+
dlc = code
|
|
231
|
+
elif frame_type == 'error':
|
|
232
|
+
# 当前错误帧格式不接受数据载荷;不伪造普通数据帧或用它参与DBC解码。
|
|
233
|
+
if data or code not in (None,0):
|
|
234
|
+
raise ValueError('当前CSV错误帧需空载荷/零长度')
|
|
235
|
+
code,dlc = None,0
|
|
236
|
+
else:
|
|
237
|
+
# 数据帧必须同时满足实际载荷长度和协议DLC;缺编码时才由长度导出。
|
|
238
|
+
expected = FD_LENGTHS[code] if fd and code is not None else code
|
|
239
|
+
if code is not None and expected != length:
|
|
240
|
+
raise ValueError('CSV DLC编码与载荷长度不一致')
|
|
241
|
+
if fd and length not in FD_LENGTHS:
|
|
242
|
+
raise ValueError('CAN FD字节数不能对应合法DLC编码')
|
|
243
|
+
if code is None:
|
|
244
|
+
code = FD_LENGTHS.index(length) if fd else length
|
|
245
|
+
dlc = length
|
|
246
|
+
brs,esi = values.get('bitrate_switch',False),values.get('error_state_indicator',False)
|
|
247
|
+
# FD专用标志不能套在经典帧上;float秒仅为既有原帧模型的兼容表示。
|
|
248
|
+
if not fd and (brs or esi):
|
|
249
|
+
raise ValueError('经典CAN不能携带FD BRS/ESI标志')
|
|
250
|
+
return LegacyRawFrame(timestamp=time_ns/10**9,arbitration_id=identifier,is_extended_id=extended,
|
|
251
|
+
is_remote_frame=frame_type=='remote',is_error_frame=frame_type=='error',channel=channel,
|
|
252
|
+
dlc=dlc,data=data,is_fd=fd,is_rx=values.get('is_rx'),bitrate_switch=brs,
|
|
253
|
+
error_state_indicator=esi),code
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
class _CSVLines:
|
|
257
|
+
"""把一次有界表记录的物理行交给标准CSV解析器,位置/字节累计由父reader持有。"""
|
|
258
|
+
|
|
259
|
+
def __init__(self, owner):
|
|
260
|
+
"""借用父对象。参数: owner为CANCSVRead。返回: 行迭代器。异常: 无。
|
|
261
|
+
"""
|
|
262
|
+
self.owner = owner
|
|
263
|
+
|
|
264
|
+
def __iter__(self):
|
|
265
|
+
"""不重新打开文件。参数: 无。返回: self。异常: 无。
|
|
266
|
+
"""
|
|
267
|
+
return self
|
|
268
|
+
|
|
269
|
+
def __next__(self):
|
|
270
|
+
"""提供一个实际物理行。参数: 无。返回: 含换行str。异常: EOF、定位编码错、超限或取消。
|
|
271
|
+
"""
|
|
272
|
+
owner = self.owner
|
|
273
|
+
if owner._check_cancel is not None:
|
|
274
|
+
owner._check_cancel()
|
|
275
|
+
# 配额在CSV读取每条表记录前归零;跨引号的多行仍共用一个65536字节上限。
|
|
276
|
+
remaining = MAX_CSV_RECORD_BYTES-owner._record_bytes
|
|
277
|
+
raw = owner._file.readline(remaining+1)
|
|
278
|
+
if not raw:
|
|
279
|
+
raise StopIteration
|
|
280
|
+
# 实际读到物理行才推进计数;超长记录定位其开始行,坏编码定位当前物理行。
|
|
281
|
+
owner.line_number += 1
|
|
282
|
+
owner._record_bytes += len(raw)
|
|
283
|
+
if owner._record_bytes > MAX_CSV_RECORD_BYTES:
|
|
284
|
+
raise CANTextError(owner.spec.path,owner._record_start,'CSV记录超过65536字节')
|
|
285
|
+
encoding = owner._encoding
|
|
286
|
+
# BOM只在文件第一行解释;后续单元格开头相同字节应保留为实际内容。
|
|
287
|
+
if encoding == 'utf-8-sig' and owner.line_number != 1:
|
|
288
|
+
encoding = 'utf-8'
|
|
289
|
+
try:
|
|
290
|
+
return raw.decode(encoding,errors='strict')
|
|
291
|
+
except UnicodeError as error:
|
|
292
|
+
raise CANTextError(owner.spec.path,owner.line_number,'CSV编码错误') from error
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
class CANCSVRead:
|
|
296
|
+
"""拥有一个文件、CSV语法迭代器和时钟,正常/失败/取消均关闭自有资源。"""
|
|
297
|
+
|
|
298
|
+
def __init__(self, spec, budget, *, check_cancel=None, retain_original=True, retain_source_time=True, flag_resolver=None, selected_ids=None):
|
|
299
|
+
"""预约并只读打开一次。参数: spec为CANCSVSpec、budget共享预算、check_cancel无参取消回调;selected_ids仅在不需全原帧/来源时间的入口限定ID。
|
|
300
|
+
|
|
301
|
+
返回: reader,不预读数据。异常: 类型/预算/I/O原错;清理失败保raw_csv_cleanup_owner。
|
|
302
|
+
"""
|
|
303
|
+
if type(retain_original) is not bool or type(retain_source_time) is not bool:
|
|
304
|
+
raise TypeError('原文/导出时间选择需要bool')
|
|
305
|
+
self._retain_original=retain_original
|
|
306
|
+
self._retain_source_time=retain_source_time
|
|
307
|
+
if flag_resolver is not None and not callable(flag_resolver):
|
|
308
|
+
raise TypeError('flag_resolver需要可调用对象')
|
|
309
|
+
self._flag_resolver = flag_resolver
|
|
310
|
+
if selected_ids is not None and (type(selected_ids) is not tuple or len(selected_ids)>4096
|
|
311
|
+
or any(type(value) is not int or not 0 <= value <= 0x1fffffff for value in selected_ids)):
|
|
312
|
+
raise ValueError('CSV按需ID需要有限合法整数tuple')
|
|
313
|
+
self._selected_ids = None
|
|
314
|
+
# 构造错误在取得文件和预算之前拒绝,不向外暴露半初始化来源。
|
|
315
|
+
if type(spec) is not CANCSVSpec or not isinstance(budget,ResourceBudget):
|
|
316
|
+
raise TypeError('CANCSVRead需要CANCSVSpec和ResourceBudget')
|
|
317
|
+
if check_cancel is not None and not callable(check_cancel):
|
|
318
|
+
raise TypeError('CSV取消检查需要可调用对象')
|
|
319
|
+
# 先登记全部资源归属和进度,构造任意后续步骤失败都可由同一close回收。
|
|
320
|
+
self.spec,self._budget,self._check_cancel = spec,budget,check_cancel
|
|
321
|
+
self._encoding = codecs.lookup(spec.layout.encoding).name
|
|
322
|
+
self._file,self._reader,self._bound,self._clock = None,None,None,None
|
|
323
|
+
self._fixed_cost,self._held_cost,self._closed,self._initialized = 0,0,False,False
|
|
324
|
+
self.line_number,self.count,self._record_bytes,self._record_start = 0,0,0,1
|
|
325
|
+
self._time_position = None
|
|
326
|
+
try:
|
|
327
|
+
# 文本/分列/CSV引号缓存和有界表头一起计费;不加载或预分配整文件。
|
|
328
|
+
_reserve_owned_ram(self,MAX_CSV_RECORD_BYTES*64+MAX_COLUMNS*256+8192+128*len(selected_ids or ()),'_fixed_cost')
|
|
329
|
+
self._selected_ids = None if selected_ids is None else frozenset(selected_ids)
|
|
330
|
+
self._file = spec.path.open('rb')
|
|
331
|
+
self._reader = csv.reader(_CSVLines(self),delimiter=spec.layout.delimiter,strict=True)
|
|
332
|
+
self._clock = CSVClock(spec.time)
|
|
333
|
+
except BaseException as error:
|
|
334
|
+
_cleanup_owner(self,error,'raw_csv_cleanup_owner','原始CSV读取')
|
|
335
|
+
raise
|
|
336
|
+
|
|
337
|
+
@property
|
|
338
|
+
def closed(self):
|
|
339
|
+
"""返回真实关闭事实。参数: 无。返回: bool。异常: 无。
|
|
340
|
+
"""
|
|
341
|
+
return self._closed
|
|
342
|
+
|
|
343
|
+
def __iter__(self):
|
|
344
|
+
"""迭代同次扫描。参数: 无。返回: self。异常: 无,不另开文件。
|
|
345
|
+
"""
|
|
346
|
+
return self
|
|
347
|
+
|
|
348
|
+
def _next_row(self):
|
|
349
|
+
"""取得一条有界CSV表记录。参数: 无。返回: str列表。异常: EOF/定位语法错/取消。
|
|
350
|
+
"""
|
|
351
|
+
# 一条CSV记录可能跨多行,因此在请求首行前记住开始位置并重置整记录配额。
|
|
352
|
+
self._record_bytes,self._record_start = 0,self.line_number+1
|
|
353
|
+
try:
|
|
354
|
+
row = next(self._reader)
|
|
355
|
+
except csv.Error as error:
|
|
356
|
+
# 保留CSV库的具体原因,同时提供文件与记录开始的物理行。
|
|
357
|
+
raise CANTextError(self.spec.path,self._record_start,'CSV语法错误: '+str(error)) from error
|
|
358
|
+
# 即便总字节有限,也限制空列造成的列表和字符串对象数量。
|
|
359
|
+
if len(row) > MAX_COLUMNS:
|
|
360
|
+
raise CANTextError(self.spec.path,self._record_start,'CSV列数超过4096')
|
|
361
|
+
return row
|
|
362
|
+
|
|
363
|
+
def _initialize(self):
|
|
364
|
+
"""按声明跳过记录/绑定表头一次。参数: 无。返回: None。异常: 缺表头/缺列或EOF。
|
|
365
|
+
"""
|
|
366
|
+
# 跳过的是显式声明的CSV记录数;输入不足是错误,不能当作正常空数据。
|
|
367
|
+
for _ in range(self.spec.layout.skip_rows):
|
|
368
|
+
try:
|
|
369
|
+
self._next_row()
|
|
370
|
+
except StopIteration as error:
|
|
371
|
+
raise CANTextError(self.spec.path,self.line_number+1,'CSV声明跳过记录数超过实际输入') from error
|
|
372
|
+
# 只有声明表头才消费这一条;绑定后所有数据行复用相同列位置。
|
|
373
|
+
if self.spec.layout.has_header:
|
|
374
|
+
try:
|
|
375
|
+
header = self._next_row()
|
|
376
|
+
except StopIteration as error:
|
|
377
|
+
raise CANTextError(self.spec.path,self.line_number+1,'CSV缺少已声明的表头') from error
|
|
378
|
+
else:
|
|
379
|
+
header = None
|
|
380
|
+
try:
|
|
381
|
+
self._bound = self.spec.layout.bind_header(header)
|
|
382
|
+
except (ValueError,TypeError) as error:
|
|
383
|
+
raise CANTextError(self.spec.path,self._record_start,str(error)) from error
|
|
384
|
+
# 时间原文取原始单元格,strip/值映射之后仍保留它的输入证据。
|
|
385
|
+
self._time_position = next(position for name,_,position in self._bound.bindings if name=='timestamp')
|
|
386
|
+
self._initialized = True
|
|
387
|
+
|
|
388
|
+
def __next__(self):
|
|
389
|
+
"""返回下一原始CAN记录。参数: 无。返回: RawCANRecord。异常: EOF/定位坏行/预算/取消原错。
|
|
390
|
+
"""
|
|
391
|
+
# 已关闭来源不会重新打开或重放已产出的记录。
|
|
392
|
+
if self._closed:
|
|
393
|
+
raise StopIteration
|
|
394
|
+
try:
|
|
395
|
+
if not self._initialized:
|
|
396
|
+
self._initialize()
|
|
397
|
+
while True:
|
|
398
|
+
try:
|
|
399
|
+
row = self._next_row()
|
|
400
|
+
except StopIteration:
|
|
401
|
+
self.close()
|
|
402
|
+
raise
|
|
403
|
+
try:
|
|
404
|
+
if self._selected_ids is not None:
|
|
405
|
+
# 仅消息汇总且无需来源时间/原帧时,先看ID;无关行不补造帧型。
|
|
406
|
+
identity = self._bound.map_row(row, names=('frame_id',))
|
|
407
|
+
identifier = _uint(identity['frame_id'],self.spec.id_base,0x1fffffff,'CSV ID')
|
|
408
|
+
if identifier not in self._selected_ids:
|
|
409
|
+
# 显式跨午夜需所有日内时钟推进;只取这一个必要字段,仍不解析帧型和载荷。
|
|
410
|
+
if self.spec.time.rollover_min_drop_ns is not None:
|
|
411
|
+
clock = self._bound.map_row(row, names=('timestamp',))
|
|
412
|
+
self._clock.parse(clock['timestamp'])
|
|
413
|
+
self.count += 1
|
|
414
|
+
continue
|
|
415
|
+
values = self._bound.map_row(row)
|
|
416
|
+
except (ValueError,TypeError,OverflowError) as error:
|
|
417
|
+
raise CANTextError(self.spec.path,self._record_start,str(error)) from error
|
|
418
|
+
break
|
|
419
|
+
try:
|
|
420
|
+
time_ns,quantized = self._clock.parse(values['timestamp'])
|
|
421
|
+
frame,code = _csv_frame(values,self.spec,time_ns,self._flag_resolver)
|
|
422
|
+
mapping = self.spec.layout.fields['timestamp']
|
|
423
|
+
raw_time = (str(mapping.fixed) if self._time_position is None else row[self._time_position]) if self._retain_original else None
|
|
424
|
+
# 时钟已完成换日/时区解释,撤去且仅撤去显式分析平移,保精确原坐标供导出。
|
|
425
|
+
source_ns = require_int64_ns(time_ns-self.spec.time.offset_ns) if self._retain_source_time else None
|
|
426
|
+
record = RawCANRecord(frame,time_ns,self.spec.path,self._record_start,self.count,
|
|
427
|
+
raw_time,'raw-can-csv-v1',code,quantized,source_ns)
|
|
428
|
+
except (ValueError,TypeError,OverflowError) as error:
|
|
429
|
+
# 数据问题携带原行定位,不吞掉程序错误、取消或资源错误。
|
|
430
|
+
raise CANTextError(self.spec.path,self._record_start,str(error)) from error
|
|
431
|
+
# 序号包括按ID跳过的实际输入行;同刻不同原帧不合并。
|
|
432
|
+
self.count += 1
|
|
433
|
+
return record
|
|
434
|
+
except StopIteration:
|
|
435
|
+
raise
|
|
436
|
+
except BaseException as error:
|
|
437
|
+
# 保留原错,关闭持续失败时把真实reader附回异常,供调用方重试清理。
|
|
438
|
+
_cleanup_owner(self,error,'raw_csv_cleanup_owner','原始CSV读取')
|
|
439
|
+
raise
|
|
440
|
+
|
|
441
|
+
def close(self):
|
|
442
|
+
"""关闭文件和解析状态再归还自有预算,可重试。参数: 无。返回: None。异常: 关闭/预算原错。
|
|
443
|
+
"""
|
|
444
|
+
# 关闭幂等;句柄关闭成功后才丢弃引用,失败时仍能对同一对象重试。
|
|
445
|
+
if self._closed:
|
|
446
|
+
return
|
|
447
|
+
if self._file is not None:
|
|
448
|
+
self._file.close()
|
|
449
|
+
self._file = None
|
|
450
|
+
# 文件已关闭才释放解析状态与本对象实际持有的预算,不能释放其他来源费用。
|
|
451
|
+
self._reader,self._bound,self._clock = None,None,None
|
|
452
|
+
if self._fixed_cost:
|
|
453
|
+
_release_owned_ram(self,self._fixed_cost,'_fixed_cost')
|
|
454
|
+
self._closed = True
|
|
455
|
+
self._flag_resolver = self._selected_ids = None
|
|
456
|
+
|
|
457
|
+
def __enter__(self):
|
|
458
|
+
"""提供受控读取上下文。参数: 无。返回: self。异常: 无。
|
|
459
|
+
"""
|
|
460
|
+
return self
|
|
461
|
+
|
|
462
|
+
def __exit__(self, exception_type, error, traceback):
|
|
463
|
+
"""保留原错并收尾。参数: exception_type/error/traceback异常信息。返回: False。异常: 无原错时关闭失败。
|
|
464
|
+
"""
|
|
465
|
+
# 正常退出直接报告关闭错误;已有业务错误时保原错及必要的恢复owner。
|
|
466
|
+
if error is None:
|
|
467
|
+
self.close()
|
|
468
|
+
else:
|
|
469
|
+
_cleanup_owner(self,error,'raw_csv_cleanup_owner','原始CSV读取')
|
|
470
|
+
return False
|