Beispiel #1
0
    def get_rust_imports(self):
        conv_receiver_imports = ["ConvertingReceiver"]

        # High level functions return a Result<(PayloadT, ResultT), BrickletRecvTimeoutError> directly, because they block.
        if any(packet.has_high_level() for packet in self.get_packets()):
            conv_receiver_imports.append("BrickletRecvTimeoutError")

        # Conversion from String to bytes can raise an error, which is sent directly into the created result channel.
        # Rust can't deduce the channel's type parameters, so we need to specify them. BrickletError is the Result's error type.
        if any("String" in elem.get_rust_type()
               for packet in self.get_packets()
               for elem in packet.get_elements(direction='in')):
            conv_receiver_imports.append("BrickletError")

        conv_receiver = conv_receiver_imports[0] if len(
            conv_receiver_imports) == 1 else (
                "{" + ", ".join(conv_receiver_imports) + "}")

        tf_doc_link = {
            'en':
            '//! See also the documentation [here](https://www.tinkerforge.com/en/doc/Software/{category_name}/{rst_name}_Rust.html).',
            'de':
            '//! Siehe auch die Dokumentation [hier](https://www.tinkerforge.com/de/doc/Software/{category_name}/{rst_name}_Rust.html).'
        }

        description = common.select_lang(self.get_description()) + "."
        description += '\n//! \n'

        category_name = self.get_category().camel

        if self.is_brick() or self.is_bricklet():
            category_name += 's'

        description += common.select_lang(tf_doc_link).format(
            category_name=category_name, rst_name=self.get_doc_rst_name())

        return """{header}

//! {description}
use crate::{{
	byte_converter::*,
	converting_receiver::{conv_receiver},{callback_recv}{high_level_callback_recv}
	device::*,
	ip_connection::GetRequestSender,{low_level}
}};""".format(
            header=self.get_generator().get_header_comment(kind='asterisk'),
            description=description,
            callback_recv="" if len(self.get_packets("callback")) == 0 else
            "\n\tconverting_callback_receiver::ConvertingCallbackReceiver,",
            high_level_callback_recv="" if all(
                not packet.has_high_level()
                for packet in self.get_packets("callback")) else
            "\n\tconverting_high_level_callback_receiver::ConvertingHighLevelCallbackReceiver,",
            low_level="" if all(not packet.has_high_level()
                                for packet in self.get_packets()) else
            "\n\tlow_level_traits::*",
            conv_receiver=conv_receiver)
Beispiel #2
0
    def get_tvpl_doc_type(self):
        t = common.select_lang(self.tvpl_doc_types)[self.get_type()]
        c = self.get_cardinality()
        list_of = {'en': 'List of ', 'de': 'Liste von '}

        if c == 1 or self.get_type() == 'string':
            return t[0]

        return '{0}{1} {2}'.format(common.select_lang(list_of), c,
                                   t[0 if c == 1 else 1])
Beispiel #3
0
    def get_mathematica_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        text = self.get_device().specialize_mathematica_doc_function_links(
            text)

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)

        prefix = self.get_device().get_mathematica_class_name() + '`'

        def format_element_name(element, index):
            if index == None:
                return element.get_name().headless

            return '{0}[[{1}]]'.format(element.get_name().headless, index)

        def format_constant(prefix, constant_group, constant, value):
            return '* {0}\\ **{1}**\\ U{2} = {3}\n'.format(
                prefix,
                constant_group.get_name().upper.replace('_', 'U'),
                constant.get_name().upper.replace('_', 'U'), value)

        text += common.format_constants(prefix,
                                        self,
                                        format_element_name,
                                        constant_format_func=format_constant)

        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, 1)
    def get_rust_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        text = self.get_device().specialize_rust_doc_function_links(text)

        callback_parameter = {'en': 'received variable', 'de': 'empfangene Variable'}
        callback_parameters = {'en': 'members of the received struct', 'de': 'Felder der empfangenen Struktur'}

        def format_parameter(name):
            return '``{0}``'.format(name) # FIXME

        text = common.handle_rst_param(text, format_parameter)

        if self.get_type() == 'callback':
            text = common.handle_rst_word(text, parameter=callback_parameter, parameters=callback_parameters)
        else:
            text = common.handle_rst_word(text)

        text = common.handle_rst_substitutions(text, self)

        prefix = self.get_device().get_rust_module_name().upper() + '_'

        def format_element_name(element, index):
            if index == None:
                return element.get_name().under

            return '{0}[{1}]'.format(element.get_name().under, index)

        text += common.format_constants(prefix, self, format_element_name)
        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, 1)
Beispiel #5
0
    def get_java_formatted_doc(self, shift_right):
        text = common.select_lang(self.get_doc_text())
        text = self.get_device().specialize_java_doc_function_links(text)

        text = text.replace('Callback ', 'Listener ')
        text = text.replace(' Callback', ' Listener')
        text = text.replace('callback ', 'listener ')
        text = text.replace(' callback', ' listener')

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)

        prefix = self.get_device().get_java_class_name() + '.'

        def format_element_name(element, index):
            if index == None:
                return element.get_name().headless

            return '{0}[{1}]'.format(element.get_name().headless, index)

        text += common.format_constants(prefix, self, format_element_name)
        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, shift_right)
    def get_openhab_get_thing_type_impl(self):
        template = """ThingTypeBuilder.instance(thingTypeUID, "{label}").isListed(false).withSupportedBridgeTypeUIDs(Arrays.asList(TinkerforgeBindingConstants.THING_TYPE_BRICK_DAEMON.toString())).withConfigDescriptionURI(URI.create("thing-type:tinkerforge:" + thingTypeUID.getId())){with_calls}.build{bridge}()"""

        with_calls = []
        if self.oh.category is not None:
            with_calls.append('.withCategory("{}")'.format(self.oh.category))
        with_calls.append('.withDescription("{}")'.format(
            openhab_common.fix_desc(common.select_lang(
                self.get_description())).replace('"', '\\"')))
        with_calls.append('.withChannelDefinitions(Arrays.asList({}))'.format(
            ', '.join(c.get_builder_call() for c in self.oh.channels)))
        with_calls.append('.withProperties(props)')
        label = 'Tinkerforge ' + self.get_long_display_name()
        not_supported = len(self.oh.channels) == 0 and len(
            self.oh.actions) == 0
        if not_supported:
            label += ' - This device is not supported yet.'

        builder_call = template.format(
            label=label,
            with_calls=''.join(with_calls),
            bridge='Bridge' if self.oh.is_bridge else '')

        return """public static ThingType getThingType(ThingTypeUID thingTypeUID) {{
             Map<String, String> thingTypeProperties = ThingTypeBuilder.instance(thingTypeUID, "unused").build().getProperties();
             Map<String, String> props = new HashMap<String, String>(thingTypeProperties);
             props.putIfAbsent(TinkerforgeBindingConstants.PROPERTY_MINIMUM_FIRMWARE_VERSION, DEVICE_INFO.minimumFWVersion);
        return {};
    }}""".format(builder_call)
Beispiel #7
0
    def get_tvpl_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        constants = {'en': 'symbols', 'de': 'Symbole'}

        text = self.get_device().replace_tvpl_function_links(text)

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)

        def format_element_name(element, index):
            if index == None:
                return element.get_name().space

            return '{0} [{1}]'.format(element.get_name().space, index)

        text += common.format_constants('',
                                        self,
                                        format_element_name,
                                        constants_name=constants)
        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, 1)
Beispiel #8
0
    def get_tvpl_return_list(self):
        ret = ' R{0}'
        ret_list = []
        and_ = {'en': '_and_', 'de': '_und_'}
        list_of = {'en': 'List_of_', 'de': 'Liste_mit_'}

        for element in self.get_elements(direction='out'):
            ret_list.append(element.get_name().space.replace(' ', '_'))

        if len(ret_list) == 0:
            return ''
        elif len(ret_list) == 1:
            return ret.format(ret_list[0])

        return ret.format(
            common.select_lang(list_of) + ',_'.join(ret_list[:-1]) +
            common.select_lang(and_) + ret_list[-1])
Beispiel #9
0
    def get_tcpip_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        constants = {'en': 'meanings', 'de': 'Bedeutungen'}
        constants_intro = {
            'en':
            """
The following **{0}** are defined for the elements of this function:

""",
            'de':
            """
Die folgenden **{0}** sind für die Elemente dieser Funktion definiert:

"""
        }
        parameter = {'en': 'response value', 'de': 'Rückgabewert'}
        parameters = {'en': 'response values', 'de': 'Rückgabewerte'}

        text = self.get_device().specialize_tcpip_doc_function_links(text)

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text, parameter, parameters)
        text = common.handle_rst_substitutions(text, self)

        def format_element_name(element, index):
            if index == None:
                return element.get_name().under

            return '{0}[{1}]'.format(element.get_name().under, index)

        def format_constant(prefix, constant_group, constant, value):
            text = ''

            for word in constant.get_name().space.split(' '):
                if len(text) > 0:
                    if word[0] in '0123456789' and text[-1] in '0123456789':
                        text += common.select_lang({'en': '.', 'de': ','})
                    else:
                        text += ' '

                text += word

            return '* {0} = {1}\n'.format(value, text)

        text += common.format_constants('',
                                        self,
                                        format_element_name,
                                        constants_intro=constants_intro,
                                        constants_name=constants,
                                        constant_format_func=format_constant)

        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, 1)
Beispiel #10
0
    def get_go_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())

        # handle links
        text = text.replace(":ref:", "")
        text = re.sub("`([^<]+) <([^>]+)>`__", r"\g<2>", text)

        # handle tables
        lines = text.split('\n')
        replaced_lines = []
        in_table_head = False
        in_table_body = False
        col_count = 0

        for line in lines:
            line = line.replace('"', '')

            if line.strip() == '.. csv-table::':
                in_table_head = True
            elif line.strip().startswith(':header: ') and in_table_head:
                line = line[len(':header: '):]
                col_count = line.count(",") + 1
                line = line.replace(",", "|")
                replaced_lines.append(line)
            elif line.strip().startswith(':widths:') and in_table_head:
                pass
            elif len(line.strip()) == 0 and in_table_head:
                in_table_head = False
                in_table_body = True

                replaced_lines.append("|".join([" --- "] * col_count))
            elif in_table_head:
                replaced_lines.append(line.replace(",", "|"))
            elif len(line.strip()) == 0 and in_table_body:
                in_table_body = False
                replaced_lines.append('')
            elif in_table_body:
                replaced_lines.append(line.replace(",", "|"))
            else:
                replaced_lines.append(line)

        text = '\n'.join(replaced_lines)
        text = self.get_device().specialize_go_doc_function_links(text)

        text = text.replace('.. note::', 'Note')
        text = text.replace('.. warning::', 'Warning')

        def format_parameter(name):
            return '\\c {0}'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)
        text += common.format_since_firmware(self.get_device(), self)

        return '// ' + '\n// '.join(text.strip().split('\n'))
    def get_php_class(self):
        template = """
/**
 * {1}
 */
class {0} extends Device
{{
"""

        return template.format(self.get_php_class_name(), common.select_lang(self.get_description()))
    def get_java_callbacks(self):
        callbacks = []
        template = {
            'en': """
.. java:function:: class {0}::{1}Listener()

 This listener can be added with the ``add{1}Listener()`` function.
 An added listener can be removed with the ``remove{1}Listener()`` function.

 .. java:function:: void {2}({3})
  :noindex:

{4}

{5}
""",
            'de': """
.. java:function:: class {0}::{1}Listener()

 Dieser Listener kann mit der Funktion ``add{1}Listener()`` hinzugefügt werde.
 Ein hinzugefügter Listener kann mit der Funktion ``remove{1}Listener()`` wieder
 entfernt werden.

 .. java:function:: void {2}({3})
  :noindex:

{4}

{5}
"""
        }
        cls = self.get_java_class_name()

        for packet in self.get_packets('callback'):
            desc = packet.get_java_formatted_doc(2)
            params = packet.get_java_parameters(high_level=True)
            meta = packet.get_formatted_element_meta(lambda element, cardinality=None: element.get_java_type(cardinality=cardinality),
                                                     lambda element, index=None: element.get_name(index=index).headless,
                                                     callback_parameter_label_override={'en': 'Parameters', 'de': 'Parameter'},
                                                     explicit_string_cardinality=True,
                                                     explicit_variable_stream_cardinality=True,
                                                     explicit_fixed_stream_cardinality=True,
                                                     explicit_common_cardinality=True,
                                                     high_level=True)
            meta_table = common.make_rst_meta_table(meta, indent_level=2)
            skip = -2 if packet.has_high_level() else 0

            callbacks.append(common.select_lang(template).format(cls,
                                                                 packet.get_name(skip=skip).camel,
                                                                 packet.get_name(skip=skip).headless,
                                                                 params,
                                                                 meta_table,
                                                                 desc))

        return ''.join(callbacks)
Beispiel #13
0
    def get_go_doc(self):
        docs_rs = {'en': 'Additional documentation can be found on `godoc.org <https://godoc.org/github.com/Tinkerforge/go-api-bindings/{device_name_under}>`_.\n',
                   'de': 'Zusätzliche Dokumentation findet sich auf `godoc.org <https://godoc.org/github.com/Tinkerforge/go-api-bindings/{device_name_under}>`_.\n'}

        doc  = common.make_rst_header(self)
        doc += common.make_rst_summary(self)
        doc += common.select_lang(docs_rs).format(device_name_under=self.get_go_package())
        doc += self.get_go_examples()
        doc += self.get_go_api()

        return doc
    def get_rust_doc(self):
        docs_rs = {'en': 'Additional documentation can be found on `docs.rs <https://docs.rs/tinkerforge/latest/tinkerforge/{module_name}/index.html>`_.\n',
                   'de': 'Zusätzliche Dokumentation findet sich auf `docs.rs <https://docs.rs/tinkerforge/latest/tinkerforge/{module_name}/index.html>`_.\n'}

        doc  = common.make_rst_header(self)
        doc += common.make_rst_summary(self)
        doc += common.select_lang(docs_rs).format(module_name=self.get_rust_module_name())
        doc += self.get_rust_examples()
        doc += self.get_rust_api()

        return doc
Beispiel #15
0
    def get_go_imports(self):
        if self.is_tng():
            tf_doc_link = {
                'en':
                '// See also the documentation here: https://www.tinkerforge.com/en/doc/Software/{device_category_camel}/{device_category_camel}_{device_name_camel}_Go.html.',
                'de':
                '// Siehe auch die Dokumentation hier: https://www.tinkerforge.com/de/doc/Software/{device_category_camel}/{device_category_camel}_{device_name_camel}_Go.html.'
            }
        else:
            tf_doc_link = {
                'en':
                '// See also the documentation here: https://www.tinkerforge.com/en/doc/Software/{device_category_camel}s/{device_name_camel}_{device_category_camel}_Go.html.',
                'de':
                '// Siehe auch die Dokumentation hier: https://www.tinkerforge.com/de/doc/Software/{device_category_camel}s/{device_name_camel}_{device_category_camel}_Go.html.'
            }

        desc = common.select_lang(self.get_description())

        plenk = "‍REPLACE_WITH_ZWJ" if len(desc) > 0 and desc[-1].isupper(
        ) else ""
        description = desc + plenk + "."
        description += '\n// \n// \n'
        description += common.select_lang(tf_doc_link).format(
            device_category_camel=self.get_category().camel,
            device_name_camel=self.get_name().camel)

        return """{header}

// {description}
package {device}

import (
	"encoding/binary"
	"bytes"
	"fmt"
	. "github.com/Tinkerforge/go-api-bindings/internal"
	"github.com/Tinkerforge/go-api-bindings/ipconnection"
)
""".format(header=self.get_generator().get_header_comment(kind='asterisk'),
           description=description,
           device=self.get_go_package())
    def get_python_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)
        text += common.format_since_firmware(self.get_device(), self)

        return '\n        '.join(text.strip().split('\n'))
    def get_perl_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())

        def format_parameter(name):
            return name # FIXME

        text = common.handle_rst_param(text, format_parameter)
        text = common.handle_rst_word(text)
        text = common.handle_rst_substitutions(text, self)
        text += common.format_since_firmware(self.get_device(), self)

        return text.strip()
Beispiel #18
0
    def get_tvpl_return_desc(self):
        nothing = {'en': 'no output', 'de': 'keine Ausgabe'}
        has_symbols = {'en': 'has symbols', 'de': 'hat Symbole'}
        elements = self.get_elements(direction='out')

        if len(elements) == 0:
            return '\n :noreturn: {0}\n'.format(common.select_lang(nothing))

        ret = '\n'
        for element in elements:
            t = element.get_tvpl_doc_type()
            ret += ' :returns {0}: {1}'.format(
                element.get_name().space.replace(' ', '$nbsp;'), t)

            if element.get_constant_group() is not None or \
               self.get_function_id() == 255 and element.get_name().space == 'Device Identifier':
                ret += ' ({0})'.format(common.select_lang(has_symbols))

            ret += '\n'

        return ret
    def get_rust_callbacks(self):
        callbacks = []
        template = {
            'en': """
.. rust:function:: {device}::get_{callback_name_under}_callback_receiver(&self) -> {receiver_type}<{result_type}>

{meta_table}

 Receivers created with this function receive {callback_name_space} events.

{desc}
""",
            'de': """
.. rust:function:: {device}::get_{callback_name_under}_callback_receiver(&self) -> {receiver_type}<{result_type}>

{meta_table}

 Receiver die mit dieser Funktion erstellt werden, empfangen {callback_name_space}-Events.

{desc}
"""
        }
        device = self.get_rust_name()

        for packet in self.get_packets('callback'):
            meta = packet.get_formatted_element_meta(lambda element, cardinality=None: element.get_rust_type(for_doc=True, cardinality=cardinality),
                                                     lambda element, index=None: element.get_name(index=index).under,
                                                     callback_object='conditional',
                                                     callback_parameter_label_override={'en': 'Event', 'de': 'Event'},
                                                     callback_object_label_override={'en': 'Event Object', 'de': 'Event-Objekt'},
                                                     explicit_string_cardinality=True,
                                                     high_level=True)
            meta_table = common.make_rst_meta_table(meta)
            desc = packet.get_rust_formatted_doc()

            if packet.has_high_level():
                skip = -2
                receiver_type = "ConvertingHighLevelCallbackReceiver"
                result_type = ", ".join([packet.get_high_level_payload_type(), packet.get_name(skip=-2).camel_abbrv+"Result", packet.get_rust_return_type()])
            else:
                skip = 0
                receiver_type = "ConvertingCallbackReceiver"
                result_type = packet.get_rust_return_type()

            callbacks.append(common.select_lang(template).format(device=device,
                                                                 callback_name_under=packet.get_name(skip=skip).under,
                                                                 callback_name_space=packet.get_name(skip=skip).space,
                                                                 receiver_type=receiver_type,
                                                                 result_type=result_type,
                                                                 meta_table=meta_table,
                                                                 desc=desc))

        return ''.join(callbacks)
Beispiel #20
0
        def format_constant(prefix, constant_group, constant, value):
            text = ''

            for word in constant.get_name().space.split(' '):
                if len(text) > 0:
                    if word[0] in '0123456789' and text[-1] in '0123456789':
                        text += common.select_lang({'en': '.', 'de': ','})
                    else:
                        text += ' '

                text += word

            return '* {0} = {1}\n'.format(value, text)
    def get_mqtt_callbacks(self):
        callbacks = []
        template = {
            'en': """
.. mqtt:function:: register/{device}/<UID>/{callback_name_under}\n\n{meta_table}\n

 A callback can be registered for this event by publishing to the ``.../register/{device}/<UID>/{callback_name_under}[/<SUFFIX>]`` topic with the payload "true".
 An added callback can be removed by publishing to the same topic with the payload "false".
 To support multiple (de)registrations, e.g. for message filtering, an optional suffix can be used.

 If the callback is triggered, a message with it's payload is published under the corresponding ``.../callback/{device}/<UID>/{callback_name_under}[/<SUFFIX>]`` topic for each registered suffix.

{desc}
""",
            'de': """
.. mqtt:function:: register/{device}/<UID>/{callback_name_under}\n\n{meta_table}\n

 Ein Callback für dieses Event kann durch Senden des Payloads "true" an das ``.../register/{device}/<UID>/{callback_name_under}[/<SUFFIX>]``-Topic hinzugefügt werden.
 Ein hinzugefügtes Callback kann durch Senden des Payloads "false" an das selbe Topic wieder entfernt werden.
 Um mehrere (De-)Registrierungen zu unterstützen, z.B. um Nachrichten filtern zu können, kann ein optionaler Suffix verwendet werden.

 Wenn das Callback ausgelöst wird, wird dessen Payload für jeden Suffix auf dem entsprechenden ``.../callback/{device}/<UID>/{callback_name_under}[/<SUFFIX>]``-Topic veröffentlicht.

{desc}
"""
        }
        device = self.get_mqtt_device_name()

        for packet in self.get_packets('callback'):
            skip = -2 if packet.has_high_level() else 0
            meta = common.format_simple_element_meta([('register', 'bool', 1, 'in')],
                                                      parameter_label_override={'en': 'Register Request', 'de': 'Registrierungsanfrage'})
            meta += packet.get_formatted_element_meta(lambda element, cardinality=None: element.get_mqtt_type(for_doc=True, cardinality=cardinality),
                                                      lambda element, index=None: element.get_name(index=index).under,
                                                      callback_parameter_label_override={'en': 'Callback Response', 'de': 'Callback-Antwort'},
                                                      constants_hint_override={'en': ('See symbols', 'with symbols'), 'de': ('Siehe Symbole', 'mit Symbolen')},
                                                      no_out_value={'en': 'empty payload', 'de': 'keine Nutzdaten'},
                                                      explicit_string_cardinality=True,
                                                      explicit_variable_stream_cardinality=True,
                                                      explicit_fixed_stream_cardinality=True,
                                                      explicit_common_cardinality=True,
                                                      high_level=True)
            meta_table = common.make_rst_meta_table(meta)
            desc = packet.get_mqtt_formatted_doc()

            callbacks.append(common.select_lang(template).format(device=device,
                                                                 callback_name_under=packet.get_mqtt_name(skip=skip),
                                                                 meta_table=meta_table,
                                                                 desc=desc))

        return ''.join(callbacks)
Beispiel #22
0
    def get_tvpl_api(self):
        api = {
            'en': """
.. _{0}_tvpl_api:

API
---

{1}

{2}
""",
            'de': """
.. _{0}_tvpl_api:

API
---

{1}

{2}
"""
        }

        bf = self.get_tvpl_methods('bf')
        af = self.get_tvpl_methods('af')
        api_str = ''

        if bf:
            api_str += common.select_lang(common.bf_str).format('', bf)

        if af:
            api_str += common.select_lang(common.af_str).format(af)

        return common.select_lang(api).format(
            self.get_doc_rst_ref_name(),
            self.replace_tvpl_function_links(common.select_lang(
                self.get_doc())), api_str)
    def get_ruby_class(self):
        template = """require_relative './ip_connection'

module Tinkerforge
  # {1}
  class {0} < Device
    DEVICE_IDENTIFIER = {2} # :nodoc:
    DEVICE_DISPLAY_NAME = '{3}' # :nodoc:
"""

        return template.format(self.get_ruby_class_name(),
                               common.select_lang(self.get_description()),
                               self.get_device_identifier(),
                               self.get_long_display_name())
Beispiel #24
0
    def get_mqtt_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        text = self.get_device().specialize_mqtt_doc_function_links(text)

        constants = {'en': 'symbols', 'de': 'Symbole'}

        callback_parameter = {
            'en': 'callback payload',
            'de': 'Payload des Callbacks'
        }
        callback_parameters = {
            'en': 'callback payload members',
            'de': 'Payload-Member des Callbacks'
        }

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)

        if self.get_type() == 'callback':
            text = common.handle_rst_word(text,
                                          parameter=callback_parameter,
                                          parameters=callback_parameters,
                                          constants=constants)
        else:
            text = common.handle_rst_word(text, constants=constants)

        text = common.handle_rst_substitutions(text, self)

        def format_element_name(element, index):
            if index == None:
                return element.get_name().under

            return '{0}[{1}]'.format(element.get_name().under, index)

        def format_constant(prefix, constant_group, constant, value):
            return '* "{0}" = {1}\n'.format(constant.get_name().under, value)

        text += common.format_constants('',
                                        self,
                                        format_element_name,
                                        constants_name=constants,
                                        constant_format_func=format_constant)

        text += common.format_since_firmware(self.get_device(), self)
        text = text.replace('|device_identifier_constant|\n', '')

        return common.shift_right(text, 1)
Beispiel #25
0
    def get_go_formatted_doc(self):
        text = common.select_lang(self.get_doc_text())
        text = self.get_device().specialize_go_doc_function_links(text)

        callback_parameter = {
            'en': 'callback parameter',
            'de': 'Parameter des Callbacks'
        }
        callback_parameters = {
            'en': 'callback parameters',
            'de': 'Parameter des Callbacks'
        }

        def format_parameter(name):
            return '``{0}``'.format(name)  # FIXME

        text = common.handle_rst_param(text, format_parameter)

        if self.get_type() == 'callback':
            text = common.handle_rst_word(text,
                                          parameter=callback_parameter,
                                          parameters=callback_parameters)
        else:
            text = common.handle_rst_word(text)

        text = common.handle_rst_substitutions(text, self)

        prefix = self.get_device().get_go_package() + '.'

        def format_element_name(element, index):
            if index == None:
                return element.get_name().headless

            return '{0}[{1}]'.format(element.get_name().headless, index)

        def format_constant(prefix, constant_group, constant, value):
            return '* {0}\\ **{1}**\\ {2} = {3}\n'.format(
                prefix,
                constant_group.get_name().camel,
                constant.get_name().camel_constant_safe, value)

        text += common.format_constants(prefix,
                                        self,
                                        format_element_name,
                                        constant_format_func=format_constant)
        text += common.format_since_firmware(self.get_device(), self)

        return common.shift_right(text, 1)
    def get_mqtt_functions(self, type_):
        functions = []
        template = '.. mqtt:function:: request/{struct_name}/<UID>/{func_name}\n\n{meta_table}{desc}\n'

        for packet in self.get_packets('function'):
            if packet.get_doc_type() != type_ or packet.is_virtual():
                continue

            skip = -2 if packet.has_high_level() else 0
            name = packet.get_mqtt_name(skip=skip)
            meta = packet.get_formatted_element_meta(lambda element, cardinality=None: element.get_mqtt_type(for_doc=True, cardinality=cardinality),
                                                     lambda element, index=None: element.get_name(index=index).under,
                                                     parameter_label_override={'en': 'Request', 'de': 'Anfrage'},
                                                     return_label_override={'en': 'Response', 'de': 'Antwort'},
                                                     no_in_value={'en': 'empty payload', 'de': 'keine Nutzdaten'},
                                                     no_out_value={'en': 'no response', 'de': 'keine Antwort'},
                                                     constants_hint_override={'en': ('See symbols', 'with symbols'), 'de': ('Siehe Symbole', 'mit Symbolen')},
                                                     explicit_string_cardinality=True,
                                                     explicit_variable_stream_cardinality=True,
                                                     explicit_fixed_stream_cardinality=True,
                                                     explicit_common_cardinality=True,
                                                     high_level=True)

            if packet.get_name().space == 'Get Identity':
                meta += common.format_simple_element_meta([('_display_name', 'string', None, 'out')],
                                                          return_label_override={'en': 'Response', 'de': 'Antwort'})

            meta_table = common.make_rst_meta_table(common.merge_meta_sections(meta))
            desc = packet.get_mqtt_formatted_doc()

            if packet.get_name().under == 'get_identity':
                get_id_desc = {
                    'en': """If symbolic output is not disabled, the device identifier is mapped to the corresponding name in the format used in topics.

 The display name contains the {}'s name in a human readable form.""",
                    'de': """Falls die symbolische Ausgabe nicht deaktiviert wurde, wird der Device Identifier auf den entsprechenden Namen im Format, welches die Topics verwenden, abgebildet.

 Der Display Name enthält den Anzeigenamen des {}."""
                }

                desc += common.select_lang(get_id_desc).format(self.get_short_display_name())

            functions.append(template.format(struct_name=self.get_mqtt_device_name(),
                                             func_name=name,
                                             meta_table=meta_table,
                                             desc=desc))

        return ''.join(functions)
Beispiel #27
0
    def get_tvpl_parameter_desc(self):
        desc = '\n'
        param = ' :param {0}: {1}'
        has_symbols = {'en': 'has symbols', 'de': 'hat Symbole'}

        for element in self.get_elements(direction='in'):
            t = element.get_tvpl_doc_type()
            desc += param.format(
                element.get_name().space.replace(' ', '$nbsp;'), t)

            if element.get_constant_group() is not None:
                desc += ' ({0})'.format(common.select_lang(has_symbols))

            desc += '\n'

        return desc
Beispiel #28
0
    def get_php_callbacks(self):
        callbacks = []
        template = '.. php:member:: int {0}::CALLBACK_{1}\n\n{2}{3}{4}\n'
        cls = self.get_php_class_name()
        signature_template = {
            'en': """
 .. code-block:: php

  <?php   void callback({0})   ?>
""",
            'de': """
 .. code-block:: php

  <?php   void callback({0})   ?>
"""
        }

        for packet in self.get_packets('callback'):
            skip = -2 if packet.has_high_level() else 0
            params = packet.get_php_parameters(context='doc', high_level=True)

            if len(params) > 0:
                params += " [, mixed $user_data]"
            else:
                params += "[mixed $user_data]"

            signature = common.select_lang(signature_template).format(params)
            meta = packet.get_formatted_element_meta(
                lambda element, cardinality=None: element.get_php_type(
                    for_doc=True, cardinality=cardinality),
                lambda element, index=None: '$' + element.get_name(index=index
                                                                   ).under,
                suffix_elements=[('$user_data', 'mixed', 1, 'out')],
                explicit_string_cardinality=True,
                explicit_variable_stream_cardinality=True,
                explicit_fixed_stream_cardinality=True,
                explicit_common_cardinality=True,
                high_level=True)
            meta_table = common.make_rst_meta_table(meta)
            desc = packet.get_php_formatted_doc()

            callbacks.append(
                template.format(cls,
                                packet.get_name(skip=skip).upper, signature,
                                meta_table, desc))

        return ''.join(callbacks)
    def get_python_class(self):
        template = """
class {0}(Device):
    \"\"\"
    {1}
    \"\"\"

    DEVICE_IDENTIFIER = {2}
    DEVICE_DISPLAY_NAME = '{3}'
    DEVICE_URL_PART = '{4}' # internal

"""

        return template.format(self.get_python_class_name(),
                               common.select_lang(self.get_description()),
                               self.get_device_identifier(),
                               self.get_long_display_name(),
                               self.get_name().under)
    def get_perl_package(self):
        template = """{0}
=pod

=encoding utf8

=head1 NAME

Tinkerforge::{1}{2} - {3}

=cut

package Tinkerforge::{1}{2};
"""

        return template.format(self.get_generator().get_header_comment('hash'),
                               self.get_category().camel,
                               self.get_name().camel,
                               common.select_lang(self.get_description()))