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}"
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'
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
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
def get_data_size(packet): size = 0 for element in packet.get_elements('in'): size += common.get_element_size(element) return size + 8
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
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
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
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