Improve general error handling
authorThorsten Kummermehr <thorsten.kummermehr@k2l.de>
Tue, 7 Nov 2017 15:12:54 +0000 (16:12 +0100)
committerThorsten Kummermehr <thorsten.kummermehr@k2l.de>
Tue, 7 Nov 2017 15:12:54 +0000 (16:12 +0100)
ucs2-interface/ucs-xml/UcsXml.c
ucs2-interface/ucs-xml/UcsXml_Private.c

index fcbe5f5..c86746f 100644 (file)
@@ -38,7 +38,7 @@
 /************************************************************************/\r
 \r
 #define COMPILETIME_CHECK(cond)  (void)sizeof(int[2 * !!(cond) - 1])\r
-#define RETURN_ASSERT(result) { assert(false); return result; }\r
+#define RETURN_ASSERT(result) { UcsXml_CB_OnError("Assertion in file=%s, line=%d", 2, __FILE__, __LINE__); return result; }\r
 #define MISC_HB(value)      ((uint8_t)((uint16_t)(value) >> 8))\r
 #define MISC_LB(value)      ((uint8_t)((uint16_t)(value) & (uint16_t)0xFF))\r
 \r
@@ -54,6 +54,7 @@ struct UcsXmlRoute
 \r
 struct UcsXmlScript\r
 {\r
+    bool inUse;\r
     char scriptName[32];\r
     Ucs_Rm_Node_t *node;\r
     struct UcsXmlScript *next;\r
@@ -278,9 +279,9 @@ UcsXmlVal_t *UcsXml_Parse(const char *xmlString)
         return val;\r
 ERROR:\r
     if (Parse_MemoryError == result)\r
-        UcsXml_CB_OnError("XML error, aborting..", 0);\r
+        UcsXml_CB_OnError("XML memory error, aborting..", 0);\r
     else\r
-        UcsXml_CB_OnError("Allocation error, aborting..", 0);\r
+        UcsXml_CB_OnError("XML parsing error, aborting..", 0);\r
     assert(false);\r
     if (!tree)\r
         mxmlDelete(tree);\r
@@ -687,6 +688,8 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t
     /*Iterate all scripts. No scripts at all is allowed*/\r
     if(GetElement(tree, SCRIPT, true, &sub, false))\r
     {\r
+        bool found = true;\r
+        struct UcsXmlScript *scrlist = priv->pScrLst;\r
         while(sub)\r
         {\r
             result = ParseScript(sub, priv);\r
@@ -695,6 +698,18 @@ static ParseResult_t ParseAll(mxml_node_t *tree, UcsXmlVal_t *ucs, PrivateData_t
             if(!GetElement(sub, SCRIPT, false, &sub, false))\r
                 break;\r
         }\r
+        /* Check if all scripts where referenced */\r
+        while(NULL != scrlist)\r
+        {\r
+            if (!scrlist->inUse)\r
+            {\r
+                UcsXml_CB_OnError("Script not defined:'%s', used by node=0x%X", 1, scrlist->scriptName, scrlist->node->signature_ptr->node_address);\r
+                found = false;\r
+            }\r
+            scrlist = scrlist->next;\r
+        }\r
+        if (!found)\r
+            RETURN_ASSERT(Parse_XmlError);\r
     }\r
     return result;\r
 }\r
@@ -995,6 +1010,7 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t
     /*Connect in and out socket once they are created*/\r
     if (priv->conData.inSocket && priv->conData.outSocket)\r
     {\r
+        bool mostIsInput;\r
         bool mostIsOutput;\r
         Ucs_Rm_EndPoint_t *ep;\r
         struct UcsXmlRoute *route;\r
@@ -1031,7 +1047,13 @@ static ParseResult_t ParseSocket(mxml_node_t *soc, bool isSource, MSocketType_t
         ep = MCalloc(&priv->objList, 1, sizeof(Ucs_Rm_EndPoint_t));\r
         if (NULL == ep) RETURN_ASSERT(Parse_MemoryError);\r
 \r
+        mostIsInput = (UCS_XRM_RC_TYPE_MOST_SOCKET == *((Ucs_Xrm_ResourceType_t *)priv->conData.inSocket));\r
         mostIsOutput = (UCS_XRM_RC_TYPE_MOST_SOCKET == *((Ucs_Xrm_ResourceType_t *)priv->conData.outSocket));\r
+        if (!mostIsInput && !mostIsOutput)\r
+        {\r
+            UcsXml_CB_OnError("At least one MOST socket required per connection", 0);\r
+            RETURN_ASSERT(Parse_XmlError);\r
+        }\r
         ep->endpoint_type = mostIsOutput ? UCS_RM_EP_SOURCE : UCS_RM_EP_SINK;\r
         ep->jobs_list_ptr = GetJobList(*jobList, &priv->objList);\r
         if(NULL == ep->jobs_list_ptr) RETURN_ASSERT(Parse_MemoryError);\r
@@ -1102,7 +1124,7 @@ static ParseResult_t ParseScript(mxml_node_t *scr, PrivateData_t *priv)
             if (Parse_Success != result) return result;\r
         } else {\r
             UcsXml_CB_OnError("Unknown script action:'%s'", 1, txt);\r
-            /*RETURN_ASSERT(Parse_XmlError);*/\r
+            RETURN_ASSERT(Parse_XmlError);\r
         }\r
         if (!GetElementArray(act, ALL_SCRIPTS, &txt, &act))\r
             break;\r
@@ -1117,6 +1139,7 @@ static ParseResult_t ParseScript(mxml_node_t *scr, PrivateData_t *priv)
             Ucs_Rm_Node_t *node = scrlist->node;\r
             node->script_list_ptr = script;\r
             node->script_list_size = actCnt;\r
+            scrlist->inUse = true;\r
             found = true;\r
         }\r
         scrlist = scrlist->next;\r
@@ -1277,7 +1300,11 @@ static ParseResult_t ParseScriptPortCreate(mxml_node_t *act, Ucs_Ns_Script_t *sc
         speed = 0;\r
     else if (0 == strcmp(txt, I2C_SPEED_FAST))\r
         speed = 1;\r
-    else RETURN_ASSERT(Parse_XmlError);\r
+    else\r
+    {\r
+        UcsXml_CB_OnError("Invalid I2C speed:'%s'", 1, txt);\r
+        RETURN_ASSERT(Parse_XmlError);\r
+    }\r
     req = scr->send_cmd;\r
     res = scr->exp_result;\r
     req->InstId = res->InstId = 1;\r
@@ -1317,6 +1344,11 @@ static ParseResult_t ParseScriptPortWrite(mxml_node_t *act, Ucs_Ns_Script_t *scr
             mode = 1;\r
         else if (0 == strcmp(txt, I2C_WRITE_MODE_BURST))\r
             mode = 2;\r
+        else\r
+        {\r
+            UcsXml_CB_OnError("Invalid I2C mode:'%s'", 1, txt);\r
+            RETURN_ASSERT(Parse_XmlError);\r
+        }\r
     } else {\r
         mode = 0;\r
     }\r
@@ -1458,7 +1490,11 @@ static ParseResult_t ParseRoutes(UcsXmlVal_t *ucs, PrivateData_t *priv)
         }\r
         sourceRoute = sourceRoute->next;\r
     }\r
-    assert(routeAmount == ucs->routesSize);\r
+    if (routeAmount != ucs->routesSize)\r
+    {\r
+        UcsXml_CB_OnError("At least one sink (num=%d) is not connected, because of wrong Route name!", 2, (routeAmount - ucs->routesSize));\r
+        RETURN_ASSERT(Parse_XmlError);\r
+    }\r
 \r
 #ifdef DEBUG\r
     /* Third perform checks when running in debug mode*/\r
index f914ccb..743598f 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <assert.h>\r
+#include "UcsXml.h"\r
 #include "UcsXml_Private.h"\r
 \r
 static const char* USB_PHY_STANDARD =       "Standard";\r
@@ -69,8 +70,8 @@ static const char* VAL_TRUE =               "true";
 static const char* VAL_FALSE =              "false";\r
  */\r
 \r
-#define ASSERT_FALSE() { assert(false); return false; }\r
-#define CHECK_POINTER(PTR) if (NULL == PTR) { ASSERT_FALSE(); }\r
+#define ASSERT_FALSE(func, par) { UcsXml_CB_OnError("Parameter error in attribute=%s value=%s, file=%s, line=%d", 4, func, par,  __FILE__, __LINE__); return false; }\r
+#define CHECK_POINTER(PTR) if (NULL == PTR) { ASSERT_FALSE(PTR, "NULL pointer"); }\r
 \r
 static int32_t Str2Int(const char *val)\r
 {\r
@@ -149,7 +150,7 @@ bool GetMostSocket(Ucs_Xrm_MostSocket_t **mostSoc, struct MostSocketParameters *
         soc->data_type = UCS_MOST_SCKT_DISC_FRAME_PHASE;\r
         break;\r
     default:\r
-        ASSERT_FALSE();\r
+        ASSERT_FALSE("GetMostSocket->dataType", "");\r
     }\r
     return true;\r
 }\r
@@ -176,7 +177,7 @@ bool GetUsbPort(Ucs_Xrm_UsbPort_t **usbPort, struct UsbPortParameters *param)
         port->physical_layer = UCS_USB_PHY_LAYER_STANDARD;\r
     else if (0 == strcmp(USB_PHY_HSIC, param->physicalLayer))\r
         port->physical_layer = UCS_USB_PHY_LAYER_HSCI;\r
-    else ASSERT_FALSE();\r
+    else ASSERT_FALSE("GetUsbPort->physical_layer", param->physicalLayer);\r
     return true;\r
 }\r
 \r
@@ -220,7 +221,7 @@ bool GetUsbSocket(Ucs_Xrm_UsbSocket_t **usbSoc, struct UsbSocketParameters *para
         soc->data_type = UCS_USB_SCKT_IPC_PACKET;\r
         break;\r
     default:\r
-        ASSERT_FALSE();\r
+        ASSERT_FALSE("GetUsbSocket->dataType", "");\r
     }\r
     soc->end_point_addr = (uint8_t)Str2Int(param->endpointAddress);\r
     soc->frames_per_transfer = (uint16_t)Str2Int(param->framesPerTrans);\r
@@ -256,7 +257,7 @@ bool GetMlbPort(Ucs_Xrm_MlbPort_t **mlbPort, struct MlbPortParameters *param)
         port->clock_config = UCS_MLB_CLK_CFG_6144_FS;\r
     else if (0 == strcmp(param->clockConfig, CLOCK_8192FS))\r
         port->clock_config = UCS_MLB_CLK_CFG_8192_FS;\r
-    else ASSERT_FALSE();\r
+    else ASSERT_FALSE("GetMlbPort->clockConfig", param->clockConfig);\r
     return true;\r
 }\r
 \r
@@ -306,7 +307,7 @@ bool GetMlbSocket(Ucs_Xrm_MlbSocket_t **mlbSoc, struct MlbSocketParameters *para
         soc->data_type = UCS_MLB_SCKT_IPC_PACKET;\r
         break;\r
     default:\r
-        ASSERT_FALSE();\r
+        ASSERT_FALSE("GetMlbSocket->dataType", "");\r
     }\r
     soc->channel_address = (uint16_t)Str2Int(param->channelAddress);\r
     soc->mlb_port_obj_ptr = param->mlbPort;\r
@@ -343,7 +344,7 @@ bool GetStrmPort(Ucs_Xrm_StrmPort_t **strmPort, struct StrmPortParameters *param
             port->clock_config = UCS_STREAM_PORT_CLK_CFG_512FS;\r
         else if (0 == strcmp(param->clockConfig, CLOCK_WILDCARD))\r
             port->clock_config = UCS_STREAM_PORT_CLK_CFG_WILD;\r
-        else ASSERT_FALSE();\r
+        else ASSERT_FALSE("GetStrmPort->clockConfig", param->clockConfig);\r
     } else {\r
         port->clock_config = UCS_STREAM_PORT_CLK_CFG_WILD;\r
     }\r
@@ -358,7 +359,7 @@ bool GetStrmPort(Ucs_Xrm_StrmPort_t **strmPort, struct StrmPortParameters *param
         port->data_alignment = UCS_STREAM_PORT_ALGN_RIGHT24BIT;\r
     else if (0 == strcmp(param->dataAlignment, STRM_ALIGN_SEQUENTIAL))\r
         port->data_alignment = UCS_STREAM_PORT_ALGN_SEQ;\r
-    else ASSERT_FALSE();\r
+    else ASSERT_FALSE("GetStrmPort->dataAlignment", param->dataAlignment);\r
     return true;\r
 }\r
 \r
@@ -382,7 +383,7 @@ bool GetStrmSocket(Ucs_Xrm_StrmSocket_t **strmSoc, struct StrmSocketParameters *
         soc->data_type = UCS_STREAM_PORT_SCKT_SYNC_DATA;\r
         break;\r
     default:\r
-        ASSERT_FALSE();\r
+        ASSERT_FALSE("GetStrmSocket->dataType", "");\r
     }\r
     soc->bandwidth = param->bandwidth;\r
     if (0 == strcmp(param->streamPin, I2S_PIN_SRXA0))\r
@@ -409,7 +410,7 @@ bool GetStrmSocket(Ucs_Xrm_StrmSocket_t **strmSoc, struct StrmSocketParameters *
         soc->stream_port_obj_ptr = param->streamPortB;\r
         return true;\r
     }\r
-    else ASSERT_FALSE();\r
+    else ASSERT_FALSE("GetStrmSocket->streamPin", param->streamPin);\r
     return true;\r
 }\r
 \r
@@ -462,7 +463,7 @@ bool GetSyncCon(Ucs_Xrm_SyncCon_t **syncCon, struct SyncConParameters *param)
         con->mute_mode = UCS_SYNC_MUTE_MODE_NO_MUTING;\r
     else if (0 == strcmp(param->muteMode, MUTE_SIGNAL))\r
         con->mute_mode = UCS_SYNC_MUTE_MODE_MUTE_SIGNAL;\r
-    else ASSERT_FALSE();\r
+    else ASSERT_FALSE("GetSyncCon->mute_mode", param->muteMode);\r
     if (param->optional_offset)\r
         con->offset = (uint16_t)Str2Int(param->optional_offset);\r
     else\r
@@ -501,7 +502,7 @@ bool GetAvpCon(Ucs_Xrm_AvpCon_t **avpCon, struct AvpConParameters *param)
             con->isoc_packet_size = UCS_ISOC_PCKT_SIZE_206;\r
             break;\r
         default:\r
-            ASSERT_FALSE();\r
+            ASSERT_FALSE("GetAvpCon->isoc_packet_size", "");\r
         }\r
     } else {\r
         con->isoc_packet_size = UCS_ISOC_PCKT_SIZE_188;\r