Davide Urbano
/
microSDreader
Working version. ADXL355 data saved to microSD.
Diff: main.cpp
- Revision:
- 0:e2579e8d9b13
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Sep 29 12:53:50 2017 +0000 @@ -0,0 +1,264 @@ +#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); + } + +}