]> rtime.felk.cvut.cz Git - arc.git/blobdiff - communication/CanIf/CanIf.c
LED Blinker example made running for the RPP Board.
[arc.git] / communication / CanIf / CanIf.c
index 74ff8de573b9c9eb65704769027fd546895fc1ff..7f27d79299b517ec977af4baf2f8abea6c088db7 100644 (file)
@@ -25,7 +25,7 @@
 \r
 #include "Can.h"\r
 #include "CanIf_Cbk.h"\r
-#include "string.h"\r
+#include <string.h>\r
 \r
 #include "debug.h"\r
 #include "PduR.h"\r
 #include "CanTp_Cbk.h"\r
 #endif\r
 \r
+#if defined(USE_J1939TP)\r
+#include "J1939Tp_Cbk.h"\r
+#endif\r
+\r
 #if defined(USE_CANNM)\r
 #include "CanNm.h"\r
 #endif\r
@@ -72,7 +76,7 @@
 \r
 // Helper to get the Can Controller refered to by a CanIf Channel\r
 #define ARC_GET_CHANNEL_CONTROLLER(_channel) \\r
-       CanIf_ConfigPtr->Arc_ChannelToControllerMap[channel]\r
+       CanIf_ConfigPtr->Arc_ChannelToControllerMap[_channel]\r
 \r
 /* Global configure */\r
 static const CanIf_ConfigType *CanIf_ConfigPtr;\r
@@ -109,14 +113,15 @@ static CanIf_Arc_ChannelIdType CanIf_Arc_FindHrhChannel( Can_Arc_HRHType hrh )
     do\r
     {\r
       hrhConfig++;\r
-      if (hrhConfig->CanIfHrhIdSymRef == hrh)\r
+      if (hrhConfig->CanIfHrhIdSymRef == hrh){\r
         return hrhConfig->CanIfCanControllerHrhIdRef;\r
+      }\r
     } while(!hrhConfig->CanIf_Arc_EOL);\r
   } while(!hohConfig->CanIf_Arc_EOL);\r
 \r
   DET_REPORTERROR(MODULE_ID_CANIF, 0, CANIF_RXINDICATION_ID, CANIF_E_PARAM_HRH);\r
 \r
-  return -1;\r
+  return (CanIf_Arc_ChannelIdType) -1;\r
 }\r
 \r
 // Global config\r
@@ -150,7 +155,7 @@ void CanIf_Init(const CanIf_ConfigType *ConfigPtr)
 void CanIf_InitController(uint8 Controller, uint8 ConfigurationIndex)\r
 {\r
   // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
   CanIf_ControllerModeType mode;\r
 \r
   VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_INIT_CONTROLLER_ID, CANIF_E_UNINIT );\r
@@ -199,7 +204,7 @@ void CanIf_InitController(uint8 Controller, uint8 ConfigurationIndex)
 \r
 void CanIf_PreInit_InitController(uint8 Controller, uint8 ConfigurationIndex){\r
        // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-       CanIf_Arc_ChannelIdType channel = Controller;\r
+       CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
 \r
        VALIDATE_NO_RV(channel < CANIF_CHANNEL_CNT, CANIF_INIT_ID, CANIF_E_PARAM_CONTROLLER);\r
        VALIDATE_NO_RV(ConfigurationIndex < CANIF_CHANNEL_CONFIGURATION_CNT, CANIF_INIT_ID, CANIF_E_PARAM_POINTER);\r
@@ -221,7 +226,7 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
     CanIf_ControllerModeType ControllerMode)\r
 {\r
   // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
 \r
 \r
   CanIf_ControllerModeType oldMode;\r
@@ -244,8 +249,9 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
     switch (oldMode)\r
     {\r
       case CANIF_CS_SLEEP:\r
-        if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)\r
+        if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK){\r
           return E_NOT_OK;\r
+        }\r
         CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;\r
         break;\r
       default:\r
@@ -254,8 +260,9 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
     }\r
 \r
     CanIf_SetPduMode(channel, CANIF_SET_ONLINE);\r
-    if (Can_SetControllerMode(canControllerId, CAN_T_START) == CAN_NOT_OK)\r
+    if (Can_SetControllerMode(canControllerId, CAN_T_START) == CAN_NOT_OK){\r
       return E_NOT_OK;\r
+    }\r
     CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STARTED;\r
   }\r
   break;\r
@@ -264,8 +271,9 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
   {\r
     switch (oldMode) {\r
       case CANIF_CS_STARTED:\r
-        if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)\r
+        if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK){\r
           return E_NOT_OK;\r
+        }\r
         CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;\r
         break;\r
       default:\r
@@ -273,8 +281,9 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
         break;\r
     }\r
 \r
-    if (Can_SetControllerMode(canControllerId, CAN_T_SLEEP) == CAN_NOT_OK)\r
+    if (Can_SetControllerMode(canControllerId, CAN_T_SLEEP) == CAN_NOT_OK){\r
       return E_NOT_OK;\r
+    }\r
     CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_SLEEP;\r
   }\r
 \r
@@ -283,8 +292,9 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
     switch (oldMode)\r
     {\r
       case CANIF_CS_SLEEP:\r
-        if (Can_SetControllerMode(canControllerId, CAN_T_WAKEUP) == CAN_NOT_OK)\r
+        if (Can_SetControllerMode(canControllerId, CAN_T_WAKEUP) == CAN_NOT_OK){\r
           return E_NOT_OK;\r
+        }\r
         break;\r
       default:\r
         // Just fall through for other cases\r
@@ -292,9 +302,11 @@ Std_ReturnType CanIf_SetControllerMode(uint8 Controller,
     }\r
 \r
     CanIf_SetPduMode(channel, CANIF_SET_OFFLINE);\r
-    if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK)\r
+    if (Can_SetControllerMode(canControllerId, CAN_T_STOP) == CAN_NOT_OK){\r
       return E_NOT_OK;\r
+    }\r
     CanIf_Global.channelData[channel].ControllerMode = CANIF_CS_STOPPED;\r
+    break;\r
   }\r
 \r
   case CANIF_CS_UNINIT:\r
@@ -310,7 +322,7 @@ Std_ReturnType CanIf_GetControllerMode(uint8 Controller,
     CanIf_ControllerModeType *ControllerModePtr)\r
 {\r
   // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
 \r
   VALIDATE(CanIf_Global.initRun, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_UNINIT );\r
   VALIDATE(channel < CANIF_CHANNEL_CNT, CANIF_GET_CONTROLLER_MODE_ID, CANIF_E_PARAM_CONTROLLER );\r
@@ -327,27 +339,84 @@ Std_ReturnType CanIf_GetControllerMode(uint8 Controller,
  *\r
  * @returns Ptr a TxPdu\r
  */\r
+#if ( CANIF_ARC_RUNTIME_PDU_CONFIGURATION == STD_ON )\r
+CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id)\r
+#else\r
 static const CanIf_TxPduConfigType * CanIf_FindTxPduEntry(PduIdType id)\r
+#endif\r
 {\r
        if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds) {\r
                return NULL;\r
        } else {\r
                return &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[id];\r
        }\r
-/*\r
-  for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)\r
-  {\r
-    if (entry->CanIfTxPduId == id)\r
-    {\r
-      return entry;\r
-    }\r
-    entry++;\r
-  }\r
-\r
-  return 0;\r
-  */\r
 }\r
 \r
+
+#if ( CANIF_ARC_RUNTIME_PDU_CONFIGURATION == STD_ON )\r
+CanIf_RxPduConfigType * CanIf_FindRxPduEntry(PduIdType id) {\r
+       if (id >= CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanRxPduIds) {\r
+               return NULL;\r
+       } else {\r
+               return &CanIf_ConfigPtr->InitConfig->CanIfRxPduConfigPtr[id];\r
+       }\r
+}\r
+
+const CanIf_HrhConfigType* CanIf_Arc_GetReceiveHandler(CanIf_Arc_ChannelIdType Channel) {
+  const CanIf_InitHohConfigType *hohConfig;
+  const CanIf_HrhConfigType *hrhConfig;
+
+  // foreach(hoh){ foreach(hrh in hoh) {} }
+  hohConfig = CanIf_ConfigPtr->InitConfig->CanIfHohConfigPtr;
+  hohConfig--;
+  do
+  {
+       hohConfig++;
+
+       hrhConfig = hohConfig->CanIfHrhConfig;
+    hrhConfig--;
+    do
+    {
+      hrhConfig++;
+      if (hrhConfig->CanIfCanControllerHrhIdRef == Channel)
+        return hrhConfig;
+       } while(!hrhConfig->CanIf_Arc_EOL);
+
+  } while(!hohConfig->CanIf_Arc_EOL);
+
+  DET_REPORTERROR(MODULE_ID_CANIF, 0, 0xFF, CANIF_E_PARAM_HRH);
+
+  return NULL;
+}
+
+const CanIf_HthConfigType* CanIf_Arc_GetTransmitHandler(CanIf_Arc_ChannelIdType Channel) {
+  const CanIf_InitHohConfigType *hohConfig;
+  const CanIf_HthConfigType *hthConfig;
+
+  // foreach(hoh){ foreach(hrh in hoh) {} }
+  hohConfig = CanIf_ConfigPtr->InitConfig->CanIfHohConfigPtr;
+  hohConfig--;
+  do
+  {
+       hohConfig++;
+
+       hthConfig = hohConfig->CanIfHthConfig;
+       hthConfig--;
+    do
+    {
+       hthConfig++;
+      if (hthConfig->CanIfCanControllerIdRef == Channel)
+        return hthConfig;
+       } while(!hthConfig->CanIf_Arc_EOL);
+
+  } while(!hohConfig->CanIf_Arc_EOL);
+
+  DET_REPORTERROR(MODULE_ID_CANIF, 0, 0xFF, CANIF_E_PARAM_HTH);
+
+  return NULL;
+}
+#endif
+
 //-------------------------------------------------------------------\r
 \r
 Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,\r
@@ -373,29 +442,34 @@ Std_ReturnType CanIf_Transmit(PduIdType CanTxPduId,
   CanIf_Arc_ChannelIdType channel = txEntry->CanIfCanTxPduHthRef->CanIfCanControllerIdRef;\r
 \r
   // Get and verify the controller mode\r
-  if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK)\r
+  if (CanIf_GetControllerMode(channel, &csMode) == E_NOT_OK){\r
     return E_NOT_OK;\r
+  }\r
 \r
-  if (csMode != CANIF_CS_STARTED)  // CANIF_161\r
+  if (csMode != CANIF_CS_STARTED){  // CANIF_161\r
     return E_NOT_OK;\r
+  }\r
 \r
   // Get and verify the PDU channel mode control\r
-  if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK)\r
+  if (CanIf_GetPduMode(channel, &pduMode) == E_NOT_OK){\r
     return E_NOT_OK;\r
+  }\r
 \r
-  if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE))\r
+  if ((pduMode != CANIF_GET_TX_ONLINE) && (pduMode != CANIF_GET_ONLINE)){\r
     return E_NOT_OK;\r
+  }\r
 \r
   canPdu.id = txEntry->CanIfCanTxPduIdCanId;\r
 \r
   canPdu.length = PduInfoPtr->SduLength;\r
   canPdu.sdu = PduInfoPtr->SduDataPtr;\r
-  canPdu.swPduHandle = CanTxPduId;\r
+  canPdu.swPduHandle = CanTxPduId;             // e.g. ARC_PDUR_CANIF\r
 \r
   Can_ReturnType rVal = Can_Write(txEntry->CanIfCanTxPduHthRef->CanIfHthIdSymRef, &canPdu);\r
 \r
-  if (rVal == CAN_NOT_OK)\r
+  if (rVal == CAN_NOT_OK){\r
     return E_NOT_OK;\r
+  }\r
 \r
   if (rVal == CAN_BUSY)  // CANIF 082, CANIF 161\r
   {\r
@@ -470,7 +544,7 @@ Std_ReturnType CanIf_SetPduMode(uint8 Controller,
     CanIf_ChannelSetModeType PduModeRequest)\r
 {\r
   // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
 \r
   VALIDATE( CanIf_Global.initRun, CANIF_SETPDUMODE_ID, CANIF_E_UNINIT );\r
   VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_SETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );\r
@@ -483,46 +557,50 @@ Std_ReturnType CanIf_SetPduMode(uint8 Controller,
     CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;\r
     break;\r
   case CANIF_SET_RX_OFFLINE:\r
-    if (oldMode == CANIF_GET_RX_ONLINE)\r
+    if (oldMode == CANIF_GET_RX_ONLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;\r
-    else if (oldMode == CANIF_GET_ONLINE)\r
+    } else if (oldMode == CANIF_GET_ONLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;\r
+    }\r
 \r
     // Other oldmodes don't care\r
     break;\r
   case CANIF_SET_RX_ONLINE:\r
-    if (oldMode == CANIF_GET_OFFLINE)\r
+    if (oldMode == CANIF_GET_OFFLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;\r
-    else if (oldMode == CANIF_GET_TX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_TX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;\r
+    }\r
 \r
     // Other oldmodes don't care\r
     break;\r
   case CANIF_SET_TX_OFFLINE:\r
-    if (oldMode == CANIF_GET_TX_ONLINE)\r
+    if (oldMode == CANIF_GET_TX_ONLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;\r
-    else if (oldMode == CANIF_GET_ONLINE)\r
+    } else if (oldMode == CANIF_GET_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_RX_ONLINE;\r
+    }\r
 \r
     // Other oldmodes don't care\r
     break;\r
   case CANIF_SET_TX_ONLINE:\r
-    if (oldMode == CANIF_GET_OFFLINE)\r
+    if (oldMode == CANIF_GET_OFFLINE){\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;\r
-    else if (oldMode == CANIF_GET_RX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_RX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_TX_ONLINE;\r
-    else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_ONLINE;\r
+    }\r
 \r
     // Other oldmodes don't care\r
     break;\r
@@ -531,14 +609,15 @@ Std_ReturnType CanIf_SetPduMode(uint8 Controller,
     break;\r
 \r
   case CANIF_SET_TX_OFFLINE_ACTIVE:\r
-    if (oldMode == CANIF_GET_OFFLINE)\r
+    if (oldMode == CANIF_GET_OFFLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;\r
-    else if (oldMode == CANIF_GET_RX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_RX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;\r
-    else if (oldMode == CANIF_GET_TX_ONLINE)\r
+    } else if (oldMode == CANIF_GET_TX_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE;\r
-    else if (oldMode == CANIF_GET_ONLINE)\r
+    } else if (oldMode == CANIF_GET_ONLINE) {\r
       CanIf_Global.channelData[channel].PduMode = CANIF_GET_OFFLINE_ACTIVE_RX_ONLINE;\r
+    }\r
 \r
     // Other oldmodes don't care\r
     break;\r
@@ -553,7 +632,7 @@ Std_ReturnType CanIf_GetPduMode(uint8 Controller,
     CanIf_ChannelGetModeType *PduModePtr)\r
 {\r
   // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = (CanIf_Arc_ChannelIdType) Controller;\r
 \r
   VALIDATE( CanIf_Global.initRun, CANIF_GETPDUMODE_ID, CANIF_E_UNINIT );\r
   VALIDATE( channel < CANIF_CHANNEL_CNT, CANIF_GETPDUMODE_ID, CANIF_E_PARAM_CONTROLLER );\r
@@ -563,11 +642,10 @@ Std_ReturnType CanIf_GetPduMode(uint8 Controller,
   return E_OK;\r
 }\r
 \r
-#if ( CANIF_SETDYNAMICTXID_API == STD_ON )\r
+#if ( CANIF_ARC_RUNTIME_PDU_CONFIGURATION == STD_ON )
 void CanIf_SetDynamicTxId(PduIdType CanTxPduId, Can_IdType CanId)\r
 {\r
-  const CanIf_TxPduConfigType *txEntry;\r
-  VALIDATE(FALSE, CANIF_SETDYNAMICTX_ID, CANIF_E_NOK_NOSUPPORT);\r
+  CanIf_TxPduConfigType *txEntry;\r
   VALIDATE_NO_RV(CanIf_Global.initRun, CANIF_SETDYNAMICTX_ID, CANIF_E_UNINIT );\r
 \r
   // Get the controller from L-PDU handle\r
@@ -587,8 +665,8 @@ void CanIf_SetDynamicTxId(PduIdType CanTxPduId, Can_IdType CanId)
   }\r
 \r
   // Check that this is an extended or standard id\r
-  if (((CanId & 0x80000000) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_29)) ||\r
-      (((CanId & 0x80000000) == 0) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_11)))\r
+  if (((CanId & U0x80000000) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_29)) ||\r
+      (((CanId & U0x80000000) == 0) && (txEntry->CanIfTxPduIdCanIdType == ARC_CAN_ID_TYPE_11)))\r
   {\r
     // Update the CanID\r
     //txEntry->CanIfCanTxPduIdCanId = CanId;  // TODO How do we fix this from a const pointer\r
@@ -670,13 +748,6 @@ void CanIf_TxConfirmation(PduIdType canTxPduId)
   const CanIf_TxPduConfigType* entry =\r
     &CanIf_ConfigPtr->InitConfig->CanIfTxPduConfigPtr[canTxPduId];\r
 \r
-  /* Find the CAN id in the TxPduList */\r
-  /*\r
-  for (uint16 i = 0; i < CanIf_ConfigPtr->InitConfig->CanIfNumberOfCanTXPduIds; i++)\r
-  {\r
-    if (entry->CanIfTxPduId == canTxPduId)\r
-    {\r
-    */\r
       if (entry->CanIfUserTxConfirmation != NULL)\r
       {\r
         CanIf_ChannelGetModeType mode;\r
@@ -688,14 +759,6 @@ void CanIf_TxConfirmation(PduIdType canTxPduId)
         }\r
       }\r
       return;\r
-      /*\r
-    }\r
-\r
-    entry++;\r
-  }\r
-  */\r
-  // Did not find the PDU, something is wrong\r
-\r
 }\r
 \r
 void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,\r
@@ -706,7 +769,7 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
 \r
   /* Check PDU mode before continue processing */\r
   CanIf_ChannelGetModeType mode;\r
-  CanIf_Arc_ChannelIdType channel = CanIf_Arc_FindHrhChannel(Hrh);\r
+  CanIf_Arc_ChannelIdType channel = CanIf_Arc_FindHrhChannel( (Can_Arc_HRHType) Hrh);\r
   if (channel == -1)  // Invalid HRH\r
   {\r
     return;\r
@@ -714,8 +777,8 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
 \r
   if (CanIf_GetPduMode(channel, &mode) == E_OK)\r
   {\r
-    if (mode == CANIF_GET_OFFLINE || mode == CANIF_GET_TX_ONLINE ||\r
-        mode == CANIF_GET_OFFLINE_ACTIVE)\r
+    if ( (mode == CANIF_GET_OFFLINE) || (mode == CANIF_GET_TX_ONLINE) ||\r
+        (mode == CANIF_GET_OFFLINE_ACTIVE) )\r
     {\r
       // Receiver path is disabled so just drop it\r
       return;\r
@@ -748,7 +811,7 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
             else\r
             {\r
               entry++;\r
-              continue; // Not a supported filter type, so just drop the frame\r
+              continue; // Go to next entry
             }\r
           }\r
           else\r
@@ -771,8 +834,13 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
       {\r
         case CANIF_USER_TYPE_CAN_SPECIAL:\r
         {\r
-            ((CanIf_FuncTypeCanSpecial) (entry->CanIfUserRxIndication))(entry->CanIfCanRxPduId,\r
-                                          CanSduPtr, CanDlc, CanId);\r
+          ( (CanIf_FuncTypeCanSpecial)(entry->CanIfUserRxIndication) )(
+            entry->CanIfCanRxPduHrhRef->CanIfCanControllerHrhIdRef,
+            entry->CanIfCanRxPduId,
+            CanSduPtr,
+            CanDlc,
+            CanId);
+
             return;\r
         }\r
         break;\r
@@ -787,7 +855,12 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
         case CANIF_USER_TYPE_CAN_PDUR:\r
             // Send Can frame to PDU router\r
 #if defined(USE_PDUR)\r
-            PduR_CanIfRxIndication(entry->CanIfCanRxPduId,CanSduPtr);\r
+               {\r
+                       PduInfoType pduInfo;\r
+                       pduInfo.SduLength = CanDlc;\r
+                       pduInfo.SduDataPtr = (uint8 *)CanSduPtr;\r
+               PduR_CanIfRxIndication(entry->CanIfCanRxPduId,&pduInfo);\r
+               }\r
             return;\r
 #endif\r
             break;\r
@@ -804,6 +877,18 @@ void CanIf_RxIndication(uint8 Hrh, Can_IdType CanId, uint8 CanDlc,
             return;\r
 #endif\r
             break;\r
+        case CANIF_USER_TYPE_J1939TP:\r
+          // Send Can frame to CAN TP\r
+#if defined(USE_J1939TP)\r
+            {\r
+                   PduInfoType J1939TpRxPdu;\r
+                   J1939TpRxPdu.SduLength = CanDlc;\r
+                   J1939TpRxPdu.SduDataPtr = (uint8 *)CanSduPtr;\r
+                   J1939Tp_RxIndication(entry->CanIfCanRxPduId, &J1939TpRxPdu);\r
+            }\r
+            return;\r
+#endif\r
+            break;            \r
       }\r
     }\r
 \r
@@ -833,10 +918,18 @@ void CanIf_CancelTxConfirmation(const Can_PduType *PduInfoPtr)
 \r
 void CanIf_ControllerBusOff(uint8 Controller)\r
 {\r
-  // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
+  CanIf_Arc_ChannelIdType channel = 0xff;\r
 \r
   VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_UNINIT );\r
+\r
+  for(int i = 0; i < CANIF_CHANNEL_CNT; i++)\r
+  {\r
+         if(CanIf_ConfigPtr->Arc_ChannelToControllerMap[i] == Controller)\r
+         {\r
+                 channel = i;\r
+         }\r
+  }\r
+\r
   VALIDATE_NO_RV( Controller < CANIF_CHANNEL_CNT, CANIF_CONTROLLER_BUSOFF_ID, CANIF_E_PARAM_CONTROLLER );\r
 \r
   // According to figure 35 in canif spec this should be done in\r
@@ -851,30 +944,54 @@ void CanIf_ControllerBusOff(uint8 Controller)
 \r
 void CanIf_SetWakeupEvent(uint8 Controller)\r
 {\r
-#if  ( CANIF_DEV_ERROR_DETECT == STD_ON )\r
-  // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
-#endif\r
+       CanIf_Arc_ChannelIdType channel = 0xff;\r
 \r
-  VALIDATE_NO_RV(FALSE, CANIF_SETWAKEUPEVENT_ID, CANIF_E_NOK_NOSUPPORT);\r
-  VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_SETWAKEUPEVENT_ID, CANIF_E_UNINIT );\r
-  VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_SETWAKEUPEVENT_ID, CANIF_E_PARAM_CONTROLLER );\r
+       VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_SETWAKEUPEVENT_ID, CANIF_E_UNINIT );\r
 \r
-  // Not supported\r
+       for(int i = 0; i < CANIF_CHANNEL_CNT; i++)\r
+       {\r
+         if(CanIf_ConfigPtr->Arc_ChannelToControllerMap[i] == Controller)\r
+         {\r
+                 channel = i;\r
+         }\r
+       }\r
+\r
+       VALIDATE_NO_RV(FALSE, CANIF_SETWAKEUPEVENT_ID, CANIF_E_NOK_NOSUPPORT);\r
+       VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_SETWAKEUPEVENT_ID, CANIF_E_PARAM_CONTROLLER );\r
+\r
+       // Not supported\r
 }\r
 \r
 void CanIf_Arc_Error(uint8 Controller, Can_Arc_ErrorType Error)\r
 {\r
-#if  ( CANIF_DEV_ERROR_DETECT == STD_ON )\r
-  // We call this a CanIf channel. Hopefully makes it easier to follow.\r
-  CanIf_Arc_ChannelIdType channel = Controller;\r
-#endif\r
+  CanIf_Arc_ChannelIdType channel = 0xff;\r
 \r
   VALIDATE_NO_RV( CanIf_Global.initRun, CANIF_ARCERROR_ID, CANIF_E_UNINIT );\r
+\r
+  for(int i = 0; i < CANIF_CHANNEL_CNT; i++)\r
+  {\r
+         if(CanIf_ConfigPtr->Arc_ChannelToControllerMap[i] == Controller)\r
+         {\r
+                 channel = i;\r
+         }\r
+  }\r
+\r
   VALIDATE_NO_RV( channel < CANIF_CHANNEL_CNT, CANIF_ARCERROR_ID, CANIF_E_PARAM_CONTROLLER );\r
 \r
   if (CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton != NULL)\r
   {\r
     CanIf_ConfigPtr->DispatchConfig->CanIfErrorNotificaton(Controller, Error);\r
   }\r
+\r
+  // Special fix for restart of bus incase of general can error i.e. connection to CanSM\r
+  if (CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification != NULL)\r
+  {\r
+    CanIf_ConfigPtr->DispatchConfig->CanIfBusOffNotification(channel);\r
+  }\r
 }\r
+\r
+uint8 CanIf_Arc_GetChannelDefaultConfIndex(CanIf_Arc_ChannelIdType Channel)
+{
+       return CanIf_Config.Arc_ChannelDefaultConfIndex[Channel];
+}
+