瀏覽代碼

added option for raspberry pi io (enable-raspi)

FlorianPalm 10 年之前
父節點
當前提交
b8c2e7b472
共有 4 個文件被更改,包括 89 次插入2 次删除
  1. 13 0
      configure.ac
  2. 37 0
      examples/src/opcuaServer.c
  3. 38 1
      src/ua_application.c
  4. 1 1
      tests/check_builtin.c

+ 13 - 0
configure.ac

@@ -69,6 +69,19 @@ AS_HELP_STRING([--enable-coverage],
 AM_CONDITIONAL(COVERAGE, test x"$coverage" = x"true")
 AM_COND_IF([COVERAGE],
     AC_DEFINE([COVERAGE])) #define MULTITHREADING is accessible from pre-processor
+    
+#raspberry pi
+AC_ARG_ENABLE(raspi,
+AS_HELP_STRING([--enable-raspi],
+               [enable raspi, default: no]),
+	[case "${enableval}" in
+		yes) raspi=true ;;
+		no)  raspi=false ;;
+		*)   AC_MSG_ERROR([bad value ${enableval} for --enable-raspi]) ;; 
+	esac],[raspi=false])
+AM_CONDITIONAL(RASPI, test x"$raspi" = x"true")
+AM_COND_IF([RASPI],
+    AC_DEFINE([RASPI])) #define MULTITHREADING is accessible from pre-processor
 
 #doxygen start
 AC_ARG_ENABLE(doxygen,

+ 37 - 0
examples/src/opcuaServer.c

@@ -14,6 +14,11 @@
 #include "networklayer.h"
 #include "ua_application.h"
 
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include "raspberrypi_io.h"
 UA_Int32 serverCallback(void * arg) {
 	char *name = (char *) arg;
 	printf("%s does whatever servers do\n",name);
@@ -27,7 +32,39 @@ UA_Int32 serverCallback(void * arg) {
 		((UA_ServerStatusDataType*)(((UA_VariableNode*)node)->value.data))->currentTime = UA_DateTime_now();
 	}
 
+
 	//FIXME: add the I/O code for raspberry pi here
+#ifdef raspi
+	static float *temperature;
+
+	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
 
 	return UA_SUCCESS;
 }

+ 38 - 1
src/ua_application.c

@@ -552,7 +552,8 @@ void appMockup_init() {
 	/* Namespace local */
 	/*******************/
 
-	UA_ExpandedNodeId ObjId_led1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 1}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+	// WORKS
+UA_ExpandedNodeId ObjId_led1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
 
 // LED1
 UA_VariableNode *led1;
@@ -563,6 +564,20 @@ led1->browseName = UA_QUALIFIEDNAME_STATIC("led1");
 led1->displayName = UA_LOCALIZEDTEXT_STATIC("led1");
 led1->description = UA_LOCALIZEDTEXT_STATIC("led1");
 
+//Set node value
+UA_Variant *tmpNodeValue;
+UA_Float *tmpFloat;
+UA_Float_new(&tmpFloat);
+*tmpFloat = 0;
+UA_Variant_new(&tmpNodeValue);
+tmpNodeValue->arrayDimensionsLength = 0;
+tmpNodeValue->arrayLength = 1;
+tmpNodeValue->data = (void*)tmpFloat;
+
+tmpNodeValue->vt = &UA_.types[UA_FLOAT];
+
+UA_Variant_copy(tmpNodeValue, &led1->value);
+
 //FIXME: these two give - "Browse failed with error 'UncertainNotAllNodesAvailable'."
 //AddReference((UA_Node*)led1, &(UA_ReferenceNode){RefTypeId_Organizes, UA_TRUE, NS0EXPANDEDNODEID(84)}, ns0);
 AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_led1}, ns0);
@@ -572,7 +587,29 @@ AddReference((UA_Node*)led1, &(UA_ReferenceNode){RefTypeId_Organizes, UA_TRUE, N
 
 Namespace_insert(ns0,(UA_Node*)led1);
 
+/* NOT WORKING
+
+UA_ExpandedNodeId ObjId_led1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 1, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+
+// LED1
+UA_VariableNode *led1;
+UA_VariableNode_new(&led1);
+led1->nodeId = ObjId_led1.nodeId;
+led1->nodeClass = UA_NODECLASS_VARIABLE;
+led1->browseName = UA_QUALIFIEDNAME_STATIC("led1");
+led1->displayName = UA_LOCALIZEDTEXT_STATIC("led1");
+led1->description = UA_LOCALIZEDTEXT_STATIC("led1");
+
+//FIXME: these two give - "Browse failed with error 'UncertainNotAllNodesAvailable'."
+//AddReference((UA_Node*)led1, &(UA_ReferenceNode){RefTypeId_Organizes, UA_TRUE, NS0EXPANDEDNODEID(84)}, ns0);
+AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_led1}, local);
+
+//FIXME: this give no error, but also also does not show the node
+AddReference((UA_Node*)led1, &(UA_ReferenceNode){RefTypeId_Organizes, UA_TRUE, NS0EXPANDEDNODEID(84)}, ns0);
+
+Namespace_insert(local,(UA_Node*)led1);
 
+*/
 
 #if defined(DEBUG) && defined(VERBOSE)
 	uint32_t i;

+ 1 - 1
tests/check_builtin.c

@@ -1566,7 +1566,7 @@ START_TEST(UA_Variant_copyShallWorkOnSingleValueExample) {
 
 	//then
 	UA_String copiedString = *(UA_String*)(copiedValue.data);
-	for(UA_Int32 i = 0;i < 3;i++)
+	for(UA_Int32 i = 0;i < 5;i++)
 		ck_assert_int_eq(copiedString.data[i], testString.data[i]);
 	ck_assert_int_eq(copiedString.length, testString.length);