Driver for Spektrum (tm) serial receiver, for radio controlled helicopters etc.

main.cpp

Committer:
offroad
Date:
2011-10-25
Revision:
1:7b595c4ff156

File content as of revision 1:7b595c4ff156:

/* Example for Spektrum serial receiver driver
 * M. Nentwig, 2011 
 * This program is provided "as is", without any express or implied warranty.  */

#include "mbed.h"
#include "spektRx.h"

/* Serial input
 * Connections:
 * - orange wire to 3.3V regulated out
 * - black wire to GND
 * - grey wire to pin 10 (for example)
 * - see also http://diydrones.ning.com/profiles/blog/show?id=705844%3ABlogPost%3A64228 */
Serial serIn(p9, p10);

PwmOut l1(LED1);
PwmOut l2(LED2);
PwmOut l3(LED3);
PwmOut l4(LED4);

int main(void){
    serIn.baud(115200);

    /* Create parser "object" */
    spektRx_t p;
    spektRx_init(&p);

    while(1) {

        /* Process input data from interface, non-blocking */
        spektRx_runSerial(&p, &serIn);

        /* check if (new) frame has been received */
        if (spektRx_hasValidFrame(&p)){
            
            /* Dump every 10th received frame */
            long fn = spektRx_getFrameNum(&p);
            if (fn % 10 == 0){
                /* Get all channels in bit-accurate form */
                unsigned short* d = spektRx_getChannelData(&p);

                printf("%08li\t", fn);
                printf("ail = %04x\t", (int)d[0]);
                printf("pit = %04x\t", (int)d[1]);
                printf("ele = %04x\t", (int)d[2]);
                printf("rud = %04x\t", (int)d[3]);
                printf("thr = %04x\t", (int)d[4]);
                printf("gear = %04x\t", (int)d[5]);
                printf("aux2 = %04x\t", (int)d[6]);
                printf("\n");
            } /* every 10th frame */ 

            /* Get float values and use to dim the LEDs 
            * The returned range is (-1 .. 1) if the radio has been set up carefully (endpoints / subtrims) */
            /* if this is the case, use f=1 */
            double f = 1.2; /* stretch the range a bit, so that we reach 0/100 % PWM */
            l1 = spektRx_getChannelValue(&p, 0) * 0.5 * f + 0.5;
            l2 = spektRx_getChannelValue(&p, 1) * 0.5 * f + 0.5;
            l3 = spektRx_getChannelValue(&p, 2) * 0.5 * f + 0.5;
            l4 = spektRx_getChannelValue(&p, 3) * 0.5 * f + 0.5;

            /* Finished with the current frame. spectRx_hasValidFrame will return false
             * until the next frame has been received completely. 
             * Notes: 
             * - It is safe to repeatedly read the same frame.
             * - It is safe to read frame n, while frame n-1 has been partly received (driver uses double buffers)
             */
            spektRx_invalidateFrame(&p);
        }
    }
}