[chirp_devel] The End of Days - #495
Jim Lieb
Sat Feb 9 15:37:50 PST 2019
I'm the dev who did the Wouxon KG-UV9D+ driver. Since that effort, I've been
fooling around with a "clone" of chirp written in GO for my own amusement.
I've been impressed by the quality of the Golang project and have used it in
the past. Pike and Kernighan do good work. I thought of it to address issues
someone brought up when I wrote to this list about Fedora's dropping of Py2
support starting with Fedora 30. I have never been a fan of dynamic/
interpreted languages (bash, perl, python, tk/tcl, lua, etc.) for anything
larger than a few hundred lines. At least the Python 2->3 has not been as
disasterous as the Perl 5->6 that is still not really happening.
I do not want to sidetrack the discussion to make a language move as well but
my choice has been one informed by project experience. Some of my reasoning
could be applied to this non-trivial effort. One of my concerns, aside from
the experience of the Py2->Py3 death-march, that pointed me to GO instead of
Py3 was the deprecation of Win/NT by the Python community. This is an issue to
some in the Ham community who just want to play with their radios, not
sysadmin upgrade purgatory. But so much for that idea; Go has also dropped
support starting with V1.11... But a key point remains. The language choice
drags along with it a runtime environment that must also be present on the
target system. The motivation for the move (for me) was that Go produces a
single binary whereas Python (and most other "dynamic" languages) requires a
whole mess of other "stuff" that must be either already present on the target
client machine or must be ported/installed by the user before the application
can be installed. This is the primary reason why Win/NT was dropped. The
Python footprint is *huge*. To get enough Python to run a simple app like
chirp, you have to also have enough Python runtime to run any Python script,
including nearly all of the dev/debug environment. A Go app is just one static
binary and their cross-dev tooling is one of the best I've seen (and yes, I
know (and avoid) Java...). Multi-platform deployment is all about package
dependencies and runtime footprint. YMMV but my little project choice has been
to have a target device (radio) agnostic binary that could be easily cross-
built to other platforms and a separate set of device specific description
"recipes" for the target devices. BTW, this could extend the use case to
things like IOT devices and anything else that gets configured by dumping bits
into existing firmware memory.
Aside from the excursion through my personal choice of Go, there are a few
things to consider in this effort:
1. Fork the project. This is especially true given the current diff stats and
comments about the work so far. There are folks who are not moving from Win/NT
anytime soon and if they have PCs of that vintage, they probably have radios
of that vintage too that could have at least *some* maintenance support
without having what they need working muddied up by orthogonal development
efforts. There is a lot of work to do here and a separate fork will not cause
un-testable changes in the old code.
1a. This is an opportunity to move the codebase to git (and github). We had
this discussion a while back on the list. Hg is fine but it didn't catch on
and aside from its already captured base, it has become an impediment to
attracting a wider dev population. I got thru getting a driver submitted but
hg got in the way for me, a long time git based dev, than it should. This is
no knock on the hg devs nor do I want to start yet another SCM religion war.
They did and still do good work but hg is just one tool among many that follow
git around. Moving the fork to github also relieves the project from the
distraction of also maintaining a dev/scm infrastructure. There is more than
enough work to do maintaining chirp which is the main task. I was project lead
and release manager of a project we moved from Sourceforge to github years
ago. That moved our project (nfs-ganesha) from the margins to mainstream and
made the support of developer contributions much easier.
2. Attempting shim layers etc. to somehow keep both domains happy is a path to
ruin. There be dragons. This does not mean starting with a completely blank
slate but the code, especially the pile of drivers needs refactoring work and
attempts at shims get in the way of wholesale rewrites where they are needed.
I have been down this road many times before before with attempts such as
hacking on obsolete Linux drivers that clients wanted to be extended just a
little more and a little longer rather than going for the re-written new work.
Fortunately, that frustrating work was done under contract so I got paid for
eventually proving to the client that they would have been better off
modifying their userland code to use the new scsi drivers for r/w cdroms
rather than my hacking the cdrom hack of the old IDE HDD driver (ide-scsi),
that the ide maintainers decided to scrap, one more time. If you are not
careful you end up with a bigger mess than what you started with. That is why
I recommend (1). This is an opportunity for an un-encumbered refactor while
leaving the legacy installed base in peace.
3. The memmap and bitwise code is a great idea. But it does not go far enough.
It also could use a refactor because things silently break and the result of
the Python parser on errors is maddenly difficult to debug. The _real_ value
of this code is its idea that there is a description string that contains a
well defined syntax that gets parsed to deliver the memory map and the
namespace and methods to access it.
4. The get_settings method is a prime candidate for refactor in the spirit of
(3). In my driver (kguv9dplus.py) I gave it a go at refactoring what I saw in
the uv8d (and other) drivers but it is still messy. What is needed is to apply
the parser idea to the UI as well. This is all repetitive and bulky code. It
is also the massive blob of radio specific Python2 code that needs to be
hacked into Python3. If this moved to a parsed description, you would refactor
all that py2/gtk code out of existence while shrinking the lines of code. The
goal to achieve with this idea is to have the vast majority of a radio driver
be a description of the memory and the UI that presents it. I got this idea
from the QT framework which uses QML, an XML syntax UI description, instead of
inline C++, GO, C code. QML abstracts all that hardwired compiled API calls
into a description file that gets walked by the runtime.
5. My driver is also full of functions like int2freq() and freq2int()). These
are really type conversions in compiler terms. These two named functions map a
string representation of a frequency in MHz to a uint32 of Hz. I have some
ideas in design that would allow these too to be described in a syntax that
would map one type to another along with the scripted expressions to do the
type conversion. We already have this in the memory map syntax where a u16
describes a big-endian 16 bit unsigned and a ul16 describes a little-endian.
Every language has type conversion rules. Chirp just has a richer set of
domain specific types that need conversion rules. This eliminates a lot more
Python2 code.
6. The i/o code is a mess but unavoidable. See the comments in my driver. I
don't know what kind of dope the radio firmware coders were smoking but they
were toking more than one more over the line when they should have been paying
attention in data structures and comm protocols class. From my reading of the
other drivers, other chirp devs have suffered the same reverse-engineering
fate. Some scripting here is unavoidable. We have some of the lower level
stuff factored out into common Python code but we could probably do more. The
drivers dir has a lot of legacy code that was a good idea at the time but is
now full of slight variations of duplicated themes. It could use some love.
There is a lot of work ahead in this effort. It is also an opportunity to make
the project better. What I offer above is suggestions based on my multiple
trips down this road. Take what you find useful and leave the rest. "Explore
the idea in V1.0, re-write it to work in V2.0, ship V3.0".
I have mentioned code that I am working on. This has been mostly entertainment
for myself now that I've retired. My university work eons ago was originally
in language design etc. but my career got sidetracked into the Siren Song of
UNIX/Linux and the Internet... This is keeping my mind functional and active
as I (re)learn things like recursive descent parsers and code generators/
interpreters. In other words, I've scratching an itch and do not intend to dev
a rival to chirp. I'd be happy to discuss my work with anyone but that should
be on a side channel, not here on this dev list. And no, I haven't pushed
anything to my github (github.com/lieb) yet. That will be a while.
Jim
--
Jim Lieb
Mobile: 831-295-9317
GPG Key: 79BB52C7BD0530F5
"If ease of use was the only requirement, we would all be riding tricycles"
- Douglas Engelbart 1925–2013
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://intrepid.danplanet.com/pipermail/chirp_devel/attachments/20190209/96a6a7bd/attachment-0001.html
More information about the chirp_devel
mailing list