Some notes covering some recent work covering Code Witches, Ribbit and some other stuff.
Vibing with Cursor.ai and trying out Kiro.ai
Some recent updates include a more robust set of error handling and debugging. If a message fails it's CRC32 in the PolarEncoder, the message in the chat log is shown that a message was rejected due to a bad CRC32. Also adding in the message handling in the ribbit.cc to send the decoding error. Also added in some better buffer handling in the index.js of the ribbit project, along with some better error handling there as well. Also planning on adding in some unit tests to ensure better overal stability. Thanks to some of the programming oriented AI's ability to run ahead of me, I've been able to get a lot of the code written and tested. It's like having a small dedicated team of engineers working on the project with me. I think Kiro.ai will become a pretty good dev tool along with Cursor, they're both pretty much the same thing, but Kiro has a long form implementation planning structure that it's able to build toward, so adding future features can come in the form of a detailed plan. Cursor is more of a "just do it" type of tool.
Busy in the garden
I've been working on the header encoder and decoder, a new version is in the works as per instruction from Pierre. In preparation for the upcoming Defcon in August, I'll try to finish up the new version before then.
Quite busy with work lately. Learned a lot about Hls (Http live streaming)
a tech from apple, so it seems to be a bit more predictable than regular
video streaming. Also managed to finish up some projects for Ohio State
University, and some Hawaii Tree Recovery projects. So with that out of
the way, I'll be able to focus on some of the projects I've been working on.
On another note: Ham Weekly is a great resource for
getting the latest news and information about the ham radio community.
I've been working on the header encoder and decoder. Tomorrow I'll be meeting up with Pierre to discuss some of the changes I've been making.
Morse Invaders was recently posted. Something fun to check out. Also MorseMaven is another interesting CW related app. In light of the recent releases, I should get back into my own app and see how far I can get with it.
Updated CSS, thanks AI!
Going to update the name entry part of the encoder next.
The Dayton Hamvention is going in Ohio, would be fun to see what was going on, but there are plenty of vloggers there I can follow on social media.
Some changes have been made to the time encoding. You can see here for the latest version. this converts the time into 0b0000 for month then an unusual 21 bit 0b 0000 0000 0000 0000 0000 0 form for storing the number of every other second that has passed since the start of the month.
Other random things like this Contest Schedule app
I have some changes to apply to the header this weekend.
Working on the things.
Okay, lets see how this is working so far. Here is a page with a header encoder. This is a work in progress, but you can fill in fields and see the resulting bits in the output at the bottom of the page.
Been a while since the last update, but I've been working.
I've been pushing changes to the development branch of the ribbit repo. I've added a new settings page with a new layout in a test html page found in the web sub directory. There's also a new header encoding/decoding test page found there as well. The header encoding/decoding page will have javascript that will become a portable module that can be easily integrated and modified on it's own.
The settings page has been split into a few sub-sections to be a bit more intuitive, along with some settings names/categories. The interactivity is also greatly simplified by using straight forward CSS with checkboxes and radio buttons providing the interactivity.
The header encoding is taking a while to craft, the time encoding is
up next in with the custom bit sizes being the more interesting js
problem to solve. So I'm calling the 4 bit object a nibble, which is
technically what it has been called, but the 5 bit object is a nibbit
or a "nibble + a bit" and then there's the 6 bit object which is a nibblit.
A nibble and a couple of bits. Each one has it's own set of specific
characters they are responsible for representing. So I might rename
some of the data types something like nibblenums, or nibletters etc.
This is more of a self-reminder as to what the data types are and how
they are used.
Just because It's fun here's a link to some other digital noises.
Fiddling with CSS on a rainy afternoon.
Been working on an updated settings panel, you can play with it here. I've broken up the settings into three sections and made the text larger and easier to read for smaller mobile devices. Also did a lot of work to make sure that it scales properly to various proportioned screen sizes.
A continuing effort.
The plan this week is to add in comments to the cpp. Add in some details to the dsp code from Ahmet. The javascript should also be broken up into some more portable code to make it more reusable and easier to edit.
I'll look at using the same DSP code and look at how it could be used to do some CW detection. There are a lot of interesting functions in there that could help with the signal processing.
Making headway.
For those interested,
here is a link to the development branch of the ribbit repo. I'll be working on updates
to this branch, so don't expect this to be functioning while in development. As changes
make progress I'll be setting up proper feature branches, but as of yet this is basically
a work in progress branch. In the branch you'll find
a modified version of the original ribbit cpp code with some emscripten modifications.
The files in here were forked from rattlegrams
aicodix repo. Though since then there have been modifications. I should do a full write
up on the sort of history/evolution of the code and reasons for the project's existance.
More on that later. π
Building things the right way.
So I've added a proper build script that installs emscripten if it's not already there. There's also a proper read me, and the cpp with the emscripten modifications were added. Been working on making a "proper" git hub release with instructions, build scripts and all that stuff to make the repo look a lot more professional and organized.
Understanding new tools and the new vibe
Figuring things out a bit more slowly since this is more related to the inner guts of the C++ side of stuff. Though as Claude gets better, i think it's at 3.7 now, it's interpretation and reasoning are getting better.
So on the CW side i've been practicing my copy skills listening to the folks chattering on 40m. Tonight there were a bunch of people beeping away on the AE section of 40m, so that was some good practice, pretty fast WPM.
I've been working on quite a few things. First some work on a CW decoder using rust and wasm. The audio pipeline into a waterfall works quite well and the time resolution can differentiate beyond 48wpm quite easily. The learnings from this will lead directly into a better understanding on how the encoding and decoding works for ribbit. Building a DSP for CW from scratch has helped me understand the inner workings of the ribbit cpp library.
Thanks to the help from cursor.ai I've been able to make some progress on the ribbit app.
I had cursor add comments on nearly every line of the code. This has helped me understand
the code better. With this I was able to understand the encoding system which I assume was
strictly using UTF-8. However, the encoding system was using a strict uint8 byte array.
This means that the data array of 255 bytes could be used in a more free form manner, not
strictly for UTF-8; superb!
So this means I can resume progress on the ribbit app's compact header with a bit more
freedom.
Being able to decode CW from a live audio stream will be required for the code witches app.
Writing the DSP in rust will directly translate into a CW engine for running the code witches
app. One part of CW is ranking and scoring the incoming signals. This will be a bit more complex
than just decoding the signal, but I think it'll be a good learning experience.
One thing I'm considering is using a CNN or cascading neural network to interpret individual
characters, then using a timing function to score the character compared to a
perfect character.
This approach should be more simple than using a general purpose function to both decode
each character and score it.
WPM rating will become the "Level" of a spell cast. The adherence to the timing will
be the "Power" of the final spell cast. A low level spell will begin at around 12WPM. Higher
level spells will require more characters and faster timing, but if the timing is bad then
the spell's effect will be reduced. Even slower spells can deliver a powerful effect if the
timing is good.
An interesting way to approach learning CW is by "reading" the waterfall.
The image above is a screenshot from the CW app. The CW signals from various operators can
be clearly seen in the waterfall. To the top right you can clearly see a "TU" or "- ..-"
Under that you can read "N7ZZ" some space and a "T.." which I can guess will be a "TU" as well.
The noise makes a weak signal harder to see, but I think I can make out a "KN7?M DT" or
something like that, then under that I can make out a "FPO" and then maybe a "G" and some
more noise obscuring the signal.
In any case, this along with listening I think makes reading CW a lot easier. And my ability
to copy after only a week or so of practice in the evenings is quite good.
Feel free to check it out here.
It's been a while since the last update, but we're back, and I've actually been quite busy.
One of the side projects of this side project was doing some work learning a lot about rust.
The project I was working on was a rust library for decoding CW from a live audio stream in
the browser. I've managed to get a few different versions working but the latest one was getting
rather complex and I wanted to start adding some unit tests to make sure each function was
working as expected. I've also been working on a few other projects, but I'll save that
for another post.
Pierre contacted me again after a while and we discussed some of the inner workings of the
ribbit lib. I went through and had cursor.ai add a bunch of comments to the C++ code. This
helped a great deal to help clearify what the code was doing and where I'd be able to make
changes.
The most important thing I discovered was that the input encoding was not a strict UTF-8 input
data stream rather, it was a strict uint8 byte array. This means that the data array of 255
bytes could be used in a more free form manner, not strictly for UTF-8; superb!
So this means I can resume progress on the ribbit app.
To learn a bit about rust and wasm I've been working on a simple cw decoder. I've asked my friendly AI in my app to help me out. Here is the current state of the project. Cursor was also able to help build the rust module and build the manifest to build the project into a web app. Select an audio input and you can start vocalizing CW into your mic and see the dashes and dots appear in the output area.
Got some new bedding and some other housewares.
Now that I have some idea on how to best manage the audio input for ribbit I should build some actual use cases with a minimalistic UI to listen for incoming signals and doing some decoding. This will become a part of the repo as example code for decoding ribbit messages.
Happy New Year! ζγγΎγγ¦γγγ§γ¨γγγγγΎγ!
Continuing some of the microphone input testing. Also looking at serial input so I can connect via USB to my ic-705. For now i'll just continue with the microphone setup. The microphone test page has a few more examples of how to use the microphone input.
Enjoying the time off by doing some work under the house and in the garden.
Been focused on getting a working microphone test setup for the ribbit app. So far I've been looking at a scheme to play an audio file and recording it with the microphone. The audio file is played and the recorded audio is compared to the original audio file to determine the correlation between the two. The correlation is then used to determine the quality of the microphone. The problem so far is that it seems the OS is blocking the mic from hearing audio as it's being played.
A lot of shopping again, this time for Japanese new years food (osechi).
Next comes a bunch of setup to start some testing and usage of the device microphone. On iOS in particular there is more than one place where the user can disable access to the mic from the browser, so I'll need to build some UI to help instruct the user to allow access to the mic. Then I'll need to test the mic to make sure it's working and the user can decode incoming audio signals.
That was fun! So many things. And several days off work.
I've been working on the settings panel for the ribbit app and I've managed
to boil down the CSS for the settings panel down to as few lines as possible.
At this point I can move it into a settings.css file and I'll be able to
figure out how to keep the different areas of the app separated into different
CSS files. At least that's the plan. A functional preview is
here as an unaesthetic layout using
just CSS. There's a few javascript buttons to un-check a radio button, but that's
all. There's still formatting to do, and more prettification, but I was focused
on using less javascript and using more CSS to make the UI functional, but at
the same time keeping the HTML layout clean and functional.
Continuing on with some aesthetic improvements to the ribbit app as well.
Merry Christmas!
I think to simplify some of the development of the app i'll be breaking the javascript code into a few separate files. This will allow me to work on the app in a more modular way and make it easier to understand.
Merry Christmas!
I have some time off from work, so I'll be working on ribbit and code witches.
Making some discoveries to detect audio...
So from a different project for work I started getting into making some discoveries about how to handle detecting if the browser is allowed to play audio. Here is a page with some sample code to detect if the browser is allowed to play audio. The code tries to play an audio file when the page loads. If the browser is allowed to play audio, then the audio will play. If the browser is not allowed to play audio, then the audio will not play and an error will be thrown and we're able to catch an event to handle the error.
Been getting up early and making coffee using a new coffee grinder.
The new settings panel is coming along, using as much regular CSS as possible while avoiding any unnecessary javascript to handle showing and hiding various options. I'll be posting some sample stuff soon.
Got multiple projects going on at once for work. Deliered one pretty big app and I've got more on the way.
I've been working on the preferences and settings panel for the ribbit
app and I've found an interesting rabbit hole to go down.
A lot of work is required to get in depth control over microphone
and speaker assignments on mobile and on the desktop.
If you've got bluetooth headphones or speakers I'll want to allow the
user to pick which one they want to use for the ribbit app. I also would
like to allow the user to pick which microphone and have a system setup
for the user to test the app to make sure the settings work. Video
conference apps have a pretty good setup to show which mic and speaker
is being used, so I'm going by those as an example. More over, browsers
on mobile (especially iOS) have various places they hide settings to
disable access to the microphone. Privacy and security issues are
always a concern, so I'll be looking into how to best handle this.
Happy Thanksgiving!
Looks like there's plenty of work to get done. I'll be focused on making the settings panel a bit more informative as well as adding some help dialogs to the various settings. Mainly on iOS there are usually access problems with the microphone, so I'll be looking into that.
What a wild election night!
As before, I haven't had too much time to work on the app. Seeing some bugs in the compact header code which I'll do some work to fix before going any further. Also I'll put together a simple version of the app together without any complex features to test portable web app functionality.
Get out and vote! Also, getting into a new morning routine. Will do some more work in the mornings rather than the evenings.
As before, I haven't had too much time to work on the app, but will begin doing so in the mornings before work.
Happy halloween!
I've had enough time to rest up and catch up with work/anime/everything else. I left off on the compact header
which I should continue with, finish up and then add in the worker thread to make the app work offline.
Goodness, that was a very event filled trip over seas to Japan to hang out with family and friends. Also, maybe at some point I should look at what is required for γ’γγγ₯γ’η‘η· in Japan or "amateur musen". So Pacificon was this past weekend, I'll catch up on how ORI did at the show, I hope things went well, but I've been busy catching up with work this week. More to come and Maybe I'll post a link to a small photo album from my trip.
Deadlines at work holding back some progress on ribbit. I also have to go get a rotary hammer drill to dig the holes for the foundation anchors under the house.
Getting some progress made dealing with indexedDB for storing the tables for text/binary conversion. Hoping to
have this figured out this weekend, then I'll begin integration with the main app and hope to have a demo ready
for Pacificon. I'll be out of town for the convention, but the folks from ORI will have people able to present
the app there. I'll have my laptop with me, so I'll be working on it while I'm in Japan.
The compact header is coming along. There are still some bugs to work out,
but you can take a look at the conversion into binary, which seems to be working.
Spent some more money on foundation anchors and some wine at the local beer and wine festival in downtown. Didn't have much time for any other projects, mostly doing housework.
So I need to add '1's to pad out the unused areas of the sender ID and other sections. Then I'll have just about finished the work on the header code.
Working into the evening...
So the updated version of the compact header stuff is almost working. I just need to come up with a streamlined way to encode/decode the gridsquare and stop reading things past a terminator character.
This image shows the input fields. These are then combined and converted into binary values. The binary is then converted into various utf-8 characters which would be fed into the ribbit encoder to transmit. Then if the utf-8 characters are all decoded by the reader, then they're reverted back into bits. Then the tricky part is to re convert the bits back into the original values. At the moment I have the version, timestamp, callsign type and callsign decoding. Next I'll need to get the grid square and a name. The rest of the message will remain as undecoded utf-8 which is how the message was sent to begin with.
Didn't have much time to do anything under the house, hope there's still time before an earthquake shoves the
fondation out from under the frame. Didn't get to the gym, had to cut down some metal pipe scraps that the
plumbers left under the house so the'll fit into the trash.
Would like to get the compact header integrated into the web app asap, hopefully before I head out to Japan next month. I should also get a new phone at some point, the current one has a crack in the screen making some stuff hard to see around the dead part of the screen. More work on the compact header tonight after dinner. The new rev is here, an second pass at organizing the functions now that I know a bit more of the work involved. To see the javascript take a look at the page source.
Some early talk about what we're going to be doing in Japan. Some simple things at work, just time consuming. Then a faster run than usual, but still not as fast as I'd like.
Some more compct header work putting together the functions in a more organized way.
Working through the weekend, and getting some sleep. Also did some under-the-house crawl space inspection to determine the best approach to do some earthquake retrofitting. Looks like there was some work done in the past, but it's not up to current standards. I'll be ordering some parts and getting to work on that soon.
Moving some code around to make it easier to read and understand. I'll be adding in some more features to the app soon. The work in progress is located here.
After a run and some lifting at the gym, it's time to get some stuff done on the compact header.
Not going to get a lot done tonight, but I've touched on a few things. Going to go through the functions to make them a bit more functional and less specific to the current project. I'll also be adding in some more comments to the code to make it easier to understand. I'll be adding in some more features to the app soon.here.
Getting things done with some copilot and or cursor.ai, so things are actually going by quickly when I'm doing the work.
Continuing the work on the compact header. I've got the tables populated and the functions for encoding and decoding the header are working. The next step is to add the header to the message and send it. I'll be testing this out on the air soon. The work in progress is located here.
Going to start assembling the full compact header now that each section is nearing completion. And recovering from moving a small mountain of dirt to fill the strawberry box.
A weekend in the summer and a lot of time in the garden. Built a new strawberry box with a bird barrier.
A bit more work on the name setup for the compact header. And added a "stop" character to terminate the different sections. Since not all the fields will use the entire field, the stop character will be used to signal the end of the field. The rest of the field is to be filled with 1s as 0s can result in an un-copyable utf-8 character.
After a day of debugging android java and Unity C# getting into javascript was somehow relaxing.
I've been working on the compact header for a while now, but I've just about got it all mapped out. The
different functions for encoding and decoding bits to utf-8 and back again are just about done. The functions
for mapping characters to different table values is also pretty much complete. You can try out the different
systems here.
The tables need to be populated for the conversions for sender ID to work. The tables start off at 1 since
"00000000" as a utf-8 character seems to cause problems. To avoid a null utf-8 character the minimal value for
the first character in the characterMap is "000001" so "AA" doesn't turn into "000000 000000". I'll have to test
this a bit to double check that "00000000" doesn't break the utf-8 characers, but i was having problems with it
before as I could "see" tofu, but I couldn't copy/paste it.
You can try it out for yourself, the section shown will create a tofu which you can copy, but you can't paste anywhere; or maybe you can? I wasn't able to. This is in the "Bits to Utf-8" section of the page. Enter 8 0s and press the "Convert" button to see the result.
Got some spanish foods in downtown today. Played with some AI stuff for fun.
Doing some more work on the compact header tonight to prepare for a 1.0 release. Hoping to get this ready before my trip to Japan in October. Unfortunately, I won't be able to get to Pacificon this year as it'll be happening while I'm in Japan. The bad-decode bug is still around, but I'm hoping to have the AI tools I've been using to help me clean up the code, and possibly find the bug. Till I get around to fixing the decode bug, I'll be figuring out the header format with the AI tools. The work in progress is located here.
Found some great noodles and time to work on the compact header. Listening in on some signals on the 100m band tonight.
Added in some more detail on the time stamp which now stands in it's actual 20 bit form. The timestamps roll over each month, which should be enough to organize a number of messages. Locally, the listener can add additional timestamp information like month and year should the messages need to be archived for longer than the time allowed in the timestamp which the message was sent.
This week has been quite busy, lots of work building an android plugin for Unity by updating and old library to the latest version of the android Sdk. As such, i've been in a different mental mode where building a web app has been a bit too much to handle at the same time. The three day weekend gives me an opportunity to shift back into web app mode.
Getting back into the compact header, i'll give the cursor.ai a try this weekend and see how well it does building the sort of data I'm looking for.
Some more work in the garden and picking up the XYL from the airport. I'll be getting back to work on Code Witches and Ribbit soon.
Work on the compact header continues. I'm purposely avoiding the term "compressed" since the header is not compressed, but rather the bits are used in a more efficient way. The header is a bit long and could be shortened to save some bits using a raw bit stream of a simplified character map. The work in progress is located here.
Happy Friday! A week ends and a weekend "begins?" π€ Time for a bit of yard work to maintain the garden and some code for building the compact header.
One of the main components is the reduced bit table for alphanumeric characters. So with "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-/" we have 37 characters. This can be represented in 6 bits. (Even though 6 bits can be used for 64 values) So the table would look like this:
A | 000000 | B | 000001 | C | 000010 | D | 000011 | E | 000100 | F | 000101 | G | 000110 | H | 000111 | I | 001000 | J | 001001 |
K | 001010 | L | 001011 | M | 001100 | N | 001101 | O | 001110 | P | 001111 | Q | 010000 | R | 010001 | S | 010010 | T | 010011 |
U | 010100 | V | 010101 | W | 010110 | X | 010111 | Y | 011000 | Z | 011001 | 1 | 011010 | 2 | 011011 | 3 | 011100 | 4 | 011101 |
5 | 011110 | 6 | 011111 | 7 | 100000 | 8 | 100001 | 9 | 100010 | 0 | 100011 | - | 100100 | / | 100101 |
Interestingly a lot of the message could also be sent in a similar way, but then alternative characters and emoji would have to be excluded. The work in progress is located here.
App development in Unity is laborous. Dealing with a slow iteration cycle where Unity is pretty much stuck in a "compiling scripts" mode means testing changes takes far longer than I find desirable. This week has been spent watching the progress bar in Unity and waiting. The tedium has had quite an effect on my mental state, so I've been trying to get out and do some running to clear my head. I'm hoping to get some more work done on Code Witches and Ribbit soon.
Tonight to get into something more interactive and I'll update the official repo. Tonight was mostly just
updating the readme.md with something more meaningful and adding in a few screen shots so people know what the
app is supposed to look like. The code is also posted there so folks can see what it's all about.
There's still plenty to get done before the app will see an official release, but the demo code is available to
play with.
So the modified C++ files are included in the webassembly directory. I may need to add some additional attributions, but the link to Ahmet's original code is in the readme. The app is built using emscripten, so the build instructions are pretty simple. I'll be adding in some more detailed instructions on how to build the app soon. I'm hoping to get some feedback on the build instructions so I can make them as simple as possible.
Had enough time to rest and relax after DEFCON. Got some new git related account settings updated and some other stuff. I'll be getting back to work on Code Witches and Ribbit soon.
It's been a week after DEFCON, so it's about time I started updating things again. A new more official github
repo has been created for the ribbit web app, more info on that soon. I'll be spending this week cleaning up the
C++ for the PWA and doing a bit of bug checks, but I'm hoping to have users post to the ribbit repo so the
issues can be tracked. For now a template
is all you'll find there till It's updated. (no really, it's coming soon.)
Once that's checked in, a release in the form of a pre-alpha will be posted with some simple operation
instructions. I'm hoping to see folks fork the project and play with the code as much as possible. I've got
several features that I want to add to the app, but I'm going to hold off on those until the pre-alpha is
released.
The app uses a web assembly binary or wasm
to operate. It's built using emscripten. This builds the C++ into a web assembly object that runs
native code in the browser's sand box. The build instructions for the wasm should be simple, but it's
been a while since I've set up a new dev environment, so I'm hoping to get some user feedback on getting the
instructions for that set up. (if you want to build that on your own.)
The current version is here. The settings page is completely
optional at the moment and there's a message-received bug that seems to persist. After a bad decode, the
following decode seems to succeed but it'll pull a message from before the bad decode. Example "message 1:
abcd", "message 2: (garbage decode)", "message 3: abcd"
From observation, the bad decode seems to have been happening at the show when the radio was interrupted in mid
signal. It's quite likely that a noise cancelation filter was kicking in for a moment after the signal begins. I
can't really change the settings on the radio as it's a simple device made for casual users.
A strategy I was thinking about was adding in a lower more audible tone or hum, around the 200hz in a more human
voice range to fool noise filters. Noise cancelation blocking the ribbit audio signal has also been observed in
zoom calls or google meet calls where auto-magic noise filters block the signal. It's technically noise, so no
surprise there.
A clever option for this would be to make a tone based on the users call sign that sounds a bit like a frog
ribbit. (not actually going to do this, but it would be cute.)
Next steps (in no particular order.):
Running, working on the garden, and some other stuff.
Working on a simple system to convert from an input field that will become a compact form of header that then is converted into utf-8 strings for putting into the header of the ribbit message. A work in progress demo is available.
The interesting thing to observe is that the ko6bva callsign is converted into three tofu, or three unprintable utf8 characters. These should send over HF without any problems.
The weather is quite nice this weekend.
Working on a compact header using bits. None of the features that are being worked on will be integrated into the ribbit app until after DEFCON, otherwise things will be half implemented and broken in the version being presented. At the moment things are working and presentable to the public, the features that are being worked on are more or less under the hood.
Another weekend, and another busy week ahead.
I plan on bringing the icom and the baofeng HT to the RF Village at DEFCON, this should make a pretty simple demo case showing the two devices sending messages to one another. I did some cleanup of the PWA and i'll putting together some test code for building the compact header.
Testing, work, and some other stuff.
Managed to use the little HT Pierre gave me when we met up to send & receive messages from my ic705 on 440. I'll set this to demo at the show, the ic705 was set to 1% and the HT was set to low power since I was just testing around the house. This should make for a fun demo of the app. The app is in a more or less stable condition so i'll leave it as is and put off adding any major features till after the demo. After the show I have an extensive checklist for functions and features to add to the app.
Busy week starting a new project at work.
The PWA still needs some work before pushing to the git page. The root index seems to want to reset to the parent directory, so I'll need to fix that up. I also need to add a service worker to cache the app for offline use. The header structure needs to be compacted, not "compressed" per sey, but the bits need to be used in such a way as to limit the number of bits used to send the header, though I may push that off till after the convention since everything is at least stable and works well for a demo.
Happy 7-11 day, free slurpies. Good thing too as it was over 100f today, so after hitting the gym I stopped by the 711 across the street and picked up a freebie.
Got some audio files "exported" out of the ribbit app converting the buffer into a wav file. Thanks to Experience-Monks for the buffer to wav function. This actually seems like a useful function for ribbit to save data for repeating messages. I'll have to look into this more. There was a request from the ORI slack, so I posted the files there. If there's interest I can post them here as well.
Haven't update things in a while, actually been busy doing generative AI stuff for work. There's also some additional projects that need attion this week, so i'll be getting back to ribbit and code witches soon. Also, it's been quite hot here, so I've been trying to stay cool and hydrated. I'll be getting back to the dev log soon.
Found some time to add a PWA manifest to the app anyway. I'll publish it to the gitpage soon.
Kirk's Steak Burgers, the Rose Garden, and some wandering around. It's been a while since I've touched Code Witches, but I plan on making contacts with the ham radio community and have something fun to show them after getting to know more a bit more about them. Code Witches is a pretty goofy idea, so I'm not sure how it will be received, but I'm going to try to make it as fun as possible. The final goal is to have a ham radio multi player Code Witch battle game where you CW as clearly and quickly as possible to cast spells on your opponent.
Doing some code formatting, font and CSS fixes in Ribbit. Posting updates to the git page. Tomorrow I'll meet up with Pierre and I'll be helping out at a local art gallery.
As a general note, this past winter I had just gotten into web assembly and figuring out how to get function calling between the javascript page and the assembly module. I had a lot of trouble with the emscripten generated glue code, and ended up with the current version that's embedded into the index page of ribbit. Reduced about 1500 lines of js into about 300. I'm trying to keep the entire app in one html page without any dependencies outside of the ribbit.wasm object. So far the only other files are fonts. I'm going to try to keep it that way.
Happy weekend! Going to meet and talk about Ribbit this weekend. Before that I'll have to do some more yard work, clean up some stuff since things are getting a bit disorganized back there.
Some things checked off of the TODO list. First I got the settings saving the name, callsign, GPS, gridsquare,
and phone number. This goes into the localStorage of the browser. Then the messages are saved to the indexedDB,
and when the app reloads the browser will check if there are messages saved and then restore them. There's also
a "clear messages" button in the settings panel.
If there are no settings saved for name/callsign etc, then the app opens the settings page when the app opens.
I also added some colors to the text boxes using the call sign, the first three letters of the call sign are
used to create a hue, then the saturation and value are set such that they don't get too dark as to make black
text hard to read.
Next on the todo list are a couple of buttons on each message to delete a message, block a user, and resend a
message you have sent. Resending a message would help avoid re-typing a bunch of stuff if you're fighting with
QRM or QRN and you have important info you typed in.
I also want to add in the text shuffle function, this converts ABCDEFG into AGBFCED, so first last, second
second to last, etc. This is a simple way to move the text so if only a part of the message gets through the
receiver can still get at least some of the message. I'm not sure what pattern was originally planned for this,
but I'm going to use a simple shuffle for now.
Some interesting notes, windows really loves to add clever "filters" to the sound-out of the computer. The "Spatial" audio feature and some weird loudness filters seem to be making modifications to the audio output, this can often interfere with devices hearing the signal. Likewise, there's also some automagic microphone filtering going on that can mute out some parts of the incoming sound from the app. Likewise, both android and apple also do some extra clever microphone magic to filter out "noises" which is basically the Ribbit signal. There are ways to disable both the output and input filtering, but I had to go and find them and turn them off.
Building a public facing gitpage for some of the projects here so the load on my local server isn't required.
Setting up the github.io page to serve ribbit for defcon. Some bugs to fix in the next few days. First is I'll need to trim off the empty characters off of the end of the message.
\x00
so the unused
characters should be trimmed off of the end of the message and not included when the message is saved.
Busy week, testing on device, having some tx issues on android, for some reason the audio output from the android device seems a bit off from ios and windows. So the windows device seems to get garbage from the android device. I'll have to look into this. I'm also going to try to get some work done on Code Witches this weekend.
Got work done over the past few days on adding settings and code cleanups. Also planning on making a trip to Vegas for DEF-Con 2024. I'm uneasy about bringing a computer, or even a phone to an intensely hacker focused show, but I should make some in-person QSOs for a group of people to test. I should also find a higher bandwidth server that's not my local shoebox server to host. Perhaps there's an ORI directory I can post udates to. I'll have to look into that.
A weekend of building more bird and squirrel barriers, more tacos, and plenty of updates.
Got the Grid Square working, saving the results, populating the settings panel, and adding the header to the message before sending. Ran into some bugs when reading messages but I've more or less cleared everything up.
Going to be a nice weekend, looking forward to more bird barriers, tacos and some work on Ribbit.
Got some work done with the settings panel. Got the browser providing GPS coordinates. Thanks Rich's previous work on Ribbit I'll add in his GS function to populate the GridSquare field.
Barriers are doing their job, the little birds can't get to the leaves of the melons and cucumbers, π.
Doing a bit of work on GPS stuff tonight.
More bird barriers in the garden.
Got a lot of work done on the settings panel.
Added in some message management, and a few other things. The indexedDB now stores messages and restores them when you reload. The local storage of the device saves and restores mode, name, callsign etc. I need to get the GPS/Grid square working next. Then the shuffle and some way to add the callsign-name and number to the encoded message. Things are coming along!
Building some more bird deterrents in the garden. I'm going to try to get some work done on Ribbit and Code Witches this weekend.
Continuing UI work. Adding in the settings panel. Found some interesting tools to use once I get around to more testing. Dropdown menus
for mode selections tend to use select
and option
tags. The resulting dropdown menus
have formatting defined by the OS's browser, and thus are not easily styled. I'm going to try to use a
div
with a ul
and li
tags to create a dropdown menu that can be styled
more easily. Also referring to this
for some better formatting of the dropdown menus.
Tonight I'll be working a local storage to keep track of settings as well as making CSS for the custom selection
menus.
Filling in the lcoal storage with values from the settings panel. Next is a button to get GPS position and fill in the Grid Square. And something to restore message history from the local database. Right now everytime the app reloads the chat panel is blank. To avoid filling up the database with too many messages I should add a button to the settings to clear the database and maybe a default checkbox to save messages.
On a good note, i have the indexedDB working on desktop, but it's not working on mobile. I'll have to figure out why it's not working on mobile. I'm thinking it's a permissions issue. I'll have to check the console on the mobile device to see what's going on. When I restore the messages I compare the message sender to the local username/callsign to determine if it's a received message or a transmitted message. This sets the side of the chat window the title is anchored to. It would also be nice to allow the user to delete a message. I'll have to add a delete button to the message and a confirmation dialog to make sure the user wants to delete the message.
Updates and more updates.
Added a settings panel to the UI. Next i'll get the GPS code to grid square from a different project.
Worked on the garden and some other stuff. I'm going to try to get some work done on Ribbit and Code Witches today.
So once there's a settings page, i should store them somewhere. I'm thinking of using local db for now. Got some work done on the settings panel today. I should have something to show soon.
Build some structures in the garden to keep birds out of the peppers.
Continuing UI work. Adding in the settings panel.
Damn finches ate the leaves off of the peppers. I'm going to have to put up some more severe netting to keep them out.
Ok, reduced the size of the scripts generated by emscripten. The glue that connected the wasm to the web page started off around 1800 lines, and I boiled it down to about 300. A lot of cases were removed that were not needed for the Ribbit's chat mode. If you take a look at the source code in the browser, you'll see that there is no more reference to an external js file and there's just a single script node where the wasm is loaded and the functions are populated.
Ive attempted to trim down the emscripted glue before but gave up since there was so much going on. This time I was able to get it down to a manageable size. I'm going to try to get it even smaller by removing some of the other functions that are not needed for the chat mode.
Busy day writing a ton of js for work, kinda burnt out. Will find some time to work on Ribbit and Code Witches this weekend.
Showed a fun demo in a small Zoom call. Also doing some work on a discord app for a friend.
Continuing UI work. Adding in the settings panel.
File was getting big, so I moved the previous entries to a different page.
Continuing UI work. Adding in the settings panel.