lab 6

Dependencies:   ADXL362 mbed MPL3115A2

main.cpp

Committer:
htdoughe
Date:
2018-03-09
Revision:
33:5df68b9e96de
Parent:
32:f6664eade7fe

File content as of revision 33:5df68b9e96de:

#include "mbed.h"
#include "ADXL362.h"
#include "string.h"
#include "MPL3115A2.h"
#include <stdio.h>
#include <time.h>
 
DigitalOut led3(LED3);
Serial pc(USBTX, USBRX);
//AnalogIn gpio(D9);

//map of register values and names for the adxl
int aregids[34];
char* aregnames[34];
//populating the map
void initmap()
{
    aregids[0] = 0x00;
    aregids[1] = 0x01;
    aregids[2] = 0x02;
    aregids[3] = 0x03;
    aregids[4] = 0x08;
    aregids[5] = 0x09;
    aregids[6] = 0x0A;
    aregids[7] = 0x0B;
    aregids[8] = 0x0c;
    aregids[9] = 0x0D;
    aregids[10] = 0x0E;
    aregids[11] = 0x0F;
    aregids[12] = 0x10;
    aregids[13] = 0x11;
    aregids[14] = 0x12;
    aregids[15] = 0x13;
    aregids[16] = 0x14;
    aregids[17] = 0x15;
    aregids[18] = 0x1F;
    aregids[19] = 0x20;
    aregids[20] = 0x21;
    aregids[21] = 0x22;
    aregids[22] = 0x23;
    aregids[23] = 0x24;
    aregids[24] = 0x25;
    aregids[25] = 0x26;
    aregids[26] = 0x27;
    aregids[27] = 0x28;
    aregids[28] = 0x29;
    aregids[29] = 0x2A;
    aregids[30] = 0x2B;
    aregids[31] = 0x2C;
    aregids[32] = 0x2D;
    aregids[33] = 0x2E;

    aregnames[0] = "DEVID_AD";
    aregnames[1] = "DEVID_MST";
    aregnames[2] = "PARTID";
    aregnames[3] = "REVID";
    aregnames[4] = "XDATA";
    aregnames[5] = "YDATA";
    aregnames[6] = "ZDATA";
    aregnames[7] = "STATUS";
    aregnames[8] = "FIFO_ENTRIES_L";
    aregnames[9] = "FIFO_ENTRIES_H";
    aregnames[10] = "XDATA_L";
    aregnames[11] = "XDATA_H";
    aregnames[12] = "YDATA_L";
    aregnames[13] = "YDATA_H";
    aregnames[14] = "ZDATA_L";
    aregnames[15] = "ZDATA_H";
    aregnames[16] = "TEMP_L";
    aregnames[17] = "TEMP_H";
    aregnames[18] = "SOFT_RESET";
    aregnames[19] = "THRESH_ACT_L";
    aregnames[20] = "THRESH_ACT_H";
    aregnames[21] = "TIME_ACT";
    aregnames[22] = "THRESH_INACT_L";
    aregnames[23] = "THRESH_INACT_H";
    aregnames[24] = "TIME_INACT_L";
    aregnames[25] = "TIME_INACT_H";
    aregnames[26] = "ACT_INACT_CTL";
    aregnames[27] = "FIFO_CONTROL";
    aregnames[28] = "FIFO_SAMPLES";
    aregnames[29] = "INTMAP1";
    aregnames[30] = "INTMAP2";
    aregnames[31] = "FILTER_CTL";
    aregnames[32] = "POWER_CTL";
    aregnames[33] = "SELF_TEST";
}

//map of register values and names for the adxl
char mregids[46];
char* mregnames[46];
//populating the map
void minitmap()
{
    mregids[0] = 0x00;
    mregids[1] = 0x01;
    mregids[2] = 0x02;
    mregids[3] = 0x03;
    mregids[4] = 0x04;
    mregids[5] = 0x05;
    mregids[6] = 0x06;
    mregids[7] = 0x07;
    mregids[8] = 0x08;
    mregids[9] = 0x09;
    mregids[10] = 0x0A;
    mregids[11] = 0x0B;
    mregids[12] = 0x0C;
    mregids[13] = 0x0D;
    mregids[14] = 0x0E;
    mregids[15] = 0x0F;
    mregids[16] = 0x10;
    mregids[17] = 0x11;
    mregids[18] = 0x12;
    mregids[19] = 0x13;
    mregids[20] = 0x14;
    mregids[21] = 0x15;
    mregids[22] = 0x16;
    mregids[23] = 0x17;
    mregids[24] = 0x18;
    mregids[25] = 0x19;
    mregids[26] = 0x1A;
    mregids[27] = 0x1B;
    mregids[28] = 0x1C;
    mregids[29] = 0x1D;
    mregids[30] = 0x1E;
    mregids[31] = 0x1F;
    mregids[32] = 0x20;
    mregids[33] = 0x21;
    mregids[34] = 0x22;
    mregids[35] = 0x23;
    mregids[36] = 0x24;
    mregids[37] = 0x25;
    mregids[38] = 0x26;
    mregids[39] = 0x27;
    mregids[40] = 0x28;
    mregids[41] = 0x29;
    mregids[42] = 0x2A;
    mregids[43] = 0x2B;
    mregids[44] = 0x2C;
    mregids[45] = 0x2D;

    mregnames[0] = "STATUS";
    mregnames[1] = "OUT_P_MSB";
    mregnames[2] = "OUT_P_CSB";
    mregnames[3] = "OUT_P_LSB";
    mregnames[4] = "OUT_T_MSB";
    mregnames[5] = "OUT_T_LSB";
    mregnames[6] = "DR_STATUS";
    mregnames[7] = "OUT_P_DELTA_MSB";
    mregnames[8] = "OUT_P_DELTA_CSB";
    mregnames[9] = "OUT_T_DELTA_MSB";
    mregnames[10] = "OUT_T_DELTA_LSB";
    mregnames[11] = "WHO_AM_I";
    mregnames[12] = "F_STATUS";
    mregnames[13] = "F_DATA";
    mregnames[14] = "F_SETUP";
    mregnames[15] = "TIME_DLY";
    mregnames[16] = "SYSMOD";
    mregnames[17] = "INT_SOURCE";
    mregnames[18] = "SOFT_RESET";
    mregnames[19] = "PT_DATA_CFG";
    mregnames[20] = "BAR_IN_MSB";
    mregnames[21] = "BAR_IN_LSB";
    mregnames[22] = "P_TGT_MSB";
    mregnames[23] = "P_TGT_LSB";
    mregnames[24] = "T_TGT";
    mregnames[25] = "P_WND_MSB";
    mregnames[26] = "P_WND_LSB";
    mregnames[27] = "T_WND";
    mregnames[28] = "P_MIN_MSB";
    mregnames[29] = "P_MIN_CSB";
    mregnames[30] = "P_MIN_LSB";
    mregnames[31] = "T_MIN_MSB";
    mregnames[32] = "T_MIN_LSB";
    mregnames[33] = "P_MAX_MSB";
    mregnames[34] = "P_MAX_CSB";
    mregnames[35] = "P_MAX_LSB";
    mregnames[36] = "T_MAX_MSB";
    mregnames[37] = "T_MAX_LSB";
    mregnames[38] = "CTRL_REG1";
    mregnames[39] = "CTRL_REG2";
    mregnames[40] = "CTRL_REG3";
    mregnames[41] = "CTRL_REG4";
    mregnames[42] = "CTRL_REG5";
    mregnames[43] = "OFF_P";
    mregnames[44] = "OFF_T";
    mregnames[45] = "OFF_H";
}

// Interface pulled from ADXL362.cpp
// ADXL362::ADXL362(PinName CS, PinName MOSI, PinName MISO, PinName SCK) :
ADXL362 adxl362(PA_0,PA_7,PA_6,PA_1);

// Selects SDA as I2C1_SDA on pin PB_7
// Selects SCL on I2C1_SCL on pin PB_6
// The I2C address of the pressure sensor is fixed at 0x60.
MPL3115A2 pressure(PB_7, PB_6, 0x60);

int adxl362_reg_print(int s, int l)
{
    //check s is between 0x00 and 0x2E
    if(s > 0x2E || s < 0x00) {
        printf("adx: requires start between 0x00 and 0x2E; given %d (0x%01x)\n", s,s);
        return -1;
    } else if(l < 0) {
        //check length > 0
        printf("adx: requires length >= 0, given %d\n", l);
        return -1;
    } else {
        // start sending stuff
        //first check DEVID_AD == 0xAD
        uint8_t devid = adxl362.read_reg(ADXL362::DEVID_AD);
        //printf("devid = %d\n", devid);
        if(devid != 0xAD) {
            printf("error: DEVID_AD is not 0xAD; exiting\n");
            return -1;
        } else {
            //now do stuff
            //if length == 0, send everything from s to end of registers
            //else print from s to l
            // formula : range = end - start - length
            // area = start + range
            int stop = 0;
            if(l == 0) {
                stop = 34;
            } else {
                stop = s + l;
            }
            int in = s;
            while(in < stop) {
                //get register name
                char * name = aregnames[in]; //GET NAME
                ADXL362::ADXL362_register_t reg = (ADXL362::ADXL362_register_t) aregids[in];
                uint8_t val = adxl362.read_reg(reg); //GET REG VAL
                //print val
                printf("0x%01x: %s=0x%01x\r\n", aregids[in], name, val);
                in++;
            }
        }
    }
    return 0;
}

void knocks()
{
    int8_t x,y,z, initx, inity, initz;
    //initial values of x, y, and z.
    //These values are the baseline for the accelerometer; knocks are detected
    // in relation to these initial values
    initx=adxl362.scanx_u8();
    inity=adxl362.scany_u8();
    initz=adxl362.scanz_u8();
    int count = 0;
    int bs = 7;

    while(1) {
        //get the values of x, y, and z to test for a knock
        x=adxl362.scanx_u8();
        y=adxl362.scany_u8();
        z=adxl362.scanz_u8();
        //if x, y, or z vary from baseline by at least bs, a knock has occured.
        if(x > initx+bs || y > inity+bs || z > initz+bs || x < initx-bs || y < inity-bs || z < initz-bs) {
            led3 = 1;
            count++;
            printf("number of knocks: %d\r\n", count);
            wait_ms(2000);
            led3 = 0;
        }
        //printf("x = %d y = %d z = %d\r\n",x,y,z);
        wait_ms(100);
    }
}

int mpl3115_reg_print(int s, int l)
{
    if(s > 0x2D || s < 0x00) {
        printf("mpl: requires start between 0x00 and 0x20; given %d (0x%01x)\n\r", s,s);
        return -1;
    } else if(l < 0) {
        //check length > 0
        printf("mpl: requires length >= 0, given %d\n\r", l);
        return -1;
    } else {
        //else do stuff
        uint8_t id = pressure.getID();
        //printf("whoami = 0x%01x", id);
        if(id != 0xC4) {
            printf("error: WHO_AM_I is not 0xC4; exiting\n");
            return -1;
        } else {
            //now do stuff
            //if length == 0, send everything from s to end of registers
            //else print from s to l
            // formula : range = end - start - length
            // area = start + range
            int stop = 0;
            if(l == 0) {
                stop = 46;
            } else {
                stop = s + l;
            }
            int in = s;
            while(in < stop) {
                //get register name
                char * name = mregnames[in]; //GET NAME
                int reg = mregids[in];
                uint8_t val;
                pressure.readRegs(reg,&val,sizeof(uint8_t)); //GET REG VAL
                //print val
                printf("0x%01x: %s=0x%01x\r\n", mregids[in], name, val);
                in++;
            }//while
        }//else
    }//else
    return 0;
}//print mpl

int measureAlt()
{

    printf("measuring things\r\n");

    uint8_t id = pressure.getID();
    //printf("whoami = 0x%01x\r\n", id);
    if(id != (uint8_t) 0xC4) {
        printf("error: WHO_AM_I is not 0xC4; exiting\r\n");
        return -1;
    } else {
        double data[900];

        int ind = 0;

        //set sample_time
        wait_ms(100);
        uint8_t st = pressure.getCTRL_REG1();
        uint8_t msk = 0x8f;
        //printf("CTL_REG1 = 0x%05x\r\n", st);
        pressure.setCTRL_REG1(msk);
        pressure.activate();
        //printf("CTL_REG1 = 0x%05x\r\n", pressure.getCTRL_REG1());
        

        //pressure stuff
        uint8_t tmp[3] ;
        uint32_t pres ;


        //GPIO pin indicates sampling should begin -- if voltage == 3.3, start
        while(ind < 900 && !pc.readable()) {
            printf("measuring...\r\n");
            //then we measure
            //pressure and temperature sampled at 10times/second (10 hz)
            //LED blinks during sampling at 1 hz (1 time/second)
            led3 = 1;
            for(int i = 0; i < 10; i++) {
                pres = pressure.getPressure();
                //pressure.readRegs(mregids[1], tmp, 3) ;
                //pres = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6;
                data[ind++] = pres;
                data[ind++] = pressure.getTemperature();
                wait_ms(100);
            }//for
            led3 = 0;
            for(int i = 0; i < 10; i++) {
                pres = pressure.getPressure();
                //pressure.readRegs(mregids[1], tmp, 3) ;
                //pres = ((tmp[0]<<16)|(tmp[1]<<8)|(tmp[2])) >> 6;
                data[ind++] = pres;
                data[ind++] = pressure.getTemperature();
                wait_ms(100);
            }//for
        }//while
        
        int pind = 0;
        int pend = ind;
        char in;
        int ch;
        char p = 'p';
        bool ex = false;
        while(!ex) {
            printf("p%% ");
            while((ch = pc.getc()) != 13) {
                pc.putc(ch);
                in = ch;
            }//while
            if(in == p) {
                while(pind < pend) {
                    pc.printf("\n\r%f\t%f", data[pind],data[pind+1]);
                    pind += 2;
                    ex = true;
                }//while
            } else {
                in = 0;
            }//if/else
        }//while
        
        pc.printf("\n\r");
    return 0;
    }//else
}//measureAlt

int main()
{
    initmap();
    minitmap();
    adxl362.reset();
    pressure.activate();
    wait_ms(600); // we need to wait at least 500ms after ADXL362 reset
    adxl362.set_mode(ADXL362::MEASUREMENT);
    int start, length;
    start = 0;
    length = 0;
    //while(1){
    //adxl362_reg_print(start, length);
       mpl3115_reg_print(start, length);
    //}
    //knocks();

    measureAlt();
    //while(1);
}