diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 89930a61f..c431ee37a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -622,9 +622,7 @@ PACK(struct MavlinkTelemetryData { */ #if defined(CPUARM) -// TODO struct as others -PACK(class TelemetrySensor { - public: +PACK(struct TelemetrySensor { union { uint16_t id; // data identifier, for FrSky we can reuse existing ones. Source unit is derived from type. uint16_t persistentValue; diff --git a/radio/src/storage/datacopy.cpp b/radio/src/storage/datacopy.cpp index 239db541d..6afc7fb06 100644 --- a/radio/src/storage/datacopy.cpp +++ b/radio/src/storage/datacopy.cpp @@ -1,4 +1,4 @@ -//This file was auto-generated by generate_datacopy.py script on Wed Mar 16 20:12:19 2016. Do not edit this file! +//This file was auto-generated by generate_datacopy.py script on Fri Mar 25 14:17:31 2016. Do not edit this file! @@ -77,6 +77,7 @@ void copyCustomFunctionData(A * dest, B * src) { dest->swtch = src->swtch; dest->func = src->func; + copyCustomFunctionData_all(&dest->all, &src->all); dest->active = src->active; } @@ -165,6 +166,24 @@ void copyFrSkyTelemetryData(A * dest, B * src) } } +template +void copyTelemetrySensor(A * dest, B * src) +{ + dest->id = src->id; + dest->instance = src->instance; + memcpy(dest->label, src->label, sizeof(dest->label)); + dest->type = src->type; + dest->unit = src->unit; + dest->prec = src->prec; + dest->autoOffset = src->autoOffset; + dest->filter = src->filter; + dest->logs = src->logs; + dest->persistent = src->persistent; + dest->onlyPositive = src->onlyPositive; + dest->subId = src->subId; + copyTelemetrySensor_custom(&dest->custom, &src->custom); +} + template void copyModuleData(A * dest, B * src) { @@ -305,3 +324,17 @@ void copyRadioData(A * dest, B * src) dest->potsConfig = src->potsConfig; } +template +void copyCustomFunctionData_all(A * dest, B * src) +{ + dest->val = src->val; + dest->mode = src->mode; + dest->param = src->param; +} + +template +void copyTelemetrySensor_custom(A * dest, B * src) +{ + dest->ratio = src->ratio; + dest->offset = src->offset; +} diff --git a/radio/util/generate_datacopy.py b/radio/util/generate_datacopy.py index 22e87d6d9..493ece838 100755 --- a/radio/util/generate_datacopy.py +++ b/radio/util/generate_datacopy.py @@ -12,33 +12,77 @@ if sys.platform == "darwin": structs = [] +extrastructs = [] + +def build_struct(cursor, anonymousUnion=False): + if not anonymousUnion: + structs.append(cursor.spelling) + print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) -def build_struct(cursor): - structs.append(cursor.spelling) - print("template \nvoid copy%s(A * dest, B * src)\n{" % cursor.spelling) for c in cursor.get_children(): - if c.kind == clang.cindex.CursorKind.FIELD_DECL: - if c.type.get_array_size() > 0: - if c.type.get_array_element_type().spelling in structs: - print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) - print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, c.spelling, c.spelling)) - print(" }") + if c.kind == clang.cindex.CursorKind.UNION_DECL: + if c.spelling: + raise "Cannot handle non anonymous unions" + + copiedUnionMember = False + for uc in c.get_children(): + if not uc.spelling or uc.kind == clang.cindex.CursorKind.PACKED_ATTR: + # Ignore + pass else: - print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (c.spelling, c.spelling, c.spelling)) - elif c.type.get_declaration().spelling in structs: - print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, c.spelling, c.spelling)) - else: - print(" dest->%s = src->%s;" % (c.spelling, c.spelling)) - print("}\n") + # per default we copy only the first member of a union and warn if there are more + # members (declare the other members NOBACKUP) + if copiedUnionMember: + print ("Warning more than one union member (%s) in anynomous union inside struct %s, consider NOBACKUP statements" % (uc.spelling, cursor.spelling), file=sys.stderr) + else: + copy_decl(uc, uc.spelling) + copiedUnionMember = True + + elif c.kind == clang.cindex.CursorKind.FIELD_DECL: + copy_decl(c, c.spelling) + + + if not anonymousUnion: + print("}\n") def build(cursor): result = [] for c in cursor.get_children(): if c.kind == clang.cindex.CursorKind.STRUCT_DECL: build_struct(c) + for c, spelling in extrastructs: + print("template \nvoid copy%s(A * dest, B * src)\n{" % spelling) + build_struct(c, True) + print ("}\n") + return result +def copy_decl(c, spelling): + childs = [ch for ch in c.get_children()] + if c.type.get_array_size() > 0: + if c.type.get_array_element_type().spelling in structs: + print(" for (int i=0; i<%d; i++) {" % c.type.get_array_size()) + print(" copy%s(&dest->%s[i], &src->%s[i]);" % (c.type.get_array_element_type().spelling, spelling, spelling)) + print(" }") + else: + print(" memcpy(dest->%s, src->%s, sizeof(dest->%s));" % (spelling, spelling, spelling)) + elif c.type.kind == clang.cindex.TypeKind.UNEXPOSED and len(childs)==1 and childs[0].kind == clang.cindex.CursorKind.STRUCT_DECL: + # inline declared structs + if c.semantic_parent.spelling: + spellingFunc = c.semantic_parent.spelling + "_" + spelling + else: + spellingFunc = c.semantic_parent.semantic_parent.spelling + "_" + spelling + + extrastructs.append((childs[0], spellingFunc)) + print(" copy%s(&dest->%s, &src->%s);" % (spellingFunc, spelling, spelling)) + + elif c.type.get_declaration().spelling in structs: + print(" copy%s(&dest->%s, &src->%s);" % (c.type.get_declaration().spelling, spelling, spelling)) + else: + print(" dest->%s = src->%s;" % (spelling, spelling)) + + def header(): print("//This file was auto-generated by %s script on %s. Do not edit this file!\n\n\n" % (os.path.basename(sys.argv[0]), time.asctime()))