Hi, multi-channel Emisar D2 user here, Model number 0135, emisar-2ch, using ToyKeeper's latest Anduril 2 version, anduril.2023-08-07.emisar-2ch.hex: At my end, momentary turbo 3H/4H works just fine and as expected, so I do not have the same behavior.
4H from ON for momentary turbo works with every channel mode, whether there is tint ramping or not, and 3H from ON for momentary turbo works when there is no tint ramping with the selected channel mode; all exactly as displayed in the diagram.
Speaking of testing locally - how do folks test code changes? Actually flash them to driver, or is there some kind of way of simulating the inputs and outputs? I’m guessing there isn’t an Anduril emulator.
Yes, you could (theoretically) use an emulator for the microcontroller. I tried it a few times. And it isn't fun. It takes a lot of effort to simulate all inputs, outputs are hard to interpret and all kind of effects of the real light aren't reproduced.
In reality we flash the build onto a flashlight and try it. Sometimes it's only a prototype, disassembled. And rarely it's an actual devboard which has all relevant parts of the flashlight nicely accessible (basically the microcontroller with required electronics, regulated power supply, low power LED to see the output, several LEDs for aux and button and the switch itself).
That makes sense that it’s easier to flash directly since there are so many different parts and variations to the actual destination hardware.
I read that one of Toykeeper’s original design decisions was to separate out the generic UI code from the specific code that interfaces with the hardware (being vague due to lack of knowledge). Maybe it would be possible to incorporate some testing code that only evaluates the user inputs compared to expected outputs within the Anduril layer? Such as a single state transition like “when multi-channel is enabled and user selects 4H, selected output level is equal to turbo”. Such a test could be indicate unexpected behavior when UI code is being customized.
I don’t own a multi-channel, but I did see something that looks interesting in the code (not familiar with the codebase and haven’t worked with C much):
Could be a red herring but the function channel_has_args looks kind of like it might be doing the same work as if(!arg) for single-channel. Again this could be totally wrong but IF that were the case, then I’d expect that adding to the if statement could potentially help catch this? Like
if (! arg) || (! channel_has_args(cfg.channel_mode) .
Also in following the code style the actual statement would also need to include an IFDEF for multi-channel-config but maybe not necessary for you test locally?