Explorar el Código

moved io processing to subprocess to enhance speed

FlorianPalm hace 10 años
padre
commit
2a371e6b46
Se han modificado 4 ficheros con 93 adiciones y 46 borrados
  1. 61 26
      examples/src/opcuaServer.c
  2. 20 9
      examples/src/raspberrypi_io.c
  3. 1 1
      examples/src/raspberrypi_io.h
  4. 11 10
      src/ua_application.c

+ 61 - 26
examples/src/opcuaServer.c

@@ -19,7 +19,6 @@
 #include <sys/wait.h>
 #include <unistd.h>
 #include <fcntl.h>
-
 #ifdef RASPI
 	#include "raspberrypi_io.h"
 #endif
@@ -43,45 +42,25 @@ UA_Int32 serverCallback(void * arg) {
 	}
 
 	const UA_Node *foundNode1 = UA_NULL;
-	const UA_Node *foundNode2 = UA_NULL;
-	const UA_Node *foundNode3 = UA_NULL;
+
 	Namespace_Entry_Lock *lock;
 	//node which should be filled with data (float value)
 	UA_NodeId tmpNodeId1;
-	UA_NodeId tmpNodeId2;
-	UA_NodeId tmpNodeId3;
+
 
 	tmpNodeId1.encodingByte = UA_NODEIDTYPE_TWOBYTE;
-	tmpNodeId1.identifier.numeric = 110;
+	tmpNodeId1.identifier.numeric = 108;
 	tmpNodeId1.namespace =  0;
 
-	tmpNodeId2.encodingByte = UA_NODEIDTYPE_TWOBYTE;
-	tmpNodeId2.identifier.numeric = 111;
-	tmpNodeId2.namespace =  0;
-
-	tmpNodeId3.encodingByte = UA_NODEIDTYPE_TWOBYTE;
-	tmpNodeId3.identifier.numeric = 112;
-	tmpNodeId3.namespace =  0;
 
 	if(Namespace_get(ns0,&tmpNodeId1, &foundNode1,&lock) != UA_SUCCESS){
 		return UA_ERROR;
 	}
 
-	if(Namespace_get(ns0,&tmpNodeId2, &foundNode2,&lock) != UA_SUCCESS){
-		return UA_ERROR;
-	}
 
-	if(Namespace_get(ns0,&tmpNodeId2, &foundNode3,&lock) != UA_SUCCESS){
-		return UA_ERROR;
-	}
 
-	#ifdef RASPI
-		readTemp((float*)((UA_VariableNode *)foundNode1)->value.data);
-		writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode2)->value.data),0);
-		writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode3)->value.data),2);
-	#else
-		*((float*)((UA_VariableNode *)foundNode1)->value.data) = *((float*)((UA_VariableNode *)foundNode1)->value.data) + 0.2f;
-	#endif
+	*((float*)((UA_VariableNode *)foundNode1)->value.data) = *((float*)((UA_VariableNode *)foundNode1)->value.data) + 0.2f;
+
 
 
 
@@ -93,5 +72,61 @@ int main(int argc, char** argv) {
 	NL_data* nl = NL_init(&NL_Description_TcpBinary,16664);
 
 	struct timeval tv = {1, 0}; // 1 second
+#ifdef RASPI
+	initIO();
+    pid_t i = fork();
+    if (i == 0)
+    {
+    	Namespace* ns0 = (Namespace*)UA_indexedList_find(appMockup.namespaces, 0)->payload;
+    	while(1){
+			const UA_Node *foundNode1 = UA_NULL;
+			const UA_Node *foundNode2 = UA_NULL;
+			const UA_Node *foundNode3 = UA_NULL;
+			Namespace_Entry_Lock *lock;
+			//node which should be filled with data (float value)
+			UA_NodeId tmpNodeId1;
+			UA_NodeId tmpNodeId2;
+			UA_NodeId tmpNodeId3;
+
+			tmpNodeId1.encodingByte = UA_NODEIDTYPE_TWOBYTE;
+			tmpNodeId1.identifier.numeric = 108;
+			tmpNodeId1.namespace =  0;
+
+			tmpNodeId2.encodingByte = UA_NODEIDTYPE_TWOBYTE;
+			tmpNodeId2.identifier.numeric = 109;
+			tmpNodeId2.namespace =  0;
+
+			tmpNodeId3.encodingByte = UA_NODEIDTYPE_TWOBYTE;
+			tmpNodeId3.identifier.numeric = 110;
+			tmpNodeId3.namespace =  0;
+
+			if(Namespace_get(ns0,&tmpNodeId1, &foundNode1,&lock) != UA_SUCCESS){
+				return UA_ERROR;
+			}
+
+			if(Namespace_get(ns0,&tmpNodeId2, &foundNode2,&lock) != UA_SUCCESS){
+				return UA_ERROR;
+			}
+
+			if(Namespace_get(ns0,&tmpNodeId3, &foundNode3,&lock) != UA_SUCCESS){
+				return UA_ERROR;
+			}
+			readTemp((float*)((UA_VariableNode *)foundNode1)->value.data);
+			writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode2)->value.data),0);
+			writePin(*((UA_Boolean*)((UA_VariableNode *)foundNode3)->value.data),2);
+			sleep(200);
+    	}
+    }
+    else if (i > 0)
+    {
+
+        _exit(2);
+    }
+    else
+    {
+        perror("fork failed");
+        _exit(3);
+    }
+#endif
 	NL_msgLoop(nl, &tv, serverCallback,argv[0]);
 }

+ 20 - 9
examples/src/raspberrypi_io.c

@@ -10,6 +10,16 @@
 
 
 #ifdef RASPI
+static _Bool initialized = 0;
+int initIO()
+{
+	if (wiringPiSetup() == -1){
+		initialized = 0;
+		return 1;
+	}
+	initialized = 1;
+	return 0;
+}
 int readTemp(float *temp){
 	FILE *ptr_file;
 	char buf[1000];
@@ -40,15 +50,16 @@ int readTemp(float *temp){
 }
 
 int writePin(_Bool state, int pin){
-	if (wiringPiSetup() == -1){
-		return 1;
+	if(initialized)
+	{
+		pinMode(0, OUTPUT);
+		if(state){
+			digitalWrite(pin, 1);
+		}else{
+			digitalWrite(pin, 0);
+		}
+		return 0;
 	}
-	pinMode(0, OUTPUT);
-	if(state){
-		digitalWrite(pin, 1);
-	}else{
-		digitalWrite(pin, 0);
-	}
-	return 0;
+	return 1; //ERROR
 }
 #endif

+ 1 - 1
examples/src/raspberrypi_io.h

@@ -16,6 +16,6 @@
 
 #include "string.h"
 int readTemp(float *temp);
-int writePin(_Bool state);
+int writePin(_Bool state, int pin);
 
 #endif /* RASPBERRYPI_IO_H_ */

+ 11 - 10
src/ua_application.c

@@ -390,10 +390,10 @@ void appMockup_init() {
 	UA_ExpandedNodeId ObjId_TypesFolder = NS0EXPANDEDNODEID(86);
 	UA_ExpandedNodeId ObjId_ViewsFolder = NS0EXPANDEDNODEID(87);
 	UA_ExpandedNodeId ObjId_Server = NS0EXPANDEDNODEID(2253);
-	//UA_ExpandedNodeId ObjId_ServerArray = NS0EXPANDEDNODEID(2254);
+	UA_ExpandedNodeId ObjId_ServerArray = NS0EXPANDEDNODEID(2254);
 	UA_ExpandedNodeId ObjId_NamespaceArray = NS0EXPANDEDNODEID(2255);
 	UA_ExpandedNodeId ObjId_ServerStatus = NS0EXPANDEDNODEID(2256);
-	//UA_ExpandedNodeId ObjId_ServerCapabilities = NS0EXPANDEDNODEID(2268);
+	UA_ExpandedNodeId ObjId_ServerCapabilities = NS0EXPANDEDNODEID(2268);
 	UA_ExpandedNodeId ObjId_State = NS0EXPANDEDNODEID(2259);
 
 	// FolderType
@@ -462,10 +462,10 @@ void appMockup_init() {
 	server->browseName = UA_QUALIFIEDNAME_STATIC("Server");
 	server->displayName = UA_LOCALIZEDTEXT_STATIC("Server");
 	server->description = UA_LOCALIZEDTEXT_STATIC("Server");
-	//AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasComponent, UA_FALSE, ObjId_ServerCapabilities}, ns0);
-	//AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasComponent, UA_FALSE, ObjId_NamespaceArray}, ns0);
-	//AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasProperty, UA_FALSE, ObjId_ServerStatus}, ns0);
-	//AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasProperty, UA_FALSE, ObjId_ServerArray}, ns0);
+	AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasComponent, UA_FALSE, ObjId_ServerCapabilities}, ns0);
+	AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasComponent, UA_FALSE, ObjId_NamespaceArray}, ns0);
+	AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasProperty, UA_FALSE, ObjId_ServerStatus}, ns0);
+	AddReference((UA_Node*)server, &(UA_ReferenceNode){RefTypeId_HasProperty, UA_FALSE, ObjId_ServerArray}, ns0);
 	Namespace_insert(ns0,(UA_Node*)server);
 
 	// NamespaceArray
@@ -553,7 +553,7 @@ void appMockup_init() {
 	/*******************/
 
 	// WORKS
-	UA_ExpandedNodeId ObjId_temperature1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+	UA_ExpandedNodeId ObjId_temperature1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 108}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
 
 	// temperature sensor
 	UA_VariableNode *temperature1;
@@ -581,7 +581,7 @@ void appMockup_init() {
 	Namespace_insert(ns0,(UA_Node*)temperature1);
 
 
-	UA_ExpandedNodeId ObjId_redLED = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 111}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+	UA_ExpandedNodeId ObjId_redLED = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 109}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
 	// redLED sensor
 	UA_VariableNode *redLED;
 	UA_VariableNode_new(&redLED);
@@ -607,11 +607,11 @@ void appMockup_init() {
 	Namespace_insert(ns0,(UA_Node*)redLED);
 
 
-	UA_ExpandedNodeId ObjId_yellowLED = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 112}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+	UA_ExpandedNodeId ObjId_yellowLED = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
 	// yellowLED sensor
 	UA_VariableNode *yellowLED;
 	UA_VariableNode_new(&yellowLED);
-	yellowLED->nodeId = ObjId_redLED.nodeId;
+	yellowLED->nodeId = ObjId_yellowLED.nodeId;
 	yellowLED->nodeClass = UA_NODECLASS_VARIABLE;
 	yellowLED->browseName = UA_QUALIFIEDNAME_STATIC("yellowLED");
 	yellowLED->displayName = UA_LOCALIZEDTEXT_STATIC("yellowLED");
@@ -631,6 +631,7 @@ void appMockup_init() {
 
 	AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_yellowLED}, ns0);
 	Namespace_insert(ns0,(UA_Node*)yellowLED);
+
 #if defined(DEBUG) && defined(VERBOSE)
 	uint32_t i;
 	for (i=0;i < ns0->size;i++) {