Преглед на файлове

added write led node as demonstration of write service

FlorianPalm преди 10 години
родител
ревизия
f7c03d0910
променени са 4 файла, в които са добавени 62 реда и са изтрити 27 реда
  1. 25 10
      examples/src/opcuaServer.c
  2. 6 4
      examples/src/raspberrypi_io.c
  3. 29 11
      src/ua_application.c
  4. 2 2
      src/ua_services_attribute.c

+ 25 - 10
examples/src/opcuaServer.c

@@ -19,6 +19,7 @@
 #include <sys/wait.h>
 #include <unistd.h>
 #include <fcntl.h>
+
 #ifdef RASPI
 	#include "raspberrypi_io.h"
 #endif
@@ -41,25 +42,39 @@ UA_Int32 serverCallback(void * arg) {
 		((UA_ServerStatusDataType*)(((UA_VariableNode*)node)->value.data))->currentTime = UA_DateTime_now();
 	}
 
-	const UA_Node *foundNode = UA_NULL;
+	const UA_Node *foundNode1 = UA_NULL;
+	const UA_Node *foundNode2 = UA_NULL;
 	Namespace_Entry_Lock *lock;
 	//node which should be filled with data (float value)
-	UA_NodeId tmpNodeId;
+	UA_NodeId tmpNodeId1;
+	UA_NodeId tmpNodeId2;
+
+	tmpNodeId1.encodingByte = UA_NODEIDTYPE_TWOBYTE;
+	tmpNodeId1.identifier.numeric = 110;
+	tmpNodeId1.namespace =  0;
+
+	tmpNodeId2.encodingByte = UA_NODEIDTYPE_TWOBYTE;
+	tmpNodeId2.identifier.numeric = 111;
+	tmpNodeId2.namespace =  0;
+
+	if(Namespace_get(ns0,&tmpNodeId1, &foundNode1,&lock) != UA_SUCCESS){
+		return UA_ERROR;
+	}
 
-	tmpNodeId.encodingByte = UA_NODEIDTYPE_TWOBYTE;
-	tmpNodeId.identifier.numeric = 110;
-	tmpNodeId.namespace =  0;
+	if(Namespace_get(ns0,&tmpNodeId2, &foundNode2,&lock) != UA_SUCCESS){
+		return UA_ERROR;
+	}
 
-	if(Namespace_get(ns0,&tmpNodeId, &foundNode,&lock) == UA_SUCCESS){
 	#ifdef RASPI
-		readTemp((float*)((UA_VariableNode *)foundNode)->value.data);
+		readTemp((float*)((UA_VariableNode *)foundNode1)->value.data);
+		writeLEDred(*((UA_Boolean*)((UA_VariableNode *)foundNode2)->value.data));
 	#else
-		*((float*)((UA_VariableNode *)foundNode)->value.data) = *((float*)((UA_VariableNode *)foundNode)->value.data) + 0.2f;
+		*((float*)((UA_VariableNode *)foundNode1)->value.data) = *((float*)((UA_VariableNode *)foundNode1)->value.data) + 0.2f;
 	#endif
 
-	}
 
-	return UA_SUCCESS;
+
+		return UA_SUCCESS;
 }
 
 int main(int argc, char** argv) {

+ 6 - 4
examples/src/raspberrypi_io.c

@@ -39,14 +39,16 @@ int readTemp(float *temp){
 	return 0;
 }
 
-int writeLEDred(int state){
+int writeLEDred(_Bool state){
 	if (wiringPiSetup() == -1){
 		return 1;
 	}
 	pinMode(0, OUTPUT);
-
-	digitalWrite(0, state);
-
+	if(state){
+		digitalWrite(0, 1);
+	}else{
+		digitalWrite(0, 0);
+	}
 	return 0;
 }
 #endif

+ 29 - 11
src/ua_application.c

@@ -553,12 +553,12 @@ void appMockup_init() {
 	/*******************/
 
 	// 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};
+UA_ExpandedNodeId ObjId_temperature1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
 
-// LED1
+// temperature sensor
 UA_VariableNode *temperature1;
 UA_VariableNode_new(&temperature1);
-temperature1->nodeId = ObjId_led1.nodeId;
+temperature1->nodeId = ObjId_temperature1.nodeId;
 temperature1->nodeClass = UA_NODECLASS_VARIABLE;
 temperature1->browseName = UA_QUALIFIEDNAME_STATIC("temperature1");
 temperature1->displayName = UA_LOCALIZEDTEXT_STATIC("temperature1");
@@ -573,21 +573,39 @@ UA_Variant_new(&tmpNodeValue);
 tmpNodeValue->arrayDimensionsLength = 0;
 tmpNodeValue->arrayLength = 1;
 tmpNodeValue->data = (void*)tmpFloat;
-
 tmpNodeValue->vt = &UA_.types[UA_FLOAT];
-
 UA_Variant_copy(tmpNodeValue, &temperature1->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);
-
-//FIXME: this give no error, but also also does not show the node
-AddReference((UA_Node*)temperature1, &(UA_ReferenceNode){RefTypeId_Organizes, UA_TRUE, NS0EXPANDEDNODEID(84)}, ns0);
+AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_temperature1}, ns0);
 
 Namespace_insert(ns0,(UA_Node*)temperature1);
 
 
+UA_ExpandedNodeId ObjId_led1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 111}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+// led1 sensor
+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");
+
+//Set node value
+UA_Variant *tmpNodeValue1;
+UA_Boolean *ledVal;
+UA_Boolean_new(&ledVal);
+*ledVal = UA_FALSE;
+UA_Variant_new(&tmpNodeValue1);
+tmpNodeValue1->arrayDimensionsLength = 0;
+tmpNodeValue1->arrayLength = 1;
+tmpNodeValue1->data = (void*)ledVal;
+tmpNodeValue1->vt = &UA_.types[UA_BOOLEAN];
+UA_Variant_copy(tmpNodeValue1, &led1->value);
+
+AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_led1}, ns0);
+Namespace_insert(ns0,(UA_Node*)led1);
+
 
 #if defined(DEBUG) && defined(VERBOSE)
 	uint32_t i;

+ 2 - 2
src/ua_services_attribute.c

@@ -443,10 +443,10 @@ UA_Int32 Service_Write(SL_Channel *channel, const UA_WriteRequest *request,
 	if(channel->session == UA_NULL || channel->session->application == UA_NULL)
 		return UA_ERROR;    // TODO: Return error message
 	response->resultsSize = request->nodesToWriteSize;
-
+	//TODO evalutate diagnostic info within the request
 	UA_Array_new((void**)&response->results,response->resultsSize,&UA_.types[UA_STATUSCODE]);
 	for(i=0; i < request->nodesToWriteSize; i++){
-		Service_Write_writeNode(channel->session->application ,&request->nodesToWrite[i], &response->results[i]);
+		retval |= Service_Write_writeNode(channel->session->application ,&request->nodesToWrite[i], &response->results[i]);
 	}
 
 	return retval;