Selaa lähdekoodia

added 2nd LED as Node

FlorianPalm 10 vuotta sitten
vanhempi
commit
9405f09ed8

+ 12 - 1
examples/src/opcuaServer.c

@@ -44,10 +44,12 @@ 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;
@@ -57,6 +59,10 @@ UA_Int32 serverCallback(void * arg) {
 	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;
 	}
@@ -65,9 +71,14 @@ UA_Int32 serverCallback(void * arg) {
 		return UA_ERROR;
 	}
 
+	if(Namespace_get(ns0,&tmpNodeId2, &foundNode3,&lock) != UA_SUCCESS){
+		return UA_ERROR;
+	}
+
 	#ifdef RASPI
 		readTemp((float*)((UA_VariableNode *)foundNode1)->value.data);
-		writeLEDred(*((UA_Boolean*)((UA_VariableNode *)foundNode2)->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

+ 3 - 3
examples/src/raspberrypi_io.c

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

+ 1 - 1
examples/src/raspberrypi_io.h

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

+ 84 - 60
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,60 +553,84 @@ 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};
-
-// temperature sensor
-UA_VariableNode *temperature1;
-UA_VariableNode_new(&temperature1);
-temperature1->nodeId = ObjId_temperature1.nodeId;
-temperature1->nodeClass = UA_NODECLASS_VARIABLE;
-temperature1->browseName = UA_QUALIFIEDNAME_STATIC("temperature1");
-temperature1->displayName = UA_LOCALIZEDTEXT_STATIC("temperature1");
-temperature1->description = UA_LOCALIZEDTEXT_STATIC("temperature1");
-
-//Set node value
-UA_Variant *tmpNodeValue;
-UA_Float *tmpFloat;
-UA_Float_new(&tmpFloat);
-*tmpFloat = -133.2f;
-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);
-
-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);
-
-
+	UA_ExpandedNodeId ObjId_temperature1 = (UA_ExpandedNodeId){.nodeId = (UA_NodeId){.encodingByte = UA_NODEIDTYPE_TWOBYTE, .namespace = 0, .identifier.numeric = 110}, .namespaceUri = {-1, ((void *)0)}, .serverIndex = 0};
+
+	// temperature sensor
+	UA_VariableNode *temperature1;
+	UA_VariableNode_new(&temperature1);
+	temperature1->nodeId = ObjId_temperature1.nodeId;
+	temperature1->nodeClass = UA_NODECLASS_VARIABLE;
+	temperature1->browseName = UA_QUALIFIEDNAME_STATIC("temperature1");
+	temperature1->displayName = UA_LOCALIZEDTEXT_STATIC("temperature1");
+	temperature1->description = UA_LOCALIZEDTEXT_STATIC("temperature1");
+
+	//Set node value
+	UA_Variant *tmpNodeValue;
+	UA_Float *tmpFloat;
+	UA_Float_new(&tmpFloat);
+	*tmpFloat = -273.15f;
+	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);
+
+	AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_temperature1}, ns0);
+
+	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};
+	// redLED sensor
+	UA_VariableNode *redLED;
+	UA_VariableNode_new(&redLED);
+	redLED->nodeId = ObjId_redLED.nodeId;
+	redLED->nodeClass = UA_NODECLASS_VARIABLE;
+	redLED->browseName = UA_QUALIFIEDNAME_STATIC("redLED");
+	redLED->displayName = UA_LOCALIZEDTEXT_STATIC("redLED");
+	redLED->description = UA_LOCALIZEDTEXT_STATIC("redLED");
+
+	//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, &redLED->value);
+
+	AddReference((UA_Node*)root, &(UA_ReferenceNode){RefTypeId_Organizes, UA_FALSE, ObjId_redLED}, ns0);
+	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};
+	// yellowLED sensor
+	UA_VariableNode *yellowLED;
+	UA_VariableNode_new(&yellowLED);
+	yellowLED->nodeId = ObjId_redLED.nodeId;
+	yellowLED->nodeClass = UA_NODECLASS_VARIABLE;
+	yellowLED->browseName = UA_QUALIFIEDNAME_STATIC("yellowLED");
+	yellowLED->displayName = UA_LOCALIZEDTEXT_STATIC("yellowLED");
+	yellowLED->description = UA_LOCALIZEDTEXT_STATIC("yellowLED");
+
+	//Set node value
+	UA_Variant *tmpNodeValue2;
+	UA_Boolean *ledVal1;
+	UA_Boolean_new(&ledVal1);
+	*ledVal1 = UA_FALSE;
+	UA_Variant_new(&tmpNodeValue2);
+	tmpNodeValue2->arrayDimensionsLength = 0;
+	tmpNodeValue2->arrayLength = 1;
+	tmpNodeValue2->data = (void*)ledVal1;
+	tmpNodeValue2->vt = &UA_.types[UA_BOOLEAN];
+	UA_Variant_copy(tmpNodeValue2, &yellowLED->value);
+
+	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++) {

+ 3 - 2
src/ua_services_attribute.c

@@ -252,7 +252,7 @@ UA_Int32 Service_Read(SL_Channel *channel, const UA_ReadRequest *request,
 	return UA_SUCCESS;
 }
 
-UA_Int32 Service_Write_writeNode(Application *app, UA_WriteValue *writeValue,UA_StatusCode *result)
+UA_Int32 Service_Write_writeNode(Application *app, UA_WriteValue *writeValue, UA_StatusCode *result)
 {
 	UA_Int32 retval = UA_SUCCESS;
 	Namespace *ns = UA_indexedList_findValue(app->namespaces, writeValue->nodeId.namespace);
@@ -356,6 +356,7 @@ UA_Int32 Service_Write_writeNode(Application *app, UA_WriteValue *writeValue,UA_
 		// TODO: Ensure that the borrowed value is not freed prematurely (multithreading)
 		/* retval |= UA_Variant_borrowSetValue(&v.value, &UA_.types[UA_VARIANT], */
 		/*                                     &((UA_VariableNode *)node)->value); */
+
 		retval |= UA_Variant_copy(&writeValue->value.value, &((UA_VariableNode *)node)->value);
 		*result = UA_STATUSCODE_GOOD;
 
@@ -446,7 +447,7 @@ UA_Int32 Service_Write(SL_Channel *channel, const UA_WriteRequest *request,
 	//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++){
-		retval |= 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;