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

Adds GetConnectionObjectTransportTriggerProductionTrigger

Signed-off-by: Martin Melik Merkumians <melik-merkumians@acin.tuwien.ac.at>
Martin Melik Merkumians 8 лет назад
Родитель
Сommit
04c28f5330

+ 14 - 1
source/src/cip/cipconnectionobject.c

@@ -18,6 +18,10 @@
 #define CIP_CONNECTION_OBJECT_INSTANCE_TYPE_IO 1
 #define CIP_CONNECTION_OBJECT_INSTANCE_TYPE_CIP_BRIDGED 2
 
+#define CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_CYCLIC (0 << 4)
+#define CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_CHANGE_OF_STATE (1 << 4)
+#define CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_APPLICATION_OBJECT (2 << 4)
+
 ConnectionObjectState GetConnectionObjectState(
   const CipConnectionObject *const connection_object) {
   switch(connection_object->state) {
@@ -47,7 +51,6 @@ ConnectionObjectInstanceType GetConnectionObjectInstanceType(
 	case CIP_CONNECTION_OBJECT_INSTANCE_TYPE_CIP_BRIDGED: return kConnectionObjectInstanceTypeCipBridged; break;
 	default: return kConnectionObjectInstanceTypeInvalid;
 	}
-
 }
 
 ConnectionObjectTransportClassTriggerDirection
@@ -60,3 +63,13 @@ GetConnectionObjectTransportClassTriggerDirection(
          kConnectionObjectTransportClassTriggerDirectionServer
          : kConnectionObjectTransportClassTriggerDirectionClient;
 }
+
+ConnectionObjectTransportClassTriggerProductionTrigger GetConnectionObjectTransportClassTriggerProductionTrigger(const CipConnectionObject *const connection_object) {
+const CipByte kTransportClassTriggerProductionTriggerMask = 0x70;
+switch( (connection_object->transport_class_trigger) & kTransportClassTriggerProductionTriggerMask) {
+case CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_CYCLIC: return kConnectionObjectTransportClassTriggerProductionTriggerCyclic; break;
+case CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_CHANGE_OF_STATE: return kConnectionObjectTransportClassTriggerProductionTriggerChangeOfState; break;
+case CIP_CONNECTION_OBJECT_TRANSPORT_CLASS_TRIGGER_PRODUCTION_TRIGGER_APPLICATION_OBJECT: return kConnectionObjectTransportClassTriggerProductionTriggerApplicationObject; break;
+default: return kConnectionObjectTransportClassTriggerProductionTriggerInvalid;
+}
+}

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

@@ -81,4 +81,6 @@ ConnectionObjectTransportClassTriggerDirection
 GetConnectionObjectTransportClassTriggerDirection(
   const CipConnectionObject *const connection_object);
 
+ConnectionObjectTransportClassTriggerProductionTrigger GetConnectionObjectTransportClassTriggerProductionTrigger(const CipConnectionObject *const connection_object);
+
 #endif /* SRC_CIP_CIPCONNECTIONOBJECT_H_ */

+ 42 - 0
source/tests/cip/cipconnectionobjecttest.cpp

@@ -101,3 +101,45 @@ TEST(CipConnectionObject, InstanceTypeCipBridged) {
 	ConnectionObjectInstanceType type = GetConnectionObjectInstanceType(&connection_object);
 	CHECK_EQUAL(kConnectionObjectInstanceTypeCipBridged, type);
 }
+
+TEST(CipConnectionObject, TransportClassTriggerDirectionServer) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 0x80;
+	ConnectionObjectTransportClassTriggerDirection direction = GetConnectionObjectTransportClassTriggerDirection(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerDirectionServer, direction);
+}
+
+TEST(CipConnectionObject, TransportClassTriggerDirectionClient) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 0x00;
+	ConnectionObjectTransportClassTriggerDirection direction = GetConnectionObjectTransportClassTriggerDirection(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerDirectionClient, direction);
+}
+
+TEST(CipConnectionObject, TransportClassTriggerProductionTriggerInvalid) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 3 << 4;
+	ConnectionObjectTransportClassTriggerProductionTrigger production_trigger = GetConnectionObjectTransportClassTriggerProductionTrigger(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerInvalid, production_trigger);
+}
+
+TEST(CipConnectionObject, TransportClassTriggerProductionTriggerCyclic) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 0x00;
+	ConnectionObjectTransportClassTriggerProductionTrigger production_trigger = GetConnectionObjectTransportClassTriggerProductionTrigger(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerCyclic, production_trigger);
+}
+
+TEST(CipConnectionObject, TransportClassTriggerProductionTriggerChangeOfState) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 1 << 4;
+	ConnectionObjectTransportClassTriggerProductionTrigger production_trigger = GetConnectionObjectTransportClassTriggerProductionTrigger(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerChangeOfState, production_trigger);
+}
+
+TEST(CipConnectionObject, TransportClassTriggerProductionTriggerApplicationObject) {
+	CipConnectionObject connection_object = { 0 };
+	connection_object.transport_class_trigger = 2 << 4;
+	ConnectionObjectTransportClassTriggerProductionTrigger production_trigger = GetConnectionObjectTransportClassTriggerProductionTrigger(&connection_object);
+	CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerApplicationObject, production_trigger);
+}