1、目的
本文介绍在ARXML的自动解析库基础上如何进行修改,以支持配置工具的操作。
2、自动生成的代码
2.1 ARPACKAGE
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(TypeName="AR-PACKAGE", Namespace="http://autosar.org/schema/r4.0")]
public partial class ARPACKAGE {
/// <remarks/>
// ......
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCDEFINITIONCOLLECTION), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCMODULECONFIGURATIONVALUES), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCMODULEDEF), IsNullable=false)]
[System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCVALUECOLLECTION), IsNullable=false)]
// ......
public Object[] ELEMENTS
{
get {
return this.eLEMENTSField;
}
set {
this.eLEMENTSField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute("AR-PACKAGES")]
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
public ARPACKAGE[] ARPACKAGES {
get {
return this.aRPACKAGESField;
}
set {
this.aRPACKAGESField = value;
}
}
}
ELEMENTS属性就是ARXML很关键的部分,很多模版定义都是在这个下面的。
例如:ECUCMODULEDEF(配置模型), ECUCMODULECONFIGURATIONVALUES(配置数据)
ARPACKAGES 属性是一个嵌套结构,后续我们需要对其特殊处理。
2.2 手动改写自动生成的C#代码
微软的SDK中的xsd.exe生成的集合类使用的数组形式,后续操作不太方面;需要手动改成ObservableCollection。当然也有更强大的工具,如xsd++,但是有license。
如:使用 ObservableCollection<Object> 替换Object[]。
3、增加新的特性
3.1 界面更新 INotifyPropertyChanged
ECUCMODULEDEF,ECUCPARAMCONFCONTAINERDEF等,前面章节介绍的配置模版,配置数据类型都需要增加。
3.2 属性增加
以下是几个常用的属性需要增加,我们可以新建个文件,这样就不用管原来自动代码生成的那个很长的文件了:
3.3.1 ECUCMODULEDEF
public partial class ECUCMODULEDEF : INotifyPropertyChanged
{
private ECUCCONFIGURATIONVARIANTENUM cONFIGURATIONCLASSField;
[System.Xml.Serialization.XmlIgnore]
public ECUCCONFIGURATIONVARIANTENUM CONFIGURATIONCLASS
{
get { return cONFIGURATIONCLASSField; }
set { cONFIGURATIONCLASSField = value; }
}
// 关联配置值模块 => ECUCMODULECONFIGURATIONVALUES
private ECUCMODULECONFIGURATIONVALUES cONFIGURATIONVALUESField;
[System.Xml.Serialization.XmlIgnore]
public ECUCMODULECONFIGURATIONVALUES CONFIGURATIONVALUES
{
get { return cONFIGURATIONVALUESField; }
set { cONFIGURATIONVALUESField = value; }
}
// Paramter Definition Short Name
private string pARAMTER_DEF_SHORT_NAMEField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DEF_SHORT_NAME
{
get { return pARAMTER_DEF_SHORT_NAMEField; }
set { pARAMTER_DEF_SHORT_NAMEField = value; }
}
// Paramter Data Path
private string pARAMTER_DATA_FULL_URL_PATHField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DATA_FULL_URL_PATH
{
get { return pARAMTER_DATA_FULL_URL_PATHField; }
set { pARAMTER_DATA_FULL_URL_PATHField = value; }
}
// Paramter Definition Path
string pARAMTER_DEF_FULL_URL_PATHField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DEF_FULL_URL_PATH
{
get { return pARAMTER_DEF_FULL_URL_PATHField; }
set { pARAMTER_DEF_FULL_URL_PATHField = value; }
}
}
PARAMTER_DATA_FULL_URL_PATH: 记录当前配置数据的XML树路径,这些路径是由SHORTNAME构成的,方便后续的操作。
PARAMTER_DEF_FULL_URL_PATH: 是配置模型的XML树路径
如:/AUTOSAR/EcucDefs/CanIf/CanIfInitCfg/CanIfInitCfgSet
3.3.2 ECUCCONFCONTAINERDEFBase作为ECUCPARAMCONFCONTAINERDEF, ECUCCHOICECONTAINERDEF的基类
public class ECUCCONFCONTAINERDEFBase : INotifyPropertyChanged
{
// 关联配置子容器 => ECUCCONTAINERVALUE
private ECUCCONTAINERVALUE cONFIGURATIONVALUESField;
public ECUCCONTAINERVALUE CONFIGURATIONVALUES
{
get { return cONFIGURATIONVALUESField; }
set { cONFIGURATIONVALUESField = value; }
}
// Paramter Definition Short Name
private string pARAMTER_DEF_SHORT_NAMEField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DEF_SHORT_NAME
{
get { return pARAMTER_DEF_SHORT_NAMEField; }
set { pARAMTER_DEF_SHORT_NAMEField = value; }
}
private string pARAMTER_DATA_PARENT_FULL_URL_PATHField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DATA_PARENT_FULL_URL_PATH
{
get { return pARAMTER_DATA_PARENT_FULL_URL_PATHField; }
set { pARAMTER_DATA_PARENT_FULL_URL_PATHField = value; }
}
// Paramter Definition Path
string pARAMTER_DEF_FULL_URL_PATHField;
public string PARAMTER_DEF_FULL_URL_PATH
{
get { return pARAMTER_DEF_FULL_URL_PATHField; }
set { pARAMTER_DEF_FULL_URL_PATHField = value; }
}
}
3.2.1 ECUCPARAMERSDEFBase 作为配置模型的参数类的基类
public class ECUCPARAMERSDEFBase : INotifyPropertyChanged
{
private string pARAMTER_DATA_SET_VALUEField;
private string pARAMTER_DATA_BACKUP_VALUEField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DATA_SET_VALUE
{
get { return pARAMTER_DATA_SET_VALUEField; }
set
{
pARAMTER_DATA_BACKUP_VALUEField = pARAMTER_DATA_SET_VALUEField;
pARAMTER_DATA_SET_VALUEField = value;
if (!Validate())
{
pARAMTER_DATA_SET_VALUEField = pARAMTER_DATA_BACKUP_VALUEField;
}
OnPropertyChanged("PARAMTER_DATA_SET_VALUE");
}
}
// Paramter Data Path
private string pARAMTER_DATA_FULL_URL_PATHField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DATA_FULL_URL_PATH
{
get { return pARAMTER_DATA_FULL_URL_PATHField; }
set { pARAMTER_DATA_FULL_URL_PATHField = value; }
}
// Paramter Definition Path
string pARAMTER_DEF_FULL_URL_PATHField;
[System.Xml.Serialization.XmlIgnore]
public string PARAMTER_DEF_FULL_URL_PATH
{
get { return pARAMTER_DEF_FULL_URL_PATHField; }
set { pARAMTER_DEF_FULL_URL_PATHField = value; }
}
}
PARAMTER_DATA_SET_VALUE:用来保存当前配置工具的配置值。也就是我们后续的配置工具显示是以配置模型的设计为基础,配置数据的对象仅仅用来保存输出ARXML文件。
保存: 配置模型转换为配置数据,通过序列化配置数据对象为ARXML文件
打开:解析配置数据,查找对应的配置模版,加载配置数据的值到配置模版的对象中。
新建: 选择配置模版,根据模版中的嵌套属性创建配置模版的一个实例,再根据配置需求,增加多个配置项实例。
具体参考后续介绍。
3.3 System.Xml.Serialization.XmlIgnore
[System.Xml.Serialization.XmlIgnore] 是为了防止新增的属性在序列化输出ARXML文件时,额外生成相关属性内容,而这些内容并不是AUTOSAR标准定义的。