Hello,
There are several reasons for the desire to develop sigrok protocol
decoders without installing the complete environment that is necessary
to build sigrok, e.g.
* You have an OS that is not supported as build environment.
* You want to use PulseView on a PC without the build environment and
need to investigate what's going on in your decoder.
In some cases it's useful to use the logger to output interesting
information. But with a growing complexity of your decoder, this
approach can cause more and more diagnostic code in your decoder that's
not necessary for its job: decoding.
I use a way to decouple the decoder execution from PulseView and
sigrok-cli. This allows to debug it with single-step and variable view
with my favorite debugger. The decoder needs an environment that can be
setup with a few lines:
# script to load and debug a protocol decoder
from sigrokdecode import SRD_CONF_SAMPLERATE
from mydecoder import Decoder
from data import data
import logging
testee = Decoder()
testee.applyOptions({'log':'~/decoder.log'},)
logging.basicConfig(level=logging.DEBUG)
testee.start()
testee.metadata(SRD_CONF_SAMPLERATE)
for d in data:
testee.decoder(*d)
It still needs a module sigrokdecode. This can be mocked easily:
# mock the sigrokdecode module, providing the Decoder class and some
constants
OUTPUT_ANN = 1
OUTPUT_PYTHON = 2
OUTPUT_BINARY = 3
OUTPUT_META = 4
SRD_CONF_SAMPLERATE = 10
class Decoder(object):
options = ( {'id': 'log',
'desc': 'Write log file "/pnet.log"',
'default': 'no', 'values': ('yes', 'no')}, )
def __init__(self):
pass
def register(self, output_type):
return 1000 + output_type
def put(self, startsample, endsample, output_id, data):
self.logger.debug('put ss:{} es:{} id:{}
{}'.format(startsample, endsample, output_id, data))
pass
def applyOptions(self, actualValues):
instanceOpts = {}
for k in self.options:
id = k['id']
try:
instanceOpts[id] = actualValues[id]
except:
instanceOpts[id] = k['default']
self.options = instanceOpts
The test script also needs the data that will be passed to the decoder.
That is imported from a separate file "data.py" with a content like this:
data = [
(2204,2217,['STARTBIT', 0, 0]),
(2334,2347,['STOPBIT', 0, 1]),
(2203,2347,['FRAME', 0, (304, True)]),
(2348,2361,['STARTBIT', 0, 0]),
]
This data has been generated with another decoder whose decode function
that just writes the parameter values from a real PulseView session to
that file "data.py".
What do you think about this approach to build a debug environment?
Beside the possibility to use any python debugger, you can also create a
unit test environment.
I used this only for stacked protocol decoders. But I think it should be
possible to use a similar way to use it for
Best regards,
Helge
_______________________________________________
sigrok-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sigrok-devel