STAR Firmware by JonnyC - Source Code and Explanation

@vex_zg

That’s a really nice adaptation.
I just looked into it and I think I saw what you did.
I perfectly understand that you alter and hardcode the stuff, it’s so much easier if you program it anyway.
A tidy version would certainly help, if you find the time. But you already were extremely helpful.
So thx again.

EDIT: Your code went blue :bigsmile:

Thanks vex!
I will definitely try your code…

A lot of interest from my side. :slight_smile:

ok, I’ll make the tidy version during the weekend (if wife allows :slight_smile: )

Ok, I'm looking for some help in creating a perfect MTB cycling headlight firmware. I'm already working with another BLF user who will be doing the mod. Now I'm not a code writer/programmer so I haven't been following the various firmwares that closely, so please direct me if there is some other firmware better suited. If I should post this in a new thread let me know, but it seems there have been numerous offshoots from JonnyC's STAR firmware posted in this thread already. Because I'm not a programmer, let me know if my requests are not feasible.

What I would like is firmware that allows a MTB'r to increase brightness with a quick-click and decrease brightness with a slightly longer click. I would like to keep the "user configurable modes" and "Turbo with stepdown" and such that are standard in STAR. I want "Off" out of the mode cycle requiring a long-press to access which means a MTB'r never turns his light off on accident. Strobe should be accessed via a long-press from "Off" only (not accessible from any other mode). I would say strobe should be set to 50% brightness and be a medium speed (not too slow and not to fast). So standard modes would be "Low-Med-High-Turbo-(repeat)-Low-Med-High. . ." It would be an additional benefit to have low-voltage monitoring with stepdown for a 2S (8.4v) battery pack (ideally for both 1S and 2S I guess, as some lights do run on 4.2v). I'd also want mode memory (really doesn't bother me if it's "on-time" or "off-time" memory).

So is this feasible? Does it already exist? Anyone willing to modify existing firmware to handle this for me?

Thanks!
-Garry

Wrote this over the last couple nights. It’s something I’ve wanted in a light but never could do until now. I’ll probably be putting this firmware into all of my lights and adapting it out as needed. I found through testing handheld flashlights, the strobe and beacon is rarely used- I’m not a biker. But picking modes for my lights wasn’t fun either.

I wanted a ramp as the base with a hidden mode that handles strobe. I also wanted full time voltage monitoring and low moon when the tail switch is on.

So after some late night programming I came up with this… It’s a smooth ramp up and down. It starts off in very low moon using fast pwm and the pwm 0 bug on a BLFDD driver. Looks pretty cool with a dedomed emitter like a white painted square.

Voltage monitoring is enabled through the watchdog interrupt anytime the tail is on. It’ll ramp down the light at low volts, and back to moon. This allows you to see the tail is on at any time too and gives you the heads up, time to charge!

Hold (eswitch) from off, and it ramps up all the way to 100%. An indication flicker was put in when you hit the top. On switch release and hold, the ramp goes opposite. You can get any light level you want. From off, you can single click to high and it will start the ramp backwards too. You can stop the ramp anywhere and go back and forth. Fast click turns it off.

The hidden mode strobe and beacon are done from off, double click. Any single click from that point alternates between the strobe and beacon. So let’s for example say you get jumped from behind like your in detroit or something. Ok your a gonner in that situation… lol

Ah I needed to stick something like that in here… jus cause

Anyways :stuck_out_tongue: Double click to enter the hidden modes and if you hold the switch, it will flash once and you’ll be back to moon (off).

-If anyone could host this so others can play with it. I think this useful code for the community.

Hosted it
https://github.com/fellfromtree/Yezl-Y3-Drivers

(Problem posting in this thread I guess) Are you proposing this for me? Because it does seem that I could use this. It's a quick click to off instead of long press like I proposed. I never considered a ramping firmware. Not sure how feasible it is on a bike light though. Probably prefer quick taps to change modes rather than holding until you get to what you want. Can the low voltage monitoring be set for 2 cells in series?

-Garry

No it won’t with series. It’s a personal project of mine- but you can increase the ramp speed if you need to…

edit Actually what you need is Toymakers brass-edc.c it’s written for her bikes

Ok, link to a description of that firmware?

Thanks,

-Garry

http://bazaar.launchpad.net/~toykeeper/flashlight-firmware/trunk/files/head:/ToyKeeper/s7/

Try that one… Might be what your looking for

Nah, sorry not for me.

-Garry

What hardware are you using? Does it have an e-switch, a clicky switch, or both? What kind of driver is in it?

Could you be a bit more specific about the interface? Specifically, in any given state, which actions cause which state changes? For example,

While off:

  • Short click goes to (lowest/highest/memorized/other) mode.
  • Long click goes to (… strobe?) mode.
  • Double click goes to (whatever) mode.

While on:

  • Short click increases brightness. (loop from max to min)
  • Long click decreases brightness. (loop from min to max)

How do you turn the thing off?

I’m not aware of any firmwares which handle voltage monitoring properly on more than one cell in series. They generally need a zener mod, and that tends to interfere with voltage detection. I don’t have any hardware like that, so I don’t actually have a way to test it.

As far as the UI goes (if I understand it), the closest firmwares I’m aware of are two that I made for the Ferrero Rocher driver in a Roche F6. One is very close to STAR-momentary, with some additions:

While off:

  • Short click to go to lowest level.
  • Long click to go to highest level.
  • Short-then-long to enter battery check mode.

While on:

  • Short click to increase brightness. At highest mode, this turns the light off.
  • Long press to decrease brightness. Hold until desired level is reached, then release. Stops at “off” if you hold long enough.

The other is based on the Olight Baton UI:

While off:

  • Short click to go to memorized level.
  • Long press to go to moon.
  • Longer press to enter (or exit) soft-lockout mode. When unlocking, it’ll enter the last memorized mode.
  • Double click to go to turbo.

While on:

  • Short click to turn off.
  • Long press to increase brightness. Hold until desired level is reached, then release. Loops from “turbo” to “low”, skipping “moon”.
  • Double-click to enter strobe (or beacon) (not yet implemented).

There are other firmwares I haven’t tried though. I try to get everything into my firmware repository, but there are a bunch I haven’t added yet or haven’t gotten permission to add.

Ah she got you garry… :slight_smile:

Meh… wrong name. Kind of a pet peeve.

I doubt my “s7” or “brass-edc” would work for this. I like it, but not many people like party strobes as much as I do. Also, it’s designed for reverse-clicky lights with stock drivers so it can’t distinguish long or short presses at all. The UI is totally different than what was requested.

I do use it as a handlebar light, but it’s not primarily intended for that. In that role, I generally put it on “high” mode (~175 lm) or the med-turbo flasher (~50lm with a ~400lm stutter every second or so). Depends on whether I want to see better or be seen better.

lol Hey he asked I just delivered!

fellfromtypo that’s perfect name for me :bigsmile: Wait is that supposed to be insulting? :slight_smile:

Changing the curve shape isn’t that hard. I made one with a logarithmic ramp with extra-smooth transitions between the lowest levels, because I prefer to have more of the ramp space dedicated to the lower end. Comfychair changed it to a quadratic ramp, which is closer to visually-linear. I’ve been meaning to do a cubic ramp (should be exactly visually linear) but keep procrastinating about it.

If you want to try it, it’s in the Ferrero Rocher directory in my code repo.

BTW, why did you make your firmware incapable of shutting off? Is it for dual-switch lights?

Just thought I should mention it. Using the wrong name bothers some people, even if it’s not intended to be disrespectful.

The hardware is a stock UniqueFire HD-016 bike light (possibly other stock bike lights too). The MCU would be swapped out with a flashed Attiny13a (as seen in ImA4Wheeler's SolarStorm X2 mod thread). All these bike lights use an e-switch (I do believe that is correct). All run 2S2P battery packs (though the HD-016 will also run on 4.2v).

Functions / modes I'd like to see:

From Off:

*short-press turns on in "Low" mode, additional short presses continue advancing to Med, High, & Turbo regardless of how long a mode has been in use. A short press from "Turbo" returns back to "low to start thru the cycle again.

*medium-press turns on in "Turbo" mode with additional medium presses advancing backwards in mode order (high, med, low) regardless of how long a mode has been in use. A medium press from "low" returns back to "turbo" to cycle back thru again.

*long-press (guessing about 3 seconds) activates Strobe. Long press from "strobe" turns "off". Short-press from "strobe" could either do nothing, be a beacon mode, or return the light to the standard "L-M-H-T" mode sequence.

From On:

*short presses advance modes increasing from L-M-H-T, repeat.

*medium-presses go backwards in mode order (T-H-M-L, repeat).

*long-press (again, guessing 3 seconds) turns the light off.

Additional Features:

*Turbo step down to "high" after 90 seconds.

*Low voltage detection / warning - something like dropping down one mode and flashing. (If this is feasible with the 8.4v pack.)

*thermal step down would be awesome, but I don't expect it.

Note: user should never activate "off" unless done on purpose.

Any other questions?

Thanks,

-Garry

Er, on a side note… I just updated the Ferrero Rocher ramping UI.

http://bazaar.launchpad.net/~toykeeper/flashlight-firmware/trunk/files/head:/ToyKeeper/Ferrero_Rocher/

Details are here, but if anyone has a non-default page size the link won’t work:

The short version is I caught up on a few TODO items, added support for fast PWM, made PFM easy to turn off, added some precalculated ramps, and made the default build go extremely low on moon mode. On a full high-amp cell, the lowest mode dropped from ~3.6 lumens to ~0.1 lumens on my triple-219B with a Ferrero Rocher DD driver.

So, on my hardware at least, it goes from 0.1 lumens up to 1800 lumens on a full cell. When the battery charge drops though, the output drops to like 0.000001 lumens and 1200. That extra-low moon may as well be off unless the battery is close to full. At less than full voltage, it can’t get the emitters to light up with such short pulses — they’re like one ten-millionth of a second long!

Nope, that makes sense.

Most of that would be fairly small mods to the STAR-momentary code, but it could get a little hairy trying to make it tell the difference between medium and long presses, and it has no strobe. It may require some pretty significant changes to make it do both medium and long presses, and I’m undecided how best to add blinky modes.

Timed turbo step-down is already implemented. Low-voltage detection is probably possible, but might be tricky and would require getting a copy of the hardware to whoever writes the code. Thermal step down isn’t possible without extra hardware.

I like the whole idea behind ramping :slight_smile:

The button delays take awhile to get it all meshed right Garry… It’s not a lot of code you can stuff in there so your pulling out all the tricks to get to your goal.

But to answer your question Toy it’s for my Y3 (tail and eswitch). I’m trying to find quiet momentary button switches, but no luck so made my own.

Took sleep out to keep voltage monitoring on. While I was at it, might as well exploit the PWM 0 low moon as light ring refresher. It’s really nice if you give it a try. I throw together another board and try your ramps out.

Well forget that idea… Your code is for rgb and not the tiny13a :slight_smile: I deal with ghetto stuff

Played with the ramp I made last night… It’s about perfect imo- starting low to high or high to low, you don’t really need to worry about the in between.