lab 6

Dependencies:   ADXL362 mbed MPL3115A2

main.cpp

Committer:
htdoughe
Date:
2018-02-23
Revision:
17:6a08357dbb3f
Parent:
16:993757c8b398
Child:
18:216cc41b55f3

File content as of revision 17:6a08357dbb3f:

#include "mbed.h"
#include "ADXL362.h"
#include "string.h"
#include "MPL3115A2.h"

DigitalOut led1(LED3);

//map of register values and names for the adxl
int regids[34];
char* regnames[34];
//populating the map
void initmap() {
    regids[0] = 0x00;
    regids[1] = 0x01;
    regids[2] = 0x02;
    regids[3] = 0x03;
    regids[4] = 0x08;
    regids[5] = 0x09;
    regids[6] = 0x0A;
    regids[7] = 0x0B;
    regids[8] = 0x0c;
    regids[9] = 0x0D;
    regids[10] = 0x0E;
    regids[11] = 0x0F;
    regids[12] = 0x10;
    regids[13] = 0x11;
    regids[14] = 0x12;
    regids[15] = 0x13;
    regids[16] = 0x14;
    regids[17] = 0x15;
    regids[18] = 0x1F;
    regids[19] = 0x20;
    regids[20] = 0x21;
    regids[21] = 0x22;
    regids[22] = 0x23;
    regids[23] = 0x24;
    regids[24] = 0x25;
    regids[25] = 0x26;
    regids[26] = 0x27;
    regids[27] = 0x28;
    regids[28] = 0x29;
    regids[29] = 0x2A;
    regids[30] = 0x2B;
    regids[31] = 0x2C;
    regids[32] = 0x2D;
    regids[33] = 0x2E;
    
    regnames[0] = "DEVID_AD";
    regnames[1] = "DEVID_MST";
    regnames[2] = "PARTID";
    regnames[3] = "REVID";
    regnames[4] = "XDATA";
    regnames[5] = "YDATA";
    regnames[6] = "ZDATA";
    regnames[7] = "STATUS";
    regnames[8] = "FIFO_ENTRIES_L";
    regnames[9] = "FIFO_ENTRIES_H";
    regnames[10] = "XDATA_L";
    regnames[11] = "XDATA_H";
    regnames[12] = "YDATA_L";
    regnames[13] = "YDATA_H";
    regnames[14] = "ZDATA_L";
    regnames[15] = "ZDATA_H";
    regnames[16] = "TEMP_L";
    regnames[17] = "TEMP_H";
    regnames[18] = "SOFT_RESET";
    regnames[19] = "THRESH_ACT_L";
    regnames[20] = "THRESH_ACT_H";
    regnames[21] = "TIME_ACT";
    regnames[22] = "THRESH_INACT_L";
    regnames[23] = "THRESH_INACT_H";
    regnames[24] = "TIME_INACT_L";
    regnames[25] = "TIME_INACT_H";
    regnames[26] = "ACT_INACT_CTL";
    regnames[27] = "FIFO_CONTROL";
    regnames[28] = "FIFO_SAMPLES";
    regnames[29] = "INTMAP1";
    regnames[30] = "INTMAP2";
    regnames[31] = "FILTER_CTL";
    regnames[32] = "POWER_CTL";
    regnames[33] = "SELF_TEST";
}

// 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);

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 = regnames[in]; //GET NAME
                ADXL362::ADXL362_register_t reg = (ADXL362::ADXL362_register_t) regids[in];
                uint8_t val = adxl362.read_reg(reg); //GET REG VAL
                //print val
                printf("0x%01x: %s=0x%01x\r\n", regids[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;
    
    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 3, a knock has occured.
        if(x > initx+2 || y > inity+2 || z > initz+2 || x > initx-2 || y > inity-2 || z > initz-2){
            led1 = 1;
            count++;
            printf("number of knocks: %d\r\n", count);
            wait_ms(2000);
            led1 = 0;
        }
        //printf("x = %d y = %d z = %d\r\n",x,y,z);
        wait_ms(100);
    }
}

int main() {
    initmap();
    adxl362.reset();
    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);
    //}
    knocks();
    
}