silver kuusik / Mbed 2 deprecated Protocol

Dependencies:   mbed

main.cpp

Committer:
silbo
Date:
2011-03-30
Revision:
0:3cbe4eec57ae
Child:
1:6e34363efa95

File content as of revision 0:3cbe4eec57ae:

#include "mbed.h"

DigitalOut motor1A(p9);
DigitalOut motor1B(p10);
DigitalOut motor2A(p11);
DigitalOut motor2B(p12);
DigitalOut motor3A(p13);
DigitalOut motor3B(p14);
DigitalOut motor4A(p15);
DigitalOut motor4B(p16);

DigitalOut digital1(p17);
DigitalOut digital2(p18);
DigitalOut digital3(p19);
DigitalOut digital4(p20);

SPI spi(p5, p6, p7); // mosi(out), miso(in), sclk(clock)
DigitalOut cs(p8); // cs(select)

PwmOut motor1(p21);
PwmOut motor2(p22);
PwmOut motor3(p23);
PwmOut motor4(p24);

DigitalOut led(LED4);

Serial pc(USBTX, USBRX);

uint8_t* values;
uint8_t* location;

char buffer[3];
int i, inValue, bufferIndex;

// maps the value x to a new given range
double map( double x, double in_min, double in_max, double out_min, double out_max ) {
    return ( x - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min;
}

// shifts 2 8 bit integers into one integer
int getIntValue( uint8_t high, uint8_t low ) {
    return ( high << 8 ) | low;
}

// sets the given pwm value
void setPWM( int value, PwmOut pwm, DigitalOut a, DigitalOut b ) {
    // block the motors
    if ( value > 511 ) {
        a = 0;
        b = 0;
        pwm = 1;
    } else {
        // clockwise run
        if ( value > 255 ) {
            value = value - 256;
            a = 0;
            b = 1;
        } else {
            a = 1;
            b = 0;
        }
        // map the 0-255 value to 0-1
        pwm = map( value, 0, 255, 0, 1 );
    }
}

// specifies the action for the user input
void specifyAction( char action, int value ) {
    // specify the action
    switch ( action ) {
        case 44:
            // print the analogs and digitals
            values = location;
            for ( int i=0; i<16; i++ ) {
                pc.putc( *( values++ ) );
            }
            
            pc.putc( '\0' );
            pc.putc( 13 );
            break;
        case 162:
            // set the first PWMs value
            setPWM( value, motor1, motor1A, motor1B );
            break;
        case 163:
            // set the second PWMs value
            setPWM( value, motor2, motor2A, motor2B );
            break;
        case 164:
            // set the third PWMs value
            setPWM( value, motor3, motor3A, motor3B );
            break;
        case 165:
            // set the fourth PWMs value
            setPWM( value, motor4, motor4A, motor4B );
            break;
        case 230:
            // Goto _reset ?
            break;
        case 231:
            // enable or disable servos
            if ( value == 1 ) {
                // enable servo ?
            } else if ( value == 2 ) {
                // disable servo ?
            }
            break;
        case 233:
            // set digitals values
            digital1 = ( value & 1 );
            digital2 = ( ( value >> 1 ) & 1 );
            digital3 = ( ( value >> 2 ) & 1 );
            digital4 = ( ( value >> 3 ) & 1 );
            break;
        default:
            //pc.printf( "default\n" );
    }
}

int readADC( int channel, DigitalOut select ) {
    // select the device
    select = 0;
    
    // sending the 5 bits + 2 bits to ignore the null bits
    // coming from the device, so the data that is sent is 11000101
    uint8_t commandbits = 0xC0;
    commandbits |= ( channel << 2 );
    spi.write( commandbits );

    // now the device sends back the readings 12 bits, 7 bits at a time
    uint8_t high = spi.write(0x0);
    uint8_t low = spi.write(0x0);
    low = low >> 2;

    // shift to get the high and low byte
    high = ( high >> 3 );
    low = ( high << 5 ) | low;

    // deselect the device
    select = 1;

    // save the values
    *(values++) = high;
    *(values++) = low;
    
    return 0;
}

void serialEvent() {
    char c = pc.getc();
    // if we received enter
    if( c == 13 ) {
        //pc.printf( "char=[%c] value=[%u]", buffer[0],getIntValue(buffer[1],buffer[2]) );
        specifyAction( buffer[ 0 ], getIntValue( buffer[ 1 ], buffer[ 2 ] ) );
        buffer[ 0 ] = '\0';
        bufferIndex = 0;
    }
    else {
        buffer[ bufferIndex++ ] = c;
    }
}

// the main method
int main() {
    // Setup the spi for 7 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
    spi.format(7,0);
    spi.frequency(1000000);
    
    // specify the usb baud rate, supported are :
    // 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600
    pc.baud( 921600 );

    // allocate 16 bytes of space for the adc values
    values = (uint8_t*) malloc(16);
    // remember the first values aadress
    location = values;

    // attach a serial interrupt
    pc.attach( &serialEvent );

    // to indicate programm is running
    led = 1;

    // endless loop
    while ( true ) {
        // start from the beginning
        values = location;
        // read the ADC values
        for ( i = 0; i < 8; i++ ) {
            readADC( i, cs );
        }
    }
}