Parcourir la source

Common service "Reset" added, Callbacks added in CipClass struct

micsat il y a 4 ans
Parent
commit
c35ec95f2f
3 fichiers modifiés avec 59 ajouts et 0 suppressions
  1. 32 0
      source/src/cip/cipcommon.c
  2. 22 0
      source/src/cip/cipcommon.h
  3. 5 0
      source/src/cip/ciptypes.h

+ 32 - 0
source/src/cip/cipcommon.c

@@ -1398,6 +1398,38 @@ EipStatus Delete(CipInstance *RESTRICT const instance,
   return kEipStatusOk;
 }
 
+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) {
+
+  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);
+
+  EipStatus internal_state = kEipStatusOk;
+
+  CipClass *const class = instance->cip_class;
+
+  /* Call the PreResetCallback if the class provides one. */
+  if (NULL != class->PreResetCallback) {
+    internal_state = class->PreResetCallback(instance, message_router_request,
+                                              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;
+}
+
 void AllocateAttributeMasks(CipClass *target_class) {
   unsigned size = 1 + CalculateIndex(target_class->highest_attribute_number);
   OPENER_TRACE_INFO(

+ 22 - 0
source/src/cip/cipcommon.h

@@ -187,4 +187,26 @@ EipStatus Delete(CipInstance *RESTRICT const instance,
     const struct sockaddr *originator_address,
     const int encapsulation_session);
 
+/** @brief Generic implementation of the Reset CIP service
+ *
+ *  Causes a transition to a default state or mode of
+ *  the object instance within the specified class
+ *
+ *
+ * @param instance pointer to instance.
+ * @param message_router_request pointer to request.
+ * @param message_router_response pointer to response.
+ * @param originator_address address struct of the originator as received
+ * @param encapsulation_session associated encapsulation session of the explicit message
+ * @return status  >0 .. success
+ *          -1 .. requested instance not reseted
+ */
+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);
+
 #endif /* OPENER_CIPCOMMON_H_ */

+ 5 - 0
source/src/cip/ciptypes.h

@@ -392,6 +392,11 @@ typedef struct cip_class {
   CipCallback PreDeleteCallback;
   /** Is called in Delete after the instance has been deleted. */
   CipCallback PostDeleteCallback;
+  /** Is called in Reset service */
+  CipCallback PreResetCallback;
+  /** Is called in Reset service. */
+  CipCallback PostResetCallback;
+
 } CipClass;
 
 /** @ingroup CIP_API