What do people want from the firmware?

No, there is no minimum amount of time. The modifier action triggers as soon as any other key is pressed while the Dual-use one is held. In practice, this still means that you may get the symbol instead of the modifier, if you press it together with any other key in the same scan cycle. Chances for that are pretty slim, though. The timer is there so that it can act as a modifier even if nothing else is pressed, so you can have a Shift/Z key, hold it, and use the mouse with the Shift active.

The other way around is a more likely problem: when you want to act it as a symbol, and not a modifier. It may think that you are holding both keys.

Once we test the library in practice, these timing issues can be tweaked, to further reduce the impact of dual-use, but I didn’t want to over-complicate the code yet, before testing it in practice.

No-no, my thinking was the same! Using letter keys as modifiers if held.

Nope, shouldn’t be any issues.

Still no problem, because the other LControl/symbol would still be held. The way KeyboardioFirmware works, if you release a key, it does not remove it from the report: it doesn’t add it (the report is cleared each scan cycle). So if you hold two LControls, it will update the report twice to include the scancode for that key, but since the report only has one slot for LControl, it will appear there only once. If you release one of these keys, then that won’t try to add it, but the other will. So in the end, LControl will still be held.

Even better, if you have two LControl/ESC keys, where both the modifier and the alternate key are the same, the plugin still behaves correctly: if you hold both, and release one, LControl will still be held. If you hold one, and tap the other, you’ll get LControl + Esc.

Myeah, not the easiest code to read. But thanks for the questions, I will be updating the docs to make these things clearer! Hope my answers cleared things up a bit.


Thanks for the explanations! I want to make it clear that my comment on the code was not meant as criticism; it was more about my inexperience with the firmware in general and my lack of time for careful study.

I suspected things worked basically as you described, with keys not explicitly un-registering when released, but it was worth checking — it easily could have been one of those cases that had gone unconsidered. (I should note that I worked in SQA for a while; thinking up corner cases comes naturally.)

I will definitely give dual-use modifiers a try on the home row (or maybe R1 or R3 instead) when I get the hardware, and see how often I get accidental modifiers while typing. I really like the idea of modifier combinations being so easy to chord (Control+Alt+Shift+Q would be quick and not at all uncomfortable!). That’s the one weakness of having them on the thumb arc — hard to hold down two or three at once.

1 Like

I’m still not clear how the timer works. When I press the Shift/Z key and hold it, what gets registered, if anything, before the timer expires? Does it register Shift immediately, then unregister shift, and register Z when released before the timer expires? Or does it not register anything until either the timer expires (Shift down) or the key is released (Z tapped)?

When you press the key, nothing gets registered. If you keep holding it, without pressing anything, until the timer expires, then Shift registers, and continues to register until you release it.

When you press the key, and you release it without hitting any other key, before the timer expires, you get Z.

When you press the key, and you hit any other key, before the first one is released, then Shift will be registered, along with the other key. And Shift will keep registering until you release the dual-use key.

So its the last one in your list. It also has the downside of not being able to hold the key to have Z repeat. (I could make that work, but then holding it to trigger the modifier effect wouldn’t work, and that one’s more important, in my opinion).

1 Like

Got it. So, regardless of the length of the timer, if I type too fast, and tap the next key before releasing Shift/Z completely, I’ll get the modifier instead. I’m pretty sure I can live with that.

As for the key not repeating, I’m unconcerned. I would want a macro to turn those dual-use keys on and off, but it’s pretty rare that I want a letter key to repeat (I hardly ever want Space and Backspace to repeat, for that matter) unless I’m doing something like playing a game that uses those keys for something else (e.g. WASD) — in which case, I’d probably want some variation of QWERTY mode, anyway.

Thanks again for the explanation. I’m itching to try it out, though it may be a while before I can type fast enough on my novel layout to give it a real-world test!

Yep, correct. Glad I could explain it afterall! :slight_smile:

The functionality is toggleable, and you can write a macro that simply toggles these off. You can even tell it which action should be performed in this case (defaults to the symbol).

Looking forward to hear about your experience! Dual-use keys are something I won’t personally use, so feedback and bug reports from others will be incredibly useful.

1 Like

So, I finally got around to trying out the Arduino software to explore how it works, but the Keyboardio Firmware won’t build. It can’t find header files from Arduino-Boards, and I’m not sure where to link them. I’ve followed the directions from KeyboardioFirmware and Akela, but none of it checks out when I try to “Verify” in the Arduino IDE.

The Akela instructions should work… hm. Can you run Mk/submodule-sync.sh in the Akela dir, and try then?

Oh, and you also need to set the board to Keyboardio in the Arduino IDE. It is set to something else by default.

(I’ll be updating the Akela docs with screenshots this weekend.)

1 Like

Clearly, Arduino familiarity is assumed in the instructions. :wink:

After finding the menu for switching boards, and selecting “Keyboardio Model 01”… it now dies with the error, “keyboardio: Unknown package”. I’m happy to be the guinea pig for the “zero interest in Arduino; just wants a keyboard that does custom things that I want” crowd.

I had similar problems setting up Arduino IDE previously, but that was before the Akela refactor to be a plugin library; I can give it another try tomorrow & see how it goes.

@algernon & @merlin what platforms are you using? I wonder if there are some differences causing issues?

I’m using a Mac right now, but I’ll try it out on my Linux box later, and see what happens.

Interesting; I was having trouble with my Ubuntu desktop, haven’t tried on OS X yet.

I think perhaps it would be best to split this topic up; it’s gone in lots of different directions (largely my fault, I think).

Sure; FWIW, I was able to download the IDE, clone Aklea, and build examples on my Mac.

I can now get most of them to build (or “verify”, anyway – whatever that means). But any of the Akela examples that #include Keyboardio-*.h fail (e.g. Appswitcher & KeyboardioFirmware).


ln -s $(pwd)/lib/KeyboardioFirmware/libraries/* ~/Arduino/libraries/

That should do it. Feel free to open issues against Akela on GitHub, even with questions. That’s even better for me, because I can tag them with a documentation tag, and that’s easier to remember :slight_smile:


I find I’m tremendously excited about this dual-use key concept too, @merlin & @algernon. I’ll try to get up-to-speed as quickly as possible to help with real-world testing.

No Arduino experience here yet, but from the sound of it I’m betting that I’ll be competent enough at least to tweak timers locally to help with feedback.


Opened an issue on github – it seems to be working fine on my Mac, but not on my Linux machine, which is where I’d prefer to do work :stuck_out_tongue:

1 Like

I think this may have been discussed before, but let’s say the non-intrusive OS sniffer/guesser guesses wrongly, will it be possible to switch layouts via the magic combo framework or some other means? I use both macOS and Linux and would like to maintain a consistent experience across the two operating systems. E.g. being able to swap command and control on the fly somehow would be useful.

I’m sure this has been addressed, I just want to make sure it doesn’t slip through the cracks.

It all depends on how you set your firmware up. It is certainly possible to have a magic combo that will override the sniffer. I’ll make an example, to make things easier!

1 Like