STAR Firmware by JonnyC - Source Code and Explanation

I’ve been playing around a lot lately with optimizing for size and have managed to do a slimed down version of STAR 1.1. Mine basically does everything that STAR 1.1 does except check for soldered stars. I removed all those checks and did those selections by using a bunch of #IFDEF and #ELSE sequences. I saved quite a few bytes doing this. Personally I have no use for soldering stars, if I want to change the things the stars changed I’ll just flash a driver with the changes.

I also made a new delay loop by stealing a small section of code from delay_basic.h. My time resolution is not good (77ms) but for my purposes I can get the delays I want, I don’t need pin point accuracy.

Then I edited the voltage monitoring sequence quite a lot, removed a bunch of while loops and delay loops, and saved a total 278 bytes on the original STAR 1.1… That leaves me with plenty of room for playing around :slight_smile:

I’m no programmer though. I’ve tested the functionality with the help of a variable DC power supply, seems to be running fine but I guess I’ll see once it’s been built into a light.

Sounds like good work so far. Will you post your current code? If you don’t have hosting you can use (or any similar service) to share it with us.

Care to share your code?

Beautiful thing is…if you can trim in down with code tweaks, more functionality can be added on the back end
Maybe even put in hidden flashies or whatever

I made it easy on myself and uploaded it to my website, download it here:

This current version is not as optimized as before as I have re-written a lot of it to make it easier for me to understand exactly what’s going on.

A few differences from STAR 1.1:
No stars, all is defined with #DEFINE and #IFDEF statements
Low voltage warning switches to next lower mode for about half sec, goes back up to current mode for half sec, then changes mode back to the next lower mode and stores it.
If already in lowest mode when low voltage (but not critical) is reached, nothing happens. I might do a one time blink just to let the user know if I have room for it later.
Critical voltage blinks between lowest mode and off 5 times before shutting down.
Re-wrote a bunch of stuff just to make it easier for me to understand what was going on and stripped out some stuff. For example my voltage monitoring routine doesn’t use any while loops.
The only delay-loops I use are for low and critical voltage routines. I got rid of STAR 1.1 _delay_ms at end of main loop. It looks like it actually prevents sleep mode between WDT interrupts as interrupts are about 0.5 seconds, but I never tested that. My low voltage routine skims through and goes into sleep mode between WDT interrupts expect during warning routines.
Re-organized a lot of comments and wrote plenty of my own.
My delayms() function uses assembler code from delay_basic.h. I have no idea what the assembler code does! I can loop it for desired delay times, that’s enough for me. I wrote a version of my delayms() that could take a millisecond value and accurately delay accordingly, but it cost more bytes. As I only use it for warning blinks I don’t need millisecond accuracy, free bytes are more valuable.
This version is 140 bytes smaller than STAR. Besides the way my warnings alert, the user should not notice any difference.

I use AVR Studio 5.1.208 it if matters.

I haven’t put it in a light yet, only run it in connected to a variable DC and LED, and switching modes with this DC has been a little bit of a pain. I’m no programmer, and know even less about programming chips. Anyone find any particular flaws, I am all ears! I’ve probably done a few things really stupid in there somewhere…

I would like to collect the various flashlight firmwares and publish them in one place. This has no copyright or license assigned though, so it falls under the default terms: “Copyright © 2014 Mike C, All Rights Reserved.”

If the original STAR firmware didn’t specify any terms, it would have the same defaults, only with a different owner, which would make this derivative technically illegal. Not that anyone around here cares, but I try to make sure I avoid legal issues when possible.

Would it be okay to add an explicit copyright and license? I was thinking probably the GPL, the most popular free software license. It basically says anyone can do anything they want with the code, so long as they release code for any derivatives they make (also under the GPL), and don’t add external restrictions through patents. Basically, “I made this free-as-in-speech, and if you change it you must also make your version free-as-in-speech.” It does not prohibit selling the code or any products based on it.

Then I’ll be able to publish it along with other firmware, and anyone will be explicitly free to modify or use it.


I’m not terribly picky about the license used, but I was figuring the current version of the GPL by default, unless there was reason to use something else. Depending on details, it might be more appropriate to go with an older GPL or LGPL or AGPL, or a BSD license, or Apache license, or … etc.

I’m open to suggestions, if the default isn’t agreeable.

Otherwise, I figured I’d probably host sources and binaries on, with release files available to deliver builds to people who don’t want to use a DVCS to access the files. Github would work too, though I’m not as familiar with it and it isn’t quite as full-featured. However, git is quite a bit more popular so it might be a good choice even though I don’t like it as much. I could go for either one.

This explains some differences between the two DVCS tools involved:

Their associated project management sites are far more different though, and it would take a much more in-depth article to compare them.

I think GPL v2 is the more widely accepted license. GPL v3 is the political/controversial one IIRC. I’m not sure that there is anything wrong w/ v2.

If we were voting (which clearly wouldn’t make a difference since it’s the original author(s)’s call) I’d suggest considering a more permissive license. Copyleft licences such as GPL are useful for encouraging folks to share their changes, but sometimes that turns into squabbles which don’t do anyone any good. Mud slinging & etc.

There is a lot of code which was licensed under “v2” instead of “v2 or later”, with copyrights owned by lots of different people (some of which aren’t alive any more), which means the project is stuck with that license forever. People can avoid the version lock-in with the “or later” clause, or avoid all re-licensing issues by assigning all copyrights to a trusted third party such as the FSF (and requiring contributors to do the same).

Otherwise, it’s a question of what people consider to be most free (is it okay to take without giving back?) and what kinds of legal trickery they want to protect against — for example, should we allow “tivo-ization”, which prevents users from running modified code? Like, if Blackshadow were to start using a version of the STAR firmware on their products, would it be okay for them to also make it refuse to run user-flashed firmware?

I don’t mind if different people decide on different licenses for their code; I’m mostly hoping that they’ll all allow republishing and derived works, so that we can all join in the fun. And if someone wants to share but doesn’t want to have to care about all the licensing details, I think GPL v2 with “or later” clause is a good default.

I don’t understand why anyone would want to use the “or later” part. I have only the most basic layman’s understanding of the reason people dislike v3. My understanding is that RMS added an anti-DRM skew. That is the only reason I’m aware of to avoid v3.

If anyone decided to license under v2 at this point in time I can only assume it would be specifically because they did not want v3. It seems that licensing under “v2 or later” would be opening the door to getting relicensed under v3 as others contribute.

Can you help me understand?

The “or later” clause means it’s legally compatible with both v2 and v3, and can be linked with source code from either version. The reason to include the “or later” clause is to maximize compatibility (and minimize drama) when you don’t specifically need the extra stuff in v3. It also helps that v3 is compatible with more non-GPL licenses, so the “or later” means it can be linked with Apache-licensed software too (for example).

Ah, shows what I know. I didn’t realize, or forgot (same thing), that just using / linking against a library required that you be licensed under GPL. Looking at the GNU licenses FAQ I see that now.

intellectual license and giving credit where credit is due, more or less leaving the writers name in the original source code is good enough for me

open source, community development copyleft

I’ve updated the zip file in the link ( ) with a new C file that includes the same “Free to use, modify, and share for private use” as STAR v1.1. Is that OK? Otherwise feel free to write what I need to add to make it free for anyone to do as they please with it for private use and I’ll update the file on the link.

Any comments on what I’ve done with it? Any obvious blunders?

Also, does anyone know how to change the WDT interrupt time? It’s about 0.5 seconds default. I can’t see any obvious way of adjusting it. Not that it’s really needed but I would very much like to know how.

Works for me. On my site I say "use these programs however you wish".

Look at..

WDTCR = (1<<WDTIE) | (1<<WDP2) | (1<<WDP0); // Enable interrupt every 500ms

Download the datasheet for the Attiny13A from Atmel and just search for WDTCR and you'll see the different timing options.

Thanks, I’ll look into it.

Nice firmware, thanks for sharing it.
Just had a short look into the momentary firmware and found something which might be useful.
You only enter sleep mode if the light is switched off, I always try to use a sleepmode also in the other modes especially in the moonlight mode because if you use only some mA another some mA consumed by the controller arent perfect.

This could probably easy be added with a else in the main loop. This is what I use to make sure the idle mode is the standard.

In luxdrv it shows

#define SLEEP asm volatile (“SLEEP”)

Then where you want SLEEP you just add SLEEP;

I believe…I really don’t know anything about C

I like to write it like in the link, I set the sleep mode and then start the sleep mode. Its easy to read and i know which mode i used.
The controllers have different sleepmodes with different pro and contras so this is a specific ucontroller thing.
If that is wrong please correct me.

You are the coding master…always best to pay attention to those who know better :wink: