Browse Source

Fixes connection object tests

Signed-off-by: CapXilinx <melik-merkumians@acin.tuwien.ac.at>
CapXilinx 8 years ago
parent
commit
e3ca873852

+ 1 - 1
source/buildsupport/POSIX/OpENer_PLATFORM_INCLUDES.cmake

@@ -1,6 +1,6 @@
 macro(opener_platform_spec)
   include_directories(${PORTS_SRC_DIR}/${OpENer_PLATFORM} ${PORTS_SRC_DIR}/${OpENer_PLATFORM}/sample_application)
-  set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror=implicit-function-declaration -o0" )
+  set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -Werror=implicit-function-declaration" )
   add_definitions( -D_POSIX_C_SOURCE=200112L -D__USE_GNU -D__USE_XOPEN2K)
   get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
   if ("CXX" IN_LIST languages)

+ 24 - 20
source/src/cip/cipconnectionobject.c

@@ -234,22 +234,27 @@ void ConnectionObjectSetInstanceType(
   CipConnectionObject *const connection_object,
   const ConnectionObjectInstanceType instance_type) {
 	connection_object->instance_type = instance_type;
-//  switch (connection_object->instance_type) {
-//    case kConnectionObjectInstanceTypeExplicitMessaging:
-//      connection_object->instance_type = CIP_CONNECTION_OBJECT_INSTANCE_TYPE_EXPLICIT_MESSAGING;
-//      break;
-//    case kConnectionObjectInstanceTypeIO:
-//    case kConnectionObjectInstanceTypeIOExclusiveOwner:
-//    case kConnectionObjectInstanceTypeIOInputOnly:
-//    case kConnectionObjectInstanceTypeIOListenOnly:
-//      connection_object->instance_type = CIP_CONNECTION_OBJECT_INSTANCE_TYPE_IO;
-//      break;
-//    case kConnectionObjectInstanceTypeCipBridged:
-//      connection_object->instance_type = CIP_CONNECTION_OBJECT_INSTANCE_TYPE_CIP_BRIDGED;
-//      break;
-//    default:
-//      assert(false);
-//  }
+}
+
+CipUsint ConnectionObjectGetInstanceTypeForAttribute(const CipConnectionObject *const connection_object) {
+	  switch (connection_object->instance_type) {
+	    case kConnectionObjectInstanceTypeExplicitMessaging:
+	      return CIP_CONNECTION_OBJECT_INSTANCE_TYPE_EXPLICIT_MESSAGING;
+	      break;
+	    case kConnectionObjectInstanceTypeIO:
+	    case kConnectionObjectInstanceTypeIOExclusiveOwner:
+	    case kConnectionObjectInstanceTypeIOInputOnly:
+	    case kConnectionObjectInstanceTypeIOListenOnly:
+	      return CIP_CONNECTION_OBJECT_INSTANCE_TYPE_IO;
+	      break;
+	    case kConnectionObjectInstanceTypeCipBridged:
+	      return CIP_CONNECTION_OBJECT_INSTANCE_TYPE_CIP_BRIDGED;
+	      break;
+	    default:
+	      assert(false);
+	  }
+	  assert(false); //We should never come to this point
+	  return 255;
 }
 
 bool ConnectionObjectIsTypeIOConnection(const CipConnectionObject *const connection_object) {
@@ -356,14 +361,13 @@ CipUint ConnectionObjectGetExpectedPacketRate(
 
 void ConnectionObjectSetExpectedPacketRate(
   CipConnectionObject *const connection_object) {
-  if( (connection_object->t_to_o_requested_packet_interval % (kOpenerTimerTickInMilliSeconds * 1000)) == 0 ) {
+	CipUdint remainder_to_resolution = (connection_object->t_to_o_requested_packet_interval) % (kOpenerTimerTickInMilliSeconds * 1000);
+  if( 0 == remainder_to_resolution ) { /* Value can be represented in multiples of the timer resolution */
     connection_object->expected_packet_rate = connection_object->t_to_o_requested_packet_interval / 1000;
   }
   else{
     connection_object->expected_packet_rate = connection_object->t_to_o_requested_packet_interval / 1000 +
-                                              (kOpenerTimerTickInMilliSeconds -
-                                               (connection_object->t_to_o_requested_packet_interval / 1000) %
-                                               (kOpenerTimerTickInMilliSeconds * 1000) );
+                                              ((CipUdint)kOpenerTimerTickInMilliSeconds - remainder_to_resolution / 1000);
   }
 }
 

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

@@ -217,6 +217,8 @@ void ConnectionObjectSetInstanceType(
   CipConnectionObject *const connection_object,
   const ConnectionObjectInstanceType instance_type);
 
+CipUsint ConnectionObjectGetInstanceTypeForAttribute(const CipConnectionObject *const connection_object);
+
 ConnectionObjectTransportClassTriggerDirection
 ConnectionObjectGetTransportClassTriggerDirection(
   const CipConnectionObject *const connection_object);

+ 40 - 21
source/tests/cip/cipconnectionobjecttest.cpp

@@ -74,36 +74,52 @@ TEST(CipConnectionObject, StateInvalid) {
   CHECK_EQUAL(kConnectionObjectStateInvalid, state);
 }
 
-TEST(CipConnectionObject, InstanceTypeInvalid) {
+TEST(CipConnectionObject, InstanceTypeIExplicitMessaging) {
   CipConnectionObject connection_object = { 0 };
-  connection_object.instance_type = 4;
-  ConnectionObjectInstanceType type = ConnectionObjectGetInstanceType(
+  connection_object.instance_type = kConnectionObjectInstanceTypeExplicitMessaging;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
     &connection_object);
-  CHECK_EQUAL(kConnectionObjectInstanceTypeInvalid, type);
+  CHECK_EQUAL(0, value);
 }
 
-TEST(CipConnectionObject, InstanceTypeIExplicitMessaging) {
+TEST(CipConnectionObject, InstanceTypeIO) {
   CipConnectionObject connection_object = { 0 };
-  connection_object.instance_type = 0;
-  ConnectionObjectInstanceType type = ConnectionObjectGetInstanceType(
-    &connection_object);
-  CHECK_EQUAL(kConnectionObjectInstanceTypeExplicitMessaging, type);
+  connection_object.instance_type = kConnectionObjectInstanceTypeIO;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
+      &connection_object);
+  CHECK_EQUAL(1, value);
 }
 
-TEST(CipConnectionObject, InstanceTypeIO) {
+TEST(CipConnectionObject, InstanceTypeIOExclusiveOwner) {
   CipConnectionObject connection_object = { 0 };
-  connection_object.instance_type = 1;
-  ConnectionObjectInstanceType type = ConnectionObjectGetInstanceType(
-    &connection_object);
-  CHECK_EQUAL(kConnectionObjectInstanceTypeIO, type);
+  connection_object.instance_type = kConnectionObjectInstanceTypeIOExclusiveOwner;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
+      &connection_object);
+  CHECK_EQUAL(1, value);
+}
+
+TEST(CipConnectionObject, InstanceTypeIOInputOnly) {
+  CipConnectionObject connection_object = { 0 };
+  connection_object.instance_type = kConnectionObjectInstanceTypeIOInputOnly;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
+      &connection_object);
+  CHECK_EQUAL(1, value);
+}
+
+TEST(CipConnectionObject, InstanceTypeIOListenOnly) {
+  CipConnectionObject connection_object = { 0 };
+  connection_object.instance_type = kConnectionObjectInstanceTypeIOListenOnly;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
+      &connection_object);
+  CHECK_EQUAL(1, value);
 }
 
 TEST(CipConnectionObject, InstanceTypeCipBridged) {
   CipConnectionObject connection_object = { 0 };
-  connection_object.instance_type = 2;
-  ConnectionObjectInstanceType type = ConnectionObjectGetInstanceType(
-    &connection_object);
-  CHECK_EQUAL(kConnectionObjectInstanceTypeCipBridged, type);
+  connection_object.instance_type = kConnectionObjectInstanceTypeCipBridged;
+  CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
+      &connection_object);
+  CHECK_EQUAL(2, value);
 }
 
 TEST(CipConnectionObject, TransportClassTriggerDirectionServer) {
@@ -213,7 +229,8 @@ TEST(CipConnectionObject, TransportClassTriggerClass3) {
 
 TEST(CipConnectionObject, ExpectedPacketRate) {
   CipConnectionObject connection_object = { 0 };
-  ConnectionObjectSetExpectedPacketRate(&connection_object, 11);
+  connection_object.t_to_o_requested_packet_interval = 11 * 1000; // 11 ms in µs
+  ConnectionObjectSetExpectedPacketRate(&connection_object);
   CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
     &connection_object);
   CHECK_EQUAL(20, expected_packet_rate);
@@ -221,7 +238,8 @@ TEST(CipConnectionObject, ExpectedPacketRate) {
 
 TEST(CipConnectionObject, ExpectedPacketRateBelowTimerResolution) {
   CipConnectionObject connection_object = { 0 };
-  ConnectionObjectSetExpectedPacketRate(&connection_object, 9);
+  connection_object.t_to_o_requested_packet_interval = 9 * 1000; // 9 ms in µs
+  ConnectionObjectSetExpectedPacketRate(&connection_object);
   CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
     &connection_object);
   CHECK_EQUAL(10, expected_packet_rate);
@@ -229,7 +247,8 @@ TEST(CipConnectionObject, ExpectedPacketRateBelowTimerResolution) {
 
 TEST(CipConnectionObject, ExpectedPacketRateZero) {
   CipConnectionObject connection_object = { 0 };
-  ConnectionObjectSetExpectedPacketRate(&connection_object, 0);
+  connection_object.t_to_o_requested_packet_interval = 0; // A value of zero needs to be maintained, as this deactivates timeout
+  ConnectionObjectSetExpectedPacketRate(&connection_object);
   CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
     &connection_object);
   CHECK_EQUAL(0, expected_packet_rate);