Making level easy to use

A project log for level: A New Kind of Radio Module

An agile radio designed for low power and narrow bandwidths over a wide frequency range.

Hunter ScottHunter Scott 09/21/2014 at 04:170 Comments

Usability is a big part of engineering design. I want new users to be able to start playing with level as quickly as possible. The first way I'm accomplishing that is by enabling the use of Arduino shield libraries with level. As you know, level is not an Arduino shield, but it accepts shields in order to create bridges between whatever wireless experiments you're doing with level and a common standard like Bluetooth or WiFi or whatever other kind of interface you want. The libraries for these shields already exist, so this is a great way to leverage other work and not have to reinvent the wheel. I'm still developing this feature, but the end result will hopefully make it much easier for people to create new thing with level.

The second way I'm making things easier is by implementing an API/HAL for high level functionality. This way, you won't have to worry about setting a bunch of registers and bitmasks. Here's the functionality I have sketched out so far:

set_datarate(float) - Sets the datarate of the CC430. Returns 1 if the datarate is outside of what the CC430 can provide. 

set_frequency(float) - Sets the transmit and receive frequency. Returns 1 if the frequency is out of bounds. Functionally, this programs the VCO. It may be possible to have separate transmit and receive frequencies, but I'm not sure how long the PLLs take to settle, so for now the HAL will only support a single transmit and receive frequency.

set_power(int) - Sets the transmit power. Returns 1 if out of bounds.

set_mode(string) - Takes in either "tx" or "rx" and puts the device into either transmit or receive mode. Returns 1 if not "tx" or "rx". Functionally, this controls the RF switches.

get_status(void) - Returns a struct of various status information. 

get_device_id(void) - Returns device ID. Useful for simple testing.

set_message(char *buf, int length) - Takes in a pointer to a byte array and a length. The buffer is loaded into a FIFO for transmitting. If the buffer is larger than the FIFO, the FIFO is filled and transmitting automatically starts. This process repeats until the FIFO is loaded with the last chunk of data.

transmit_now(void) - This should always be called immediately after set_message(). This will force the transmit FIFO to empty by transmitting, which will send any fractional buffers still in the FIFO that did not fill it completely. 

get_message() - Returns a pointer to a byte array that is the size of the receive FIFO. This array contains demodulated data from the CC430. It's up to the user to loop on this function until the end of message identifier is hit.

set_modulation(string) - Takes in "FSK", "GFSK", "MSK", "OOK", or "ASK". Sets the modulation used by the CC430.

This is all subject to change of course, but it's what I'm working on implementing now. This will first be implemented in C for use in programming the CC430 itself. I'd also like to implement a version of this for use over the SPI bus, so level can be commanded from another device.