|
|
@@ -5,60 +5,62 @@
|
|
|
******************************************************************************/
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
+#include <stdlib.h>
|
|
|
|
|
|
#include "cipepath.h"
|
|
|
|
|
|
#include "endianconv.h"
|
|
|
#include "cipelectronickey.h"
|
|
|
+#include "trace.h"
|
|
|
|
|
|
const unsigned int kPortSegmentExtendedPort = 15; /**< Reserved port segment port value, indicating the use of the extended port field */
|
|
|
|
|
|
/* Segments */
|
|
|
-const unsigned int kSegmentTypePortSegmentMessageValue = 0x00; /**< Message value of the Port segment */
|
|
|
-const unsigned int kSegmentTypeLogicalSegmentMessageValue = 0x20; /**< Message value of the Logical segment */
|
|
|
-const unsigned int kSegmentTypeNetworkSegmentMessageValue = 0x40; /**< Message value of the Network segment */
|
|
|
-const unsigned int kSegmentTypeSymbolicSegmentMessageValue = 0x60; /**< Message value of the Symbolic segment */
|
|
|
-const unsigned int kSegmentTypeDataSegmentMessageValue = 0x80; /**< Message value of the Data segment */
|
|
|
-const unsigned int kSegmentTypeDataTypeConstructedMessageValue = 0xA0; /**< Message value of the Data type constructed */
|
|
|
-const unsigned int kSegmentTypeDataTypeElementaryMessageValue = 0xC0; /**< Message value of the Data type elementary */
|
|
|
-const unsigned int kSegmentTypeSegmentTypeReservedMessageValue = 0xE0; /**< Reserved value */
|
|
|
-
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeClassIdMessageValue = 0x00; /**< Message value of the logical segment/logical type Class ID */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeInstanceIdMessageValue = 0x04; /**< Message value of the logical segment/logical type Instance ID */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeMemberIdMessageValue = 0x08; /**< Message value of the logical segment/logical type Member ID */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeConnectionPointMessageValue = 0x0C; /**< Message value of the logical segment/logical type Connection Point */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeAttributeIdMessageValue = 0x10; /**< Message value of the logical segment/logical type Attribute ID */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeSpecialMessageValue = 0x14; /**< Message value of the logical segment/logical type Special */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeServiceIdMessageValue = 0x18; /**< Message value of the logical segment/logical type Service ID */
|
|
|
-const unsigned int kLogicalSegmentLogicalTypeExtendedLogicalMessageValue = 0x1C; /**< Message value of the logical segment/logical type Extended Logical */
|
|
|
-
|
|
|
-const unsigned int kLogicalSegmentLogicalFormatEightBitMessageValue = 0x00;
|
|
|
-const unsigned int kLogicalSegmentLogicalFormatSixteenBitMessageValue = 0x01;
|
|
|
-const unsigned int kLogicalSegmentLogicalFormatThirtyTwoBitMessageValue = 0x02;
|
|
|
-
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeReservedMessageValue = 0x00;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeArrayIndexMessageValue = 0x01;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeIndirectArrayIndexMessageValue = 0x02;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeBitIndexMessageValue = 0x03;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeIndirectBitIndexMessageValue = 0x04;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeStructureMemberNumberMessageValue = 0x05;
|
|
|
-const unsigned int kLogicalSegmentLogicalExtendedTypeStructureMemberHandleMessageValue = 0x06;
|
|
|
-
|
|
|
-const unsigned int kLogicalSegmentSpecialTypeLogicalFormatElectronicKeyMessageValue = 0x00;
|
|
|
-
|
|
|
-const unsigned int kNetworkSegmentSubtypeScheduleSegmentMessageValue = 0x01;
|
|
|
-const unsigned int kNetworkSegmentSubtypeFixedTagSegmentMessageValue = 0x02;
|
|
|
-const unsigned int kNetworkSegmentSubtypeProductionInhibitTimeInMillisecondsMessageValue = 0x03;
|
|
|
-const unsigned int kNetworkSegmentSubtypeSafetySegmentMessageValue = 0x04;
|
|
|
-const unsigned int kNetworkSegmentSubtypeProductionInhibitTimeInMicrosecondsMessageValue = 0x10;
|
|
|
-const unsigned int kNetworkSegmentSubtypeExtendedNetworkSegmentMessageValue = 0x1F;
|
|
|
+#define SEGMENT_TYPE_PORT_SEGMENT_MESSAGE_VALUE 0x00 /**< Message value of the Port segment */
|
|
|
+#define SEGMENT_TYPE_LOGICAL_SEGMENT_MESSAGE_VALUE 0x20 /**< Message value of the Logical segment */
|
|
|
+#define SEGMENT_TYPE_NETWORK_SEGMENT_MESSAGE_VALUE 0x40 /**< Message value of the Network segment */
|
|
|
+#define SEGMENT_TYPE_SYMBOLIC_SEGMENT_MESSAGE_VALUE 0x60 /**< Message value of the Symbolic segment */
|
|
|
+#define SEGMENT_TYPE_DATA_SEGMENT_MESSAGE_VALUE 0x80 /**< Message value of the Data segment */
|
|
|
+#define SEGMENT_TYPE_DATA_TYPE_CONSTRUCTED_MESSAGE_VALUE 0xA0 /**< Message value of the Data type constructed */
|
|
|
+#define SEGMENT_TYPE_DATA_TYPE_ELEMENTARTY_MESSAGE_VALUE 0xC0 /**< Message value of the Data type elementary */
|
|
|
+#define SEGMENT_TYPE_SEGMENT_RESERVED_MESSAGE_VALUE 0xE0 /**< Reserved value */
|
|
|
+
|
|
|
+#define LOGICAL_SEGMENT_TYPE_CLASS_ID_MESSAGE_VALUE 0x00 /**< Message value of the logical segment/logical type Class ID */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_INSTANCE_ID_MESSAGE_VALUE 0x04 /**< Message value of the logical segment/logical type Instance ID */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_MEMBER_ID_MESSAGE_VALUE 0x08 /**< Message value of the logical segment/logical type Member ID */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_CONNECTION_POINT_MESSAGE_VALUE 0x0C /**< Message value of the logical segment/logical type Connection Point */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_ATTRIBUTE_ID_MESSAGE_VALUE 0x10 /**< Message value of the logical segment/logical type Attribute ID */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_SPECIAL_MESSAGE_VALUE 0x14 /**< Message value of the logical segment/logical type Special */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_SERVICE_ID_MESSAGE_VALUE 0x18 /**< Message value of the logical segment/logical type Service ID */
|
|
|
+#define LOGICAL_SEGMENT_TYPE_EXTENDED_LOGICAL_MESSAGE_VALUE 0x1C /**< Message value of the logical segment/logical type Extended Logical */
|
|
|
+
|
|
|
+#define LOGICAL_SEGMENT_FORMAT_EIGHT_BIT_MESSAGE_VALUE 0x00
|
|
|
+#define LOGICAL_SEGMENT_FORMAT_SIXTEEN_BIT_MESSAGE_VALUE 0x01
|
|
|
+#define LOGICAL_SEGMENT_FORMAT_THIRTY_TWO_BIT_MESSAGE_VALUE 0x02
|
|
|
+
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_RESERVED_MESSAGE_VALUE 0x00
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_ARRAY_INDEX_MESSAGE_VALUE 0x01
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_INDIRECT_ARRAY_INDEX_MESSAGE_VALUE 0x02
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_BIT_INDEX_MESSAGE_VALUE 0x03
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_INDIRECT_BIT_INDEX_MESSAGE_VALUE 0x04
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_STRUCTURE_MEMBER_NUMBER_MESSAGE_VALUE 0x05
|
|
|
+#define LOGICAL_SEGMENT_EXTENDED_TYPE_STRUCTURE_MEMBER_HANDLE_MESSAGE_VALUE 0x06
|
|
|
+
|
|
|
+#define LOGICAL_SEGMENT_SPECIAL_TYPE_FORMAT_ELECTRONIC_KEY_MESSAGE_VALUE 0x00
|
|
|
+
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_SCHEDULE_MESSAGE_VALUE 0x01
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_FIXED_TAG_MESSAGE_VALUE 0x02
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_PRODUCTION_INHIBIT_TIME_IN_MILLISECONDS_MESSAGE_VALUE 0x03
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_SAFETY_MESSAGE_VALUE 0x04
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_PRODUCTION_INHIBIT_TIME_IN_MICROSECONDS_MESSAGE_VALUE 0x10
|
|
|
+#define NETWORK_SEGMENT_SUBTYPE_EXTENDED_NETWORK_MESSAGE_VALUE 0x1F
|
|
|
|
|
|
typedef enum {
|
|
|
kElectronicKeySegmentFormatReserved,
|
|
|
kElectronicKeySegmentFormatKeyFormat4
|
|
|
} ElectronicKeySegmentFormat;
|
|
|
|
|
|
-const unsigned int kElectronicKeySegmentFormatKeyFormat4MessageValue = 0x04;
|
|
|
+#define ELECTRONIC_KEY_SEGMENT_KEY_FORMAT_4_MESSAGE_VALUE 0x04
|
|
|
|
|
|
typedef enum {
|
|
|
kDataSegmentSubtypeReserved,
|
|
|
@@ -66,39 +68,39 @@ typedef enum {
|
|
|
kDataSegmentSubtypeANSIExtendedSymbol
|
|
|
} DataSegmentSubtype;
|
|
|
|
|
|
-const unsigned int kDataSegmentSubtypeSimpleDataMessageValue = 0x00;
|
|
|
-const unsigned int kDataSegmentSubtypeANSIExtendedSymbolMessageValue = 0x11;
|
|
|
+#define DATA_SEGMENT_SUBTYPE_SIMPLE_DATA_MESSAGE_VALUE 0x00
|
|
|
+#define DATA_SEGMENT_SUBTYPE_ANSI_EXTENDED_SYMBOL_MESSAGE_VALUE 0x11
|
|
|
|
|
|
|
|
|
|
|
|
/*** Path Segment ***/
|
|
|
-SegmentType GetPathSegementType(const char *const cip_path) {
|
|
|
+SegmentType GetPathSegmentType(const char *const cip_path) {
|
|
|
const unsigned int kSegmentTypeMask = 0xE0;
|
|
|
- const unsigned int segment_type = cip_path & kSegmentTypeMask;
|
|
|
+ const unsigned int segment_type = *cip_path & kSegmentTypeMask;
|
|
|
SegmentType result = kSegmentTypeReserved;
|
|
|
switch (segment_type) {
|
|
|
- case kSegmentTypePortSegmentMessageValue:
|
|
|
+ case SEGMENT_TYPE_PORT_SEGMENT_MESSAGE_VALUE:
|
|
|
result = kSegmentTypePortSegment;
|
|
|
break;
|
|
|
- case kSegmentTypeLogicalSegmentMessageValue:
|
|
|
+ case SEGMENT_TYPE_LOGICAL_SEGMENT_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeLogicalSegment;
|
|
|
break;
|
|
|
- case kSegmentTypeNetworkSegmentMessageValue:
|
|
|
+ case SEGMENT_TYPE_NETWORK_SEGMENT_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeNetworkSegment;
|
|
|
break;
|
|
|
- case kSegmentTypeSymbolicSegmentMessageValue:
|
|
|
+ case SEGMENT_TYPE_SYMBOLIC_SEGMENT_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeSymbolicSegment;
|
|
|
break;
|
|
|
- case kSegmentTypeDataSegmentMessageValue:
|
|
|
+ case SEGMENT_TYPE_DATA_SEGMENT_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeDataSegment;
|
|
|
break;
|
|
|
- case kSegmentTypeDataTypeConstructedMessageValue:
|
|
|
+ case SEGMENT_TYPE_DATA_TYPE_CONSTRUCTED_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeDataTypeConstructed;
|
|
|
break;
|
|
|
- case kSegmentTypeDataTypeElementaryMessageValue:
|
|
|
+ case SEGMENT_TYPE_DATA_TYPE_ELEMENTARTY_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeDataTypeElementary;
|
|
|
break;
|
|
|
- case kSegmentTypeSegmentTypeReservedMessageValue:
|
|
|
+ case SEGMENT_TYPE_SEGMENT_RESERVED_MESSAGE_VALUE:
|
|
|
result = kSegmentTypeReserved;
|
|
|
break;
|
|
|
default:
|
|
|
@@ -109,31 +111,31 @@ SegmentType GetPathSegementType(const char *const cip_path) {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-void SetPathSegementType(SegmentType segment_type, char *const cip_path) {
|
|
|
+void SetPathSegmentType(SegmentType segment_type, char *const cip_path) {
|
|
|
switch (segment_type) {
|
|
|
case kSegmentTypePortSegment:
|
|
|
- cip_path |= kSegmentTypePortSegmentMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_PORT_SEGMENT_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeLogicalSegment:
|
|
|
- cip_path |= kSegmentTypeLogicalSegmentMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_LOGICAL_SEGMENT_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeNetworkSegment:
|
|
|
- cip_path |= kSegmentTypeNetworkSegmentMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_NETWORK_SEGMENT_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeSymbolicSegment:
|
|
|
- cip_path |= kSegmentTypeSymbolicSegmentMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_SYMBOLIC_SEGMENT_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeDataSegment:
|
|
|
- cip_path |= kSegmentTypeDataSegmentMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_DATA_SEGMENT_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeDataTypeConstructed:
|
|
|
- cip_path |= kSegmentTypeDataTypeConstructedMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_DATA_TYPE_CONSTRUCTED_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeDataTypeElementary:
|
|
|
- cip_path |= kSegmentTypeDataTypeElementaryMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_DATA_TYPE_ELEMENTARTY_MESSAGE_VALUE;
|
|
|
break;
|
|
|
case kSegmentTypeReserved:
|
|
|
- cip_path |= kSegmentTypeSegmentTypeReservedMessageValue;
|
|
|
+ *cip_path |= SEGMENT_TYPE_SEGMENT_RESERVED_MESSAGE_VALUE;
|
|
|
break;
|
|
|
default:
|
|
|
OPENER_ASSERT(
|
|
|
@@ -142,9 +144,9 @@ void SetPathSegementType(SegmentType segment_type, char *const cip_path) {
|
|
|
}
|
|
|
|
|
|
/*** Port Segment ***/
|
|
|
-bool GetPathPortSegementExtendedLinkAddressSizeBit(const char *const cip_path) {
|
|
|
+bool GetPathPortSegmentExtendedLinkAddressSizeBit(const char *const cip_path) {
|
|
|
const unsigned int kExtendedLinkAddressSizeMask = 0x10;
|
|
|
- if (kExtendedLinkAddressSizeMask == cip_path & kExtendedLinkAddressSizeMask) {
|
|
|
+ if (kExtendedLinkAddressSizeMask == (*cip_path & kExtendedLinkAddressSizeMask) ) {
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
@@ -152,31 +154,34 @@ bool GetPathPortSegementExtendedLinkAddressSizeBit(const char *const cip_path) {
|
|
|
|
|
|
unsigned int GetPathPortSegmentPortIdentifier(const char *const cip_path) {
|
|
|
const unsigned int kPortIdentifierMask = 0x0F;
|
|
|
- unsigned int port_identifier = cip_path & kPortIdentifierMask;
|
|
|
- OPENER_ASSERT(0 != port_identifier, "Use of reserved port identifier 0\n");
|
|
|
+ unsigned int port_identifier = *cip_path & kPortIdentifierMask;
|
|
|
+// OPENER_ASSERT(0 != port_identifier, "Use of reserved port identifier 0\n");
|
|
|
+ OPENER_ASSERT(0 != port_identifier);
|
|
|
return port_identifier;
|
|
|
}
|
|
|
|
|
|
void SetPathPortSegmentPortIdentifier(const unsigned int port_identifier,
|
|
|
char *const cip_path) {
|
|
|
- OPENER_ASSERT(
|
|
|
- port_identifier < 16,
|
|
|
- "Port identifier too large for standard port identifier field\n");
|
|
|
+// OPENER_ASSERT(
|
|
|
+// port_identifier < 16,
|
|
|
+// "Port identifier too large for standard port identifier field\n");
|
|
|
+ OPENER_ASSERT(port_identifier < 16);
|
|
|
|
|
|
}
|
|
|
|
|
|
-unsigned int GetPathPortSegementLinkAddressSize(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(
|
|
|
- false == GetPathPortSegementExtendedLinkAddressSizeBit(cip_path),
|
|
|
- "Call to non existent extended link address size\n");
|
|
|
+unsigned int GetPathPortSegmentLinkAddressSize(const char *const cip_path) {
|
|
|
+// OPENER_ASSERT(false == GetPathPortSegmentExtendedLinkAddressSizeBit(cip_path),
|
|
|
+// "Call to non existent extended link address size\n");
|
|
|
+ OPENER_ASSERT(false == GetPathPortSegmentExtendedLinkAddressSizeBit(cip_path));
|
|
|
return *(cip_path + 1);
|
|
|
}
|
|
|
|
|
|
unsigned int GetPathPortSegmentExtendedPortNumber(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kPortSegmentExtendedPort == GetPathPortSegmentPortIdentifier,
|
|
|
- "There is no extended port available!\n");
|
|
|
+// OPENER_ASSERT(kPortSegmentExtendedPort == GetPathPortSegmentPortIdentifier(cip_path),
|
|
|
+// "There is no extended port available!\n");
|
|
|
+ OPENER_ASSERT(kPortSegmentExtendedPort == GetPathPortSegmentPortIdentifier(cip_path));
|
|
|
const unsigned int kExtendedPortSegmentPosition =
|
|
|
- GetPathPortSegementExtendedLinkAddressSizeBit(cip_path) == true ? 3 : 2;
|
|
|
+ GetPathPortSegmentExtendedLinkAddressSizeBit(cip_path) == true ? 3 : 2;
|
|
|
return cip_path[kExtendedPortSegmentPosition]
|
|
|
+ (cip_path[kExtendedPortSegmentPosition + 1] << 8);
|
|
|
}
|
|
|
@@ -185,11 +190,11 @@ void SetPathPortSegmentExtendedPortIdentifier(
|
|
|
const unsigned int extended_port_identifier, char *const cip_path) {
|
|
|
SetPathPortSegmentPortIdentifier(kPortSegmentExtendedPort, cip_path);
|
|
|
const unsigned int kExtendedPortSegmentPosition =
|
|
|
- GetPathPortSegementExtendedLinkAddressSizeBit(cip_path) == true ? 3 : 2;
|
|
|
- cip_path[kExtendedPortSegmentPosition] = (char*) (extended_port_identifier
|
|
|
+ GetPathPortSegmentExtendedLinkAddressSizeBit(cip_path) == true ? 3 : 2;
|
|
|
+ cip_path[kExtendedPortSegmentPosition] = (char) (extended_port_identifier
|
|
|
& 0x00FF);
|
|
|
cip_path[kExtendedPortSegmentPosition + 1] =
|
|
|
- (char*) ((extended_port_identifier & 0xFF00) >> 8);
|
|
|
+ (char) ((extended_port_identifier & 0xFF00) >> 8);
|
|
|
}
|
|
|
/*** Port Segment ***/
|
|
|
|
|
|
@@ -201,28 +206,28 @@ LogicalSegmentLogicalType GetPathLogicalSegmentLogicalType(
|
|
|
const unsigned int logical_type = (*cip_path) & kLogicalTypeMask;
|
|
|
LogicalSegmentLogicalType result = kLogicalSegmentLogicalTypeExtendedLogical;
|
|
|
switch (logical_type) {
|
|
|
- case kLogicalSegmentLogicalTypeClassIdMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_CLASS_ID_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeClassId;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeInstanceIdMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_INSTANCE_ID_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeInstanceId;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeMemberIdMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_MEMBER_ID_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeMemberId;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeConnectionPointMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_CONNECTION_POINT_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeConnectionPoint;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeAttributeIdMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_ATTRIBUTE_ID_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeAttributeId;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeSpecialMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_SPECIAL_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeSpecial;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeServiceIdMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_SERVICE_ID_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeServiceId;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalTypeExtendedLogicalMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_TYPE_EXTENDED_LOGICAL_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalTypeExtendedLogical;
|
|
|
break;
|
|
|
default:
|
|
|
@@ -239,13 +244,13 @@ LogicalSegmentLogicalFormat GetPathLogicalSegmentLogicalFormat(
|
|
|
const unsigned int logical_format = (*cip_path) & kLogicalFormatMask;
|
|
|
LogicalSegmentLogicalFormat result = kLogicalSegmentLogicalFormatEightBit;
|
|
|
switch (logical_format) {
|
|
|
- case kLogicalSegmentLogicalFormatEightBitMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_FORMAT_EIGHT_BIT_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalFormatEightBit;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalFormatSixteenBitMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_FORMAT_SIXTEEN_BIT_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalFormatSixteenBit;
|
|
|
break;
|
|
|
- case kLogicalSegmentLogicalFormatThirtyTwoBitMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_FORMAT_THIRTY_TWO_BIT_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentLogicalFormatThirtyTwoBit;
|
|
|
break;
|
|
|
default:
|
|
|
@@ -257,30 +262,32 @@ LogicalSegmentLogicalFormat GetPathLogicalSegmentLogicalFormat(
|
|
|
}
|
|
|
|
|
|
LogicalSegmentExtendedLogicalType GetPathLogicalSegmentExtendedLogicalType(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kLogicalSegmentLogicalTypeExtendedLogicalMessageValue == GetPathLogicalSegmentLogicalType(cip_path),
|
|
|
- "Trying to extract non-existent extended logical type");
|
|
|
- const char extended_logical_type = *(cip_path + 1);
|
|
|
+// OPENER_ASSERT(LOGICAL_SEGMENT_TYPE_EXTENDED_kLogicalSegmentLogicalTypeExtendedLogicalMessageValue == GetPathLogicalSegmentLogicalType(cip_path),
|
|
|
+// "Trying to extract non-existent extended logical type");
|
|
|
+ OPENER_ASSERT(LOGICAL_SEGMENT_TYPE_EXTENDED_LOGICAL_MESSAGE_VALUE == GetPathLogicalSegmentLogicalType(cip_path));
|
|
|
+ const unsigned int extended_logical_type = *(cip_path + 1);
|
|
|
LogicalSegmentExtendedLogicalType result = kLogicalSegmentExtendedLogicalTypeReserved;
|
|
|
switch(extended_logical_type) {
|
|
|
- case kLogicalSegmentLogicalExtendedTypeArrayIndexMessageValue: result = kLogicalSegmentExtendedLogicalTypeArrayIndex; break;
|
|
|
- case kLogicalSegmentLogicalExtendedTypeIndirectArrayIndexMessageValue: result = kLogicalSegmentExtendedLogicalTypeIndirectArrayIndex; break;
|
|
|
- case kLogicalSegmentLogicalExtendedTypeBitIndexMessageValue: result = kLogicalSegmentExtendedLogicalTypeBitIndex; break;
|
|
|
- case kLogicalSegmentLogicalExtendedTypeIndirectBitIndexMessageValue: result = kLogicalSegmentExtendedLogicalTypeIndirectBitIndex; break;
|
|
|
- case kLogicalSegmentLogicalExtendedTypeStructureMemberNumberMessageValue: result = kLogicalSegmentExtendedLogicalTypeStructureMemberNumber; break;
|
|
|
- case kLogicalSegmentLogicalExtendedTypeStructureMemberHandleMessageValue: result = kLogicalSegmentExtendedLogicalTypeStructureMemberHandle; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_ARRAY_INDEX_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeArrayIndex; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_INDIRECT_ARRAY_INDEX_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeIndirectArrayIndex; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_BIT_INDEX_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeBitIndex; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_INDIRECT_BIT_INDEX_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeIndirectBitIndex; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_STRUCTURE_MEMBER_NUMBER_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeStructureMemberNumber; break;
|
|
|
+ case LOGICAL_SEGMENT_EXTENDED_TYPE_STRUCTURE_MEMBER_HANDLE_MESSAGE_VALUE: result = kLogicalSegmentExtendedLogicalTypeStructureMemberHandle; break;
|
|
|
default: result = kLogicalSegmentExtendedLogicalTypeReserved;
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
LogicalSegmentSpecialTypeLogicalFormat GetPathLogicalSegmentSpecialTypeLogicalType(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kSegmentTypeLogicalSegment == GetPathSegementType(cip_path), "Not a logical segment!\n");
|
|
|
+// OPENER_ASSERT(kSegmentTypeLogicalSegment == GetPathSegmentType(cip_path), "Not a logical segment!\n");
|
|
|
+ OPENER_ASSERT(kSegmentTypeLogicalSegment == GetPathSegmentType(cip_path));
|
|
|
const unsigned int kLogicalFormatMask = 0x03;
|
|
|
const unsigned int logical_format = (*cip_path) & kLogicalFormatMask;
|
|
|
|
|
|
LogicalSegmentSpecialTypeLogicalFormat result = kLogicalSegmentSpecialTypeLogicalFormatReserved;
|
|
|
switch(logical_format) {
|
|
|
- case kLogicalSegmentSpecialTypeLogicalFormatElectronicKeyMessageValue:
|
|
|
+ case LOGICAL_SEGMENT_SPECIAL_TYPE_FORMAT_ELECTRONIC_KEY_MESSAGE_VALUE:
|
|
|
result = kLogicalSegmentSpecialTypeLogicalFormatElectronicKey; break;
|
|
|
default: result = kLogicalSegmentSpecialTypeLogicalFormatReserved; break;
|
|
|
}
|
|
|
@@ -288,28 +295,32 @@ LogicalSegmentSpecialTypeLogicalFormat GetPathLogicalSegmentSpecialTypeLogicalTy
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-ElectronicKeySegmentFormat *GetPathLogicalSegmentElectronicKeyFormat(const char *const cip_path) {
|
|
|
+ElectronicKeySegmentFormat GetPathLogicalSegmentElectronicKeyFormat(const char *const cip_path) {
|
|
|
+// OPENER_ASSERT(kLogicalSegmentSpecialTypeLogicalFormatElectronicKey ==
|
|
|
+// GetPathLogicalSegmentSpecialTypeLogicalType(cip_path), "Not an electronic key!\n");
|
|
|
OPENER_ASSERT(kLogicalSegmentSpecialTypeLogicalFormatElectronicKey ==
|
|
|
- GetPathLogicalSegmentSpecialTypeLogicalType(cip_path), "Not an electronic key!\n");
|
|
|
+ GetPathLogicalSegmentSpecialTypeLogicalType(cip_path));
|
|
|
ElectronicKeySegmentFormat result = kElectronicKeySegmentFormatReserved;
|
|
|
switch(*(cip_path + 1)) {
|
|
|
- case kElectronicKeySegmentFormatKeyFormat4MessageValue: result = kElectronicKeySegmentFormatKeyFormat4; break;
|
|
|
+ case ELECTRONIC_KEY_SEGMENT_KEY_FORMAT_4_MESSAGE_VALUE: result = kElectronicKeySegmentFormatKeyFormat4; break;
|
|
|
default: result = kElectronicKeySegmentFormatReserved; break;
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
ElectronicKeyFormat4 *GetPathLogicalSegmentElectronicKeyFormat4(const char *const cip_path) {
|
|
|
+// OPENER_ASSERT(kElectronicKeySegmentFormatKeyFormat4 ==
|
|
|
+// GetPathLogicalSegmentElectronicKeyFormat(cip_path), "Not electronic key format 4!\n");
|
|
|
OPENER_ASSERT(kElectronicKeySegmentFormatKeyFormat4 ==
|
|
|
- GetPathLogicalSegmentElectronicKeyFormat(cip_path), "Not electronic key format 4!\n");
|
|
|
+ GetPathLogicalSegmentElectronicKeyFormat(cip_path));
|
|
|
|
|
|
const char *message_runner = (const char *)cip_path;
|
|
|
- ElectronicKeyFormat4 *result = calloc(sizeof(ElectronicKeySegmentFormat));
|
|
|
+ ElectronicKeyFormat4 *result = calloc(1, sizeof(ElectronicKeySegmentFormat));
|
|
|
SetElectronicKeyFormat4VendorId(GetIntFromMessage(&message_runner), result);
|
|
|
SetElectronicKeyFormat4DeviceType(GetIntFromMessage(&message_runner), result);
|
|
|
SetElectronicKeyFormat4ProductCode(GetIntFromMessage(&message_runner), result);
|
|
|
SetElectronicKeyFormat4MajorRevisionCompatibility(GetSintFromMessage(&message_runner), result);
|
|
|
- SetElectronicKeyFormat4MinorRevision(GetSIntFromMessage(&message_runner), result);
|
|
|
+ SetElectronicKeyFormat4MinorRevision(GetSintFromMessage(&message_runner), result);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -329,15 +340,15 @@ NetworkSegmentSubType GetPathNetworkSegmentSubtype(const char *const cip_path) {
|
|
|
const unsigned int subtype = (*cip_path) & kSubtypeMask;
|
|
|
NetworkSegmentSubType result = kNetworkSegmentSubtypeReserved;
|
|
|
switch(subtype) {
|
|
|
- case kNetworkSegmentSubtypeScheduleSegmentMessageValue:
|
|
|
+ case NETWORK_SEGMENT_SUBTYPE_SCHEDULE_MESSAGE_VALUE:
|
|
|
result = kNetworkSegmentSubtypeScheduleSegment; break;
|
|
|
- case kNetworkSegmentSubtypeFixedTagSegmentMessageValue:
|
|
|
+ case NETWORK_SEGMENT_SUBTYPE_FIXED_TAG_MESSAGE_VALUE:
|
|
|
result = kNetworkSegmentSubtypeFixedTagSegment; break;
|
|
|
- case kNetworkSegmentSubtypeProductionInhibitTimeInMillisecondsMessageValue:
|
|
|
+ case NETWORK_SEGMENT_SUBTYPE_PRODUCTION_INHIBIT_TIME_IN_MILLISECONDS_MESSAGE_VALUE:
|
|
|
result = kNetworkSegmentSubtypeProductionInhibitTimeInMilliseconds; break;
|
|
|
- case kNetworkSegmentSubtypeSafetySegmentMessageValue:
|
|
|
+ case NETWORK_SEGMENT_SUBTYPE_SAFETY_MESSAGE_VALUE:
|
|
|
result = kNetworkSegmentSubtypeSafetySegment; break;
|
|
|
- case kNetworkSegmentSubtypeProductionInhibitTimeInMicrosecondsMessageValue:
|
|
|
+ case NETWORK_SEGMENT_SUBTYPE_PRODUCTION_INHIBIT_TIME_IN_MICROSECONDS_MESSAGE_VALUE:
|
|
|
result = kNetworkSegmentSubtypeProductionInhibitTimeInMicroseconds; break;
|
|
|
default: result = kNetworkSegmentSubtypeReserved; break;
|
|
|
}
|
|
|
@@ -352,9 +363,11 @@ NetworkSegmentSubType GetPathNetworkSegmentSubtype(const char *const cip_path) {
|
|
|
* @return the Production Inhibit Time in milliseconds ranging from 0 to 255
|
|
|
*/
|
|
|
CipUsint GetPathNetworkSegmentProductionInhibitTimeInMilliseconds(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegementType(cip_path),"Not a network segment!\n");
|
|
|
- OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMilliseconds == GetPathNetworkSegmentSubtype(cip_path),
|
|
|
- "Not a Production Inhibit Time milliseconds segment!\n");
|
|
|
+// OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegmentType(cip_path),"Not a network segment!\n");
|
|
|
+// OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMilliseconds == GetPathNetworkSegmentSubtype(cip_path),
|
|
|
+// "Not a Production Inhibit Time milliseconds segment!\n");
|
|
|
+ OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegmentType(cip_path));
|
|
|
+ OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMilliseconds == GetPathNetworkSegmentSubtype(cip_path));
|
|
|
return *(cip_path + 1);
|
|
|
}
|
|
|
|
|
|
@@ -365,10 +378,15 @@ CipUsint GetPathNetworkSegmentProductionInhibitTimeInMilliseconds(const char *co
|
|
|
* @return the Production Inhibit Time in microseconds ranging from 0 to 4294967295
|
|
|
*/
|
|
|
CipUdint GetPathNetworkSegmentProductionInhibitTimeInMicroseconds(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegementType(cip_path),"Not a network segment!\n");
|
|
|
- OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMicroseconds == GetPathNetworkSegmentSubtype(cip_path),
|
|
|
- "Not a Production Inhibit Time microseconds segment!\n");
|
|
|
- OPENER_ASSERT(2 == *(cip_path + 1), "Data Words length is incorrect! See CIP Spec Vol.1 C-1.4.3.3.2\n");
|
|
|
+// OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegmentType(cip_path),"Not a network segment!\n");
|
|
|
+// OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMicroseconds == GetPathNetworkSegmentSubtype(cip_path),
|
|
|
+// "Not a Production Inhibit Time microseconds segment!\n");
|
|
|
+// OPENER_ASSERT(2 == *(cip_path + 1), "Data Words length is incorrect! See CIP Spec Vol.1 C-1.4.3.3.2\n");
|
|
|
+
|
|
|
+ OPENER_ASSERT(kSegmentTypeNetworkSegment == GetPathSegmentType(cip_path));
|
|
|
+ OPENER_ASSERT(kNetworkSegmentSubtypeProductionInhibitTimeInMicroseconds == GetPathNetworkSegmentSubtype(cip_path));
|
|
|
+ OPENER_ASSERT(2 == *(cip_path + 1));
|
|
|
+
|
|
|
const char *message_runner = cip_path;
|
|
|
return GetDintFromMessage(&message_runner);
|
|
|
}
|
|
|
@@ -389,9 +407,9 @@ DataSegmentSubtype GetPathDataSegmentSubtype(const char *const cip_path) {
|
|
|
|
|
|
DataSegmentSubtype result = kDataSegmentSubtypeReserved;
|
|
|
switch(data_subtype) {
|
|
|
- case kDataSegmentSubtypeSimpleDataMessageValue:
|
|
|
+ case DATA_SEGMENT_SUBTYPE_SIMPLE_DATA_MESSAGE_VALUE:
|
|
|
result = kDataSegmentSubtypeSimpleData; break;
|
|
|
- case kDataSegmentSubtypeANSIExtendedSymbolMessageValue:
|
|
|
+ case DATA_SEGMENT_SUBTYPE_ANSI_EXTENDED_SYMBOL_MESSAGE_VALUE:
|
|
|
result = kDataSegmentSubtypeANSIExtendedSymbol; break;
|
|
|
default: result = kDataSegmentSubtypeReserved; break;
|
|
|
}
|
|
|
@@ -403,9 +421,12 @@ DataSegmentSubtype GetPathDataSegmentSubtype(const char *const cip_path) {
|
|
|
* @param cip_path Pointer to the start of the EPath message
|
|
|
* @return The amount of 16-bit words of data in the EPath
|
|
|
*/
|
|
|
-CipUsint GetPathDataSegmentSimpleDataWordLength(const char *const cip_path) {
|
|
|
- OPENER_ASSERT(kSegmentTypeDataSegment == GetPathSegementType(cip_path),"Not a data segment!\n");
|
|
|
- OPENER_ASSERT(kDataSegmentSubtypeSimpleData == GetPathDataSegmentSubtype(cip_path), "Not a simple data segment!\n");
|
|
|
+CipUsint GetPathDataSegmentSimpleDataWordLength(const char * const cip_path) {
|
|
|
+// OPENER_ASSERT(kSegmentTypeDataSegment == GetPathSegmentType(cip_path),"Not a data segment!\n");
|
|
|
+// OPENER_ASSERT(kDataSegmentSubtypeSimpleData == GetPathDataSegmentSubtype(cip_path), "Not a simple data segment!\n");
|
|
|
+ OPENER_ASSERT(kSegmentTypeDataSegment == GetPathSegmentType(cip_path));
|
|
|
+ OPENER_ASSERT(
|
|
|
+ kDataSegmentSubtypeSimpleData == GetPathDataSegmentSubtype(cip_path));
|
|
|
|
|
|
const char *message_runner = cip_path;
|
|
|
return GetSintFromMessage(&message_runner);
|