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:
Wed Jul 11 07:06:04 2018 -0400
Revision:
13:91350588d530
Parent:
12:c09a50d9469a
added /fs/ to be able to actually read and write to text file denoting log number

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 }
DVLevine 12:c09a50d9469a 140
DVLevine 12:c09a50d9469a 141 int DataRecorder::getTrialNumAndIncrement(){
DVLevine 13:91350588d530 142 return m_saveBuddy->readAndIncrement("/fs/trialNum.txt");
DVLevine 12:c09a50d9469a 143 }