[chirp_devel] [PATCH] [RFC] Add bitwise browser when developer options are enabled
Marco IZ3GME
Sun Mar 3 09:47:28 PST 2013
Grately appreciated: I'm working on the 857 settings, i'll test this
patch for sure ;)
I'll le you know my thoughts.
73 de IZ3GME Marco
On 03/03/2013 17:26, Dan Smith wrote:
> # HG changeset patch
> # User Dan Smith <dsmith at danplanet.com>
> # Date 1362327994 28800
> # Node ID d7da2968488769d7e32321b0e03d7201662dc079
> # Parent 49de55116a55bc5b35a5391aa14b3e68d182e4c7
> [RFC] Add bitwise browser when developer options are enabled
>
> This is something I've been wanting to do for a while. It provides a
> graphical way to explore the memory object of a clone-mode radio. It is
> roughly equivalent to doing "show raw memory" on a channel, but lets
> you do the same for other areas, such as the settings, limits, etc.
>
> I want to do more things like let you diff other areas, and perhaps
> display the contents in a more formal way so that they can be tweaked
> arbitrarily, but that will come later. I'm submitting this here for
> comments and folks to try it out. Note that it requires dev tools to be
> enabled before opening an image.
>
> Thoughts? Comments?
>
> diff -r 49de55116a55 -r d7da29684887 chirp/bitwise.py
> --- a/chirp/bitwise.py Thu Feb 28 18:13:55 2013 -0800
> +++ b/chirp/bitwise.py Sun Mar 03 08:26:34 2013 -0800
> @@ -188,7 +188,7 @@
>
> def __str__(self):
> if isinstance(self.__items[0], charDataElement):
> - return "".join([x.get_value() for x in self.__items])
> + return repr("".join([x.get_value() for x in self.__items]))[1:-1]
> else:
> return str(self.__items)
>
> @@ -612,6 +612,13 @@
> raise ValueError("Struct size mismatch during set_raw()")
> self._data[self._offset] = buffer
>
> + def __iter__(self):
> + for item in self._generators.values():
> + yield item
> +
> + def items(self):
> + return self._generators.items()
> +
> class Processor:
>
> _types = {
> diff -r 49de55116a55 -r d7da29684887 chirpui/editorset.py
> --- a/chirpui/editorset.py Thu Feb 28 18:13:55 2013 -0800
> +++ b/chirpui/editorset.py Sun Mar 03 08:26:34 2013 -0800
> @@ -19,7 +19,7 @@
>
> from chirp import chirp_common, directory, generic_csv, generic_xml
> from chirpui import memedit, dstaredit, bankedit, common, importdialog
> -from chirpui import inputdialog, reporting, settingsedit
> +from chirpui import inputdialog, reporting, settingsedit, radiobrowser, config
>
> class EditorSet(gtk.VBox):
> __gsignals__ = {
> @@ -65,6 +65,7 @@
> "bank_names" : None,
> "bank_members" : None,
> "settings" : None,
> + "browser" : None,
> }
>
> if isinstance(self.radio, chirp_common.IcomDstarSupport):
> @@ -88,6 +89,11 @@
> if rf.has_settings:
> self.editors["settings"] = settingsedit.SettingsEditor(self.rthread)
>
> + conf = config.get()
> + if (hasattr(self.rthread.radio, '_memobj') and
> + conf.get_bool("developer", "state")):
> + self.editors["browser"] = radiobrowser.RadioBrowser(self.rthread)
> +
> lab = gtk.Label(_("Memories"))
> self.tabs.append_page(self.editors["memedit"].root, lab)
> self.editors["memedit"].root.show()
> @@ -115,6 +121,10 @@
> self.tabs.append_page(self.editors["settings"].root, lab)
> self.editors["settings"].root.show()
>
> + if self.editors["browser"]:
> + lab = gtk.Label(_("Browser"))
> + self.tabs.append_page(self.editors["browser"].root, lab)
> +
> self.pack_start(self.tabs)
> self.tabs.show()
>
> diff -r 49de55116a55 -r d7da29684887 chirpui/radiobrowser.py
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/chirpui/radiobrowser.py Sun Mar 03 08:26:34 2013 -0800
> @@ -0,0 +1,154 @@
> +import gtk
> +import gobject
> +import pango
> +import re
> +import os
> +
> +from chirp import bitwise
> +from chirpui import common
> +
> +def do_insert_line_with_tags(b, line):
> + def i(text, *tags):
> + b.insert_with_tags_by_name(b.get_end_iter(), text, *tags)
> +
> + def ident(name):
> + if "unknown" in name:
> + i(name, 'grey', 'bold')
> + else:
> + i(name, 'bold')
> +
> + def nonzero(value):
> + i(value, 'red', 'bold')
> +
> + def foo(value):
> + i(value, 'blue', 'bold')
> +
> + m = re.match("^( *)([A-z0-9_]+: )(0x[A-F0-9]+) \((.*)\)$", line)
> + if m:
> + i(m.group(1))
> + ident(m.group(2))
> + if m.group(3) == '0x00':
> + i(m.group(3))
> + else:
> + nonzero(m.group(3))
> + i(' (')
> + for char in m.group(4):
> + if char == '1':
> + nonzero(char)
> + else:
> + i(char)
> + i(')')
> + return
> +
> + m = re.match("^( *)([A-z0-9_]+: )(.*)$", line)
> + if m:
> + i(m.group(1))
> + ident(m.group(2))
> + i(m.group(3))
> + return
> +
> + m = re.match("^(.*} )([A-z0-9_]+)( \()([0-9]+)( bytes at )(0x[A-F0-9]+)",
> + line)
> + if m:
> + i(m.group(1))
> + ident(m.group(2))
> + i(m.group(3))
> + foo(m.group(4))
> + i(m.group(5))
> + foo(m.group(6))
> + i(")")
> + return
> +
> + i(line)
> +
> +def do_insert_with_tags(buf, text):
> + buf.set_text('')
> + lines = text.split(os.linesep)
> + for line in lines:
> + do_insert_line_with_tags(buf, line)
> + buf.insert_with_tags_by_name(buf.get_end_iter(), os.linesep)
> +
> +class RadioBrowser(common.Editor):
> + def _build_ui(self):
> + self._display = gtk.TextView()
> +
> + fontdesc = pango.FontDescription("Courier 10")
> + self._display.modify_font(fontdesc)
> + self._display.set_editable(False)
> + tt = self._display.get_buffer().get_tag_table()
> + for color in ["red", "green", "blue", "grey"]:
> + tag = gtk.TextTag(color)
> + tag.set_property("foreground", color)
> + tt.add(tag)
> + tag = gtk.TextTag("bold")
> + tag.set_property("weight", pango.WEIGHT_BOLD)
> + tt.add(tag)
> +
> + self._store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)
> + self._tree = gtk.TreeView(self._store)
> +
> + rend = gtk.CellRendererText()
> + tvc = gtk.TreeViewColumn('Element', rend, text=0)
> + self._tree.append_column(tvc)
> + self._tree.connect('button_press_event', self._tree_click)
> + self._tree.set_size_request(200, -1)
> +
> + self.root = gtk.HBox(False, 3)
> + sw = gtk.ScrolledWindow()
> + sw.add(self._tree)
> + sw.show()
> + self.root.pack_start(sw, 0, 0, 0)
> + sw = gtk.ScrolledWindow()
> + sw.add(self._display)
> + sw.show()
> + self.root.pack_start(sw, 1, 1, 1)
> + self._tree.show()
> + self._display.show()
> + self.root.show()
> +
> + def _fill(self, name, obj, parent=None):
> + iter = self._store.append(parent, (name, obj))
> +
> + if isinstance(obj, bitwise.structDataElement):
> + for name, item in obj.items():
> + if isinstance(item, bitwise.structDataElement):
> + self._fill(name, item, iter)
> + elif isinstance(item, bitwise.arrayDataElement):
> + self._fill("%s[%i]" % (name, len(item)), item, iter)
> + elif isinstance(obj, bitwise.arrayDataElement):
> + i = 0
> + for item in obj:
> + self._fill("%s[%i]" % (name, i), item, iter)
> + i += 1
> +
> + def _tree_click(self, view, event):
> + if event.button != 1:
> + return
> +
> + pathinfo = view.get_path_at_pos(int(event.x), int(event.y))
> + path = pathinfo[0]
> + iter = self._store.get_iter(path)
> + name, obj = self._store.get(iter, 0, 1)
> +
> + do_insert_with_tags(self._display.get_buffer(), repr(obj))
> +
> + def __init__(self, rthread):
> + super(RadioBrowser, self).__init__()
> + self._radio = rthread.radio
> + self._build_ui()
> + self._fill('root', self._radio._memobj)
> +
> +if __name__ == "__main__":
> + from chirp import *
> + from chirp import directory
> + import sys
> +
> + r = directory.get_radio_by_image(sys.argv[1])
> + class Foo:
> + radio = r
> + w = gtk.Window()
> + b = RadioBrowser(Foo)
> + w.set_default_size(1024, 768)
> + w.add(b.root)
> + w.show()
> + gtk.main()
> _______________________________________________
> chirp_devel mailing list
> chirp_devel at intrepid.danplanet.com
> http://intrepid.danplanet.com/mailman/listinfo/chirp_devel
> Developer docs: http://chirp.danplanet.com/projects/chirp/wiki/Developers
>
More information about the chirp_devel
mailing list