The "options" in the Decoder class is a class-level variable, shared by all
instances of the Decoder class (like static in C++ or Java). It is meant to
be an abstract description of the options, it does not store the concrete
values of the options for any one instance.

When you instantiate a Decoder object, it must take the tuple of
class-level options (really, a description of options) and create an
instance-level dictionary for the concrete options of that instance. In
Python, you must use "self" to refer to the instance. So you would need
code like:

class Decoder:
    # class options description
    options = ({'id': 'baudrate', 'desc':'Baud rate', 'default':115200},)

    def __init__(self):
        self.options = {} # new instance options
        for opt_spec in Decoder.options:
            opt_id = opt_spec['id']
            opt_default = opt_spec['default']
            self.options[opt_id] = opt_default

    def start(self):
        print('baudrate: %d' % self.options['baudrate'])

if __name__ == '__main__':
    d = Decoder()
    # expect baudrate to be default 115200 unless changed
    # d.options['baudrate'] = 9600
    d.start()

For reference, this happens in function srd_inst_option_set of instance.c
around line 142
https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blob;f=instance.c;hb=02aa01ad5f05f2730309200abda0ac75d3721e1d#l133


On Mon, Nov 1, 2021 at 9:47 AM Helge Kruse <helge.kr...@gmx.net> wrote:

> Hello,
>
>
>
> I am not an experienced Python programmer. So I’d like to ask some detail
> to the syntax I found in sigrok protocol decoders.
>
>
>
> I wonder about the syntax or probably syntactic sugar in the
> libsigrokdecode library. The sigrok protocol decoder API (
> https://www.sigrok.org/wiki/Protocol_decoder_API) includes the attribute
> “options” as a tuple consisting of dictionaries. The decoder code itself
> reads the current options value with a “string index” like in the UART
> decoder:
>
>
>
>     self.bw = (self.options['data_bits'] + 7) // 8
>
>
>
> I want to run my decoder in a plain Python environment to make some tests.
> Instead of deriving from “srd.Decoder” I can write the decoder class like
> this:
>
>
>
> class Decoder:
>
>     options = ( {'id': 'baudrate', 'desc': 'Baud rate', 'default':
> 115200}, )
>
>
>
>     def __init__(self):
>
>         pass
>
>
>
>     def start(self):
>
>         if options['baudrate'] == 9600:
>
>             pass
>
>
>
> # test the class
>
> if __name__ == "__main__":
>
>     d = Decoder()
>
>     d.start()
>
>
>
> If I instantiate the class I get an exception for the first line in the
> start method: “tuple indices must be integer or slices, not str”.
>
>
>
> What is the magic behind the libsigrok implementation, that allows to use
> a string to access a specific options value? Is there some Python magic
> that helps to make the start method running in a plain Python environment?
>
>
>
> Best regards,
>
> Helge
>
> _______________________________________________
> sigrok-devel mailing list
> sigrok-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sigrok-devel
>
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to