Mercurial > public > ostc4
annotate Discovery/Src/logbook.c @ 426:514e6269256f ImprovmentNVM_2
Added function to analyse the sampel ringbuffer:
The function will show 0 for used sectors, 4 for the sector currently in use and 5 for empty sectors. This allows identification of log sample index position and identification of a buffer corruption (more than 2 sectors have state 4)
The repair function writes dummy bytes to the end of the active buffer with the lower sector number. This decision is based on the fact that corruption results typically in a reset of index to buffer start address. After repair the writing will be continued using the hugher buffer marked as used.
author | ideenmodellierer |
---|---|
date | Sat, 15 Feb 2020 20:50:58 +0100 |
parents | e908b894f107 |
children | b1091e183d52 |
rev | line source |
---|---|
38 | 1 /** |
2 ****************************************************************************** | |
3 * @copyright heinrichs weikamp | |
4 * @file logbook.c | |
5 * @author heinrichs weikamp gmbh and heinrichs weikamp gmbh | |
6 * @date 22-Apr-2014 | |
7 * @version V0.0.3 | |
8 * @since 03-Feb-2016 | |
9 * @brief Everything about creating and evaluating the logbook | |
10 * without the flash part which is included in externLogbookFlash.c | |
11 * and the USB/Bluetooth part in tComm.c | |
12 * CHANGE V0.0.3 hw: ppO2 sensor values | |
13 * CHANGE V0.0.4 hw: fix event bytes according to hwos_interface.odt dated 160610 in bitbucket hwOS | |
14 * @bug | |
15 * @warning | |
16 @verbatim | |
17 ============================================================================== | |
18 ##### Header ##### | |
19 ============================================================================== | |
20 [..] SLogbookHeader | |
21 The order has changed in comparsion to OSTC3 for perfect alignment | |
22 with 16bit and 32bit. The header is 256kB as well. | |
23 DO NOT rearrange anything but add new data to a second page | |
24 beyond diveHeaderEnd. Use extraPagesWithData to indicate that there is | |
25 data available that was not available in the OSTC3 256KB | |
26 This data will be behind the diveHeaderEnd. DO NOT delete diveHeaderEnd. | |
27 | |
28 [..] SLogbookHeaderOSTC3 | |
29 is the format used by the OSTC3. | |
30 logbook_getHeaderOSTC3() does the job using the global headers in logbook.c | |
31 | |
32 [..] SSmallHeader | |
33 - is the format used by the OSTC3 | |
34 | |
35 [..] Summary | |
36 The header format is not perfect and might be optimized prior to | |
37 releasing the diving computer. For now it is good to be compatible | |
38 with PC software available for checking the content of the logbook | |
39 | |
40 | |
41 @endverbatim | |
42 ****************************************************************************** | |
43 * @attention | |
44 * | |
45 * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> | |
46 * | |
47 ****************************************************************************** | |
48 */ | |
49 | |
50 /* Includes ------------------------------------------------------------------*/ | |
51 #include <stdint.h> | |
52 #include <string.h> | |
53 #include "logbook.h" | |
54 //#include "test_vpm.h" | |
55 #include "externLogbookFlash.h" | |
56 #include "data_exchange.h" | |
57 #include "decom.h" | |
58 #include "tHome.h" // for tHome_findNextStop() | |
59 | |
60 /* Private types -------------------------------------------------------------*/ | |
61 | |
62 #define NUM_GASES 5 | |
63 | |
64 #define LOGBOOK_VERSION (0x30) | |
65 #define LOGBOOK_VERSION_OSTC3 (0x24) | |
66 | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
67 #define DEFAULT_SAMPLES (100) /* Number of sample data bytes in case of an broken header information */ |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
68 |
38 | 69 typedef struct /* don't forget to adjust void clear_divisor(void) */ |
70 { | |
71 uint8_t temperature; | |
72 uint8_t deco_ndl; | |
73 uint8_t gradientFactor; | |
74 uint8_t ppo2; | |
75 uint8_t decoplan; | |
76 uint8_t cns; | |
77 uint8_t tank; | |
78 } SDivisor; | |
79 | |
80 /* Exported variables --------------------------------------------------------*/ | |
81 | |
82 /* Private variables ---------------------------------------------------------*/ | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
83 static SLogbookHeader gheader; |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
84 static SLogbookHeaderOSTC3 headerOSTC3; |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
85 static SLogbookHeaderOSTC3compact headerOSTC3compact; |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
86 static SSmallHeader smallHeader; |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
87 static SDivisor divisor; |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
88 static SDivisor divisorBackup; |
38 | 89 |
90 /* Private function prototypes -----------------------------------------------*/ | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
91 static void clear_divisor(void); |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
92 static void logbook_SetAverageDepth(float average_depth_meter); |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
93 static void logbook_SetMinTemperature(float min_temperature_celsius); |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
94 static void logbook_SetMaxCNS(float max_cns_percentage); |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
95 static void logbook_SetCompartmentDesaturation(const SDiveState * pStateReal); |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
96 static void logbook_SetLastStop(float last_stop_depth_bar); |
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
97 static void logbook_writedata(void * data, int length_byte); |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
98 static void logbook_UpdateHeader(const SDiveState * pStateReal); |
38 | 99 |
100 /* Exported functions --------------------------------------------------------*/ | |
101 | |
102 void logbook_EndDive(void) | |
103 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
104 ext_flash_close_new_dive_log((uint8_t*) &gheader); |
38 | 105 } |
106 | |
107 | |
108 // =============================================================================== | |
109 // logbook_last_totalDiveCount | |
110 /// @brief Fix setting issues | |
111 /// @date 04-April-2016 | |
112 /// | |
113 /// @return diveNumber (totalDiveCounter) of latest log entry, 0 if not a valid header | |
114 // =============================================================================== | |
115 uint16_t logbook_lastDive_diveNumber(void) | |
116 { | |
117 SLogbookHeader tempLogbookHeader; | |
118 if(logbook_getHeader(0, &tempLogbookHeader)) | |
119 { | |
120 return tempLogbookHeader.diveNumber; | |
121 } | |
122 else | |
123 { | |
124 return 0; | |
125 } | |
126 } | |
127 | |
128 | |
129 /** | |
130 ****************************************************************************** | |
131 * @brief logbook_getCurrentHeader. / | |
281 | 132 * @author heinrichs weikamp |
38 | 133 * @version V0.0.1 |
134 * @date 22-April-2014 | |
135 ****************************************************************************** | |
136 * | |
137 * @return SLogbookHeader*: | |
138 */ | |
139 SLogbookHeader* logbook_getCurrentHeader(void) | |
140 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
141 return &gheader; |
38 | 142 } |
143 | |
144 /** | |
145 ****************************************************************************** | |
146 * @brief logbook_getNumberOfHeaders. / | |
147 * @author heinrichs weikamp gmbh | |
148 * @version V0.0.1 | |
149 * @date 18-May-2016 | |
150 ****************************************************************************** | |
151 * | |
152 * @return uint8_t : number of valid headers (0xFAFA) found. | |
153 */ | |
154 uint8_t logbook_getNumberOfHeaders(void) | |
155 { | |
156 return ext_flash_count_dive_headers(); | |
157 } | |
158 | |
159 | |
160 /** | |
161 ****************************************************************************** | |
162 * @brief logbook_getHeader. / | |
281 | 163 * @author heinrichs weikamp |
38 | 164 * @version V0.0.1 |
165 * @date 22-April-2014 | |
166 ****************************************************************************** | |
167 * | |
168 * @param StepBackwards : 0 Last lokbook entry, 1 second to last entry, etc. | |
169 * @param SSLogbookHeader* pLogbookHeader: Output found LogbookHeader | |
170 * @return uint8_t : 1 = success | |
171 */ | |
172 uint8_t logbook_getHeader(uint8_t StepBackwards,SLogbookHeader* pLogbookHeader) | |
173 { | |
174 ext_flash_read_dive_header((uint8_t *)pLogbookHeader, StepBackwards); | |
175 if(pLogbookHeader->diveHeaderStart != 0xFAFA) | |
176 return 0; | |
177 else | |
178 return 1; | |
179 } | |
180 | |
181 /** | |
182 ****************************************************************************** | |
183 * @brief logbook_initNewdiveProfile. / | |
184 * creates header and smallHeader from diveState and global Settings | |
185 * and writes new lookboock entry on flash device | |
186 * diveState | |
281 | 187 * @author heinrichs weikamp |
38 | 188 * @version V0.0.1 |
189 * @date 22-April-2014 | |
190 ****************************************************************************** | |
191 * | |
192 * @param SDiveState* pInfo: Input | |
193 * @param SSettings* pSettings: Input | |
194 */ | |
195 | |
196 void logbook_initNewdiveProfile(const SDiveState* pInfo, SSettings* pSettings) | |
197 { | |
198 RTC_DateTypeDef Sdate; | |
199 RTC_TimeTypeDef Stime; | |
200 | |
201 for(int i = 0; i < sizeof(SLogbookHeader); i++) | |
202 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
203 ((uint8_t*)(&gheader))[i] = 0; |
38 | 204 } |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
205 gheader.diveHeaderStart = 0xFAFA; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
206 gheader.diveHeaderEnd = 0xFBFB; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
207 gheader.samplingRate = 2; |
38 | 208 if(pInfo->diveSettings.diveMode == DIVEMODE_OC) |
209 { | |
210 for(int i = 0; i < 5; i++) | |
211 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
212 gheader.gasordil[i].oxygen_percentage = pSettings->gas[i+1].oxygen_percentage; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
213 gheader.gasordil[i].helium_percentage = pSettings->gas[i+1].helium_percentage; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
214 gheader.gasordil[i].note.uw = pSettings->gas[i+1].note.uw; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
215 gheader.gasordil[i].depth_meter = pSettings->gas[i+1].depth_meter; |
38 | 216 } |
217 } | |
218 else | |
219 { | |
220 for(int i = 0; i < 5; i++) | |
221 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
222 gheader.gasordil[i].oxygen_percentage = pSettings->gas[i+6].oxygen_percentage; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
223 gheader.gasordil[i].helium_percentage = pSettings->gas[i+6].helium_percentage; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
224 gheader.gasordil[i].note.uw = pSettings->gas[i+6].note.uw; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
225 gheader.gasordil[i].depth_meter = pSettings->gas[i+6].depth_meter; |
38 | 226 } |
227 | |
228 for(int i = 0; i < 5; i++) | |
229 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
230 gheader.setpoint[i].setpoint_cbar = pSettings->setpoint[i+1].setpoint_cbar; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
231 gheader.setpoint[i].depth_meter = pSettings->setpoint[i+1].depth_meter; |
38 | 232 } |
233 } | |
234 // header.gasordil[pInfo->lifeData.actualGas.GasIdInSettings].depth_meter = 0; | |
235 | |
236 translateDate(pInfo->lifeData.dateBinaryFormat, &Sdate); | |
237 translateTime(pInfo->lifeData.timeBinaryFormat, &Stime); | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
238 gheader.dateYear = Sdate.Year; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
239 gheader.dateMonth = Sdate.Month; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
240 gheader.dateDay = Sdate.Date; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
241 gheader.timeHour = Stime.Hours; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
242 gheader.timeMinute = Stime.Minutes; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
243 gheader.cnsAtBeginning = (uint16_t)pInfo->lifeData.cns; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
244 gheader.surfacePressure_mbar = (uint16_t)(pInfo->lifeData.pressure_surface_bar * 1000); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
245 gheader.firmwareVersionHigh = firmwareVersion_16bit_high(); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
246 gheader.firmwareVersionLow = firmwareVersion_16bit_low(); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
247 gheader.logbookProfileVersion = LOGBOOK_VERSION; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
248 gheader.salinity = pSettings->salinity; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
249 gheader.diveNumber = pSettings->totalDiveCounter; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
250 gheader.personalDiveCount = pSettings->personalDiveCount; |
38 | 251 |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
252 gheader.diveMode = pInfo->diveSettings.diveMode; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
253 gheader.CCRmode = pInfo->diveSettings.CCR_Mode; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
254 gheader.lastDecostop_m = pSettings->last_stop_depth_meter; |
38 | 255 |
256 if(pInfo->diveSettings.deco_type.ub.standard == GF_MODE) | |
257 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
258 gheader.decoModel = 1; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
259 gheader.gfLow_or_Vpm_conservatism = pInfo->diveSettings.gf_low; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
260 gheader.gfHigh = pInfo->diveSettings.gf_high; |
38 | 261 } |
262 else | |
263 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
264 gheader.decoModel = 2; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
265 gheader.gfLow_or_Vpm_conservatism = pInfo->diveSettings.vpm_conservatism; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
266 gheader.gfHigh = 0; |
38 | 267 } |
268 | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
269 memcpy(gheader.n2Compartments, pInfo->lifeData.tissue_nitrogen_bar, 64); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
270 memcpy(gheader.heCompartments, pInfo->lifeData.tissue_helium_bar, 64); |
38 | 271 |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
272 logbook_SetCompartmentDesaturation(pInfo); |
38 | 273 |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
274 ext_flash_start_new_dive_log_and_set_actualPointerSample((uint8_t*)&gheader); |
38 | 275 |
276 smallHeader.profileLength[0] = 0xFF; | |
277 smallHeader.profileLength[1] = 0xFF; | |
278 smallHeader.profileLength[2] = 0xFF; | |
279 smallHeader.samplingRate_seconds = 2; | |
280 smallHeader.numDivisors = 7; | |
281 | |
282 smallHeader.tempType = 0; | |
283 smallHeader.tempLength = 2; | |
284 smallHeader.tempDivisor = 6; | |
285 | |
286 smallHeader.deco_ndlType = 1; | |
287 smallHeader.deco_ndlLength = 2; | |
288 smallHeader.deco_ndlDivisor = 6; //= 6; | |
289 | |
290 /* GF in % at actual position */ | |
291 smallHeader.gfType = 2; | |
292 smallHeader.gfLength = 1; | |
293 smallHeader.gfDivisor = 0; //12; | |
294 | |
295 /* 3 Sensors: 8bit ppO2 in 0.01bar, 16bit voltage in 0,1mV */ | |
296 smallHeader.ppo2Type = 3; | |
297 smallHeader.ppo2Length = 9; | |
298 smallHeader.ppo2Divisor = 2; //2 | |
299 | |
300 /* last 15 stops in minutes (last, second_to_last, ... */ | |
301 /* last stop depth is defined in header */ | |
302 smallHeader.decoplanType = 4; | |
303 smallHeader.decoplanLength = 15; | |
304 smallHeader.decoplanDivisor = 12;//12; | |
305 | |
306 smallHeader.cnsType = 5; | |
307 smallHeader.cnsLength = 2; | |
308 smallHeader.cnsDivisor = 12; | |
309 | |
310 smallHeader.tankType = 6; | |
311 smallHeader.tankLength = 0; | |
312 smallHeader.tankDivisor = 0; | |
313 | |
314 logbook_writedata((void *) &smallHeader,sizeof(smallHeader)); | |
315 | |
316 clear_divisor(); | |
317 } | |
318 | |
319 /** | |
320 ****************************************************************************** | |
321 * @brief clear_divisor / clears divisor struct | |
281 | 322 * @author heinrichs weikamp |
38 | 323 * @version V0.0.1 |
324 * @date 22-April-2014 | |
325 ****************************************************************************** | |
326 * | |
327 */ | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
328 static void clear_divisor(void) |
38 | 329 { |
330 divisor.cns = smallHeader.cnsDivisor - 1; | |
331 divisor.decoplan = smallHeader.decoplanDivisor - 1; | |
332 divisor.deco_ndl = smallHeader.deco_ndlDivisor - 1; | |
333 divisor.gradientFactor = smallHeader.gfDivisor -1 ; | |
334 divisor.ppo2 = smallHeader.ppo2Divisor - 1; | |
335 divisor.tank = smallHeader.tankDivisor - 1; | |
336 divisor.temperature = smallHeader.tempDivisor - 1; | |
337 } | |
338 | |
339 | |
340 /** | |
341 ****************************************************************************** | |
342 * @brief add16. / adds 16 bit variable to 8 bit array | |
281 | 343 * @author heinrichs weikamp |
38 | 344 * @version V0.0.1 |
345 * @date 22-April-2014 | |
346 ****************************************************************************** | |
347 * | |
348 * @param uint8_t *pos: Output 8 bit array | |
349 * @param uint16_t var: 16 bit variable | |
350 */ | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
351 static void addU16(uint8_t *pos, uint16_t var) |
38 | 352 { |
353 *((uint16_t*)pos) = var; | |
354 } | |
355 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
356 static void addS16(uint8_t *pos, int16_t var) |
38 | 357 { |
358 *((int16_t*)pos) = var; | |
359 } | |
360 | |
361 /** | |
362 ****************************************************************************** | |
363 * @brief logbook_writeSample. / Writes one logbook sampl | |
281 | 364 * @author heinrichs weikamp |
38 | 365 * @date 22-April-2014 |
366 * @version V0.0.2 | |
367 * @since 20-June-2016 | |
368 * @bug Deco/NDL Status fixed in V0.0.2 | |
369 | |
370 | |
371 ****************************************************************************** | |
372 * | |
373 * @param SDiveState state: | |
374 */ | |
375 | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
376 void logbook_writeSample(const SDiveState *state) |
38 | 377 { |
378 uint8_t sample[256]; | |
379 // int position = 0; | |
380 int length = 0; | |
381 // _Bool bEvent = 0; | |
382 uint8_t nextstopDepthMeter = 0; | |
383 uint16_t nextstopLengthSeconds = 0; | |
384 uint8_t nextstopLengthMinutes = 0; | |
385 bit8_Type eventByte1, eventByte2; | |
386 bit8_Type profileByteFlag; | |
387 int i = 0; | |
388 for(i = 0; i <256 ;i++) | |
389 sample[i] = 0; | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
390 addU16(sample, (uint16_t)(state->lifeData.depth_meter * 100)); |
38 | 391 length += 2; |
392 sample[2] = 0; | |
393 length++; | |
394 eventByte1.uw = 0; | |
395 eventByte2.uw = 0; | |
396 //uint16_t tmpU16 = 0; | |
130
b7689d9e888a
Minor changes to improved code quality and to eliminate warnings
Ideenmodellierer
parents:
38
diff
changeset
|
397 const SDecoinfo * pDecoinfo; // new hw 160620 |
38 | 398 |
399 //BuildEevntyte 1 | |
400 // sub old 0-3 only one at a time | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
401 if(state->events.manualMarker) |
38 | 402 { |
403 eventByte1.uw = 6; | |
404 } | |
405 else | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
406 if(state->warnings.decoMissed) |
38 | 407 { |
408 eventByte1.uw = 2; | |
409 } | |
410 else | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
411 if(state->warnings.ppO2Low) |
38 | 412 { |
413 eventByte1.uw = 4; | |
414 } | |
415 else | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
416 if(state->warnings.ppO2High) |
38 | 417 { |
418 eventByte1.uw = 5; | |
419 } | |
420 else | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
421 if(state->warnings.lowBattery) |
38 | 422 { |
423 eventByte1.uw = 7; | |
424 } | |
425 else | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
426 if(state->warnings.slowWarning) |
38 | 427 { |
428 eventByte1.uw = 1; | |
429 } | |
430 // sub bit 4 to 7 | |
281 | 431 if(state->events.manualGasSet) |
38 | 432 { |
433 eventByte1.ub.bit4 = 1; | |
434 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
435 if(state->events.gasChange) |
38 | 436 { |
437 eventByte1.ub.bit5 = 1; | |
438 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
439 if(state->events.setpointChange) |
38 | 440 { |
441 eventByte1.ub.bit6 = 1; | |
442 } | |
443 // sub bit 7 + eventbyte2 | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
444 if(state->events.bailout) |
38 | 445 { |
446 eventByte1.ub.bit7 = 1; | |
447 eventByte2.ub.bit0 = 1; | |
448 } | |
449 //Add EventByte 1 | |
450 if(eventByte1.uw > 0) | |
451 { | |
452 sample[length] = eventByte1.uw; | |
453 length++; | |
454 } | |
455 if(eventByte2.uw > 0) | |
456 { | |
457 sample[length] = eventByte2.uw; | |
458 length++; | |
459 } | |
460 //Add EventInfos | |
281 | 461 if(state->events.manualGasSet) |
38 | 462 { |
463 //manual gas in %O2 & %He | |
281 | 464 sample[length] = state->events.info_manualGasSetO2; |
38 | 465 length += 1; |
281 | 466 sample[length] = state->events.info_manualGasSetHe; |
38 | 467 length += 1; |
468 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
469 if(state->events.gasChange) |
38 | 470 { |
471 //Current gas (gasid) | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
472 sample[length] = state->events.info_GasChange; |
38 | 473 length += 1; |
474 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
475 if(state->events.setpointChange) |
38 | 476 { |
477 //New setpoint in cbar | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
478 sample[length] = state->events.info_SetpointChange; |
38 | 479 length += 1; |
480 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
481 if(state->events.bailout) |
38 | 482 { |
483 //bailout gas in % O2 & %He | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
484 sample[length] = state->events.info_bailoutO2; |
38 | 485 length += 1; |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
486 sample[length] = state->events.info_bailoutHe; |
38 | 487 length += 1; |
488 } | |
489 | |
490 | |
491 if(divisor.temperature == 0) | |
492 { | |
493 divisor.temperature = smallHeader.tempDivisor - 1; | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
494 addS16(&sample[length], (int16_t)((state->lifeData.temperature_celsius * 10.0f) + 0.5f)); |
38 | 495 length += 2; |
496 } | |
497 else | |
498 { | |
499 divisor.temperature--; | |
500 } | |
501 | |
502 | |
503 if(smallHeader.deco_ndlDivisor > 0) | |
504 { | |
505 if(divisor.deco_ndl == 0) | |
506 { | |
507 divisor.deco_ndl = smallHeader.deco_ndlDivisor - 1; | |
508 | |
509 if(stateUsed->diveSettings.deco_type.ub.standard == GF_MODE) | |
510 pDecoinfo = &stateUsed->decolistBuehlmann; | |
511 else if(stateUsed->diveSettings.deco_type.ub.standard == VPM_MODE) | |
512 pDecoinfo = &stateUsed->decolistVPM; | |
513 else // should not happen as only GF and VPM at the moment | |
514 { | |
515 sample[length] = 0; | |
516 length += 1; | |
517 sample[length] = 0; | |
518 length += 1; | |
519 } | |
520 | |
521 if(pDecoinfo->output_ndl_seconds > 0) | |
522 { | |
523 sample[length] = 0; | |
524 length += 1; | |
283
04cdeff80254
Bugfix: write NDL in logbook correctly
Jan Mulder <jlmulder@xs4all.nl>
parents:
281
diff
changeset
|
525 sample[length] = (uint8_t)(pDecoinfo->output_ndl_seconds / 60); |
281 | 526 |
527 // Limit stored sample within 0 to 240 mins (Since it's 8bit UINT only) | |
528 if ((pDecoinfo->output_ndl_seconds / 60) > 240) sample[length] = 240; | |
529 if ((pDecoinfo->output_ndl_seconds / 60) < 0) sample[length] = 0; | |
530 | |
38 | 531 length += 1; |
532 } | |
533 else if(pDecoinfo->output_time_to_surface_seconds) | |
534 { | |
535 tHome_findNextStop(pDecoinfo->output_stop_length_seconds, &nextstopDepthMeter, &nextstopLengthSeconds); | |
536 nextstopLengthMinutes = (nextstopLengthSeconds +59 ) / 60; | |
537 | |
538 sample[length] = nextstopDepthMeter; | |
539 length += 1; | |
540 sample[length] = nextstopLengthMinutes; | |
541 length += 1; | |
542 } | |
543 else | |
544 { | |
545 sample[length] = 0; | |
546 length += 1; | |
547 sample[length] = 0; | |
548 length += 1; | |
549 } | |
550 } | |
551 else | |
552 { | |
553 divisor.deco_ndl --; | |
554 } | |
555 } | |
556 | |
557 | |
558 if(smallHeader.ppo2Divisor) | |
559 { | |
560 if(divisor.ppo2 == 0) | |
561 { | |
562 divisor.ppo2 = smallHeader.ppo2Divisor - 1; | |
563 | |
564 for(int i = 0; i <3; i++) | |
565 { | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
566 sample[length] = (uint8_t)(state->lifeData.ppO2Sensor_bar[i] * 100.0f + 0.5f); |
38 | 567 length += 1; |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
568 addU16(&sample[length], (uint16_t)(state->lifeData.sensorVoltage_mV[i] * 10.0f + 0.5f)); |
38 | 569 length += 2; |
570 } | |
571 } | |
572 else | |
573 { | |
574 divisor.ppo2--; | |
575 } | |
576 } | |
577 | |
578 | |
579 if(smallHeader.decoplanDivisor) | |
580 { | |
581 if(divisor.decoplan == 0) | |
582 { | |
583 divisor.decoplan = smallHeader.decoplanDivisor - 1; | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
584 if(state->diveSettings.deco_type.ub.standard == VPM_MODE) |
38 | 585 { |
586 for(int i = 0; i <15; i++) | |
587 { | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
588 sample[length] = state->decolistVPM.output_stop_length_seconds[i] / 60; |
38 | 589 length += 1; |
590 } | |
591 } | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
592 else if(state->diveSettings.deco_type.ub.standard == GF_MODE) |
38 | 593 { |
594 for(int i = 0; i <15; i++) | |
595 { | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
596 sample[length] = state->decolistBuehlmann.output_stop_length_seconds[i] / 60; |
38 | 597 length += 1; |
598 } | |
599 } | |
600 else | |
601 { | |
602 for(int i = 0; i <15; i++) | |
603 { | |
604 sample[length] = 0; | |
605 length += 1; | |
606 } | |
607 } | |
608 // add16(&sample[length], state.temperature); | |
609 //length += 2; | |
610 } | |
611 else | |
612 { | |
613 divisor.decoplan --; | |
614 } | |
615 } | |
616 if(divisor.cns == 0) | |
617 { | |
618 divisor.cns = smallHeader.cnsDivisor - 1; | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
619 addU16(&sample[length], (uint16_t)state->lifeData.cns); |
38 | 620 length += 2; |
621 } | |
622 else | |
623 { | |
624 divisor.cns--; | |
625 } | |
626 | |
627 profileByteFlag.uw = length - 3; | |
628 if(eventByte1.uw) | |
629 { | |
630 profileByteFlag.ub.bit7 = 1; | |
631 } | |
632 sample[2] = profileByteFlag.uw; | |
633 logbook_writedata((void *) sample,length); | |
634 | |
635 } | |
636 | |
637 /** | |
638 ****************************************************************************** | |
639 * @brief readSample. / Reads data of one logbook sample | |
281 | 640 * @author heinrichs weikamp |
38 | 641 * @version V0.0.1 |
642 * @date 22-April-2014 | |
643 ****************************************************************************** | |
644 * | |
645 * @param int32_t* depth: output Value | |
646 * @param int16_t * gasid: output Value | |
647 * @param int32_t* temperature: output Value | |
648 * @param int32_t* sensor1, sensor2, sensor3: output Value | |
649 * @param int32_t* cns: output Value | |
650 * @return bytes read / 0 = reading Error | |
651 */ | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
652 static uint16_t readSample(int32_t* depth, int16_t * gasid, int16_t* setpoint_cbar, int32_t* temperature, int32_t* sensor1, int32_t* sensor2, int32_t* sensor3, int32_t* cns, SManualGas* manualGas, int16_t* bailout, int16_t* decostopDepth) |
38 | 653 { |
654 int length = 0; | |
655 _Bool bEvent = 0; | |
656 bit8_Type eventByte1, eventByte2; | |
657 bit8_Type profileByteFlag; | |
658 | |
659 eventByte1.uw = 0; | |
660 eventByte2.uw = 0; | |
661 uint8_t tempU8 = 0; | |
662 uint16_t temp = 0; | |
663 uint16_t bytesRead = 0; | |
664 | |
665 if(gasid) | |
666 *gasid = -1; | |
667 if(temperature) | |
668 *temperature = -1000; | |
669 if(sensor1) | |
670 *sensor1 = -1; | |
671 if(sensor2) | |
672 *sensor2 = -1; | |
673 if(sensor3) | |
674 *sensor3 = -1; | |
675 if(cns) | |
676 *cns = -1; | |
677 if(setpoint_cbar) | |
678 *setpoint_cbar = -1; | |
679 if(bailout) | |
680 *bailout = -1; | |
681 if(manualGas) | |
682 { | |
683 manualGas->percentageO2 =-1; | |
684 manualGas->percentageHe =-1; | |
685 } | |
686 if(decostopDepth) | |
687 *decostopDepth = -1; | |
688 | |
689 ext_flash_read_next_sample_part( (uint8_t*)&temp, 2); | |
690 if(depth) | |
691 *depth = (int32_t)temp; | |
692 bytesRead += 2; | |
693 | |
694 ext_flash_read_next_sample_part( &profileByteFlag.uw, 1); | |
695 bytesRead ++; | |
696 | |
697 bEvent = profileByteFlag.ub.bit7; | |
698 profileByteFlag.ub.bit7 = 0; | |
699 length = profileByteFlag.uw; | |
700 | |
701 if(bEvent) | |
702 { | |
703 ext_flash_read_next_sample_part( &eventByte1.uw, 1); | |
704 bytesRead ++; | |
705 | |
706 length--; | |
707 | |
708 //second event byte | |
709 if(eventByte1.ub.bit7) | |
710 { | |
711 ext_flash_read_next_sample_part( &eventByte2.uw, 1); | |
712 bytesRead ++; | |
713 length--; | |
714 } | |
715 else | |
716 { | |
717 eventByte2.uw = 0; | |
718 } | |
719 | |
720 //manual Gas Set | |
721 if( eventByte1.ub.bit4) | |
722 { | |
723 //Evaluate manual Gas | |
724 ext_flash_read_next_sample_part( (uint8_t*)&tempU8, 1); | |
725 bytesRead +=1; | |
726 length -= 1; | |
727 manualGas->percentageO2 = tempU8; | |
728 ext_flash_read_next_sample_part( (uint8_t*)&tempU8, 1); | |
729 bytesRead +=1; | |
730 length -= 1; | |
731 manualGas->percentageHe = tempU8; | |
732 if(gasid) | |
733 *gasid = 0; | |
734 } | |
735 //gas change | |
736 if( eventByte1.ub.bit5) | |
737 { | |
738 ext_flash_read_next_sample_part( &tempU8, 1); | |
739 bytesRead +=1; | |
740 length -= 1; | |
741 if(gasid) | |
742 *gasid = (uint16_t)tempU8; | |
743 } | |
744 //SetpointChange | |
745 if( eventByte1.ub.bit6) | |
746 { | |
747 ext_flash_read_next_sample_part( &tempU8, 1); | |
748 *setpoint_cbar = tempU8; | |
749 bytesRead +=1; | |
750 length -= 1; | |
751 } | |
752 | |
753 // second event Byte | |
754 //bailout | |
298
50c26a4442af
Bugfix: fix drawing of CCR bailout profile
Jan Mulder <jlmulder@xs4all.nl>
parents:
283
diff
changeset
|
755 if(eventByte2.ub.bit0) |
38 | 756 { |
757 //evaluate bailout gas Gas | |
758 *bailout = 1; | |
759 | |
760 ext_flash_read_next_sample_part( (uint8_t*)&tempU8, 1); | |
761 bytesRead +=1; | |
762 length -= 1; | |
763 manualGas->percentageO2 = tempU8; | |
764 ext_flash_read_next_sample_part( (uint8_t*)&tempU8, 1); | |
765 bytesRead +=1; | |
766 length -= 1; | |
767 manualGas->percentageHe = tempU8; | |
768 | |
769 if(gasid) | |
770 *gasid = 0; | |
771 } | |
772 } | |
773 | |
774 if(divisor.temperature == 0) | |
775 { | |
776 divisor.temperature = smallHeader.tempDivisor - 1; | |
777 ext_flash_read_next_sample_part( (uint8_t*)&temp, 2); | |
778 bytesRead +=2; | |
779 length -= 2; | |
780 if(temperature) | |
781 { | |
782 *temperature = (int32_t)temp; | |
783 } | |
784 } | |
785 else | |
786 { | |
787 divisor.temperature--; | |
788 } | |
789 | |
790 if(smallHeader.deco_ndlDivisor > 0) | |
791 { | |
792 if(divisor.deco_ndl == 0) | |
793 { | |
794 divisor.deco_ndl = smallHeader.deco_ndlDivisor - 1; | |
795 ext_flash_read_next_sample_part( &tempU8, 1); | |
796 if(decostopDepth) | |
797 { | |
798 *decostopDepth = tempU8 * 100; | |
799 } | |
800 ext_flash_read_next_sample_part( &tempU8, 1); | |
801 bytesRead += 2; | |
802 length -= 2; | |
803 } | |
804 else | |
805 { | |
806 divisor.deco_ndl--; | |
807 } | |
808 } | |
809 | |
810 if(divisor.ppo2 == 0) | |
811 { | |
812 int32_t ppO2Tmp = 0; | |
813 divisor.ppo2 = smallHeader.ppo2Divisor -1; | |
814 for(int i = 0; i <3 ; i++) | |
815 { | |
816 ext_flash_read_next_sample_part( &tempU8, 1); | |
817 ppO2Tmp += tempU8; | |
818 bytesRead +=1; | |
819 length -= 1; | |
820 ext_flash_read_next_sample_part( (uint8_t*)&temp, 2); | |
821 bytesRead +=2; | |
822 length -= 2; | |
823 if(sensor1 && (i==0)) | |
824 *sensor1 = (((int32_t)tempU8) * 0xFFFF) + temp; | |
825 if(sensor2 && (i==1)) | |
826 *sensor2 = (((int32_t)tempU8) * 0xFFFF) + temp; | |
827 if(sensor3 && (i==2)) | |
828 *sensor3 = (((int32_t)tempU8) * 0xFFFF) + temp; | |
829 } | |
830 } | |
831 else | |
832 { | |
833 divisor.ppo2--; | |
834 } | |
835 | |
836 if(smallHeader.decoplanDivisor > 0) | |
837 { | |
838 if(divisor.decoplan == 0) | |
839 { | |
840 divisor.decoplan = smallHeader.decoplanDivisor - 1; | |
841 for(int i = 0; i <15; i++) | |
842 ext_flash_read_next_sample_part( &tempU8, 1); | |
843 bytesRead += 15; | |
844 length -= 15; | |
845 } | |
846 else | |
847 { | |
848 divisor.decoplan--; | |
849 } | |
850 } | |
851 | |
852 | |
853 | |
854 if(divisor.cns == 0) | |
855 { | |
856 divisor.cns = smallHeader.cnsDivisor - 1; | |
857 | |
858 ext_flash_read_next_sample_part( (uint8_t*)&temp, 2); | |
859 bytesRead +=2; | |
860 length -= 2; | |
861 if(cns) | |
862 { | |
863 *cns = (int32_t)temp; | |
864 } | |
865 } | |
866 else | |
867 { | |
868 divisor.cns--; | |
869 } | |
870 | |
871 if (length != 0) | |
872 return 0; | |
873 | |
874 return bytesRead; | |
875 } | |
876 /** | |
877 ****************************************************************************** | |
878 * @brief logbook_readSampleData. / Reads sample data of whole logbook entry | |
281 | 879 * @author heinrichs weikamp |
38 | 880 * @version V0.0.1 |
881 * @date 22-April-2014 | |
882 ****************************************************************************** | |
883 * | |
884 * @param uint8_t StepBackwards: witch lookbook entry? | |
885 * @param uint16_t length : maxlength of output arrays | |
886 * @param int32_t* depth : output array | |
887 * @param int16_t * gasid : output array | |
888 * @param int32_t* temperature : output array | |
889 * @param int32_t* ppo2 : output array | |
890 * @param int32_t* cns : output array | |
891 * @return length of output | |
892 */ | |
893 uint16_t logbook_readSampleData(uint8_t StepBackwards, uint16_t length,uint16_t* depth, uint8_t* gasid, int16_t* temperature, uint16_t* ppo2, uint16_t* setpoint, uint16_t* sensor1, uint16_t* sensor2, uint16_t* sensor3, uint16_t* cns, uint8_t* bailout, uint16_t* decostopDepth) | |
894 { | |
895 //Test read | |
896 //SLogbookHeader header; | |
897 | |
898 //logbook_getHeader(&header); | |
899 SLogbookHeader header; | |
900 int iNum; | |
901 int firstgasid = 0; | |
902 int retVal = 0; | |
903 int compression = 0; | |
904 int i; | |
905 // uint32_t diveTime_seconds; | |
906 int32_t depthVal = 0; | |
907 int16_t gasidVal = 0; | |
908 int16_t setPointVal = 0; | |
909 int16_t bailoutVal = 0; | |
910 int16_t bailoutLast = 0; | |
911 uint16_t setPointLast = 0; | |
912 int32_t temperatureVal = 0; | |
913 int32_t sensor1Val = 0; | |
914 int32_t sensor2Val = 0; | |
915 int32_t sensor3Val = 0; | |
916 int32_t sensor1Last = 0; | |
917 int32_t sensor2Last = 0; | |
918 int32_t sensor3Last = 0; | |
919 int32_t cnsVal = 0; | |
920 int32_t depthLast = 0; | |
921 int16_t gasidLast = 0; | |
922 int32_t temperatureLast = 0; | |
923 int32_t temperatureFirst = 0; | |
924 int32_t cnsLast = 0; | |
925 int16_t decostepDepthVal = 0; | |
926 int16_t decostepDepthLast = 0; | |
927 | |
928 SManualGas manualGasVal; | |
929 SManualGas manualGasLast; | |
930 manualGasLast.percentageO2 = 0; | |
931 manualGasLast.percentageHe = 0; | |
932 | |
933 float ambiant_pressure_bar = 0; | |
934 float ppO2 = 0; | |
935 ext_flash_read_dive_header((uint8_t*)&header, StepBackwards); | |
936 for(i = 0;i< 5;i++) | |
937 { | |
938 if(header.gasordil[i].note.ub.first) | |
939 break; | |
940 } | |
941 firstgasid = i + 1; | |
942 if(header.diveMode == DIVEMODE_CCR) | |
943 setPointLast = header.setpoint[0].setpoint_cbar; | |
944 else | |
945 setPointLast = 0; | |
946 //diveTime_seconds = header.diveTime_seconds ; | |
947 for(compression = 1; compression < 100; compression ++) | |
948 { | |
949 if((header.total_diveTime_seconds / header.samplingRate)/compression <= length) | |
950 break; | |
951 } | |
952 | |
953 | |
954 for(i = 0;i< length;i++) | |
955 { | |
956 if(depth) | |
957 depth[i] = 0; | |
958 if(temperature) | |
959 temperature[i] = 0; | |
960 if(gasid) | |
961 gasid[i] = 0; | |
962 if(ppo2) | |
963 ppo2[i] = 0; | |
964 if(setpoint) | |
965 setpoint[i] = 0; | |
966 if(sensor1) | |
967 sensor1[i] = 0; | |
968 if(sensor2) | |
969 sensor2[i] = 0; | |
970 if(sensor3) | |
971 sensor3[i] = 0; | |
972 if(cns) | |
973 cns[i] = 0; | |
974 } | |
975 //We start with fist gasid | |
976 gasidLast = firstgasid; | |
977 | |
978 | |
979 //uint16_t* ppo2, uint16_t* cns# | |
980 uint32_t totalNumberOfBytes = 0; | |
981 uint32_t bytesRead = 0; | |
982 ext_flash_open_read_sample( StepBackwards,&totalNumberOfBytes); | |
983 ext_flash_read_next_sample_part((uint8_t*)&smallHeader, sizeof(SSmallHeader)); | |
984 bytesRead += sizeof(SSmallHeader); | |
985 | |
986 clear_divisor(); | |
987 | |
988 iNum = 0; | |
989 int counter = 0; | |
990 temperatureLast = -1000; | |
991 while ((bytesRead < totalNumberOfBytes) && (iNum < length)) | |
992 { | |
993 ext_flash_set_entry_point(); | |
994 divisorBackup = divisor; | |
995 retVal = readSample(&depthVal,&gasidVal, &setPointVal, &temperatureVal, &sensor1Val, &sensor2Val, &sensor3Val, &cnsVal, &manualGasVal, &bailoutVal, &decostepDepthVal); | |
996 | |
997 if(retVal == 0) | |
998 { | |
999 //Error try to read again!!! | |
1000 ext_flash_reopen_read_sample_at_entry_point(); | |
1001 divisor = divisorBackup; | |
1002 retVal = readSample(&depthVal,&gasidVal,&setPointVal, &temperatureVal, &sensor1Val, &sensor2Val, &sensor3Val, &cnsVal, &manualGasVal, &bailoutVal, &decostepDepthVal); | |
1003 | |
1004 if(retVal == 0) | |
1005 break; | |
1006 } | |
1007 bytesRead +=retVal; | |
1008 | |
1009 //if for some variable no new value is in the sample for (z.B. gasidVal = -1), we take the last value | |
1010 if(depthVal == -1) | |
1011 depthVal = depthLast; | |
1012 else | |
1013 depthLast = depthVal; | |
1014 | |
1015 if(gasidVal == -1) | |
1016 gasidVal = gasidLast; | |
1017 else | |
1018 gasidLast = gasidVal; | |
1019 | |
1020 if(temperatureVal == -1000) | |
1021 temperatureVal = temperatureLast; | |
1022 else | |
1023 { | |
1024 if(temperatureLast == -1000) | |
1025 temperatureFirst = temperatureVal; | |
1026 temperatureLast = temperatureVal; | |
1027 } | |
1028 | |
1029 if(setPointVal == -1) | |
1030 setPointVal = setPointLast; | |
1031 else | |
1032 setPointLast = setPointVal; | |
1033 | |
1034 if(sensor1Val == -1) | |
1035 sensor1Val = sensor1Last; | |
1036 else | |
1037 sensor1Last = sensor1Val; | |
1038 | |
1039 if(sensor2Val == -1) | |
1040 sensor2Val = sensor2Last; | |
1041 else | |
1042 sensor2Last = sensor2Val; | |
1043 | |
1044 if(sensor3Val == -1) | |
1045 sensor3Val = sensor3Last; | |
1046 else | |
1047 sensor3Last = sensor3Val; | |
1048 | |
1049 if(cnsVal == -1) | |
1050 cnsVal = cnsLast; | |
1051 else | |
1052 cnsLast = cnsVal; | |
1053 | |
1054 if(manualGasVal.percentageO2 == -1) | |
1055 manualGasVal = manualGasLast; | |
1056 else | |
1057 manualGasLast = manualGasVal; | |
1058 | |
1059 if(bailoutVal == -1) | |
1060 bailoutVal = bailoutLast; | |
1061 else | |
1062 bailoutLast = bailoutVal; | |
1063 | |
1064 if(decostepDepthVal == -1) | |
1065 decostepDepthVal = decostepDepthLast; | |
1066 else | |
1067 decostepDepthLast = decostepDepthVal; | |
1068 | |
1069 counter++; | |
1070 // Heed compression | |
1071 // Write here to arrays | |
1072 if(counter == compression) | |
1073 { | |
1074 if(depth) | |
1075 depth[iNum] = depthVal; | |
1076 if(gasid) | |
1077 gasid[iNum] = gasidVal; | |
1078 if(temperature) | |
1079 temperature[iNum] = temperatureVal; | |
1080 if(cns) | |
1081 cns[iNum] = cnsVal; | |
1082 if(bailout) | |
1083 bailout[iNum] = bailoutVal; | |
1084 if(decostopDepth) | |
1085 decostopDepth[iNum] = decostepDepthVal; | |
1086 | |
1087 if(ppo2) | |
1088 { | |
1089 //Calc ppo2 - Values | |
1090 SGas gas; | |
1091 gas.setPoint_cbar = setPointVal; | |
1092 if(gasidVal > 0) | |
1093 { | |
1094 gas.helium_percentage = header.gasordil[gasidVal - 1].helium_percentage; | |
1095 gas.nitrogen_percentage = 100 - gas.helium_percentage - header.gasordil[gasidVal - 1].oxygen_percentage; | |
1096 } | |
1097 else | |
1098 { | |
1099 gas.helium_percentage = manualGasVal.percentageHe; | |
1100 gas.nitrogen_percentage = 100 - gas.helium_percentage - manualGasVal.percentageO2; | |
1101 } | |
1102 ambiant_pressure_bar =((float)(depthVal + header.surfacePressure_mbar))/1000; | |
1103 ppO2 = decom_calc_ppO2(ambiant_pressure_bar, &gas ); | |
1104 ppo2[iNum] = (uint16_t) ( ppO2 * 100); | |
1105 } | |
1106 | |
1107 if(setpoint) | |
1108 setpoint[iNum] = setPointVal; | |
1109 | |
1110 if(sensor1) | |
1111 sensor1[iNum] = (sensor1Val / 0xFFFF) & 0xFF; | |
1112 if(sensor2) | |
1113 sensor2[iNum] = (sensor2Val / 0xFFFF) & 0xFF; | |
1114 if(sensor3) | |
1115 sensor3[iNum] = (sensor3Val / 0xFFFF) & 0xFF; | |
1116 iNum++; | |
1117 counter = 0; | |
1118 } | |
1119 } | |
1120 | |
1121 // Fix first Temperature Entries 150930 hw | |
1122 if(temperature) | |
1123 { | |
1124 int i = 0; | |
1125 while((temperature[i] == -1000) && (i < iNum)) | |
1126 temperature[i++] = temperatureFirst; | |
1127 } | |
1128 | |
1129 ext_flash_close_read_sample(); | |
1130 return iNum; | |
1131 } | |
1132 | |
1133 | |
1134 /******************************************************************************** | |
1135 * @brief logbook_InitAndWrite. / Controls writing of logbook | |
1136 * Should be called ten times per second | |
1137 * Automatically Initializes logbook at beginning of dive, | |
1138 * write samples every 2 seconds | |
1139 * and finishes logbook after end of dive | |
1140 *********************************************************************************/ | |
1141 | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1142 void logbook_InitAndWrite(const SDiveState *pStateReal) |
38 | 1143 { |
1144 SSettings *pSettings = settingsGetPointer(); | |
1145 static uint8_t bDiveMode = 0; | |
1146 static uint32_t tickstart = 0; | |
1147 uint32_t ticksdiff = 0; | |
1148 uint32_t lasttick = 0; | |
1149 static float min_temperature_float_celsius = 0; | |
1150 | |
1151 if(!bDiveMode) | |
1152 { | |
1153 if((pStateReal->mode == MODE_DIVE) && (pStateReal->diveSettings.diveMode != DIVEMODE_Apnea) && (pStateReal->lifeData.dive_time_seconds >= 5)) | |
1154 { | |
1155 //InitdiveProfile | |
1156 pSettings->totalDiveCounter++; | |
1157 logbook_initNewdiveProfile(pStateReal,settingsGetPointer()); | |
1158 min_temperature_float_celsius = pStateReal->lifeData.temperature_celsius; | |
1159 //Write logbook sample | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1160 logbook_writeSample(pStateReal); |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1161 resetEvents(pStateReal); |
38 | 1162 tickstart = HAL_GetTick(); |
1163 bDiveMode = 1; | |
1164 } | |
1165 } | |
1166 else if((pStateReal->mode == MODE_DIVE) && (pStateReal->diveSettings.diveMode != DIVEMODE_Apnea)) | |
1167 { | |
1168 lasttick = HAL_GetTick(); | |
1169 ticksdiff = time_elapsed_ms(tickstart,lasttick); | |
1170 // | |
1171 if(ticksdiff >= 2000) | |
1172 { | |
1173 //Write logbook sample | |
269
6e78137952af
cleanup: do not pass large struct by value
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1174 logbook_writeSample(pStateReal); |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1175 resetEvents(pStateReal); |
38 | 1176 if(min_temperature_float_celsius > pStateReal->lifeData.temperature_celsius) |
1177 min_temperature_float_celsius = pStateReal->lifeData.temperature_celsius; | |
1178 tickstart = lasttick; | |
1179 if((bDiveMode == 1) && (pStateReal->lifeData.dive_time_seconds >= pSettings->divetimeToCreateLogbook)) | |
1180 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1181 ext_flash_create_new_dive_log((uint8_t*)&gheader); |
38 | 1182 /** save settings |
1183 * with new lastDiveLogId and time and day | |
1184 */ | |
1185 pSettings->personalDiveCount++; | |
1186 if(pSettings->logbookOffset) | |
1187 { | |
1188 pSettings->logbookOffset++; | |
1189 } | |
1190 ext_flash_write_settings(); | |
1191 ext_flash_disable_protection_for_logbook(); | |
426
514e6269256f
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
411
diff
changeset
|
1192 |
514e6269256f
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
411
diff
changeset
|
1193 ext_flash_CloseSector(); /* this is just a repair function which invalidates a not used sector in case a log maintenance was called before dive */ |
38 | 1194 bDiveMode = 3; |
1195 } | |
1196 if(bDiveMode == 3) | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1197 logbook_UpdateHeader(pStateReal); |
38 | 1198 } |
1199 } | |
1200 else if(bDiveMode == 3) | |
1201 { | |
1202 //End of Dive | |
1203 logbook_SetAverageDepth(pStateReal->lifeData.average_depth_meter); | |
1204 logbook_SetMinTemperature(min_temperature_float_celsius); | |
1205 logbook_SetMaxCNS(pStateReal->lifeData.cns); | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1206 logbook_SetCompartmentDesaturation(pStateReal); |
38 | 1207 logbook_SetLastStop(pStateReal->diveSettings.last_stop_depth_bar); |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1208 gheader.batteryVoltage = pStateReal->lifeData.battery_voltage * 1000; |
38 | 1209 logbook_EndDive(); |
1210 bDiveMode = 0; | |
1211 } else | |
1212 { | |
1213 ext_flash_enable_protection(); | |
1214 } | |
1215 } | |
1216 | |
1217 | |
1218 /* Private functions ---------------------------------------------------------*/ | |
1219 | |
1220 /******************************************************************************** | |
1221 * @brief logbook_UpdateHeader. / | |
1222 * set date, time, max depth. etc. pp. | |
1223 * the internal pointer to the end of profile and length will be set by | |
1224 ext_flash_close_new_dive_log() in externLogbookFlash.c | |
1225 * @author heinrichs weikamp gmbh | |
1226 * @version V0.0.1 | |
1227 * @date 27-Nov-2014 | |
1228 *********************************************************************************/ | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1229 static void logbook_UpdateHeader(const SDiveState *pStateReal) |
38 | 1230 { |
1231 // uint16_t secondsAtShallow = 0; | |
1232 RTC_DateTypeDef Sdate; | |
1233 RTC_TimeTypeDef Stime; | |
1234 uint32_t time1_u32, time2_u32; | |
1235 uint32_t divetimeHelper; | |
1236 | |
1237 /* time and day */ | |
1238 /* don't update CHANGE 160224 hw, maybe save actual time and date at other place | |
1239 translateDate(pStateReal->lifeData.dateBinaryFormat, &Sdate); | |
1240 translateTime(pStateReal->lifeData.timeBinaryFormat, &Stime); | |
1241 | |
1242 header.dateYear = Sdate.Year; | |
1243 header.dateMonth = Sdate.Month; | |
1244 header.dateDay = Sdate.Date; | |
1245 header.timeHour = Stime.Hours; | |
1246 header.timeMinute = Stime.Minutes; | |
1247 */ | |
1248 /// 160315 Quick fix for empty date problem | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1249 if((!(gheader.dateYear)) || (!(gheader.dateMonth)) || (!(gheader.dateDay))) |
38 | 1250 { |
1251 translateDate(pStateReal->lifeData.dateBinaryFormat, &Sdate); | |
1252 translateTime(pStateReal->lifeData.timeBinaryFormat, &Stime); | |
1253 | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1254 gheader.dateYear = Sdate.Year; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1255 gheader.dateMonth = Sdate.Month; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1256 gheader.dateDay = Sdate.Date; |
38 | 1257 |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1258 time1_u32 = (uint32_t)gheader.timeMinute + (uint32_t)(gheader.timeHour * 60); |
38 | 1259 time2_u32 = (uint32_t)Stime.Minutes + (uint32_t)(Stime.Hours * 60); |
1260 if(time2_u32 < time1_u32) | |
1261 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1262 if(gheader.dateDay > 1) |
38 | 1263 { |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1264 gheader.dateDay -= 1; |
38 | 1265 } |
1266 else | |
1267 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1268 gheader.dateMonth --; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1269 if(!gheader.dateMonth) |
38 | 1270 { |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1271 gheader.dateYear--; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1272 gheader.dateMonth = 12; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1273 gheader.dateDay = 31; |
38 | 1274 } |
1275 else | |
1276 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1277 if(gheader.dateMonth == 2) |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1278 gheader.dateDay = 28; |
38 | 1279 else |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1280 if((gheader.dateMonth == 4) || (gheader.dateMonth == 6) || (gheader.dateMonth == 9) || (gheader.dateMonth == 11)) |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1281 gheader.dateDay = 30; |
38 | 1282 else |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1283 gheader.dateDay = 31; |
38 | 1284 } |
1285 } | |
1286 } | |
1287 } | |
1288 | |
1289 /* duration */ | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1290 gheader.total_diveTime_seconds = pStateReal->lifeData.dive_time_seconds; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1291 gheader.maxDepth = pStateReal->lifeData.max_depth_meter * 100; |
38 | 1292 |
1293 /* old: | |
1294 | |
1295 secondsAtShallow = pSettings->timeoutDiveReachedZeroDepth; | |
1296 if(pStateReal->lifeData.dive_time_seconds <= secondsAtShallow) | |
1297 secondsAtShallow = 0; | |
1298 header.diveTimeMinutes = (header.total_diveTime_seconds - secondsAtShallow )/ 60; | |
1299 header.diveTimeSeconds = header.total_diveTime_seconds - secondsAtShallow - (header.diveTimeMinutes * 60); | |
1300 */ | |
1301 divetimeHelper = pStateReal->lifeData.dive_time_seconds_without_surface_time; | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1302 gheader.diveTimeMinutes = (uint16_t)(divetimeHelper/60); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1303 divetimeHelper -= 60 * (uint32_t)gheader.diveTimeMinutes; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1304 gheader.diveTimeSeconds = (uint16_t)divetimeHelper; |
38 | 1305 |
1306 /* deco algorithm (final) */ | |
1307 if(pStateReal->diveSettings.deco_type.ub.standard == GF_MODE) | |
1308 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1309 gheader.decoModel = 1; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1310 gheader.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.gf_low; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1311 gheader.gfHigh = pStateReal->diveSettings.gf_high; |
38 | 1312 } |
1313 else | |
1314 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1315 gheader.decoModel = 2; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1316 gheader.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.vpm_conservatism; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1317 gheader.gfHigh = 0; |
38 | 1318 } |
1319 | |
1320 /* tissue load */ | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1321 memcpy(gheader.n2Compartments, pStateReal->lifeData.tissue_nitrogen_bar, 64); |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1322 memcpy(gheader.heCompartments, pStateReal->lifeData.tissue_helium_bar, 64); |
38 | 1323 |
1324 } | |
1325 | |
1326 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
1327 static void logbook_SetAverageDepth(float average_depth_meter) |
38 | 1328 { |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1329 gheader.averageDepth_mbar = (uint16_t)(average_depth_meter * 100); |
38 | 1330 } |
1331 | |
1332 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
1333 static void logbook_SetMinTemperature(float min_temperature_celsius) |
38 | 1334 { |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1335 gheader.minTemp = (int16_t)((min_temperature_celsius * 10.0f) + 0.5f); |
38 | 1336 } |
1337 | |
1338 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
1339 static void logbook_SetMaxCNS(float max_cns_percentage) |
38 | 1340 { |
1341 if(max_cns_percentage < 9999) | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1342 gheader.maxCNS = (uint16_t)(max_cns_percentage); |
38 | 1343 else |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1344 gheader.maxCNS = 9999; |
38 | 1345 } |
1346 | |
1347 | |
270
2e58a4094770
feature, debug: make simulator write a logbook entry
Jan Mulder <jlmulder@xs4all.nl>
parents:
269
diff
changeset
|
1348 static void logbook_SetCompartmentDesaturation(const SDiveState * pStateReal) |
38 | 1349 { |
225
2bb1db22b5f5
cleanup: random set of cleanups
Jan Mulder <jlmulder@xs4all.nl>
parents:
199
diff
changeset
|
1350 SLifeData2 secondaryInformation = { 0 }; |
38 | 1351 |
1352 decom_tissues_desaturation_time(&pStateReal->lifeData, &secondaryInformation); | |
1353 for(int i=0;i<16;i++) | |
1354 { | |
1355 if(secondaryInformation.tissue_nitrogen_desaturation_time_minutes[i] <= (15 * 255)) | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1356 gheader.n2CompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_nitrogen_desaturation_time_minutes[i] + 14) / 15); |
38 | 1357 else |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1358 gheader.n2CompartDesatTime_min[i] = 255; |
38 | 1359 if(secondaryInformation.tissue_helium_desaturation_time_minutes[i] <= (15 * 255)) |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1360 gheader.heCompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_helium_desaturation_time_minutes[i] + 14 )/ 15); |
38 | 1361 else |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1362 gheader.heCompartDesatTime_min[i] = 255; |
38 | 1363 } |
1364 } | |
1365 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
1366 static void logbook_SetLastStop(float last_stop_depth_bar) |
38 | 1367 { |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1368 gheader.lastDecostop_m = (uint8_t)(last_stop_depth_bar / 10.0f); |
38 | 1369 } |
1370 | |
194
f23b9055436f
cleanup: more trivial cleanup (logbook.c/h)
Jan Mulder <jlmulder@xs4all.nl>
parents:
149
diff
changeset
|
1371 static void logbook_writedata(void * data, int length_byte) |
38 | 1372 { |
1373 ext_flash_write_sample(data, length_byte); | |
1374 } | |
1375 | |
1376 /******************************************************************************** | |
1377 * @brief logbook_build_ostc3header. / | |
1378 * @author heinrichs weikamp gmbh | |
1379 * @version V0.0.2 | |
1380 * @date 27-Nov-2014 | |
1381 *********************************************************************************/ | |
1382 SLogbookHeaderOSTC3 * logbook_build_ostc3header(SLogbookHeader* pHead) | |
1383 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1384 convert_Type data,data2; |
38 | 1385 |
1386 memcpy(headerOSTC3.diveHeaderStart, &pHead->diveHeaderStart, 2); | |
1387 memcpy(headerOSTC3.pBeginProfileData, &pHead->pBeginProfileData, 3); | |
1388 memcpy(headerOSTC3.pEndProfileData, &pHead->pEndProfileData, 3); | |
1389 | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1390 |
38 | 1391 data.u8bit.byteHigh = 0; |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1392 data.u8bit.byteLow = pHead->pBeginProfileData[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1393 data.u8bit.byteMidLow = pHead->pBeginProfileData[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1394 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1395 |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1396 data2.u8bit.byteHigh = 0; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1397 data2.u8bit.byteLow = pHead->pEndProfileData[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1398 data2.u8bit.byteMidLow = pHead->pEndProfileData[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1399 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2]; |
38 | 1400 |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1401 /* check if sample address information are corrupted by address range. */ |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1402 /* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */ |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1403 if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000))) |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1404 { |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1405 data2.u32bit = data.u32bit + DEFAULT_SAMPLES; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1406 pHead->pEndProfileData[0] = data2.u8bit.byteLow; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1407 pHead->pEndProfileData[1] = data2.u8bit.byteMidLow; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1408 pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1409 data.u32bit = DEFAULT_SAMPLES; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1410 } |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1411 else |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1412 { |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1413 data.u8bit.byteHigh = 0; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1414 data.u8bit.byteLow = pHead->profileLength[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1415 data.u8bit.byteMidLow = pHead->profileLength[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1416 data.u8bit.byteMidHigh = pHead->profileLength[2]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1417 } |
38 | 1418 if(data.u32bit != 0xFFFFFF) |
1419 data.u32bit += 3; | |
1420 | |
1421 headerOSTC3.profileLength[0] = data.u8bit.byteLow; | |
1422 headerOSTC3.profileLength[1] = data.u8bit.byteMidLow; | |
1423 headerOSTC3.profileLength[2] = data.u8bit.byteMidHigh; | |
1424 | |
1425 memcpy(headerOSTC3.gasordil, pHead->gasordil, 20); | |
1426 | |
1427 if(pHead->logbookProfileVersion == LOGBOOK_VERSION) | |
1428 { | |
1429 headerOSTC3.logbookProfileVersion = LOGBOOK_VERSION_OSTC3; | |
1430 memcpy(headerOSTC3.personalDiveCount, &pHead->personalDiveCount, 2); | |
1431 headerOSTC3.safetyDistance_10cm = 0; | |
1432 | |
1433 for(int i=0;i<5;i++) | |
1434 { | |
1435 if(!pHead->gasordil[i].note.ub.active) | |
1436 headerOSTC3.gasordil[3 + (i*4)] = 0; | |
1437 else if(pHead->gasordil[i].note.ub.first) | |
1438 { | |
1439 /* depth = 0, note = 1 */ | |
1440 headerOSTC3.gasordil[2 + (i*4)] = 0; | |
1441 headerOSTC3.gasordil[3 + (i*4)] = 1; | |
1442 } | |
1443 else if( pHead->gasordil[i].depth_meter) | |
1444 { | |
1445 /* note = 3 */ | |
1446 headerOSTC3.gasordil[3 + (i*4)] = 3; | |
1447 } | |
1448 } | |
1449 } | |
1450 else | |
1451 { | |
1452 headerOSTC3.logbookProfileVersion = 0xFF; | |
1453 headerOSTC3.personalDiveCount[0] = 0xFF; | |
1454 headerOSTC3.personalDiveCount[1] = 0xFF; | |
1455 headerOSTC3.safetyDistance_10cm = 0xFF; | |
1456 } | |
1457 | |
1458 headerOSTC3.dateYear = pHead->dateYear; | |
1459 headerOSTC3.dateMonth = pHead->dateMonth; | |
1460 headerOSTC3.dateDay = pHead->dateDay; | |
1461 headerOSTC3.timeHour = pHead->timeHour; | |
1462 headerOSTC3.timeMinute = pHead->timeMinute; | |
1463 | |
1464 | |
1465 memcpy(headerOSTC3.maxDepth, &pHead->maxDepth, 2); | |
1466 memcpy(headerOSTC3.diveTimeMinutes, &pHead->diveTimeMinutes, 2); | |
1467 | |
1468 headerOSTC3.diveTimeSeconds = pHead->diveTimeSeconds; | |
1469 | |
1470 memcpy(headerOSTC3.minTemp, &pHead->minTemp, 2); | |
1471 memcpy(headerOSTC3.surfacePressure_mbar,&pHead->surfacePressure_mbar, 2); | |
1472 memcpy(headerOSTC3.desaturationTime, &pHead->desaturationTime, 2); | |
1473 | |
1474 headerOSTC3.firmwareVersionHigh = pHead->firmwareVersionHigh; | |
1475 headerOSTC3.firmwareVersionLow = pHead->firmwareVersionLow; | |
1476 | |
1477 memcpy(headerOSTC3.batteryVoltage, &pHead->batteryVoltage, 2); | |
1478 | |
1479 headerOSTC3.samplingRate = pHead->samplingRate; | |
1480 | |
1481 memcpy(headerOSTC3.cnsAtBeginning, &pHead->cnsAtBeginning, 2); | |
1482 | |
1483 headerOSTC3.gfAtBeginning = pHead->gfAtBeginning; | |
1484 headerOSTC3.gfAtEnd = pHead->gfAtEnd; | |
1485 | |
1486 memcpy(headerOSTC3.setpoint, pHead->setpoint, 10); | |
1487 | |
1488 headerOSTC3.salinity = pHead->salinity; | |
1489 | |
1490 memcpy(headerOSTC3.maxCNS, &pHead->maxCNS, 2); | |
1491 memcpy(headerOSTC3.averageDepth_mbar, &pHead->averageDepth_mbar, 2); | |
1492 memcpy(headerOSTC3.total_diveTime_seconds,&pHead->total_diveTime_seconds, 2); | |
1493 | |
1494 headerOSTC3.gfLow_or_Vpm_conservatism = pHead->gfLow_or_Vpm_conservatism; | |
1495 headerOSTC3.gfHigh = pHead->gfHigh; | |
1496 headerOSTC3.decoModel = pHead->decoModel; | |
1497 | |
1498 memcpy(headerOSTC3.diveNumber, &pHead->diveNumber, 2); | |
1499 | |
1500 headerOSTC3.diveMode = pHead->diveMode; | |
1501 headerOSTC3.CCRmode = pHead->CCRmode; | |
1502 | |
1503 memcpy(headerOSTC3.n2CompartDesatTime_min,pHead->n2CompartDesatTime_min, 16); | |
1504 memcpy(headerOSTC3.n2Compartments, pHead->n2Compartments, 64); | |
1505 memcpy(headerOSTC3.heCompartDesatTime_min,pHead->heCompartDesatTime_min, 16); | |
1506 memcpy(headerOSTC3.heCompartments, pHead->heCompartments, 64); | |
1507 | |
1508 headerOSTC3.lastDecostop_m = pHead->lastDecostop_m; | |
1509 | |
1510 memcpy(headerOSTC3.hwHudBattery_mV, &pHead->hwHudBattery_mV, 2); | |
1511 | |
1512 headerOSTC3.hwHudLastStatus = pHead->hwHudLastStatus; | |
1513 | |
1514 memcpy(headerOSTC3.batteryGaugeRegisters,&pHead->batteryGaugeRegisters, 6); | |
1515 | |
1516 | |
1517 memcpy(headerOSTC3.diveHeaderEnd, &pHead->diveHeaderEnd, 2); | |
1518 | |
1519 return &headerOSTC3; | |
1520 } | |
1521 | |
1522 | |
1523 /******************************************************************************** | |
1524 * @brief logbook_build_ostc3header_compact. / | |
1525 * @author heinrichs weikamp gmbh | |
1526 * @version V0.0.1 | |
1527 * @date 31-Juli-2015 | |
1528 *********************************************************************************/ | |
1529 SLogbookHeaderOSTC3compact * logbook_build_ostc3header_compact(SLogbookHeader* pHead) | |
1530 { | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1531 convert_Type data, data2; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1532 |
38 | 1533 |
1534 data.u8bit.byteHigh = 0; | |
411
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1535 data.u8bit.byteLow = pHead->pBeginProfileData[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1536 data.u8bit.byteMidLow = pHead->pBeginProfileData[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1537 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1538 |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1539 data2.u8bit.byteHigh = 0; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1540 data2.u8bit.byteLow = pHead->pEndProfileData[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1541 data2.u8bit.byteMidLow = pHead->pEndProfileData[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1542 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1543 |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1544 /* check if sample address information are corrupted by address range. */ |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1545 /* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */ |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1546 if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000))) |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1547 { |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1548 data2.u32bit = data.u32bit + DEFAULT_SAMPLES; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1549 pHead->pEndProfileData[0] = data2.u8bit.byteLow; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1550 pHead->pEndProfileData[1] = data2.u8bit.byteMidLow; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1551 pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1552 data.u32bit = DEFAULT_SAMPLES; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1553 } |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1554 else |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1555 { |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1556 data.u8bit.byteHigh = 0; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1557 data.u8bit.byteLow = pHead->profileLength[0]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1558 data.u8bit.byteMidLow = pHead->profileLength[1]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1559 data.u8bit.byteMidHigh = pHead->profileLength[2]; |
e908b894f107
Bugfix: Limit log length in case of corrupted sample storage:
ideenmodellierer
parents:
325
diff
changeset
|
1560 } |
38 | 1561 |
1562 if(data.u32bit != 0xFFFFFF) | |
1563 { | |
1564 data.u32bit += 3; | |
1565 | |
1566 headerOSTC3compact.profileLength[0] = data.u8bit.byteLow; | |
1567 headerOSTC3compact.profileLength[1] = data.u8bit.byteMidLow; | |
1568 headerOSTC3compact.profileLength[2] = data.u8bit.byteMidHigh; | |
1569 | |
1570 headerOSTC3compact.dateYear = pHead->dateYear; | |
1571 headerOSTC3compact.dateMonth = pHead->dateMonth; | |
1572 headerOSTC3compact.dateDay = pHead->dateDay; | |
1573 headerOSTC3compact.timeHour = pHead->timeHour; | |
1574 headerOSTC3compact.timeMinute = pHead->timeMinute; | |
1575 | |
1576 memcpy(headerOSTC3compact.maxDepth, &pHead->maxDepth, 2); | |
1577 memcpy(headerOSTC3compact.diveTimeMinutes, &pHead->diveTimeMinutes, 2); | |
1578 | |
1579 headerOSTC3compact.diveTimeSeconds = pHead->diveTimeSeconds; | |
1580 | |
1581 | |
1582 headerOSTC3compact.totalDiveNumberLow = pHead->diveNumber & 0xFF; | |
1583 headerOSTC3compact.totalDiveNumberHigh = (uint8_t)(pHead->diveNumber/256); | |
1584 headerOSTC3compact.profileVersion = 0x24; // Logbook-Profile version, 0x24 = date and time is start not end | |
1585 } | |
1586 else | |
1587 { | |
1588 memset(&headerOSTC3compact, 0xFF, sizeof(SLogbookHeaderOSTC3compact)); | |
1589 } | |
1590 return &headerOSTC3compact; | |
1591 } | |
1592 | |
1593 | |
1594 /** | |
1595 ****************************************************************************** | |
1596 * @brief logbook_readSampleData. / Reads sample data of whole logbook entry | |
281 | 1597 * @author heinrichs weikamp |
38 | 1598 * @version V0.0.1 |
1599 * @date 22-April-2014 | |
1600 ****************************************************************************** | |
1601 * | |
1602 * @param uint8_t StepBackwards: witch lookbook entry? | |
1603 * @param uint16_t length : maxlength of output arrays | |
1604 * @param int32_t* depth : output array | |
1605 * @param int16_t * gasid : output array | |
1606 * @param int32_t* temperature : output array | |
1607 * @param int32_t* ppo2 : output array | |
1608 * @param int32_t* cns : output array | |
1609 * @return length of output | |
1610 */ | |
1611 void logbook_recover_brokenlog(uint8_t headerId) | |
1612 { | |
1613 int16_t retVal; | |
1614 int32_t depthVal = 0; | |
1615 int16_t gasidVal = 0; | |
1616 int16_t setPointVal = 0; | |
1617 int16_t bailoutVal = 0; | |
1618 int32_t temperatureVal = 0; | |
1619 int32_t sensor1Val = 0; | |
1620 int32_t sensor2Val = 0; | |
1621 int32_t sensor3Val = 0; | |
1622 int32_t cnsVal = 0; | |
1623 SManualGas manualGasVal; | |
1624 | |
1625 //uint16_t* ppo2, uint16_t* cns# | |
1626 uint32_t bytesRead = 0; | |
1627 | |
1628 ext_flash_read_block_start(); | |
1629 ext_flash_read_next_sample_part((uint8_t*)&smallHeader, sizeof(SSmallHeader)); | |
1630 bytesRead += sizeof(SSmallHeader); | |
1631 | |
1632 clear_divisor(); | |
1633 | |
1634 | |
1635 int sampleCounter = 0; | |
1636 int maxdepth = 0; | |
1637 uint32_t avrdepth = 0; | |
1638 while (true) | |
1639 { | |
1640 | |
1641 ext_flash_set_entry_point(); | |
1642 divisorBackup = divisor; | |
1643 retVal = readSample(&depthVal,&gasidVal, &setPointVal, &temperatureVal, &sensor1Val, &sensor2Val, &sensor3Val, &cnsVal, &manualGasVal, &bailoutVal, NULL); | |
1644 if(retVal == 0) | |
1645 { | |
1646 //Error try to read again!!! | |
1647 ext_flash_reopen_read_sample_at_entry_point(); | |
1648 divisor = divisorBackup; | |
1649 retVal = readSample(&depthVal,&gasidVal, &setPointVal, &temperatureVal, &sensor1Val, &sensor2Val, &sensor3Val, &cnsVal, &manualGasVal, &bailoutVal, NULL); | |
1650 | |
1651 if(retVal == 0) | |
1652 { | |
1653 //Error try to read again!!! | |
1654 ext_flash_reopen_read_sample_at_entry_point(); | |
1655 divisor = divisorBackup; | |
1656 retVal = readSample(&depthVal,&gasidVal, &setPointVal, &temperatureVal, &sensor1Val, &sensor2Val, &sensor3Val, &cnsVal, &manualGasVal, &bailoutVal, NULL); | |
1657 | |
1658 if(retVal == 0) | |
1659 { | |
1660 ext_flash_reopen_read_sample_at_entry_point(); | |
1661 break; | |
1662 } | |
1663 | |
1664 } | |
1665 } | |
1666 if(depthVal > maxdepth) | |
1667 maxdepth = depthVal; | |
1668 avrdepth += depthVal; | |
1669 sampleCounter++; | |
1670 bytesRead +=retVal; | |
1671 } | |
1672 avrdepth/= sampleCounter; | |
1673 ext_flash_close_read_sample(); | |
1674 SLogbookHeader header; | |
1675 | |
1676 ext_flash_read_dive_header2((uint8_t*) &header, headerId, false); | |
1677 header.total_diveTime_seconds = sampleCounter * header.samplingRate; | |
1678 header.diveTimeMinutes = header.total_diveTime_seconds /60; | |
1679 header.diveTimeSeconds = header.total_diveTime_seconds - header.diveTimeMinutes * 60; | |
1680 header.maxDepth = maxdepth; | |
1681 header.averageDepth_mbar = avrdepth; | |
1682 SSettings * settings = settingsGetPointer(); | |
1683 settings->lastDiveLogId = headerId; | |
1684 ext_flash_close_new_dive_log((uint8_t *)&header); | |
1685 } | |
1686 | |
1687 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |