X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=ucs2-interface%2Fucs-xml%2FUcsXml.c;h=4c392cde4c73339b60b3d507d6f52f27b535424d;hb=d51b0e0b7ef6dab5bc938a6bfea630426108b4d8;hp=96498ef3718552cd43eed59a23909e03fb4f788b;hpb=78f5e26f3e977cba3711c2dcb15314d9821119fd;p=apps%2Fagl-service-unicens.git diff --git a/ucs2-interface/ucs-xml/UcsXml.c b/ucs2-interface/ucs-xml/UcsXml.c index 96498ef..4c392cd 100644 --- a/ucs2-interface/ucs-xml/UcsXml.c +++ b/ucs2-interface/ucs-xml/UcsXml.c @@ -1,5 +1,5 @@ /*------------------------------------------------------------------------------------------------*/ -/* Unicens XML Parser */ +/* UNICENS XML Parser */ /* Copyright 2017, Microchip Technology Inc. and its subsidiaries. */ /* */ /* Redistribution and use in source and binary forms, with or without */ @@ -38,7 +38,7 @@ /************************************************************************/ #define COMPILETIME_CHECK(cond) (void)sizeof(int[2 * !!(cond) - 1]) -#define RETURN_ASSERT(result) { assert(false); return result; } +#define RETURN_ASSERT(result) { UcsXml_CB_OnError("Assertion in file=%s, line=%d", 2, __FILE__, __LINE__); return result; } #define MISC_HB(value) ((uint8_t)((uint16_t)(value) >> 8)) #define MISC_LB(value) ((uint8_t)((uint16_t)(value) & (uint16_t)0xFF)) @@ -54,6 +54,7 @@ struct UcsXmlRoute struct UcsXmlScript { + bool inUse; char scriptName[32]; Ucs_Rm_Node_t *node; struct UcsXmlScript *next; @@ -62,7 +63,7 @@ struct UcsXmlScript struct UcsXmlJobList { Ucs_Xrm_ResObject_t *job; - struct UcsXmlJobList *next; + struct UcsXmlJobList *next; }; typedef enum @@ -85,11 +86,8 @@ typedef enum typedef struct { Ucs_Rm_Node_t *nod; - bool usbPortAddedToJobList; /* USB Port must be added only ONCE to connection job lists */ Ucs_Xrm_UsbPort_t *usbPort; - bool mlbPortAddedToJobList; /* MLB Port must be added only ONCE to connection job lists */ Ucs_Xrm_MlbPort_t *mlbPort; - bool strmPortsAddedToJobList; /* STRM Ports must be added only ONCE to connection job lists */ Ucs_Xrm_StrmPort_t *strmPortA; Ucs_Xrm_StrmPort_t *strmPortB; } NodeData_t; @@ -157,7 +155,7 @@ static const char* AVP_PACKET_SIZE = "IsocPacketSize"; #define QOS_CONNECTION "QoSConnection" #define IPC_CONNECTION "IPCConnection" -static const char* ALL_CONNECTIONS[] = { SYNC_CONNECTION, AVP_CONNECTION, +static const char* ALL_CONNECTIONS[] = { SYNC_CONNECTION, AVP_CONNECTION, DFP_CONNECTION, QOS_CONNECTION, IPC_CONNECTION, NULL }; #define MOST_SOCKET "MOSTSocket" @@ -166,13 +164,13 @@ static const char* ALL_CONNECTIONS[] = { SYNC_CONNECTION, AVP_CONNECTION, #define STREAM_SOCKET "StreamSocket" #define SPLITTER "Splitter" #define COMBINER "Combiner" -static const char* ALL_SOCKETS[] = { MOST_SOCKET, USB_SOCKET, MLB_SOCKET, +static const char* ALL_SOCKETS[] = { MOST_SOCKET, USB_SOCKET, MLB_SOCKET, STREAM_SOCKET, SPLITTER, COMBINER, NULL }; #define MLB_PORT "MediaLBPort" #define USB_PORT "USBPort" #define STRM_PORT "StreamPort" -static const char* ALL_PORTS[] = { MLB_PORT, USB_PORT, STRM_PORT }; +static const char* ALL_PORTS[] = { MLB_PORT, USB_PORT, STRM_PORT, NULL }; static const char* PHYSICAL_LAYER = "PhysicalLayer"; static const char* DEVICE_INTERFACES = "DeviceInterfaces"; @@ -215,7 +213,7 @@ static const char* I2C_TIMEOUT = "Timeout"; #define SCRIPT_I2C_PORT_CREATE "I2CPortCreate" #define SCRIPT_I2C_PORT_WRITE "I2CPortWrite" #define SCRIPT_I2C_PORT_READ "I2CPortRead" -static const char* ALL_SCRIPTS[] = { SCRIPT_MSG_SEND, SCRIPT_PAUSE, +static const char* ALL_SCRIPTS[] = { SCRIPT_MSG_SEND, SCRIPT_PAUSE, SCRIPT_GPIO_PORT_CREATE, SCRIPT_GPIO_PORT_PIN_MODE, SCRIPT_GPIO_PIN_STATE, SCRIPT_I2C_PORT_CREATE, SCRIPT_I2C_PORT_WRITE, SCRIPT_I2C_PORT_READ, NULL }; @@ -234,6 +232,7 @@ static bool GetElementArray(mxml_node_t *element, const char *array[], const cha static bool GetCount(mxml_node_t *element, const char *name, uint32_t *out, bool mandatory); static bool GetCountArray(mxml_node_t *element, const char *array[], uint32_t *out, bool mandatory); static bool GetString(mxml_node_t *element, const char *key, const char **out, bool mandatory); +static bool CheckInteger(const char *val, bool forceHex); static bool GetUInt16(mxml_node_t *element, const char *key, uint16_t *out, bool mandatory); static bool GetUInt8(mxml_node_t *element, const char *key, uint8_t *out, bool mandatory); static bool GetSocketType(const char *txt, MSocketType_t *out); @@ -266,7 +265,7 @@ static ParseResult_t ParseRoutes(UcsXmlVal_t *ucs, PrivateData_t *priv); UcsXmlVal_t *UcsXml_Parse(const char *xmlString) { - UcsXmlVal_t *val; + UcsXmlVal_t *val = NULL; ParseResult_t result = Parse_MemoryError; mxml_node_t *tree; if (!(tree = mxmlLoadString(NULL, xmlString, MXML_NO_CALLBACK))) goto ERROR; @@ -281,13 +280,14 @@ UcsXmlVal_t *UcsXml_Parse(const char *xmlString) return val; ERROR: if (Parse_MemoryError == result) - UcsXml_CB_OnError("XML error, aborting..", 0); + UcsXml_CB_OnError("XML memory error, aborting..", 0); else - UcsXml_CB_OnError("Allocation error, aborting..", 0); - assert(false); + UcsXml_CB_OnError("XML parsing error, aborting..", 0); + assert(false); if (!tree) mxmlDelete(tree); - FreeVal(val); + if (val) + FreeVal(val); return NULL; } @@ -415,24 +415,75 @@ static bool GetString(mxml_node_t *element, const char *key, const char **out, b } } if (mandatory) - UcsXml_CB_OnError("Can not find attribute='%s' from element <%s>", + UcsXml_CB_OnError("Can not find attribute='%s' from element <%s>", 2, key, element->value.element.name); return false; } +static bool CheckInteger(const char *value, bool forceHex) +{ + bool hex = forceHex; + int32_t len; + if (!value) return false; + len = strlen(value); + if (len >= 3 && '0' == value[0] && 'x' == value[1]) + { + hex = true; + value += 2; + } + while(value[0]) + { + bool valid = false; + uint8_t v = value[0]; + if (v >= '0' && v <= '9') valid = true; + if (hex) + { + if (v >= 'a' && v <= 'f') valid = true; + if (v >= 'A' && v <= 'F') valid = true; + } + if (!valid) return false; + ++value; + } + return true; +} + static bool GetUInt16(mxml_node_t *element, const char *key, uint16_t *out, bool mandatory) { + long int value; const char* txt; if (!GetString(element, key, &txt, mandatory)) return false; - *out = strtol( txt, NULL, 0 ); + if (!CheckInteger(txt, false)) + { + UcsXml_CB_OnError("key='%s' contained invalid integer='%s'", 2, key, txt); + return false; + } + value = strtol( txt, NULL, 0 ); + if (value > 0xFFFF) + { + UcsXml_CB_OnError("key='%s' is out of range='%d'", 2, key, value); + return false; + } + *out = value; return true; } static bool GetUInt8(mxml_node_t *element, const char *key, uint8_t *out, bool mandatory) { + long int value; const char* txt; if (!GetString(element, key, &txt, mandatory)) return false; - *out = strtol( txt, NULL, 0 ); + if (!CheckInteger(txt, false)) + { + UcsXml_CB_OnError("key='%s' contained invalid integer='%s'", 2, key, txt); + return false; + } + value = strtol( txt, NULL, 0 ); + if (value > 0xFF) + { + UcsXml_CB_OnError("key='%s' is out of range='%d'", 2, key, value); + return false; + } + *out = value; return true; } @@ -489,7 +540,7 @@ static bool GetPayload(mxml_node_t *element, const char *name, uint8_t **pPayloa return false; tempLen = strlen(txt) + 1; txtCopy = malloc(tempLen); - if (NULL == txtCopy) + if (NULL == txtCopy) return false; strncpy(txtCopy, txt, tempLen); tempLen = tempLen / 3; /* 2 chars hex value plus space (AA ) */ @@ -510,6 +561,13 @@ static bool GetPayload(mxml_node_t *element, const char *name, uint8_t **pPayloa assert(false); return 0; } + if (!CheckInteger(token, true)) + { + UcsXml_CB_OnError("Script payload contains non valid hex number='%s'", 1, token); + free(txtCopy); + assert(false); + return 0; + } p[offset + len++] = strtol( token, NULL, 16 ); token = strtok_r( NULL, " ,.-", &tkPtr ); } @@ -633,7 +691,7 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t priv->autoRouteId = 0x8000; if (!GetCount(tree, NODE, &nodeCount, true)) RETURN_ASSERT(Parse_XmlError); - + ucs->pNod = MCalloc(&priv->objList, nodeCount, sizeof(Ucs_Rm_Node_t)); if (NULL == ucs->pNod) RETURN_ASSERT(Parse_MemoryError); @@ -652,29 +710,30 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t if (Parse_Success != (result = ParseNode(sub, priv))) return result; /*/Iterate all connections. Node without any connection is also valid.*/ - if (!GetElementArray(sub->child, ALL_CONNECTIONS, &conType, &con)) - continue; - while(con) + if (GetElementArray(sub->child, ALL_CONNECTIONS, &conType, &con)) { - const char *socTypeStr; - MSocketType_t socType; - mxml_node_t *soc; - memset(&priv->conData, 0, sizeof(ConnectionData_t)); - if (Parse_Success != (result = ParseConnection(con, conType, priv))) - return result; - /*Iterate all sockets*/ - if(!GetElementArray(con->child, ALL_SOCKETS, &socTypeStr, &soc)) RETURN_ASSERT(Parse_XmlError); - while(soc) + while(con) { - if (!GetSocketType(socTypeStr, &socType)) RETURN_ASSERT(Parse_XmlError); - if (Parse_Success != (result = ParseSocket(soc, (0 == priv->conData.sockCnt), socType, &priv->conData.jobList, priv))) + const char *socTypeStr; + MSocketType_t socType; + mxml_node_t *soc; + memset(&priv->conData, 0, sizeof(ConnectionData_t)); + if (Parse_Success != (result = ParseConnection(con, conType, priv))) return result; - ++priv->conData.sockCnt; - if(!GetElementArray(soc, ALL_SOCKETS, &socTypeStr, &soc)) + /*Iterate all sockets*/ + if(!GetElementArray(con->child, ALL_SOCKETS, &socTypeStr, &soc)) RETURN_ASSERT(Parse_XmlError); + while(soc) + { + if (!GetSocketType(socTypeStr, &socType)) RETURN_ASSERT(Parse_XmlError); + if (Parse_Success != (result = ParseSocket(soc, (0 == priv->conData.sockCnt), socType, &priv->conData.jobList, priv))) + return result; + ++priv->conData.sockCnt; + if(!GetElementArray(soc, ALL_SOCKETS, &socTypeStr, &soc)) + break; + } + if(!GetElementArray(con, ALL_CONNECTIONS, &conType, &con)) break; } - if(!GetElementArray(con, ALL_CONNECTIONS, &conType, &con)) - break; } ++ucs->nodSize; if (!GetElement(sub, NODE, false, &sub, false)) @@ -685,10 +744,12 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t result = ParseRoutes(ucs, priv); if (Parse_MemoryError == result) RETURN_ASSERT(Parse_MemoryError) else if (Parse_XmlError == result) RETURN_ASSERT(Parse_XmlError); - + /*Iterate all scripts. No scripts at all is allowed*/ if(GetElement(tree, SCRIPT, true, &sub, false)) { + bool found = true; + struct UcsXmlScript *scrlist = priv->pScrLst; while(sub) { result = ParseScript(sub, priv); @@ -697,6 +758,18 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t if(!GetElement(sub, SCRIPT, false, &sub, false)) break; } + /* Check if all scripts where referenced */ + while(NULL != scrlist) + { + if (!scrlist->inUse) + { + UcsXml_CB_OnError("Script not defined:'%s', used by node=0x%X", 1, scrlist->scriptName, scrlist->node->signature_ptr->node_address); + found = false; + } + scrlist = scrlist->next; + } + if (!found) + RETURN_ASSERT(Parse_XmlError); } return result; } @@ -758,7 +831,7 @@ static ParseResult_t ParseNode(mxml_node_t *node, PrivateData_t *priv) UcsXml_CB_OnError("Unknown Port:'%s'", 1, txt); RETURN_ASSERT(Parse_XmlError); } - if(!GetElementArray(port, ALL_SOCKETS, &txt, &port)) + if(!GetElementArray(port, ALL_PORTS, &txt, &port)) break; } } @@ -766,7 +839,7 @@ static ParseResult_t ParseNode(mxml_node_t *node, PrivateData_t *priv) } static ParseResult_t ParseConnection(mxml_node_t * node, const char *conType, PrivateData_t *priv) -{ +{ assert(NULL != node && NULL != priv); if (NULL == conType) RETURN_ASSERT(Parse_XmlError); if (!GetDataType(conType, &priv->conData.dataType)) RETURN_ASSERT(Parse_XmlError); @@ -844,7 +917,7 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t /* If there is an combiner stored, add it now into job list (right before MOST socket) */ if (priv->conData.combiner) if (!AddJob(jobList, priv->conData.combiner, &priv->objList)) RETURN_ASSERT(Parse_XmlError); - + p.list = &priv->objList; p.isSource = isSource; p.dataType = priv->conData.dataType; @@ -880,15 +953,11 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t { p.usbPort = priv->nodeData.usbPort; } else { - if (!GetUsbPortDefaultCreated(&p.usbPort, &priv->objList)) + if (!GetUsbPortDefaultCreated(&p.usbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); priv->nodeData.usbPort = (Ucs_Xrm_UsbPort_t *)p.usbPort; } - if (!priv->nodeData.usbPortAddedToJobList) - { - priv->nodeData.usbPortAddedToJobList = true; - if(!AddJob(jobList, p.usbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); - } + if(!AddJob(jobList, p.usbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); if (!GetString(soc, ENDPOINT_ADDRESS, &p.endpointAddress, true)) RETURN_ASSERT(Parse_XmlError); if (!GetString(soc, FRAMES_PER_TRANSACTION, &p.framesPerTrans, true)) RETURN_ASSERT(Parse_XmlError); if (!GetUsbSocket((Ucs_Xrm_UsbSocket_t **)targetSock, &p)) RETURN_ASSERT(Parse_XmlError); @@ -905,15 +974,11 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t { p.mlbPort = priv->nodeData.mlbPort; } else { - if (!GetMlbPortDefaultCreated(&p.mlbPort, &priv->objList)) + if (!GetMlbPortDefaultCreated(&p.mlbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); priv->nodeData.mlbPort = (Ucs_Xrm_MlbPort_t *)p.mlbPort; } - if (!priv->nodeData.mlbPortAddedToJobList) - { - priv->nodeData.mlbPortAddedToJobList = true; - if (!AddJob(jobList, p.mlbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); - } + if (!AddJob(jobList, p.mlbPort, &priv->objList)) RETURN_ASSERT(Parse_XmlError); if (!GetUInt16(soc, BANDWIDTH, &p.bandwidth, true)) RETURN_ASSERT(Parse_XmlError); if (!GetString(soc, CHANNEL_ADDRESS, &p.channelAddress, true)) RETURN_ASSERT(Parse_XmlError); if (!GetMlbSocket((Ucs_Xrm_MlbSocket_t **)targetSock, &p)) RETURN_ASSERT(Parse_XmlError); @@ -928,12 +993,8 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t p.dataType = priv->conData.dataType; p.streamPortA = priv->nodeData.strmPortA; p.streamPortB = priv->nodeData.strmPortB; - if (!priv->nodeData.strmPortsAddedToJobList) - { - priv->nodeData.strmPortsAddedToJobList = true; - if (!AddJob(jobList, p.streamPortA, &priv->objList)) RETURN_ASSERT(Parse_XmlError); - if (!AddJob(jobList, p.streamPortB, &priv->objList)) RETURN_ASSERT(Parse_XmlError); - } + if (!AddJob(jobList, p.streamPortA, &priv->objList)) RETURN_ASSERT(Parse_XmlError); + if (!AddJob(jobList, p.streamPortB, &priv->objList)) RETURN_ASSERT(Parse_XmlError); if (!GetUInt16(soc, BANDWIDTH, &p.bandwidth, true)) RETURN_ASSERT(Parse_XmlError); if (!GetString(soc, STRM_PIN, &p.streamPin, true)) RETURN_ASSERT(Parse_XmlError); if (!GetStrmSocket((Ucs_Xrm_StrmSocket_t **)targetSock, &p)) RETURN_ASSERT(Parse_XmlError); @@ -951,7 +1012,7 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t } p.list = &priv->objList; if (!GetUInt16(soc, BYTES_PER_FRAME, &p.bytesPerFrame, true)) RETURN_ASSERT(Parse_XmlError); - /* Current input socket will be stored inside splitter + /* Current input socket will be stored inside splitter * and splitter will become the new input socket */ if (!(p.inSoc = priv->conData.inSocket)) RETURN_ASSERT(Parse_XmlError); if (!GetSplitter((Ucs_Xrm_Splitter_t **)&priv->conData.inSocket, &p)) RETURN_ASSERT(Parse_XmlError); @@ -959,7 +1020,7 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t if (!GetElement(soc->child, MOST_SOCKET, false, &mostSoc, true)) RETURN_ASSERT(Parse_XmlError); priv->conData.syncOffsetNeeded = true; - + while(mostSoc) { struct UcsXmlJobList *jobListCopy = DeepCopyJobList(*jobList, &priv->objList); @@ -989,12 +1050,12 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t RETURN_ASSERT(Parse_XmlError); } /*Handle Pending Combiner Tasks*/ - if (NULL != priv->conData.outSocket && NULL != priv->conData.combiner && + if (NULL != priv->conData.outSocket && NULL != priv->conData.combiner && NULL != priv->conData.pendingCombinerMostSockets) { mxml_node_t *tmp = priv->conData.pendingCombinerMostSockets; priv->conData.pendingCombinerMostSockets = NULL; - /* Current output socket will be stored inside combiner + /* Current output socket will be stored inside combiner * and combiner will become the new output socket */ priv->conData.combiner->port_socket_obj_ptr = priv->conData.outSocket; priv->conData.outSocket = priv->conData.combiner; @@ -1009,6 +1070,7 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t /*Connect in and out socket once they are created*/ if (priv->conData.inSocket && priv->conData.outSocket) { + bool mostIsInput; bool mostIsOutput; Ucs_Rm_EndPoint_t *ep; struct UcsXmlRoute *route; @@ -1045,7 +1107,13 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t ep = MCalloc(&priv->objList, 1, sizeof(Ucs_Rm_EndPoint_t)); if (NULL == ep) RETURN_ASSERT(Parse_MemoryError); + mostIsInput = (UCS_XRM_RC_TYPE_MOST_SOCKET == *((Ucs_Xrm_ResourceType_t *)priv->conData.inSocket)); mostIsOutput = (UCS_XRM_RC_TYPE_MOST_SOCKET == *((Ucs_Xrm_ResourceType_t *)priv->conData.outSocket)); + if (!mostIsInput && !mostIsOutput) + { + UcsXml_CB_OnError("At least one MOST socket required per connection", 0); + RETURN_ASSERT(Parse_XmlError); + } ep->endpoint_type = mostIsOutput ? UCS_RM_EP_SOURCE : UCS_RM_EP_SINK; ep->jobs_list_ptr = GetJobList(*jobList, &priv->objList); if(NULL == ep->jobs_list_ptr) RETURN_ASSERT(Parse_MemoryError); @@ -1116,7 +1184,7 @@ static ParseResult_t ParseScript(mxml_node_t *scr, PrivateData_t *priv) if (Parse_Success != result) return result; } else { UcsXml_CB_OnError("Unknown script action:'%s'", 1, txt); - /*RETURN_ASSERT(Parse_XmlError);*/ + RETURN_ASSERT(Parse_XmlError); } if (!GetElementArray(act, ALL_SCRIPTS, &txt, &act)) break; @@ -1131,6 +1199,7 @@ static ParseResult_t ParseScript(mxml_node_t *scr, PrivateData_t *priv) Ucs_Rm_Node_t *node = scrlist->node; node->script_list_ptr = script; node->script_list_size = actCnt; + scrlist->inUse = true; found = true; } scrlist = scrlist->next; @@ -1172,13 +1241,12 @@ static ParseResult_t ParseScriptMsgSend(mxml_node_t *act, Ucs_Ns_Script_t *scr, if (!GetUInt8(act, OP_TYPE_REQUEST, &req->OpCode, true)) RETURN_ASSERT(Parse_XmlError); - if (!GetUInt8(act, OP_TYPE_RESPONSE, &res->OpCode, true)) - RETURN_ASSERT(Parse_XmlError); - res->FBlockId = req->FBlockId; res->FunktId = req->FunktId; - GetPayload(act, PAYLOAD_RES_HEX, &res->DataPtr, &res->DataLen, 0, &priv->objList, false); - + + if (GetUInt8(act, OP_TYPE_RESPONSE, &res->OpCode, false)) + GetPayload(act, PAYLOAD_RES_HEX, &res->DataPtr, &res->DataLen, 0, &priv->objList, false); + if (!GetPayload(act, PAYLOAD_REQ_HEX, &req->DataPtr, &req->DataLen, 0, &priv->objList, true)) RETURN_ASSERT(Parse_XmlError); if (0 == req->DataLen || NULL == req->DataPtr) @@ -1231,7 +1299,7 @@ static ParseResult_t ParseScriptGpioPinMode(mxml_node_t *act, Ucs_Ns_Script_t *s req->FunktId = res->FunktId = 0x703; req->OpCode = 0x2; res->OpCode = 0xC; - if (!GetPayload(act, PIN_CONFIG, &payload, &payloadLen, + if (!GetPayload(act, PIN_CONFIG, &payload, &payloadLen, PORT_HANDLE_OFFSET, /* First two bytes are reserved for port handle */ &priv->objList, true)) RETURN_ASSERT(Parse_XmlError); payload[0] = 0x1D; @@ -1292,7 +1360,11 @@ static ParseResult_t ParseScriptPortCreate(mxml_node_t *act, Ucs_Ns_Script_t *sc speed = 0; else if (0 == strcmp(txt, I2C_SPEED_FAST)) speed = 1; - else RETURN_ASSERT(Parse_XmlError); + else + { + UcsXml_CB_OnError("Invalid I2C speed:'%s'", 1, txt); + RETURN_ASSERT(Parse_XmlError); + } req = scr->send_cmd; res = scr->exp_result; req->InstId = res->InstId = 1; @@ -1332,6 +1404,11 @@ static ParseResult_t ParseScriptPortWrite(mxml_node_t *act, Ucs_Ns_Script_t *scr mode = 1; else if (0 == strcmp(txt, I2C_WRITE_MODE_BURST)) mode = 2; + else + { + UcsXml_CB_OnError("Invalid I2C mode:'%s'", 1, txt); + RETURN_ASSERT(Parse_XmlError); + } } else { mode = 0; } @@ -1448,7 +1525,7 @@ static ParseResult_t ParseRoutes(UcsXmlVal_t *ucs, PrivateData_t *priv) return Parse_Success; /*Its okay to have no routes at all (e.g. MEP traffic only)*/ ucs->pRoutes = MCalloc(&priv->objList, routeAmount, sizeof(Ucs_Rm_Route_t)); if (NULL == ucs->pRoutes) RETURN_ASSERT(Parse_MemoryError); - + /*Second: Fill allocated structure now*/ sourceRoute = priv->pRtLst; while (NULL != sourceRoute) @@ -1473,8 +1550,12 @@ static ParseResult_t ParseRoutes(UcsXmlVal_t *ucs, PrivateData_t *priv) } sourceRoute = sourceRoute->next; } - assert(routeAmount == ucs->routesSize); - + if (routeAmount != ucs->routesSize) + { + UcsXml_CB_OnError("At least one sink (num=%d) is not connected, because of wrong Route name!", 2, (routeAmount - ucs->routesSize)); + RETURN_ASSERT(Parse_XmlError); + } + #ifdef DEBUG /* Third perform checks when running in debug mode*/ {