Mercurial > public > ostc4
annotate Discovery/Src/logbook_miniLive.c @ 610:ae7f8333c900
Added access to logbook marker data:
In previous version event data could only be stored in memory but read back and usage in the OSTC itself was not supported. After the events like a marker set by the diver may be retrieved from the log.
Added visualization of markers to T3_Profile view
| author | Ideenmodellierer |
|---|---|
| date | Thu, 14 Jan 2021 20:38:28 +0100 |
| parents | c56ed16dbd39 |
| children | bf574fb3efa0 |
| rev | line source |
|---|---|
| 38 | 1 /** |
| 2 ****************************************************************************** | |
| 3 * @copyright heinrichs weikamp | |
| 4 * @file logbook_miniLive.c | |
| 5 * @author heinrichs weikamp gmbh | |
| 6 * @date 13-March-2015 | |
| 7 * @version V0.0.1 | |
| 8 * @since 13-March-2015 | |
| 9 * @brief little logbook for during the dive | |
| 10 * @bug | |
| 11 * @warning | |
| 12 ****************************************************************************** | |
| 13 * @attention | |
| 14 * | |
| 15 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
| 16 * | |
| 17 ****************************************************************************** | |
| 18 */ | |
| 19 | |
| 20 /* Includes ------------------------------------------------------------------*/ | |
| 598 | 21 |
| 22 | |
| 23 #include <string.h> | |
| 38 | 24 #include "logbook_miniLive.h" |
| 25 #include "data_exchange.h" | |
| 598 | 26 #include "logbook.h" |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
27 #include "tHome.h" |
| 38 | 28 |
| 29 /* | |
| 30 ****************************************************************************** | |
| 31 * @brief t7_updateMiniLiveLogbook. / Create depth samples for view during dive | |
| 32 * @author heinrichs weikamp gmbh | |
| 33 * @version V0.0.1 | |
| 34 * @date 13-March-2015 | |
| 35 ****************************************************************************** | |
| 36 * | |
| 37 */ | |
| 38 | |
| 39 #define MLLsize (296) | |
|
300
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
40 static uint16_t MLLdataDepth[MLLsize]; |
|
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
41 static uint16_t MLLpointer = 0; |
|
5ca177d2df5d
cleanup: remove commented/unused code, make static
Jan Mulder <jlmulder@xs4all.nl>
parents:
38
diff
changeset
|
42 static uint8_t MLLtickIntervallSeconds = 2; |
| 598 | 43 |
| 44 /* Replay Block data storage */ | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
45 #define DEPTH_DATA_LENGTH (1800u) /* Resolution: 1 hours dive, sampling every 2 seconds */ |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
46 uint16_t ReplayDepthData[DEPTH_DATA_LENGTH]; |
| 610 | 47 uint8_t ReplayMarkerData[DEPTH_DATA_LENGTH]; |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
48 uint16_t liveDepthData[DEPTH_DATA_LENGTH]; |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
49 uint16_t liveDecoData[DEPTH_DATA_LENGTH]; |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
50 static uint16_t lifeDataIndex = 0; |
| 598 | 51 |
| 52 static uint8_t ReplayDataResolution = 2; /* Time represented by one sample (second) */ | |
| 53 static uint16_t ReplayDataLength = 0; /* Number of data entries */ | |
| 54 static uint16_t ReplayDataMaxDepth = 0; | |
| 55 static uint16_t ReplayDataMinutes = 0; | |
| 56 static uint16_t ReplayDataOffset = 0xFFFF; /* Stepbackwards format used by log functions */ | |
| 38 | 57 |
| 58 uint16_t *getMiniLiveLogbookPointerToData(void) | |
| 59 { | |
| 60 return MLLdataDepth; | |
| 61 } | |
| 62 | |
| 63 | |
| 64 uint16_t getMiniLiveLogbookActualDataLength(void) | |
| 65 { | |
| 66 return MLLpointer; | |
| 67 } | |
| 68 | |
| 598 | 69 void compressBuffer_uint16(uint16_t* pdata, uint16_t size) |
| 70 { | |
| 71 uint16_t* pTarget = pdata; | |
| 72 uint16_t* pSource = pdata; | |
| 610 | 73 uint16_t result = 0; |
| 38 | 74 |
| 598 | 75 uint16_t index = 0; |
| 38 | 76 |
| 598 | 77 for(index = 0; index < size/2; index++) |
| 78 { | |
| 79 *pTarget = *pSource++; | |
| 80 *pTarget += *pSource++; | |
| 610 | 81 result = *pTarget /= 2; |
| 82 if((*pTarget != 0) && (result == 0)) /* avoid termination of information by round up to 1 */ | |
| 83 { | |
| 84 *pTarget++ = 1; | |
| 85 } | |
| 86 else | |
| 87 { | |
| 88 *pTarget++ = result; | |
| 89 } | |
| 598 | 90 } |
| 91 memset(pTarget,0,size/2); | |
| 92 } | |
| 93 | |
| 38 | 94 void updateMiniLiveLogbook( _Bool checkOncePerSecond) |
| 95 { | |
| 96 static uint8_t bDiveMode = 0; | |
| 97 static uint32_t last_second = 0; | |
| 98 static uint8_t secondsCount = 0; | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
99 static uint8_t lifesecondsCount = 0; |
| 38 | 100 |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
101 const SDecoinfo* pDecoinfo; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
102 uint8_t stopDepth = 0; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
103 uint16_t stopTime = 0; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
104 |
| 38 | 105 if(checkOncePerSecond) |
| 106 { | |
| 107 uint32_t now = current_second(); | |
| 108 if( last_second == now) | |
| 109 return; | |
| 110 last_second = now; | |
| 111 } | |
| 112 secondsCount++; | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
113 lifesecondsCount++; |
| 38 | 114 |
| 115 if(!bDiveMode) | |
| 116 { | |
| 117 if((stateUsed->mode == MODE_DIVE) && (stateUsed->lifeData.dive_time_seconds >= 5)) | |
| 118 { | |
| 119 secondsCount = 0; | |
| 120 MLLtickIntervallSeconds = 2; | |
| 121 bDiveMode = 1; | |
| 122 MLLpointer = 1; | |
| 123 for(int i=0;i<MLLsize;i++) | |
| 124 MLLdataDepth[i] = 0; | |
| 598 | 125 |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
126 for(lifeDataIndex = 0; lifeDataIndex < DEPTH_DATA_LENGTH; lifeDataIndex++) |
| 598 | 127 { |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
128 liveDepthData[lifeDataIndex] = 0xFFFF; |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
129 liveDecoData[lifeDataIndex] = 0xFFFF; |
| 598 | 130 } |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
131 lifesecondsCount = 0; |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
132 lifeDataIndex = 0; |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
133 liveDepthData[lifeDataIndex++] = 0; /* start at 0 */ |
| 38 | 134 } |
| 135 } | |
| 136 else if(stateUsed->mode == MODE_DIVE) | |
| 137 { | |
| 138 bDiveMode = 3; | |
| 139 // | |
| 140 if(secondsCount >= MLLtickIntervallSeconds) | |
| 141 { | |
| 142 secondsCount = 0; | |
| 598 | 143 /* in case of a buffer overrun the buffer is divided and the first half is filled with a compressed image of the complete buffer */ |
| 38 | 144 if((MLLpointer >= MLLsize) && (MLLtickIntervallSeconds < 127)) |
| 145 { | |
| 146 MLLpointer = 0; | |
| 147 MLLtickIntervallSeconds *= 2; | |
| 598 | 148 |
| 149 compressBuffer_uint16(MLLdataDepth,MLLsize); | |
| 38 | 150 MLLpointer = MLLsize/2; |
| 151 } | |
| 152 if(MLLpointer < MLLsize) | |
| 153 MLLdataDepth[MLLpointer++] = (int)(stateUsed->lifeData.depth_meter * 10); | |
| 154 } | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
155 if(lifesecondsCount >= ReplayDataResolution) |
| 598 | 156 { |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
157 lifesecondsCount = 0; |
| 598 | 158 |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
159 if(lifeDataIndex >= DEPTH_DATA_LENGTH) /* compress data */ |
| 598 | 160 { |
| 161 ReplayDataResolution *= 2; | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
162 compressBuffer_uint16(liveDepthData,DEPTH_DATA_LENGTH); |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
163 compressBuffer_uint16(ReplayDepthData,DEPTH_DATA_LENGTH); /* also compress Replay data to siplify mapping between live and replay data */ |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
164 lifeDataIndex = DEPTH_DATA_LENGTH / 2; |
| 598 | 165 } |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
166 liveDepthData[lifeDataIndex] = (int)(stateUsed->lifeData.depth_meter * 100); |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
167 if(stateUsed->diveSettings.deco_type.ub.standard == VPM_MODE) |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
168 { |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
169 pDecoinfo = &stateUsed->decolistVPM; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
170 } |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
171 else |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
172 { |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
173 pDecoinfo = &stateUsed->decolistBuehlmann; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
174 } |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
175 tHome_findNextStop(pDecoinfo->output_stop_length_seconds, &stopDepth, &stopTime); |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
176 if(stopDepth) |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
177 { |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
178 liveDecoData[lifeDataIndex] = stopDepth * 100; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
179 } |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
180 else |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
181 { |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
182 liveDecoData[lifeDataIndex] = 0xFFFF; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
183 } |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
184 lifeDataIndex++; |
| 598 | 185 } |
| 38 | 186 } |
| 187 else if(bDiveMode == 3) | |
| 188 { | |
| 189 //End of Dive | |
| 190 for(int i=0;i<MLLsize;i++) | |
| 191 MLLdataDepth[i] = 0; | |
| 192 bDiveMode = 0; | |
| 193 } | |
| 194 } | |
| 195 | |
| 598 | 196 uint8_t prepareReplayLog(uint8_t StepBackwards) |
| 197 { | |
| 198 uint8_t retVal = 0; | |
| 610 | 199 uint16_t index = 0; |
| 598 | 200 uint16_t dataLength = 0; |
| 610 | 201 uint8_t markerDetected = 0; |
| 38 | 202 |
| 598 | 203 SLogbookHeader logbookHeader; |
| 204 | |
| 205 if(ReplayDataOffset == StepBackwards) /* Entry already selected => reset selection */ | |
| 206 { | |
| 207 ReplayDataOffset = 0xFFFF; | |
| 208 ReplayDataResolution = 2; | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
209 ReplayDataLength = 0; |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
210 ReplayDataMaxDepth = 0; |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
211 ReplayDataMinutes = 0; |
|
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
212 |
| 598 | 213 retVal = 1; |
| 214 } | |
| 215 else | |
| 216 { | |
| 217 ReplayDataOffset = StepBackwards; | |
| 218 logbook_getHeader(StepBackwards ,&logbookHeader); | |
| 219 | |
| 610 | 220 dataLength = logbook_readSampleData(StepBackwards, DEPTH_DATA_LENGTH, ReplayDepthData,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ReplayMarkerData); |
| 221 | |
| 222 /* check if a marker is provided. If not disable marker functionality for the replay block */ | |
| 223 for(index = 0; index < dataLength; index++) | |
| 224 { | |
| 225 if(ReplayMarkerData[index] != 0) | |
| 226 { | |
| 227 markerDetected = 1; | |
| 228 break; | |
| 229 } | |
| 230 } | |
| 231 if(markerDetected == 0) | |
| 232 { | |
| 233 ReplayMarkerData[0] = 0xFF; | |
| 234 } | |
| 598 | 235 |
| 236 if( dataLength == DEPTH_DATA_LENGTH) /* log data has been compressed to fit into buffer */ | |
| 237 { | |
| 238 ReplayDataResolution = (logbookHeader.diveTimeMinutes * 60 + logbookHeader.diveTimeSeconds) / dataLength; | |
| 239 } | |
| 240 else | |
| 241 { | |
| 242 ReplayDataResolution = logbookHeader.samplingRate; | |
| 243 } | |
| 244 ReplayDataLength = dataLength; | |
| 245 ReplayDataMaxDepth = logbookHeader.maxDepth; | |
| 246 ReplayDataMinutes = logbookHeader.diveTimeMinutes; | |
| 247 if(dataLength != 0) | |
| 248 { | |
| 249 retVal = 1; | |
| 250 } | |
| 251 } | |
| 252 return retVal; | |
| 253 } | |
| 254 | |
| 610 | 255 uint8_t getReplayInfo(uint16_t** pReplayData, uint8_t** pReplayMarker, uint16_t* DataLength, uint16_t* MaxDepth, uint16_t* diveMinutes) |
| 598 | 256 { |
| 257 uint8_t retVal = 0; | |
| 258 | |
| 610 | 259 if((ReplayDataOffset != 0xFFFF) && (pReplayData != NULL) && (DataLength != NULL) && (MaxDepth != NULL) && (pReplayMarker != 0)) |
| 598 | 260 { |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
261 *pReplayData = ReplayDepthData; |
| 610 | 262 *pReplayMarker = ReplayMarkerData; |
| 598 | 263 *DataLength = ReplayDataLength; |
| 264 *MaxDepth = ReplayDataMaxDepth; | |
| 265 *diveMinutes = ReplayDataMinutes; | |
| 266 retVal = 1; | |
| 267 } | |
| 268 | |
| 269 return retVal; | |
| 270 } | |
| 271 | |
| 272 uint16_t *getMiniLiveReplayPointerToData(void) | |
| 273 { | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
274 return liveDepthData; |
| 598 | 275 } |
|
603
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
276 uint16_t *getMiniLiveDecoPointerToData(void) |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
277 { |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
278 return liveDecoData; |
|
c56ed16dbd39
T3 profile view: Added visualization of deco data
Ideenmodellierer
parents:
602
diff
changeset
|
279 } |
| 598 | 280 uint16_t getMiniLiveReplayLength(void) |
| 281 { | |
|
602
2cb0a97a07ad
Added replay data scaling in case life data is longer than replay block
Ideenmodellierer
parents:
598
diff
changeset
|
282 return lifeDataIndex; |
| 598 | 283 } |
| 284 | |
| 285 uint16_t getReplayOffset(void) | |
| 286 { | |
| 287 return ReplayDataOffset; | |
| 288 } | |
| 289 | |
| 290 uint16_t getReplayDataResolution(void) | |
| 291 { | |
| 292 return ReplayDataResolution; | |
| 293 } | |
| 38 | 294 |
| 295 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |
