From a05ecab7b21e235250402082eb4bd24620e4e6ac Mon Sep 17 00:00:00 2001 From: "feifei.xu" <307327147@qq.com> Date: Thu, 4 Jun 2026 16:02:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0SDK=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=88=B0README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2134 +++++++++++++++++++++++++++++++++++++++++ docs/api_reference.md | 1312 ------------------------- docs/architecture.md | 257 ----- docs/guide.md | 548 ----------- 4 files changed, 2134 insertions(+), 2117 deletions(-) delete mode 100644 docs/api_reference.md delete mode 100644 docs/architecture.md delete mode 100644 docs/guide.md diff --git a/README.md b/README.md index e2828ae..5047612 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2136 @@ # arxml_sdk +AUTOSAR ARXML 配置生成 SDK,提供用于创建 AUTOSAR 标准 ARXML 文件的 Python 接口。 + +**版本**: 2.0.1 + +## 目录 + +- [简介](#简介) +- [快速开始](#快速开始) +- [架构设计](#架构设计) +- [核心模块 (core)](#核心模块-core) +- [数据类型模块 (types)](#数据类型模块-types) +- [工具模块 (utils)](#工具模块-utils) +- [使用指南](#使用指南) +- [API 参考](#api-参考) +- [常见问题](#常见问题) + +--- + +## 简介 + +arxml_sdk 是一个用于生成 AUTOSAR ARXML 配置文件的 Python SDK。它提供了完整的 AUTOSAR 数据类型建模能力,包括: + +- 基础数据类型(SW-BASE-TYPE) +- 应用数据类型和实现数据类型 +- 数据约束和计算方法 +- 软件组件和端口定义 +- 接口定义(发送-接收、客户端-服务端等) +- SWC 内部行为(Runnable、Event) + +### 特性 + +- 纯 Python 实现,零外部依赖 +- 符合 AUTOSAR R4.4 标准 +- 工厂函数模式简化对象创建 +- 组合模式支持动态构建 +- 所有类型均支持 `to_arxml()` 序列化 + +--- + +## 快速开始 + +### 环境要求 + +- Python 3.8+ + +### 安装 + +将 `src` 目录添加到 Python 路径即可使用: + +```python +import sys +sys.path.insert(0, '/path/to/arxml_sdk/src') +``` + +或直接使用相对导入: + +```python +from src import create_arxml_document, write_arxml +``` + +### 最小示例 + +```python +from src import ( + create_arxml_document, write_arxml, create_package, + create_base_type, Category, Encoding +) + +doc = create_arxml_document() +base_type = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) +package = create_package("MyPackage", elements=[base_type]) +package_element = package.to_arxml(doc) +doc.documentElement.appendChild(package_element) +write_arxml(doc, "minimal.arxml") +``` + +--- + +## 架构设计 + +### 整体架构图 + +``` +arxml_sdk/ +├── src/ # 源代码 +│ ├── __init__.py # 包入口,导出全部公共API +│ ├── core/ # 核心基础设施层 +│ │ ├── __init__.py +│ │ ├── base.py # Base 基类 +│ │ ├── constants.py # ARXML 标签常量 +│ │ └── enums.py # AUTOSAR 枚举类型 +│ ├── types/ # 数据类型层 +│ │ ├── __init__.py +│ │ ├── base_type.py # 基础数据类型 +│ │ ├── unit.py # 单位类型 +│ │ ├── data_constraint.py # 数据约束 +│ │ ├── compu_method.py # 计算方法 +│ │ ├── application_types.py # 应用数据类型 +│ │ ├── implementation_types.py # 实现数据类型 +│ │ ├── sw_addr_method.py # 软件地址方法 +│ │ ├── data_mapping.py # 数据类型映射 +│ │ ├── sw_component_type.py # 软件组件类型 +│ │ ├── interface.py # 接口定义 +│ │ ├── package.py # 包管理 +│ │ └── swc_internal_behavior.py # SWC内部行为 +│ └── utils/ # 工具层 +│ ├── __init__.py +│ └── arxml_writer.py # ARXML文档写入 +└── tests/ # 测试 +``` + +### 模块职责 + +#### core 模块 - 核心基础设施层 + +提供 SDK 运行所需的基础组件,不依赖其他业务模块。 + +| 文件 | 职责 | 关键类/函数 | +|------|------|-------------| +| base.py | 定义所有类型的基础类 | `Base` (dataclass), `create_uuid()`, `create_text_element()` | +| constants.py | ARXML 标签常量统一管理 | 约140个XML标签常量定义 | +| enums.py | AUTOSAR 枚举类型定义 | `Category`, `Encoding`, `PortDirection` 等12个枚举 | + +**Base 类核心属性:** + +| 属性 | 类型 | 说明 | +|------|------|------| +| name | str | 元素名称 | +| id | Optional[int] | 元素标识符 | +| parent | Optional[Base] | 父元素引用 | +| description | Optional[str] | 元素描述 | +| package_path | str | 完整包路径 (如 `/Pkg1/Pkg2/Name`) | + +**Base 类核心方法:** + +| 方法 | 说明 | +|------|------| +| to_arxml(doc) | 抽象方法,将对象序列化为 ARXML DOM 元素 | +| class_name | 属性,获取类型名称 | +| parent_id | 属性,获取父类 ID | + +#### types 模块 - 数据类型层 + +实现 AUTOSAR 数据模型的各个类型,依赖 core 模块。 + +| 文件 | 职责 | 主要类 | +|------|------|--------| +| base_type.py | 基础数据类型 (SW-BASE-TYPE) | `BaseType` | +| unit.py | 数据单位 | `Unit` | +| data_constraint.py | 数据约束范围 | `DataConstraint` | +| compu_method.py | 计算方法 (线性转换/文本表) | `Linear`, `TextTable`, `CompuMethod` | +| application_types.py | 应用层数据类型 | `ApplicationBooleanDataType`, `ApplicationValueDataType`, `ApplicationStructureDataType`, `ApplicationArrayDataType` | +| implementation_types.py | 实现层数据类型 | `ImplementationValueDataType`, `ImplementationStructureDataType`, `ImplementationArrayDataType` | +| sw_addr_method.py | 软件地址方法 | `SwAddrMethod` | +| data_mapping.py | 应用-实现类型映射 | `DataTypeMapping`, `DataTypeMappingSet` | +| sw_component_type.py | 软件组件类型和端口 | `ApplicationSwComponentType`, `RPortPrototype`, `PPortPrototype`, `PRPortPrototype` | +| interface.py | 接口定义 | `SenderReceiverInterface`, `ClientServerInterface`, `ModeSwitchInterface` | +| package.py | AUTOSAR 包 | `Package` | +| swc_internal_behavior.py | SWC 内部行为 | `RunnableEntity`, `TimingEvent`, `InitEvent`, `SwcInternalBehavior` | + +#### utils 模块 - 工具层 + +提供 ARXML 文档创建和写入功能。 + +| 文件 | 职责 | 关键函数 | +|------|------|----------| +| arxml_writer.py | ARXML 文档创建和写入 | `create_arxml_document()`, `write_arxml()`, `write_arxml_pretty()` | + +### 类型继承体系 + +``` +Base (core.base) +├── BaseType (types.base_type) +├── Unit (types.unit) +├── DataConstraint (types.data_constraint) +├── CompuMethod (types.compu_method) +│ ├── Linear +│ └── TextTable +├── ApplicationDataType (types.application_types) +│ ├── ApplicationBooleanDataType +│ ├── ApplicationValueDataType +│ ├── ApplicationStructureDataType +│ │ └── StructureElement (内部类) +│ └── ApplicationArrayDataType +│ └── ArrayElement (内部类) +├── ImplementationDataType (types.implementation_types) +│ ├── ImplementationValueDataType +│ ├── ImplementationStructureDataType +│ │ └── StructureElement (内部类) +│ └── ImplementationArrayDataType +│ └── ArrayElement (内部类) +├── SwAddrMethod (types.sw_addr_method) +├── DataTypeMapping (types.data_mapping) +│ └── DataTypeMappingSet +├── SwComponentType (types.sw_component_type) +│ ├── AtomicComponentType +│ │ └── ApplicationSwComponentType +│ └── CompositionSwComponentType +├── PortPrototype (types.sw_component_type) +│ ├── RPortPrototype +│ ├── PPortPrototype +│ └── PRPortPrototype +├── Interface (types.interface) +│ ├── SenderReceiverInterface +│ │ └── DataElement (内部类) +│ ├── ClientServerInterface +│ │ ├── Operation (内部类) +│ │ └── Argument (内部类) +│ ├── ModeSwitchInterface +│ ├── ParameterInterface +│ ├── TriggerInterface +│ └── NvDataInterface +├── Package (types.package) +└── SwcInternalBehavior (types.swc_internal_behavior) + ├── RunnableEntity + └── EventType (Union) + ├── InitEvent + ├── TimingEvent + ├── OperationInvokedEvent + └── DataReceivedEvent +``` + +### 依赖关系图 + +``` + ┌─────────────────────────────────────┐ + │ arxml_sdk (src/__init__.py) │ + │ 导出全部 193 个公共 API 符号 │ + └─────────────────────────────────────┘ + │ + ┌───────────────────────────┼───────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ core 模块 │ │ types 模块 │ │ utils 模块 │ +│ (基础设施层) │ │ (业务逻辑层) │ │ (工具层) │ +├─────────────────┤ ├─────────────────┤ ├─────────────────┤ +│ Base 基类 │ │ 数据类型类 │ │ ARXML文档创建 │ +│ 常量定义 │◄─────►│ 组件类型类 │ │ ARXML文件写入 │ +│ 枚举定义 │ │ 接口定义类 │ │ │ +│ UUID/文本工具 │ │ 包管理类 │ │ │ +└─────────────────┘ │ 内部行为类 │ └─────────────────┘ + └─────────────────┘ + │ + ▼ + ┌─────────────────┐ + │ tests 模块 │ + │ (测试层) │ + ├─────────────────┤ + │ 单元测试 │ + │ 集成测试 │ + └─────────────────┘ +``` + +**依赖约束:** +- `core` → 无依赖(最底层) +- `types` → 依赖 `core` +- `utils` → 依赖 `core` +- `tests` → 依赖 `src` 所有模块 + +### 设计模式 + +#### 1. 工厂函数模式 + +所有类型都配有 `create_xxx()` 工厂函数,简化对象创建: + +```python +# 使用工厂函数 +uint8 = create_base_type("UInt8", size=8) + +# 替代直接实例化(如果存在构造函数) +uint8 = BaseType(name="UInt8", size=8) +``` + +#### 2. 组合模式 + +通过 `add_xxx()` 方法支持动态添加子元素: + +```python +component = ApplicationSwComponentType(name="Sensor") +component.add_port(PPortPrototype(name="DataPort")) +``` + +#### 3. 序列化模式 + +所有类型都实现 `to_arxml(doc)` 方法,将自身序列化为 ARXML DOM 元素: + +```python +element = component.to_arxml(doc) +``` + +#### 4. 数据类模式 + +使用 `@dataclass` 简化数据类定义: + +```python +@dataclass +class BaseType: + name: str + size: int + category: Optional[Category] = None + encoding: Optional[Encoding] = None +``` + +### 数据流 + +``` +用户代码 + │ + ▼ +创建对象 (工厂函数) + │ + ├──► BaseType, ApplicationDataType, SwComponentType 等 + │ + ▼ +序列化 (to_arxml) + │ + ├──► XML DOM Element + │ + ▼ +写入文件 (arxml_writer) + │ + ▼ +.arxml 文件 +``` + +### 技术栈 + +| 方面 | 详情 | +|------|------| +| 编程语言 | Python 3 | +| 标准库 | `uuid`, `xml.dom.minidom`, `dataclasses`, `typing`, `enum` | +| 测试框架 | pytest | +| 目标格式 | AUTOSAR ARXML (R4.4 schema) | +| 版本 | 2.0.1 | + +--- + +## 核心模块 (core) + +### Base 类 + +所有类型的基类,提供通用的属性和方法。 + +**文件位置:** `src/core/base.py` + +```python +from src.core.base import Base +``` + +#### 属性 + +| 属性名 | 类型 | 说明 | +|--------|------|------| +| `name` | str | 元素名称 | +| `id` | Optional[int] | 元素标识符 | +| `parent` | Optional[Base] | 父元素引用 | +| `description` | Optional[str] | 元素描述 | + +#### 只读属性 + +| 属性名 | 类型 | 说明 | +|--------|------|------| +| `class_name` | str | 获取类型名称 (如 "ApplicationValueDataType") | +| `parent_id` | Optional[int] | 获取父类的 id | +| `package_path` | str | 获取完整包路径 (如 "/Package/SubPackage/Name") | + +#### 方法 + +##### `to_arxml(doc: Document) -> Element` + +将对象序列化为 ARXML DOM 元素。**必须被子类重写。** + +**参数:** +- `doc`: XML Document 对象 + +**返回:** +- ARXML DOM Element + +--- + +### 公共函数 + +#### `create_uuid() -> str` + +生成一个 UUID 字符串。 + +```python +from src.core.base import create_uuid + +uuid = create_uuid() # e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890" +``` + +#### `create_text_element(doc: Document, tag: str, text: str) -> Element` + +创建带有文本内容的 XML 元素。 + +**参数:** +- `doc`: XML Document 对象 +- `tag`: XML 标签名 +- `text`: 元素文本内容 + +**返回:** +- XML Element + +**示例:** + +```python +from src.core.base import create_text_element +from src.utils import create_arxml_document + +doc = create_arxml_document() +element = create_text_element(doc, "SHORT-NAME", "MyElement") +``` + +--- + +### 枚举类型 + +#### Category + +数据类型分类枚举。 + +**文件位置:** `src/core/enums.py` + +```python +from src import Category +``` + +| 枚举值 | 说明 | +|--------|------| +| `FIXED_LENGTH` | 固定长度 | +| `IDENTICAL` | 相同 | +| `TEXT_TABLE` | 文本表 | +| `LINEAR` | 线性 | +| `BOOLEAN` | 布尔 | +| `VALUE` | 值类型 | +| `STRUCTURE` | 结构体 | +| `ARRAY` | 数组 | +| `SCALE_LINEAR` | 缩放线性 | +| `RECORD` | 记录 | +| `UNION` | 联合 | +| `DATA_REFERENCE` | 数据引用 | +| `TYPE_REFERENCE` | 类型引用 | + +#### Encoding + +数据编码格式枚举。 + +```python +from src import Encoding +``` + +| 枚举值 | 说明 | +|--------|------| +| `ONE_COMPONENT` | 单组件 | +| `TWO_COMPONENT` | 双组件 | +| `BCD_P` | BCD Plus | +| `BCD_UP` | BCD Up | +| `IEEE754` | IEEE754 浮点数 | +| `ISO_8859_1` | ISO-8859-1 编码 | +| `UTF_8` | UTF-8 编码 | +| `UCS_2` | UCS-2 编码 | +| `NONE` | 无编码 | +| `VOID` | Void | +| `BOOLEAN` | 布尔 | +| `UTF_16` | UTF-16 编码 | + +#### CalibrationAccess + +校准访问权限枚举。 + +```python +from src import CalibrationAccess +``` + +| 枚举值 | 说明 | +|--------|------| +| `READ_ONLY` | 只读 | +| `NOT_ACCESSIBLE` | 不可访问 | +| `READ_WRITE` | 读写 | +| `NOT_SPECIFIED` | 未指定 | + +#### SwCalibrationAccess + +校准访问权限枚举(向后兼容版本)。 + +```python +from src import SwCalibrationAccess +``` + +| 枚举值 | 说明 | +|--------|------| +| `ReadOnly` | 只读 | +| `NotAccessible` | 不可访问 | +| `ReadWrite` | 读写 | +| `NotSpecified` | 未指定 | + +#### UpperSts / LowerSts + +上下限区间状态枚举。 + +```python +from src import UpperSts, LowerSts +``` + +| 枚举值 | 说明 | +|--------|------| +| `CLOSED` | 闭区间 | +| `OPEN` | 开区间 | + +#### ConstraintSpecified + +约束指定类型枚举。 + +```python +from src import ConstraintSpecified +``` + +| 枚举值 | 说明 | +|--------|------| +| `PHYSICAL` | 物理值约束 | +| `INTERNAL` | 内部值约束 | + +#### CompuContents + +转换内容方向枚举。 + +```python +from src import CompuContents +``` + +| 枚举值 | 说明 | +|--------|------| +| `USE_INTERNAL_TO_PHYSICAL` | 使用内部到物理的转换 | +| `USE_PHYSICAL_TO_INTERNAL` | 使用物理到内部的转换 | + +#### ComponentType + +组件类型枚举。 + +```python +from src import ComponentType +``` + +| 枚举值 | 说明 | +|--------|------| +| `COMPOSITION` | 组合组件 | +| `ATOMIC` | 原子组件 | + +#### AtomicType + +原子组件类型枚举。 + +```python +from src import AtomicType +``` + +| 枚举值 | 说明 | +|--------|------| +| `APPLICATION` | 应用组件 | +| `SENSOR_ACTUATOR` | 传感器/执行器组件 | +| `HARDWARE_ABSTRACTION` | 硬件抽象组件 | +| `COMPLEX_DRIVER` | 复杂驱动组件 | +| `SERVICE_PROXY` | 服务代理组件 | + +#### ImplementationCodeType + +实现代码类型枚举。 + +```python +from src import ImplementationCodeType +``` + +| 枚举值 | 说明 | +|--------|------| +| `SOURCE_CODE` | 源代码 | +| `OBJECT_CODE` | 目标代码 | + +#### AccessPoint + +访问点枚举。 + +```python +from src import AccessPoint +``` + +| 枚举值 | 说明 | +|--------|------| +| `READ` | 读取 | +| `WRITE` | 写入 | + +#### PortDirection + +端口方向枚举。 + +```python +from src import PortDirection +``` + +| 枚举值 | 说明 | +|--------|------| +| `IN` | 输入端口 | +| `OUT` | 输出端口 | + +#### Semantic + +数组大小语义枚举。 + +```python +from src import Semantic +``` + +| 枚举值 | 说明 | +|--------|------| +| `FIXED` | 固定大小 | +| `VARIABLE` | 可变大小 | + +#### SectionType + +段类型枚举。 + +```python +from src import SectionType +``` + +| 枚举值 | 说明 | +|--------|------| +| `CODE` | 代码段 | +| `DATA` | 数据段 | +| `CONST` | 常量段 | + +#### Policy + +数据策略枚举。 + +```python +from src import Policy +``` + +| 枚举值 | 说明 | +|--------|------| +| `STANDARD` | 标准策略 | +| `EXTENDED` | 扩展策略 | + +--- + +## 数据类型模块 (types) + +### BaseType + +基础数据类型,表示最底层的原生类型定义。 + +**文件位置:** `src/types/base_type.py` + +```python +from src import BaseType, create_base_type +``` + +#### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `size` | int | 是 | 位大小 (如 8, 16, 32) | +| `category` | Optional[Category] | 否 | 分类类型 | +| `encoding` | Optional[Encoding] | 否 | 编码格式 | +| `native_description` | Optional[str] | 否 | 原生描述 | + +#### 工厂函数 + +##### `create_base_type(name: str, size: int, category: Optional[Category] = None, encoding: Optional[Encoding] = None, native_description: Optional[str] = None) -> BaseType` + +创建 BaseType 实例的工厂函数。 + +**示例:** + +```python +# 创建 8 位无符号整数类型 +uint8 = create_base_type( + name="UInt8", + size=8, + category=Category.FIXED_LENGTH, + encoding=Encoding.TWO_COMPONENT +) +``` + +--- + +### Unit + +数据单位,用于物理量的表示。 + +**文件位置:** `src/types/unit.py` + +```python +from src import Unit, create_unit +``` + +#### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 单位名称 | +| `display` | Optional[str] | 否 | 显示名称 | +| `factor` | Optional[float] | 否 | 因子 | +| `offset` | Optional[float] | 否 | 偏移量 | + +#### 工厂函数 + +##### `create_unit(name: str, display: Optional[str] = None, factor: Optional[float] = None, offset: Optional[float] = None) -> Unit` + +创建 Unit 实例的工厂函数。 + +**示例:** + +```python +unit = create_unit( + name="km_per_hour", + display="km/h", + factor=1.0, + offset=0.0 +) +``` + +--- + +### DataConstraint + +数据约束,定义有效值范围。 + +**文件位置:** `src/types/data_constraint.py` + +```python +from src import DataConstraint, create_data_constraint +``` + +#### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 约束名称 | +| `unit` | Optional[Unit] | 否 | 关联的单位 | +| `lower` | Optional[float] | 否 | 下限值 | +| `upper` | Optional[float] | 否 | 上限值 | +| `lower_sts` | Optional[LowerSts] | 否 | 下限状态 (CLOSED/OPEN) | +| `upper_sts` | Optional[UpperSts] | 否 | 上限状态 (CLOSED/OPEN) | +| `constraint_specified` | Optional[ConstraintSpecified] | 否 | 约束类型 | + +#### 工厂函数 + +##### `create_data_constraint(name: str, lower: Optional[float] = None, upper: Optional[float] = None, unit: Optional[Unit] = None, lower_sts: Optional[LowerSts] = None, upper_sts: Optional[UpperSts] = None, constraint_specified: Optional[ConstraintSpecified] = None) -> DataConstraint` + +创建 DataConstraint 实例的工厂函数。 + +**示例:** + +```python +constraint = create_data_constraint( + name="SpeedConstraint", + lower=0, + upper=250, + lower_sts=LowerSts.CLOSED, + upper_sts=UpperSts.OPEN +) +``` + +--- + +### CompuMethod + +计算方法,定义内部值与物理值之间的转换关系。 + +**文件位置:** `src/types/compu_method.py` + +```python +from src import CompuMethod, Linear, TextTable, create_linear, create_text_table, create_compu_method +``` + +#### Linear 类 + +线性转换方法。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `factor` | float | 是 | 缩放因子 | +| `offset` | float | 是 | 偏移量 | + +转换公式:`physical = factor * internal + offset` + +##### 工厂函数 + +`create_linear(factor: float, offset: float) -> Linear` + +#### TextTable 类 + +文本表转换方法。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `vt` | str | 是 | 文本值 | +| `lower` | Optional[int] | 否 | 下限 | +| `upper` | Optional[int] | 否 | 上限 | +| `lower_sts` | Optional[LowerSts] | 否 | 下限状态 | +| `upper_sts` | Optional[UpperSts] | 否 | 上限状态 | + +##### 工厂函数 + +`create_text_table(vt: str, lower: Optional[int] = None, upper: Optional[int] = None, lower_sts: Optional[LowerSts] = None, upper_sts: Optional[UpperSts] = None) -> TextTable` + +#### CompuMethod 类 + +完整的计算方法。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 方法名称 | +| `unit` | Optional[Unit] | 否 | 单位 | +| `linear` | Optional[Linear] | 否 | 线性转换 | +| `text_tables` | Optional[List[TextTable]] | 否 | 文本表列表 | +| `category` | Optional[Category] | 否 | 分类 | +| `compu_contents` | Optional[CompuContents] | 否 | 转换内容方向 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_text_table(vt: str) -> Optional[TextTable]` | 根据文本值查找文本表 | +| `add_text_table(text_table: TextTable)` | 添加文本表 | + +##### 工厂函数 + +`create_compu_method(name: str, unit: Optional[Unit] = None, linear: Optional[Linear] = None, text_tables: Optional[List[TextTable]] = None, category: Optional[Category] = None, compu_contents: Optional[CompuContents] = None) -> CompuMethod` + +**示例:** + +```python +# 创建带线性转换的计算方法 +linear = create_linear(factor=0.01, offset=0) +compu = create_compu_method( + name="SpeedConversion", + linear=linear, + category=Category.LINEAR +) + +# 创建带文本表的计算方法 +table = create_text_table(vt="OK", lower=0, upper=0) +compu = create_compu_method( + name="StatusConversion", + text_tables=[table], + category=Category.TEXT_TABLE +) +``` + +--- + +### 应用数据类型 + +#### ApplicationBooleanDataType + +布尔类型应用数据。 + +**文件位置:** `src/types/application_types.py` + +```python +from src import ApplicationBooleanDataType, create_boolean_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | +| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | + +##### 工厂函数 + +`create_boolean_type(name: str, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ApplicationBooleanDataType` + +--- + +#### ApplicationValueDataType + +标量值类型应用数据。 + +```python +from src import ApplicationValueDataType, create_value_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `unit` | Optional[Unit] | 否 | 单位 | +| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | +| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | + +##### 工厂函数 + +`create_value_type(name: str, unit: Optional[Unit] = None, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ApplicationValueDataType` + +--- + +#### ApplicationStructureDataType + +结构体类型应用数据。 + +```python +from src import ApplicationStructureDataType, create_structure_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `structure_elements` | Optional[List[StructureElement]] | 否 | 结构体成员列表 | + +##### 嵌套类:StructureElement + +结构体成员元素。 + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 成员名称 | +| `data_type` | Base | 是 | 数据类型 | +| `offset` | Optional[int] | 否 | 位偏移 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_element(name: str) -> Optional[StructureElement]` | 查找成员 | +| `add_element(element: StructureElement)` | 添加成员 | + +##### 工厂函数 + +`create_structure_type(name: str, elements: Optional[List[ApplicationStructureDataType.StructureElement]] = None) -> ApplicationStructureDataType` + +--- + +#### ApplicationArrayDataType + +数组类型应用数据。 + +```python +from src import ApplicationArrayDataType, create_array_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `element` | Optional[ArrayElement] | 否 | 数组元素 | + +##### 嵌套类:ArrayElement + +数组元素配置。 + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `length` | int | 是 | 数组长度 | +| `data_type` | Base | 是 | 元素数据类型 | +| `array_size_semantics` | Optional[Semantic] | 否 | 大小语义 | + +##### 工厂函数 + +`create_array_type(name: str, element: Optional[ApplicationArrayDataType.ArrayElement] = None) -> ApplicationArrayDataType` + +--- + +### 实现数据类型 + +#### ImplementationValueDataType + +实现层标量值类型。 + +**文件位置:** `src/types/implementation_types.py` + +```python +from src import ImplementationValueDataType, create_impl_value_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `base_type` | Optional[BaseType] | 否 | 基础类型 | +| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | +| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | + +##### 工厂函数 + +`create_impl_value_type(name: str, base_type: Optional[BaseType] = None, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ImplementationValueDataType` + +--- + +#### ImplementationStructureDataType + +实现层结构体类型。 + +```python +from src import ImplementationStructureDataType, create_impl_structure_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `structure_elements` | Optional[List[StructureElement]] | 否 | 结构体成员列表 | + +##### 嵌套类:StructureElement + +与 ApplicationStructureDataType.StructureElement 结构相同。 + +##### 工厂函数 + +`create_impl_structure_type(name: str, elements: Optional[List[ImplementationStructureDataType.StructureElement]] = None) -> ImplementationStructureDataType` + +--- + +#### ImplementationArrayDataType + +实现层数组类型。 + +```python +from src import ImplementationArrayDataType, create_impl_array_type +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 类型名称 | +| `element` | Optional[ArrayElement] | 否 | 数组元素 | + +##### 嵌套类:ArrayElement + +与 ApplicationArrayDataType.ArrayElement 结构相同。 + +##### 工厂函数 + +`create_impl_array_type(name: str, element: Optional[ImplementationArrayDataType.ArrayElement] = None) -> ImplementationArrayDataType` + +--- + +### SwAddrMethod + +软件地址方法,定义代码/数据的内存段。 + +**文件位置:** `src/types/sw_addr_method.py` + +```python +from src import SwAddrMethod, create_sw_addr_method, SectionType +``` + +#### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 方法名称 | +| `section_type` | Optional[SectionType] | 否 | 段类型 (CODE/DATA/CONST) | + +#### 工厂函数 + +`create_sw_addr_method(name: str, section_type: Optional[SectionType] = None) -> SwAddrMethod` + +**示例:** + +```python +# 代码段地址方法 +code_method = create_sw_addr_method("CODE", section_type=SectionType.CODE) + +# 数据段地址方法 +data_method = create_sw_addr_method("DATA", section_type=SectionType.DATA) +``` + +--- + +### 数据类型映射 + +#### DataTypeMapping + +应用类型到实现类型的映射。 + +**文件位置:** `src/types/data_mapping.py` + +```python +from src import DataTypeMapping, create_data_type_mapping +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 映射名称 | +| `application_data_type` | Base | 是 | 应用数据类型 | +| `implementation_data_type` | Base | 是 | 实现数据类型 | + +##### 工厂函数 + +`create_data_type_mapping(name: str, application_data_type: Base, implementation_data_type: Base) -> DataTypeMapping` + +--- + +#### DataTypeMappingSet + +数据类型映射集合。 + +```python +from src import DataTypeMappingSet, create_data_type_mapping_set +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 集合名称 | +| `data_type_mappings` | Optional[List[DataTypeMapping]] | 否 | 映射列表 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_mapping(name: str) -> Optional[DataTypeMapping]` | 查找映射 | +| `add_mapping(mapping: DataTypeMapping)` | 添加映射 | + +##### 工厂函数 + +`create_data_type_mapping_set(name: str, mappings: Optional[List[DataTypeMapping]] = None) -> DataTypeMappingSet` + +--- + +### 接口 + +#### Interface + +接口基类。 + +**文件位置:** `src/types/interface.py` + +```python +from src import Interface +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 接口名称 | +| `is_service` | bool | 否 | 是否为服务接口 (默认 False) | + +--- + +#### SenderReceiverInterface + +发送-接收接口,用于数据信号传递。 + +```python +from src import SenderReceiverInterface, create_sender_receiver_interface, Policy, CalibrationAccess +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 接口名称 | +| `data_element` | Optional[SenderReceiverInterface.DataElement] | 否 | 数据元素 | +| `is_service` | bool | 否 | 是否为服务接口 | + +##### 嵌套类:DataElement + +数据元素定义。 + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 元素名称 | +| `sw_addr_method` | Optional[SwAddrMethod] | 否 | 地址方法 | +| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | +| `data_type` | Base | 是 | 数据类型 | +| `policy` | Optional[Policy] | 否 | 数据策略 | +| `calibration_access` | Optional[CalibrationAccess] | 否 | 校准访问权限 | + +##### 工厂函数 + +`create_sender_receiver_interface(name: str, data_element: Optional[SenderReceiverInterface.DataElement] = None, is_service: bool = False) -> SenderReceiverInterface` + +--- + +#### ClientServerInterface + +客户端-服务端接口,用于服务调用。 + +```python +from src import ClientServerInterface +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 接口名称 | +| `operations` | Optional[List[Operation]] | 否 | 操作列表 | +| `is_service` | bool | 否 | 是否为服务接口 | + +##### 嵌套类:Operation + +服务操作定义。 + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 操作名称 | +| `is_server` | bool | 否 | 是否为服务端 | +| `arguments` | Optional[List[Argument]] | 否 | 参数列表 | + +##### 嵌套类:Argument + +操作参数定义。 + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 参数名称 | +| `direction` | PortDirection | 是 | 参数方向 (IN/OUT) | +| `data_type` | Base | 是 | 参数数据类型 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_operation(name: str) -> Optional[Operation]` | 查找操作 | +| `add_operation(operation: Operation)` | 添加操作 | + +--- + +### 软件组件类型 + +#### SwComponentType + +软件组件类型基类。 + +**文件位置:** `src/types/sw_component_type.py` + +```python +from src import SwComponentType, ComponentType +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 组件名称 | +| `component_type` | Optional[ComponentType] | 否 | 组件类型 | + +--- + +#### ApplicationSwComponentType + +应用软件组件类型。 + +```python +from src import ApplicationSwComponentType +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 组件名称 | +| `supports_multiple_instantiation` | bool | 否 | 是否支持多实例化 | +| `atomic_type` | Optional[AtomicType] | 否 | 原子类型 | +| `implementation_code_type` | Optional[ImplementationCodeType] | 否 | 实现代码类型 | +| `ports` | Optional[List[PortPrototype]] | 否 | 端口列表 | +| `internal_behavior` | Optional[SwcInternalBehavior] | 否 | 内部行为 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_port(name: str) -> Optional[PortPrototype]` | 查找端口 | +| `add_port(port: PortPrototype)` | 添加端口 | + +--- + +#### PortPrototype + +端口原型基类。 + +```python +from src import PortPrototype, PortDirection +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 端口名称 | +| `interface` | Optional[Interface] | 否 | 关联接口 | + +--- + +#### RPortPrototype + +接收端口 (Required Port)。 + +```python +from src import RPortPrototype +``` + +继承自 PortPrototype,用于从其他组件接收数据。 + +--- + +#### PPortPrototype + +发送端口 (Provided Port)。 + +```python +from src import PPortPrototype +``` + +继承自 PortPrototype,用于向其他组件发送数据。 + +--- + +#### PRPortPrototype + +双向端口 (Provided Required Port)。 + +```python +from src import PRPortPrototype +``` + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 端口名称 | +| `interface` | Optional[Interface] | 否 | 提供接口 | +| `required_interface` | Optional[Interface] | 否 | 需求接口 | + +--- + +### Package + +AUTOSAR 包,用于组织和管理元素。 + +**文件位置:** `src/types/package.py` + +```python +from src import Package, create_package +``` + +#### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 包名称 | +| `elements` | Optional[List[Base]] | 否 | 包内元素列表 | + +#### 方法 + +| 方法 | 说明 | +|------|------| +| `get_element(name: str) -> Optional[Base]` | 查找元素 | +| `add_element(element: Base)` | 添加元素 (支持覆盖同名元素) | + +#### 工厂函数 + +`create_package(name: str, elements: Optional[List[Base]] = None) -> Package` + +**示例:** + +```python +# 创建包并添加元素 +pkg = create_package("SensorPkg", elements=[ + base_type, + impl_type, + interface, + component +]) +``` + +--- + +### SwcInternalBehavior + +软件组件内部行为。 + +**文件位置:** `src/types/swc_internal_behavior.py` + +```python +from src import SwcInternalBehavior, RunnableEntity, create_runnable_entity, create_timing_event, create_init_event +``` + +#### VariableAccess + +变量访问定义。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 访问名称 | +| `port_prototype_ref` | Optional[str] | 否 | 端口原型引用 | +| `target_data_prototype_ref` | Optional[str] | 否 | 目标数据原型引用 | + +--- + +#### RunnableEntity + +可运行实体 (Runnable)。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | Runnable 名称 | +| `minimum_start_interval` | Optional[float] | 否 | 最小启动间隔 (秒) | +| `can_be_invoked_concurrently` | bool | 否 | 是否可并发调用 | +| `data_receive_points` | Optional[List[VariableAccess]] | 否 | 数据接收点 | +| `data_send_points` | Optional[List[VariableAccess]] | 否 | 数据发送点 | +| `variable_accesses` | Optional[List[VariableAccess]] | 否 | 变量访问列表 | +| `symbol` | Optional[str] | 否 | 符号 (函数名) | +| `sw_addr_method_ref` | Optional[SwAddrMethod] | 否 | 地址方法引用 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `add_data_receive_point(access: VariableAccess)` | 添加数据接收点 | +| `add_data_send_point(access: VariableAccess)` | 添加数据发送点 | +| `add_variable_access(access: VariableAccess)` | 添加变量访问 | + +##### 工厂函数 + +`create_runnable_entity(name: str, symbol: Optional[str] = None, minimum_start_interval: Optional[float] = None) -> RunnableEntity` + +--- + +#### 事件类型 + +##### InitEvent + +初始化事件。 + +```python +from src import InitEvent + +event = InitEvent(name="Init", runnable_ref="MyRunnable") +``` + +##### TimingEvent + +定时事件。 + +```python +from src import TimingEvent, create_timing_event + +event = create_timing_event(name="Timing_10ms", period=0.01) +``` + +**构造函数属性:** + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 事件名称 | +| `period` | float | 是 | 周期 (秒) | + +##### OperationInvokedEvent + +操作调用事件。 + +```python +from src import OperationInvokedEvent, create_operation_invoked_event + +event = create_operation_invoked_event(name="OpInvoke", operation_ref="MyOperation") +``` + +##### DataReceivedEvent + +数据接收事件。 + +```python +from src import DataReceivedEvent, create_data_received_event + +event = create_data_received_event(name="DataRx", data_element_ref="MyDataElement", period=0.01) +``` + +--- + +#### SwcInternalBehavior + +软件组件内部行为容器。 + +##### 构造函数属性 + +| 属性名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| `name` | str | 是 | 行为名称 | +| `runnable_entities` | Optional[List[RunnableEntity]] | 否 | Runnable 列表 | +| `events` | Optional[List[Union[InitEvent, TimingEvent, OperationInvokedEvent, DataReceivedEvent]]] | 否 | 事件列表 | +| `symbol` | Optional[str] | 否 | 符号前缀 | + +##### 方法 + +| 方法 | 说明 | +|------|------| +| `get_runnable(name: str) -> Optional[RunnableEntity]` | 查找 Runnable | +| `add_runnable(runnable: RunnableEntity)` | 添加 Runnable | +| `get_event(name: str) -> Optional[Event]` | 查找事件 | +| `add_event(event: Event)` | 添加事件 | + +##### 工厂函数 + +`create_swc_internal_behavior(name: str, runnable_entities: Optional[List[RunnableEntity]] = None, events: Optional[List[Event]] = None) -> SwcInternalBehavior` + +--- + +## 工具模块 (utils) + +### create_arxml_document() -> Document + +创建标准 ARXML 文档,包含 AUTOSAR 命名空间。 + +**文件位置:** `src/utils/arxml_writer.py` + +```python +from src import create_arxml_document + +doc = create_arxml_document() +``` + +**返回:** +- xml.dom.minidom.Document 对象 + +--- + +### write_arxml(doc: Document, filepath: str, encoding: str = 'utf-8') -> None + +将 Document 写入文件 (紧凑格式)。 + +```python +from src import create_arxml_document, write_arxml + +doc = create_arxml_document() +# ... 添加内容 ... +write_arxml(doc, "output.arxml") +``` + +--- + +### write_arxml_pretty(doc: Document, filepath: str, encoding: str = 'utf-8') -> None + +将 Document 写入文件 (格式化输出)。 + +```python +from src import create_arxml_document, write_arxml_pretty + +doc = create_arxml_document() +# ... 添加内容 ... +write_arxml_pretty(doc, "output_formatted.arxml") +``` + +--- + +### get_ar_packages_element(doc: Document) -> Element + +获取 AR-PACKAGES 根元素。 + +```python +from src import get_ar_packages_element + +doc = create_arxml_document() +packages = get_ar_packages_element(doc) +``` + +--- + +### add_package_to_document(doc: Document, package_element: Element) -> None + +将 Package 元素添加到文档。 + +```python +from src import add_package_to_document + +pkg_element = package.to_arxml(doc) +add_package_to_document(doc, pkg_element) +``` + +--- + +## 使用指南 + +### 基础类型创建 + +#### 创建基本整数类型 + +```python +from src import create_base_type, Category, Encoding + +uint8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) +uint16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) +sint8 = create_base_type("Sint8", size=8, encoding=Encoding.TWO_COMPONENT) +float32 = create_base_type("Float32", size=32, encoding=Encoding.IEEE754) +``` + +#### 创建带文本表的类型 + +```python +from src import ( + create_base_type, create_unit, create_data_constraint, + create_linear, create_text_table, create_compu_method, + Category, LowerSts, UpperSts +) + +unit = create_unit("km/h", display="km/h", factor=1.0, offset=0.0) + +constraint = create_data_constraint( + "SpeedConstraint", + lower=0, upper=250, + lower_sts=LowerSts.CLOSED, + upper_sts=UpperSts.OPEN +) + +linear = create_linear(factor=0.01, offset=0) + +compu = create_compu_method( + "SpeedConversion", + unit=unit, + linear=linear, + category=Category.LINEAR +) + +value_type = create_value_type( + "Speed", + unit=unit, + compu_method=compu, + data_constraint=constraint +) +``` + +--- + +### 应用数据类型 + +#### 布尔类型 + +```python +from src import create_boolean_type, create_compu_method, create_linear, Category + +bool_compu = create_compu_method( + "BoolConversion", + linear=create_linear(factor=1, offset=0), + category=Category.BOOLEAN +) + +bool_type = create_boolean_type("ErrorFlag", compu_method=bool_compu) +``` + +#### 值类型 + +```python +from src import create_value_type, create_unit, create_linear, create_compu_method, Category + +unit = create_unit("deg", display="°C") +linear = create_linear(factor=0.1, offset=-40) +compu = create_compu_method("Temperature", unit=unit, linear=linear, category=Category.LINEAR) + +temp_type = create_value_type("Temperature", unit=unit, compu_method=compu) +``` + +#### 结构体类型 + +```python +from src import ( + ApplicationStructureDataType, create_value_type, + create_unit, create_linear, create_compu_method +) + +unit = create_unit("V") +linear = create_linear(factor=0.001, offset=0) +compu = create_compu_method("Voltage", unit=unit, linear=linear, category=Category.LINEAR) +voltage_type = create_value_type("Voltage", unit=unit, compu_method=compu) + +current_type = create_value_type("Current", unit=unit, compu_method=compu) + +structure = ApplicationStructureDataType(name="PowerData") +structure.add_element( + ApplicationStructureDataType.StructureElement(name="voltage", data_type=voltage_type, offset=0) +) +structure.add_element( + ApplicationStructureDataType.StructureElement(name="current", data_type=current_type, offset=32) +) +``` + +#### 数组类型 + +```python +from src import ApplicationArrayDataType, create_value_type, create_unit, Semantic + +element_type = create_value_type("SensorValue", unit=create_unit("counts")) + +array_type = ApplicationArrayDataType(name="SensorData") +array_type.element = ApplicationArrayDataType.ArrayElement( + length=10, + data_type=element_type, + array_size_semantics=Semantic.FIXED +) +``` + +--- + +### 实现数据类型 + +#### 值类型 + +```python +from src import create_impl_value_type, create_base_type, create_value_type, Encoding + +base_type = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) +app_type = create_value_type("AppCounter") + +impl_type = create_impl_value_type("ImplCounter", base_type=base_type) +``` + +#### 结构体类型 + +```python +from src import ImplementationStructureDataType, create_impl_value_type, create_base_type, Encoding + +base_u8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) +base_u16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) + +impl_u8 = create_impl_value_type("ImplUInt8", base_type=base_u8) +impl_u16 = create_impl_value_type("ImplUInt16", base_type=base_u16) + +struct_type = ImplementationStructureDataType(name="ImplStatus") +struct_type.add_element( + ImplementationStructureDataType.StructureElement(name="status", data_type=impl_u8, offset=0) +) +struct_type.add_element( + ImplementationStructureDataType.StructureElement(name="value", data_type=impl_u16, offset=8) +) +``` + +#### 数组类型 + +```python +from src import ImplementationArrayDataType, create_impl_value_type, create_base_type, Semantic, Encoding + +base = create_base_type("UInt32", size=32, encoding=Encoding.TWO_COMPONENT) +element_type = create_impl_value_type("ImplUInt32", base_type=base) + +impl_array = ImplementationArrayDataType(name="ImplBuffer") +impl_array.element = ImplementationArrayDataType.ArrayElement( + length=16, + data_type=element_type, + array_size_semantics=Semantic.FIXED +) +``` + +--- + +### 数据类型映射 + +```python +from src import ( + DataTypeMapping, DataTypeMappingSet, + create_value_type, create_impl_value_type, create_base_type, Encoding +) + +base = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) +app_type = create_value_type("AppStatus") +impl_type = create_impl_value_type("ImplStatus", base_type=base) + +mapping = DataTypeMapping( + name="StatusMapping", + application_data_type=app_type, + implementation_data_type=impl_type +) + +mapping_set = DataTypeMappingSet(name="DefaultMappings") +mapping_set.add_mapping(mapping) +``` + +--- + +### 接口定义 + +#### 发送-接收接口 + +```python +from src import ( + SenderReceiverInterface, create_sender_receiver_interface, + create_value_type, create_unit, Policy, CalibrationAccess +) + +unit = create_unit("km/h") +data_element = SenderReceiverInterface.DataElement( + name="Speed", + data_type=create_value_type("Speed", unit=unit), + policy=Policy.STANDARD, + calibration_access=CalibrationAccess.READ_ONLY +) + +interface = create_sender_receiver_interface("SpeedInterface", data_element=data_element) +``` + +#### 客户端-服务端接口 + +```python +from src import ( + ClientServerInterface, create_value_type, create_unit, + PortDirection +) + +unit = create_unit("counts") + +operation = ClientServerInterface.Operation( + name="Initialize", + is_server=True, + arguments=[ + ClientServerInterface.Argument( + name="config", + direction=PortDirection.IN, + data_type=create_value_type("Config", unit=unit) + ) + ] +) + +cs_interface = ClientServerInterface(name="ControlInterface") +cs_interface.add_operation(operation) +``` + +--- + +### 软件组件 + +#### 创建组件 + +```python +from src import ( + ApplicationSwComponentType, PPortPrototype, RPortPrototype, + SenderReceiverInterface, create_sender_receiver_interface, + AtomicType, ComponentType +) + +interface = create_sender_receiver_interface("DataInterface") +port = PPortPrototype(name="DataPort", interface=interface) + +component = ApplicationSwComponentType( + name="SensorComponent", + supports_multiple_instantiation=False, + atomic_type=AtomicType.APPLICATION +) +component.add_port(port) +``` + +#### 创建组合组件 + +```python +from src import SwComponentType, ComponentType, AtomicComponentType, CompositionSwComponentType + +child1 = ApplicationSwComponentType(name="Child1") +child2 = ApplicationSwComponentType(name="Child2") + +composition = CompositionSwComponentType(name="Composition") +composition._component_type = ComponentType.COMPOSITION +``` + +--- + +### 内部行为 + +#### 创建 Runnable 和事件 + +```python +from src import ( + SwcInternalBehavior, RunnableEntity, TimingEvent, InitEvent, + VariableAccess, create_swc_internal_behavior, create_runnable_entity, + create_timing_event, create_init_event, create_data_received_event +) + +runnable = create_runnable_entity( + name="UpdateMeasurement", + symbol="UpdateMeasurement", + minimum_start_interval=0.01 +) +runnable.add_variable_access( + VariableAccess(name="SpeedAccess", port_prototype_ref="SpeedPort") +) + +timing_event = create_timing_event(name="Timing_10ms", period=0.01) +init_event = InitEvent(name="Init", runnable_ref="UpdateMeasurement") + +data_rx_event = create_data_received_event( + name="DataReady", + data_element_ref="ReadyFlag", + period=0.05 +) + +behavior = create_swc_internal_behavior( + name="SensorBehavior", + runnable_entities=[runnable], + events=[timing_event, init_event, data_rx_event] +) + +component = ApplicationSwComponentType(name="Sensor") +component.internal_behavior = behavior +``` + +--- + +### 打包与导出 + +#### 基本导出流程 + +```python +from src import ( + create_arxml_document, write_arxml, create_package, + get_ar_packages_element, add_package_to_document, + create_base_type, create_value_type, create_unit +) + +doc = create_arxml_document() +packages_element = get_ar_packages_element(doc) + +base_type = create_base_type("UInt8", size=8) +app_type = create_value_type("AppData") +package = create_package("MyPkg", elements=[base_type, app_type]) + +package_element = package.to_arxml(doc) +add_package_to_document(doc, package_element) + +write_arxml(doc, "output.arxml") +``` + +#### 格式化输出 + +```python +from src import write_arxml_pretty + +write_arxml_pretty(doc, "output_formatted.arxml") +``` + +--- + +### 完整示例 + +以下示例创建一个完整的 AUTOSAR 软件组件配置: + +```python +from src import ( + create_arxml_document, write_arxml_pretty, create_package, + get_ar_packages_element, add_package_to_document, + create_base_type, create_unit, create_linear, create_compu_method, + create_value_type, create_impl_value_type, + create_sender_receiver_interface, SenderReceiverInterface, + ApplicationSwComponentType, PPortPrototype, RPortPrototype, + SwcInternalBehavior, RunnableEntity, TimingEvent, InitEvent, + Category, Encoding, AtomicType, Policy, CalibrationAccess, + create_sw_addr_method, SectionType, DataTypeMappingSet, DataTypeMapping +) + +doc = create_arxml_document() + +base_uint8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) +base_uint16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) + +kmh_unit = create_unit("kmh", display="km/h", factor=1.0, offset=0.0) +speed_linear = create_linear(factor=0.01, offset=0) +speed_compu = create_compu_method("SpeedCompu", unit=kmh_unit, linear=speed_linear, category=Category.LINEAR) + +app_speed = create_value_type("AppSpeed", unit=kmh_unit, compu_method=speed_compu) +impl_speed = create_impl_value_type("ImplSpeed", base_type=base_uint16) + +mapping = DataTypeMapping( + name="SpeedMapping", + application_data_type=app_speed, + implementation_data_type=impl_speed +) +mapping_set = DataTypeMappingSet(name="SpeedMappingSet") +mapping_set.add_mapping(mapping) + +data_element = SenderReceiverInterface.DataElement( + name="SpeedData", + data_type=app_speed, + policy=Policy.STANDARD, + calibration_access=CalibrationAccess.READ_WRITE +) +speed_interface = create_sender_receiver_interface("SpeedInterface", data_element=data_element) + +code_method = create_sw_addr_method("CODE", section_type=SectionType.CODE) + +runnable = RunnableEntity( + name="UpdateSpeed", + symbol="UpdateSpeed", + minimum_start_interval=0.01, + can_be_invoked_concurrently=False +) +runnable.add_variable_access( + VariableAccess(name="SpeedAccess", port_prototype_ref="SpeedPort") +) + +timing = TimingEvent(name="Timing_10ms", period=0.01) +init = InitEvent(name="Init", runnable_ref="UpdateSpeed") + +behavior = SwcInternalBehavior( + name="SpeedSensorBehavior", + runnable_entities=[runnable], + events=[timing, init], + symbol="SpeedSensor" +) + +port = PPortPrototype(name="SpeedPort", interface=speed_interface) + +component = ApplicationSwComponentType( + name="SpeedSensorComponent", + supports_multiple_instantiation=False, + atomic_type=AtomicType.APPLICATION, + internal_behavior=behavior +) +component.add_port(port) + +package = create_package("SpeedSensorPkg", elements=[ + base_uint8, + base_uint16, + kmh_unit, + app_speed, + impl_speed, + mapping_set, + speed_interface, + code_method, + component +]) + +package_element = package.to_arxml(doc) +add_package_to_document(doc, package_element) + +write_arxml_pretty(doc, "SpeedSensor.arxml") +print("Generated: SpeedSensor.arxml") +``` + +--- + +## API 参考 + +### 索引 + +- [Base](#base-类) - 所有类型的基类 +- [Category](#category) - 数据分类枚举 +- [create_uuid](#create_uuid--str) - UUID 生成 +- [create_arxml_document](#create_arxml_document---document) - 文档创建 +- [write_arxml](#write_arxmldoc-document-filepath-str-encoding-str--utf-8---none) - 文件写入 +- [create_package](#package) - 包创建 +- [create_base_type](#basetype) - 基础类型创建 +- [create_value_type](#applicationvaluedatatype) - 值类型创建 +- [create_sender_receiver_interface](#senderreceiverinterface) - 接口创建 +- [ApplicationSwComponentType](#applicationswcomponenttype) - 组件类型 +- [create_swc_internal_behavior](#swcinternalbehavior) - 内部行为创建 + +--- + +## 常见问题 + +### Q: 如何创建多个端口? + +```python +interface1 = create_sender_receiver_interface("DataInterface") +interface2 = create_sender_receiver_interface("StatusInterface") + +component = ApplicationSwComponentType(name="MyComponent") +component.add_port(PPortPrototype(name="DataPort", interface=interface1)) +component.add_port(RPortPrototype(name="StatusPort", interface=interface2)) +``` + +### Q: 如何添加多个 Runnable? + +```python +behavior = SwcInternalBehavior(name="Behavior") + +runnable1 = create_runnable_entity(name="InitRunnable", symbol="Init") +runnable2 = create_runnable_entity(name="MainRunnable", symbol="Main", minimum_start_interval=0.01) + +behavior.add_runnable(runnable1) +behavior.add_runnable(runnable2) + +component = ApplicationSwComponentType(name="MyComponent") +component.internal_behavior = behavior +``` + +### Q: 如何创建嵌套结构体? + +```python +inner_type = create_value_type("InnerValue") +inner_struct = ApplicationStructureDataType(name="InnerStruct") +inner_struct.add_element( + ApplicationStructureDataType.StructureElement(name="value", data_type=inner_type) +) + +outer_struct = ApplicationStructureDataType(name="OuterStruct") +outer_struct.add_element( + ApplicationStructureDataType.StructureElement(name="inner", data_type=inner_struct) +) +``` + +--- + +## 相关文档 + +- [使用指南](docs/guide.md) +- [架构设计](docs/architecture.md) +- [API 参考](docs/api_reference.md) \ No newline at end of file diff --git a/docs/api_reference.md b/docs/api_reference.md deleted file mode 100644 index 27cee77..0000000 --- a/docs/api_reference.md +++ /dev/null @@ -1,1312 +0,0 @@ -# API 参考 - -## 目录 - -- [核心模块 (core)](#核心模块-core) - - [Base 类](#base-类) - - [公共函数](#公共函数) - - [枚举类型](#枚举类型) -- [数据类型模块 (types)](#数据类型模块-types) - - [BaseType](#basetype) - - [Unit](#unit) - - [DataConstraint](#dataconstraint) - - [CompuMethod](#compumethod) - - [应用数据类型](#应用数据类型) - - [实现数据类型](#实现数据类型) - - [SwAddrMethod](#swaddrmethod) - - [数据类型映射](#数据类型映射) - - [接口](#接口) - - [软件组件类型](#软件组件类型) - - [Package](#package) - - [SwcInternalBehavior](#swcinternalbehavior) -- [工具模块 (utils)](#工具模块-utils) - ---- - -## 核心模块 (core) - -### Base 类 - -所有类型的基类,提供通用的属性和方法。 - -**文件位置:** `src/core/base.py` - -```python -from src.core.base import Base -``` - -#### 属性 - -| 属性名 | 类型 | 说明 | -|--------|------|------| -| `name` | str | 元素名称 | -| `id` | Optional[int] | 元素标识符 | -| `parent` | Optional[Base] | 父元素引用 | -| `description` | Optional[str] | 元素描述 | - -#### 只读属性 - -| 属性名 | 类型 | 说明 | -|--------|------|------| -| `class_name` | str | 获取类型名称 (如 "ApplicationValueDataType") | -| `parent_id` | Optional[int] | 获取父类的 id | -| `package_path` | str | 获取完整包路径 (如 "/Package/SubPackage/Name") | - -#### 方法 - -##### `to_arxml(doc: Document) -> Element` - -将对象序列化为 ARXML DOM 元素。**必须被子类重写。** - -**参数:** -- `doc`: XML Document 对象 - -**返回:** -- ARXML DOM Element - ---- - -### 公共函数 - -#### `create_uuid() -> str` - -生成一个 UUID 字符串。 - -```python -from src.core.base import create_uuid - -uuid = create_uuid() # e.g., "a1b2c3d4-e5f6-7890-abcd-ef1234567890" -``` - -#### `create_text_element(doc: Document, tag: str, text: str) -> Element` - -创建带有文本内容的 XML 元素。 - -**参数:** -- `doc`: XML Document 对象 -- `tag`: XML 标签名 -- `text`: 元素文本内容 - -**返回:** -- XML Element - -**示例:** - -```python -from src.core.base import create_text_element -from src.utils import create_arxml_document - -doc = create_arxml_document() -element = create_text_element(doc, "SHORT-NAME", "MyElement") -``` - ---- - -### 枚举类型 - -#### Category - -数据类型分类枚举。 - -**文件位置:** `src/core/enums.py` - -```python -from src import Category -``` - -| 枚举值 | 说明 | -|--------|------| -| `FIXED_LENGTH` | 固定长度 | -| `IDENTICAL` | 相同 | -| `TEXT_TABLE` | 文本表 | -| `LINEAR` | 线性 | -| `BOOLEAN` | 布尔 | -| `VALUE` | 值类型 | -| `STRUCTURE` | 结构体 | -| `ARRAY` | 数组 | -| `SCALE_LINEAR` | 缩放线性 | -| `RECORD` | 记录 | -| `UNION` | 联合 | -| `DATA_REFERENCE` | 数据引用 | -| `TYPE_REFERENCE` | 类型引用 | - -#### Encoding - -数据编码格式枚举。 - -```python -from src import Encoding -``` - -| 枚举值 | 说明 | -|--------|------| -| `ONE_COMPONENT` | 单组件 | -| `TWO_COMPONENT` | 双组件 | -| `BCD_P` | BCD Plus | -| `BCD_UP` | BCD Up | -| `IEEE754` | IEEE754 浮点数 | -| `ISO_8859_1` | ISO-8859-1 编码 | -| `UTF_8` | UTF-8 编码 | -| `UCS_2` | UCS-2 编码 | -| `NONE` | 无编码 | -| `VOID` | Void | -| `BOOLEAN` | 布尔 | -| `UTF_16` | UTF-16 编码 | - -#### CalibrationAccess - -校准访问权限枚举。 - -```python -from src import CalibrationAccess -``` - -| 枚举值 | 说明 | -|--------|------| -| `READ_ONLY` | 只读 | -| `NOT_ACCESSIBLE` | 不可访问 | -| `READ_WRITE` | 读写 | -| `NOT_SPECIFIED` | 未指定 | - -#### SwCalibrationAccess - -校准访问权限枚举(向后兼容版本)。 - -```python -from src import SwCalibrationAccess -``` - -| 枚举值 | 说明 | -|--------|------| -| `ReadOnly` | 只读 | -| `NotAccessible` | 不可访问 | -| `ReadWrite` | 读写 | -| `NotSpecified` | 未指定 | - -#### UpperSts / LowerSts - -上下限区间状态枚举。 - -```python -from src import UpperSts, LowerSts -``` - -| 枚举值 | 说明 | -|--------|------| -| `CLOSED` | 闭区间 | -| `OPEN` | 开区间 | - -#### ConstraintSpecified - -约束指定类型枚举。 - -```python -from src import ConstraintSpecified -``` - -| 枚举值 | 说明 | -|--------|------| -| `PHYSICAL` | 物理值约束 | -| `INTERNAL` | 内部值约束 | - -#### CompuContents - -转换内容方向枚举。 - -```python -from src import CompuContents -``` - -| 枚举值 | 说明 | -|--------|------| -| `USE_INTERNAL_TO_PHYSICAL` | 使用内部到物理的转换 | -| `USE_PHYSICAL_TO_INTERNAL` | 使用物理到内部的转换 | - -#### ComponentType - -组件类型枚举。 - -```python -from src import ComponentType -``` - -| 枚举值 | 说明 | -|--------|------| -| `COMPOSITION` | 组合组件 | -| `ATOMIC` | 原子组件 | - -#### AtomicType - -原子组件类型枚举。 - -```python -from src import AtomicType -``` - -| 枚举值 | 说明 | -|--------|------| -| `APPLICATION` | 应用组件 | -| `SENSOR_ACTUATOR` | 传感器/执行器组件 | -| `HARDWARE_ABSTRACTION` | 硬件抽象组件 | -| `COMPLEX_DRIVER` | 复杂驱动组件 | -| `SERVICE_PROXY` | 服务代理组件 | - -#### ImplementationCodeType - -实现代码类型枚举。 - -```python -from src import ImplementationCodeType -``` - -| 枚举值 | 说明 | -|--------|------| -| `SOURCE_CODE` | 源代码 | -| `OBJECT_CODE` | 目标代码 | - -#### AccessPoint - -访问点枚举。 - -```python -from src import AccessPoint -``` - -| 枚举值 | 说明 | -|--------|------| -| `READ` | 读取 | -| `WRITE` | 写入 | - -#### PortDirection - -端口方向枚举。 - -```python -from src import PortDirection -``` - -| 枚举值 | 说明 | -|--------|------| -| `IN` | 输入端口 | -| `OUT` | 输出端口 | - -#### Semantic - -数组大小语义枚举。 - -```python -from src import Semantic -``` - -| 枚举值 | 说明 | -|--------|------| -| `FIXED` | 固定大小 | -| `VARIABLE` | 可变大小 | - -#### SectionType - -段类型枚举。 - -```python -from src import SectionType -``` - -| 枚举值 | 说明 | -|--------|------| -| `CODE` | 代码段 | -| `DATA` | 数据段 | -| `CONST` | 常量段 | - -#### Policy - -数据策略枚举。 - -```python -from src import Policy -``` - -| 枚举值 | 说明 | -|--------|------| -| `STANDARD` | 标准策略 | -| `EXTENDED` | 扩展策略 | - ---- - -## 数据类型模块 (types) - -### BaseType - -基础数据类型,表示最底层的原生类型定义。 - -**文件位置:** `src/types/base_type.py` - -```python -from src import BaseType, create_base_type -``` - -#### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `size` | int | 是 | 位大小 (如 8, 16, 32) | -| `category` | Optional[Category] | 否 | 分类类型 | -| `encoding` | Optional[Encoding] | 否 | 编码格式 | -| `native_description` | Optional[str] | 否 | 原生描述 | - -#### 工厂函数 - -##### `create_base_type(name: str, size: int, category: Optional[Category] = None, encoding: Optional[Encoding] = None, native_description: Optional[str] = None) -> BaseType` - -创建 BaseType 实例的工厂函数。 - -**示例:** - -```python -# 创建 8 位无符号整数类型 -uint8 = create_base_type( - name="UInt8", - size=8, - category=Category.FIXED_LENGTH, - encoding=Encoding.TWO_COMPONENT -) -``` - ---- - -### Unit - -数据单位,用于物理量的表示。 - -**文件位置:** `src/types/unit.py` - -```python -from src import Unit, create_unit -``` - -#### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 单位名称 | -| `display` | Optional[str] | 否 | 显示名称 | -| `factor` | Optional[float] | 否 | 因子 | -| `offset` | Optional[float] | 否 | 偏移量 | - -#### 工厂函数 - -##### `create_unit(name: str, display: Optional[str] = None, factor: Optional[float] = None, offset: Optional[float] = None) -> Unit` - -创建 Unit 实例的工厂函数。 - -**示例:** - -```python -unit = create_unit( - name="km_per_hour", - display="km/h", - factor=1.0, - offset=0.0 -) -``` - ---- - -### DataConstraint - -数据约束,定义有效值范围。 - -**文件位置:** `src/types/data_constraint.py` - -```python -from src import DataConstraint, create_data_constraint -``` - -#### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 约束名称 | -| `unit` | Optional[Unit] | 否 | 关联的单位 | -| `lower` | Optional[float] | 否 | 下限值 | -| `upper` | Optional[float] | 否 | 上限值 | -| `lower_sts` | Optional[LowerSts] | 否 | 下限状态 (CLOSED/OPEN) | -| `upper_sts` | Optional[UpperSts] | 否 | 上限状态 (CLOSED/OPEN) | -| `constraint_specified` | Optional[ConstraintSpecified] | 否 | 约束类型 | - -#### 工厂函数 - -##### `create_data_constraint(name: str, lower: Optional[float] = None, upper: Optional[float] = None, unit: Optional[Unit] = None, lower_sts: Optional[LowerSts] = None, upper_sts: Optional[UpperSts] = None, constraint_specified: Optional[ConstraintSpecified] = None) -> DataConstraint` - -创建 DataConstraint 实例的工厂函数。 - -**示例:** - -```python -constraint = create_data_constraint( - name="SpeedConstraint", - lower=0, - upper=250, - lower_sts=LowerSts.CLOSED, - upper_sts=UpperSts.OPEN -) -``` - ---- - -### CompuMethod - -计算方法,定义内部值与物理值之间的转换关系。 - -**文件位置:** `src/types/compu_method.py` - -```python -from src import CompuMethod, Linear, TextTable, create_linear, create_text_table, create_compu_method -``` - -#### Linear 类 - -线性转换方法。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `factor` | float | 是 | 缩放因子 | -| `offset` | float | 是 | 偏移量 | - -转换公式:`physical = factor * internal + offset` - -##### 工厂函数 - -`create_linear(factor: float, offset: float) -> Linear` - -#### TextTable 类 - -文本表转换方法。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `vt` | str | 是 | 文本值 | -| `lower` | Optional[int] | 否 | 下限 | -| `upper` | Optional[int] | 否 | 上限 | -| `lower_sts` | Optional[LowerSts] | 否 | 下限状态 | -| `upper_sts` | Optional[UpperSts] | 否 | 上限状态 | - -##### 工厂函数 - -`create_text_table(vt: str, lower: Optional[int] = None, upper: Optional[int] = None, lower_sts: Optional[LowerSts] = None, upper_sts: Optional[UpperSts] = None) -> TextTable` - -#### CompuMethod 类 - -完整的计算方法。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 方法名称 | -| `unit` | Optional[Unit] | 否 | 单位 | -| `linear` | Optional[Linear] | 否 | 线性转换 | -| `text_tables` | Optional[List[TextTable]] | 否 | 文本表列表 | -| `category` | Optional[Category] | 否 | 分类 | -| `compu_contents` | Optional[CompuContents] | 否 | 转换内容方向 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_text_table(vt: str) -> Optional[TextTable]` | 根据文本值查找文本表 | -| `add_text_table(text_table: TextTable)` | 添加文本表 | - -##### 工厂函数 - -`create_compu_method(name: str, unit: Optional[Unit] = None, linear: Optional[Linear] = None, text_tables: Optional[List[TextTable]] = None, category: Optional[Category] = None, compu_contents: Optional[CompuContents] = None) -> CompuMethod` - -**示例:** - -```python -# 创建带线性转换的计算方法 -linear = create_linear(factor=0.01, offset=0) -compu = create_compu_method( - name="SpeedConversion", - linear=linear, - category=Category.LINEAR -) - -# 创建带文本表的计算方法 -table = create_text_table(vt="OK", lower=0, upper=0) -compu = create_compu_method( - name="StatusConversion", - text_tables=[table], - category=Category.TEXT_TABLE -) -``` - ---- - -### 应用数据类型 - -#### ApplicationBooleanDataType - -布尔类型应用数据。 - -**文件位置:** `src/types/application_types.py` - -```python -from src import ApplicationBooleanDataType, create_boolean_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | -| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | - -##### 工厂函数 - -`create_boolean_type(name: str, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ApplicationBooleanDataType` - ---- - -#### ApplicationValueDataType - -标量值类型应用数据。 - -```python -from src import ApplicationValueDataType, create_value_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `unit` | Optional[Unit] | 否 | 单位 | -| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | -| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | - -##### 工厂函数 - -`create_value_type(name: str, unit: Optional[Unit] = None, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ApplicationValueDataType` - ---- - -#### ApplicationStructureDataType - -结构体类型应用数据。 - -```python -from src import ApplicationStructureDataType, create_structure_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `structure_elements` | Optional[List[StructureElement]] | 否 | 结构体成员列表 | - -##### 嵌套类:StructureElement - -结构体成员元素。 - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 成员名称 | -| `data_type` | Base | 是 | 数据类型 | -| `offset` | Optional[int] | 否 | 位偏移 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_element(name: str) -> Optional[StructureElement]` | 查找成员 | -| `add_element(element: StructureElement)` | 添加成员 | - -##### 工厂函数 - -`create_structure_type(name: str, elements: Optional[List[ApplicationStructureDataType.StructureElement]] = None) -> ApplicationStructureDataType` - ---- - -#### ApplicationArrayDataType - -数组类型应用数据。 - -```python -from src import ApplicationArrayDataType, create_array_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `element` | Optional[ArrayElement] | 否 | 数组元素 | - -##### 嵌套类:ArrayElement - -数组元素配置。 - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `length` | int | 是 | 数组长度 | -| `data_type` | Base | 是 | 元素数据类型 | -| `array_size_semantics` | Optional[Semantic] | 否 | 大小语义 | - -##### 工厂函数 - -`create_array_type(name: str, element: Optional[ApplicationArrayDataType.ArrayElement] = None) -> ApplicationArrayDataType` - ---- - -### 实现数据类型 - -#### ImplementationValueDataType - -实现层标量值类型。 - -**文件位置:** `src/types/implementation_types.py` - -```python -from src import ImplementationValueDataType, create_impl_value_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `base_type` | Optional[BaseType] | 否 | 基础类型 | -| `compu_method` | Optional[CompuMethod] | 否 | 计算方法 | -| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | - -##### 工厂函数 - -`create_impl_value_type(name: str, base_type: Optional[BaseType] = None, compu_method: Optional[CompuMethod] = None, data_constraint: Optional[DataConstraint] = None) -> ImplementationValueDataType` - ---- - -#### ImplementationStructureDataType - -实现层结构体类型。 - -```python -from src import ImplementationStructureDataType, create_impl_structure_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `structure_elements` | Optional[List[StructureElement]] | 否 | 结构体成员列表 | - -##### 嵌套类:StructureElement - -与 ApplicationStructureDataType.StructureElement 结构相同。 - -##### 工厂函数 - -`create_impl_structure_type(name: str, elements: Optional[List[ImplementationStructureDataType.StructureElement]] = None) -> ImplementationStructureDataType` - ---- - -#### ImplementationArrayDataType - -实现层数组类型。 - -```python -from src import ImplementationArrayDataType, create_impl_array_type -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 类型名称 | -| `element` | Optional[ArrayElement] | 否 | 数组元素 | - -##### 嵌套类:ArrayElement - -与 ApplicationArrayDataType.ArrayElement 结构相同。 - -##### 工厂函数 - -`create_impl_array_type(name: str, element: Optional[ImplementationArrayDataType.ArrayElement] = None) -> ImplementationArrayDataType` - ---- - -### SwAddrMethod - -软件地址方法,定义代码/数据的内存段。 - -**文件位置:** `src/types/sw_addr_method.py` - -```python -from src import SwAddrMethod, create_sw_addr_method, SectionType -``` - -#### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 方法名称 | -| `section_type` | Optional[SectionType] | 否 | 段类型 (CODE/DATA/CONST) | - -#### 工厂函数 - -`create_sw_addr_method(name: str, section_type: Optional[SectionType] = None) -> SwAddrMethod` - -**示例:** - -```python -# 代码段地址方法 -code_method = create_sw_addr_method("CODE", section_type=SectionType.CODE) - -# 数据段地址方法 -data_method = create_sw_addr_method("DATA", section_type=SectionType.DATA) -``` - ---- - -### 数据类型映射 - -#### DataTypeMapping - -应用类型到实现类型的映射。 - -**文件位置:** `src/types/data_mapping.py` - -```python -from src import DataTypeMapping, create_data_type_mapping -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 映射名称 | -| `application_data_type` | Base | 是 | 应用数据类型 | -| `implementation_data_type` | Base | 是 | 实现数据类型 | - -##### 工厂函数 - -`create_data_type_mapping(name: str, application_data_type: Base, implementation_data_type: Base) -> DataTypeMapping` - ---- - -#### DataTypeMappingSet - -数据类型映射集合。 - -```python -from src import DataTypeMappingSet, create_data_type_mapping_set -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 集合名称 | -| `data_type_mappings` | Optional[List[DataTypeMapping]] | 否 | 映射列表 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_mapping(name: str) -> Optional[DataTypeMapping]` | 查找映射 | -| `add_mapping(mapping: DataTypeMapping)` | 添加映射 | - -##### 工厂函数 - -`create_data_type_mapping_set(name: str, mappings: Optional[List[DataTypeMapping]] = None) -> DataTypeMappingSet` - ---- - -### 接口 - -#### Interface - -接口基类。 - -**文件位置:** `src/types/interface.py` - -```python -from src import Interface -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 接口名称 | -| `is_service` | bool | 否 | 是否为服务接口 (默认 False) | - ---- - -#### SenderReceiverInterface - -发送-接收接口,用于数据信号传递。 - -```python -from src import SenderReceiverInterface, create_sender_receiver_interface, Policy, CalibrationAccess -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 接口名称 | -| `data_element` | Optional[SenderReceiverInterface.DataElement] | 否 | 数据元素 | -| `is_service` | bool | 否 | 是否为服务接口 | - -##### 嵌套类:DataElement - -数据元素定义。 - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 元素名称 | -| `sw_addr_method` | Optional[SwAddrMethod] | 否 | 地址方法 | -| `data_constraint` | Optional[DataConstraint] | 否 | 数据约束 | -| `data_type` | Base | 是 | 数据类型 | -| `policy` | Optional[Policy] | 否 | 数据策略 | -| `calibration_access` | Optional[CalibrationAccess] | 否 | 校准访问权限 | - -##### 工厂函数 - -`create_sender_receiver_interface(name: str, data_element: Optional[SenderReceiverInterface.DataElement] = None, is_service: bool = False) -> SenderReceiverInterface` - ---- - -#### ClientServerInterface - -客户端-服务端接口,用于服务调用。 - -```python -from src import ClientServerInterface -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 接口名称 | -| `operations` | Optional[List[Operation]] | 否 | 操作列表 | -| `is_service` | bool | 否 | 是否为服务接口 | - -##### 嵌套类:Operation - -服务操作定义。 - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 操作名称 | -| `is_server` | bool | 否 | 是否为服务端 | -| `arguments` | Optional[List[Argument]] | 否 | 参数列表 | - -##### 嵌套类:Argument - -操作参数定义。 - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 参数名称 | -| `direction` | PortDirection | 是 | 参数方向 (IN/OUT) | -| `data_type` | Base | 是 | 参数数据类型 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_operation(name: str) -> Optional[Operation]` | 查找操作 | -| `add_operation(operation: Operation)` | 添加操作 | - ---- - -### 软件组件类型 - -#### SwComponentType - -软件组件类型基类。 - -**文件位置:** `src/types/sw_component_type.py` - -```python -from src import SwComponentType, ComponentType -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 组件名称 | -| `component_type` | Optional[ComponentType] | 否 | 组件类型 | - ---- - -#### ApplicationSwComponentType - -应用软件组件类型。 - -```python -from src import ApplicationSwComponentType -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 组件名称 | -| `supports_multiple_instantiation` | bool | 否 | 是否支持多实例化 | -| `atomic_type` | Optional[AtomicType] | 否 | 原子类型 | -| `implementation_code_type` | Optional[ImplementationCodeType] | 否 | 实现代码类型 | -| `ports` | Optional[List[PortPrototype]] | 否 | 端口列表 | -| `internal_behavior` | Optional[SwcInternalBehavior] | 否 | 内部行为 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_port(name: str) -> Optional[PortPrototype]` | 查找端口 | -| `add_port(port: PortPrototype)` | 添加端口 | - ---- - -#### PortPrototype - -端口原型基类。 - -```python -from src import PortPrototype, PortDirection -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 端口名称 | -| `interface` | Optional[Interface] | 否 | 关联接口 | - ---- - -#### RPortPrototype - -接收端口 (Required Port)。 - -```python -from src import RPortPrototype -``` - -继承自 PortPrototype,用于从其他组件接收数据。 - ---- - -#### PPortPrototype - -发送端口 (Provided Port)。 - -```python -from src import PPortPrototype -``` - -继承自 PortPrototype,用于向其他组件发送数据。 - ---- - -#### PRPortPrototype - -双向端口 (Provided Required Port)。 - -```python -from src import PRPortPrototype -``` - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 端口名称 | -| `interface` | Optional[Interface] | 否 | 提供接口 | -| `required_interface` | Optional[Interface] | 否 | 需求接口 | - ---- - -### Package - -AUTOSAR 包,用于组织和管理元素。 - -**文件位置:** `src/types/package.py` - -```python -from src import Package, create_package -``` - -#### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 包名称 | -| `elements` | Optional[List[Base]] | 否 | 包内元素列表 | - -#### 方法 - -| 方法 | 说明 | -|------|------| -| `get_element(name: str) -> Optional[Base]` | 查找元素 | -| `add_element(element: Base)` | 添加元素 (支持覆盖同名元素) | - -#### 工厂函数 - -`create_package(name: str, elements: Optional[List[Base]] = None) -> Package` - -**示例:** - -```python -# 创建包并添加元素 -pkg = create_package("SensorPkg", elements=[ - base_type, - impl_type, - interface, - component -]) -``` - ---- - -### SwcInternalBehavior - -软件组件内部行为。 - -**文件位置:** `src/types/swc_internal_behavior.py` - -```python -from src import SwcInternalBehavior, RunnableEntity, create_runnable_entity, create_timing_event, create_init_event -``` - -#### VariableAccess - -变量访问定义。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 访问名称 | -| `port_prototype_ref` | Optional[str] | 否 | 端口原型引用 | -| `target_data_prototype_ref` | Optional[str] | 否 | 目标数据原型引用 | - ---- - -#### RunnableEntity - -可运行实体 (Runnable)。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | Runnable 名称 | -| `minimum_start_interval` | Optional[float] | 否 | 最小启动间隔 (秒) | -| `can_be_invoked_concurrently` | bool | 否 | 是否可并发调用 | -| `data_receive_points` | Optional[List[VariableAccess]] | 否 | 数据接收点 | -| `data_send_points` | Optional[List[VariableAccess]] | 否 | 数据发送点 | -| `variable_accesses` | Optional[List[VariableAccess]] | 否 | 变量访问列表 | -| `symbol` | Optional[str] | 否 | 符号 (函数名) | -| `sw_addr_method_ref` | Optional[SwAddrMethod] | 否 | 地址方法引用 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `add_data_receive_point(access: VariableAccess)` | 添加数据接收点 | -| `add_data_send_point(access: VariableAccess)` | 添加数据发送点 | -| `add_variable_access(access: VariableAccess)` | 添加变量访问 | - -##### 工厂函数 - -`create_runnable_entity(name: str, symbol: Optional[str] = None, minimum_start_interval: Optional[float] = None) -> RunnableEntity` - ---- - -#### 事件类型 - -##### InitEvent - -初始化事件。 - -```python -from src import InitEvent - -event = InitEvent(name="Init", runnable_ref="MyRunnable") -``` - -##### TimingEvent - -定时事件。 - -```python -from src import TimingEvent, create_timing_event - -event = create_timing_event(name="Timing_10ms", period=0.01) -``` - -**构造函数属性:** - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 事件名称 | -| `period` | float | 是 | 周期 (秒) | - -##### OperationInvokedEvent - -操作调用事件。 - -```python -from src import OperationInvokedEvent, create_operation_invoked_event - -event = create_operation_invoked_event(name="OpInvoke", operation_ref="MyOperation") -``` - -##### DataReceivedEvent - -数据接收事件。 - -```python -from src import DataReceivedEvent, create_data_received_event - -event = create_data_received_event(name="DataRx", data_element_ref="MyDataElement", period=0.01) -``` - ---- - -#### SwcInternalBehavior - -软件组件内部行为容器。 - -##### 构造函数属性 - -| 属性名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `name` | str | 是 | 行为名称 | -| `runnable_entities` | Optional[List[RunnableEntity]] | 否 | Runnable 列表 | -| `events` | Optional[List[Union[InitEvent, TimingEvent, OperationInvokedEvent, DataReceivedEvent]]] | 否 | 事件列表 | -| `symbol` | Optional[str] | 否 | 符号前缀 | - -##### 方法 - -| 方法 | 说明 | -|------|------| -| `get_runnable(name: str) -> Optional[RunnableEntity]` | 查找 Runnable | -| `add_runnable(runnable: RunnableEntity)` | 添加 Runnable | -| `get_event(name: str) -> Optional[Event]` | 查找事件 | -| `add_event(event: Event)` | 添加事件 | - -##### 工厂函数 - -`create_swc_internal_behavior(name: str, runnable_entities: Optional[List[RunnableEntity]] = None, events: Optional[List[Event]] = None) -> SwcInternalBehavior` - ---- - -## 工具模块 (utils) - -### create_arxml_document() -> Document - -创建标准 ARXML 文档,包含 AUTOSAR 命名空间。 - -**文件位置:** `src/utils/arxml_writer.py` - -```python -from src import create_arxml_document - -doc = create_arxml_document() -``` - -**返回:** -- xml.dom.minidom.Document 对象 - ---- - -### write_arxml(doc: Document, filepath: str, encoding: str = 'utf-8') -> None - -将 Document 写入文件 (紧凑格式)。 - -```python -from src import create_arxml_document, write_arxml - -doc = create_arxml_document() -# ... 添加内容 ... -write_arxml(doc, "output.arxml") -``` - ---- - -### write_arxml_pretty(doc: Document, filepath: str, encoding: str = 'utf-8') -> None - -将 Document 写入文件 (格式化输出)。 - -```python -from src import create_arxml_document, write_arxml_pretty - -doc = create_arxml_document() -# ... 添加内容 ... -write_arxml_pretty(doc, "output_formatted.arxml") -``` - ---- - -### get_ar_packages_element(doc: Document) -> Element - -获取 AR-PACKAGES 根元素。 - -```python -from src import get_ar_packages_element - -doc = create_arxml_document() -packages = get_ar_packages_element(doc) -``` - ---- - -### add_package_to_document(doc: Document, package_element: Element) -> None - -将 Package 元素添加到文档。 - -```python -from src import add_package_to_document - -pkg_element = package.to_arxml(doc) -add_package_to_document(doc, pkg_element) -``` - ---- - -## 索引 - -- [Base](#base-类) - 所有类型的基类 -- [Category](#category) - 数据分类枚举 -- [create_uuid](#create_uuid--str) - UUID 生成 -- [create_arxml_document](#create_arxml_document---document) - 文档创建 -- [write_arxml](#write_arxmldoc-document-filepath-str-encoding-str--utf-8---none) - 文件写入 -- [create_package](#package) - 包创建 -- [create_base_type](#basetype) - 基础类型创建 -- [create_value_type](#applicationvaluedatatype) - 值类型创建 -- [create_sender_receiver_interface](#senderreceiverinterface) - 接口创建 -- [ApplicationSwComponentType](#applicationswcomponenttype) - 组件类型 -- [create_swc_internal_behavior](#swcinternalbehavior) - 内部行为创建 \ No newline at end of file diff --git a/docs/architecture.md b/docs/architecture.md deleted file mode 100644 index b0d4c09..0000000 --- a/docs/architecture.md +++ /dev/null @@ -1,257 +0,0 @@ -# 项目架构 - -## 整体架构图 - -``` -arxml_sdk/ -├── src/ # 源代码 -│ ├── __init__.py # 包入口,导出全部公共API -│ ├── core/ # 核心基础设施层 -│ │ ├── __init__.py -│ │ ├── base.py # Base 基类 -│ │ ├── constants.py # ARXML 标签常量 -│ │ └── enums.py # AUTOSAR 枚举类型 -│ ├── types/ # 数据类型层 -│ │ ├── __init__.py -│ │ ├── base_type.py # 基础数据类型 -│ │ ├── unit.py # 单位类型 -│ │ ├── data_constraint.py # 数据约束 -│ │ ├── compu_method.py # 计算方法 -│ │ ├── application_types.py # 应用数据类型 -│ │ ├── implementation_types.py # 实现数据类型 -│ │ ├── sw_addr_method.py # 软件地址方法 -│ │ ├── data_mapping.py # 数据类型映射 -│ │ ├── sw_component_type.py # 软件组件类型 -│ │ ├── interface.py # 接口定义 -│ │ ├── package.py # 包管理 -│ │ └── swc_internal_behavior.py # SWC内部行为 -│ └── utils/ # 工具层 -│ ├── __init__.py -│ └── arxml_writer.py # ARXML文档写入 -└── tests/ # 测试 -``` - -## 模块职责 - -### core 模块 - 核心基础设施层 - -提供 SDK 运行所需的基础组件,不依赖其他业务模块。 - -| 文件 | 职责 | 关键类/函数 | -|------|------|-------------| -| base.py | 定义所有类型的基础类 | `Base` (dataclass), `create_uuid()`, `create_text_element()` | -| constants.py | ARXML 标签常量统一管理 | 约140个XML标签常量定义 | -| enums.py | AUTOSAR 枚举类型定义 | `Category`, `Encoding`, `PortDirection` 等12个枚举 | - -**Base 类核心属性:** - -| 属性 | 类型 | 说明 | -|------|------|------| -| name | str | 元素名称 | -| id | Optional[int] | 元素标识符 | -| parent | Optional[Base] | 父元素引用 | -| description | Optional[str] | 元素描述 | -| package_path | str | 完整包路径 (如 `/Pkg1/Pkg2/Name`) | - -**Base 类核心方法:** - -| 方法 | 说明 | -|------|------| -| to_arxml(doc) | 抽象方法,将对象序列化为 ARXML DOM 元素 | -| class_name | 属性,获取类型名称 | -| parent_id | 属性,获取父类 ID | - -### types 模块 - 数据类型层 - -实现 AUTOSAR 数据模型的各个类型,依赖 core 模块。 - -| 文件 | 职责 | 主要类 | -|------|------|--------| -| base_type.py | 基础数据类型 (SW-BASE-TYPE) | `BaseType` | -| unit.py | 数据单位 | `Unit` | -| data_constraint.py | 数据约束范围 | `DataConstraint` | -| compu_method.py | 计算方法 (线性转换/文本表) | `Linear`, `TextTable`, `CompuMethod` | -| application_types.py | 应用层数据类型 | `ApplicationBooleanDataType`, `ApplicationValueDataType`, `ApplicationStructureDataType`, `ApplicationArrayDataType` | -| implementation_types.py | 实现层数据类型 | `ImplementationValueDataType`, `ImplementationStructureDataType`, `ImplementationArrayDataType` | -| sw_addr_method.py | 软件地址方法 | `SwAddrMethod` | -| data_mapping.py | 应用-实现类型映射 | `DataTypeMapping`, `DataTypeMappingSet` | -| sw_component_type.py | 软件组件类型和端口 | `ApplicationSwComponentType`, `RPortPrototype`, `PPortPrototype`, `PRPortPrototype` | -| interface.py | 接口定义 | `SenderReceiverInterface`, `ClientServerInterface`, `ModeSwitchInterface` | -| package.py | AUTOSAR 包 | `Package` | -| swc_internal_behavior.py | SWC 内部行为 | `RunnableEntity`, `TimingEvent`, `InitEvent`, `SwcInternalBehavior` | - -### utils 模块 - 工具层 - -提供 ARXML 文档创建和写入功能。 - -| 文件 | 职责 | 关键函数 | -|------|------|----------| -| arxml_writer.py | ARXML 文档创建和写入 | `create_arxml_document()`, `write_arxml()`, `write_arxml_pretty()` | - -## 类型继承体系 - -``` -Base (core.base) -├── BaseType (types.base_type) -├── Unit (types.unit) -├── DataConstraint (types.data_constraint) -├── CompuMethod (types.compu_method) -│ ├── Linear -│ └── TextTable -├── ApplicationDataType (types.application_types) -│ ├── ApplicationBooleanDataType -│ ├── ApplicationValueDataType -│ ├── ApplicationStructureDataType -│ │ └── StructureElement (内部类) -│ └── ApplicationArrayDataType -│ └── ArrayElement (内部类) -├── ImplementationDataType (types.implementation_types) -│ ├── ImplementationValueDataType -│ ├── ImplementationStructureDataType -│ │ └── StructureElement (内部类) -│ └── ImplementationArrayDataType -│ └── ArrayElement (内部类) -├── SwAddrMethod (types.sw_addr_method) -├── DataTypeMapping (types.data_mapping) -│ └── DataTypeMappingSet -├── SwComponentType (types.sw_component_type) -│ ├── AtomicComponentType -│ │ └── ApplicationSwComponentType -│ └── CompositionSwComponentType -├── PortPrototype (types.sw_component_type) -│ ├── RPortPrototype -│ ├── PPortPrototype -│ └── PRPortPrototype -├── Interface (types.interface) -│ ├── SenderReceiverInterface -│ │ └── DataElement (内部类) -│ ├── ClientServerInterface -│ │ ├── Operation (内部类) -│ │ └── Argument (内部类) -│ ├── ModeSwitchInterface -│ ├── ParameterInterface -│ ├── TriggerInterface -│ └── NvDataInterface -├── Package (types.package) -└── SwcInternalBehavior (types.swc_internal_behavior) - ├── RunnableEntity - └── EventType (Union) - ├── InitEvent - ├── TimingEvent - ├── OperationInvokedEvent - └── DataReceivedEvent -``` - -## 依赖关系图 - -``` - ┌─────────────────────────────────────┐ - │ arxml_sdk (src/__init__.py) │ - │ 导出全部 193 个公共 API 符号 │ - └─────────────────────────────────────┘ - │ - ┌───────────────────────────┼───────────────────────────┐ - │ │ │ - ▼ ▼ ▼ -┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ -│ core 模块 │ │ types 模块 │ │ utils 模块 │ -│ (基础设施层) │ │ (业务逻辑层) │ │ (工具层) │ -├─────────────────┤ ├─────────────────┤ ├─────────────────┤ -│ Base 基类 │ │ 数据类型类 │ │ ARXML文档创建 │ -│ 常量定义 │◄─────►│ 组件类型类 │ │ ARXML文件写入 │ -│ 枚举定义 │ │ 接口定义类 │ │ │ -│ UUID/文本工具 │ │ 包管理类 │ │ │ -└─────────────────┘ │ 内部行为类 │ └─────────────────┘ - └─────────────────┘ - │ - ▼ - ┌─────────────────┐ - │ tests 模块 │ - │ (测试层) │ - ├─────────────────┤ - │ 单元测试 │ - │ 集成测试 │ - └─────────────────┘ -``` - -**依赖约束:** -- `core` → 无依赖(最底层) -- `types` → 依赖 `core` -- `utils` → 依赖 `core` -- `tests` → 依赖 `src` 所有模块 - -## 设计模式 - -### 1. 工厂函数模式 - -所有类型都配有 `create_xxx()` 工厂函数,简化对象创建: - -```python -# 使用工厂函数 -uint8 = create_base_type("UInt8", size=8) - -# 替代直接实例化(如果存在构造函数) -uint8 = BaseType(name="UInt8", size=8) -``` - -### 2. 组合模式 - -通过 `add_xxx()` 方法支持动态添加子元素: - -```python -component = ApplicationSwComponentType(name="Sensor") -component.add_port(PPortPrototype(name="DataPort")) -``` - -### 3. 序列化模式 - -所有类型都实现 `to_arxml(doc)` 方法,将自身序列化为 ARXML DOM 元素: - -```python -element = component.to_arxml(doc) -``` - -### 4. 数据类模式 - -使用 `@dataclass` 简化数据类定义: - -```python -@dataclass -class BaseType: - name: str - size: int - category: Optional[Category] = None - encoding: Optional[Encoding] = None -``` - -## 数据流 - -``` -用户代码 - │ - ▼ -创建对象 (工厂函数) - │ - ├──► BaseType, ApplicationDataType, SwComponentType 等 - │ - ▼ -序列化 (to_arxml) - │ - ├──► XML DOM Element - │ - ▼ -写入文件 (arxml_writer) - │ - ▼ -.arxml 文件 -``` - -## 技术栈 - -| 方面 | 详情 | -|------|------| -| 编程语言 | Python 3 | -| 标准库 | `uuid`, `xml.dom.minidom`, `dataclasses`, `typing`, `enum` | -| 测试框架 | pytest | -| 目标格式 | AUTOSAR ARXML (R4.4 schema) | -| 版本 | 2.0.1 | \ No newline at end of file diff --git a/docs/guide.md b/docs/guide.md deleted file mode 100644 index 702ded3..0000000 --- a/docs/guide.md +++ /dev/null @@ -1,548 +0,0 @@ -# 使用指南 - -## 目录 - -- [快速开始](#快速开始) -- [基础类型创建](#基础类型创建) -- [应用数据类型](#应用数据类型) -- [接口定义](#接口定义) -- [软件组件](#软件组件) -- [内部行为](#内部行为) -- [打包与导出](#打包与导出) -- [完整示例](#完整示例) - ---- - -## 快速开始 - -### 环境要求 - -- Python 3.8+ - -### 安装 - -将 `src` 目录添加到 Python 路径即可使用: - -```python -import sys -sys.path.insert(0, '/path/to/arxml_sdk/src') -``` - -或直接使用相对导入: - -```python -from src import create_arxml_document, write_arxml -``` - -### 最小示例 - -```python -from src import ( - create_arxml_document, write_arxml, create_package, - create_base_type, Category, Encoding -) - -doc = create_arxml_document() -base_type = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) -package = create_package("MyPackage", elements=[base_type]) -package_element = package.to_arxml(doc) -doc.documentElement.appendChild(package_element) -write_arxml(doc, "minimal.arxml") -``` - ---- - -## 基础类型创建 - -### 创建基本整数类型 - -```python -from src import create_base_type, Category, Encoding - -uint8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) -uint16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) -sint8 = create_base_type("Sint8", size=8, encoding=Encoding.TWO_COMPONENT) -float32 = create_base_type("Float32", size=32, encoding=Encoding.IEEE754) -``` - -### 创建带文本表的类型 - -```python -from src import ( - create_base_type, create_unit, create_data_constraint, - create_linear, create_text_table, create_compu_method, - Category, LowerSts, UpperSts -) - -unit = create_unit("km/h", display="km/h", factor=1.0, offset=0.0) - -constraint = create_data_constraint( - "SpeedConstraint", - lower=0, upper=250, - lower_sts=LowerSts.CLOSED, - upper_sts=UpperSts.OPEN -) - -linear = create_linear(factor=0.01, offset=0) - -compu = create_compu_method( - "SpeedConversion", - unit=unit, - linear=linear, - category=Category.LINEAR -) - -value_type = create_value_type( - "Speed", - unit=unit, - compu_method=compu, - data_constraint=constraint -) -``` - ---- - -## 应用数据类型 - -### 布尔类型 - -```python -from src import create_boolean_type, create_compu_method, create_linear, Category - -bool_compu = create_compu_method( - "BoolConversion", - linear=create_linear(factor=1, offset=0), - category=Category.BOOLEAN -) - -bool_type = create_boolean_type("ErrorFlag", compu_method=bool_compu) -``` - -### 值类型 - -```python -from src import create_value_type, create_unit, create_linear, create_compu_method, Category - -unit = create_unit("deg", display="°C") -linear = create_linear(factor=0.1, offset=-40) -compu = create_compu_method("Temperature", unit=unit, linear=linear, category=Category.LINEAR) - -temp_type = create_value_type("Temperature", unit=unit, compu_method=compu) -``` - -### 结构体类型 - -```python -from src import ( - ApplicationStructureDataType, create_value_type, - create_unit, create_linear, create_compu_method -) - -unit = create_unit("V") -linear = create_linear(factor=0.001, offset=0) -compu = create_compu_method("Voltage", unit=unit, linear=linear, category=Category.LINEAR) -voltage_type = create_value_type("Voltage", unit=unit, compu_method=compu) - -current_type = create_value_type("Current", unit=unit, compu_method=compu) - -structure = ApplicationStructureDataType(name="PowerData") -structure.add_element( - ApplicationStructureDataType.StructureElement(name="voltage", data_type=voltage_type, offset=0) -) -structure.add_element( - ApplicationStructureDataType.StructureElement(name="current", data_type=current_type, offset=32) -) -``` - -### 数组类型 - -```python -from src import ApplicationArrayDataType, create_value_type, create_unit, Semantic - -element_type = create_value_type("SensorValue", unit=create_unit("counts")) - -array_type = ApplicationArrayDataType(name="SensorData") -array_type.element = ApplicationArrayDataType.ArrayElement( - length=10, - data_type=element_type, - array_size_semantics=Semantic.FIXED -) -``` - ---- - -## 实现数据类型 - -### 值类型 - -```python -from src import create_impl_value_type, create_base_type, create_value_type, Encoding - -base_type = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) -app_type = create_value_type("AppCounter") - -impl_type = create_impl_value_type("ImplCounter", base_type=base_type) -``` - -### 结构体类型 - -```python -from src import ImplementationStructureDataType, create_impl_value_type, create_base_type, Encoding - -base_u8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) -base_u16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) - -impl_u8 = create_impl_value_type("ImplUInt8", base_type=base_u8) -impl_u16 = create_impl_value_type("ImplUInt16", base_type=base_u16) - -struct_type = ImplementationStructureDataType(name="ImplStatus") -struct_type.add_element( - ImplementationStructureDataType.StructureElement(name="status", data_type=impl_u8, offset=0) -) -struct_type.add_element( - ImplementationStructureDataType.StructureElement(name="value", data_type=impl_u16, offset=8) -) -``` - -### 数组类型 - -```python -from src import ImplementationArrayDataType, create_impl_value_type, create_base_type, Semantic, Encoding - -base = create_base_type("UInt32", size=32, encoding=Encoding.TWO_COMPONENT) -element_type = create_impl_value_type("ImplUInt32", base_type=base) - -impl_array = ImplementationArrayDataType(name="ImplBuffer") -impl_array.element = ImplementationArrayDataType.ArrayElement( - length=16, - data_type=element_type, - array_size_semantics=Semantic.FIXED -) -``` - ---- - -## 数据类型映射 - -```python -from src import ( - DataTypeMapping, DataTypeMappingSet, - create_value_type, create_impl_value_type, create_base_type, Encoding -) - -base = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) -app_type = create_value_type("AppStatus") -impl_type = create_impl_value_type("ImplStatus", base_type=base) - -mapping = DataTypeMapping( - name="StatusMapping", - application_data_type=app_type, - implementation_data_type=impl_type -) - -mapping_set = DataTypeMappingSet(name="DefaultMappings") -mapping_set.add_mapping(mapping) -``` - ---- - -## 接口定义 - -### 发送-接收接口 - -```python -from src import ( - SenderReceiverInterface, create_sender_receiver_interface, - create_value_type, create_unit, Policy, CalibrationAccess -) - -unit = create_unit("km/h") -data_element = SenderReceiverInterface.DataElement( - name="Speed", - data_type=create_value_type("Speed", unit=unit), - policy=Policy.STANDARD, - calibration_access=CalibrationAccess.READ_ONLY -) - -interface = create_sender_receiver_interface("SpeedInterface", data_element=data_element) -``` - -### 客户端-服务端接口 - -```python -from src import ( - ClientServerInterface, create_value_type, create_unit, - PortDirection -) - -unit = create_unit("counts") - -operation = ClientServerInterface.Operation( - name="Initialize", - is_server=True, - arguments=[ - ClientServerInterface.Argument( - name="config", - direction=PortDirection.IN, - data_type=create_value_type("Config", unit=unit) - ) - ] -) - -cs_interface = ClientServerInterface(name="ControlInterface") -cs_interface.add_operation(operation) -``` - ---- - -## 软件组件 - -### 创建组件 - -```python -from src import ( - ApplicationSwComponentType, PPortPrototype, RPortPrototype, - SenderReceiverInterface, create_sender_receiver_interface, - AtomicType, ComponentType -) - -interface = create_sender_receiver_interface("DataInterface") -port = PPortPrototype(name="DataPort", interface=interface) - -component = ApplicationSwComponentType( - name="SensorComponent", - supports_multiple_instantiation=False, - atomic_type=AtomicType.APPLICATION -) -component.add_port(port) -``` - -### 创建组合组件 - -```python -from src import SwComponentType, ComponentType, AtomicComponentType, CompositionSwComponentType - -child1 = ApplicationSwComponentType(name="Child1") -child2 = ApplicationSwComponentType(name="Child2") - -composition = CompositionSwComponentType(name="Composition") -composition._component_type = ComponentType.COMPOSITION -``` - ---- - -## 内部行为 - -### 创建 Runnable 和事件 - -```python -from src import ( - SwcInternalBehavior, RunnableEntity, TimingEvent, InitEvent, - VariableAccess, create_swc_internal_behavior, create_runnable_entity, - create_timing_event, create_init_event, create_data_received_event -) - -runnable = create_runnable_entity( - name="UpdateMeasurement", - symbol="UpdateMeasurement", - minimum_start_interval=0.01 -) -runnable.add_variable_access( - VariableAccess(name="SpeedAccess", port_prototype_ref="SpeedPort") -) - -timing_event = create_timing_event(name="Timing_10ms", period=0.01) -init_event = InitEvent(name="Init", runnable_ref="UpdateMeasurement") - -data_rx_event = create_data_received_event( - name="DataReady", - data_element_ref="ReadyFlag", - period=0.05 -) - -behavior = create_swc_internal_behavior( - name="SensorBehavior", - runnable_entities=[runnable], - events=[timing_event, init_event, data_rx_event] -) - -component = ApplicationSwComponentType(name="Sensor") -component.internal_behavior = behavior -``` - ---- - -## 打包与导出 - -### 基本导出流程 - -```python -from src import ( - create_arxml_document, write_arxml, create_package, - get_ar_packages_element, add_package_to_document, - create_base_type, create_value_type, create_unit -) - -doc = create_arxml_document() -packages_element = get_ar_packages_element(doc) - -base_type = create_base_type("UInt8", size=8) -app_type = create_value_type("AppData") -package = create_package("MyPkg", elements=[base_type, app_type]) - -package_element = package.to_arxml(doc) -add_package_to_document(doc, package_element) - -write_arxml(doc, "output.arxml") -``` - -### 格式化输出 - -```python -from src import write_arxml_pretty - -write_arxml_pretty(doc, "output_formatted.arxml") -``` - ---- - -## 完整示例 - -以下示例创建一个完整的 AUTOSAR 软件组件配置: - -```python -from src import ( - create_arxml_document, write_arxml_pretty, create_package, - get_ar_packages_element, add_package_to_document, - create_base_type, create_unit, create_linear, create_compu_method, - create_value_type, create_impl_value_type, - create_sender_receiver_interface, SenderReceiverInterface, - ApplicationSwComponentType, PPortPrototype, RPortPrototype, - SwcInternalBehavior, RunnableEntity, TimingEvent, InitEvent, - Category, Encoding, AtomicType, Policy, CalibrationAccess, - create_sw_addr_method, SectionType, DataTypeMappingSet, DataTypeMapping -) - -doc = create_arxml_document() - -base_uint8 = create_base_type("UInt8", size=8, encoding=Encoding.TWO_COMPONENT) -base_uint16 = create_base_type("UInt16", size=16, encoding=Encoding.TWO_COMPONENT) - -kmh_unit = create_unit("kmh", display="km/h", factor=1.0, offset=0.0) -speed_linear = create_linear(factor=0.01, offset=0) -speed_compu = create_compu_method("SpeedCompu", unit=kmh_unit, linear=speed_linear, category=Category.LINEAR) - -app_speed = create_value_type("AppSpeed", unit=kmh_unit, compu_method=speed_compu) -impl_speed = create_impl_value_type("ImplSpeed", base_type=base_uint16) - -mapping = DataTypeMapping( - name="SpeedMapping", - application_data_type=app_speed, - implementation_data_type=impl_speed -) -mapping_set = DataTypeMappingSet(name="SpeedMappingSet") -mapping_set.add_mapping(mapping) - -data_element = SenderReceiverInterface.DataElement( - name="SpeedData", - data_type=app_speed, - policy=Policy.STANDARD, - calibration_access=CalibrationAccess.READ_WRITE -) -speed_interface = create_sender_receiver_interface("SpeedInterface", data_element=data_element) - -code_method = create_sw_addr_method("CODE", section_type=SectionType.CODE) - -runnable = RunnableEntity( - name="UpdateSpeed", - symbol="UpdateSpeed", - minimum_start_interval=0.01, - can_be_invoked_concurrently=False -) -runnable.add_variable_access( - VariableAccess(name="SpeedAccess", port_prototype_ref="SpeedPort") -) - -timing = TimingEvent(name="Timing_10ms", period=0.01) -init = InitEvent(name="Init", runnable_ref="UpdateSpeed") - -behavior = SwcInternalBehavior( - name="SpeedSensorBehavior", - runnable_entities=[runnable], - events=[timing, init], - symbol="SpeedSensor" -) - -port = PPortPrototype(name="SpeedPort", interface=speed_interface) - -component = ApplicationSwComponentType( - name="SpeedSensorComponent", - supports_multiple_instantiation=False, - atomic_type=AtomicType.APPLICATION, - internal_behavior=behavior -) -component.add_port(port) - -package = create_package("SpeedSensorPkg", elements=[ - base_uint8, - base_uint16, - kmh_unit, - app_speed, - impl_speed, - mapping_set, - speed_interface, - code_method, - component -]) - -package_element = package.to_arxml(doc) -add_package_to_document(doc, package_element) - -write_arxml_pretty(doc, "SpeedSensor.arxml") -print("Generated: SpeedSensor.arxml") -``` - ---- - -## 常见问题 - -### Q: 如何创建多个端口? - -```python -interface1 = create_sender_receiver_interface("DataInterface") -interface2 = create_sender_receiver_interface("StatusInterface") - -component = ApplicationSwComponentType(name="MyComponent") -component.add_port(PPortPrototype(name="DataPort", interface=interface1)) -component.add_port(RPortPrototype(name="StatusPort", interface=interface2)) -``` - -### Q: 如何添加多个 Runnable? - -```python -behavior = SwcInternalBehavior(name="Behavior") - -runnable1 = create_runnable_entity(name="InitRunnable", symbol="Init") -runnable2 = create_runnable_entity(name="MainRunnable", symbol="Main", minimum_start_interval=0.01) - -behavior.add_runnable(runnable1) -behavior.add_runnable(runnable2) - -component = ApplicationSwComponentType(name="MyComponent") -component.internal_behavior = behavior -``` - -### Q: 如何创建嵌套结构体? - -```python -inner_type = create_value_type("InnerValue") -inner_struct = ApplicationStructureDataType(name="InnerStruct") -inner_struct.add_element( - ApplicationStructureDataType.StructureElement(name="value", data_type=inner_type) -) - -outer_struct = ApplicationStructureDataType(name="OuterStruct") -outer_struct.add_element( - ApplicationStructureDataType.StructureElement(name="inner", data_type=inner_struct) -) -``` \ No newline at end of file