opcuaServer.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. ============================================================================
  3. Name : opcuaServer.c
  4. Author :
  5. Version :
  6. Copyright : Your copyright notice
  7. Description : lala
  8. ============================================================================
  9. */
  10. #define _XOPEN_SOURCE 1 //TODO HACK
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include "networklayer.h"
  14. #include "ua_application.h"
  15. #include <sys/mman.h>
  16. #include <sys/types.h>
  17. #include <sys/wait.h>
  18. #include <unistd.h>
  19. #include <fcntl.h>
  20. #ifdef RASPI
  21. #include "raspberrypi_io.h"
  22. #endif
  23. #include <sys/ipc.h>
  24. #include <sys/shm.h>
  25. #define MAXMYMEM 4
  26. UA_Int32 serverCallback(void * arg) {
  27. char *name = (char *) arg;
  28. printf("%s does whatever servers do\n",name);
  29. Namespace* ns0 = (Namespace*)UA_indexedList_find(appMockup.namespaces, 0)->payload;
  30. UA_Int32 retval;
  31. UA_Node const * node;
  32. UA_ExpandedNodeId serverStatusNodeId = NS0EXPANDEDNODEID(2256);
  33. retval = Namespace_get(ns0, &(serverStatusNodeId.nodeId),&node, UA_NULL);
  34. if(retval == UA_SUCCESS){
  35. ((UA_ServerStatusDataType*)(((UA_VariableNode*)node)->value.data))->currentTime = UA_DateTime_now();
  36. }
  37. const UA_Node *foundNode1 = UA_NULL;
  38. Namespace_Entry_Lock *lock;
  39. //node which should be filled with data (float value)
  40. UA_NodeId tmpNodeId1;
  41. tmpNodeId1.encodingByte = UA_NODEIDTYPE_TWOBYTE;
  42. tmpNodeId1.identifier.numeric = 108;
  43. tmpNodeId1.namespace = 0;
  44. if(Namespace_get(ns0,&tmpNodeId1, &foundNode1,&lock) != UA_SUCCESS){
  45. return UA_ERROR;
  46. }
  47. *((float*)((UA_VariableNode *)foundNode1)->value.data) = *((float*)((UA_VariableNode *)foundNode1)->value.data) + 0.2f;
  48. return UA_SUCCESS;
  49. }
  50. int main(int argc, char** argv) {
  51. appMockup_init();
  52. NL_data* nl = NL_init(&NL_Description_TcpBinary,16664);
  53. struct timeval tv = {1, 0}; // 1 second
  54. #ifdef RASPI
  55. initIO();
  56. pid_t i = fork();
  57. if (i == 0)
  58. {
  59. Namespace* ns0 = (Namespace*)UA_indexedList_find(appMockup.namespaces, 0)->payload;
  60. while(1){
  61. const UA_Node *foundNode1 = UA_NULL;
  62. const UA_Node *foundNode2 = UA_NULL;
  63. const UA_Node *foundNode3 = UA_NULL;
  64. Namespace_Entry_Lock *lock;
  65. //node which should be filled with data (float value)
  66. UA_NodeId tmpNodeId1;
  67. UA_NodeId tmpNodeId2;
  68. UA_NodeId tmpNodeId3;
  69. tmpNodeId1.encodingByte = UA_NODEIDTYPE_TWOBYTE;
  70. tmpNodeId1.identifier.numeric = 108;
  71. tmpNodeId1.namespace = 0;
  72. tmpNodeId2.encodingByte = UA_NODEIDTYPE_TWOBYTE;
  73. tmpNodeId2.identifier.numeric = 109;
  74. tmpNodeId2.namespace = 0;
  75. tmpNodeId3.encodingByte = UA_NODEIDTYPE_TWOBYTE;
  76. tmpNodeId3.identifier.numeric = 110;
  77. tmpNodeId3.namespace = 0;
  78. if(Namespace_get(ns0,&tmpNodeId1, &foundNode1,&lock) != UA_SUCCESS){
  79. return UA_ERROR;
  80. }
  81. if(Namespace_get(ns0,&tmpNodeId2, &foundNode2,&lock) != UA_SUCCESS){
  82. return UA_ERROR;
  83. }
  84. if(Namespace_get(ns0,&tmpNodeId3, &foundNode3,&lock) != UA_SUCCESS){
  85. return UA_ERROR;
  86. }
  87. readTemp((float*)((UA_VariableNode *)foundNode1)->value.data);
  88. writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode2)->value.data),0);
  89. writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode3)->value.data),2);
  90. sleep(200);
  91. }
  92. }
  93. else if (i > 0)
  94. {
  95. _exit(2);
  96. }
  97. else
  98. {
  99. perror("fork failed");
  100. _exit(3);
  101. }
  102. #endif
  103. NL_msgLoop(nl, &tv, serverCallback,argv[0]);
  104. }