Davide Urbano
/
microSDreader
Working version. ADXL355 data saved to microSD.
main.cpp
- Committer:
- DUR
- Date:
- 2017-09-29
- Revision:
- 0:e2579e8d9b13
File content as of revision 0:e2579e8d9b13:
#include "mbed.h" #include "rtos.h" #include "SDBlockDevice.h" #include "FATFileSystem.h" #include "utility.h" /* FLAG SCRITTURA SU SD CARD IN CORSO */ bool volatile start_writing; /* PULSANTE */ bool volatile button_int_f;/* Flag pulsante pigiato */ InterruptIn user_button(USER_KEY_PIN); /* OGGETTO FILE */ FILE *fp = NULL; uint32_t file_index;//Indice che conteggia in maniera progressiva i record sul file /* SD Card */ SDBlockDevice sd(SDCARD_MOSI, SDCARD_MISO, SDCARD_SCK, SDCARD_CS, 8000000); FATFileSystem fs("fs"); /* Bus SPI */ SPI spiHandler(SPI_MOSI, SPI_MISO, SPI_SCK); DigitalOut spiADXL355cs(ADXL355_CS);// Pin di CS ADXL355 /* ADXL355 */ adxl355_handler adxl355_config =//Handler accelerometro { .measure_range = adxl355_2g, .out_data_rate = adxl355_250hz, .drdy_pin = ADXL355_DRDY, .int1_pin = NULL, .int2_pin = NULL, .int_config = {} }; InterruptIn adxl355_int((PinName)adxl355_config.drdy_pin);// Interrupt su pin accelerometro uint32_t adxl355_int_timestamp;//Timestamp registrato nella routine di interrupt uint8_t adxl355_int_index;//Numero di interrupt consecutivi uint16_t adxl355_newData_error = 0;//Errore metodo //uint8_t adxl355_newData_sample = 0;//Conteggio dei sample acquisiti uint32_t adxl355_newData_timestamp;//Timestamp rilevato al 5° sample /* Dati locali temporanei ADXL355 */ //uint32_t adxl355_rawX_tmp = 0; //uint32_t adxl355_rawY_tmp = 0; //uint32_t adxl355_rawZ_tmp = 0; //uint32_t adxl355_rawT_tmp = 0; /* DEBUG PIN */ DigitalOut BLUpin(DBG_PIN_2); DigitalOut YELLOWpin(DBG_PIN_4); DigitalOut GREENpin(DBG_PIN); DigitalOut VIOLApin(DBG_PIN_3); DigitalOut led_pin(STATUS_LED_PIN); /* DEFINIZIONE CODA DATI */ MemoryPool<record_t, RECORD_NUMBER*RECORD_SIZE> mpool; Queue<record_t, RECORD_NUMBER*RECORD_SIZE> queue; /* SCRITTURA SU SD CARD */ void writeOnSDcard(void) { while(1) { Thread::wait(10); osEvent evt = queue.get(); if((evt.status == osEventMessage) && (start_writing == true)) { record_t *message = (record_t*)evt.value.p; BLUpin = 1; fprintf(fp, "%06d;%04x;%08d;%05x;%05x;%05x;%03x;%06x;%06x;%06x;%06x;%06x;%06x \r\n", message->index, //# message->error, //Error message->timestamp, //Timestamp message->adxl355_rawX, //ACC_DIG_3A_X message->adxl355_rawY, //ACC_DIG_3A_Y message->adxl355_rawZ, //ACC_DIG_3A_Z message->adxl355_rawT, //ACC_DIG_3A_TEMP message->adxl354_rawX, //ACC_AN_3A_X message->adxl354_rawY, //ACC_AN_3A_Y message->adxl354_rawZ, //ACC_AN_3A_Z message->adxl354_rawT, //ACC_AN_3A_TEMP message->colibrys_rawVal, //ACC_AN_1A_VAL message->colibrys_rawTEMPval //ACC_AN_1A_TEMP ); BLUpin = 0; mpool.free(message); }else{} if((button_int_f == true)&&(start_writing == true)) { fprintf(fp,"DATA END \r\n"); fclose(fp); // DO THIS AT THE END!!! sd.deinit(); fs.unmount(); start_writing = false; Thread::wait(100); if(adxl355_start_acquisition(adxl355_none) == 0) { led_pin = 0; YELLOWpin = 1; }else{} }else{} } } /* THREAD SCRITTURA SU SD CARD */ Thread writeSDthread(writeOnSDcard); /* NUOVI DATI ADXL355 */ void adxl355_newData(void) { while (true) { // Signal flags that are reported as event are automatically cleared. Thread::signal_wait(ADXL355_SIGNAL); GREENpin = 1; if(adxl355_get_data(&adxl355_config) != 0) { adxl355_newData_error |= 0xFF00; }else{} file_index++; adxl355_newData_timestamp = HAL_GetTick(); adxl355_newData_error |= (uint16_t)(adxl355_newData_timestamp - adxl355_int_timestamp); record_t *message = mpool.alloc(); message->index = file_index; message->error = adxl355_newData_error; message->timestamp = adxl355_newData_timestamp; message->adxl355_rawX = adxl355_raw_x_acc(&adxl355_config); message->adxl355_rawY = adxl355_raw_y_acc(&adxl355_config); message->adxl355_rawZ = adxl355_raw_z_acc(&adxl355_config); message->adxl355_rawT = adxl355_raw_temp(&adxl355_config); message->adxl354_rawX = 3; message->adxl354_rawY = 3; message->adxl354_rawZ = 3; message->adxl354_rawT = 3; message->colibrys_rawVal = 4; message->colibrys_rawTEMPval = 4; queue.put(message); adxl355_newData_error = 0; GREENpin = 0; } } /* THREAD NUOVI DATI ADXL355 */ Thread adxl355Thread(adxl355_newData); /* FUNZIONE DI GESTIONE DELL'INTERRUPT ADXL355 */ void adxl355_int_handler(void) { VIOLApin = 1; adxl355_int_index++; if(adxl355_int_index == 5) { adxl355_int_timestamp = HAL_GetTick(); adxl355_int_index = 0; adxl355Thread.signal_set(ADXL355_SIGNAL); }else{}; // adxl355Thread.signal_set(ADXL355_SIGNAL); VIOLApin = 0; } /* FUNZIONE DI GESTIONE INTERRUPT PULSANTE */ void pressed(void) { button_int_f = true; } int main() { uint16_t u16error; start_writing = false; button_int_f = false; file_index = 0; adxl355_int_timestamp = 0; adxl355_int_index = 0; led_pin = 0; BLUpin = 0; GREENpin = 0; VIOLApin = 0; /* Impulso che segnala l'avvio del codice */ YELLOWpin = 0; YELLOWpin = 1; YELLOWpin = 0; /* Setting SPI */ spiHandler.frequency(SPI_FREQUENCY_HZ); spiHandler.format(8, 0);//POL = 0; PHA = 0 /* Setting interrupt su pin accelerometro */ adxl355_int.rise(&adxl355_int_handler); /* Setting interrupt pulsante */ user_button.fall(&pressed); /* Init ADXL355 */ u16error = adxl355_init(&adxl355_config); if(u16error != 0) { //VIOLApin = !VIOLApin; }else{} /* Init SD CARD reader */ sd.init(); fs.mount(&sd); fp = fopen("/fs/mydata.csv", "w"); if(fp == NULL) { start_writing = false; led_pin = 0; } else { start_writing = true; fprintf(fp,"#;ERROR;TIMESTAMP;ACC_DIG_3A_X;ACC_DIG_3A_Y;ACC_DIG_3A_Z;ACC_DIG_3A_TEMP;ACC_AN_3A_X;ACC_AN_3A_Y;ACC_AN_3A_Z;ACC_AN_3A_TEMP;ACC_AN_1A_VAL;ACC_AN_1A_TEMP\r\n"); u16error = adxl355_start_acquisition(adxl355_both); if(u16error != 0) { led_pin = 0; fclose(fp); sd.deinit(); fs.unmount(); start_writing = false; }else { led_pin = 1; } } while(1) { Thread::wait(1000); } }