Bläddra i källkod

completed generators and code to have it compile w/o errors, generator however still not complete

Leon Urbas 11 år sedan
förälder
incheckning
eadef3eca1
4 ändrade filer med 114 tillägg och 53 borttagningar
  1. 17 4
      tool/generate_builtin.py
  2. 34 4
      tool/generate_namespace.py
  3. 14 45
      tool/opcua_basictypes.c
  4. 49 0
      tool/opcua_basictypes.h

+ 17 - 4
tool/generate_builtin.py

@@ -13,7 +13,7 @@ exclude_types = set(["Boolean", "SByte", "Byte", "Int16", "UInt16", "Int32", "UI
                     "Int64", "UInt64", "Float", "Double", "String", "DateTime", "Guid",
                     "ByteString", "XmlElement", "NodeId", "ExpandedNodeId", "StatusCode", 
                     "QualifiedName", "LocalizedText", "ExtensionObject", "DataValue",
-                     "Variant", "DiagnosticInfo", "NodeIdType"])
+                     "Variant", "DiagnosticInfo", "NodeIdType", "IntegerId"])
 
 elementary_size = dict()
 elementary_size["Boolean"] = 1;
@@ -77,6 +77,13 @@ def createEnumerated(element):
     valuemap = OrderedDict(sorted(valuemap.iteritems(), key=lambda (k,v): int(v)))
     print("typedef UA_UInt32 " + name + ";", end='\n', file=fh);
     print("enum " + name + "_enum { \n" + ",\n\t".join(map(lambda (key, value) : key + " = " + value, valuemap.iteritems())) + "\n};\n", end='\n', file=fh)
+    print("UA_TYPE_METHOD_PROTOTYPES (" + name + ")", end='\n', file=fh)
+    print("UA_TYPE_METHOD_CALCSIZE_AS("+name+", UA_UInt32)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_ENCODE_AS("+name+", UA_UInt32)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DECODE_AS("+name+", UA_UInt32)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DELETE_AS("+name+", UA_UInt32)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DELETEMEMBERS_AS("+name+", UA_UInt32)\n", end='\n', file=fc)
+    
     return
     
 def createStructured(element):
@@ -145,7 +152,7 @@ def createStructured(element):
                 print('\n\t + 4 //' + n, end='', file=fc) # enums are all 32 bit
             elif t.find("**") != -1:
 		print("\n\t + 4 //" + n + "_size", end='', file=fc),
-		print("\n\t + UA_Array_calcSize(ptr->" + n + "_size, UA_" + t[0:t.find("*")].upper() + ", (void**) ptr->" + n +")", end='', file=fc)
+		print("\n\t + UA_Array_calcSize(ptr->" + n + "_size, UA_" + t[0:t.find("*")].upper() + ", (void const**) ptr->" + n +")", end='', file=fc)
             elif t.find("*") != -1:
                 print('\n\t + ' + "UA_" + t[0:t.find("*")] + "_calcSize(ptr->" + n + ')', end='', file=fc)
             else:
@@ -163,7 +170,7 @@ def createStructured(element):
                 print('\tretval |= UA_'+t+'_encode(&(src->'+n+'));', end='\n', file=fc)
             elif t.find("**") != -1:
                 print('\tretval |= UA_Int32_encode(&(src->'+n+'_size),pos,dst); // encode size', end='\n', file=fc)
-		print("\tretval |= UA_Array_encode((void**) (src->"+n+"),src->"+n+"_size, UA_" + t[0:t.find("*")].upper()+",pos,dst);", end='\n', file=fc)
+		print("\tretval |= UA_Array_encode((void const**) (src->"+n+"),src->"+n+"_size, UA_" + t[0:t.find("*")].upper()+",pos,dst);", end='\n', file=fc)
             elif t.find("*") != -1:
                 print('\tretval |= UA_' + t[0:t.find("*")] + "_encode(src->" + n + ',pos,dst);', end='\n', file=fc)
             else:
@@ -177,7 +184,13 @@ def createOpaque(element):
         if child.tag == "{http://opcfoundation.org/BinarySchema/}Documentation":
             print("// " + child.text, end='\n', file=fh)
 
-    print("typedef void* " + name + ";\n", end='\n', file=fh)
+    print("typedef UA_ByteString " + name + ";", end='\n', file=fh)
+    print("UA_TYPE_METHOD_PROTOTYPES (" + name + ")", end='\n', file=fh)
+    print("UA_TYPE_METHOD_CALCSIZE_AS("+name+", UA_ByteString)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_ENCODE_AS("+name+", UA_ByteString)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DECODE_AS("+name+", UA_ByteString)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DELETE_AS("+name+", UA_ByteString)", end='\n', file=fc)
+    print("UA_TYPE_METHOD_DELETEMEMBERS_AS("+name+", UA_ByteString)\n", end='\n', file=fc)
     return
 
 ns = {"opc": "http://opcfoundation.org/BinarySchema/"}

+ 34 - 4
tool/generate_namespace.py

@@ -11,8 +11,32 @@ if len(sys.argv) != 3:
     exit(0)
 
 # types that are to be excluded
-exclude_types = set(["Object","ObjectType","Variable","Method"])
-
+exclude_kind = set(["Object","ObjectType","Variable","Method","ReferenceType"])
+exclude_types = set(["Structure", "BaseDataType", "Number", 
+    "Integer", "UInteger", "Enumeration",
+	"Image", "ImageBMP", "ImageGIF", "ImageJPG", "ImagePNG",
+	"References", "BaseVariableType", "BaseDataVariableType", 
+	"PropertyType", "DataTypeDescriptionType", "DataTypeDictionaryType", "NamingRuleType",
+	"IntegerId","Counter","Duration","NumericRange","Time","Date",
+	"UtcTime", "LocaleId","UserTokenType",
+	"ApplicationType","ApplicationInstanceCertificate",
+	"ServerVendorCapabilityType","ServerStatusType","ServerDiagnosticsSummaryType",
+	"SamplingIntervalDiagnosticsArrayType", "SamplingIntervalDiagnosticsType", 
+	"SubscriptionDiagnosticsArrayType", "SubscriptionDiagnosticsType",
+	"SessionDiagnosticsArrayType", "SessionDiagnosticsVariableType", 
+	"SessionSecurityDiagnosticsArrayType", "SessionSecurityDiagnosticsType", 
+	"DataItemType", "AnalogItemType", "DiscreteItemType", "TwoStateDiscreteType",
+	"MultiStateDiscreteType", "ProgramDiagnosticType", "StateVariableType", "FiniteStateVariableType",
+	"TransitionVariableType", "FiniteTransitionVariableType", "BuildInfoType", "TwoStateVariableType",
+	"ConditionVariableType", "MultiStateValueDiscreteType", "OptionSetType", "ArrayItemType",
+	"YArrayItemType", "XYArrayItemType", "ImageItemType", "CubeItemType", "NDimensionArrayItemType"
+	])
+	
+def skipKind(name):
+    if name in exclude_kind:
+        return True
+    return False
+    
 def skipType(name):
     if name in exclude_types:
         return True
@@ -47,7 +71,10 @@ Int32 UA_namespace_zero_to_index(Int32 id) {
 
 i = 0
 for row in rows1:
-    if skipType(row[2]):
+    if skipKind(row[2]):
+	continue
+
+    if skipType(row[0]):
 	continue
 
     name = "UA_" + row[0]
@@ -61,7 +88,10 @@ print('''\t}\n\treturn retval;
 UA_VTable UA_namespace_zero[] = {''', file=fc)
 
 for row in rows2:
-    if skipType(row[2]):
+    if skipKind(row[2]):
+	continue
+
+    if skipType(row[0]):
 	continue
 
     name = "UA_" + row[0]

+ 14 - 45
tool/opcua_basictypes.c

@@ -27,15 +27,19 @@ Int32 UA_Array_calcSize(Int32 nElements, Int32 type, void const ** data) {
 	}
 	return length;
 }
+Int32 UA_Array_encode(void const **src, Int32 noElements, Int32 type, Int32* pos, char * dst) {
+	//TODO: Implement
+	return UA_ERR_NOT_IMPLEMENTED;
+}
 
 Int32 UA_memfree(void * ptr){
 	free(ptr);
 	return UA_SUCCESS;
 }
 
-Int32 UA_alloc(void * ptr, int size){
-	ptr = malloc(size);
-	if(ptr == NULL) return UA_ERROR;
+Int32 UA_memalloc(void ** ptr, int size){
+	*ptr = malloc(size);
+	if(*ptr == UA_NULL) return UA_ERR_NO_MEMORY;
 	return UA_SUCCESS;
 }
 
@@ -44,41 +48,6 @@ Int32 UA_memcpy(void * dst, void const * src, int size){
 	return UA_SUCCESS;
 }
 
-#define UA_TYPE_METHOD_CALCSIZE_SIZEOF(TYPE) \
-Int32 TYPE##_calcSize(TYPE const * p) { return sizeof(TYPE); }
-
-#define UA_TYPE_METHOD_CALCSIZE_AS(TYPE, TYPE_AS) \
-Int32 TYPE##_calcSize(TYPE const * p) { return TYPE_AS##_calcSize((TYPE_AS*) p); }
-
-#define UA_TYPE_METHOD_DELETE_MEMFREE(TYPE) \
-Int32 TYPE##_delete(TYPE * p) { return UA_memfree(p); };
-
-#define UA_TYPE_METHOD_DELETE_AS(TYPE, TYPE_AS) \
-Int32 TYPE##_delete(TYPE * p) { return TYPE_AS##_delete((TYPE_AS*) p);};
-
-#define UA_TYPE_METHOD_DELETE_STRUCT(TYPE) \
-Int32 TYPE##_delete(TYPE *p) { \
-	Int32 retval = UA_SUCCESS; \
-	retval |= TYPE##_deleteMembers(p); \
-	retval |= UA_memfree(p); \
-	return retval; \
-}
-
-#define UA_TYPE_METHOD_DELETEMEMBERS_NOACTION(TYPE) \
-Int32 TYPE##_deleteMembers(TYPE * p) { return UA_SUCCESS; };
-
-#define UA_TYPE_METHOD_DELETEMEMBERS_AS(TYPE, TYPE_AS) \
-Int32 TYPE##_deleteMembers(TYPE * p) { return TYPE_AS##_deleteMembers((TYPE_AS*) p);};
-
-#define UA_TYPE_METHOD_DECODE_AS(TYPE,TYPE_AS) \
-Int32 TYPE##_decode(char const * src, Int32* pos, TYPE *dst) { \
-	return TYPE_AS##_decode(src,pos,(TYPE_AS*) dst); \
-}
-
-#define UA_TYPE_METHOD_ENCODE_AS(TYPE,TYPE_AS) \
-Int32 TYPE##_encode(TYPE const * src, Int32* pos, char *dst) { \
-	return TYPE_AS##_encode((TYPE_AS*) src,pos,dst); \
-}
 
 UA_TYPE_METHOD_CALCSIZE_SIZEOF(UA_Boolean)
 Int32 UA_Boolean_encode(UA_Boolean const * src, Int32* pos, char * dst) {
@@ -285,7 +254,7 @@ Int32 UA_String_decode(char const * src, Int32* pos, UA_String * dst) {
 	Int32 retval = UA_SUCCESS;
 	retval |= UA_Int32_decode(src,pos,&(dst->length));
 	if (dst->length > 0) {
-		retval |= UA_alloc(&(dst->data),dst->length);
+		retval |= UA_memalloc(&(dst->data),dst->length);
 		retval |= UA_memcpy((void*)&(src[*pos]),dst->data,dst->length);
 		*pos += dst->length;
 	} else {
@@ -300,7 +269,7 @@ Int32 UA_String_copy(UA_String const * src, UA_String* dst) {
 	dst->length = src->length;
 	dst->data = UA_NULL;
 	if (src->length > 0) {
-		retval |= UA_alloc(&(dst->data), src->length);
+		retval |= UA_memalloc(&(dst->data), src->length);
 		if (retval == UA_SUCCESS) {
 			retval |= UA_memcpy((void*)dst->data, src->data, src->length);
 		}
@@ -635,7 +604,7 @@ UA_TYPE_METHOD_DELETE_STRUCT(UA_ExtensionObject)
 Int32 UA_ExtensionObject_deleteMembers(UA_ExtensionObject *p) {
 	Int32 retval = UA_SUCCESS;
 	retval |= UA_NodeId_deleteMembers(&(p->typeId));
-	retval |= UA_String_deleteMembers(&(p->body));
+	retval |= UA_ByteString_deleteMembers(&(p->body));
 	return retval;
 }
 
@@ -673,7 +642,7 @@ Int32 UA_DiagnosticInfo_decode(char const * src, Int32 *pos, UA_DiagnosticInfo *
 			break;
 		case DIEMT_INNER_DIAGNOSTIC_INFO:
 			// innerDiagnosticInfo is a pointer to struct, therefore allocate
-			retval |= UA_memalloc(&(dst->innerDiagnosticInfo),UA_DiagnosticInfo_calcSize(UA_NULL));
+			retval |= UA_memalloc((void **) &(dst->innerDiagnosticInfo),UA_DiagnosticInfo_calcSize(UA_NULL));
 			retval |= UA_DiagnosticInfo_decode(src, pos, dst->innerDiagnosticInfo);
 			break;
 		}
@@ -685,7 +654,7 @@ Int32 UA_DiagnosticInfo_encode(UA_DiagnosticInfo const *src, Int32 *pos, char *d
 	Byte mask;
 	int i;
 
-	UA_ByteString_encode(&(src->encodingMask), pos, dst);
+	UA_Byte_encode(&(src->encodingMask), pos, dst);
 	for (i = 0; i < 7; i++) {
 		switch ( (0x01 << i) & src->encodingMask)  {
 		case DIEMT_SYMBOLIC_ID:
@@ -891,7 +860,7 @@ Int32 UA_Variant_decode(char const * src, Int32 *pos, UA_Variant *dst) {
 		dst->arrayLength = 1;
 	}
 	// allocate place for arrayLength pointers to any type
-	retval |= UA_alloc(&(dst->data),dst->arrayLength * sizeof(void*));
+	retval |= UA_memalloc(&(dst->data),dst->arrayLength * sizeof(void*));
 
 	for (i=0;i<dst->arrayLength;i++) {
 		// TODO: this is crazy, how to work with variants with variable size?
@@ -899,7 +868,7 @@ Int32 UA_Variant_decode(char const * src, Int32 *pos, UA_Variant *dst) {
 		// dynamic members and the storage size with the dynamic members, e.g.
 		// for a string we here need to allocate definitely 8 byte (length=4, data*=4)
 		// on a 32-bit architecture - so this code is definitely wrong
-		retval |= UA_alloc(&(dst->data[i]),dst->vt->calcSize(UA_NULL));
+		retval |= UA_memalloc(&(dst->data[i]),dst->vt->calcSize(UA_NULL));
 		retval |= dst->vt->decode(src,pos,dst->data[i]);
 	}
 	if (dst->encodingMask & (1 << 6)) {

+ 49 - 0
tool/opcua_basictypes.h

@@ -30,12 +30,19 @@ typedef double Double;
 #define UA_ERR_INCONSISTENT  (UA_ERROR | (0x01 << 1))
 #define UA_ERR_INVALID_VALUE (UA_ERROR | (0x01 << 2))
 #define UA_ERR_NO_MEMORY     (UA_ERROR | (0x01 << 3))
+#define UA_ERR_NOT_IMPLEMENTED (UA_ERROR | (0x01 << 4))
 
 /* Boolean values and null */
 #define UA_TRUE (42==42)
 #define TRUE UA_TRUE
 #define UA_FALSE (!UA_TRUE)
 #define FALSE UA_FALSE
+
+/* heap memory functions */
+Int32 UA_memfree(void * ptr);
+Int32 UA_memcpy(void *dst, void const *src, int size);
+Int32 UA_memalloc(void ** dst, int size);
+
 #define UA_NULL ((void*)0)
 // #define NULL UA_NULL
 
@@ -46,6 +53,42 @@ Int32 TYPE##_decode(char const * src, Int32* pos, TYPE * dst);\
 Int32 TYPE##_delete(TYPE * p);\
 Int32 TYPE##_deleteMembers(TYPE * p); \
 
+#define UA_TYPE_METHOD_CALCSIZE_SIZEOF(TYPE) \
+Int32 TYPE##_calcSize(TYPE const * p) { return sizeof(TYPE); }
+
+#define UA_TYPE_METHOD_CALCSIZE_AS(TYPE, TYPE_AS) \
+Int32 TYPE##_calcSize(TYPE const * p) { return TYPE_AS##_calcSize((TYPE_AS*) p); }
+
+#define UA_TYPE_METHOD_DELETE_MEMFREE(TYPE) \
+Int32 TYPE##_delete(TYPE * p) { return UA_memfree(p); };
+
+#define UA_TYPE_METHOD_DELETE_AS(TYPE, TYPE_AS) \
+Int32 TYPE##_delete(TYPE * p) { return TYPE_AS##_delete((TYPE_AS*) p);};
+
+#define UA_TYPE_METHOD_DELETE_STRUCT(TYPE) \
+Int32 TYPE##_delete(TYPE *p) { \
+	Int32 retval = UA_SUCCESS; \
+	retval |= TYPE##_deleteMembers(p); \
+	retval |= UA_memfree(p); \
+	return retval; \
+}
+
+#define UA_TYPE_METHOD_DELETEMEMBERS_NOACTION(TYPE) \
+Int32 TYPE##_deleteMembers(TYPE * p) { return UA_SUCCESS; };
+
+#define UA_TYPE_METHOD_DELETEMEMBERS_AS(TYPE, TYPE_AS) \
+Int32 TYPE##_deleteMembers(TYPE * p) { return TYPE_AS##_deleteMembers((TYPE_AS*) p);};
+
+#define UA_TYPE_METHOD_DECODE_AS(TYPE,TYPE_AS) \
+Int32 TYPE##_decode(char const * src, Int32* pos, TYPE *dst) { \
+	return TYPE_AS##_decode(src,pos,(TYPE_AS*) dst); \
+}
+
+#define UA_TYPE_METHOD_ENCODE_AS(TYPE,TYPE_AS) \
+Int32 TYPE##_encode(TYPE const * src, Int32* pos, char *dst) { \
+	return TYPE_AS##_encode((TYPE_AS*) src,pos,dst); \
+}
+
 /* Prototypes for basic types */
 typedef _Bool UA_Boolean;
 UA_TYPE_METHOD_PROTOTYPES (UA_Boolean)
@@ -95,6 +138,10 @@ enum UA_StatusCode_enum
 };
 UA_TYPE_METHOD_PROTOTYPES (UA_StatusCode)
 
+/** IntegerId - Part: 4, Chapter: 7.13, Page: 118 */
+typedef float UA_IntegerId;
+UA_TYPE_METHOD_PROTOTYPES (UA_IntegerId)
+
 typedef struct T_UA_VTable {
 	UA_UInt32 Id;
 	Int32 (*calcSize)(void const * ptr);
@@ -275,4 +322,6 @@ enum UA_DiagnosticInfoEncodingMaskType_enum
 };
 
 Int32 UA_Array_calcSize(Int32 noElements, Int32 type, void const ** ptr);
+Int32 UA_Array_encode(void const **src, Int32 noElements, Int32 type, Int32* pos, char * dst);
+
 #endif /* OPCUA_BASICTYPES_H_ */