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****/ |