Beispiel #1
0
def setFn(field):
    valueString = setMath("value", field, "")
    lookup = ""
    if "Enum" in field:
        # find index that corresponds to string input param
        lookup = enumLookup(field)        
    param = "value"
    loc = str(MsgParser.fieldLocation(field))
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += ", idx"
    ret = '''\
%s
<MSGSHORTNAME>.prototype.Set%s = function(%s)
{
    %sthis.m_data.set%s(%s, %s%s);
};''' % (fnHdr(field), field["Name"], param, lookup, fieldType(field), loc, valueString, endian_string())
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        ret += '''
%s
<MSGSHORTNAME>.prototype.Set%sString = function(value)
{
    for(i=0; i<%s && i<value.length; i++)
    {
        this.Set%s(value[i].charCodeAt(0), i);
    }
};''' % (fnHdr(field), field["Name"], str(MsgParser.fieldCount(field)), field["Name"])
    return ret
def setFn(field, offset):
    paramType = returnType(field, None)
    valueString = setMath("value", field)
    #if "Enum" in field:
    #    valueString = paramType + "(" + valueString + ")"
    #    paramType = field["Enum"]
    param = paramType + " value"
    loc = str(offset)
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldSize(field))
        param += ", int idx"
    ret = '''\
%s
void Set%s(%s)
{
    _data.set%s(%s, %s);
}''' % (fnHdr(field), field["Name"], param, fieldType(field), loc, valueString)
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8"
                                                   or field["Type"] == "int8"):
        ret += '''
%s
void Set%sString(String value)
{
    for(int i=0; i<%s && i<value.length; i++)
    {
        Set%s(value.codeUnitAt(i), i);
    }
}''' % (fnHdr(field), field["Name"], str(
            MsgParser.fieldCount(field)), field["Name"])
    return ret
Beispiel #3
0
def setFn(field):
    valueString = setMath("value", field, fieldType(field))
    param = "_ value: " + paramType(field)
    loc = str(MsgParser.fieldLocation(field))
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += ", _ idx: Int"
    ret = '''\
%s
public func Set%s(%s)
{
    m_data.SetField(offset: %s, value: %s);
};''' % (fnHdr(field), field["Name"], param, loc, valueString)
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        ret += '''
%s
public func Set%sString(value: String)
{
    let stringArray = Array(value.utf8);
    for i in 0 ..< min(%s, stringArray.count)
    {
        Set%s(stringArray[i], i);
    }
};''' % (fnHdr(field), field["Name"], str(MsgParser.fieldCount(field)), field["Name"])
    return ret
Beispiel #4
0
def fieldReflection(msg, field):
    fieldFnName = field["Name"]
    fieldCount = MsgParser.fieldCount(field)
    if MsgParser.fieldCount(field) != 1 and MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        fieldFnName = field["Name"]+"String"
        fieldCount = 1
    fieldInfo = "["+\
                  '"name":"'+field["Name"] + '",'+\
                  '"type":"'+reflectionInterfaceType(field) + '",'+\
                  '"units":"'+MsgParser.fieldUnits(field) + '",'+\
                  '"minVal":"'+str(MsgParser.fieldMin(field)) + '",'+\
                  '"maxVal":"'+str(MsgParser.fieldMax(field)) + '",'+\
                  '"description":"'+MsgParser.fieldDescription(field) + '",'+\
                  '"get":"Get' + fieldFnName + '",'+\
                  '"set":"Set' + fieldFnName  + '",'+\
                  '"count":'+str(fieldCount) + ', '
    if "Bitfields" in field:
        bitfieldInfo = []
        for bits in field["Bitfields"]:
            bitfieldInfo.append("    " + bitfieldReflection(msg, field, bits))
        fieldInfo += '"bitfieldInfo" : [\n' + ",\n".join(bitfieldInfo) + "], "
    else:
        fieldInfo += '"bitfieldInfo" : [], '
    if "Enum" in field:
        fieldInfo += '"enumLookup" : [' + field["Enum"]+"Enum, " + "Reverse" + field["Enum"]+"Enum]]"
    else:
        fieldInfo += '"enumLookup" : []]'
    return fieldInfo
Beispiel #5
0
def structUnpacking(msg):
    ret = []

    if "Fields" in msg:
        for field in msg["Fields"]:
            if "Bitfields" in field:
                for bits in field["Bitfields"]:
                    ret.append('try { ret["' + bits["Name"] + '"] = Get' +
                               bits["Name"] + "(); } catch (err) {}")
            else:
                if MsgParser.fieldCount(field) == 1:
                    ret.append('try { ret["' + field["Name"] + '"] = Get' +
                               field["Name"] + "(); } catch (err) {}")
                else:
                    if MsgParser.fieldUnits(field) == "ASCII" and (
                            field["Type"] == "uint8"
                            or field["Type"] == "int8"):
                        ret.append('try { ret["' + field["Name"] + '"] = Get' +
                                   field["Name"] +
                                   "String(); } catch (err) {}")
                    else:
                        ret.append('try { ret["' + field["Name"] +
                                   '"] = []; } catch (err) {}')
                        ret.append('try { ')
                        ret.append("    for i in 0 ..< " +
                                   str(MsgParser.fieldCount(field)))
                        ret.append('    {')
                        ret.append('        ret["' + field["Name"] +
                                   '"][i] = Get' + field["Name"] + "(i);")
                        ret.append('    }')
                        ret.append('} catch (err) {}')

    return "\n".join(ret)
Beispiel #6
0
def fieldReflection(msg, field):
    fieldFnName = field["Name"]
    fieldCount = MsgParser.fieldCount(field)
    if MsgParser.fieldCount(field) != 1 and MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        fieldFnName = field["Name"]+"String"
        fieldCount = 1
    fieldInfo = "{"+\
                  'name:"'+field["Name"] + '",'+\
                  'type:"'+reflectionInterfaceType(field) + '",'+\
                  'units:"'+MsgParser.fieldUnits(field) + '",'+\
                  'minVal:"'+str(MsgParser.fieldMin(field)) + '",'+\
                  'maxVal:"'+str(MsgParser.fieldMax(field)) + '",'+\
                  'description:"'+MsgParser.fieldDescription(field) + '",'+\
                  'get:"Get' + fieldFnName + '",'+\
                  'set:"Set' + fieldFnName  + '",'+\
                  'count:'+str(fieldCount) + ', '
    if "Bitfields" in field:
        bitfieldInfo = []
        for bits in field["Bitfields"]:
            bitfieldInfo.append("    " + bitfieldReflection(msg, field, bits))
        fieldInfo += "bitfieldInfo : [\n" + ",\n".join(bitfieldInfo) + "], "
    else:
        fieldInfo += "bitfieldInfo : [], "
    if "Enum" in field:
        fieldInfo += "enumLookup : [<MSGSHORTNAME>." + field["Enum"]+", " + "<MSGSHORTNAME>.Reverse" + field["Enum"]+"]}"
    else:
        fieldInfo += "enumLookup : []}"
    return fieldInfo
Beispiel #7
0
def initField(field):
    if "Default" in field:
        if MsgParser.fieldCount(field) > 1:
            ret = "for (int i=0; i<" + str(MsgParser.fieldCount(field)) + "; i++)\n"
            ret += "    "+namespace+"Set" + field["Name"] + "(" + params(firstParam, str(fieldDefault(field, True))) + ", i);" 
            return ret;
        else:
            return  namespace+"Set" + field["Name"] + "(" + params(firstParam, str(fieldDefault(field, True))) + ");"
    return ""
Beispiel #8
0
def initField(msg, field):
    defaultValue = fieldType(field) + "("+ fieldDefault(field) +")"
    if MsgParser.fieldCount(field) > 1:
        ret =  "for index="+str(MsgParser.fieldCount(field))+": -1: 1\n"
        ret += "    obj." + matlabFieldName(msg,field) + "(index) = " + defaultValue + ";\n"
        ret += "end"
        return ret
    else:
        return  "obj." + matlabFieldName(msg,field) + " = " + defaultValue + ";"
Beispiel #9
0
def fieldInfo(field):
    ret = ""
    if "Default" in field:
        ret += '#define <MSGNAME>_'+field["Name"]+'_DEFAULT ' + str(fieldDefault(field)) + "\n"
    if MsgParser.fieldCount(field) > 1:
        ret += '#define <MSGNAME>_'+field["Name"]+'_COUNT ' + str(MsgParser.fieldCount(field)) + "\n"
    ret += '#define <MSGNAME>_'+field["Name"]+'_OFFSET ' + str(MsgParser.fieldLocation(field)) + "\n"
    ret += '#define <MSGNAME>_'+field["Name"]+'_SIZE ' + str(MsgParser.fieldSize(field)) + "\n"
    return ret
Beispiel #10
0
def initField(field):
    if "Default" in field:
        if MsgParser.fieldCount(field) > 1:
            ret = "for (i=0; i<" + str(MsgParser.fieldCount(field)) + "; i++)\n"
            ret += "    this.Set" + field["Name"] + "(" + str(field["Default"]) + ", i);" 
            return ret;
        else:
            return  "this.Set" + field["Name"] + "(" + str(field["Default"]) + ");"
    return ""
Beispiel #11
0
def initField(msg, field):
    defaultValue = fieldType(field) + "("+ fieldDefault(field) +")"
    if MsgParser.fieldCount(field) > 1:
        ret =  "for index="+str(MsgParser.fieldCount(field))+": -1: 1\n"
        ret += "    obj." + matlabFieldName(msg,field) + "(index) = " + defaultValue + ";\n"
        ret += "end"
        return ret
    else:
        return  "obj." + matlabFieldName(msg,field) + " = " + defaultValue + ";"
Beispiel #12
0
def initField(field):
    type = fieldType(field)
    if "Default" in field:
        if MsgParser.fieldCount(field) > 1:
            ret = "for (int i=0; i<" + str(MsgParser.fieldCount(field)) + "; i++)\n"
            ret += "    Set%s((%s)%s, i);" % (field["Name"], type, languageConst(field["Default"])) 
            return ret;
        else:
            return  "Set%s((%s)%s);" % (field["Name"],type, languageConst(field["Default"]))
    return ""
Beispiel #13
0
def initField(field):
    if "Default" in field:
        if MsgParser.fieldCount(field) > 1:
            ret = "for i in 0 ..< "+str(MsgParser.fieldCount(field))+"\n"
            ret += "{\n"
            ret += "    Set" + field["Name"] + "(" + str(field["Default"]) + ", i);\n"
            ret += "}\n"
            return ret;
        else:
            return  "Set" + field["Name"] + "(" + str(field["Default"]) + ");"
    return ""
Beispiel #14
0
def initField(field):
    if "Default" in field:
        if MsgParser.fieldCount(field) > 1:
            ret = "for (i in 0 until " + str(
                MsgParser.fieldCount(field)) + ") {\n"
            ret += "    set" + field["Name"] + "(" + str(
                field["Default"]) + literalSuffix(field) + ", i)\n"
            ret += "}\n"
            return ret
        else:
            return "set" + field["Name"] + "(" + str(
                field["Default"]) + literalSuffix(field) + ")"
    return ""
Beispiel #15
0
def arrayAccessor(field):
    # if we've got floating point conversion, don't do an array accessor
    if "Offset" in field or "Scale" in field:
        return ""
    # if we're not an array, don't do an array accessor
    if MsgParser.fieldCount(field) == 1:
        return ""
    # if we're not contiguous, don't do an array accessor
    if MsgParser.fieldSize(field) != MsgParser.fieldArrayElementOffset(field):
        return ""
    # if we don't have natural alignment, don't do an array accessor
    if MsgParser.fieldLocation(field) % MsgParser.fieldSize(field) != 0:
        return ""
    loc = str(MsgParser.fieldLocation(field))
    access = "(%s*)&m_data[%s]" % (fieldType(field), loc)
    ret = '''\
%s
%s* %s(%s)
{
    return %s;
}''' % (fnHdr(field), functionPrefix+fieldType(field), namespace+field["Name"], firstParamDecl, access)

    if MsgParser.fieldSize(field) != 1:
        if MsgParser.big_endian:
            ret = "#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \n" + ret + "\n#endif\n"
        else:
            ret = "#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ \n" + ret + "\n#endif\n"
    return ret
Beispiel #16
0
def setFn(msg, field):
    loc = msgName(msg) + ".MSG_OFFSET + " + str(MsgParser.fieldLocation(field))
    count = MsgParser.fieldCount(field)
    type = fieldType(field)
    lookup = ""
    if "Enum" in field:
        # find index that corresponds to string input param
        lookup = enumLookup(msg, field)
    math = MsgParser.setMath("value", field, "int")
    storageType = field["Type"]
    if "int" in storageType:
        math = "min(max(%s, %s), %s)" % (math, MsgParser.fieldStorageMin(storageType), MsgParser.fieldStorageMax(storageType))
    math = lookup + "tmp = " + math
    if count > 1:
        if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
            type = str(count) + "s"
            count = 1
            math = "tmp = value.encode('utf-8')"
        else:
            loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
    ret  = '''\
%s
    %s
    struct.pack_into('%s', self.rawBuffer(), %s, tmp)
''' % (fnHdr(field,MsgParser.fieldLocation(field),count, "Set"+field["Name"]), math, type, loc)
    return ret
Beispiel #17
0
def getFn(msg, field):
    loc = msgName(msg) + ".MSG_OFFSET + " + str(MsgParser.fieldLocation(field))
    type = "'"+fieldType(field)+"'"
    count = MsgParser.fieldCount(field)
    cleanup = ""
    preface = ""
    if "Enum" in field:
        # find index that corresponds to string input param
        cleanup = reverseEnumLookup(msg, field)
    if  count > 1:
        if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
            preface += "\n    count = " + str(count)+"\n"
            preface += "    if count > len(self.rawBuffer())-("+loc+"):\n"
            preface += "        count = len(self.rawBuffer())-("+loc+")\n"
            type = "str(count)+'s'"
            count = 1
            cleanup = '''ascii_len = str(value).find("\\\\x00")
    value = str(value)[2:ascii_len]
    ''' 
        else:
            loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
    if "Offset" in field or "Scale" in field:
        cleanup = "value = " + MsgParser.getMath("value", field, "")+"\n    "
    ret = '''\
%s%s
    value = struct.unpack_from(%s, self.rawBuffer(), %s)[0]
    %sreturn value
''' % (fnHdr(field,MsgParser.fieldLocation(field),count, "Get"+field["Name"]), preface, type, loc, cleanup)
    return ret
Beispiel #18
0
def structPacking(msg):
    ret = []

    if "Fields" in msg:    
        for field in msg["Fields"]:
            if "Bitfields" in field:
                for bits in field["Bitfields"]:
                    ret.append("msg.Set" + bits["Name"] + "("+bits["Name"]+");")
            else:
                if MsgParser.fieldCount(field) == 1:
                    ret.append("msg.Set" + field["Name"] + "("+field["Name"]+");")
                else:
                    ret.append("for(int i=0; i<"+str(MsgParser.fieldCount(field))+"; i++)")
                    ret.append("    msg.Set" + field["Name"] + "("+field["Name"] + "[i], i);")
                
    return "\n".join(ret)
Beispiel #19
0
def getFn(msg, field):
    loc = str(1+MsgParser.fieldLocation(field))
    end_loc = str(1+MsgParser.fieldLocation(field) + MsgParser.fieldSize(field)*MsgParser.fieldCount(field)-1)
    param = "obj"
    access = "typecast(obj.m_data(%s:%s), '%s')" % (loc, end_loc, fieldType(field))
    if MsgParser.big_endian:
        access = "swapbytes(%s)" % access
    access = getMath(access, field, typeForScaledInt(field))
    retType = fieldType(field)
    if "Offset" in field or "Scale" in field:
        retType = typeForScaledInt(field)
    asInt = ""
    if "Enum" in field:
        asInt = "AsInt"
    ret = '''\
%s
function ret = get.%s%s(%s)
    ret = %s;
end
''' % (fnHdr(field), matlabFieldName(msg,field), asInt, param, access)
    if "Enum" in field:
        ret += '''\
%s
function ret = get.%s(%s)
    ret = obj.%sAsInt;
''' % (fnHdr(field), matlabFieldName(msg,field), param, matlabFieldName(msg,field))
        ret += "    if isKey(obj."+field["Enum"]+"Enum, ret)\n"
        ret += "        ret = obj."+field["Enum"]+"Enum(ret);\n"
        ret += "    end\n"
        ret += "end\n"
    # Need to handle arrays of structs, where elements of array are not contiguous!
    if MsgParser.fieldSize(field) != MsgParser.fieldArrayElementOffset(field):
        ret = "ERROR! Need to handle arrays of structs, where elements of array are not contiguous!\n" + ret 
    return ret
Beispiel #20
0
def setFn(msg, field):
    valueString = setMath("value", field, fieldType(field))
    loc = str(1+MsgParser.fieldLocation(field))
    end_loc = str(1+MsgParser.fieldLocation(field) + MsgParser.fieldSize(field)*MsgParser.fieldCount(field)-1)
    asInt = ""
    if "Enum" in field:
        asInt = "AsInt"
    ret = '''\
%s
function obj = set.%s%s(obj, value)
''' % (fnHdr(field), matlabFieldName(msg,field), asInt)
    if MsgParser.big_endian:
        swap = "swapbytes"
    else:
        swap = ""
    ret += '''\
    obj.m_data(%s:%s) = typecast(%s(%s(%s)), 'uint8');
end
''' % (loc, end_loc, swap, fieldType(field), valueString)
    if "Enum" in field:
        ret += '''\
%s
function obj = set.%s(obj, value)
''' % (fnHdr(field), matlabFieldName(msg,field))
        ret += "    if isKey(obj.Reverse"+field["Enum"]+"Enum, value)\n"
        ret += "        value = obj.Reverse"+field["Enum"]+"Enum(value);\n"
        ret += "    end\n"
        ret += "    obj."+matlabFieldName(msg,field)+"AsInt = value;\n"
        ret += "end\n"
    # Need to handle arrays of structs, where elements of array are not contiguous!
    if MsgParser.fieldSize(field) != MsgParser.fieldArrayElementOffset(field):
        ret = "ERROR! Need to handle arrays of structs, where elements of array are not contiguous!\n" + ret 
    return ret
Beispiel #21
0
def arrayAccessor(field):
    # if we've got floating point conversion, don't do an array accessor
    if "Offset" in field or "Scale" in field:
        return ""
    # if we're not an array, don't do an array accessor
    if MsgParser.fieldCount(field) == 1:
        return ""
    # if we're not contiguous, don't do an array accessor
    if MsgParser.fieldSize(field) != MsgParser.fieldArrayElementOffset(field):
        return ""
    # if we don't have natural alignment, don't do an array accessor
    if MsgParser.fieldLocation(field) % MsgParser.fieldSize(field) != 0:
        return ""
    loc = str(MsgParser.fieldLocation(field))
    access = "(%s*)&m_data[%s]" % (fieldType(field), loc)
    ret = '''\
%s
%s* %s(%s)
{
    return %s;
}''' % (fnHdr(field), functionPrefix + fieldType(field),
        namespace + field["Name"], firstParamDecl, access)

    if MsgParser.fieldSize(field) != 1:
        if MsgParser.big_endian:
            ret = "#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \n" + ret + "\n#endif\n"
        else:
            ret = "#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ \n" + ret + "\n#endif\n"
    return ret
Beispiel #22
0
def fnHdr(field, offset, count, name):
    param = "self"
    if str.find(name, "Set") == 0:
        param += ", value"
    if  count > 1:
        param += ", idx"
    if str.find(name, "Set") != 0:
        if "Enum" in field:
            param += ", enumAsInt=0"
        
    min = MsgParser.fieldMin(field)
    max = MsgParser.fieldMax(field)
    
    try:
        fieldSize = MsgParser.fieldSize(field)
        if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
            count = MsgParser.fieldCount(field)
    except KeyError:
        fieldSize = 0
        
    ret = '''\
@msg.units('%s')
@msg.default('%s')
@msg.minVal('%s')
@msg.maxVal('%s')
@msg.offset('%s')
@msg.size('%s')
@msg.count(%s)
def %s(%s):
    """%s"""''' % (MsgParser.fieldUnits(field), str(MsgParser.fieldDefault(field)), str(min), str(max), str(offset), str(fieldSize), str(count), name, param, MsgParser.fieldDescription(field))
    return ret
Beispiel #23
0
def fieldBitsReflection(field, bits, bitOffset, numBits):
    loc = str(MsgParser.fieldLocation(field))
    params = "FieldInfo";
    params += "("
    params += '"'+bits["Name"] + '"'
    params += ', "' + MsgParser.fieldDescription(bits) + '"'
    params += ', "' + MsgParser.fieldUnits(bits) + '"'
    params += ", " + str(MsgParser.fieldCount(bits))
    params += ")"
    return params
Beispiel #24
0
def fieldReflection(field):
    loc = str(MsgParser.fieldLocation(field))
    params = "FieldInfo";
    params += "("
    params += '"'+field["Name"] + '"'
    params += ', "' + MsgParser.fieldDescription(field) + '"'
    params += ', "' + MsgParser.fieldUnits(field) + '"'
    params += ", " + str(MsgParser.fieldCount(field))
    params += ")"
    return params
Beispiel #25
0
def getFn(field):
    loc = str(MsgParser.fieldLocation(field))
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += " + index*" + str(MsgParser.fieldArrayElementOffset(field))
        param += "index: Int"
    retType = fieldType(field)
    if "Offset" in field or "Scale" in field:
        retType = typeForScaledInt(field)
    ret = '''\
%s
fun get%s(%s): %s {
''' % (fnHdr(field), field["Name"], param, retType)
    access = "data.get%s(%s%s)" % (fieldType(field), loc, endian_string())
    if ("Offset" in field or "Scale" in field):
        ret += '    val valI : ' + fieldType(field) + ' = ' + access + '\n'
        access = getMath("valI", field, "Double")
        ret += '    val valD = ' + access + '\n'
        ret += '    return valD\n'
    else:
        ret += '    return %s\n' % (access)
    ret += '}'
    if MsgParser.fieldUnits(field) == "ASCII" and MsgParser.fieldCount(
            field) > 1 and (field["Type"] == "uint8"
                            or field["Type"] == "int8"):
        ret += '''
%s
fun get%sString(): String {
    var value = ""
    for (i in 0 until minOf(%s, header.getDataLength().toInt() - %s)) {
        val nextChar = get%s(i)
        if (nextChar == 0.toUByte()) {
            break
        }
        value += nextChar.toByte().toChar()
    }
    return value
}''' % (fnHdr(field), field["Name"], str(MsgParser.fieldCount(field)),
        str(MsgParser.fieldLocation(field)), field["Name"])
    return ret
Beispiel #26
0
def getFn(field, offset):
    loc = str(offset)
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldSize(field))
        param += "_ idx: Int"
    ret = '''\
%s
public func Get%s(%s) -> %s
{
''' % (fnHdr(field), field["Name"], param, paramType(field))
    access = "m_data.GetField(offset: %s)" % (loc)
    if ("Offset" in field or "Scale" in field):
        ret += '    let valI : ' + fieldType(field) + ' = ' + access + ';\n'
        access = getMath("valI", field, "Double")
        ret += '    let valD = ' + access + ';\n'
        ret += '    return valD;\n'
    else:
        ret += '    return %s;\n' % (access)
    ret += '};'
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8"
                                                   or field["Type"] == "int8"):
        ret += '''
%s
public func Get%sString() -> String
{
    var value = "";
    for i in 0 ..< min(%s, hdr.GetDataLength()-%s)
    {
        let nextChar = Get%s(Int(i));
        if(nextChar == 0)
        {
            break;
        }
        value += String(nextChar);
    }
    return value;
};''' % (fnHdr(field), field["Name"], str(
            MsgParser.fieldCount(field)), offset, field["Name"])
    return ret
Beispiel #27
0
def structUnpacking(msg):
    ret = []

    if "Fields" in msg:    
        for field in msg["Fields"]:
            if "Bitfields" in field:
                for bits in field["Bitfields"]:
                    ret.append('try { ret["'+bits["Name"] + '"] = this.Get' + bits["Name"] + "(); } catch (err) {}")
            else:
                if MsgParser.fieldCount(field) == 1:
                    ret.append('try { ret["'+field["Name"] + '"] = this.Get' + field["Name"] + "(); } catch (err) {}")
                else:
                    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
                        ret.append('try { ret["'+field["Name"] + '"] = this.Get' + field["Name"] + "String(); } catch (err) {}")
                    else:
                        ret.append('try { ret["'+field["Name"] + '"] = []; } catch (err) {}')
                        ret.append('try { ')
                        ret.append("    for(i=0; i<"+str(MsgParser.fieldCount(field))+"; i++)")
                        ret.append('        ret["'+field["Name"] + '"][i] = this.Get' + field["Name"] + "(i);")
                        ret.append('} catch (err) {}')
            
    return "\n".join(ret)
Beispiel #28
0
def genericInfo(field, loc, type):
    params  = '    public static final int loc = ' + loc + ';\n'
    params += '    public static final %s max = (%s)%s;\n' % (type, type, fieldMax(field))
    params += '    public static final %s min = (%s)%s;\n' % (type, type, fieldMin(field))
    params += '    public static final String units = "' + str(MsgParser.fieldUnits(field)) + '"' + ';\n'
    params += '    public static final int count = ' + str(MsgParser.fieldCount(field)) + ';\n'
    if "Default" in field:
        params += '    public static final %s defaultValue = (%s)%s;\n' % (type, type, languageConst(field["Default"]))
    if "Scale" in field:
        params += '    public static final float scale = (float)' + str(field["Scale"]) + ';\n'
    if "Offset" in field:
        params += '    public static final float offset = (float)' + str(field["Offset"]) + ';\n'
    return params
Beispiel #29
0
def genericInfo(field, loc, type):
    params  = '    int static constexpr loc   = ' + loc + ';\n'
    params += '    '+type+' static constexpr max   = ' + fieldMax(field) + ';\n'
    params += '    '+type+' static constexpr min   = ' + fieldMin(field) + ';\n'
    params += '    char static constexpr units[] = "' + str(MsgParser.fieldUnits(field)) + '"' + ';\n'
    params += '    int static constexpr count = ' + str(MsgParser.fieldCount(field)) + ';\n'
    if "Default" in field:
        params += '    '+type+' static constexpr defaultValue = ' + str(fieldDefault(field)) + ";\n" 
    if "Scale" in field:
        params += '    auto static constexpr scale = ' + str(field["Scale"]) + ';\n'
    if "Offset" in field:
        params += '    auto static constexpr offset = ' + str(field["Offset"]) + ';\n'
    return params
Beispiel #30
0
def genericInfo(field, loc, type):
    params  = '    static final int loc   = ' + loc + ';\n'
    params += '    static final '+type+' max   = ' + fieldMax(field) + ';\n'
    params += '    static final '+type+' min   = ' + fieldMin(field) + ';\n'
    params += '    static final String units = "' + str(MsgParser.fieldUnits(field)) + '"' + ';\n'
    params += '    static final int count = ' + str(MsgParser.fieldCount(field)) + ';\n'
    if "Default" in field:
        params += '    static final '+type+' defaultValue = ' + str(field["Default"]) + ";\n" 
    if "Scale" in field:
        params += '    static final int scale = ' + str(field["Scale"]) + ';\n'
    if "Offset" in field:
        params += '    static final int offset = ' + str(field["Offset"]) + ';\n'
    return params
Beispiel #31
0
def getFn(field):
    loc = str(MsgParser.fieldLocation(field))
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += "_ idx: Int"
    ret = '''\
%s
public func Get%s(%s) -> %s
{
''' % (fnHdr(field), field["Name"], param, paramType(field))
    access = "m_data.GetField(offset: %s)" % (loc)
    if ("Offset" in field or "Scale" in field):
        ret += '    let valI : '+fieldType(field)+' = '+access+';\n'
        access = getMath("valI", field, "Double")
        ret += '    let valD = '+access+';\n'
        ret += '    return valD;\n'
    else:
        ret += '    return %s;\n' % (access)
    ret += '};'
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        ret += '''
%s
public func Get%sString() -> String
{
    var value = "";
    for i in 0 ..< min(%s, hdr.GetDataLength()-%s)
    {
        let nextChar = Get%s(Int(i));
        if(nextChar == 0)
        {
            break;
        }
        value += String(nextChar);
    }
    return value;
};''' % (fnHdr(field), field["Name"], str(MsgParser.fieldCount(field)), str(MsgParser.fieldLocation(field)), field["Name"])
    return ret
Beispiel #32
0
def getFn(field):
    loc = str(MsgParser.fieldLocation(field))
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += "idx"
    if "Enum" in field:
        if param != "":
            param += ", "
        param += "enumAsInt=false"
    access = "(this.m_data.get%s(%s%s))" % (fieldType(field), loc, endian_string())
    access = getMath(access, field, "")
    cleanup = ""
    if "Enum" in field:
        cleanup = reverseEnumLookup(field)
    ret = '''\
%s
<MSGSHORTNAME>.prototype.Get%s = function(%s)
{
    var value = %s;
    %sreturn value;
};''' % (fnHdr(field), field["Name"], param, access, cleanup)
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8" or field["Type"] == "int8"):
        ret += '''
%s
<MSGSHORTNAME>.prototype.Get%sString = function()
{
    var value = '';
    for(i=0; i<%s && i<this.hdr.GetDataLength()-%s; i++)
    {
        nextChar = String.fromCharCode(this.Get%s(i));
        if(nextChar == '\\0')
            break;
        value += nextChar;
    }
    return value;
};''' % (fnHdr(field), field["Name"], str(MsgParser.fieldCount(field)), str(MsgParser.fieldLocation(field)), field["Name"])
    return ret
Beispiel #33
0
def declarations(msg):
    ret = []
    if "Fields" in msg:
        for field in msg["Fields"]:
            if "Bitfields" in field:
                for bits in field["Bitfields"]:
                    retType = fieldType(field)
                    if "Offset" in bits or "Scale" in bits:
                        retType = typeForScaledInt(bits)
                    elif "Enum" in bits:
                        retType = "<MSGNAME>Message::"+bits["Enum"]
                    ret.append(retType + " " + bits["Name"] + ";")
            else:
                retType = fieldType(field)
                if "Offset" in field or "Scale" in field:
                    retType = typeForScaledInt(field)
                elif "Enum" in field:
                    retType = "<MSGNAME>Message::"+field["Enum"]
                if MsgParser.fieldCount(field) == 1:
                    ret.append(retType + " " + field["Name"] + ";")
                else:
                    ret.append(retType + " " + field["Name"] + "["+str(MsgParser.fieldCount(field))+"];")
    return ret
def getFn(field, offset):
    loc = str(offset)
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldSize(field))
        param += "int idx"
    access = "_data.get%s(%s)" % (fieldType(field), loc)
    access = getMath(access, field)
    retType = returnType(field, None)
    #elif "Enum" in field:
    #    retType = field["Enum"]
    #    access = retType + "(" + access + ")"
    ret = '''\
%s
%s Get%s(%s)
{
    return %s;
}''' % (fnHdr(field), retType, field["Name"], param, access)
    if MsgParser.fieldUnits(field) == "ASCII" and (field["Type"] == "uint8"
                                                   or field["Type"] == "int8"):
        ret += '''
%s
String Get%sString()
{
    final StringBuffer ret = new StringBuffer();
    for(int i=0; i<%s && i<_hdr.GetDataLength()-%s; i++)
    {
        final String nextChar = new String.fromCharCode(Get%s(i));
        if(nextChar == '\\0')
            break;
        ret.write(nextChar);
    }
    return ret.toString();
}''' % (fnHdr(field), field["Name"], str(
            MsgParser.fieldCount(field)), offset, field["Name"])
    return ret
Beispiel #35
0
def setFn(field):
    paramType = fieldType(field)
    valueString = setMath("value", field, '('+fieldType(field)+')', 'f')
    if "Offset" in field or "Scale" in field:
        paramType = typeForScaledInt(field)
    #elif "Enum" in field:
    #    valueString = valueString + ".intValue()"
    #    paramType = field["Enum"]
    param = paramType + " value"
    loc = str(MsgParser.fieldLocation(field))
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += ", int idx"
    ret = '''\
%s
public void Set%s(%s)
{
    m_data.put%s(%s, (%s)%s);
}''' % (fnHdr(field), field["Name"], param, fieldAccessorType(field), loc, fieldCastType(field).lower(), valueString)
    return ret
Beispiel #36
0
def fieldReflection(field):
    loc = str(MsgParser.fieldLocation(field))
    type = fieldReflectionType(field)
    params = type;
    params += "("
    params += '"'+field["Name"] + '"'
    params += ', "' + MsgParser.fieldDescription(field) + '"'
    params += ', "' + MsgParser.fieldUnits(field) + '"'
    params += ", " + loc
    params += ", " + str(MsgParser.fieldSize(field))
    params += ", " + str(MsgParser.fieldCount(field))
    if "Offset" in field or "Scale" in field:
        if "Scale" in field:
            params += ", " + str(field["Scale"])
        else:
            params += ", 1.0"
        if "Offset" in field:
            params += ", " + str(field["Offset"])
        else:
            params += ", 0.0"
    params += ")"
    return params
Beispiel #37
0
def setFn(field):
    paramType = fieldType(field)
    valueString = setMath("value", field, "("+fieldType(field)+")", 'f')
    if "Offset" in field or "Scale" in field:
        paramType = typeForScaledInt(field)
    elif "Enum" in field and namespace == "":
        valueString = "("+paramType+")" + "(" + valueString + ")"
        paramType = namespace+field["Enum"]
    param = paramType + " value"
    loc = str(MsgParser.fieldLocation(field))
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += ", int idx"
    ret = '''\
%s
%s %s(%s)
{
    Set_%s(&m_data[%s], %s);
}''' % (fnHdr(field), functionPrefix+"void", namespace+"Set"+field["Name"], params(firstParamDecl, param), fieldType(field), loc, valueString)
    if "float" in paramType or "double" in paramType:
        ret = "#ifndef DISABLE_FLOAT_ACCESSORS\n" + ret + "\n#endif\n"
    return ret
Beispiel #38
0
def getFn(field):
    loc = str(MsgParser.fieldLocation(field))
    param = ""
    if MsgParser.fieldCount(field) > 1:
        loc += "+idx*" + str(MsgParser.fieldArrayElementOffset(field))
        param += "int idx"
    access = "Get_%s(&m_data[%s])" % (fieldType(field), loc)
    access = getMath(access, field, castForScaledInt(field), 'f')
    retType = fieldType(field)
    if "Offset" in field or "Scale" in field:
        retType = typeForScaledInt(field)
    elif "Enum" in field and namespace == "":
        retType = namespace+field["Enum"]
        access = retType + "(" + access + ")"
    ret = '''\
%s
%s %s(%s)%s
{
    return %s;
}''' % (fnHdr(field), functionPrefix+retType, namespace+"Get"+field["Name"], params(firstParamDecl, param), const, access)
    if "float" in retType or "double" in retType:
        ret = "#ifndef DISABLE_FLOAT_ACCESSORS\n" + ret + "\n#endif\n"
    return ret