A set of data recording functions to locally store data in a circular buffer, with functions for offloading to an SD Card when convenient. dataRecorderr.h shows accessible functions to the main program - all direct SD operations are abstracted away by the library. When using this library, #include dataRecorder.h

Dependencies:   sd-driver_compatible_with_MAX32630FTHR

Fork of CircularBufferSDCardLib by Daniel Levine

Committer:
DVLevine
Date:
Tue Apr 10 23:49:52 2018 -0400
Revision:
11:c70e8305ddd7
Parent:
10:f5fdba83488a
Child:
12:c09a50d9469a
Fixed SD Card. Get Kalman Angle and prox, with arbitrarily many data fields as needed now. Also added indicator light - red for logging, green for in process of saving. Blue is defautly there to let know that system IMU is working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DVLevine 1:45627bbdeb69 1 #include "dataRecorder.h"
DVLevine 0:ebe71c7e7854 2
DVLevine 1:45627bbdeb69 3 /* CONSTRUCTOR*/
DVLevine 10:f5fdba83488a 4 DataRecorder::DataRecorder(int numDataFields){
DVLevine 1:45627bbdeb69 5 //Initialize SDCard Reader Class
DVLevine 1:45627bbdeb69 6 m_saveBuddy = new SDCardReader();
DVLevine 1:45627bbdeb69 7
DVLevine 1:45627bbdeb69 8 //Initialize data quantity as 0
DVLevine 1:45627bbdeb69 9 m_data_quantity = 0;
DVLevine 11:c70e8305ddd7 10
DVLevine 11:c70e8305ddd7 11 //initialize num fields
DVLevine 11:c70e8305ddd7 12 m_numDataFields = numDataFields;
DVLevine 3:df8fb1b5d868 13 }
DVLevine 0:ebe71c7e7854 14
DVLevine 0:ebe71c7e7854 15
DVLevine 1:45627bbdeb69 16 /* PUBLIC METHODS */
DVLevine 1:45627bbdeb69 17
DVLevine 2:c2cfb0ebc3bd 18 int DataRecorder::getDataQuantity(){
DVLevine 1:45627bbdeb69 19 return m_data_quantity;
DVLevine 1:45627bbdeb69 20 }
DVLevine 1:45627bbdeb69 21
DVLevine 2:c2cfb0ebc3bd 22 int DataRecorder::getTimeStampQuantity(){
DVLevine 2:c2cfb0ebc3bd 23 return m_time_quantity;
DVLevine 2:c2cfb0ebc3bd 24 }
DVLevine 2:c2cfb0ebc3bd 25
DVLevine 1:45627bbdeb69 26
DVLevine 1:45627bbdeb69 27 uint16_t DataRecorder::popLastDataPoint(){
DVLevine 9:a2ba4015796e 28 //printf("pop data\n");
DVLevine 5:0a4ff027086c 29
DVLevine 2:c2cfb0ebc3bd 30 m_data_quantity--;
DVLevine 2:c2cfb0ebc3bd 31 if (m_data_quantity<0){
DVLevine 2:c2cfb0ebc3bd 32 m_data_quantity=0;
DVLevine 2:c2cfb0ebc3bd 33 }
DVLevine 3:df8fb1b5d868 34 uint16_t poppedData;
DVLevine 2:c2cfb0ebc3bd 35 if(!m_buf_data.empty()){
DVLevine 3:df8fb1b5d868 36 m_buf_data.pop(poppedData);
DVLevine 3:df8fb1b5d868 37 return poppedData;
DVLevine 2:c2cfb0ebc3bd 38 }else{
DVLevine 2:c2cfb0ebc3bd 39 return (uint16_t)0;
DVLevine 2:c2cfb0ebc3bd 40 }
DVLevine 2:c2cfb0ebc3bd 41
DVLevine 1:45627bbdeb69 42 }
DVLevine 1:45627bbdeb69 43
DVLevine 1:45627bbdeb69 44 uint32_t DataRecorder::popLastTimeStamp(){
DVLevine 9:a2ba4015796e 45 //printf("pop time\n");
DVLevine 2:c2cfb0ebc3bd 46 m_time_quantity--;
DVLevine 2:c2cfb0ebc3bd 47 if (m_time_quantity<0){
DVLevine 2:c2cfb0ebc3bd 48 m_time_quantity=0;
DVLevine 2:c2cfb0ebc3bd 49 }
DVLevine 2:c2cfb0ebc3bd 50
DVLevine 3:df8fb1b5d868 51 uint32_t poppedData;
DVLevine 3:df8fb1b5d868 52 if(!m_buf_timestamp.empty()){
DVLevine 3:df8fb1b5d868 53 m_buf_timestamp.pop(poppedData);
DVLevine 3:df8fb1b5d868 54 return poppedData;
DVLevine 2:c2cfb0ebc3bd 55 }else{
DVLevine 2:c2cfb0ebc3bd 56 return (uint16_t)0;
DVLevine 2:c2cfb0ebc3bd 57 }
DVLevine 2:c2cfb0ebc3bd 58
DVLevine 1:45627bbdeb69 59 }
DVLevine 1:45627bbdeb69 60
DVLevine 1:45627bbdeb69 61 void DataRecorder::logDistancePoint(uint16_t value){
DVLevine 9:a2ba4015796e 62 //printf("push distance\n");
DVLevine 2:c2cfb0ebc3bd 63 m_data_quantity++;
DVLevine 2:c2cfb0ebc3bd 64 if (m_data_quantity>BUF_SIZE){
DVLevine 2:c2cfb0ebc3bd 65 m_data_quantity=BUF_SIZE;
DVLevine 2:c2cfb0ebc3bd 66 }
DVLevine 1:45627bbdeb69 67 m_buf_data.push(value);
DVLevine 1:45627bbdeb69 68 }
DVLevine 1:45627bbdeb69 69
DVLevine 1:45627bbdeb69 70 void DataRecorder::logTimeStamp(uint32_t value){
DVLevine 9:a2ba4015796e 71 //printf("push time\n");
DVLevine 2:c2cfb0ebc3bd 72 m_time_quantity++;
DVLevine 2:c2cfb0ebc3bd 73 if (m_time_quantity>BUF_SIZE){
DVLevine 2:c2cfb0ebc3bd 74 m_time_quantity=BUF_SIZE;
DVLevine 2:c2cfb0ebc3bd 75 }
DVLevine 1:45627bbdeb69 76 m_buf_timestamp.push(value);
DVLevine 1:45627bbdeb69 77 }
DVLevine 2:c2cfb0ebc3bd 78
DVLevine 5:0a4ff027086c 79 //helpers
DVLevine 5:0a4ff027086c 80 int getoSize(int* p){
DVLevine 5:0a4ff027086c 81 printf("reg p %i \n",sizeof(p));
DVLevine 5:0a4ff027086c 82 printf("star p %i \n",sizeof(*p));
DVLevine 5:0a4ff027086c 83
DVLevine 5:0a4ff027086c 84 return (sizeof(p)/sizeof(*p));
DVLevine 5:0a4ff027086c 85 }
DVLevine 5:0a4ff027086c 86
DVLevine 5:0a4ff027086c 87 int getoSize(uint16_t* p){
DVLevine 5:0a4ff027086c 88 return (sizeof(p)/sizeof(*p));
DVLevine 5:0a4ff027086c 89 }
DVLevine 5:0a4ff027086c 90
DVLevine 5:0a4ff027086c 91
DVLevine 1:45627bbdeb69 92 /** Save logged data to SD card **/
DVLevine 1:45627bbdeb69 93 void DataRecorder::saveLoggedData(string filename){
DVLevine 1:45627bbdeb69 94 //iterate over buffer and use the sd card commands
DVLevine 5:0a4ff027086c 95
DVLevine 5:0a4ff027086c 96 printf("before logging, data quantity is %i\n",m_data_quantity);
DVLevine 3:df8fb1b5d868 97
DVLevine 11:c70e8305ddd7 98 int numPoints = m_data_quantity/m_numDataFields; //add check for timestamps
DVLevine 5:0a4ff027086c 99
DVLevine 11:c70e8305ddd7 100 printf("numPoints %i \n ",numPoints);
DVLevine 11:c70e8305ddd7 101
DVLevine 5:0a4ff027086c 102 vector<int> indexArr(numPoints);
DVLevine 5:0a4ff027086c 103 //int indexArr[numPoints];
DVLevine 5:0a4ff027086c 104
DVLevine 5:0a4ff027086c 105 //index setting
DVLevine 5:0a4ff027086c 106 for (int i = numPoints-1; i >=0 ; i--){
DVLevine 2:c2cfb0ebc3bd 107 indexArr[i] = i;
DVLevine 2:c2cfb0ebc3bd 108 }
DVLevine 5:0a4ff027086c 109
DVLevine 5:0a4ff027086c 110 vector<uint32_t> timeArr(numPoints);
DVLevine 11:c70e8305ddd7 111 vector<uint16_t> dataEntry(m_numDataFields); //created before loop to see if prevent data collision
DVLevine 5:0a4ff027086c 112 vector<vector <uint16_t> > allDataArr(numPoints);
DVLevine 2:c2cfb0ebc3bd 113
DVLevine 5:0a4ff027086c 114 //uint32_t timeArr[numPoints];
DVLevine 5:0a4ff027086c 115 //uint16_t* allDataArr[numPoints];
DVLevine 1:45627bbdeb69 116
DVLevine 3:df8fb1b5d868 117 for (int i = 0; i < numPoints; i++){
DVLevine 5:0a4ff027086c 118 //time aggregation
DVLevine 5:0a4ff027086c 119 timeArr[i] = popLastTimeStamp();
DVLevine 11:c70e8305ddd7 120
DVLevine 5:0a4ff027086c 121 //data aggregation
DVLevine 11:c70e8305ddd7 122 // vector<uint16_t> dataEntry(m_numDataFields);
DVLevine 10:f5fdba83488a 123 for (int j=0;j<m_numDataFields;j++){
DVLevine 11:c70e8305ddd7 124 dataEntry[j] = popLastDataPoint();
DVLevine 11:c70e8305ddd7 125 printf("%i\n",dataEntry[j]);
DVLevine 10:f5fdba83488a 126 }
DVLevine 2:c2cfb0ebc3bd 127 allDataArr[i] = dataEntry;
DVLevine 11:c70e8305ddd7 128 // printf("%i\n",static_cast<int>(dataEntry[0]));
DVLevine 2:c2cfb0ebc3bd 129 }
DVLevine 5:0a4ff027086c 130
DVLevine 5:0a4ff027086c 131 printf("Before launch! size test %i \n",indexArr.size());
DVLevine 2:c2cfb0ebc3bd 132
DVLevine 2:c2cfb0ebc3bd 133 m_saveBuddy->fullWriteProcedure(filename,indexArr,timeArr,allDataArr);
DVLevine 1:45627bbdeb69 134 }
DVLevine 1:45627bbdeb69 135 //saves buffer to sd card and clears it
DVLevine 1:45627bbdeb69 136 void DataRecorder::saveLoggedDataAndClearBuffer(string filename){
DVLevine 1:45627bbdeb69 137 saveLoggedData(filename);
DVLevine 1:45627bbdeb69 138 // then eraseBuffers();
DVLevine 1:45627bbdeb69 139 }