Bladeren bron

Identity object use common service"Reset" update

micsat 4 jaren geleden
bovenliggende
commit
1bb2a59127
2 gewijzigde bestanden met toevoegingen van 29 en 37 verwijderingen
  1. 15 16
      source/src/cip/cipcommon.c
  2. 14 21
      source/src/cip/cipidentity.c

+ 15 - 16
source/src/cip/cipcommon.c

@@ -1399,15 +1399,15 @@ EipStatus Delete(CipInstance *RESTRICT const instance,
 }
 
 EipStatus Reset(CipInstance *RESTRICT const instance,
-                 CipMessageRouterRequest *const message_router_request,
-                 CipMessageRouterResponse *const message_router_response,
-                 const struct sockaddr *originator_address,
-                 const int encapsulation_session) {
-
+                CipMessageRouterRequest *const message_router_request,
+                CipMessageRouterResponse *const message_router_response,
+                const struct sockaddr *originator_address,
+                const int encapsulation_session) {
   message_router_response->general_status = kCipErrorSuccess;
   message_router_response->size_of_additional_status = 0;
   InitializeENIPMessage(&message_router_response->message);
-  message_router_response->reply_service = (0x80 | message_router_request->service);
+  message_router_response->reply_service =
+      (0x80 | message_router_request->service);
 
   EipStatus internal_state = kEipStatusOk;
 
@@ -1416,18 +1416,17 @@ EipStatus Reset(CipInstance *RESTRICT const instance,
   /* Call the PreResetCallback if the class provides one. */
   if (NULL != class->PreResetCallback) {
     internal_state = class->PreResetCallback(instance, message_router_request,
-                                              message_router_response);
+                                             message_router_response);
   }
 
-	if (kEipStatusOk == internal_state) {
-
-		/* Call the PostResetCallback if the class provides one. */
-		if (NULL != class->PostResetCallback) {
-			class->PostResetCallback(instance, message_router_request,
-					message_router_response);
-		}
-	}
-	return kEipStatusOk;
+  if (kEipStatusError != internal_state) {
+    /* Call the PostResetCallback if the class provides one. */
+    if (NULL != class->PostResetCallback) {
+      class->PostResetCallback(instance, message_router_request,
+                               message_router_response);
+    }
+  }
+  return internal_state;
 }
 
 void AllocateAttributeMasks(CipClass *target_class) {

+ 14 - 21
source/src/cip/cipidentity.c

@@ -120,29 +120,21 @@ void CipIdentitySetExtendedDeviceStatus(
   MergeStatusAndExtStatus();
 }
 
-/** @brief Reset service
+/** @brief Identity Object PreResetCallback
+ *
+ *  Used for common Reset service
  *
- * @param instance
- * @param message_router_request
- * @param message_router_response
  * @returns Currently always kEipOkSend is returned
  */
-static EipStatus Reset(CipInstance *instance,
-/* pointer to instance*/
-                       CipMessageRouterRequest *message_router_request,
-/* pointer to message router request*/
-                       CipMessageRouterResponse *message_router_response, /* pointer to message router response*/
-                       const struct sockaddr *originator_address,
-                       const int encapsulation_session) {
+EipStatus IdentityObjectPreResetCallback(
+    CipInstance *RESTRICT const instance,
+    CipMessageRouterRequest *const message_router_request,
+    CipMessageRouterResponse *const message_router_response
+) {
   (void) instance;
 
   EipStatus eip_status = kEipStatusOkSend;
 
-  message_router_response->reply_service =
-    (0x80 | message_router_request->service);
-  message_router_response->size_of_additional_status = 0;
-  message_router_response->general_status = kCipErrorSuccess;
-
   if(message_router_request->request_data_size > 1) {
     message_router_response->general_status = kCipErrorTooMuchData;
   } else {
@@ -163,18 +155,16 @@ static EipStatus Reset(CipInstance *instance,
         }
         break;
 
-      /* case 2: Not supported Reset type 2 ->
-         Return to factory defaults except communications parameters & power cycle*/
+        /* case 2: Not supported Reset type 2 ->
+           Return to factory defaults except communications parameters & power cycle*/
 
       default:
         message_router_response->general_status = kCipErrorInvalidParameter;
         break;
     }
   }
-
-  InitializeENIPMessage(&message_router_response->message);
   return eip_status;
-}
+  }
 
 void InitializeCipIdentity(CipClass *class) {
 
@@ -206,6 +196,9 @@ void InitializeCipIdentity(CipClass *class) {
                 &GetAttributeSingle,
                 "GetAttributeSingle");
 
+  // add Callback function pointers
+  class->PreResetCallback = &IdentityObjectPreResetCallback;
+
 }
 
 void EncodeRevision(const void *const data,