Bläddra i källkod

Changes to support variable class services

Signed-off-by: Martin Melik Merkumians <melik-merkumians@acin.tuwien.ac.at>
Martin Melik Merkumians 5 år sedan
förälder
incheckning
6b92d905b1

+ 1 - 1
source/CMakeLists.txt

@@ -62,7 +62,7 @@ add_definitions(-DOPENER_MESSAGE_DATA_REPLY_BUFFER=${OPENER_MESSAGE_DATA_REPLY_B
 #######################################
 set( OpENer_KNOWN_PLATFORMS "POSIX" "WIN32" "MINGW")
 
-set( OpENer_PLATFORM CACHE STRINGS "Platform OpENer will be built for" )
+set( OpENer_PLATFORM CACHE STRING "Platform OpENer will be built for" )
 set_property(CACHE OpENer_PLATFORM PROPERTY STRINGS ${OpENer_KNOWN_PLATFORMS} )
 
 #######################################

+ 17 - 13
source/src/cip/cipcommon.c

@@ -304,19 +304,19 @@ CipClass *CreateCipClass(const CipUdint class_code,
     InsertAttribute( (CipInstance *) cip_class, 7, kCipUint,
                      (void *) &cip_class->highest_attribute_number,
                      kGetableSingle );                              /* max instance attribute number*/
+	  if (number_of_class_services > 0) {
+		if (number_of_class_services > 1) {             /*only if the mask has values add the get_attribute_all service */
+		  InsertService(meta_class, kGetAttributeAll, &GetAttributeAll,
+						"GetAttributeAll");                     /* bind instance services to the metaclass*/
+		}
+		InsertService(meta_class, kGetAttributeSingle, &GetAttributeSingle,
+					  "GetAttributeSingle");
+	  }
   } else {
     initializer(cip_class);
   }
 
   /* create the standard class services*/
-  if (number_of_class_services > 0) {
-    if (number_of_class_services > 1) {             /*only if the mask has values add the get_attribute_all service */
-      InsertService(meta_class, kGetAttributeAll, &GetAttributeAll,
-                    "GetAttributeAll");                     /* bind instance services to the metaclass*/
-    }
-    InsertService(meta_class, kGetAttributeSingle, &GetAttributeSingle,
-                  "GetAttributeSingle");
-  }
   return cip_class;
 }
 
@@ -427,6 +427,14 @@ CipAttributeStruct *GetCipAttribute(const CipInstance *const instance,
   return NULL;
 }
 
+void GenerateGetAttributeSingleHeader(const CipMessageRouterRequest *const message_router_request, CipMessageRouterResponse *const message_router_response) {
+	  message_router_response->data_length = 0;
+	  message_router_response->reply_service = (0x80
+	                                            | message_router_request->service);
+	  message_router_response->general_status = kCipErrorAttributeNotSupported;
+	  message_router_response->size_of_additional_status = 0;
+}
+
 /* TODO this needs to check for buffer overflow*/
 EipStatus GetAttributeSingle(CipInstance *RESTRICT const instance,
                              CipMessageRouterRequest *const message_router_request,
@@ -439,11 +447,7 @@ EipStatus GetAttributeSingle(CipInstance *RESTRICT const instance,
                                                   message_router_request->request_path.attribute_number);
   EipByte *message = message_router_response->data;
 
-  message_router_response->data_length = 0;
-  message_router_response->reply_service = (0x80
-                                            | message_router_request->service);
-  message_router_response->general_status = kCipErrorAttributeNotSupported;
-  message_router_response->size_of_additional_status = 0;
+  GenerateGetAttributeSingleHeader(message_router_request, message_router_response);
 
   EipUint16 attribute_number =
     message_router_request->request_path.attribute_number;

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

@@ -41,6 +41,8 @@ EipStatus NotifyClass(const CipClass *const RESTRICT cip_class,
                       const struct sockaddr *originator_address,
                       const int encapsulation_session);
 
+void GenerateGetAttributeSingleHeader(const CipMessageRouterRequest *const message_router_request, CipMessageRouterResponse *const message_router_response);
+
 /** @brief Generic implementation of the GetAttributeSingle CIP service
  *
  * Check from classID which Object requests an attribute, search if object has

+ 3 - 0
source/src/cip/cipconnectionmanager.c

@@ -194,6 +194,9 @@ void InitializeConnectionManager(CipClass *class) {
                    (void *) &class->highest_attribute_number,
                    kGetableSingleAndAll ); /* max instance attribute number*/
 
+  InsertService(meta_class, kGetAttributeAll, &GetAttributeAll,	"GetAttributeAll"); /* bind instance services to the metaclass*/
+  InsertService(meta_class, kGetAttributeSingle, &GetAttributeSingle, "GetAttributeSingle");
+
 }
 
 EipStatus ConnectionManagerInit(EipUint16 unique_connection_id) {

+ 5 - 0
source/src/cip/cipidentity.c

@@ -206,6 +206,11 @@ void InitializeCipIdentity(CipClass *class) {
                    (void *) &class->highest_attribute_number,
                    kGetableSingleAndAll );                 /* max instance attribute number*/
 
+  InsertService(meta_class, kGetAttributeAll, &GetAttributeAll,
+                    "GetAttributeAll");                     /* bind instance services to the metaclass*/
+  InsertService(meta_class, kGetAttributeSingle, &GetAttributeSingle,
+                  "GetAttributeSingle");
+
 }
 
 EipStatus CipIdentityInit() {

+ 5 - 0
source/src/cip/cipmessagerouter.c

@@ -73,6 +73,11 @@ void InitializeCipMessageRouterClass(CipClass *cip_class) {
   InsertAttribute( (CipInstance *) cip_class, 7, kCipUint,
                    (void *) &cip_class->highest_attribute_number,
                    kGetableSingleAndAll );                       /* max instance attribute number*/
+
+  InsertService(meta_class, kGetAttributeAll, &GetAttributeAll,
+                    "GetAttributeAll");                     /* bind instance services to the metaclass*/
+  InsertService(meta_class, kGetAttributeSingle, &GetAttributeSingle,
+                  "GetAttributeSingle");
 }
 
 EipStatus CipMessageRouterInit() {

+ 1 - 1
source/src/cip/cipqos.c

@@ -163,7 +163,7 @@ CipUsint CipQosGetDscpPriority(ConnectionObjectPriority priority) {
  *  which are optional for the QoS class are NOT created!
  *  This is intended.
  */
-void InitializeCipQos(CipClass *class) {
+void InitializeCipQos(CipClass *cip_class) {
   /* Function is empty by intend. */
 }
 

+ 27 - 4
source/src/cip/ciptypes.h

@@ -55,8 +55,10 @@ typedef enum cip_data_types {
   kCip6Usint = 0xA2, /**< Struct for MAC Address (six USINTs)*/
   kCipMemberList = 0xA3, /**< */
   kCipByteArray = 0xA4, /**< */
-  kInternalUint6 = 0xF0 /**< bogus hack, for port class attribute 9, TODO
+  kInternalUint6 = 0xF0, /**< bogus hack, for port class attribute 9, TODO
                            figure out the right way to handle it */
+  kCipStringI,
+  kCipFileRevisionStruct
 } CipDataType;
 
 /** @brief Definition of CIP service codes
@@ -160,14 +162,35 @@ typedef struct {
 /** @brief STRINGI definition
  *
  */
-typedef struct {
+typedef struct cip_type_string_i_struct CipStringIStruct;
+
+typedef struct cip_string_i {
+  CipUsint number;
+  CipStringIStruct* array_of_string_i_structs;
+} CipStringI;
+
+typedef enum cip_type_string_i_character_set {
+	kCipStringICharSet_ISO_8859_1_1987 = 4,
+	kCipStringICharSet_ISO_8859_2_1987 = 5,
+	kCipStringICharSet_ISO_8859_3_1988 = 6,
+	kCipStringICharSet_ISO_8859_4_1988 = 7,
+	kCipStringICharSet_ISO_8859_5_1988 = 8,
+	kCipStringICharSet_ISO_8859_6_1987 = 9,
+	kCipStringICharSet_ISO_8859_7_1987 = 10,
+	kCipStringICharSet_ISO_8859_8_1989 = 11,
+	kCipStringICharSet_ISO_8859_9_1989 = 12,
+	kCipStringICharSet_ISO_10646_UCS_2 = 1000,
+	kCipStringICharSet_ISO_10646_UCS_4 = 1001
+} CipStringICharacterSet;
+
+typedef struct cip_type_string_i_struct {
   CipUsint language_char_1;
   CipUsint language_char_2;
   CipUsint language_char_3;
-  CipUsint char_string_struct;   /**< EPath Either 0xD0, 0xD5, 0xD9, or 0xDA */
+  CipUint char_string_struct;   /**< EPath Either 0xD0, 0xD5, 0xD9, or 0xDA */
   CipUint character_set;   /**< Character set of the string */
   CipOctet *string;   /**< Pointer to the string data */
-} CipStringI;
+} CipStringIStruct;
 
 /** @brief Struct for padded EPATHs
  *