コード例 #1
0
def make_callbacks():
    cbs = ''
    cb = """
\t\t/// <summary>
\t\t/// </summary>
\t\tprotected void On{0}(byte[] data_)
\t\t{{
{1}\t\t\tvar handler = {0};
\t\t\tif(handler != null)
\t\t\t{{
\t\t\t\thandler(this{3});
\t\t\t}}
\t\t}}
"""
    cls = device.get_camel_case_name()
    for packet in device.get_packets('callback'):
        name = packet.get_camel_case_name()
        name_upper = packet.get_upper_case_name()
        eles = []
        for element in packet.get_elements('out'):
            eles.append(common.underscore_to_headless_camel_case(element[0]))
        callParams = ", ".join(eles)
        signatureParams = csharp_common.make_parameter_list(packet)
        size = str(get_data_size(packet))

        convs = ''
        conv = '\t\t\t{0} {1} = LEConverter.{2}({3}, data_{4});\n'

        pos = 8
        for element in packet.get_elements('out'):
            csharp_type = csharp_common.get_csharp_type(element)
            cname = common.underscore_to_headless_camel_case(element[0])
            from_type = get_from_type(element)
            length = ''
            if element[2] > 1:
                length = ', ' + str(element[2])
            convs += conv.format(csharp_type, 
                                 cname, 
                                 from_type,
                                 pos,
                                 length)

            pos += common.get_element_size(element)

        if convs != '':
            convs += '\n'

        if callParams != '':
            callParams = ', ' + callParams
        
        cbs += cb.format(name, convs, name_upper, callParams, pos, signatureParams)

    return cbs + "\t}\n}"
コード例 #2
0
def make_callback_wrappers():
    wrappers = ''

    for packet in device.get_packets('callback'):
        wrapper = 'procedure T{0}{1}.CallbackWrapper{2}(const packet: TByteArray);\n'.format(device.get_category(),
                                                                                             device.get_camel_case_name(),
                                                                                             packet.get_camel_case_name())

        if len(packet.get_elements('out')) > 0:
            wrapper += 'var ' + delphi_common.make_parameter_list(packet, False, False) + ';\n'

        wrapper += 'begin\n'

        if len(packet.get_elements('out')) == 0:
            wrapper += '  Assert(packet <> nil); { Avoid \'Parameter not used\' warning }\n'

        wrapper += '  if (Assigned({0}Callback)) then begin\n'.format(packet.get_headless_camel_case_name())

        offset = 8
        parameter_names = []
        for element in packet.get_elements('out'):
            parameter_names.append(common.underscore_to_headless_camel_case(element[0]))

            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to {0} do '.format(element[2] - 1)
                wrapper += '    {0}{1}[i] := LEConvert{2}From({3} + (i * {4}), packet);\n'.format(prefix,
                                                                                                  common.underscore_to_headless_camel_case(element[0]),
                                                                                                  get_convert_type(element),
                                                                                                  offset,
                                                                                                  common.get_type_size(element[1]))
            else:
                wrapper += '    {0} := LEConvert{1}From({2}, packet);\n'.format(common.underscore_to_headless_camel_case(element[0]),
                                                                                get_convert_type(element),
                                                                                offset)

            offset += common.get_element_size(element)



        wrapper += '    {0}Callback({1});\n'.format(packet.get_headless_camel_case_name(), ', '.join(['self'] + parameter_names))
        wrapper += '  end;\n'
        wrapper += 'end;\n\n'

        wrappers += wrapper

    return wrappers + 'end.\n'
コード例 #3
0
def make_callbacks():
    cbs = ''
    cb = """
\t\tinternal int Callback{0}(byte[] data_)
\t\t{{
{1}\t\t\t(({0})callbacks[CALLBACK_{2}])({3});
\t\t\treturn {4};
\t\t}}
"""
    cls = device.get_camel_case_name()
    for packet in device.get_packets('callback'):
        name = packet.get_camel_case_name()
        name_upper = packet.get_upper_case_name()
        eles = []
        for element in packet.get_elements('out'):
            eles.append(common.underscore_to_headless_camel_case(element[0]))
        params = ", ".join(eles)
        size = str(get_data_size(packet))

        convs = ''
        conv = '\t\t\t{0} {1} = LEConverter.{2}({3}, data_{4});\n'

        pos = 4
        for element in packet.get_elements('out'):
            csharp_type = csharp_common.get_csharp_type(element)
            cname = common.underscore_to_headless_camel_case(element[0])
            from_type = get_from_type(element)
            length = ''
            if element[2] > 1:
                length = ', ' + str(element[2])
            convs += conv.format(csharp_type, 
                                 cname, 
                                 from_type,
                                 pos,
                                 length)

            pos += common.get_element_size(element)

        if convs != '':
            convs += '\n'
        
        cbs += cb.format(name, convs, name_upper, params, pos)

    return cbs
コード例 #4
0
def make_methods():
    methods = ''
    function = 'function {0}.{1}{2}: {3};\n'
    procedure = 'procedure {0}.{1}{2};\n'

    cls = 'T{0}{1}'.format(device.get_category(), device.get_camel_case_name())
    for packet in device.get_packets('function'):
        ret_type = delphi_common.get_return_type(packet, False)
        out_count = len(packet.get_elements('out'))
        name = packet.get_camel_case_name()
        params = delphi_common.make_parameter_list(packet, False)
        function_id = '{0}_{1}_FUNCTION_{2}'.format(device.get_category().upper(),
                                                    device.get_upper_case_name(),
                                                    packet.get_upper_case_name())
        if len(params) > 0:
            params = '(' + params + ')'

        if len(ret_type) > 0:
            method = function.format(cls, name, params, ret_type)
        else:
            method = procedure.format(cls, name, params)

        if out_count > 0:
            method += 'var request, response: TByteArray;'
        else:
            method += 'var request: TByteArray;'

        has_array = False
        for element in packet.get_elements():
            if element[2] > 1 and element[1] != 'string':
                has_array = True
                break

        if has_array:
            method += ' i: longint;'

        method += '\n'
        method += 'begin\n'
        method += '  request := (ipcon as TIPConnection).CreateRequestPacket(self, {0}, {1});\n'.format(function_id, packet.get_request_length())

        # Serialize request
        offset = 8
        for element in packet.get_elements('in'):
            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to Length({0}) - 1 do '.format(common.underscore_to_headless_camel_case(element[0]))
                method += '  {0}LEConvert{1}To({2}[i], {3} + (i * {4}), request);\n'.format(prefix,
                                                                                            get_convert_type(element),
                                                                                            common.underscore_to_headless_camel_case(element[0]),
                                                                                            offset,
                                                                                            common.get_type_size(element[1]))
            elif element[1] == 'string':
                method += '  LEConvertStringTo({0}, {1}, {2}, request);\n'.format(common.underscore_to_headless_camel_case(element[0]),
                                                                                  offset,
                                                                                  element[2])
            else:
                method += '  LEConvert{0}To({1}, {2}, request);\n'.format(get_convert_type(element),
                                                                          common.underscore_to_headless_camel_case(element[0]),
                                                                          offset)

            offset += common.get_element_size(element)

        if out_count > 0:
            method += '  response := SendRequest(request);\n'
        else:
            method += '  SendRequest(request);\n'

        # Deserialize response
        offset = 8
        for element in packet.get_elements('out'):
            if out_count > 1:
                result = common.underscore_to_headless_camel_case(element[0])
            else:
                result = 'result'

            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to {0} do '.format(element[2] - 1)
                method += '  {0}{1}[i] := LEConvert{2}From({3} + (i * {4}), response);\n'.format(prefix,
                                                                                                 result,
                                                                                                 get_convert_type(element),
                                                                                                 offset,
                                                                                                 common.get_type_size(element[1]))
            elif element[1] == 'string':
                method += '  {0} := LEConvertStringFrom({1}, {2}, response);\n'.format(result,
                                                                                       offset,
                                                                                       element[2])
            else:
                method += '  {0} := LEConvert{1}From({2}, response);\n'.format(result,
                                                                               get_convert_type(element),
                                                                               offset)

            offset += common.get_element_size(element)

        method += 'end;\n\n'

        methods += method

    return methods
コード例 #5
0
def get_data_size(packet):
    size = 0
    for element in packet.get_elements('in'):
        size += common.get_element_size(element)
    return size + 8
コード例 #6
0
def make_methods():
    methods = ''
    method = """
\t\t/// <summary>
\t\t///  {5}
\t\t/// </summary>
\t\t{0}
\t\t{{
\t\t\tbyte[] data_ = MakePacketHeader({1}, FUNCTION_{2});
{3}
{4}
\t\t}}
"""
    method_oneway = """\t\t\tif(responseExpected[FUNCTION_{0}] == ResponseExpectedFlag.ALWAYS_TRUE || responseExpected[FUNCTION_{0}] == ResponseExpectedFlag.TRUE) 
\t\t\t{{
\t\t\t\tbyte[] response;
\t\t\t\tSendRequestExpectResponse(data_, FUNCTION_{0}, out response);
\t\t\t}}
\t\t\telse
\t\t\t{{
\t\t\t\tSendRequestNoResponse(data_);
\t\t\t}}"""
    method_response = """\t\t\tbyte[] response;
\t\t\tSendRequestExpectResponse(data_, FUNCTION_{0}, out response);
{1}"""

    cls = device.get_camel_case_name()
    for packet in device.get_packets('function'):
        ret_count = len(packet.get_elements('out'))
        size = str(get_data_size(packet))
        name_upper = packet.get_upper_case_name()
        doc = format_doc(packet)

        write_convs = ''
        write_conv = '\t\t\tLEConverter.To(({2}){0}, {1}, data_);\n'
        write_conv_length = '\t\t\tLEConverter.To(({3}){0}, {1}, {2}, data_);\n'

        pos = 8
        for element in packet.get_elements('in'):
            wname = common.underscore_to_headless_camel_case(element[0])
            csharp_type = csharp_common.get_csharp_type_for_to_convert(element)
            if element[2] > 1:
                write_convs += write_conv_length.format(wname, pos, element[2], csharp_type)
            else:
                write_convs += write_conv.format(wname, pos, csharp_type)
            pos += common.get_element_size(element)

        method_tail = ''
        read_convs = ''
        read_conv = '\n\t\t\t{0} = LEConverter.{1}({2}, response{3});'

        pos = 8
        for element in packet.get_elements('out'):
            aname = common.underscore_to_headless_camel_case(element[0])
            from_type = get_from_type(element)
            length = ''
            if element[2] > 1:
                length = ', ' + str(element[2])

            if ret_count == 1:
                read_convs = '\n\t\t\treturn LEConverter.{0}({1}, response{2});'.format(from_type, pos, length)
            else:
                read_convs += read_conv.format(aname, from_type, pos, length)
            pos += common.get_element_size(element)

        if ret_count > 0:
            method_tail = method_response.format(name_upper, read_convs)
        else:
            method_tail = method_oneway.format(name_upper)

        signature = csharp_common.make_method_signature(packet)
        methods += method.format(signature,
                                 size,
                                 name_upper,
                                 write_convs,
                                 method_tail,
                                 doc)

    return methods
コード例 #7
0
def make_methods():
    methods = ''
    method = """
\t\t/// <summary>
\t\t///  {5}
\t\t/// </summary>
\t\t{0}
\t\t{{
\t\t\tbyte[] data_ = new byte[{1}];
\t\t\tLEConverter.To(stackID, 0, data_);
\t\t\tLEConverter.To(FUNCTION_{2}, 1, data_);
\t\t\tLEConverter.To((ushort){1}, 2, data_);
{3}
{4}
\t\t}}
"""
    method_oneway = "\t\t\tSendRequestNoResponse(data_);"
    method_response = """\t\t\tbyte[] response;
\t\t\tSendRequestExpectResponse(data_, FUNCTION_{0}, out response);
{1}"""

    cls = device.get_camel_case_name()
    for packet in device.get_packets('function'):
        ret_count = len(packet.get_elements('out'))
        size = str(get_data_size(packet))
        name_upper = packet.get_upper_case_name()
        doc = '\n\t\t///  '.join(fix_links(packet.get_doc()[1][lang]).strip().split('\n'))

        write_convs = ''
        write_conv = '\t\t\tLEConverter.To({0}, {1}, data_);\n'
        write_conv_length = '\t\t\tLEConverter.To({0}, {1}, {2}, data_);\n'

        pos = 4
        for element in packet.get_elements('in'):
            wname = common.underscore_to_headless_camel_case(element[0])
            if element[2] > 1:
                write_convs += write_conv_length.format(wname, pos, element[2])
            else:
                write_convs += write_conv.format(wname, pos)
            pos += common.get_element_size(element)
            
        method_tail = ''
        if ret_count > 0:
            read_convs = ''
            read_conv = '\n\t\t\t{0} = LEConverter.{1}({2}, response{3});'

            pos = 4
            for element in packet.get_elements('out'):
                aname = common.underscore_to_headless_camel_case(element[0])
                from_type = get_from_type(element)
                length = ''
                if element[2] > 1:
                    length = ', ' + str(element[2])

                if ret_count == 1:
                    read_convs = '\n\t\t\treturn LEConverter.{0}({1}, response{2});'.format(from_type, pos, length)
                else:
                    read_convs += read_conv.format(aname, from_type, pos, length)
                pos += common.get_element_size(element)

            method_tail = method_response.format(name_upper, read_convs)
        else:
            method_tail = method_oneway

        signature = csharp_common.make_method_signature(packet)
        methods += method.format(signature,
                                 size,
                                 name_upper,
                                 write_convs,
                                 method_tail,
                                 doc)

    return methods
コード例 #8
0
def make_callback_wrappers():
    if device.get_callback_count() == 0:
        return ''

    wrappers = """
    /**
     * Registers a callback with ID $id to the callable $callback.
     *
     * @param int $id
     * @param callable $callback
     *
     * @return void
     */
    public function registerCallback($id, $callback)
    {
        $this->registeredCallbacks[$id] = $callback;
    }
"""
    wrapper = """
    /**
     * @internal
     * @param string $data
     */
    public function callbackWrapper{0}($data)
    {{
        $result = array();
{1}

{2}

        call_user_func_array($this->registeredCallbacks[self::CALLBACK_{3}], $result);
    }}
"""

    for packet in device.get_packets('callback'):
        name = packet.get_camel_case_name()
        response_payload_elements = 0;
        response_payload_size = 0;
        unpack = []
        collect = []
        result = []

        for element in packet.get_elements('out'):
            response_payload_elements += 1;
            response_payload_size += common.get_element_size(element)

        for element in packet.get_elements('out'):
            unpack.append('{0}{1}{2}'.format(get_unpack_type(element), element[2], element[0]))

            unpack_fix = get_unpack_fix(element)

            if element[2] > 1:
                collect.append('        array_push($result, {2}$payload, \'{0}\', {1}{3});'.format(element[0], element[2], unpack_fix[0], unpack_fix[1]))
            else:
                collect.append('        array_push($result, {1}$payload[\'{0}\']{2});'.format(element[0], unpack_fix[0], unpack_fix[1]))

            result.append('$payload[\'{0}\']'.format(element[0]))

        foobar = ''

        if response_payload_size > 0:
            foobar = '        $payload = unpack(\'{0}\', $data);'.format('/'.join(unpack))

        wrappers += wrapper.format(name,
                                 foobar,
                                 '\n'.join(collect),
                                 packet.get_upper_case_name())

    return wrappers
コード例 #9
0
def make_methods():
    methods = ''
    method_multi = """
    /**
     * {6}
     */
    public function {0}({1})
    {{
        $result = array();

        $payload = '';
{2}

{3}

{4}

{5}

        return $result;
    }}
"""
    method_single = """
    /**
     * {6}
     */
    public function {0}({1})
    {{
        $payload = '';
{2}

{3}

{4}

{5}
    }}
"""

    for packet in device.get_packets('function'):
        name_lower = packet.get_headless_camel_case_name()
        parameter = make_parameter_list(packet)
        pack = []
        for element in packet.get_elements('in'):
            if element[1] == 'bool':
                if element[2] > 1:
                    pack.append('        for ($i = 0; $i < {0}; $i++) {{'.format(element[2]))
                    pack.append('            $payload .= pack(\'{0}\', intval((bool)${1}[$i]));\n        }}'.format(get_pack_type(element), element[0]))
                else:
                    pack.append('        $payload .= pack(\'{0}\', intval((bool)${1}));'.format(get_pack_type(element), element[0]))
            elif element[1] == 'string':
                if element[2] > 1:
                    pack.append('        for ($i = 0; $i < strlen(${0}) && $i < {1}; $i++) {{'.format(element[0], element[2]))
                    pack.append('            $payload .= pack(\'{0}\', ord(${1}[$i]));\n        }}'.format(get_pack_type(element), element[0]))
                    pack.append('        for ($i = strlen(${0}); $i < {1}; $i++) {{'.format(element[0], element[2]))
                    pack.append('            $payload .= pack(\'{0}\', 0);\n        }}'.format(get_pack_type(element)))
                else:
                    pack.append('        $payload .= pack(\'{0}\', ord(${1}));'.format(get_pack_type(element), element[0]))
            elif element[1] == 'char':
                if element[2] > 1:
                    pack.append('        for ($i = 0; $i < count(${0}) && $i < {1}; $i++) {{'.format(element[0], element[2]))
                    pack.append('            $payload .= pack(\'{0}\', ord(${1}[$i]));\n        }}'.format(get_pack_type(element), element[0]))
                    pack.append('        for ($i = count(${0}); $i < {1}; $i++) {{'.format(element[0], element[2]))
                    pack.append('            $payload .= pack(\'{0}\', 0);\n        }}'.format(get_pack_type(element)))
                else:
                    pack.append('        $payload .= pack(\'{0}\', ord(${1}));'.format(get_pack_type(element), element[0]))
            else:
                if element[2] > 1:
                    pack.append('        for ($i = 0; $i < {0}; $i++) {{'.format(element[2]))
                    pack.append('            $payload .= pack(\'{0}\', ${1}[$i]);\n        }}'.format(get_pack_type(element), element[0]))
                else:
                    pack.append('        $payload .= pack(\'{0}\', ${1});'.format(get_pack_type(element), element[0]))

        response_payload_elements = 0;
        response_payload_size = 0;
        unpack = []
        collect = []

        for element in packet.get_elements('out'):
            response_payload_elements += 1;
            response_payload_size += common.get_element_size(element)

        for element in packet.get_elements('out'):
            unpack.append('{0}{1}{2}'.format(get_unpack_type(element), element[2], element[0]))

            unpack_fix = get_unpack_fix(element)

            if response_payload_elements > 1:
                if element[2] > 1:
                    collect.append('        $result[\'{0}\'] = {2}$payload, \'{0}\', {1}{3};'.format(element[0], element[2], unpack_fix[0], unpack_fix[1]))
                else:
                    collect.append('        $result[\'{0}\'] = {1}$payload[\'{0}\']{2};'.format(element[0], unpack_fix[0], unpack_fix[1]))
            else:
                if element[2] > 1:
                    collect.append('        return {2}$payload, \'{0}\', {1}{3};'.format(element[0], element[2], unpack_fix[0], unpack_fix[1]))
                else:
                    collect.append('        return {1}$payload[\'{0}\']{2};'.format(element[0], unpack_fix[0], unpack_fix[1]))

        if response_payload_size > 0:
            send = '        $data = $this->sendRequestExpectResponse(self::FUNCTION_{0}, $payload, {1});\n'.format(packet.get_upper_case_name(), response_payload_size)
        else:
            send = '        $this->sendRequestNoResponse(self::FUNCTION_{0}, $payload);\n'.format(packet.get_upper_case_name())

        final_unpack = ''

        if response_payload_size > 0:
            final_unpack = '        $payload = unpack(\'{0}\', $data);'.format('/'.join(unpack))

        doc = '\n     * '.join(fix_links(packet.get_doc()[1][lang]).strip().split('\n') + [''] + make_parameter_doc(packet).split('\n'))

        if response_payload_elements > 1:
            method = method_multi.format(name_lower,
                                         parameter,
                                         '\n'.join(pack),
                                         send,
                                         final_unpack,
                                         '\n'.join(collect),
                                         doc)
        else:
            method = method_single.format(name_lower,
                                          parameter,
                                          '\n'.join(pack),
                                          send,
                                          final_unpack,
                                          '\n'.join(collect),
                                          doc)

        prev = method
        method = method.replace('\n\n\n', '\n\n').replace('\n\n    }', '\n    }')
        while prev != method:
            prev = method
            method = method.replace('\n\n\n', '\n\n').replace('\n\n    }', '\n    }')

        methods += method

    return """
    /**
     * @internal
     * @param string $header
     * @param string $data
     */
    public function handleCallback($header, $data)
    {
        call_user_func(array($this, $this->callbackWrappers[$header['functionID']]), $data);
    }
""" + methods