PNI / Mbed 2 deprecated VSG_DataLogger1_VariableSpeed

Dependencies:   SDFileSystemVSG mbed

Fork of VSG_DataLogger1 by PNI

main.cpp

Committer:
JoeMiller
Date:
2018-05-08
Revision:
2:d2c2e2d3f1e5
Parent:
0:bdbd3d6fc5d5
Child:
4:ea7c4356f84c

File content as of revision 2:d2c2e2d3f1e5:

// VSG Board 18-axes mag Datalogger prototype
// install debug jumper for console output only
// remove debug jumper to log data to SDcard only

// set system parameters -------------------------
#define SAMPLE_RATE     (10)    //Hz
#define SAMPLE_PERIOD   (20)      // seconds
#define SAMPLE_DELAY    (2)      // seconds -to allow time to seal unit and place in the field
#define CYCLE_COUNT     (50)
//------------------------------------------------


#include "mbed.h"
#include "SDFileSystem.h"
//          NOTICE: SDFileSystem.cpp was modified. See //JM comments
#include "main.h"
 
#define SAMPLE_INTERVAL (1.0/SAMPLE_RATE)
#define MAX_COUNT       (SAMPLE_PERIOD * SAMPLE_RATE)
#define MCC             ((CYCLE_COUNT >> 8) & 0xff)
#define LCC             (CYCLE_COUNT & 0xff)
#define MAX_MAG_VALUE   (8388608)  // positive 23 bits
#define NEGATIVE_ADJUST (MAX_MAG_VALUE + MAX_MAG_VALUE) //signed 24 bits

// resource assignments
DigitalIn  rdy1a(DRDY1A);
DigitalIn  rdy1b(DRDY1B);
DigitalIn  rdy1c(DRDY1C);
DigitalIn  rdy2a(DRDY2A);
DigitalIn  rdy2b(DRDY2B);
DigitalIn  rdy2c(DRDY2C);
DigitalIn  debugPin(DEBUG_MODE);

DigitalOut sel1a(SSM1A);
DigitalOut sel1b(SSM1B);
DigitalOut sel1c(SSM1C);
DigitalOut sel2a(SSM2A);
DigitalOut sel2b(SSM2B);
DigitalOut sel2c(SSM2C);

DigitalOut LED(DEBUG_LED);
 
SPI         mag(SPI_MOSI, SPI_MISO, SPI_SCK);
SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CSN, "sd"); // the pinout on the mbed Cool Components workshop board
Serial      console(PA_2, PA_3,115200); // debug port
Ticker      magTimer;

char takeAsample_F;

void sampletimer() {
    takeAsample_F = 1;
//    printf("*");
}


int main() {
    
    int response;
    unsigned int count = 0;
    char haveMeasurements = 0;
    char SDOK;
    int X[6],Y[6],Z[6];
    mag.lock();
    magTimer.attach(&sampletimer,SAMPLE_INTERVAL);
    
    sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1;
    

    printf("\r\nVSG Datalogger\r\n");   
    printf("Timer interval = %f (sec)\r\n",SAMPLE_INTERVAL);
    printf("Cycle Counts = %d \r\n", CYCLE_COUNT);
    
    for(char i=0; i<6; i++) {  //wakeup blink 6 times
        LED = !LED;
        wait(0.1F);
    }
    wait(1.0F);
    
    if (debugPin == 0){
        SDOK = 1;       //initialize
    }

    printf("\r\nOpening log file for append write\r\n");   
    // cannot make fopen conditional on debugPin - compiler does not understand
    FILE *sd = fopen("/sd/sdtest.txt", "a");
    if(sd == NULL) {
        printf("\r\nRetry opening log file\r\n");
        wait(2);
        FILE *sd = fopen("/sd/sdtest.txt", "a");
        if(sd == NULL) {
            printf("\r\n....one more retry opening log file\r\n");
            wait(2);
            FILE *sd = fopen("/sd/sdtest.txt", "a"); 
            if(sd == NULL) {
                printf("\r\n>>>>>> Could not open file for write try restarting\r\n");
                SDOK = 0;
                while(!debugPin); // stay here if in log mode               
            }
        }
    }
    
    
 
    if (SDOK) {
        printf("LOGGING MODE\r\n");
        for(char i=0; i<6; i++) {  //blink 6 times to show logging mode has been initiated
            LED = !LED;
            wait(0.1F);
        }
        fprintf(sd, "count,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n");
    }
 
 
    // BIST Built-In-Self-Test Mag senosrs and ASIC
        // only in debug mode. Print axis OK bit flags for ZYX in that order 
    if (debugPin == 1) {
        printf("Starting BIST (7 = all axes on this device are OK)\r\n");

        sel1a = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel1a = 1;
        sel1a = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel1a = 1;
        while (!rdy1a); 
        sel1a = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel1a = 1;
        printf("1a = %d\r\n",((response>>4) & 0x07));
        sel1a = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel1a = 1;

        sel1b = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel1b = 1;
        sel1b = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel1b = 1;
        while (!rdy1b); 
        sel1b = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel1b = 1;
        printf("1b = %d\r\n",((response>>4) & 0x07));
        sel1b = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel1b = 1;

        sel1c = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel1c = 1;
        sel1c = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel1c = 1;
        while (!rdy1c); 
        sel1c = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel1c = 1;
        printf("1c = %d\r\n",((response>>4) & 0x07));
        sel1c = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel1c = 1;

        sel2a = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel2a = 1;
        sel2a = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel2a = 1;
        while (!rdy2a); 
        sel2a = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel2a = 1;
        printf("2a = %d\r\n",((response>>4) & 0x07));
        sel2a = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel2a = 1;

        sel2b = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel2b = 1;
        sel2b = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel2b = 1;
        while (!rdy2b) ;
        sel2b = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel2b = 1;
        printf("2b = %d\r\n",((response>>4) & 0x07));
        sel2b = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel2b = 1;

        sel2c = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0x8F);     // Set Self test enable bit
        sel2c = 1;
        sel2c = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);    // start single measurement - all Axes
        sel2c = 1;
        while (!rdy2c); 
        sel2c = 0;
        response = mag.write(BIST_REG);     // BIST register addr
        response = mag.write(0);            // Read back BIST results
        sel2c = 1;
        printf("2c = %d\r\n",((response>>4) & 0x07));
        sel2c = 0;
        response = mag.write(BIST_REG);  // BIST register addr
        response = mag.write(0);     // Set Self test enable bit
        sel2c = 1;
    }


    // BIST Complete

    // Set Cycle Count on all 6 devices simultaniously   
    sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 0;
    response = mag.write(CC_REG);     // Mag single measurement Register
    for (char i=0; i<3;i++) {
        response = mag.write(MCC);     // start single measurement - all Axes
        response = mag.write(LCC);     // start single measurement - all Axes
    }
    sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1;


    if (debugPin) printf("count,X1a,Y1a,Z1a,X1b,Y1b,Z1b,X1c,Y1c,Z1c,X2a,Y2a,Z2a,X2b,Y2b,Z2b,X2c,Y2c,Z2c\r\n");

    // log start delay when Flash card datalogging to give to to button up and place unit
    if (SDOK) { 
        LED = 1; // LED to show logging is in wait phase
        wait(SAMPLE_DELAY); 
    }
    

    while(count < MAX_COUNT) {
        while(!takeAsample_F){
             wait(0.0001); // required
        }
        takeAsample_F = 0;

        sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 0;
        response = mag.write(MAG_REG);     // Mag single measurement Register
        response = mag.write(ALL_AXES);     // start single measurement - all Axes
        sel1a = sel1b = sel1c = sel2a = sel2b = sel2c = 1;

        // send/save data while waiting for current measurements to complete
        // this will helps increase sample rate -when needed.
        if (haveMeasurements) {       
                if (SDOK) {
                    fprintf(sd,"%d,",count);
                }
                else printf("%d,  ",count);
            
            // sign adjust and publish data
            for (char i = 0; i<6; i++) {
                // 24 bit sign adjust
                if (X[i] > (0x07FFFFF)) X[i] -= 0x1000000;
                if (Y[i] > (0x07FFFFF)) Y[i] -= 0x1000000;
                if (Z[i] > (0x07FFFFF)) Z[i] -= 0x1000000;

                if (SDOK) {
                    fprintf(sd,"%d,%d,%d",X[i],Y[i],Z[i]);
                }
                else printf("%d,%d,%d",X[i],Y[i],Z[i]);
        
                if(i<5) {
                    if (SDOK) {
                        fprintf(sd,",");   // more data comming
                    }
                    else printf(",  ");
                }
                else {
                    if (SDOK) {
                        fprintf(sd,"\n");  // last set of data
                    }
                    else printf("\r\n");
                }            
            }
        count++;
        }


        while (!(rdy1a && rdy1b && rdy1c && rdy2a && rdy2b && rdy2c)){
            // spin here until all Data Ready signals go high
        }

     
        sel1a = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[0] = response << 16;
            response = mag.write(0); 
            X[0] += (response << 8);
            response = mag.write(0); 
            X[0] += response;
            response = mag.write(0); 
            Y[0] = response << 16;
            response = mag.write(0); 
            Y[0] += (response << 8);
            response = mag.write(0); 
            Y[0] += response;
            response = mag.write(0); 
            Z[0] = response << 16;
            response = mag.write(0); 
            Z[0] += (response << 8);
            response = mag.write(0); 
            Z[0] += response;
        sel1a = 1;
 
        sel1b = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[1] = response << 16;
            response = mag.write(0); 
            X[1] += (response << 8);
            response = mag.write(0); 
            X[1] += response;
            response = mag.write(0); 
            Y[1] = response << 16;
            response = mag.write(0); 
            Y[1] += (response << 8);
            response = mag.write(0); 
            Y[1] += response;
            response = mag.write(0); 
            Z[1] = response << 16;
            response = mag.write(0); 
            Z[1] += (response << 8);
            response = mag.write(0); 
            Z[1] += response;
        sel1b = 1;
    
        sel1c = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[2] = response << 16;
            response = mag.write(0); 
            X[2] += (response << 8);
            response = mag.write(0); 
            X[2] += response;
            response = mag.write(0); 
            Y[2] = response << 16;
            response = mag.write(0); 
            Y[2] += (response << 8);
            response = mag.write(0); 
            Y[2] += response;
            response = mag.write(0); 
            Z[2] = response << 16;
            response = mag.write(0); 
            Z[2] += (response << 8);
            response = mag.write(0); 
            Z[2] += response;
        sel1c = 1;
            
        sel2a = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[3] = response << 16;
            response = mag.write(0); 
            X[3] += (response << 8);
            response = mag.write(0); 
            X[3] += response;
            response = mag.write(0); 
            Y[3] = response << 16;
            response = mag.write(0); 
            Y[3] += (response << 8);
            response = mag.write(0); 
            Y[3] += response;
            response = mag.write(0); 
            Z[3] = response << 16;
            response = mag.write(0); 
            Z[3] += (response << 8);
            response = mag.write(0); 
            Z[3] += response;
        sel2a = 1;
        
        sel2b = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[4] = response << 16;
            response = mag.write(0); 
            X[4] += (response << 8);
            response = mag.write(0); 
            X[4] += response;
            response = mag.write(0); 
            Y[4] = response << 16;
            response = mag.write(0); 
            Y[4] += (response << 8);
            response = mag.write(0); 
            Y[4] += response;
            response = mag.write(0); 
            Z[4] = response << 16;
            response = mag.write(0); 
            Z[4] += (response << 8);
            response = mag.write(0); 
            Z[4] += response;
        sel2b = 1;
    
        sel2c = 0;
            response = mag.write(MX_REG);     // Read back mag data
            response = mag.write(0); 
            X[5] = response << 16;
            response = mag.write(0); 
            X[5] += (response << 8);
            response = mag.write(0); 
            X[5] += response;
            response = mag.write(0); 
            Y[5] = response << 16;
            response = mag.write(0); 
            Y[5] += (response << 8);
            response = mag.write(0); 
            Y[5] += response;
            response = mag.write(0); 
            Z[5] = response << 16;
            response = mag.write(0); 
            Z[5] += (response << 8);
            response = mag.write(0); 
            Z[5] += response;
        sel2c = 1;
    
        haveMeasurements = 1;
     
        LED = !LED;
        
    } // end of while(1)   


    if (!debugPin) {
// optional get SDCard  available space      
//            FATFS* fs;
//            DWORD fre_clust;
//            f_getfree("0:",&fre_clust,&fs);
//            const float frs = float(fs->csize)*float(fs->free_clust)
//        #if _MAX_SS != 512
//                *(fs->ssize);
//        #else
//                *512;
//        #endif
//            printf("free space = %g MB, %g KB\r\n", frs/1048576.0, frs/1024.0);

        fclose(sd);
        
    }
    
    LED = 0;
    printf("\r\nDONE\r\n");

    magTimer.detach();
    mag.unlock();
}