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
dataRecorder.cpp@9:a2ba4015796e, 2018-04-06 (annotated)
- Committer:
- DVLevine
- Date:
- Fri Apr 06 04:01:33 2018 +0000
- Revision:
- 9:a2ba4015796e
- Parent:
- 5:0a4ff027086c
- Child:
- 10:f5fdba83488a
removed some print statements for speed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DVLevine |
1:45627bbdeb69 | 1 | #include "dataRecorder.h" |
DVLevine | 0:ebe71c7e7854 | 2 | |
DVLevine |
1:45627bbdeb69 | 3 | /* CONSTRUCTOR*/ |
DVLevine |
3:df8fb1b5d868 | 4 | DataRecorder::DataRecorder(){ |
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 |
3:df8fb1b5d868 | 10 | } |
DVLevine | 0:ebe71c7e7854 | 11 | |
DVLevine | 0:ebe71c7e7854 | 12 | |
DVLevine |
1:45627bbdeb69 | 13 | /* PUBLIC METHODS */ |
DVLevine |
1:45627bbdeb69 | 14 | |
DVLevine |
2:c2cfb0ebc3bd | 15 | int DataRecorder::getDataQuantity(){ |
DVLevine |
1:45627bbdeb69 | 16 | return m_data_quantity; |
DVLevine |
1:45627bbdeb69 | 17 | } |
DVLevine |
1:45627bbdeb69 | 18 | |
DVLevine |
2:c2cfb0ebc3bd | 19 | int DataRecorder::getTimeStampQuantity(){ |
DVLevine |
2:c2cfb0ebc3bd | 20 | return m_time_quantity; |
DVLevine |
2:c2cfb0ebc3bd | 21 | } |
DVLevine |
2:c2cfb0ebc3bd | 22 | |
DVLevine |
1:45627bbdeb69 | 23 | |
DVLevine |
1:45627bbdeb69 | 24 | uint16_t DataRecorder::popLastDataPoint(){ |
DVLevine | 9:a2ba4015796e | 25 | //printf("pop data\n"); |
DVLevine |
5:0a4ff027086c | 26 | |
DVLevine |
2:c2cfb0ebc3bd | 27 | m_data_quantity--; |
DVLevine |
2:c2cfb0ebc3bd | 28 | if (m_data_quantity<0){ |
DVLevine |
2:c2cfb0ebc3bd | 29 | m_data_quantity=0; |
DVLevine |
2:c2cfb0ebc3bd | 30 | } |
DVLevine |
3:df8fb1b5d868 | 31 | uint16_t poppedData; |
DVLevine |
2:c2cfb0ebc3bd | 32 | if(!m_buf_data.empty()){ |
DVLevine |
3:df8fb1b5d868 | 33 | m_buf_data.pop(poppedData); |
DVLevine |
3:df8fb1b5d868 | 34 | return poppedData; |
DVLevine |
2:c2cfb0ebc3bd | 35 | }else{ |
DVLevine |
2:c2cfb0ebc3bd | 36 | return (uint16_t)0; |
DVLevine |
2:c2cfb0ebc3bd | 37 | } |
DVLevine |
2:c2cfb0ebc3bd | 38 | |
DVLevine |
1:45627bbdeb69 | 39 | } |
DVLevine |
1:45627bbdeb69 | 40 | |
DVLevine |
1:45627bbdeb69 | 41 | uint32_t DataRecorder::popLastTimeStamp(){ |
DVLevine | 9:a2ba4015796e | 42 | //printf("pop time\n"); |
DVLevine |
2:c2cfb0ebc3bd | 43 | m_time_quantity--; |
DVLevine |
2:c2cfb0ebc3bd | 44 | if (m_time_quantity<0){ |
DVLevine |
2:c2cfb0ebc3bd | 45 | m_time_quantity=0; |
DVLevine |
2:c2cfb0ebc3bd | 46 | } |
DVLevine |
2:c2cfb0ebc3bd | 47 | |
DVLevine |
3:df8fb1b5d868 | 48 | uint32_t poppedData; |
DVLevine |
3:df8fb1b5d868 | 49 | if(!m_buf_timestamp.empty()){ |
DVLevine |
3:df8fb1b5d868 | 50 | m_buf_timestamp.pop(poppedData); |
DVLevine |
3:df8fb1b5d868 | 51 | return poppedData; |
DVLevine |
2:c2cfb0ebc3bd | 52 | }else{ |
DVLevine |
2:c2cfb0ebc3bd | 53 | return (uint16_t)0; |
DVLevine |
2:c2cfb0ebc3bd | 54 | } |
DVLevine |
2:c2cfb0ebc3bd | 55 | |
DVLevine |
1:45627bbdeb69 | 56 | } |
DVLevine |
1:45627bbdeb69 | 57 | |
DVLevine |
1:45627bbdeb69 | 58 | void DataRecorder::logDistancePoint(uint16_t value){ |
DVLevine | 9:a2ba4015796e | 59 | //printf("push distance\n"); |
DVLevine |
2:c2cfb0ebc3bd | 60 | m_data_quantity++; |
DVLevine |
2:c2cfb0ebc3bd | 61 | if (m_data_quantity>BUF_SIZE){ |
DVLevine |
2:c2cfb0ebc3bd | 62 | m_data_quantity=BUF_SIZE; |
DVLevine |
2:c2cfb0ebc3bd | 63 | } |
DVLevine |
1:45627bbdeb69 | 64 | m_buf_data.push(value); |
DVLevine |
1:45627bbdeb69 | 65 | } |
DVLevine |
1:45627bbdeb69 | 66 | |
DVLevine |
1:45627bbdeb69 | 67 | void DataRecorder::logTimeStamp(uint32_t value){ |
DVLevine | 9:a2ba4015796e | 68 | //printf("push time\n"); |
DVLevine |
2:c2cfb0ebc3bd | 69 | m_time_quantity++; |
DVLevine |
2:c2cfb0ebc3bd | 70 | if (m_time_quantity>BUF_SIZE){ |
DVLevine |
2:c2cfb0ebc3bd | 71 | m_time_quantity=BUF_SIZE; |
DVLevine |
2:c2cfb0ebc3bd | 72 | } |
DVLevine |
1:45627bbdeb69 | 73 | m_buf_timestamp.push(value); |
DVLevine |
1:45627bbdeb69 | 74 | } |
DVLevine |
2:c2cfb0ebc3bd | 75 | |
DVLevine |
5:0a4ff027086c | 76 | //helpers |
DVLevine |
5:0a4ff027086c | 77 | int getoSize(int* p){ |
DVLevine |
5:0a4ff027086c | 78 | printf("reg p %i \n",sizeof(p)); |
DVLevine |
5:0a4ff027086c | 79 | printf("star p %i \n",sizeof(*p)); |
DVLevine |
5:0a4ff027086c | 80 | |
DVLevine |
5:0a4ff027086c | 81 | return (sizeof(p)/sizeof(*p)); |
DVLevine |
5:0a4ff027086c | 82 | } |
DVLevine |
5:0a4ff027086c | 83 | |
DVLevine |
5:0a4ff027086c | 84 | int getoSize(uint16_t* p){ |
DVLevine |
5:0a4ff027086c | 85 | return (sizeof(p)/sizeof(*p)); |
DVLevine |
5:0a4ff027086c | 86 | } |
DVLevine |
5:0a4ff027086c | 87 | |
DVLevine |
5:0a4ff027086c | 88 | |
DVLevine |
1:45627bbdeb69 | 89 | /** Save logged data to SD card **/ |
DVLevine |
1:45627bbdeb69 | 90 | void DataRecorder::saveLoggedData(string filename){ |
DVLevine |
1:45627bbdeb69 | 91 | //iterate over buffer and use the sd card commands |
DVLevine |
5:0a4ff027086c | 92 | |
DVLevine |
5:0a4ff027086c | 93 | printf("before logging, data quantity is %i\n",m_data_quantity); |
DVLevine |
3:df8fb1b5d868 | 94 | |
DVLevine |
5:0a4ff027086c | 95 | int numPoints = m_data_quantity; //add check for timestamps |
DVLevine |
5:0a4ff027086c | 96 | |
DVLevine |
5:0a4ff027086c | 97 | vector<int> indexArr(numPoints); |
DVLevine |
5:0a4ff027086c | 98 | //int indexArr[numPoints]; |
DVLevine |
5:0a4ff027086c | 99 | |
DVLevine |
5:0a4ff027086c | 100 | //index setting |
DVLevine |
5:0a4ff027086c | 101 | for (int i = numPoints-1; i >=0 ; i--){ |
DVLevine |
2:c2cfb0ebc3bd | 102 | indexArr[i] = i; |
DVLevine |
2:c2cfb0ebc3bd | 103 | } |
DVLevine |
5:0a4ff027086c | 104 | |
DVLevine |
5:0a4ff027086c | 105 | vector<uint32_t> timeArr(numPoints); |
DVLevine |
5:0a4ff027086c | 106 | vector<vector <uint16_t> > allDataArr(numPoints); |
DVLevine |
2:c2cfb0ebc3bd | 107 | |
DVLevine |
5:0a4ff027086c | 108 | //uint32_t timeArr[numPoints]; |
DVLevine |
5:0a4ff027086c | 109 | //uint16_t* allDataArr[numPoints]; |
DVLevine |
1:45627bbdeb69 | 110 | |
DVLevine |
3:df8fb1b5d868 | 111 | for (int i = 0; i < numPoints; i++){ |
DVLevine |
5:0a4ff027086c | 112 | //time aggregation |
DVLevine |
5:0a4ff027086c | 113 | timeArr[i] = popLastTimeStamp(); |
DVLevine |
5:0a4ff027086c | 114 | |
DVLevine |
5:0a4ff027086c | 115 | //data aggregation |
DVLevine |
5:0a4ff027086c | 116 | vector<uint16_t> dataEntry(1); |
DVLevine |
5:0a4ff027086c | 117 | dataEntry[0] = popLastDataPoint(); |
DVLevine |
2:c2cfb0ebc3bd | 118 | allDataArr[i] = dataEntry; |
DVLevine |
5:0a4ff027086c | 119 | printf("%i\n",static_cast<int>(dataEntry[0])); |
DVLevine |
2:c2cfb0ebc3bd | 120 | } |
DVLevine |
5:0a4ff027086c | 121 | |
DVLevine |
5:0a4ff027086c | 122 | printf("Before launch! size test %i \n",indexArr.size()); |
DVLevine |
2:c2cfb0ebc3bd | 123 | |
DVLevine |
2:c2cfb0ebc3bd | 124 | m_saveBuddy->fullWriteProcedure(filename,indexArr,timeArr,allDataArr); |
DVLevine |
1:45627bbdeb69 | 125 | } |
DVLevine |
1:45627bbdeb69 | 126 | //saves buffer to sd card and clears it |
DVLevine |
1:45627bbdeb69 | 127 | void DataRecorder::saveLoggedDataAndClearBuffer(string filename){ |
DVLevine |
1:45627bbdeb69 | 128 | saveLoggedData(filename); |
DVLevine |
1:45627bbdeb69 | 129 | // then eraseBuffers(); |
DVLevine |
1:45627bbdeb69 | 130 | } |