OpENer - Open Source EtherNet/IP(TM) I/O Target Stack  2.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cipidentity.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright (c) 2009, Rockwell Automation, Inc.
3  * All rights reserved.
4  *
5  ******************************************************************************/
6 
27 #include <string.h>
28 
29 #include "cipidentity.h"
30 
31 #include "opener_user_conf.h"
32 #include "cipcommon.h"
33 #include "cipmessagerouter.h"
34 #include "ciperror.h"
35 #include "endianconv.h"
36 #include "opener_api.h"
37 #include "trace.h"
38 
39 /* attributes in CIP Identity Object */
40 
54 void SetDeviceSerialNumber(const EipUint32 serial_number) {
55  serial_number_ = serial_number;
56 }
57 
61 void SetDeviceStatus(const EipUint16 status) {
62  status_ = status;
63 }
64 
72 static EipStatus Reset(CipInstance *instance,
73 /* pointer to instance*/
74  CipMessageRouterRequest *message_router_request,
75  /* pointer to message router request*/
76  CipMessageRouterResponse *message_router_response, /* pointer to message router response*/
77  struct sockaddr *originator_address,
78  const int encapsulation_session) {
79  (void) instance;
80 
81  EipStatus eip_status = kEipStatusOkSend;
82 
83  message_router_response->reply_service = (0x80
84  | message_router_request->service);
85  message_router_response->size_of_additional_status = 0;
86  message_router_response->general_status = kCipErrorSuccess;
87 
88  if (message_router_request->request_path_size == 1) {
89  switch (message_router_request->data[0]) {
90  case 0: /* Reset type 0 -> emulate device reset / Power cycle */
91  if ( kEipStatusError == ResetDevice() ) {
92  message_router_response->general_status = kCipErrorInvalidParameter;
93  }
94  break;
95 
96  case 1: /* Reset type 1 -> reset to device settings */
98  message_router_response->general_status = kCipErrorInvalidParameter;
99  }
100  break;
101 
102  /* case 2: Not supported Reset type 2 -> Return to factory defaults except communications parameters */
103 
104  default:
105  message_router_response->general_status = kCipErrorInvalidParameter;
106  break;
107  }
108  } else /*TODO: Should be if (pa_stMRRequest->DataLength == 0)*/
109  {
110  /* The same behavior as if the data value given would be 0
111  emulate device reset */
112 
113  if ( kEipStatusError == ResetDevice() ) {
114  message_router_response->general_status = kCipErrorInvalidParameter;
115  } else {
116  /* eip_status = EIP_OK; */
117  }
118  }
119  message_router_response->data_length = 0;
120  return eip_status;
121 }
122 
124 
125 
126  CipClass *meta_class = class->class_instance.cip_class;
127 
128  InsertAttribute( (CipInstance *) class, 1, kCipUint,
129  (void *) &class->revision,
130  kGetableSingleAndAll ); /* revision */
131  InsertAttribute( (CipInstance *) class, 2, kCipUint,
132  (void *) &class->number_of_instances, kGetableSingleAndAll ); /* largest instance number */
133  InsertAttribute( (CipInstance *) class, 3, kCipUint,
134  (void *) &class->number_of_instances, kGetAttributeSingle ); /* number of instances currently existing*/
135  InsertAttribute( (CipInstance *) class, 4, kCipUint, (void *) &kCipUintZero,
136  kNotSetOrGetable ); /* optional attribute list - default = 0 */
137  InsertAttribute( (CipInstance *) class, 5, kCipUint, (void *) &kCipUintZero,
138  kNotSetOrGetable ); /* optional service list - default = 0 */
139  InsertAttribute( (CipInstance *) class, 6, kCipUint,
140  (void *) &meta_class->highest_attribute_number,
141  kGetableSingleAndAll ); /* max class attribute number*/
142  InsertAttribute( (CipInstance *) class, 7, kCipUint,
143  (void *) &class->highest_attribute_number,
144  kGetableSingleAndAll ); /* max instance attribute number*/
145 
146 }
147 
149 
150  CipClass *class = CreateCipClass(kIdentityClassCode,
151  0, /* # of non-default class attributes */
152  7, /* # highest class attribute number*/
153  2, /* # of class services*/
154  7, /* # of instance attributes*/
155  7, /* # highest instance attribute number*/
156  3, /* # of instance services*/
157  1, /* # of instances*/
158  "identity", /* # class name (for debug)*/
159  1, /* # class revision*/
160  &InitializeCipIdentiy); /* # function pointer for initialization*/
161 
162  if (class == 0) {
163  return kEipStatusError;
164  }
165 
166  CipInstance *instance = GetCipInstance(class, 1);
170  InsertAttribute(instance, 4, kCipUsintUsint, &revision_,
175  InsertAttribute(instance, 7, kCipShortString, &product_name_,
178  "GetAttributeSingle");
179  InsertService(class, kGetAttributeAll, &GetAttributeAll, "GetAttributeAll");
180  InsertService(class, kReset, &Reset, "Reset");
181 
182  return kEipStatusOk;
183 }
184 
186  OPENER_TRACE_INFO("Setting extended status: %x", extended_status);
187  status_ &= ~(0x70);
188  status_ |= extended_status;
189 }
CIP Short String.
Definition: ciptypes.h:130
void InsertAttribute(CipInstance *const instance, const EipUint16 attribute_number, const EipUint8 cip_type, void *const data, const EipByte cip_flags)
Insert an attribute in an instance of a CIP class.
Definition: cipcommon.c:304
CipUint device_type_
Definition: cipidentity.c:42
const CipOctet * data
Definition: ciptypes.h:191
CipUint vendor_id_
Definition: cipidentity.c:41
Tracing infrastructure for OpENer.
CipRevision revision_
Definition: cipidentity.c:44
#define OPENER_DEVICE_VENDOR_ID
Definition: devicedata.h:10
void SetDeviceSerialNumber(const EipUint32 serial_number)
Set the serial number of the device's identity object.
Definition: cipidentity.c:54
CIP Message Router Request.
Definition: ciptypes.h:187
Class is a subclass of Instance.
Definition: ciptypes.h:237
Responsible for Endianess conversion.
CipIdentityExtendedStatus
Definition: cipidentity.h:33
#define OPENER_DEVICE_TYPE
Definition: devicedata.h:11
CipClass * CreateCipClass(const EipUint32 class_id, const int number_of_class_attributes, const EipUint32 highest_class_attribute_number, const int number_of_class_services, const int number_of_instance_attributes, const EipUint32 highest_instance_attribute_number, const int number_of_instance_services, const int number_of_instances, char *name, const EipUint16 revision, void(*InitializeCipClass)(CipClass *))
Definition: cipcommon.c:189
#define OPENER_DEVICE_MAJOR_REVISION
Definition: devicedata.h:13
EipStatus
EIP stack status enum.
Definition: typedefs.h:93
void InsertService(const CipClass *const class, const EipUint8 service_number, const CipServiceFunction service_function, char *const service_name)
Insert a service in an instance of a CIP object.
Definition: cipcommon.c:346
CipInstance class_instance
Definition: ciptypes.h:238
uint32_t EipUint32
Definition: typedefs.h:34
EipStatus ResetDevice(void)
Emulate as close a possible a power cycle of the device.
EipStatus GetAttributeAll(CipInstance *instance, CipMessageRouterRequest *message_router_request, CipMessageRouterResponse *message_router_response, struct sockaddr *originator_address, const int encapsulation_session)
Generic implementation of the GetAttributeAll CIP service.
Definition: cipcommon.c:704
#define OPENER_TRACE_INFO(...)
Definition: trace.h:89
CipWord status_
Definition: cipidentity.c:46
#define OPENER_DEVICE_PRODUCT_CODE
Definition: devicedata.h:12
CipShortString product_name_
Definition: cipidentity.c:48
EipStatus GetAttributeSingle(CipInstance *RESTRICT const instance, CipMessageRouterRequest *const message_router_request, CipMessageRouterResponse *const message_router_response, struct sockaddr *originator_address, const int encapsulation_session)
Generic implementation of the GetAttributeSingle CIP service.
Definition: cipcommon.c:391
CipIdentitySetExtendedDeviceStatus(CipIdentityExtendedStatus extended_status)
Definition: cipidentity.c:185
CipInstance * GetCipInstance(const CipClass *RESTRICT const cip_class, EipUint32 instance_number)
Get a pointer to an instance.
EipStatus CipIdentityInit()
CIP Identity object constructor.
Definition: cipidentity.c:148
#define OPENER_DEVICE_MINOR_REVISION
Definition: devicedata.h:14
EipStatus ResetDeviceToInitialConfiguration(void)
Reset the device to the initial configuration and emulate as close as possible a power cycle of the d...
CipUdint serial_number_
Definition: cipidentity.c:47
void SetDeviceStatus(const EipUint16 status)
Private function, sets the devices status.
Definition: cipidentity.c:61
uint32_t CipUdint
Definition: typedefs.h:48
uint16_t CipUint
Definition: typedefs.h:47
EipUint16 highest_attribute_number
Definition: ciptypes.h:245
Struct storing the CIP revision.
Definition: ciptypes.h:179
CIP Message Router Response.
Definition: ciptypes.h:199
struct cip_class * cip_class
Definition: ciptypes.h:231
#define OPENER_DEVICE_NAME
Definition: devicedata.h:15
uint16_t CipWord
Definition: typedefs.h:44
uint16_t EipUint16
Definition: typedefs.h:33
EipInt16 request_path_size
Definition: ciptypes.h:190
void InitializeCipIdentiy(CipClass *class)
Definition: cipidentity.c:123
CipUsint size_of_additional_status
Definition: ciptypes.h:205
CipUint product_code_
Definition: cipidentity.c:43