Code for an autonomous plane I'm building. Includes process scheduling, process communication, and hardware sensor interfacing (via I2C). NOTE: currently in development, source code will be updated frequently.

Dependencies:   mbed

sensor.cpp

Committer:
teamgoat
Date:
2013-10-30
Revision:
0:0c627ff4c5ed
Child:
2:452dd766d212

File content as of revision 0:0c627ff4c5ed:

#include "sensor.h"

I2C i2c(PTE1, PTE0);

char set_i2c_pointer(char addr, char reg)
{
    if (i2c.write(addr) == 0)
    {
        return 0;
    }
    if (i2c.write(reg) == 0)
    {
        return 0;
    }
    return 1;
}   

int read(char addr, char reg, char *buf, int n)
{
    i2c.start();
    if (set_i2c_pointer(addr, reg) == 0)
        return 0;
    if (i2c.read(addr|1, buf, n, true) != 0)
        return 0;
    i2c.stop();
    return n;
}

int write(char addr, char reg, char *buf, int n)
{
    i2c.start();
    if (set_i2c_pointer(addr, reg) == 0)
        return 0;
    for (int i=0; i<n; i++)
    {
        if (i2c.write(buf[i]) == 0)
        {   
            i2c.stop();
            return i;
        }
    }
    i2c.stop();
    return n;
    
}

int read_accelerometer(struct accel* s)
{
    int ret = read(accel_w, ACCEL_X, s->raw_data, 6);
    if (ret == 0)
    {
        return 0;
    }
    int axlsb = (int) s->raw_data[0];
    int axmsb = (int) s->raw_data[1];
    int aylsb = (int) s->raw_data[2];
    int aymsb = (int) s->raw_data[3];
    int azlsb = (int) s->raw_data[4];
    int azmsb = (int) s->raw_data[5];

    s->ax = (axmsb << 8) + axlsb;
    s->ay = (aymsb << 8) + aylsb;
    s->az = (azmsb << 8) + azlsb;
    return 1;
}

void read_gyro(struct gyro* s){}
int read_compass(void){return 0;}
int read_barometer(void){return 0;}

void config_accelerometer(void){}
void config_gyro(void){}
void config_compass(void){}
void config_barometer(void){}

void config_gy80(struct config *c)
{
    i2c.frequency(c->frequency);
    config_accelerometer();
    config_gyro();
    config_compass();
}