Overview
The MSB2 and LSB both use the same firmware core with custom modifications to support the sensors and other subsystems specific to each platform. The goals of the firmware are:
- Encapsulate all low level functions in easily accessible commands
- Hides all startup/initialization routines
- Provide a variable sampling schedule (with some constraints) that automatically handles powering off unused sensors
- Provide commands for accessing calibration and other sensor metadata
- Sample and send data via a hi-speed binary uart interface
- Communicates with any embedded platform
- Communicates with any desktop/laptop/handheld/cell phone with a available uart port
State Diagram
The system has two main states, the default wait state and the running state. The other states are used for setting up various components of the system. Once everything is working; however, the user simply enters the running state and begins recording data. In addition to the command states shown here available here several other commands are available (depending upon the hardware) which can be used to manipulate various parts of the system.
System state diagram for communicating with the MSB firmware, the power point version is available
here
Communication protocol
Communication with the MSB Firmware takes place over the first uart on the ATmega, at 921,600 baud, with an option of having flow control. You must only send one byte per timer interrupt! For example, if your INTERRUPT_COUNT is set to 5120 (512 Hz), you must wait at least 1/512th of a second between bytes.
Commands
Commands are six-character sequences where '!' (hex 0x21) indicates the start of a command. The parser is reset by a '!', so if you make a mistake when sending a command, simply resend the command starting with a '!'. Some commands include their arguments as part of their five command bytes.
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5
|
'!' |
0x21 |
Command
|
Note: '!' is a reserved character and may not be used as an argument for any command that includes its arguments in the command bytes.
LED Commands
LED commands are special one-byte commands that turns the LEDs on and off. Two LED command formats exist: one to adjust the individual LEDs, and one to adjust both the individual LEDs and the tri-color LED. In both formats, a 0 bit for an LED turns it on, and a 1 bit turns it off.
Individual LED command format
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0
|
0 |
0 |
0 |
0 |
Red |
Green |
Blue |
1
|
Individual and Tricolor LED command format
Bit 7 |
Bit 6 |
Bit 5 |
Bit 4 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0
|
1 |
Tri-color Blue |
Tri-color Green |
Tri-color Red |
Red |
Green |
Blue |
1
|
Packet format (from the MSB Firmware)
All MSB firmware responses will be sent back as packets that begin with 2 characters '#' followed by '|', then an identifier byte describing what the packet is and how it should be interpreted.
Byte 0 |
Byte 1 |
Byte 3
|
'#' |
0x23 |
'|' |
0x7C |
ID
|
Example Communication Sequence
Here's an example of what a host computer would send to query the state of the LED and what it would receive from the MSB:
Host sends: '!query' + 0x10 [query command + 0x10 to indicate a LED query]
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5 |
Byte 6
|
'!' |
0x21 |
'q' |
0x71 |
'u' |
0x75 |
'e' |
0x65 |
'r' |
0x72 |
'y' |
0x79 |
|
0x10
|
MSB Firmware responds with: ['#|' start header + 0x10 to indicate a LED packet and 0x00 the current state of the LEDs
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3
|
'#' |
0x23 |
'|' |
0x7C |
|
0x10 |
0 |
0x00
|
Available Commands
Start Command
This command begins sampling of the sensors and outputting the readings. May only be executed in the WAIT state.
Host sends: '!start'
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5
|
'!' |
0x21 |
's' |
0x73 |
't' |
0x74 |
'a' |
0x61 |
'r' |
0x72 |
't' |
0x74
|
Cease Command
This command stops sampling of the sensors. May only be executed in the RUNNING state.
Host sends: '!cease'
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5
|
'!' |
0x21 |
'c' |
0x63 |
'e' |
0x65 |
'a' |
0x61 |
's' |
0x73 |
'e' |
0x65
|
Reset Command
This command reinitializes the sensor board. May only be executed in the WAIT state.
Host sends: '!cease'
Byte 0 |
Byte 1 |
Byte 2 |
Byte 3 |
Byte 4 |
Byte 5
|
'!' |
0x21 |
'r' |
0x72 |
'e' |
0x65 |
's' |
0x73 |
'e' |
0x65 |
't' |
0x74
|
Data Format
Microphone Data Packet