ua_services_attribute.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "ua_services.h"
  2. enum UA_AttributeId {
  3. UA_ATTRIBUTEID_NODEID = 1,
  4. UA_ATTRIBUTEID_NODECLASS = 2,
  5. UA_ATTRIBUTEID_BROWSENAME = 3,
  6. UA_ATTRIBUTEID_DISPLAYNAME = 4,
  7. UA_ATTRIBUTEID_DESCRIPTION = 5,
  8. UA_ATTRIBUTEID_WRITEMASK = 6,
  9. UA_ATTRIBUTEID_USERWRITEMASK = 7,
  10. UA_ATTRIBUTEID_ISABSTRACT = 8,
  11. UA_ATTRIBUTEID_SYMMETRIC = 9,
  12. UA_ATTRIBUTEID_INVERSENAME = 10,
  13. UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11,
  14. UA_ATTRIBUTEID_EVENTNOTIFIER = 12,
  15. UA_ATTRIBUTEID_VALUE = 13,
  16. UA_ATTRIBUTEID_DATATYPE = 14,
  17. UA_ATTRIBUTEID_VALUERANK = 15,
  18. UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16,
  19. UA_ATTRIBUTEID_ACCESSLEVEL = 17,
  20. UA_ATTRIBUTEID_USERACCESSLEVEL = 18,
  21. UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
  22. UA_ATTRIBUTEID_HISTORIZING = 20,
  23. UA_ATTRIBUTEID_EXECUTABLE = 21,
  24. UA_ATTRIBUTEID_USEREXECUTABLE = 22
  25. };
  26. static UA_DataValue * service_read_node(UA_Application *app, const UA_ReadValueId *id) {
  27. UA_DataValue *v;
  28. UA_alloc((void **) &v, sizeof(UA_DataValue));
  29. namespace *ns = UA_indexedList_findValue(app->namespaces, id->nodeId.namespace);
  30. if (ns == UA_NULL) {
  31. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  32. v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
  33. return v;
  34. }
  35. UA_Node *node = UA_NULL;
  36. ns_lock *lock = UA_NULL;
  37. UA_Int32 result = get_node(ns, &id->nodeId, &node, &lock);
  38. if(result != UA_SUCCESS) {
  39. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  40. v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
  41. return v;
  42. }
  43. switch(id->attributeId) {
  44. case UA_ATTRIBUTEID_NODEID:
  45. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  46. v->status = UA_STATUSCODE_BADNOTREADABLE;
  47. break;
  48. case UA_ATTRIBUTEID_NODECLASS:
  49. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  50. v->status = UA_STATUSCODE_BADNOTREADABLE;
  51. break;
  52. case UA_ATTRIBUTEID_BROWSENAME:
  53. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  54. v->status = UA_STATUSCODE_BADNOTREADABLE;
  55. break;
  56. case UA_ATTRIBUTEID_DISPLAYNAME:
  57. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  58. v->status = UA_STATUSCODE_BADNOTREADABLE;
  59. break;
  60. case UA_ATTRIBUTEID_DESCRIPTION:
  61. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  62. v->status = UA_STATUSCODE_BADNOTREADABLE;
  63. break;
  64. case UA_ATTRIBUTEID_WRITEMASK:
  65. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  66. v->status = UA_STATUSCODE_BADNOTREADABLE;
  67. break;
  68. case UA_ATTRIBUTEID_USERWRITEMASK:
  69. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  70. v->status = UA_STATUSCODE_BADNOTREADABLE;
  71. break;
  72. case UA_ATTRIBUTEID_ISABSTRACT:
  73. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  74. v->status = UA_STATUSCODE_BADNOTREADABLE;
  75. break;
  76. case UA_ATTRIBUTEID_SYMMETRIC:
  77. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  78. v->status = UA_STATUSCODE_BADNOTREADABLE;
  79. break;
  80. case UA_ATTRIBUTEID_INVERSENAME:
  81. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  82. v->status = UA_STATUSCODE_BADNOTREADABLE;
  83. break;
  84. case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
  85. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  86. v->status = UA_STATUSCODE_BADNOTREADABLE;
  87. break;
  88. case UA_ATTRIBUTEID_EVENTNOTIFIER:
  89. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  90. v->status = UA_STATUSCODE_BADNOTREADABLE;
  91. break;
  92. case UA_ATTRIBUTEID_VALUE:
  93. if (node->nodeClass != UA_NODECLASS_VARIABLE) {
  94. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  95. v->status = UA_STATUSCODE_BADNOTREADABLE;
  96. break;
  97. }
  98. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE | UA_DATAVALUE_ENCODINGMASK_VARIANT;
  99. v->status = UA_STATUSCODE_GOOD;
  100. v->value = ((UA_VariableNode *)node)->value; // be careful not to release the node before encoding the message
  101. break;
  102. case UA_ATTRIBUTEID_DATATYPE:
  103. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  104. v->status = UA_STATUSCODE_BADNOTREADABLE;
  105. break;
  106. case UA_ATTRIBUTEID_VALUERANK:
  107. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  108. v->status = UA_STATUSCODE_BADNOTREADABLE;
  109. break;
  110. case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
  111. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  112. v->status = UA_STATUSCODE_BADNOTREADABLE;
  113. break;
  114. case UA_ATTRIBUTEID_ACCESSLEVEL:
  115. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  116. v->status = UA_STATUSCODE_BADNOTREADABLE;
  117. break;
  118. case UA_ATTRIBUTEID_USERACCESSLEVEL:
  119. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  120. v->status = UA_STATUSCODE_BADNOTREADABLE;
  121. break;
  122. case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
  123. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  124. v->status = UA_STATUSCODE_BADNOTREADABLE;
  125. break;
  126. case UA_ATTRIBUTEID_HISTORIZING:
  127. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  128. v->status = UA_STATUSCODE_BADNOTREADABLE;
  129. break;
  130. case UA_ATTRIBUTEID_EXECUTABLE:
  131. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  132. v->status = UA_STATUSCODE_BADNOTREADABLE;
  133. break;
  134. case UA_ATTRIBUTEID_USEREXECUTABLE:
  135. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  136. v->status = UA_STATUSCODE_BADNOTREADABLE;
  137. break;
  138. default:
  139. v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  140. v->status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
  141. break;
  142. }
  143. release_node(lock);
  144. return v;
  145. }
  146. UA_Int32 Service_Read(SL_Channel *channel, const UA_ReadRequest *request, UA_ReadResponse *response ) {
  147. if(channel->application == UA_NULL) return UA_ERROR; // TODO: Return error message
  148. int readsize = request->nodesToReadSize > 0 ? request->nodesToReadSize : 0;
  149. response->resultsSize = readsize;
  150. UA_alloc((void **)&response->results, sizeof(void *)*readsize);
  151. for(int i=0;i<readsize;i++) {
  152. response->results[i] = service_read_node(channel->application, request->nodesToRead[i]);
  153. }
  154. response->diagnosticInfosSize = -1;
  155. return UA_SUCCESS;
  156. }