<div dir="ltr"><div>Pavel, thanks for putting in the time to write all of this.  I&#39;m still going through it. <br><br></div>Would you consider the Baofeng UV-B5 a good simple radio to start with?  I ask because I already own that radio.  If not, I can buy a BF-T1.  I also own a UV-5R, but I know that has many variants and its driver file is more than twice as large as the UV-B5.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 4, 2018 at 4:06 PM, Pavel Milanes via chirp_devel <span dir="ltr">&lt;<a href="mailto:chirp_devel@intrepid.danplanet.com" target="_blank">chirp_devel@intrepid.danplanet.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <p>Hi Rob, welcome to the world of reverse engineering techniques in
      python.</p>
    <p><i>Grab a cup of coffe/tea/soda as this is a medium/log sized
        email. </i><br>
    </p>
    <p>A Chirp&#39;s dev as a elmer in the &quot;next block&quot; is a pure gold mine,
      but as this is a rare case I suggest you to dig on this:</p>
    <ul>
      <li>Get comfortable with python language, its learning curve is
        one of the most pleasant and fast I have found</li>
    </ul>
    I learned python building a driver for the Feidaxin FD-268A
    (<a class="m_9178315442571566909moz-txt-link-freetext" href="https://chirp.danplanet.com/issues/2169" target="_blank">https://chirp.danplanet.com/<wbr>issues/2169</a>) and two years after that
    (now) I have supported a few other models of Feidaxin, the first
    wave of B-TECHs and its long clone family (remotely with the great
    help of Jim Unroe), The Kenwood Family 60 and 60G and recently the
    Baofeng BF-T1 (with help of the users
    <a class="m_9178315442571566909moz-txt-link-freetext" href="https://chirp.danplanet.com/issues/4933" target="_blank">https://chirp.danplanet.com/<wbr>issues/4933</a>)<br>
    <p>When you get the swing and you have the help of the users you can
      do drivers without touching the radio it self! for example the
      B-TECHs and the recent Baofeng BF-T1.</p>
    <p>The best learning material is the Chirp code base, you will have
      buch of examples to play with. <br>
    </p>
    <p>Review the Chirp&#39;s wiki page about developing a new model, there
      you will learn how to setup a correct environment to start, an a
      few trick more.</p>
    <p>Google is your friend, ask anything about python &amp; you will
      get a few dozens of hits for every question you make. <br>
    </p>
    <ul>
      <li>Get some background on some important things you will need, as
        usual google is your friend.</li>
    </ul>
    You need to understand some concepts like (to start): <br>
    <blockquote>
      <ul>
        <li>Numeric representations y different bases (hexadecimal and
          bit tinkering)</li>
        <li>Boolean and arithmetic operations (and, or, xor and it&#39;s
          combinations)</li>
        <li>String and numeric representation in python, including
          conversions between formats.</li>
        <li>Data encoding: Little/Big endian, BCD, etc.</li>
        <li>Serial communications.</li>
        <li>Regular expression matching (for the serial capture log
          cleaning)<br>
        </li>
      </ul>
    </blockquote>
    My roadmap for someone that start to develop is like this (very
    similar to other suggestions) <br>
    <ul>
      <li>Get a already supported &amp; cheap radio, and do a reverse
        engineering by yourself, use a simple radio if possible (not a
        driver with multiple variants) use the already made driver as a
        cheat sheet, but not too much... don&#39;t be surprised to find bugs
        or to add new features not supported by the original developer)</li>
      <li>Let me suggest you an inexpensive and easy radio for this:
        Baofeng BF-T1.<br>
      </li>
      <li>Then go to a more complicated model to understand the concept
        of supporting multiple radios on a single driver and a few more
        new techniques. ( a few candidates for this stage: Baofeng
        UV-5R, B-TECH)</li>
      <li>Very important point: look and learn from your radio family,
        the one you pretend to support (kenwood, yaesu, baofeng, etc.)
        All families has a very similar logic and structure.</li>
      <li>Now got your hands dirty with the dev stage.</li>
    </ul>
    The main dev steps are this (at least for me):<br>
    <br>
    1 - Get a serial capture log for the download and upload processes.<br>
    <br>
    Go to
    <a class="m_9178315442571566909moz-txt-link-freetext" href="http://chirp.danplanet.com/attachments/2257/how%20to%20portmon.doc" target="_blank">http://chirp.danplanet.com/<wbr>attachments/2257/how%20to%<wbr>20portmon.doc</a>
    and learn how to capture a log, if you don&#39;t has a Windows at 32
    bits then use other port serial monitors, free alternatives are
    usbpcap and wireshark (there are some freeware tools out there too,
    google &quot;serial monitor eltima&quot;) all comments on the settings for the
    capture about logging time and hex + ascii are valid.<br>
    <br>
    In this point a good editor text editor (geany, notepad++, gedit)
    with regular expression support will help you to &quot;clean&quot; and get a
    log with just the needed data and no more comments and notices...<br>
    <br>
    2 - Analyze the serial stream logs, you need to figure out the
    serial details (baudrate, transfer bits, parity &amp; stop bits) and
    more<br>
    <br>
    Usually the radios has a magic string and then a ident string, not
    all works the same, Yaesu has a key combinations to send/capture
    data, etc...<br>
    <br>
    The magic string is the string you send to the radio to put it on
    clone mode, usually they answer back with a fer chars.<br>
    The ident string is a special request to retrieve radio
    identifications as full model and some other useful info (band data,
    options installed, firmware version, etc.)<br>
    <br>
    3 - Figure out the clone logic.<br>
    <br>
    Usually you has to send a crafted string of a few bytes with a
    command, an address to start to read and the amount of data you
    want; you will identify it easily as they repeat itself incrementing
    the address part of the string.<br>
    <br>
    Following this request the radio answer with a block of data that
    may/may not contain a kind of echo of the request and then the data
    payload you want to read.<br>
    <br>
    You can search the drivers already in chirp to identify similar
    drivers you can reuse for that and to understand the clone logic.<br>
    <br>
    4 - Build a skeleton of the driver for only download and radio
    image.<br>
    <br>
    In this step you can reuse a similar driver, concentrate into
    download an image.<br>
    <br>
    5 - Get upload support.<br>
    <br>
    Do step 3 but for the upload process, build the upload procedures,
    test and validate.<br>
    <br>
    At this point you are wondering if writing an incorrect data stream
    will damage the radio... for this there are 50% chance of brick your
    radio for some models, but that&#39;s 100% recoverable:<br>
    <br>
    Before playing with upload get a copy of your radio mem (codeplug)
    with your OEM software; if you brick your radio, simply power cycle
    it and upload the codeplug with the OEM software. Done, you are set
    again to play.<br>
    <br>
    Note that we are not changing a bit of the radio memory yet, so
    download and upload must not affect the functioning of the radio.<br>
    <br>
    6 - Reverse-engineer the memory data.<br>
    <br>
    If you are working in Linux (which I encourage to do so) you have a
    few tools at disposal, &quot;hd&quot; command utility is your best friend and
    the hexdiff script is a joy
    (<a class="m_9178315442571566909moz-txt-link-freetext" href="https://chirp.danplanet.com/projects/chirp/wiki/DevelopersAdd_a_Radio" target="_blank">https://chirp.danplanet.com/<wbr>projects/chirp/wiki/<wbr>DevelopersAdd_a_Radio</a>)<br>
    <br>
    Follow this steps: (use a paper and pencil or a digital notepad to
    write down your findings if you are not familiar yet with
    MEM-FORMAT)<br>
    <br>
    6.1 OEM soft: program just one channel with a simplex freq on it,
    save to radio<br>
    6.2 Chirp: read image, save as base.img<br>
    6.3 OEM soft: same channel, change the RX freq, save to radio<br>
    6.4 Chirp: read image as new<br>
    6.5 Use hexdiff to compare images... now you have found where it
    store channel #1.<br>
    <br>
    Using that algorithm determine channel structure and data:<br>
    <ul>
      <li>TX and Rx are stored as is or base +/- offset</li>
      <li>What about Rx tones, Digital tone, inverted tone?</li>
      <li>Same for Tx tone...</li>
      <li>Repeat with every other channel property (scan/skip, power,
        name)</li>
    </ul>
    And go for a mid and then the final (last channel) to determine
    boundaries of the channel data... then learn <br>
    <br>
    Now see some other drivers to learn/improve how to represent your
    findings on MEM_FORMAT language...<br>
    <br>
    Don&#39;t forget to COMMENT EVERYTHING that is not obvious in the code
    reading, <br>
    <br>
    7 - Build the memory parse functions<br>
    <br>
    Use other drivers to represent your MEM_FORMAT in channel data for
    the UI. At this point you will get chirp represent your data in a
    visual way, polish and validate it, test the limits of data and
    validate for that.<br>
    <br>
    8 - Re-do point 6 but for Settings.... <br>
    <br>
    Learn how to represent them from other drivers code.<br>
    <br>
    9 - Now try to validate the driver against the Chirp&#39;s test bed,
    with run_test and/or tox... <br>
    <br>
    You will find more and more errors in your code, validations are
    need here and there, prep up your code...<br>
    <br>
    Test it extensively against your hardware...<br>
    <br>
    10 - Submit a patch.<br>
    <br>
    See the wiki to know how to deal with mercurial.<br>
    <br>
    Every radio is different, you will even find bugs in serial
    communication (first ident try result in a bad checksum) etc, the
    hell is in the details and you need to triage them to find the
    solution.<br>
    <br>
    If you are unlucky you will need to make yourself a new way, like a
    OM recently did in finding the brick of the encryption schema in the
    Wouxun KG-UC8D Plus, and opening a door for me too develop a driver
    for the KG-UV8E and T and possible for the UV9D Plus also.
    (<a class="m_9178315442571566909moz-txt-link-freetext" href="https://chirp.danplanet.com/issues/3943#change-15199" target="_blank">https://chirp.danplanet.com/<wbr>issues/3943#change-15199</a>)<br>
    <br>
    This is my 10c contribution, don&#39;t give up. Ask me for help any time
    you want (direct mail or via the list), I&#39;m not in the &quot;next block&quot;
    or &quot;around the corner&quot; but I will help you as much as is possible to
    me. I&#39;m not 100% of the time online, as Internet is a scarce and
    expensive resource here in Cuba, so you may wait for and answer from
    me, I try to connect at least twice a day to check when an active
    development is on going.<br>
    <br>
    Finally take a time to see this video to learn a few tips to deal
    with an Open Source Community with his soft and rough edges:
    <a class="m_9178315442571566909moz-txt-link-freetext" href="https://www.youtube.com/watch?v=7XTHdcmjenI" target="_blank">https://www.youtube.com/watch?<wbr>v=7XTHdcmjenI</a><br>
    <br>
    73 Pavel CO7WT...<br>
    <br>
    <div class="m_9178315442571566909moz-cite-prefix">El 04/01/18 a las 12:39, Rob Owens via
      chirp_devel escribió:<br>
    </div>
    <blockquote type="cite">
      <pre>I now have three radios that are not supported by Chirp.  Nobody has
stepped up to add support, so I&#39;m trying to teach myself how to do it.
But I&#39;m sure my learning curve would be much quicker if I had somebody
experienced to work with for a day or so.  

Is there anybody near northwestern New Jersey who would be willing to
help me get started?  I&#39;m not looking for someone to do the work for me,
just somebody to help remove the cloud of uncertainty I&#39;m stuck in.

-Rob
______________________________<wbr>_________________
chirp_devel mailing list
<a class="m_9178315442571566909moz-txt-link-abbreviated" href="mailto:chirp_devel@intrepid.danplanet.com" target="_blank">chirp_devel@intrepid.<wbr>danplanet.com</a>
<a class="m_9178315442571566909moz-txt-link-freetext" href="http://intrepid.danplanet.com/mailman/listinfo/chirp_devel" target="_blank">http://intrepid.danplanet.com/<wbr>mailman/listinfo/chirp_devel</a>
Developer docs: <a class="m_9178315442571566909moz-txt-link-freetext" href="http://chirp.danplanet.com/projects/chirp/wiki/Developers" target="_blank">http://chirp.danplanet.com/<wbr>projects/chirp/wiki/Developers</a><span class="HOEnZb"><font color="#888888">
</font></span></pre><span class="HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="HOEnZb"><font color="#888888">
    <br>
    <pre class="m_9178315442571566909moz-signature" cols="72">-- 
73 CO7WT, Pavel.
</pre>
  </font></span></div>

<br>______________________________<wbr>_________________<br>
chirp_devel mailing list<br>
<a href="mailto:chirp_devel@intrepid.danplanet.com">chirp_devel@intrepid.<wbr>danplanet.com</a><br>
<a href="http://intrepid.danplanet.com/mailman/listinfo/chirp_devel" rel="noreferrer" target="_blank">http://intrepid.danplanet.com/<wbr>mailman/listinfo/chirp_devel</a><br>
Developer docs: <a href="http://chirp.danplanet.com/projects/chirp/wiki/Developers" rel="noreferrer" target="_blank">http://chirp.danplanet.com/<wbr>projects/chirp/wiki/Developers</a><br></blockquote></div><br></div>