Explorar el Código

SetAttributesingle + decode functions updated

micsat hace 5 años
padre
commit
297da90d8d
Se han modificado 3 ficheros con 177 adiciones y 120 borrados
  1. 126 100
      source/src/cip/cipcommon.c
  2. 2 1
      source/src/cip/ciptypes.h
  3. 49 19
      source/src/opener_api.h

+ 126 - 100
source/src/cip/cipcommon.c

@@ -735,108 +735,106 @@ void GenerateSetAttributeSingleHeader( //TODO: update
 }
 
 EipStatus SetAttributeSingle(CipInstance *RESTRICT const instance,
-                             CipMessageRouterRequest *const message_router_request,
-                             CipMessageRouterResponse *const message_router_response,
-                             const struct sockaddr *originator_address,
-                             const int encapsulation_session) {
-
-  CipAttributeStruct *attribute = GetCipAttribute(instance,
-                                                  message_router_request->request_path.attribute_number);
-
-  GenerateSetAttributeSingleHeader(message_router_request,
-                                   message_router_response);
-
-  EipUint16 attribute_number =
-    message_router_request->request_path.attribute_number;
-
-  /* Mask for filtering set-ability */
-  if ( (NULL != attribute) && (NULL != attribute->data) ) {
-    uint8_t set_bit_mask =
-      (instance->cip_class->set_bit_mask[CalculateIndex(
-                                                  attribute_number)
-       ]);
-    if (0 != (set_bit_mask & (1 << (attribute_number % 8) ) ) ) {
-      OPENER_TRACE_INFO("setAttribute %d\n", attribute_number);
-
-      /* Call the PreSetCallback if enabled for this attribute and the class provides one. */
-      if ( (attribute->attribute_flags & kPreSetFunc) &&
-           NULL != instance->cip_class->PreSetCallback ) {
-        instance->cip_class->PreSetCallback(instance,
-                                            attribute,
-                                            message_router_request->service);
-      }
-		//#################   //TODO: remove DEBUG
-
-		CipByteArray *attribute_test = (CipByteArray*) attribute->data;
-
-		OPENER_TRACE_INFO("DEBUG: attribute_data: "); //TODO: remove
-		for (int i = 0; i < attribute_test->length; i++) {
-			OPENER_TRACE_INFO("%x",*(attribute_test->data+i)); //TODO: remove
-		} OPENER_TRACE_INFO("\n"); //TODO: remove
-		//############################
-
-      OPENER_ASSERT(NULL != attribute);
-
-      int number_of_decoded_bytes = attribute->decode(attribute->data, message_router_request);
-      OPENER_TRACE_INFO("DEBUG: number of decoded bytes: %d\n", number_of_decoded_bytes); //TODO: remove
-
-      if(number_of_decoded_bytes != -1){
-    	  message_router_response->general_status = kCipErrorSuccess;
-      }
-      else{
-    	  message_router_response->general_status = kCipErrorNoStoredAttributeData;
-      }
-
-
-		//#################   //TODO: remove DEBUG
-
-		attribute_test = (CipByteArray*) attribute->data;
-
-		OPENER_TRACE_INFO("DEBUG: attribute_data: "); //TODO: remove
-		for (int i = 0; i < attribute_test->length; i++) {
-			OPENER_TRACE_INFO("%x",*(attribute_test->data+i)); //TODO: remove
-		} OPENER_TRACE_INFO("\n"); //TODO: remove
-		//############################
-
-      /* Call the PostSetCallback if enabled for this attribute and the class provides one. */
-      if ( (attribute->attribute_flags & kPostSetFunc) &&
-           NULL != instance->cip_class->PostSetCallback ) {
-        instance->cip_class->PostSetCallback(instance,
-                                             attribute,
-                                             message_router_request->service);
-      }
-    }
-    else{
-    	message_router_response->general_status = kCipErrorAttributeNotSetable; //TODO: check if correct
-    	OPENER_TRACE_WARN("SetAttributeSingle: Attribute %d not setable!\n\r", attribute_number);
-    }
-  }
+		CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response,
+		const struct sockaddr *originator_address,
+		const int encapsulation_session) {
+
+	CipAttributeStruct *attribute = GetCipAttribute(instance,
+			message_router_request->request_path.attribute_number);
+
+	GenerateSetAttributeSingleHeader(message_router_request,
+			message_router_response);
+
+	EipUint16 attribute_number =
+			message_router_request->request_path.attribute_number;
+
+	/* Mask for filtering set-ability */
+	if ((NULL != attribute) && (NULL != attribute->data)) {
+		uint8_t set_bit_mask =
+				(instance->cip_class->set_bit_mask[CalculateIndex(
+						attribute_number)]);
+		if (0 != (set_bit_mask & (1 << (attribute_number % 8)))) {
+			OPENER_TRACE_INFO("setAttribute %d\n", attribute_number);
+
+			/* Call the PreSetCallback if enabled for this attribute and the class provides one. */
+			if ((attribute->attribute_flags & kPreSetFunc) &&
+			NULL != instance->cip_class->PreSetCallback) {
+				instance->cip_class->PreSetCallback(instance, attribute,
+						message_router_request->service);
+			}
+
+			//#################   //TODO: remove DEBUG
+
+			CipByteArray *attribute_test = (CipByteArray*) attribute->data;
+
+			OPENER_TRACE_INFO("DEBUG: attribute_data: ");
+			for (int i = 0; i < attribute_test->length; i++) {
+				OPENER_TRACE_INFO("%x",*(attribute_test->data+i));
+			}OPENER_TRACE_INFO("\n");
+			//############################
+
+			OPENER_ASSERT(NULL != attribute);
+
+			int number_of_decoded_bytes = attribute->decode(attribute->data,
+					message_router_request, message_router_response); //writes data to attribute, sets resonse status
+			OPENER_TRACE_INFO("DEBUG: number of decoded bytes: %d\n", number_of_decoded_bytes); //TODO: remove,
+
+			//TODO: check use of number_of_decoded_bytes
+
+			//#################   //TODO: remove DEBUG
+
+			attribute_test = (CipByteArray*) attribute->data;
+
+			OPENER_TRACE_INFO("DEBUG: attribute_data: ");
+			for (int i = 0; i < attribute_test->length; i++) {
+				OPENER_TRACE_INFO("%x",*(attribute_test->data+i));
+			}OPENER_TRACE_INFO("\n");
+			//############################
+
+			/* Call the PostSetCallback if enabled for this attribute and the class provides one. */
+			if ((attribute->attribute_flags & kPostSetFunc) &&
+			NULL != instance->cip_class->PostSetCallback) {
+				instance->cip_class->PostSetCallback(instance, attribute,
+						message_router_request->service);
+			}
+		} else {
+			message_router_response->general_status =
+					kCipErrorAttributeNotSetable;
+			OPENER_TRACE_WARN("SetAttributeSingle: Attribute %d not setable!\n\r", attribute_number);
+		}
+	}
 
-  return kEipStatusOkSend;
+	return kEipStatusOkSend;
 }
 
 
 int DecodeCipBool(const CipBool *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	int number_of_decoded_bytes = -1;
 	*(EipUint8*) (data) = *message_router_request->data;
 	//++(*message_router_request->data);
 	number_of_decoded_bytes = 1;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipByte(const CipByte *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	int number_of_decoded_bytes = -1;
 		(*(EipUint8*) (data)) = GetByteFromMessage(message_router_request->data);
 		number_of_decoded_bytes = 1;
+		message_router_response->general_status = kCipErrorSuccess;
 		return number_of_decoded_bytes;
 }
 
 int DecodeCipByteArray(const CipByteArray *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
@@ -844,19 +842,16 @@ int DecodeCipByteArray(const CipByteArray *const data,
 	OPENER_TRACE_INFO(" -> set attribute byte array\r\n");
 	CipByteArray *cip_byte_array = (CipByteArray*) data;
 
-	OPENER_TRACE_INFO("DEBUG: message_data_length: %d\n", message_router_request->request_path_size); //TODO: remove
-	OPENER_TRACE_INFO("DEBUG: attribute_data_length: %d\n", data->length); //TODO: remove
-
 	if (message_router_request->request_path_size < data->length) {
 		OPENER_TRACE_INFO(
 				"DecodeCipByteArray: not enough data received.\n");
-		//message_router_response->general_status = kCipErrorNotEnoughData;
+		message_router_response->general_status = kCipErrorNotEnoughData;
 		return number_of_decoded_bytes;
 	} else {
 		if (message_router_request->request_path_size > data->length) {
 			OPENER_TRACE_INFO(
 					"DecodeCipByteArray: too much data received.\n");
-			//message_router_response->general_status = kCipErrorTooMuchData;
+			message_router_response->general_status = kCipErrorTooMuchData;
 			return number_of_decoded_bytes;
 		}
 	}
@@ -864,154 +859,182 @@ int DecodeCipByteArray(const CipByteArray *const data,
 	memcpy(cip_byte_array->data, cip_message, cip_byte_array->length);
 	number_of_decoded_bytes = cip_byte_array->length;
 
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipWord(const CipWord *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint16*) (data)) = GetWordFromMessage(cip_message);
 	number_of_decoded_bytes = 2;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipDword(const CipDword *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint32*) (data)) = GetDintFromMessage(cip_message);
 	number_of_decoded_bytes = 4;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipLword(const CipLword *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint64*) (data)) = GetLintFromMessage(cip_message);
 	number_of_decoded_bytes = 8;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipUsint(const CipUsint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint8*) (data)) = GetUsintFromMessage(cip_message);
 	number_of_decoded_bytes = 1;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipUint(const CipUint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint16*) (data)) = GetUintFromMessage(cip_message);
 	number_of_decoded_bytes = 2;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipUdint(const CipUdint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint32*) (data)) = GetUdintFromMessage(cip_message);
 	number_of_decoded_bytes = 4;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipUlint(const CipUlint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint64*) (data)) = GetLintFromMessage(cip_message);
 	number_of_decoded_bytes = 8;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipSint(const CipSint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint8*) (data)) = GetSintFromMessage(cip_message);
 	number_of_decoded_bytes = 1;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipInt(const CipInt *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint16*) (data)) = GetIntFromMessage(cip_message);
 	number_of_decoded_bytes = 2;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipDint(const CipDint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint32*) (data)) = GetDintFromMessage(cip_message);
 	number_of_decoded_bytes = 4;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipLint(const CipLint *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint64*) (data)) = GetLintFromMessage(cip_message);
 	number_of_decoded_bytes = 8;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipReal(const CipReal *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint32 *) (data) ) = GetDintFromMessage(cip_message);
 	number_of_decoded_bytes = 4;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipLreal(const CipLreal *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		 CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
 	int number_of_decoded_bytes = -1;
 	(*(EipUint64*) (data)) = GetLintFromMessage(cip_message);
 	number_of_decoded_bytes = 8;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipString(const CipString *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
@@ -1027,11 +1050,13 @@ int DecodeCipString(const CipString *const data,
 		++(*cip_message);
 		number_of_decoded_bytes++;
 	}
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 
 int DecodeCipShortString(const CipShortString *const data,
-		const CipMessageRouterRequest *const message_router_request) {
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response) {
 
 	const EipUint8 **const cip_message = message_router_request->data;
 
@@ -1045,6 +1070,7 @@ int DecodeCipShortString(const CipShortString *const data,
 	*cip_message += short_string->length;
 
 	number_of_decoded_bytes = short_string->length + 1;
+	message_router_response->general_status = kCipErrorSuccess;
 	return number_of_decoded_bytes;
 }
 

+ 2 - 1
source/src/cip/ciptypes.h

@@ -278,7 +278,8 @@ typedef void (*CipAttributeEncodeInMessage)(const void *const data,
 
 /** @brief self-describing data decoding for CIP types */
 typedef int (*CipAttributeDecodeInMessage)(const void *const data,
-									CipMessageRouterRequest *const message_router_request);
+									const CipMessageRouterRequest *const message_router_request,
+									CipMessageRouterResponse *const message_router_response);
 
 /** @brief Structure to describe a single CIP attribute of an object
  */

+ 49 - 19
source/src/opener_api.h

@@ -378,7 +378,7 @@ void EncodeCipEthernetLinkPhyisicalAddress(const void *const data,
                                            ENIPMessage *const outgoing_message);
 
 /** @ingroup CIP_API
- * @brief Retrieve the given data according to CIP encoding from the message     //TODO: update
+ * @brief Retrieve the given data according to CIP encoding from the message     //TODO: remove DecodeData
  * buffer.
  *
  * This function may be used in in own services for handling data from the
@@ -393,59 +393,89 @@ int DecodeData(const EipUint8 cip_data_type,  //TODO: replace with decode functi
                void *const cip_data,
                const EipUint8 **const cip_message);
 
+/** @ingroup CIP_API
+ * @brief Retrieve the given data according to CIP encoding from the message
+ * buffer.
+ *
+ * This function may be used in own services for handling data from the
+ * requester (e.g., setAttributeSingle).
+ *  @param data pointer to value to be written.
+ *  @param message_router_request pointer to the request where the data should be taken from
+ *  @param message_router_response pointer to the response where status should be set
+ *  @return length of taken bytes
+ *          -1 .. error
+ */
 int DecodeCipBool(const CipBool *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipByte(const CipByte *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipByteArray(const CipByteArray *const data,
-			const CipMessageRouterRequest *const message_router_request);
+			const CipMessageRouterRequest *const message_router_request,
+			CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipWord(const CipWord *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipDword(const CipDword *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipLword(const CipLword *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipUsint(const CipUsint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipUint(const CipUint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipUdint(const CipUdint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipUlint(const CipUlint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipSint(const CipSint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipInt(const CipInt *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipDint(const CipDint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipLint(const CipLint *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipReal(const CipReal *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipLreal(const CipLreal *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipString(const CipString *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 int DecodeCipShortString(const CipShortString *const data,
-		const CipMessageRouterRequest *const message_router_request);
+		const CipMessageRouterRequest *const message_router_request,
+		CipMessageRouterResponse *const message_router_response);
 
 /** @ingroup CIP_API
  * @brief Create an instance of an assembly object