CUED IIA Project

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_GATT_Example by Bluetooth Low Energy

sensors.cpp

Committer:
AidasL
Date:
2017-06-03
Revision:
24:baa43caa2f3d
Parent:
23:708cc5ef2604

File content as of revision 24:baa43caa2f3d:

#include "sensors.h"
#include "mbed.h"
#include "wire.h"

#define BLE_Nano
//
// #ifdef BLE_Nano
// #define SCL         7
// #define SDA         6
// #endif

// #ifdef BLE_Nano
// #define SCL         8 // D2
// #define SDA         10 // D3
// #endif


// #define ACC2 0x69 //    0b01101001




AnalogIn analogL(P0_4); // Analog senson input polling A3; Left In
AnalogIn analogR(P0_5); // Analog senson input polling A4; Right In

DigitalOut flexA(P0_7); // Left Hand Finger Selectors:  A
DigitalOut flexB(P0_6); // B
DigitalOut flexC(P0_15); //  C

// DigitalOut flexRA(P0_28); //  Right hand finder selectors : A
// DigitalOut flexRB(P0_29); //  B
// DigitalOut flexRC(P0_11); //  C

// TwoWire Wire = TwoWire(NRF_TWI0);
I2C i2c(p8, p10);



void WriteBytes(uint8_t addr, uint8_t *pbuf, uint16_t length, uint8_t DEV_ADDR)
{
        // Wire.beginTransmission(DEV_ADDR<<1);
        // Wire.write( (uint8_t)addr);
        // Wire.write(pbuf, length);
        // Wire.endTransmission();
        i2c.start();
        i2c.write( DEV_ADDR <<1 );
        i2c.write( addr );
        for (int i =0; i<length; i++) {
                i2c.write( *pbuf );
                pbuf++;
        }
        i2c.stop();
}

void ReadBytes(uint8_t addr, uint8_t *pbuf, uint16_t length, uint8_t DEV_ADDR)
{
        // Wire.beginTransmission((DEV_ADDR<<1)+1);
        // Wire.write( (uint8_t)addr);
        // Wire.endTransmission();
        // Wire.requestFrom(DEV_ADDR, length);
        // while( Wire.available() > 0 )
        i2c.start();
        i2c.write( (DEV_ADDR <<1) +1);
        i2c.write( addr );
        i2c.read( addr, (char*) pbuf, length);
        // {
        //         *pbuf = Wire.read();
        //         pbuf++;
        // }
}

void WriteByte(uint8_t addr, uint8_t buf, uint8_t DEV_ADDR)
{
        // Wire.beginTransmission(DEV_ADDR<<1);
        // Wire.write( (uint8_t)addr );
        // Wire.write((uint8_t)buf);
        // Wire.endTransmission();
        i2c.start();
        i2c.write( DEV_ADDR <<1 );
        i2c.write( addr );
        i2c.write( buf );
        i2c.stop();
}

//
//void Clear(){
//  Wire.twi_master_clear_bus()
//}


void setupI2C(void){
        // Wire.begin(SCL, SDA, TWI_FREQUENCY_100K);
}

void setupacc(uint8_t ADDRESS){
        WriteByte(SMPRT_DIV, 0x13, ADDRESS); // Set rate divider to 19, so sample rate is 50hz
        WriteByte(CONFIG, 0x05, ADDRESS); // Set the digital low pass filter to 10Hz Cutoff for both Gyro and acc
        WriteByte(GYRO_CONFIG, 0x08, ADDRESS); // Set the gyro range to \pm 500 degrees/sec
        WriteByte(ACCEL_CONFIG, 0x00, ADDRESS); // Set the acc range to \pm 2g
        WriteByte(FIFO_EN, 0x00, ADDRESS); // Disable FIFO
        WriteByte(I2C_MST_CTRL, 0x00, ADDRESS); // Disabling external I2C
        WriteByte(INT_PIN_CFG, 0x30, ADDRESS); // Active high, push-pull, high until cleared, cleared on any read,
        WriteByte(INT_ENABLE, 0x00, ADDRESS); // DataRDY is the last bit if needed
        WriteByte(USER_CTRL, 0x00, ADDRESS); // No FIFO or I2C Master set
        WriteByte(PWR_MGMT_1, 0x00, ADDRESS); // TODO: Sleepmode is here; Disabled now; Cycle -> LP_WAKE_CTRL
        WriteByte(PWR_MGMT_2, 0x00, ADDRESS); // No lowpower mode, all sensors active

}

void readacc(Datapacket *data, uint8_t accadr){
        uint8_t rorl = 1; //
        if(accadr == ACC_RIGHT) {rorl=0; };
        uint8_t buffer[14]={0};
        uint16_t temp;
        ReadBytes(0x3B, buffer, 14, accadr);
        temp = ((buffer[0]<<8)+buffer[1]);
        for (int i=0; i<7; i++) {

                temp=0;
                temp = ((buffer[2*i]<<8)+buffer[2*i + 1]);
                data->acc[rorl][i]= (uint16_t) temp;
        }
        // Acc data structure: ACC X, Y, Z; Temperature measurement; GYRO X, Y, Z;

}


void readflexs(Datapacket *data){

        // Order of the flex sensors:
        // 0 - right thumb, 4 - right pinky, 5 - R elbow;
        // 6 - left thumb, 10 left pinky, 11 - L elbow;
        // Read right hand in:

        // AnalogIn analogL(P0_4); // Analog senson input polling A3; Left In
        // AnalogIn analogR(P0_5); // Analog senson input polling A4; Right In
        //
        // DigitalOut flexLA(P0_7); // Left Hand Finger Selectors:  A
        // DigitalOut flexLB(P0_6); // B
        // DigitalOut flexLC(P0_15); //  C
        //
        // DigitalOut flexRA(P0_28); //  Right hand finder selectors : A
        // DigitalOut flexRB(P0_29); //  B
        // DigitalOut flexRC(P0_11); //  C
        // Address is CBA
        // Read thumbs:
        flexC = 0;
        flexB = 0;
        flexA = 0;
        data->flex[6] = (uint16_t) (analogL.read()*65535);
        // flexRC = 0;
        // flexRB = 0;
        // flexRA = 0;
        data->flex[0] = (uint16_t) (analogR.read()*65535);

        flexC = 0;
        flexB = 0;
        flexA = 1;
        data->flex[7] = (uint16_t) (analogL.read()*65535);
        // flexRC = 0;
        // flexRB = 0;
        // flexRA = 1;
        data->flex[1] = (uint16_t) (analogR.read()*65535);

        flexC = 0;
        flexB = 1;
        flexA = 0;
        data->flex[8] = (uint16_t) (analogL.read()*65535);
        // flexRC = 0;
        // flexRB = 1;
        // flexRA = 0;
        data->flex[2] = (uint16_t) (analogR.read()*65535);

        flexC = 0;
        flexB = 1;
        flexA = 1;
        data->flex[9] = (uint16_t) (analogL.read()*65535);
        // flexRC = 0;
        // flexRB = 1;
        // flexRA = 1;
        data->flex[3] = (uint16_t) (analogR.read()*65535);

        flexC = 1;
        flexB = 0;
        flexA = 0;
        data->flex[10] = (uint16_t) (analogL.read()*65535);
        // flexRC = 1;
        // flexRB = 0;
        // flexRA = 0;
        data->flex[4] = (uint16_t) (analogR.read()*65535);


        flexC = 1;
        flexB = 0;
        flexA = 1;
        data->flex[11] = (uint16_t) (analogL.read()*65535);
        // flexRC = 1;
        // flexRB = 0;
        // flexRA = 1;
        data->flex[5] = (uint16_t) (analogR.read()*65535);


}