The bootloader software allows you to easily control the ACRIS bootloader. This page describes how to use it and what it's sending to the bootloader over serial.
You can find the software in ACRIS's repository. bootloader.py is the application you run, bootlib.py does all the serial work behind the scenese (so you can write your own shinier bootloader controller easily). You need PySerial.
If you want to modify the bootloader I designed, you'll find the code in /avr/bootloader. The README there describes the bootloader's technical operation in detail.
When the lighting controller starts up, it runs the bootloader, which waits for half a second. If it doesn't see the character 'N' on the line by half a second later, it will start running the main application (the lighting controller). So, the first thing that you'll want to do before you start up your lights is to run
which will just send a string of 'N's repeatedly until you hit CTRL-C (or CTRL-Break on Windows, I think).
If the bootloader is running, you will see the outer two debug LEDs on the boards lit. Now you can perform any of the other commands in bootloader.py. Just do./bootloader.py -h
to find out which options are available.
One of the coolest things about this bootloader is that you can use it to program lots of devices at once. In ACRIS, every device must have an address. That way, when you send a command out to the network and you want to target a specific light, the devices will know which one you are talking about. The default address is 0, but you'll want to change the address for each light as you add more devices.
Let's say you have a network of 10 devices already set up and you want to reprogram them all with new firmware. All you have to do is start the bootloader and run the reprogram command of bootloader.py. Now, let's say you only want to reprogram device 3. What you can do is use the mask feature. You first run a command saying "in the future, only process commands if you are address X" and then you run the commands you want. So, you can do
./bootloader -m 3
./bootloader -r program.hex
Or, to make things even easier, bootloader.py can understand both those commands at once:
./bootloader -m 3 -r program.hex
Pretty cool, huh?
I was really excited when I actually got this to work... there's very limited documentation on the web about getting bootloaders to work right.