Mercurial > public > ostc4
annotate Discovery/Src/logbook_miniLive.c @ 619:8fa2de4414a8
Added t3 quick menu for marker synchronisation:
By selecting the "Check" optin of the quickmenu available in the T3_Profile view only, the live profile data may be syncronised with the marker data stored in the log profile. The implementation does not mentain a history storage. In case all markes have been checked the next check will cause the live data to be shown. another check will then map the profile again to the first marker.
To support this functionality menu infra structures have been added to the menu handling functions.
author | Ideenmodellierer |
---|---|
date | Wed, 27 Jan 2021 22:10:11 +0100 |
parents | ae7f8333c900 |
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****/ |