Selaa lähdekoodia

raspberry pi io - temperature sensor reading - first approach

FlorianPalm 10 vuotta sitten
vanhempi
commit
915d27cd9d
1 muutettua tiedostoa jossa 53 lisäystä ja 25 poistoa
  1. 53 25
      examples/src/opcuaServer.c

+ 53 - 25
examples/src/opcuaServer.c

@@ -7,7 +7,7 @@
  Description : lala
  ============================================================================
  */
-
+#define _XOPEN_SOURCE 1 //TODO HACK
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -18,7 +18,20 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include "raspberrypi_io.h"
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#define MAXMYMEM 4
+void readTemp1(float *temp)
+{
+	*temp = *temp + 0.3772f;
+
+}
+
+
+
+
 UA_Int32 serverCallback(void * arg) {
 	char *name = (char *) arg;
 	printf("%s does whatever servers do\n",name);
@@ -34,37 +47,52 @@ UA_Int32 serverCallback(void * arg) {
 
 
 	//FIXME: add the I/O code for raspberry pi here
-#ifdef raspi
-	static float *temperature;
+//#ifdef RASPI
+
+
 
-	UA_Node *foundNode = UA_NULL;
+
+
+	const UA_Node *foundNode = UA_NULL;
 	Namespace_Entry_Lock *lock;
 	//node which should be filled with data (float value)
 	UA_NodeId tmpNodeId;
 
 	tmpNodeId.encodingByte = UA_NODEIDTYPE_TWOBYTE;
 	tmpNodeId.identifier.numeric = 110;
-	tmpNodeId.namespace 0;
-
-	// build up the mapped memory
-    temperature = mmap(NULL, sizeof *temperature, PROT_READ | PROT_WRITE,
-                    MAP_SHARED | MAP_ANONYMOUS, -1, 0);
-
-	Namespace_get(ns0,&tmpNodeId,&foundNode,&lock);
-	((UA_VariableNode *)foundNode)->value.data = temperature;
-
-    if (fork() == 0) {
-    	while(1){
-    		readTemp(temperature);
-    		sleep(500);
-    	}
-
-    } else {
-        wait(UA_NULL);
-        printf("%d\n", *temperature);
-        munmap(temperature, sizeof *temperature);
-    }
-#endif
+	tmpNodeId.namespace =  0;
+
+	if(Namespace_get(ns0,&tmpNodeId, &foundNode,&lock) == UA_SUCCESS){
+		int shID;
+		char *myPtr;
+		int processId;
+
+		shID = shmget(2404, MAXMYMEM, IPC_CREAT | 0666);
+		if (shID >= 0) {
+			myPtr = shmat(shID, 0, 0);
+			if(myPtr!=(void*)-1)
+			{
+				((UA_VariableNode *)foundNode)->value.data = myPtr;
+				if((processId = fork()) < 0) {
+					printf("serverCallback - ERROR: process not created");
+				}
+				else if(processId == 0) {
+
+					while(1){
+						(*(float*)myPtr) = (*(float*)myPtr) + 0.3312f;
+	#ifdef RASPI
+						readTemp((float*)myPtr);
+	#endif
+						sleep(100);
+					}
+				}
+			}
+		} else {
+			printf("serverCallback - ERROR: no shared memory allocated");
+		}
+	}
+
+
 
 	return UA_SUCCESS;
 }