Просмотр исходного кода

Adds additional tests, fixes used enum

CapXilinx 9 лет назад
Родитель
Сommit
da51112614
3 измененных файлов с 135 добавлено и 12 удалено
  1. 54 4
      source/src/cip/cipepath.c
  2. 17 1
      source/src/cip/cipepath.h
  3. 64 7
      source/tests/cip/cipepathtest.cpp

+ 54 - 4
source/src/cip/cipepath.c

@@ -47,6 +47,7 @@ const unsigned int kPortSegmentExtendedPort = 15; /**< Reserved port segment por
 #define LOGICAL_SEGMENT_EXTENDED_TYPE_STRUCTURE_MEMBER_HANDLE_MESSAGE_VALUE 0x06
 
 #define LOGICAL_SEGMENT_SPECIAL_TYPE_FORMAT_ELECTRONIC_KEY_MESSAGE_VALUE 0x00
+#define ELECTRONIC_KEY_SEGMENT_KEY_FORMAT_4_MESSAGE_VALUE 0x04
 
 #define NETWORK_SEGMENT_SUBTYPE_SCHEDULE_MESSAGE_VALUE 0x01
 #define NETWORK_SEGMENT_SUBTYPE_FIXED_TAG_MESSAGE_VALUE 0x02
@@ -55,7 +56,15 @@ const unsigned int kPortSegmentExtendedPort = 15; /**< Reserved port segment por
 #define NETWORK_SEGMENT_SUBTYPE_PRODUCTION_INHIBIT_TIME_IN_MICROSECONDS_MESSAGE_VALUE 0x10
 #define NETWORK_SEGMENT_SUBTYPE_EXTENDED_NETWORK_MESSAGE_VALUE 0x1F
 
-#define ELECTRONIC_KEY_SEGMENT_KEY_FORMAT_4_MESSAGE_VALUE 0x04
+#define SYMBOLIC_SEGMENT_FORMAT_EXTENDED_STRING_MESSAGE_VALUE 0x00
+
+#define EXTENDED_FORMAT_DOUBLE_CHAR_MESSAGE_VALUE 0x20
+#define EXTENDED_FORMAT_TRIPLE_CHAR_MESSAGE_VALUE 0x40
+#define EXTENDED_FORMAT_NUMERIC_MESSAGE_VALUE 0xC0
+
+#define EXTENDED_FORMAT_NUMERIC_USINT_TYPE 0x06
+#define EXTENDED_FORMAT_NUMERIC_UINT_TYPE 0x07
+#define EXTENDED_FORMAT_NUMERIC_UDINT_TYPE 0x08
 
 #define DATA_SEGMENT_SUBTYPE_SIMPLE_DATA_MESSAGE_VALUE 0x00
 #define DATA_SEGMENT_SUBTYPE_ANSI_EXTENDED_SYMBOL_MESSAGE_VALUE 0x11
@@ -325,11 +334,11 @@ void GetPathLogicalSegmentElectronicKeyFormat4(const unsigned char *const cip_pa
  *  @param cip_path Pointer to the start of the EPath message
  *  @return The Network Segment subtype of the EPath
  */
-NetworkSegmentSubType GetPathNetworkSegmentSubtype(const unsigned char *const cip_path) {
+NetworkSegmentSubtype GetPathNetworkSegmentSubtype(const unsigned char *const cip_path) {
   OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegmentType(cip_path));
   const unsigned int kSubtypeMask = 0x1F;
   const unsigned int subtype = (*cip_path) & kSubtypeMask;
-  NetworkSegmentSubType result = kNetworkSegmentSubtypeReserved;
+  NetworkSegmentSubtype result = kNetworkSegmentSubtypeReserved;
   switch(subtype) {
     case NETWORK_SEGMENT_SUBTYPE_SCHEDULE_MESSAGE_VALUE:
       result = kNetworkSegmentSubtypeScheduleSegment; break;
@@ -388,7 +397,48 @@ CipUdint GetPathNetworkSegmentProductionInhibitTimeInMicroseconds(const unsigned
 
 /*** Symbolic Segment ***/
 
-/* Currently not supported */
+SymbolicSegmentFormat GetPathSymbolicSegmentFormat(const unsigned char *const cip_path) {
+  const unsigned int kSymbolicSegmentFormatMask = 0x1F;
+  if( SYMBOLIC_SEGMENT_FORMAT_EXTENDED_STRING_MESSAGE_VALUE == (*cip_path & kSymbolicSegmentFormatMask) ) {
+    return kSymbolicSegmentFormatExtendedString;
+  }
+  return kSymbolicSegmentFormatASCII;
+}
+
+unsigned int GetPathSymbolicSegmentASCIIFormatLength(const unsigned char *const cip_path) {
+  const unsigned int kSymbolicSegmentASCIIFormatLength = 0x1F;
+  const unsigned int length = *cip_path & kSymbolicSegmentASCIIFormatLength;
+  OPENER_ASSERT(0 != length);
+  return length;
+}
+
+SymbolicSegmentExtendedFormat GetPathSymbolicSegmentNumericType(const unsigned char *const cip_path) {
+  const unsigned int kSymbolicSegmentExtendedFormatNumericTypeMask = 0x1F;
+  const unsigned int numeric_subtype = *(cip_path + 1) & kSymbolicSegmentExtendedFormatNumericTypeMask;
+  SymbolicSegmentExtendedFormat result = kSymbolicSegmentExtendedFormatReserved;
+  switch(numeric_subtype) {
+    case EXTENDED_FORMAT_NUMERIC_USINT_TYPE: result = kSymbolicSegmentExtendedFormatNumericSymbolUSINT; break;
+    case EXTENDED_FORMAT_NUMERIC_UINT_TYPE: result = kSymbolicSegmentExtendedFormatNumericSymbolUINT; break;
+    case EXTENDED_FORMAT_NUMERIC_UDINT_TYPE: result = kSymbolicSegmentExtendedFormatNumericSymbolUDINT; break;
+    default: result = kSymbolicSegmentExtendedFormatReserved; break;
+  }
+  return result;
+}
+
+SymbolicSegmentExtendedFormat GetPathSymbolicSegmentExtendedFormat(const unsigned char *const cip_path) {
+  OPENER_ASSERT(kSegmentTypeSymbolicSegment == GetPathSegmentType(cip_path));
+  OPENER_ASSERT(kSymbolicSegmentFormatExtendedString == GetPathSymbolicSegmentFormat(cip_path));
+  const unsigned int kSymbolicSegmentExtendedFormatMask = 0xE0;
+  const unsigned int extended_type = *(cip_path + 1) & kSymbolicSegmentExtendedFormatMask;
+  SymbolicSegmentExtendedFormat result = kSymbolicSegmentExtendedFormatReserved;
+  switch(extended_type) {
+    case EXTENDED_FORMAT_DOUBLE_CHAR_MESSAGE_VALUE: result = kSymbolicSegmentExtendedFormatDoubleByteChars; break;
+    case EXTENDED_FORMAT_TRIPLE_CHAR_MESSAGE_VALUE: result = kSymbolicSegmentExtendedFormatTripleByteChars; break;
+    case EXTENDED_FORMAT_NUMERIC_MESSAGE_VALUE: result = GetPathSymbolicSegmentNumericType(cip_path); break;
+    default: result = kSymbolicSegmentExtendedFormatReserved; break;
+  }
+  return result;
+}
 
 /*** Symbolic Segment ***/
 

+ 17 - 1
source/src/cip/cipepath.h

@@ -72,6 +72,20 @@ typedef enum {
   kDataSegmentSubtypeANSIExtendedSymbol
 } DataSegmentSubtype;
 
+typedef enum {
+  kSymbolicSegmentFormatASCII,
+  kSymbolicSegmentFormatExtendedString
+} SymbolicSegmentFormat;
+
+typedef enum {
+  kSymbolicSegmentExtendedFormatDoubleByteChars,
+  kSymbolicSegmentExtendedFormatTripleByteChars,
+  kSymbolicSegmentExtendedFormatNumericSymbolUSINT,
+  kSymbolicSegmentExtendedFormatNumericSymbolUINT,
+  kSymbolicSegmentExtendedFormatNumericSymbolUDINT,
+  kSymbolicSegmentExtendedFormatReserved
+} SymbolicSegmentExtendedFormat;
+
 SegmentType GetPathSegmentType(const unsigned char *const cip_path);
 
 void SetPathSegmentType(SegmentType segment_type, unsigned char *const cip_path);
@@ -103,7 +117,7 @@ ElectronicKeySegmentFormat GetPathLogicalSegmentElectronicKeyFormat(const unsign
 
 void GetPathLogicalSegmentElectronicKeyFormat4(const unsigned char *const cip_path, ElectronicKeyFormat4 *key);
 
-NetworkSegmentSubType GetPathNetworkSegmentSubtype(const unsigned char *const cip_path);
+NetworkSegmentSubtype GetPathNetworkSegmentSubtype(const unsigned char *const cip_path);
 
 CipUsint GetPathNetworkSegmentProductionInhibitTimeInMilliseconds(const unsigned char *const cip_path);
 
@@ -113,4 +127,6 @@ DataSegmentSubtype GetPathDataSegmentSubtype(const unsigned char *const cip_path
 
 CipUsint GetPathDataSegmentSimpleDataWordLength(const unsigned char *const cip_path);
 
+SymbolicSegmentFormat GetPathSymbolicSegmentFormat(const unsigned char *const cip_path);
+
 #endif /* SRC_CIP_CIPEPATH_H_ */

+ 64 - 7
source/tests/cip/cipepathtest.cpp

@@ -269,43 +269,43 @@ TEST(CipEpath, GetLogicalSegmentElectronicKeyFormat4) {
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeReserved) {
   const unsigned char message[] = {0x40};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeReserved, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeScheduled) {
   const unsigned char message[] = {0x41};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeScheduleSegment, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeFixedTag) {
   const unsigned char message[] = {0x42};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeFixedTagSegment, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeProductionInhibitTimerInMilliseconds) {
   const unsigned char message[] = {0x43};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeProductionInhibitTimeInMilliseconds, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeSafety) {
   const unsigned char message[] = {0x44};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeSafetySegment, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeProductionInhibitTimerInMicroseconds) {
   const unsigned char message[] = {0x50};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeProductionInhibitTimeInMicroseconds, sub_type);
 }
 
 TEST(CipEpath, GetPathNetworkSegmentSubtypeExtendedNetwork) {
   const unsigned char message[] = {0x5F};
-  NetworkSegmentSubType sub_type = GetPathNetworkSegmentSubtype(message);
+  NetworkSegmentSubtype sub_type = GetPathNetworkSegmentSubtype(message);
   CHECK_EQUAL(kNetworkSegmentSubtypeExtendedNetworkSegment, sub_type);
 }
 
@@ -344,3 +344,60 @@ TEST(CipEpath, GetPathDataSegmentSimpleDataWordLength) {
   CipUsint length = GetPathDataSegmentSimpleDataWordLength(message);
   CHECK_EQUAL(37, length);
 }
+
+
+TEST(CipEpath, GetPathSymbolicSegmentFormatASCII) {
+  const unsigned char message[] = {0x61};
+  SymbolicSegmentFormat format = GetPathSymbolicSegmentFormat(message);
+  CHECK_EQUAL(kSymbolicSegmentFormatASCII, format);
+}
+
+TEST(CipEpath, GetPathSymbolicSegmentFormatExtendedFormat) {
+  const unsigned char message[] = {0x60};
+  SymbolicSegmentFormat format = GetPathSymbolicSegmentFormat(message);
+  CHECK_EQUAL(kSymbolicSegmentFormatExtendedString, format);
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentASCIIFormatLength) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentNumericTypeReserved) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentNumericTypeUSINT) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentNumericTypeUINT) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentNumericTypeUDINT) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatReserverd) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatDoubleChars) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatTripleChars) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatUSINT) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatUINT) {
+  FAIL("Implement me!");
+}
+
+IGNORE_TEST(CipEpath, GetPathSymbolicSegmentExtendedFormatUDINT) {
+  FAIL("Implement me!");
+}