- extended service tracking example for GoCB and SGCB service tracking

pull/265/head
Michael Zillgith 5 years ago
parent fcdb83bc2f
commit 3a2eea3611

@ -25,6 +25,77 @@ sigint_handler(int signalId)
running = 0;
}
typedef struct {
float strVal;
int opDlTmms;
int rsDlTmms;
int rstTms;
} PTOC1Settings;
static PTOC1Settings ptoc1Settings[] = {
{1.0f, 500, 500, 500},
{2.0f, 1500, 2500, 750},
{3.0f, 500, 1500, 750},
{3.5f, 1250, 1750, 500},
{3.75f, 1250, 1750, 750}
};
static void
loadActiveSgValues (int actSG)
{
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_StrVal_setMag_f, ptoc1Settings[actSG - 1].strVal);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_OpDlTmms_setVal, ptoc1Settings[actSG - 1].opDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_RsDlTmms_setVal, ptoc1Settings[actSG - 1].rsDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_GenericIO_PTOC1_RstTms_setVal, ptoc1Settings[actSG - 1].rstTms);
}
static void
loadEditSgValues (int editSG)
{
IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f, ptoc1Settings[editSG - 1].strVal);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal, ptoc1Settings[editSG - 1].opDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal, ptoc1Settings[editSG - 1].rsDlTmms);
IedServer_updateInt32AttributeValue(iedServer, IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal, ptoc1Settings[editSG - 1].rstTms);
}
static bool
activeSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
uint8_t newActSg, ClientConnection connection)
{
printf("Switch to setting group %i\n", (int) newActSg);
loadActiveSgValues(newActSg);
return true;
}
static bool
editSgChangedHandler (void* parameter, SettingGroupControlBlock* sgcb,
uint8_t newEditSg, ClientConnection connection)
{
printf("Set edit setting group to %i\n", (int) newEditSg);
loadEditSgValues(newEditSg);
return true;
}
static void
editSgConfirmedHandler(void* parameter, SettingGroupControlBlock* sgcb,
uint8_t editSg)
{
printf("Received edit sg confirm for sg %i\n", editSg);
ptoc1Settings[editSg - 1].strVal = MmsValue_toFloat(IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f->mmsValue);
ptoc1Settings[editSg - 1].opDlTmms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal->mmsValue);
ptoc1Settings[editSg - 1].rsDlTmms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal->mmsValue);
ptoc1Settings[editSg - 1].rstTms = MmsValue_toInt32(IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal->mmsValue);
if (IedServer_getActiveSettingGroup(iedServer, sgcb) == editSg) {
loadActiveSgValues(editSg);
}
}
static ControlHandlerResult
controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test)
{
@ -115,6 +186,14 @@ main(int argc, char** argv)
/* configuration object is no longer required */
IedServerConfig_destroy(config);
SettingGroupControlBlock* sgcb = LogicalDevice_getSettingGroupControlBlock(IEDMODEL_GenericIO);
loadActiveSgValues(sgcb->actSG);
IedServer_setActiveSettingGroupChangedHandler(iedServer, sgcb, activeSgChangedHandler, NULL);
IedServer_setEditSettingGroupChangedHandler(iedServer, sgcb, editSgChangedHandler, NULL);
IedServer_setEditSettingGroupConfirmationHandler(iedServer, sgcb, editSgConfirmedHandler, NULL);
if (argc > 1) {
char* ethernetIfcID = argv[1];

@ -106,6 +106,8 @@
<GSEControl appID="events" name="gcbEvents" type="GOOSE" datSet="Events" confRev="3" />
<SettingControl desc="parameter set" numOfSGs="5" actSG="1" />
<DOI name="Mod">
<DAI name="stVal">
<Val>on</Val>
@ -183,6 +185,7 @@
</DAI>
</DOI>
</LN>
<LN desc="example for setting groups" inst="1" lnClass="PTOC" lnType="PTOC1"/>
<LN desc="Service Tracking Information" inst="1" lnClass="LTRK" lnType="myLTRK"/>
</LDevice>
</Server>
@ -218,6 +221,16 @@
<DO name="Ind3" type="SPS_1_Proxy"/>
<DO name="Ind4" type="SPS_1_Proxy"/>
</LNodeType>
<LNodeType id="PTOC1" lnClass="PTOC">
<DO name="Mod" type="ENC_1_Mod" />
<DO name="Beh" type="ENS_1_Beh" />
<DO name="Str" type="ACD_Str" />
<DO name="Op" type="ACT_Op" />
<DO name="StrVal" type="ASG_SE" />
<DO name="OpDlTmms" type="ING_SE" />
<DO name="RsDlTmms" type="ING_SE" />
<DO name="RstTms" type="ING_SE"/>
</LNodeType>
<LNodeType id="myLTRK" lnClass="LTRK">
<DO name="Beh" type="myENS_Beh" desc=""/>
<DO name="SpcTrk" type="myCTS_Bool" desc=""/>
@ -227,7 +240,25 @@
<DO name="UrcbTrk" type="myUTS" desc=""/>
<DO name="BrcbTrk" type="myBTS" desc=""/>
<DO name="GocbTrk" type="myGTS" desc=""/>
<DO name="SgcbTrk" type="mySTS" desc=""/>
</LNodeType>
<DOType cdc="ACD" id="ACD_Str">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="general" />
<DA bType="Enum" dchg="true" fc="ST" name="dirGeneral" type="dirGeneral" />
<DA bType="Quality" fc="ST" name="q" qchg="true" />
<DA bType="Timestamp" fc="ST" name="t" />
</DOType>
<DOType cdc="ACT" id="ACT_Op">
<DA bType="BOOLEAN" dchg="true" fc="ST" name="general"/>
<DA bType="Quality" fc="ST" name="q" qchg="true"/>
<DA bType="Timestamp" fc="ST" name="t"/>
</DOType>
<DOType cdc="ASG" id="ASG_SE">
<DA bType="Struct" fc="SE" name="setMag" type="AnalogueValue_1"/>
</DOType>
<DOType id="ING_SE" cdc="ING">
<DA name="setVal" bType="INT32" fc="SE" dchg="true" />
</DOType>
<DOType id="myCTS_Bool" cdc="CTS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
@ -355,6 +386,24 @@
<DA name="ndsCom" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="dstAddress" bType="PhyComAddr" fc="SR" desc=""/>
</DOType>
<DOType id="mySTS" cdc="STS" desc="">
<DA name="objRef" bType="ObjRef" fc="SR" desc="" dupd="true"/>
<DA name="serviceType" bType="Enum" type="ServiceType" fc="SR" desc=""/>
<DA name="errorCode" bType="Enum" type="ServiceError" fc="SR" desc=""/>
<DA name="originatorID" bType="Octet64" fc="SR" desc=""/>
<DA name="t" bType="Timestamp" fc="SR" desc=""/>
<DA name="d" bType="VisString255" fc="DC" desc=""/>
<DA name="dU" bType="Unicode255" fc="DC" desc=""/>
<DA name="cdcNs" bType="VisString255" fc="EX" desc=""/>
<DA name="cdcName" bType="VisString255" fc="EX" desc=""/>
<DA name="dataNs" bType="VisString255" fc="EX" desc=""/>
<DA name="numOfSG" bType="INT8U" fc="SR" desc=""/>
<DA name="actSG" bType="INT8U" fc="SR" desc=""/>
<DA name="editSG" bType="INT8U" fc="SR" desc=""/>
<DA name="cnfEdit" bType="BOOLEAN" fc="SR" desc=""/>
<DA name="lActTm" bType="Timestamp" fc="SR" desc=""/>
<DA name="resvTms" bType="INT16U" fc="SR" desc=""/>
</DOType>
<DOType id="ENC_1_Mod" cdc="ENC">
<DA name="stVal" bType="Enum" type="Beh" fc="ST" dchg="true"/>
<DA name="q" bType="Quality" fc="ST" qchg="true"/>
@ -564,5 +613,11 @@
<EnumVal ord="53">TimeSynchronisation</EnumVal>
<EnumVal ord="54">InternalChange</EnumVal>
</EnumType>
<EnumType id="dirGeneral">
<EnumVal ord="0">unknown</EnumVal>
<EnumVal ord="1">forward</EnumVal>
<EnumVal ord="2">backward</EnumVal>
<EnumVal ord="3">both</EnumVal>
</EnumType>
</DataTypeTemplates>
</SCL>

@ -679,7 +679,7 @@ LogicalNode iedModel_GenericIO_GGIO1 = {
LogicalNodeModelType,
"GGIO1",
(ModelNode*) &iedModel_GenericIO,
(ModelNode*) &iedModel_GenericIO_LTRK1,
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_GGIO1_Mod,
};
@ -2088,6 +2088,398 @@ DataAttribute iedModel_GenericIO_GGIO1_Ind4_t = {
NULL,
0};
LogicalNode iedModel_GenericIO_PTOC1 = {
LogicalNodeModelType,
"PTOC1",
(ModelNode*) &iedModel_GenericIO,
(ModelNode*) &iedModel_GenericIO_LTRK1,
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod,
};
DataObject iedModel_GenericIO_PTOC1_Mod = {
DataObjectModelType,
"Mod",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh,
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod_stVal,
0
};
DataAttribute iedModel_GenericIO_PTOC1_Mod_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod,
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod_q,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Mod_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod,
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod_t,
NULL,
0,
IEC61850_FC_ST,
IEC61850_QUALITY,
0 + TRG_OPT_QUALITY_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Mod_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod,
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod_ctlModel,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Mod_ctlModel = {
DataAttributeModelType,
"ctlModel",
(ModelNode*) &iedModel_GenericIO_PTOC1_Mod,
NULL,
NULL,
0,
IEC61850_FC_CF,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_Beh = {
DataObjectModelType,
"Beh",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_Str,
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh_stVal,
0
};
DataAttribute iedModel_GenericIO_PTOC1_Beh_stVal = {
DataAttributeModelType,
"stVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh,
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh_q,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Beh_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh,
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh_t,
NULL,
0,
IEC61850_FC_ST,
IEC61850_QUALITY,
0 + TRG_OPT_QUALITY_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Beh_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_PTOC1_Beh,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_Str = {
DataObjectModelType,
"Str",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_Op,
(ModelNode*) &iedModel_GenericIO_PTOC1_Str_general,
0
};
DataAttribute iedModel_GenericIO_PTOC1_Str_general = {
DataAttributeModelType,
"general",
(ModelNode*) &iedModel_GenericIO_PTOC1_Str,
(ModelNode*) &iedModel_GenericIO_PTOC1_Str_dirGeneral,
NULL,
0,
IEC61850_FC_ST,
IEC61850_BOOLEAN,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Str_dirGeneral = {
DataAttributeModelType,
"dirGeneral",
(ModelNode*) &iedModel_GenericIO_PTOC1_Str,
(ModelNode*) &iedModel_GenericIO_PTOC1_Str_q,
NULL,
0,
IEC61850_FC_ST,
IEC61850_ENUMERATED,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Str_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_PTOC1_Str,
(ModelNode*) &iedModel_GenericIO_PTOC1_Str_t,
NULL,
0,
IEC61850_FC_ST,
IEC61850_QUALITY,
0 + TRG_OPT_QUALITY_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Str_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_PTOC1_Str,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_Op = {
DataObjectModelType,
"Op",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal,
(ModelNode*) &iedModel_GenericIO_PTOC1_Op_general,
0
};
DataAttribute iedModel_GenericIO_PTOC1_Op_general = {
DataAttributeModelType,
"general",
(ModelNode*) &iedModel_GenericIO_PTOC1_Op,
(ModelNode*) &iedModel_GenericIO_PTOC1_Op_q,
NULL,
0,
IEC61850_FC_ST,
IEC61850_BOOLEAN,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Op_q = {
DataAttributeModelType,
"q",
(ModelNode*) &iedModel_GenericIO_PTOC1_Op,
(ModelNode*) &iedModel_GenericIO_PTOC1_Op_t,
NULL,
0,
IEC61850_FC_ST,
IEC61850_QUALITY,
0 + TRG_OPT_QUALITY_CHANGED,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_Op_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_PTOC1_Op,
NULL,
NULL,
0,
IEC61850_FC_ST,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_StrVal = {
DataObjectModelType,
"StrVal",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms,
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag,
0
};
DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag = {
DataAttributeModelType,
"setMag",
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal,
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag,
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag_f,
0,
IEC61850_FC_SG,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag_f = {
DataAttributeModelType,
"f",
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal_setMag,
NULL,
NULL,
0,
IEC61850_FC_SG,
IEC61850_FLOAT32,
0,
NULL,
0};
DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag = {
DataAttributeModelType,
"setMag",
(ModelNode*) &iedModel_GenericIO_PTOC1_StrVal,
NULL,
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f,
0,
IEC61850_FC_SE,
IEC61850_CONSTRUCTED,
0,
NULL,
0};
DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f = {
DataAttributeModelType,
"f",
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_StrVal_setMag,
NULL,
NULL,
0,
IEC61850_FC_SE,
IEC61850_FLOAT32,
0,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_OpDlTmms = {
DataObjectModelType,
"OpDlTmms",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms,
(ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms_setVal,
0
};
DataAttribute iedModel_GenericIO_PTOC1_OpDlTmms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms,
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal,
NULL,
0,
IEC61850_FC_SG,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_OpDlTmms,
NULL,
NULL,
0,
IEC61850_FC_SE,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_RsDlTmms = {
DataObjectModelType,
"RsDlTmms",
(ModelNode*) &iedModel_GenericIO_PTOC1,
(ModelNode*) &iedModel_GenericIO_PTOC1_RstTms,
(ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms_setVal,
0
};
DataAttribute iedModel_GenericIO_PTOC1_RsDlTmms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms,
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal,
NULL,
0,
IEC61850_FC_SG,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_RsDlTmms,
NULL,
NULL,
0,
IEC61850_FC_SE,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataObject iedModel_GenericIO_PTOC1_RstTms = {
DataObjectModelType,
"RstTms",
(ModelNode*) &iedModel_GenericIO_PTOC1,
NULL,
(ModelNode*) &iedModel_GenericIO_PTOC1_RstTms_setVal,
0
};
DataAttribute iedModel_GenericIO_PTOC1_RstTms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_RstTms,
(ModelNode*) &iedModel_SE_GenericIO_PTOC1_RstTms_setVal,
NULL,
0,
IEC61850_FC_SG,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
DataAttribute iedModel_SE_GenericIO_PTOC1_RstTms_setVal = {
DataAttributeModelType,
"setVal",
(ModelNode*) &iedModel_GenericIO_PTOC1_RstTms,
NULL,
NULL,
0,
IEC61850_FC_SE,
IEC61850_INT32,
0 + TRG_OPT_DATA_CHANGED,
NULL,
0};
LogicalNode iedModel_GenericIO_LTRK1 = {
LogicalNodeModelType,
"LTRK1",
@ -3775,7 +4167,7 @@ DataObject iedModel_GenericIO_LTRK1_GocbTrk = {
DataObjectModelType,
"GocbTrk",
(ModelNode*) &iedModel_GenericIO_LTRK1,
NULL,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_GocbTrk_objRef,
0
};
@ -3988,6 +4380,223 @@ DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress = {
NULL,
0};
DataObject iedModel_GenericIO_LTRK1_SgcbTrk = {
DataObjectModelType,
"SgcbTrk",
(ModelNode*) &iedModel_GenericIO_LTRK1,
NULL,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_objRef,
0
};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_objRef = {
DataAttributeModelType,
"objRef",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_serviceType,
NULL,
0,
IEC61850_FC_SR,
IEC61850_VISIBLE_STRING_129,
0 + TRG_OPT_DATA_UPDATE,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_serviceType = {
DataAttributeModelType,
"serviceType",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_errorCode,
NULL,
0,
IEC61850_FC_SR,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_errorCode = {
DataAttributeModelType,
"errorCode",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_originatorID,
NULL,
0,
IEC61850_FC_SR,
IEC61850_ENUMERATED,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_originatorID = {
DataAttributeModelType,
"originatorID",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_t,
NULL,
0,
IEC61850_FC_SR,
IEC61850_OCTET_STRING_64,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_t = {
DataAttributeModelType,
"t",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_d,
NULL,
0,
IEC61850_FC_SR,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_d = {
DataAttributeModelType,
"d",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_dU,
NULL,
0,
IEC61850_FC_DC,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dU = {
DataAttributeModelType,
"dU",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs,
NULL,
0,
IEC61850_FC_DC,
IEC61850_UNICODE_STRING_255,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs = {
DataAttributeModelType,
"cdcNs",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cdcName,
NULL,
0,
IEC61850_FC_EX,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcName = {
DataAttributeModelType,
"cdcName",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_dataNs,
NULL,
0,
IEC61850_FC_EX,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dataNs = {
DataAttributeModelType,
"dataNs",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG,
NULL,
0,
IEC61850_FC_EX,
IEC61850_VISIBLE_STRING_255,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG = {
DataAttributeModelType,
"numOfSG",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_actSG,
NULL,
0,
IEC61850_FC_SR,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_actSG = {
DataAttributeModelType,
"actSG",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_editSG,
NULL,
0,
IEC61850_FC_SR,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_editSG = {
DataAttributeModelType,
"editSG",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit,
NULL,
0,
IEC61850_FC_SR,
IEC61850_INT8U,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit = {
DataAttributeModelType,
"cnfEdit",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_lActTm,
NULL,
0,
IEC61850_FC_SR,
IEC61850_BOOLEAN,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_lActTm = {
DataAttributeModelType,
"lActTm",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk_resvTms,
NULL,
0,
IEC61850_FC_SR,
IEC61850_TIMESTAMP,
0,
NULL,
0};
DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_resvTms = {
DataAttributeModelType,
"resvTms",
(ModelNode*) &iedModel_GenericIO_LTRK1_SgcbTrk,
NULL,
NULL,
0,
IEC61850_FC_SR,
IEC61850_INT16U,
0,
NULL,
0};
extern ReportControlBlock iedModel_GenericIO_LLN0_report0;
extern ReportControlBlock iedModel_GenericIO_LLN0_report1;
extern ReportControlBlock iedModel_GenericIO_LLN0_report2;
@ -4022,6 +4631,9 @@ static PhyComAddress iedModel_GenericIO_LLN0_gse0_address = {
GSEControlBlock iedModel_GenericIO_LLN0_gse0 = {&iedModel_GenericIO_LLN0, "gcbEvents", "events", "Events", 3, false, &iedModel_GenericIO_LLN0_gse0_address, 1000, 3000, NULL};
extern SettingGroupControlBlock iedModel_GenericIO_LLN0_sgcb;
SettingGroupControlBlock iedModel_GenericIO_LLN0_sgcb = {&iedModel_GenericIO_LLN0, 1, 5, 0, false, 0, 0, NULL};
@ -4033,7 +4645,7 @@ IedModel iedModel = {
&iedModel_GenericIO_LLN0_report0,
&iedModel_GenericIO_LLN0_gse0,
NULL,
NULL,
&iedModel_GenericIO_LLN0_sgcb,
NULL,
NULL,
initializeValues

@ -157,6 +157,39 @@ extern DataObject iedModel_GenericIO_GGIO1_Ind4;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_stVal;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_q;
extern DataAttribute iedModel_GenericIO_GGIO1_Ind4_t;
extern LogicalNode iedModel_GenericIO_PTOC1;
extern DataObject iedModel_GenericIO_PTOC1_Mod;
extern DataAttribute iedModel_GenericIO_PTOC1_Mod_stVal;
extern DataAttribute iedModel_GenericIO_PTOC1_Mod_q;
extern DataAttribute iedModel_GenericIO_PTOC1_Mod_t;
extern DataAttribute iedModel_GenericIO_PTOC1_Mod_ctlModel;
extern DataObject iedModel_GenericIO_PTOC1_Beh;
extern DataAttribute iedModel_GenericIO_PTOC1_Beh_stVal;
extern DataAttribute iedModel_GenericIO_PTOC1_Beh_q;
extern DataAttribute iedModel_GenericIO_PTOC1_Beh_t;
extern DataObject iedModel_GenericIO_PTOC1_Str;
extern DataAttribute iedModel_GenericIO_PTOC1_Str_general;
extern DataAttribute iedModel_GenericIO_PTOC1_Str_dirGeneral;
extern DataAttribute iedModel_GenericIO_PTOC1_Str_q;
extern DataAttribute iedModel_GenericIO_PTOC1_Str_t;
extern DataObject iedModel_GenericIO_PTOC1_Op;
extern DataAttribute iedModel_GenericIO_PTOC1_Op_general;
extern DataAttribute iedModel_GenericIO_PTOC1_Op_q;
extern DataAttribute iedModel_GenericIO_PTOC1_Op_t;
extern DataObject iedModel_GenericIO_PTOC1_StrVal;
extern DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag;
extern DataAttribute iedModel_GenericIO_PTOC1_StrVal_setMag_f;
extern DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag;
extern DataAttribute iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f;
extern DataObject iedModel_GenericIO_PTOC1_OpDlTmms;
extern DataAttribute iedModel_GenericIO_PTOC1_OpDlTmms_setVal;
extern DataAttribute iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal;
extern DataObject iedModel_GenericIO_PTOC1_RsDlTmms;
extern DataAttribute iedModel_GenericIO_PTOC1_RsDlTmms_setVal;
extern DataAttribute iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal;
extern DataObject iedModel_GenericIO_PTOC1_RstTms;
extern DataAttribute iedModel_GenericIO_PTOC1_RstTms_setVal;
extern DataAttribute iedModel_SE_GenericIO_PTOC1_RstTms_setVal;
extern LogicalNode iedModel_GenericIO_LTRK1;
extern DataObject iedModel_GenericIO_LTRK1_Beh;
extern DataAttribute iedModel_GenericIO_LTRK1_Beh_stVal;
@ -306,6 +339,23 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_datSet;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_confRev;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_ndsCom;
extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress;
extern DataObject iedModel_GenericIO_LTRK1_SgcbTrk;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_objRef;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_serviceType;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_errorCode;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_originatorID;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_t;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_d;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dU;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cdcName;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_dataNs;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_actSG;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_editSG;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_lActTm;
extern DataAttribute iedModel_GenericIO_LTRK1_SgcbTrk_resvTms;
@ -455,6 +505,39 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress;
#define IEDMODEL_GenericIO_GGIO1_Ind4_stVal (&iedModel_GenericIO_GGIO1_Ind4_stVal)
#define IEDMODEL_GenericIO_GGIO1_Ind4_q (&iedModel_GenericIO_GGIO1_Ind4_q)
#define IEDMODEL_GenericIO_GGIO1_Ind4_t (&iedModel_GenericIO_GGIO1_Ind4_t)
#define IEDMODEL_GenericIO_PTOC1 (&iedModel_GenericIO_PTOC1)
#define IEDMODEL_GenericIO_PTOC1_Mod (&iedModel_GenericIO_PTOC1_Mod)
#define IEDMODEL_GenericIO_PTOC1_Mod_stVal (&iedModel_GenericIO_PTOC1_Mod_stVal)
#define IEDMODEL_GenericIO_PTOC1_Mod_q (&iedModel_GenericIO_PTOC1_Mod_q)
#define IEDMODEL_GenericIO_PTOC1_Mod_t (&iedModel_GenericIO_PTOC1_Mod_t)
#define IEDMODEL_GenericIO_PTOC1_Mod_ctlModel (&iedModel_GenericIO_PTOC1_Mod_ctlModel)
#define IEDMODEL_GenericIO_PTOC1_Beh (&iedModel_GenericIO_PTOC1_Beh)
#define IEDMODEL_GenericIO_PTOC1_Beh_stVal (&iedModel_GenericIO_PTOC1_Beh_stVal)
#define IEDMODEL_GenericIO_PTOC1_Beh_q (&iedModel_GenericIO_PTOC1_Beh_q)
#define IEDMODEL_GenericIO_PTOC1_Beh_t (&iedModel_GenericIO_PTOC1_Beh_t)
#define IEDMODEL_GenericIO_PTOC1_Str (&iedModel_GenericIO_PTOC1_Str)
#define IEDMODEL_GenericIO_PTOC1_Str_general (&iedModel_GenericIO_PTOC1_Str_general)
#define IEDMODEL_GenericIO_PTOC1_Str_dirGeneral (&iedModel_GenericIO_PTOC1_Str_dirGeneral)
#define IEDMODEL_GenericIO_PTOC1_Str_q (&iedModel_GenericIO_PTOC1_Str_q)
#define IEDMODEL_GenericIO_PTOC1_Str_t (&iedModel_GenericIO_PTOC1_Str_t)
#define IEDMODEL_GenericIO_PTOC1_Op (&iedModel_GenericIO_PTOC1_Op)
#define IEDMODEL_GenericIO_PTOC1_Op_general (&iedModel_GenericIO_PTOC1_Op_general)
#define IEDMODEL_GenericIO_PTOC1_Op_q (&iedModel_GenericIO_PTOC1_Op_q)
#define IEDMODEL_GenericIO_PTOC1_Op_t (&iedModel_GenericIO_PTOC1_Op_t)
#define IEDMODEL_GenericIO_PTOC1_StrVal (&iedModel_GenericIO_PTOC1_StrVal)
#define IEDMODEL_GenericIO_PTOC1_StrVal_setMag (&iedModel_GenericIO_PTOC1_StrVal_setMag)
#define IEDMODEL_GenericIO_PTOC1_StrVal_setMag_f (&iedModel_GenericIO_PTOC1_StrVal_setMag_f)
#define IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag (&iedModel_SE_GenericIO_PTOC1_StrVal_setMag)
#define IEDMODEL_SE_GenericIO_PTOC1_StrVal_setMag_f (&iedModel_SE_GenericIO_PTOC1_StrVal_setMag_f)
#define IEDMODEL_GenericIO_PTOC1_OpDlTmms (&iedModel_GenericIO_PTOC1_OpDlTmms)
#define IEDMODEL_GenericIO_PTOC1_OpDlTmms_setVal (&iedModel_GenericIO_PTOC1_OpDlTmms_setVal)
#define IEDMODEL_SE_GenericIO_PTOC1_OpDlTmms_setVal (&iedModel_SE_GenericIO_PTOC1_OpDlTmms_setVal)
#define IEDMODEL_GenericIO_PTOC1_RsDlTmms (&iedModel_GenericIO_PTOC1_RsDlTmms)
#define IEDMODEL_GenericIO_PTOC1_RsDlTmms_setVal (&iedModel_GenericIO_PTOC1_RsDlTmms_setVal)
#define IEDMODEL_SE_GenericIO_PTOC1_RsDlTmms_setVal (&iedModel_SE_GenericIO_PTOC1_RsDlTmms_setVal)
#define IEDMODEL_GenericIO_PTOC1_RstTms (&iedModel_GenericIO_PTOC1_RstTms)
#define IEDMODEL_GenericIO_PTOC1_RstTms_setVal (&iedModel_GenericIO_PTOC1_RstTms_setVal)
#define IEDMODEL_SE_GenericIO_PTOC1_RstTms_setVal (&iedModel_SE_GenericIO_PTOC1_RstTms_setVal)
#define IEDMODEL_GenericIO_LTRK1 (&iedModel_GenericIO_LTRK1)
#define IEDMODEL_GenericIO_LTRK1_Beh (&iedModel_GenericIO_LTRK1_Beh)
#define IEDMODEL_GenericIO_LTRK1_Beh_stVal (&iedModel_GenericIO_LTRK1_Beh_stVal)
@ -604,6 +687,23 @@ extern DataAttribute iedModel_GenericIO_LTRK1_GocbTrk_dstAddress;
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_confRev (&iedModel_GenericIO_LTRK1_GocbTrk_confRev)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_ndsCom (&iedModel_GenericIO_LTRK1_GocbTrk_ndsCom)
#define IEDMODEL_GenericIO_LTRK1_GocbTrk_dstAddress (&iedModel_GenericIO_LTRK1_GocbTrk_dstAddress)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk (&iedModel_GenericIO_LTRK1_SgcbTrk)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_objRef (&iedModel_GenericIO_LTRK1_SgcbTrk_objRef)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_serviceType (&iedModel_GenericIO_LTRK1_SgcbTrk_serviceType)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_errorCode (&iedModel_GenericIO_LTRK1_SgcbTrk_errorCode)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_originatorID (&iedModel_GenericIO_LTRK1_SgcbTrk_originatorID)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_t (&iedModel_GenericIO_LTRK1_SgcbTrk_t)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_d (&iedModel_GenericIO_LTRK1_SgcbTrk_d)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_dU (&iedModel_GenericIO_LTRK1_SgcbTrk_dU)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cdcNs (&iedModel_GenericIO_LTRK1_SgcbTrk_cdcNs)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cdcName (&iedModel_GenericIO_LTRK1_SgcbTrk_cdcName)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_dataNs (&iedModel_GenericIO_LTRK1_SgcbTrk_dataNs)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_numOfSG (&iedModel_GenericIO_LTRK1_SgcbTrk_numOfSG)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_actSG (&iedModel_GenericIO_LTRK1_SgcbTrk_actSG)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_editSG (&iedModel_GenericIO_LTRK1_SgcbTrk_editSG)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_cnfEdit (&iedModel_GenericIO_LTRK1_SgcbTrk_cnfEdit)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_lActTm (&iedModel_GenericIO_LTRK1_SgcbTrk_lActTm)
#define IEDMODEL_GenericIO_LTRK1_SgcbTrk_resvTms (&iedModel_GenericIO_LTRK1_SgcbTrk_resvTms)
#endif /* STATIC_MODEL_H_ */

@ -291,6 +291,7 @@ struct sMmsMapping {
ControlTrkInstance iscTrk;
ControlTrkInstance bacTrk;
SgcbTrkInstance sgcbTrk;
ServiceTrkInstance genTrk;
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */
/* flag indicates if data model is locked --> prevents reports to be sent */

@ -1264,7 +1264,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
!strcmp(modelNode->name, "BacIntTrk"))
{
if (DEBUG_IED_SERVER)
printf("%s data object found!\n", modelNode->name);
printf("IED_SERVER: %s data object found!\n", modelNode->name);
DataObject* actTrk = (DataObject*) modelNode;
ControlTrkInstance* actInstance = NULL;
@ -1306,7 +1306,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
}
else if (!strcmp(modelNode->name, "BrcbTrk")) {
if (DEBUG_IED_SERVER)
printf("BrcbTrk data object found!\n");
printf("IED_SERVER: BrcbTrk data object found!\n");
DataObject* brcbTrk = (DataObject*) modelNode;
@ -1330,7 +1330,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
}
else if (!strcmp(modelNode->name, "UrcbTrk")) {
if (DEBUG_IED_SERVER)
printf("UrcbTrk data object found!\n");
printf("IED_SERVER: UrcbTrk data object found!\n");
DataObject* urcbTrk = (DataObject*) modelNode;
@ -1353,7 +1353,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
}
else if (!strcmp(modelNode->name, "GocbTrk")) {
if (DEBUG_IED_SERVER)
printf("GocbTrk data object found!\n");
printf("IED_SERVER: GocbTrk data object found!\n");
DataObject* gocbTrk = (DataObject*) modelNode;
@ -1376,7 +1376,7 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
}
else if (!strcmp(modelNode->name, "SgcbTrk")) {
if (DEBUG_IED_SERVER)
printf("SgcbTrk data object found!\n");
printf("IED_SERVER: SgcbTrk data object found!\n");
DataObject* sgcbTrk = (DataObject*) modelNode;
@ -1397,6 +1397,28 @@ checkForServiceTrackingVariables(MmsMapping* self, LogicalNode* logicalNode)
}
}
else if (!strcmp(modelNode->name, "GenTrk")) {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: GenTrk data object found!\n");
DataObject* genTrk = (DataObject*) modelNode;
if (self->genTrk) {
if (DEBUG_IED_SERVER)
printf("IED_SERVER: ERROR: multiple GenTrk instances found in server\n");
}
else {
/* Setup GenTrk references */
self->genTrk = (ServiceTrkInstance) GLOBAL_CALLOC(1, sizeof(struct sServiceTrkInstance));
if (self->genTrk) {
self->genTrk->dobj = genTrk;
getCommonTrackingAttributes((ServiceTrkInstance) self->genTrk, genTrk);
}
}
}
modelNode = modelNode->sibling;
}
@ -1961,6 +1983,7 @@ MmsMapping_destroy(MmsMapping* self)
if (self->iscTrk) GLOBAL_FREEMEM(self->iscTrk);
if (self->bacTrk) GLOBAL_FREEMEM(self->bacTrk);
if (self->sgcbTrk) GLOBAL_FREEMEM(self->sgcbTrk);
if (self->genTrk) GLOBAL_FREEMEM(self->genTrk);
#endif
LinkedList_destroy(self->attributeAccessHandlers);

Loading…
Cancel
Save