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@5:0a4ff027086c, 2018-04-05 (annotated)
- Committer:
- DVLevine
- Date:
- Thu Apr 05 04:08:32 2018 -0400
- Revision:
- 5:0a4ff027086c
- Parent:
- 3:df8fb1b5d868
- Child:
- 9:a2ba4015796e
bugs ironed out. Uses circular buffer and saves information.
Some last bug where last data of row (third col) always shows up as some weird number. Fixing now...
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 |
5:0a4ff027086c | 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 |
5:0a4ff027086c | 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 |
5:0a4ff027086c | 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 |
5:0a4ff027086c | 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 | } |