Davide Urbano / Mbed OS microSDreader
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "SDBlockDevice.h"
00004 #include "FATFileSystem.h"
00005 #include "utility.h"
00006 
00007 
00008 /*
00009     FLAG SCRITTURA SU SD CARD IN CORSO
00010 */
00011 bool volatile start_writing;
00012 /*
00013     PULSANTE
00014 */
00015 bool volatile button_int_f;/* Flag pulsante pigiato */
00016 InterruptIn user_button(USER_KEY_PIN);
00017 /*
00018     OGGETTO FILE
00019 */ 
00020 FILE *fp = NULL;
00021 uint32_t file_index;//Indice che conteggia in maniera progressiva i record sul file
00022 /* 
00023     SD Card
00024 */
00025 SDBlockDevice sd(SDCARD_MOSI, SDCARD_MISO, SDCARD_SCK, SDCARD_CS, 8000000);
00026 FATFileSystem fs("fs");
00027 /*
00028     Bus SPI
00029 */
00030 SPI spiHandler(SPI_MOSI, SPI_MISO, SPI_SCK);
00031 DigitalOut spiADXL355cs(ADXL355_CS);// Pin di CS ADXL355
00032 /*
00033     ADXL355 
00034 */
00035 adxl355_handler adxl355_config =//Handler accelerometro  
00036 {
00037     .measure_range = adxl355_2g,
00038     .out_data_rate = adxl355_250hz,
00039     .drdy_pin = ADXL355_DRDY,
00040     .int1_pin = NULL,
00041     .int2_pin = NULL,
00042     .int_config = {}
00043 };
00044 InterruptIn adxl355_int((PinName)adxl355_config.drdy_pin);// Interrupt su pin accelerometro
00045 uint32_t adxl355_int_timestamp;//Timestamp registrato nella routine di interrupt
00046 uint8_t  adxl355_int_index;//Numero di interrupt consecutivi
00047 uint16_t adxl355_newData_error = 0;//Errore metodo
00048 //uint8_t  adxl355_newData_sample = 0;//Conteggio dei sample acquisiti
00049 uint32_t adxl355_newData_timestamp;//Timestamp rilevato al 5° sample
00050 /* Dati locali temporanei ADXL355 */
00051 //uint32_t adxl355_rawX_tmp = 0;
00052 //uint32_t adxl355_rawY_tmp = 0;
00053 //uint32_t adxl355_rawZ_tmp = 0;
00054 //uint32_t adxl355_rawT_tmp = 0;
00055 /*
00056     DEBUG PIN
00057 */
00058 DigitalOut BLUpin(DBG_PIN_2);
00059 DigitalOut YELLOWpin(DBG_PIN_4);
00060 DigitalOut GREENpin(DBG_PIN);
00061 DigitalOut VIOLApin(DBG_PIN_3);
00062 DigitalOut led_pin(STATUS_LED_PIN);
00063 /* 
00064     DEFINIZIONE CODA DATI 
00065 */
00066 MemoryPool<record_t, RECORD_NUMBER*RECORD_SIZE> mpool;
00067 Queue<record_t, RECORD_NUMBER*RECORD_SIZE> queue;
00068 /*
00069     SCRITTURA SU SD CARD
00070 */
00071 void writeOnSDcard(void)
00072 {
00073     while(1)
00074     {
00075         Thread::wait(10);
00076         osEvent evt = queue.get();
00077         if((evt.status == osEventMessage) && (start_writing == true))
00078         {
00079             record_t *message = (record_t*)evt.value.p;
00080             BLUpin = 1;                
00081             fprintf(fp, "%06d;%04x;%08d;%05x;%05x;%05x;%03x;%06x;%06x;%06x;%06x;%06x;%06x \r\n",
00082                         message->index,              //#
00083                         message->error,              //Error
00084                         message->timestamp,          //Timestamp
00085                         message->adxl355_rawX,       //ACC_DIG_3A_X
00086                         message->adxl355_rawY,       //ACC_DIG_3A_Y
00087                         message->adxl355_rawZ,       //ACC_DIG_3A_Z
00088                         message->adxl355_rawT,       //ACC_DIG_3A_TEMP
00089                         message->adxl354_rawX,       //ACC_AN_3A_X
00090                         message->adxl354_rawY,       //ACC_AN_3A_Y
00091                         message->adxl354_rawZ,       //ACC_AN_3A_Z
00092                         message->adxl354_rawT,       //ACC_AN_3A_TEMP
00093                         message->colibrys_rawVal,    //ACC_AN_1A_VAL
00094                         message->colibrys_rawTEMPval //ACC_AN_1A_TEMP
00095                         );
00096             BLUpin = 0;                
00097             mpool.free(message);
00098         }else{} 
00099         
00100         if((button_int_f == true)&&(start_writing == true))
00101         {
00102             fprintf(fp,"DATA END \r\n");
00103             fclose(fp);         // DO THIS AT THE END!!!
00104             sd.deinit();
00105             fs.unmount();
00106             start_writing = false;
00107             
00108             Thread::wait(100);
00109             if(adxl355_start_acquisition(adxl355_none) == 0)
00110             {
00111                 led_pin = 0; 
00112                 YELLOWpin = 1;    
00113             }else{}
00114                                           
00115         }else{}  
00116     }        
00117 }  
00118 /*
00119     THREAD SCRITTURA SU SD CARD
00120 */
00121 Thread writeSDthread(writeOnSDcard); 
00122 /* 
00123     NUOVI DATI ADXL355 
00124 */ 
00125 void adxl355_newData(void) 
00126 {      
00127     while (true) 
00128     {   // Signal flags that are reported as event are automatically cleared.
00129         Thread::signal_wait(ADXL355_SIGNAL);
00130         GREENpin = 1;       
00131         if(adxl355_get_data(&adxl355_config) != 0)
00132         {
00133             adxl355_newData_error |= 0xFF00; 
00134         }else{}
00135                    
00136         file_index++; 
00137         adxl355_newData_timestamp = HAL_GetTick();
00138         adxl355_newData_error |= (uint16_t)(adxl355_newData_timestamp - adxl355_int_timestamp);         
00139                                                        
00140         record_t *message = mpool.alloc();
00141         message->index = file_index;
00142         message->error = adxl355_newData_error;
00143         message->timestamp = adxl355_newData_timestamp;
00144             
00145         message->adxl355_rawX = adxl355_raw_x_acc(&adxl355_config);
00146         message->adxl355_rawY = adxl355_raw_y_acc(&adxl355_config);
00147         message->adxl355_rawZ = adxl355_raw_z_acc(&adxl355_config);       
00148         message->adxl355_rawT = adxl355_raw_temp(&adxl355_config);
00149             
00150         message->adxl354_rawX = 3;
00151         message->adxl354_rawY = 3;
00152         message->adxl354_rawZ = 3;            
00153         message->adxl354_rawT = 3;   
00154             
00155         message->colibrys_rawVal = 4;
00156         message->colibrys_rawTEMPval = 4;
00157         
00158         queue.put(message);  
00159         
00160         adxl355_newData_error = 0;
00161              
00162         GREENpin = 0; 
00163     }
00164 } 
00165 /* 
00166     THREAD NUOVI DATI ADXL355 
00167 */
00168 Thread adxl355Thread(adxl355_newData);
00169 /* 
00170     FUNZIONE DI GESTIONE DELL'INTERRUPT ADXL355 
00171 */
00172 void adxl355_int_handler(void) 
00173 {
00174     VIOLApin = 1;
00175     adxl355_int_index++;
00176     if(adxl355_int_index == 5)
00177     {
00178         adxl355_int_timestamp = HAL_GetTick();
00179         adxl355_int_index = 0;
00180         adxl355Thread.signal_set(ADXL355_SIGNAL);  
00181     }else{};
00182 //    adxl355Thread.signal_set(ADXL355_SIGNAL);        
00183     VIOLApin = 0;
00184 } 
00185 /* 
00186     FUNZIONE DI GESTIONE INTERRUPT PULSANTE 
00187 */
00188 void pressed(void)
00189 {       
00190     button_int_f = true;
00191 }
00192 
00193 
00194 
00195 
00196 int main() 
00197 {
00198     uint16_t u16error;
00199     
00200     start_writing = false;
00201     button_int_f = false;
00202     file_index = 0;    
00203     adxl355_int_timestamp = 0;    
00204     adxl355_int_index = 0;    
00205         
00206     led_pin = 0;    
00207         
00208     BLUpin = 0;
00209     GREENpin = 0;
00210     VIOLApin = 0;
00211     
00212     /* Impulso che segnala l'avvio del codice */
00213     YELLOWpin = 0;
00214     YELLOWpin = 1;
00215     YELLOWpin = 0;
00216 
00217     /* Setting SPI */    
00218     spiHandler.frequency(SPI_FREQUENCY_HZ);
00219     spiHandler.format(8, 0);//POL = 0; PHA = 0  
00220         
00221     /* Setting interrupt su pin accelerometro */
00222     adxl355_int.rise(&adxl355_int_handler);  
00223     /* Setting interrupt pulsante */
00224     user_button.fall(&pressed);
00225      
00226     /* Init ADXL355 */
00227     u16error  = adxl355_init(&adxl355_config);    
00228     if(u16error != 0)
00229     {
00230         //VIOLApin = !VIOLApin; 
00231     }else{}   
00232     /* Init SD CARD reader */        
00233     sd.init();
00234     fs.mount(&sd);
00235     fp = fopen("/fs/mydata.csv", "w");    
00236     if(fp == NULL) 
00237     {
00238         start_writing = false;
00239         led_pin = 0;
00240     }
00241     else
00242     {   
00243         start_writing = true;        
00244         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");        
00245         u16error = adxl355_start_acquisition(adxl355_both);
00246         if(u16error != 0)
00247         {
00248             led_pin = 0;
00249             fclose(fp);
00250             sd.deinit();
00251             fs.unmount();
00252             start_writing = false;
00253         }else
00254         {
00255             led_pin = 1;  
00256         }
00257     }    
00258     
00259     while(1)
00260     {
00261         Thread::wait(1000);        
00262     }
00263  
00264 }