diff options
author | Uwe Hermann <uwe@hermann-uwe.de> | 2012-06-14 01:14:10 +0200 |
---|---|---|
committer | Uwe Hermann <uwe@hermann-uwe.de> | 2012-06-14 01:32:32 +0200 |
commit | a0153e903ba04cf9e6eb8c8a501508f4606efa6b (patch) | |
tree | b2b5f1ba3133fafc4011e02d82de4da58500f8a7 /decoders/uart_dump/uart_dump.py | |
parent | e1f5df5bd1d4847f1ebfade8d71161f8a5ede862 (diff) | |
download | libsigrokdecode-a0153e903ba04cf9e6eb8c8a501508f4606efa6b.tar.gz libsigrokdecode-a0153e903ba04cf9e6eb8c8a501508f4606efa6b.zip |
srd: Add experimental uart_dump decoder.
This PD stacks on top of the UART protocol decoder, and ouputs the
decoded UART data in the "canonical" format, one byte after the other
without any metadata (start bits, stop bits, parity bits, errors) and
without any sample-numbers and such. This is basically what you would
see in a terminal program, such as minicom.
Per default it outputs to stdout, but using the 'filename' option
and/or the 'filename_rx'/'filename_tx' options it can also output to
files.
Using the 'tx' and 'rx' options you can also select whether both, or
only one of the data direction's data should be output.
Example:
sigrok-cli -i foo.sr \
-a uart:rx=0:tx=1,uart_dump:rx=no:tx=yes:filename=foo.txt \
-s uart,uart_dump
This PD is just an experiment for now, it's possible that it will be
replaced / reimplemented via a different sigrok facility later on.
Diffstat (limited to 'decoders/uart_dump/uart_dump.py')
-rw-r--r-- | decoders/uart_dump/uart_dump.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/decoders/uart_dump/uart_dump.py b/decoders/uart_dump/uart_dump.py new file mode 100644 index 0000000..6ed0b61 --- /dev/null +++ b/decoders/uart_dump/uart_dump.py @@ -0,0 +1,110 @@ +## +## This file is part of the sigrok project. +## +## Copyright (C) 2012 Uwe Hermann <uwe@hermann-uwe.de> +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +## + +import sigrokdecode as srd +import os +import sys + +RX = 0 +TX = 1 + +class Decoder(srd.Decoder): + api_version = 1 + id = 'uart_dump' + name = 'UART dump' + longname = 'UART dump' + desc = 'Output decoded UART data to a file.' + license = 'gplv2+' + inputs = ['uart'] + outputs = [] # TODO? + probes = [] + optional_probes = [] + options = { + 'rx': ['Output RX data?', 'yes'], + 'tx': ['Output TX data?', 'yes'], + 'filename': ['File name for RX and TX data', '-'], + 'filename_rx': ['File name for RX data', 'none'], + 'filename_tx': ['File name for TX data', 'none'], + } + annotations = [] + + def __init__(self, **kwargs): + self.f = None + self.f_rx = None + self.f_tx = None + + def file_open(self, filename): + if filename == 'none': + return None + elif filename == '-': + return sys.stdout + else: + return open(filename, 'w') + + def start(self, metadata): + # The user can specify 'filename' (gets both RX and TX data), and/or + # 'filename_rx' (for RX data only), and/or 'filename_tx', respectively. + + # Default is to output RX and TX to 'filename', with 'filename_rx' and + # 'filename_tx' being unused. + + # If multiple 'filename*' options are specified, the user must NOT + # use the same file for any of them. + + # A filename of 'none' is not allowed (has special meaning). A filename + # of '-' means 'stdout'. + + self.f = self.file_open(self.options['filename']) + self.f_rx = self.file_open(self.options['filename_rx']) + self.f_tx = self.file_open(self.options['filename_tx']) + + def report(self): + pass + + def decode(self, ss, es, data): + ptype, rxtx, pdata = data + + # Ignore all UART packets except the actual data packets (i.e., we + # do not print start bits, parity bits, stop bits, errors, and so on). + if ptype != 'DATA': + return + + # TODO: Configurable format. + c = chr(pdata) + + # TODO: Error handling. + + # Output RX and/or TX to 'filename'. + if self.f != None: + if self.options['rx'] == 'yes' and rxtx == RX: + self.f.write(c) + if self.options['tx'] == 'yes' and rxtx == TX: + self.f.write(c) + + # Output RX data to 'filename_rx'. + if self.f_rx != None: + if self.options['rx'] == 'yes' and rxtx == RX: + self.f_rx.write(c) + + # Output TX data to 'filename_tx'. + if self.f_tx != None: + if self.options['tx'] == 'yes' and rxtx == TX: + self.f_tx.write(c) + |