Mercurial > public > hwos_code
annotate src/divemode.asm @ 655:c7b7b8a358cd default tip
hwOS tech 3.22 release
author | heinrichsweikamp |
---|---|
date | Mon, 29 Apr 2024 13:05:18 +0200 |
parents | 75e90cd0c2c3 |
children |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
640 | 3 ; File divemode.asm * combined next generation V3.12.3 |
0 | 4 ; |
623 | 5 ; Dive Mode |
0 | 6 ; |
654 | 7 ; Copyright (c) 2011, JD Gascuel, heinrichs weikamp gmbh, all right reserved. |
0 | 8 ;============================================================================= |
9 ; HISTORY | |
10 ; 2011-08-15 : [mH] moving from OSTC code | |
11 | |
604 | 12 #include "hwos.inc" ; mandatory header |
13 #include "shared_definitions.h" ; mailbox from/to p2_deco.c | |
582 | 14 #include "tft_outputs.inc" |
15 #include "strings.inc" | |
16 #include "tft.inc" | |
17 #include "eeprom_rs232.inc" | |
18 #include "math.inc" | |
19 #include "wait.inc" | |
20 #include "customview.inc" | |
21 #include "start.inc" | |
22 #include "adc_lightsensor.inc" | |
23 #include "ghostwriter.inc" | |
24 #include "i2c.inc" | |
25 #include "calibrate.inc" | |
26 #include "convert.inc" | |
623 | 27 #include "surfmode.inc" |
604 | 28 #include "rx_ops.inc" |
623 | 29 |
30 | |
582 | 31 extern do_line_menu |
32 extern do_main_divemenu | |
623 | 33 extern menu_draw_lines_divemode |
634 | 34 extern menu_draw_cursor_dive |
582 | 35 extern init_recording_params |
631 | 36 extern option_check_and_store_all |
582 | 37 |
623 | 38 IFDEF _compass |
39 extern TFT_dive_compass_heading | |
40 ENDIF | |
41 | |
631 | 42 IFDEF _cave_mode |
43 extern do_main_cavemenu | |
44 ENDIF | |
623 | 45 |
634 | 46 |
623 | 47 ;---- Private local Variables ------------------------------------------------- |
582 | 48 |
49 CBLOCK local1 ; max size is 16 Byte !!! | |
50 sensor_setpoint ; sensor ppo2 in 0.01bar for deco routine | |
604 | 51 check_gas_num ; used in search for best gas/dil: current gas/dil number (1-5) |
52 check_gas_depth ; used in search for best gas/dil: current gas/dil change depth | |
53 check_gas_type ; used in search for best gas/dil: current gas/dil type | |
54 check_gas_O2_ratio ; used in search for best gas/dil: current gas/dil O2 ratio | |
55 best_gas_num ; used in search for best gas/dil: best gas/dil number (1-5) CAUTION: there is also a variable named best_gas_number ! | |
56 best_gas_depth ; used in search for best gas/dil: best gas/dil change depth | |
623 | 57 last_pressure_velocity:2 ; cached last absolute pressure for velocity calculation |
58 TFT_output_flags_1 ; TFT update flags for output phase 1 | |
59 TFT_output_flags_2 ; TFT update flags for output phase 2 | |
60 TFT_output_flags_3 ; TFT update flags for output phase 3 | |
61 TFT_output_flags_4 ; TFT update flags for output phase 4 | |
62 DM_flags_local ; various dive mode flags | |
63 ENDC ; used: 14 byte, remaining: 2 byte | |
604 | 64 |
65 CBLOCK local2 ; max size is 16 Byte !!! | |
623 | 66 pressure_rel_accu_trip:4 ; pressure accumulator for calculating the resettable average depth |
67 pressure_rel_accu_total:4 ; pressure accumulator for calculating the total dive average depth | |
68 ppO2_min:2 ; used in search for best gas/dil: minimum ppO2 required | |
69 ppO2_max_default:2 ; used in search for best gas/dil: default maximum ppO2 | |
70 ppO2_max_deco:2 ; used in search for best gas/dil: deco maximum ppO2 | |
634 | 71 ENDC ; used: 14 byte, remaining: 2 byte |
623 | 72 |
73 | |
74 ;---- Private local Flags ---------------------------------------------------- | |
75 | |
76 ; TFT_output_flags_1 - phase 1: every second - before deco calculations, all modes | |
77 #DEFINE FLAG_TFT_depth_current TFT_output_flags_1,0 ; =1: show current depth | |
78 #DEFINE FLAG_TFT_depth_maximum TFT_output_flags_1,1 ; =1: show maximum depth | |
79 #DEFINE FLAG_TFT_active_gas_divemode TFT_output_flags_1,2 ; =1: show active gas and dive mode | |
80 #DEFINE FLAG_TFT_apnoe_surface_time TFT_output_flags_1,3 ; =1: show apnoe mode surface time | |
81 #DEFINE FLAG_TFT_depth_maximum_apnoe TFT_output_flags_1,4 ; =1: show maximum depth of last apnoe dive | |
82 #DEFINE FLAG_TFT_clear_apnoe_surface TFT_output_flags_1,5 ; =1: clear apnoe mode surface data from screen | |
83 #DEFINE FLAG_TFT_apnoe_divetime TFT_output_flags_1,6 ; =1: show apnoe mode dive times | |
631 | 84 #DEFINE FLAG_TFT_temperature TFT_output_flags_1,7 ; =1: show temperature (or resettable dive time when in compass view) |
623 | 85 |
86 ; TFT_output_flags_2 - phase 2: every second - before deco calculations, deco modes only | |
87 #DEFINE FLAG_TFT_divemode_mask TFT_output_flags_2,0 ; =1: show dive mode mask | |
88 #DEFINE FLAG_TFT_divetime TFT_output_flags_2,1 ; =1: show dive time | |
89 #DEFINE FLAG_TFT_safety_stop_show TFT_output_flags_2,2 ; =1: show safety stop | |
90 #DEFINE FLAG_TFT_safety_stop_clear TFT_output_flags_2,3 ; =1: clear safety stop | |
631 | 91 ; TFT_output_flags_2,4 ; --- unused |
623 | 92 ; TFT_output_flags_2,5 ; --- unused |
93 ; TFT_output_flags_2,6 ; --- unused | |
94 ; TFT_output_flags_2,7 ; --- unused | |
95 | |
96 ; TFT_output_flags_3 - phase 3: every second - after deco calculations, deco modes only | |
97 #DEFINE FLAG_TFT_clear_deco_data TFT_output_flags_3,0 ; =1: clear deco data (NDL or stop & TTS) | |
98 #DEFINE FLAG_TFT_display_ndl_mask TFT_output_flags_3,1 ; =1: show NDL mask | |
99 #DEFINE FLAG_TFT_display_deco_mask TFT_output_flags_3,2 ; =1: show deco mask | |
100 #DEFINE FLAG_TFT_display_ndl TFT_output_flags_3,3 ; =1: show NDL data | |
101 #DEFINE FLAG_TFT_display_deco TFT_output_flags_3,4 ; =1: show deco stop data | |
102 #DEFINE FLAG_TFT_display_tts TFT_output_flags_3,5 ; =1: show deco TTS data | |
103 ; TFT_output_flags_3,6 ; --- unused | |
104 ; TFT_output_flags_3,7 ; --- unused | |
105 | |
106 ; TFT_output_flags_4 - phase 4: every second - after deco calculations, all modes | |
631 | 107 #DEFINE FLAG_TFT_customview_callup TFT_output_flags_4,0 ; =1: show the custom view mask |
623 | 108 #DEFINE FLAG_TFT_sign_show TFT_output_flags_4,1 ; =1: show the advice / attention / warning sign |
109 #DEFINE FLAG_TFT_sign_clear TFT_output_flags_4,2 ; =1: clear the advice / attention / warning sign | |
110 #DEFINE FLAG_TFT_message_clear_both TFT_output_flags_4,3 ; =1: clear messages, both rows | |
111 #DEFINE FLAG_TFT_message_clear_2nd TFT_output_flags_4,4 ; =1: clear messages, 2nd row only | |
112 #DEFINE FLAG_TFT_velocity_show TFT_output_flags_4,5 ; =1: show vertical velocity | |
113 #DEFINE FLAG_TFT_velocity_clear TFT_output_flags_4,6 ; =1: clear vertical velocity | |
114 ; TFT_output_flags_4,7 ; --- unused | |
115 | |
116 | |
117 ; various Flags | |
631 | 118 #DEFINE new_deco_data_avail DM_flags_local,0 ; =1: new NDL or deco data available |
634 | 119 #DEFINE update_menu DM_flags_local,1 ; =1: redraw the dive menu |
120 #DEFINE FLAG_SP2_used DM_flags_local,2 ; =1: setpoint 2 has been auto-selected already | |
121 #DEFINE FLAG_SP3_used DM_flags_local,3 ; =1: setpoint 3 has been auto-selected already | |
122 #DEFINE FLAG_SP4_used DM_flags_local,4 ; =1: setpoint 4 has been auto-selected already | |
123 #DEFINE FLAG_SP5_used DM_flags_local,5 ; =1: setpoint 5 has been auto-selected already | |
124 ; DM_flags_local,6 ; --- unused | |
631 | 125 ; DM_flags_local,7 ; --- unused |
623 | 126 |
127 | |
582 | 128 ;============================================================================= |
634 | 129 dmode1 CODE |
130 ;============================================================================= | |
131 | |
132 | |
133 ;----------------------------------------------------------------------------- | |
134 ; Entry Point for Dive Mode | |
135 ; | |
0 | 136 global diveloop |
137 diveloop: | |
623 | 138 clrf STKPTR ; clear return addresses stack |
139 | |
140 ; start with a clean time base | |
141 bsf reset_timebase ; request ISR to reset the main timebase, | |
142 ; as we are in dive mode the dive timers will be reset as well | |
143 | |
144 ; reset global flags | |
145 clrf DM_flags_state ; clear all flags for dive mode status | |
146 clrf DM_flags_event ; clear all flags for data recording events | |
631 | 147 clrf DM_flags_request ; clear all flags for user requests / general |
148 IFDEF _cave_mode | |
149 clrf DM_flags_cavereq ; clear all flags for user requests / cave mode | |
150 ENDIF | |
623 | 151 clrf DM_flags_layout1 ; clear all flags for display control / layout (1) |
152 clrf DM_flags_layout2 ; clear all flags for display control / layout (2) | |
631 | 153 clrf DM_flags_layout3 ; clear all flags for display control / layout (3) |
623 | 154 clrf DM_flags_message ; clear all flags for display control / messages |
631 | 155 clrf DM_flags_gas_dil ; clear all flags for display control / gases, diluents, depth |
623 | 156 |
634 | 157 clrf DM_flags_advc_det ; clear all flags for advices detection |
158 clrf DM_flags_advc_ack ; clear all flags for advices acknowledged | |
159 | |
160 clrf DM_flags_att1_det ; clear all flags for attentions detection | |
161 clrf DM_flags_att2_det ; ... | |
162 clrf DM_flags_att3_det ; ... | |
163 | |
164 clrf DM_flags_att1_ack ; clear all flags for attentions acknowledged | |
165 clrf DM_flags_att2_ack ; ... | |
166 clrf DM_flags_att3_ack ; ... | |
167 | |
168 clrf DM_flags_war1_det ; clear all flags for warnings detection | |
169 clrf DM_flags_war2_det ; ... | |
170 | |
171 clrf DM_flags_war1_ack ; clear all flags for warnings acknowledged | |
172 clrf DM_flags_war2_ack ; ... | |
173 | |
174 clrf DM_flags_shown1 ; arm auto show-up of custom views | |
175 clrf DM_flags_shown2 ; ... | |
176 clrf DM_flags_shown3 ; ... | |
177 | |
178 bcf dive_main_menu ; clear dive main menu flag | |
179 bcf dive_pre_menu ; clear dive pre-menu flag | |
623 | 180 |
181 ; reset local flags | |
182 clrf TFT_output_flags_1 ; clear all flags for TFT output phase 1 | |
183 clrf TFT_output_flags_2 ; clear all flags for TFT output phase 2 | |
184 clrf TFT_output_flags_3 ; clear all flags for TFT output phase 3 | |
185 clrf TFT_output_flags_4 ; clear all flags for TFT output phase 4 | |
186 clrf DM_flags_local ; clear all the various other flags, too | |
187 | |
188 ; boot tasks for all modes | |
634 | 189 call diveloop_boot ; initialize dive mode |
604 | 190 |
191 ; startup tasks for all modes | |
192 call TFT_boot ; initialize TFT (includes clear screen) | |
634 | 193 call TFT_load_dive_color_pallet ; load dive color pallet |
623 | 194 call TFT_show_divemode_mask ; display static dive mode mask |
195 call TFT_Display_FadeIn ; dim up the display | |
196 | |
634 | 197 ; arm dive start timer |
623 | 198 bcf divetime_longer_1min ; the dive has just begun |
199 btfsc FLAG_apnoe_mode ; in apnea mode? | |
200 bsf divetime_longer_1min ; YES - force dive to have lasted for longer than 1 minute already | |
201 btfsc sensor_override_active ; in simulator mode? | |
202 bsf divetime_longer_1min ; YES - force dive to have lasted for longer than 1 minute already | |
203 | |
634 | 204 ; initiate initial display outputs |
623 | 205 bsf trigger_pres_cur_changed ; flag that the pressures have changed to have all data... |
206 bsf trigger_pres_max_changed ; ... written to the display on the first output round | |
207 bsf trigger_temp_changed ; flag that the temperature has changed to have the temperature ... | |
208 ; ... written to the display on the first output round | |
209 bsf new_deco_data_avail ; flag that new deco engine results are available to have the initial data ... | |
210 ; ... written to the display on the first output round | |
211 | |
634 | 212 ; initialize the resettable average depth |
213 call resettable_average_depth_init | |
214 | |
215 ; reload and redraw last custom view | |
216 movff customview_divemode,active_customview | |
217 bsf FLAG_TFT_customview_callup | |
623 | 218 |
219 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
220 bra diveloop_1 ; YES - done with initialization | |
221 btfsc FLAG_gauge_mode ; NO - in gauge mode? | |
222 bra diveloop_1 ; YES - done with initialization | |
634 | 223 bsf FLAG_TFT_display_ndl_mask ; NO - request initial display of NDL mask |
623 | 224 bsf FLAG_TFT_active_gas_divemode; - request initial display of gas and setpoint |
225 | |
226 diveloop_1: | |
227 btfsc reset_timebase ; has the ISR confirmed reset of the timebase meanwhile? | |
634 | 228 bra $-2 ; NO - not yet, loop waiting for confirmation before entering the dive loop |
229 ;bra diveloop_loop ; YES - enter the dive loop | |
230 | |
231 | |
232 ;----------------------------------------------------------------------------- | |
233 ; Dive Mode Mail Loop | |
234 ; | |
623 | 235 diveloop_loop: |
643 | 236 btfss trigger_quarter_second ; new 1/4 second? |
237 bra diveloop_loop_0 ; No - continue | |
238 | |
239 ;---- tasks any new 1/4 second ----- | |
240 bcf trigger_quarter_second ; YES - clear flag | |
241 | |
242 movlw .4 ; 62,5ms * 4 = 1/4 second | |
243 movff WREG,isr_tmr7_helper ; to make sure at least 1/4 will pass before trigger_quarter_second is re-set | |
244 | |
245 btfss press_sensor_type ; New sensor found? | |
246 bra diveloop_loop_0 ; No - continue | |
247 | |
248 ; Handle new pressure sensor every 1/4 second | |
249 btfsc ms5837_state ; =0: result of temperature is in the ADC | |
250 bra diveloop_loop_quarter_2 | |
251 call I2C_get_temp_val_MS5837 ; (Will set ms5837_state) | |
252 bra diveloop_loop_0 ; Done. | |
253 diveloop_loop_quarter_2: | |
254 call I2C_get_press_val_MS5837 ; (Will clear ms5837_state) | |
255 ;---- tasks any new 1/4 second done ----- | |
256 | |
257 diveloop_loop_0: | |
258 btfsc trigger_full_second ; new 1/1 second? | |
623 | 259 bra diveloop_loop_2 ; YES - continue with tasks every 1/1 second |
260 btfsc trigger_half_second ; NO - new 1/2 second? | |
261 bra diveloop_loop_1 ; YES - continue with tasks every 1/2 second | |
262 | |
263 ; tasks every round except every 1/1 or 1/2 second | |
264 IFDEF _compass | |
265 movlw index_compass_dm ; index of compass view | |
266 cpfseq active_customview ; in compass view? | |
267 bra diveloop_loop_11 ; NO - continue with tasks every round | |
268 call TFT_dive_compass_heading ; YES - update compass heading value | |
269 bsf FLAG_TFT_temperature ; - redraw temperature (will show resettable dive time now) | |
270 ENDIF | |
271 bra diveloop_loop_11 ; - continue tasks every round | |
272 | |
273 diveloop_loop_1: | |
274 ; tasks every 1/2 second | |
275 bcf trigger_half_second ; clear flag | |
276 btfsc FLAG_gauge_mode ; in gauge mode? | |
277 bra diveloop_loop_11 ; YES - done with 1/2 second tasks | |
278 btfsc FLAG_apnoe_mode ; NO - in apnoe mode? | |
279 bra diveloop_loop_11 ; YES - done with 1/2 second tasks | |
280 | |
281 ; tasks every 1/2 second in deco modes | |
631 | 282 call callup_deco_engine ; ##### manage and invoke the deco calculation engine ##### |
623 | 283 bra diveloop_loop_11 ; done with 1/2 second tasks |
284 | |
285 diveloop_loop_2: | |
286 ; tasks every 1/1 second (code includes tasks every 1/2 second that fall onto the full second) | |
287 bcf trigger_full_second ; clear flag for new 1/1 second | |
288 bcf trigger_half_second ; clear flag for new 1/2 second as well | |
289 | |
290 btfss trigger_temp_changed ; has the temperature changed? | |
291 bra diveloop_loop_3 ; NO - continue with tasks every 1/1 second | |
292 | |
293 bsf FLAG_TFT_temperature ; YES - display temperature | |
294 bcf trigger_temp_changed ; - clear flag | |
295 | |
296 ; "future hardware will need min temperature checked every second..." (?) | |
297 | |
298 MOVII temperature_min,sub_a ; - copy last temperature_min to sub_a | |
299 SMOVII temperature_cur,sub_b ; - ISR-safe 2 byte copy of current temperature to sub_b | |
300 call sub16 ; - sub_c = sub_a - sub_b = temperature_min - temperature | |
301 btfsc neg_flag ; - temperature > temperature_min ? | |
302 bra diveloop_loop_3 ; YES - done | |
303 MOVII sub_b,temperature_min ; NO - store new minimum temperature | |
304 | |
305 diveloop_loop_3: | |
306 ; tasks every 1/1 second | |
307 btfss trigger_pres_cur_changed ; has the pressure changed? | |
308 bra diveloop_loop_4 ; NO - continue with tasks every 1/1 second | |
309 | |
310 ; set flags | |
311 bcf trigger_pres_cur_changed ; clear flag for pressure change | |
312 bsf FLAG_TFT_depth_current ; set flag to display updated depth | |
313 | |
314 ; cache new absolute and relative pressure, ISR-safe 2 byte copies | |
315 SMOVII pressure_abs, pressure_abs_cached | |
316 SMOVII pressure_rel_cur,pressure_rel_cur_cached | |
317 | |
318 ; transfer absolute pressure to deco engine | |
319 MOVII pressure_abs_cached,int_I_pres_respiration | |
320 | |
321 ; compute absolute pressure / 10, will be used later on a couple of times | |
322 MOVII pressure_abs_cached,xA | |
323 MOVLI .10,xB | |
324 call div16x16 ; xC = xA / xB = absolute pressure / 10 | |
325 MOVII xC,pressure_abs_10 ; store result for later use | |
604 | 326 |
327 ; compute current depth in meters | |
631 | 328 MOVII pressure_rel_cur_cached,mpr ; copy current relative pressure in [mbar] to MPR |
329 call convert_pres_to_depth ; convert pressure in [mbar] to depth in [cm] | |
330 ADDLI .50,mpr ; add 50 cm for rounding up/down around 0.5 meters | |
331 MOVII mpr, xA ; copy depth in [cm] into xA | |
332 MOVLI .100,xB ; load factor 100 cm/m into xB | |
623 | 333 call div16x16 ; xC = xA / xB = depth in full meters |
631 | 334 movff xC+0,depth_meter ; store result as depth in [m], only low byte needed |
623 | 335 |
336 ; check for new max pressure | |
337 btfss trigger_pres_max_changed ; has the max pressure changed? | |
338 bra diveloop_loop_4 ; NO - continue with tasks every 1/1 second | |
339 bcf trigger_pres_max_changed ; YES - clear flag for new max pressure | |
340 bsf FLAG_TFT_depth_maximum ; - set flag for displaying new max depth | |
341 SMOVII pressure_rel_max,pressure_rel_max_cached ; - cache new max depth | |
342 | |
343 diveloop_loop_4: | |
344 ; continue tasks every 1/1 second | |
345 | |
640 | 346 IFDEF _ccr_pscr |
347 ; adjust auto-setpoint | |
348 btfsc FLAG_ccr_mode ; in CCR mode? | |
349 call check_dive_autosp ; YES - check for Auto-SP | |
350 ENDIF | |
351 | |
623 | 352 IFDEF _external_sensor |
353 btfsc FLAG_ccr_mode ; in CCR mode? | |
634 | 354 rcall calc_deko_divemode_sensor ; YES - process sensor readings |
623 | 355 btfsc FLAG_pscr_mode ; in pSCR mode? |
634 | 356 rcall calc_deko_divemode_sensor ; YES - process sensor readings |
623 | 357 ENDIF |
358 | |
631 | 359 IFDEF _cave_mode |
360 btfss cave_mode ; cave mode switched on? | |
361 bra diveloop_loop_4a ; NO - no backtracking depth recording | |
362 btfsc dive_turned ; dive turned? | |
363 bra diveloop_loop_4a ; YES - no backtracking depth recording | |
364 btfsc backtrack_entire_full ; backtracking storage entirely used up? | |
365 bra diveloop_loop_4a ; YES - no backtracking depth recording | |
366 | |
367 incf backtrack_deltatime,F ; increment time elapsed since last depth recording | |
368 movlw .59 ; load WREG with coding of last second of a minute | |
369 cpfsgt backtrack_deltatime ; time elapsed since last depth recording > 59 seconds? | |
370 bra diveloop_loop_4a ; NO - no backtracking depth recording now | |
371 rcall write_backtrack_1min_depth ; - store a backtracking depth data set | |
372 ENDIF | |
373 | |
374 diveloop_loop_4a: | |
375 ; continue tasks every 1/1 second | |
376 | |
623 | 377 btfsc FLAG_apnoe_mode ; in apnoe mode? |
378 rcall divemode_apnoe_tasks ; YES - do 1 sec. apnoe tasks | |
379 | |
380 ; display all animated (blinking) values at the beginning of each full second to have a stable timebase | |
381 rcall TFT_output_1 ; do display updates | |
382 | |
383 btfss FLAG_apnoe_mode ; in apnoe mode? | |
384 bra diveloop_loop_5 ; NO - continue with deco mode tasks every 1/1 second | |
385 | |
386 ; apnoe mode tasks every 1/1 second | |
387 call dive_customview_second ; do every second tasks for the custom view area | |
388 bra diveloop_loop_10 ; continue with common tasks every 1/1 second | |
389 | |
390 diveloop_loop_5: | |
391 ; deco mode tasks every 1/1 second | |
392 bsf FLAG_TFT_divetime ; display (new) dive time | |
393 | |
394 rcall safety_stop_show ; serve safety stop | |
395 | |
396 rcall TFT_output_2 ; do display updates | |
397 | |
398 call divemode_check_warnings ; check for warnings | |
604 | 399 |
400 IFDEF _rx_functions | |
623 | 401 btfss tr_functions_activated ; TR functions activated? |
402 bra diveloop_loop_6 ; NO - continue with deco mode tasks every 1/2 second | |
604 | 403 call get_pressure_readings ; YES - get pressure readings |
404 call configure_sac_calculation ; - set up SAC calculation | |
405 ENDIF | |
582 | 406 |
623 | 407 diveloop_loop_6: |
408 ; deco mode tasks every 1/1 second | |
409 INCI divesecs_avg_trip ; increment the resettable dive time | |
628 | 410 INCI divesecs_avg_total ; increment the total dive time |
623 | 411 |
412 btfsc FLAG_gauge_mode ; in gauge mode? | |
413 bra diveloop_loop_7 ; YES - skip deco calculations | |
414 | |
631 | 415 call callup_deco_engine ; ##### manage and invoke the deco calculation engine ##### |
623 | 416 |
417 btfsc new_deco_data_avail ; new NDL or deco data available? | |
634 | 418 call show_new_deco_data ; YES - set-up display update requests |
623 | 419 |
420 btfsc decostop_active ; in deco mode? | |
421 bsf FLAG_TFT_display_deco ; YES - update deco stop depth & time every second because of depth-dependent color-coding | |
422 | |
423 bsf FLAG_TFT_depth_current ; set flag to display depth (in next round, needed in deco modes irrespectively of a pressure change for color-coding and blinking effects) | |
424 | |
425 diveloop_loop_7: | |
426 ; deco mode tasks alternating every 2 seconds on timebase | |
427 btfss timebase_1sec ; on even second of timebase? | |
428 rcall calc_velocity ; YES - calculate velocity and display if > threshold | |
429 btfsc timebase_1sec ; on odd second of timebase? | |
430 call check_gas_best ; YES - check if a better gas cue can be given | |
431 | |
432 diveloop_loop_8: | |
433 ; deco mode tasks alternating every 2 seconds on resettable dive time | |
434 btfss divesecs_avg_trip+0,0 ; on even second of resettable dive time? | |
631 | 435 call calc_average_depth ; YES - calculate average depth |
623 | 436 btfsc divesecs_avg_trip+0,0 ; on odd second of resettable dive time? |
437 rcall safety_stop_control ; YES - exercise safety stop control | |
438 | |
439 diveloop_loop_9: | |
440 ; deco mode tasks every 1/1 second | |
628 | 441 rcall check_deco_states ; check and lock if in deco and in the deco stops region |
623 | 442 rcall TFT_output_3 ; do display updates |
443 | |
444 diveloop_loop_10: | |
445 ; common tasks every 1/1 second | |
634 | 446 rcall timeout_divemode ; check for timeout conditions |
447 call check_dive_modes_dive ; test if depth still deeper than threshold | |
623 | 448 |
449 btfsc trigger_full_minute ; has next minute begun? | |
450 rcall update_divemode60 ; YES - update clock, etc. | |
451 | |
452 btfss FLAG_oc_mode ; are we in OC mode? | |
453 bsf FLAG_TFT_active_gas_divemode; NO - have the gas and setpoint redrawn on every second to update setpoint display, animate the blinking, etc. | |
454 | |
455 btfsc dive_main_menu ; dive mode menu shown? | |
456 bsf update_menu ; YES - request update | |
457 | |
458 rcall TFT_output_4 ; do display updates | |
459 | |
460 ; tasks every round, every mode | |
461 diveloop_loop_11: | |
634 | 462 call test_switches_divemode ; check switches, in case branch into menu processor |
463 bra diveloop_loop_12 ; continue the dive loop | |
464 | |
465 | |
466 ; **** jump-in when returning from menu processor **** | |
467 ; | |
468 global divemode_option_divemenu_return | |
469 divemode_option_divemenu_return: | |
470 clrf STKPTR ; reset the stack | |
471 call menu_draw_cursor_dive ; show the cursor | |
472 bsf dive_main_menu ; set main menu is shown now | |
473 clrf active_premenu ; set pre-menu is not shown any more | |
474 bcf safety_stop_active ; set safety stop is not shown any more | |
475 movlw divemode_timeout_mainmenu ; get timeout for main menu | |
476 call restart_timeout_time ; restart the timeout | |
477 bra diveloop_loop_12 ; continue the dive loop | |
478 | |
479 | |
480 ; **** jump-in when returning from dive mode menu **** | |
481 ; | |
623 | 482 global diveloop_menu_exit |
634 | 483 diveloop_menu_exit: |
484 clrf STKPTR ; reset the stack | |
485 call divemenu_cleanup ; clean up menu area and restore dive data | |
486 ;bra diveloop_loop_12 ; continue the dive loop | |
487 | |
623 | 488 |
489 diveloop_loop_12: | |
643 | 490 bsf FLAG_TFT_active_gas_divemode; redraw gas and setpoint (eventually needed to restore the "Bailout" text) |
623 | 491 |
492 btfsc request_next_custview ; shall show next custom view? | |
634 | 493 call dive_customview_toggle ; YES - show next custom view |
623 | 494 |
631 | 495 btfsc request_gas_change ; shall change gas? |
496 call gas_switch_common ; YES | |
497 | |
498 btfsc request_gas_update ; shall update the gases? | |
499 call gas_update_common ; YES | |
0 | 500 |
623 | 501 btfsc request_toggle_GF ; shall toggle GF/aGF? |
634 | 502 call divemodemode_togglegf ; YES |
0 | 503 |
604 | 504 IFDEF _cave_mode |
631 | 505 btfsc request_cave_off_turned ; shall switch cave mode off and set the dive as turned? |
506 rcall cavemode_switch_off_turned ; YES | |
507 | |
508 btfsc request_cave_toggle ; shall toggle cave mode off/on? | |
509 rcall cavemode_toggle_onoff ; YES | |
510 | |
511 btfsc request_turn_turn ; shall turn the dive? | |
512 rcall cavemode_turndive_turn ; YES | |
513 | |
514 btfsc request_turn_toggle ; shall toggle the turn dive state? | |
515 rcall cavemode_turndive_toggle ; YES | |
516 | |
517 btfsc request_waypoint_set ; shall set a waypoint? | |
518 rcall cavemode_waypoint_set ; YES | |
519 | |
520 btfsc request_waypoint_out ; shall step one waypoint out of the cave? | |
521 rcall cavemode_waypoint_out ; YES | |
522 | |
523 btfsc request_waypoint_in ; shall step one waypoint into the cave? | |
524 rcall cavemode_waypoint_in ; YES | |
604 | 525 ENDIF |
526 | |
623 | 527 btfsc request_set_marker ; shall set a marker? |
582 | 528 call set_logbook_marker ; YES |
529 | |
623 | 530 btfsc trigger_sample_divedata ; shall store new sample of dive data? |
604 | 531 call store_dive_data ; YES - store profile data |
532 | |
533 btfss divemode ; dive finished? | |
623 | 534 goto ghostwriter_end_dive ; YES - dive finished |
604 | 535 |
536 IFDEF _screendump | |
623 | 537 btfsc screen_dump_avail ; screen dump function enabled? |
604 | 538 call TFT_dump_screen_check ; YES - check if requested and do it |
539 ENDIF | |
540 | |
634 | 541 bra diveloop_loop ; do next loop in dive mode |
542 | |
543 | |
544 ;----------------------------------------------------------------------------- | |
545 ; Dive Mode Tasks every 1/1 Minute | |
546 ; | |
547 update_divemode60: | |
548 bcf trigger_full_minute ; clear flag | |
549 | |
550 call get_battery_voltage ; get battery voltage | |
551 btfss battery_low_condition ; battery low condition detected? | |
552 bra update_divemode60_1 ; NO - skip next | |
553 movlw d'7' ; YES - set type of alarm = battery low | |
554 movwf alarm_type ; - copy to alarm register | |
555 bsf event_occured ; - set event flag | |
556 movlw .0 ; - coding of brightness level ECO | |
645 | 557 movff WREG,opt_brightness_divemode ; - set brightness to ECO |
634 | 558 |
559 update_divemode60_1: | |
560 ; max allowed runtime in simulator is 254 minutes in | |
561 ; order for the tissue calculation catch-up to work! | |
562 | |
563 btfss sensor_override_active ; in simulator mode? | |
564 return ; NO - done | |
565 movlw simulator_timeout_normal ; YES - set simulation timeout | |
566 IFDEF _cave_mode | |
567 TSTOSC opt_cave_mode ; - cave mode switched on? | |
568 movlw simulator_timeout_cave ; YES - replace with cave mode simulation timeout | |
569 ENDIF | |
570 cpfsgt counted_divetime_mins+0 ; - timeout? | |
571 return ; NO - done | |
572 IFDEF _DEBUG | |
573 return ; YES - but we do not care in debug mode... | |
574 ELSE | |
575 goto divemode_option_sim_quit ; YES - set depth to 0 m and return | |
576 ENDIF | |
577 | |
578 | |
579 ;----------------------------------------------------------------------------- | |
580 ; Helper Function - set-up Display Update Requests | |
581 ; | |
582 show_new_deco_data: | |
583 bcf new_deco_data_avail ; reset flag for new NDL or deco data available | |
584 movff char_O_deco_info,WREG ; get the deco info vector | |
585 btfsc WREG,deco_stops_norm ; deco stops found? | |
586 bra show_new_deco_data_deco ; YES - in deco | |
587 ;bra show_new_deco_data_ndl ; NO - within NDL | |
588 | |
589 show_new_deco_data_ndl: ; within NDL | |
590 btfsc decostop_active ; been in deco mode before? | |
591 bsf FLAG_TFT_clear_deco_data ; YES - clear old deco data | |
592 btfsc decostop_active ; been in deco mode before? | |
593 bsf FLAG_TFT_display_ndl_mask ; YES - display NDL data mask | |
594 bcf decostop_active ; clear flag for been in deco mode before | |
595 bsf FLAG_TFT_display_ndl ; display NDL time | |
596 return ; done | |
597 | |
598 show_new_deco_data_deco: ; in deco | |
599 btfss decostop_active ; been in deco mode before? | |
600 bsf FLAG_TFT_clear_deco_data ; NO - clear old NDL data | |
601 btfss decostop_active ; been in deco mode before? | |
602 bsf FLAG_TFT_display_deco_mask ; NO - display deco data mask | |
603 bsf decostop_active ; set flag for being in deco mode | |
604 bsf FLAG_TFT_display_tts ; display TTS time (display of stop data is managed separately) | |
605 return ; done | |
606 | |
607 | |
608 ;----------------------------------------------------------------------------- | |
609 ; Helper Function - do all Phase 1 Display Outputs | |
610 ; | |
623 | 611 TFT_output_1: ; every second - before deco calculations, all mode |
612 btfsc FLAG_TFT_clear_apnoe_surface ; shall clear apnoe mode surface data from screen? | |
613 call TFT_clear_apnoe_surface ; YES - clear apnoe mode surface data from screen | |
614 | |
615 btfsc FLAG_TFT_depth_current ; shall show depth? | |
616 call TFT_show_depth ; YES - display depth | |
617 btfsc FLAG_TFT_depth_maximum ; shall show max depth? | |
618 call TFT_show_max_depth ; YES - display max depth | |
619 btfsc FLAG_TFT_active_gas_divemode ; shall show active gas and dive mode? | |
620 call TFT_show_active_gas_divemode ; YES - display gas, setpoint and mode | |
631 | 621 btfsc FLAG_TFT_temperature ; shall show temperature? |
622 call TFT_show_temp_divemode ; YES - display temperature (or resettable dive time) | |
623 | 623 |
624 btfsc FLAG_TFT_apnoe_surface_time ; shall show apnoe mode surface time? | |
625 call TFT_show_apnoe_surface ; YES - show apnoe mode surface time | |
626 btfsc FLAG_TFT_depth_maximum_apnoe ; shall show max. depth of last dive? | |
627 call TFT_show_apnoe_max_depth ; YES - show max. depth of last dive | |
628 btfsc FLAG_TFT_apnoe_divetime ; shall show apnoe dive time? | |
629 call TFT_show_apnoe_times ; YES - show apnoe dive time? | |
654 | 630 btfsc FLAG_TFT_depth_maximum_apnoe ; shall show max. depth of last dive? (Flag re-used here for #dive) |
631 call TFT_apnoe_divecounter ; YES - show apnoe #dive counter? | |
623 | 632 |
633 clrf TFT_output_flags_1 ; mark all TFT updates done | |
634 return ; done | |
635 | |
634 | 636 |
637 ;----------------------------------------------------------------------------- | |
638 ; Helper Function - do all Phase 2 Display Outputs | |
639 ; | |
623 | 640 TFT_output_2: ; every second - before deco calculations, deco modes only |
641 btfsc FLAG_TFT_divemode_mask ; shall re-draw mask? | |
642 call TFT_show_divemode_mask ; YES - re-draw mask | |
643 btfsc FLAG_TFT_divetime ; shall show dive time? | |
644 call TFT_show_divetime ; YES - show dive time | |
645 btfsc FLAG_TFT_safety_stop_show ; shall show safety stop? | |
646 call TFT_safety_stop_show ; YES - show safety stop | |
647 btfsc FLAG_TFT_safety_stop_clear ; shall clear safety stop? | |
648 call TFT_safety_stop_clear ; YES - clear safety stop | |
654 | 649 |
623 | 650 clrf TFT_output_flags_2 ; mark all TFT updates done |
651 goto dive_customview_second ; do every-second tasks for the custom view area (in sync with the dive time) and return | |
652 | |
634 | 653 |
654 ;----------------------------------------------------------------------------- | |
655 ; Helper Function - do all Phase 3 Display Outputs | |
656 ; | |
623 | 657 TFT_output_3: ; every second - after deco calculations, deco modes only |
658 btfsc FLAG_TFT_clear_deco_data ; shall clear deco data (NDL or stop & TTS)? | |
659 call TFT_clear_deco_data ; YES - clear deco data (NDL or stop & TTS) | |
660 btfsc FLAG_TFT_display_ndl_mask ; shall show NDL mask? | |
661 call TFT_show_ndl_mask ; YES - show NDL mask | |
662 btfsc FLAG_TFT_display_ndl ; shall show NDL data? | |
663 call TFT_show_ndl ; YES - show NDL data | |
664 btfsc FLAG_TFT_display_deco_mask ; shall show deco mask? | |
665 call TFT_show_deco_mask ; YES - show deco mask | |
666 btfsc FLAG_TFT_display_deco ; shall show deco stop? | |
667 call TFT_show_deco ; YES - show deco stop | |
668 btfsc FLAG_TFT_display_tts ; shall show deco TTS? | |
669 call TFT_show_tts ; YES - show deco TTS | |
670 clrf TFT_output_flags_3 ; mark all TFT updates done | |
671 return ; done | |
672 | |
634 | 673 |
674 ;----------------------------------------------------------------------------- | |
675 ; Helper Function - do all Phase 4 Display Outputs | |
676 ; | |
623 | 677 TFT_output_4: ; every second - after deco calculations, all modes |
631 | 678 btfsc FLAG_TFT_customview_callup ; shall show a custom view? |
679 call dive_customview_callup ; YES - show a custom view | |
623 | 680 btfsc FLAG_TFT_velocity_show ; shall show vertical velocity? |
631 | 681 call TFT_velocity_show ; YES - show vertical velocity |
623 | 682 btfsc FLAG_TFT_velocity_clear ; shall clear vertical velocity? |
631 | 683 call TFT_velocity_clear ; YES - clear vertical velocity |
623 | 684 btfsc FLAG_TFT_sign_show ; shall show the advice / attention / warning sign? |
685 call TFT_divemode_sign_show ; YES - show sign | |
686 btfsc FLAG_TFT_sign_clear ; shall clear the advice / attention / warning sign? | |
687 call TFT_divemode_sign_clear ; YES - clear sign | |
688 btfsc FLAG_TFT_message_clear_both ; shall clear all messages? | |
689 call TFT_clear_message_window ; YES - clear complete message area | |
690 btfsc FLAG_TFT_message_clear_2nd ; shall clear 2nd row of message area? | |
691 call TFT_clear_message_window_row2 ; YES - clear 2nd row of message area | |
692 clrf TFT_output_flags_4 ; mark all TFT updates done | |
693 return ; done | |
582 | 694 |
634 | 695 |
696 ;----------------------------------------------------------------------------- | |
697 ; Apnoe Mode Tasks | |
698 ; | |
628 | 699 divemode_apnoe_tasks: ; 1 sec. apnoe tasks |
700 bsf FLAG_TFT_apnoe_divetime ; show apnoe dive times (current/last dive and total) | |
701 btfsc apnoe_at_surface ; at the surface? | |
702 bra divemode_apnoe_tasks_surf ; YES - at the surface | |
703 ;bra divemode_apnoe_tasks_dive ; NO - in dive phase | |
704 | |
705 divemode_apnoe_tasks_dive: ; apnoe mode, submerged | |
706 btfss apnoe_new_dive ; new dive begun? | |
707 return ; NO - done | |
708 bcf apnoe_new_dive ; YES - clear flag | |
709 bsf FLAG_TFT_clear_apnoe_surface ; - clear apnoe mode surface data from screen | |
654 | 710 incf apnoe_dive_counter,F ; Increase #dive counter |
628 | 711 return ; - done |
712 | |
713 divemode_apnoe_tasks_surf: ; apnoe mode, at the surface | |
714 bsf FLAG_TFT_apnoe_surface_time ; show apnoe mode surface time | |
623 | 715 ; TODO: these outputs would need to be done only once after surfacing... |
628 | 716 bsf FLAG_TFT_depth_maximum_apnoe ; show max. depth of last dive |
717 bsf FLAG_TFT_depth_maximum ; show max. depth of all dives | |
718 ;bra apnoe_calc_maxdepth ; calculate overall max. depth and return | |
623 | 719 |
0 | 720 |
634 | 721 ;----------------------------------------------------------------------------- |
722 ; Helper Function - calculate Apnoe Mode overall maximum Depth | |
723 ; | |
0 | 724 global apnoe_calc_maxdepth |
725 apnoe_calc_maxdepth: | |
623 | 726 MOVII apnoe_max_pressure, sub_a ; get max depth from all dives to far |
727 MOVII pressure_rel_max_cached,sub_b ; get max depth of last dive | |
728 call cmpU16 ; sub_a - sub_b = apnoe_max_pressure - pressure_rel_max_cached | |
729 btfss neg_flag ; last dive deeper than all the others before? | |
730 return ; NO - done | |
731 MOVII pressure_rel_max_cached,apnoe_max_pressure ; YES - store new overall max depth | |
732 return ; - done | |
0 | 733 |
634 | 734 |
735 ;----------------------------------------------------------------------------- | |
736 ; Manage and invoke the Deco Calculation Engine | |
737 ; | |
738 callup_deco_engine: | |
739 | |
631 | 740 ; Any reconfiguration done here only affects the deco calculation (prediction), not the |
741 ; settings for the calculations done on the real tissues. The later ones are only altered | |
742 ; in case of a gas change, in case of a real bailout, or in case a switchback to setpoint | |
743 ; or sensor is done. | |
744 ; On event of a gas change, a diluent change, a real bailout, or a switchback, the settings | |
745 ; for the deco calculation are also automatically changed to match with the settings for the | |
746 ; real tissues. This is all done in the function 'gas_switch_common' which is triggered by | |
747 ; the flag 'request_gas_change'. | |
748 | |
749 ; Deco Engine Calculation Schedules: | |
750 ; | |
634 | 751 ; Schedule Dive Mode Bailout fTTS Gas Needs Plan Deco Mode calculated Functions |
752 ; ----------------------------------------------------------------------------------------------------- | |
631 | 753 ; |
634 | 754 ; 1a) OC no no (yes) norm OC TTS, CNS, deco plan, (gas needs) |
755 ; no alt plan | |
560 | 756 ; |
634 | 757 ; 1b) OC no YES (yes) norm OC TTS, CNS, deco plan |
758 ; alt OC fTTS, fCNS, (gas needs) | |
631 | 759 ; |
634 | 760 ; 2a) Loop no no no norm Loop TTS, CNS, deco plan |
761 ; no alt plan | |
631 | 762 ; |
634 | 763 ; 2b) Loop no yes no norm Loop TTS, CNS, deco plan |
764 ; alt Loop fTTS, fCNS | |
631 | 765 ; |
634 | 766 ; 2c) Loop no (yes) YES norm Loop TTS, CNS, deco plan |
767 ; alt OC fTTS*, fCNS*, gas needs <- "what if" BAILOUT | |
631 | 768 ; |
634 | 769 ; 3) Loop YES n/a (yes) norm OC TTS, deco plan, (gas needs) <- real BAILOUT |
770 ; no alt plan | |
771 ; _____________________________________________________________________________________________________ | |
772 ; norm: normal plan, alt: alternative plan, (): optional, n/a: not applicable | |
773 ; * the fTTS time is set to zero when in cave mode and the dive is in turned state | |
774 | |
604 | 775 |
776 ; get working copies of char_O_main_status and char_O_deco_status | |
777 movff char_O_main_status,hi ; get char_O_main_status into hi | |
778 movff char_O_deco_status,lo ; get char_O_deco_status into lo | |
779 | |
780 ; check state of deco calculations | |
631 | 781 btfsc request_restart_engine ; restart of the deco engine requested? |
782 bra calc_deco_engine_restart ; YES - start a new normal plan | |
783 btfsc lo,DECO_COMPLETED_NORM ; NO - finished calculations for normal plan? | |
784 bra calc_deco_engine_alt ; YES - eventually do an alternative plan next | |
785 btfsc lo,DECO_COMPLETED_ALT ; NO - finished calculations for alternative plan? | |
786 bra calc_deco_engine_norm ; YES - do a normal plan next | |
787 bra calc_deco_engine_exec ; NO - continue executing current calculation | |
788 | |
789 calc_deco_engine_restart: | |
790 bcf request_restart_engine ; clear request flag | |
791 bcf lo,DECO_COMPLETED_NORM ; clear completion flag from normal plan if applicable | |
792 ;bra calc_deco_engine_norm ; continue with calculating a normal plan | |
793 | |
634 | 794 |
631 | 795 ; ---- normal plans ---- |
634 | 796 ; |
623 | 797 calc_deco_engine_norm: |
631 | 798 bcf lo,DECO_COMPLETED_ALT ; clear completion flag from alternative plan |
799 IFDEF _ccr_pscr | |
800 btfsc bailout_mode ; in real bailout? | |
801 bra calc_deco_engine_norm_3 ; YES - configure real bailout schedule | |
802 btfss FLAG_oc_mode ; in OC dive mode? | |
803 bra calc_deco_engine_norm_2 ; NO - configure loop schedules | |
804 ;bra calc_deco_engine_norm_1 ; YES - configure OC schedules | |
604 | 805 ENDIF |
806 | |
631 | 807 calc_deco_engine_norm_1: |
808 ; normal OC schedules | |
809 TSTOSC char_I_extra_time ; delay mode activated? | |
810 bra calc_deco_engine_norm_1b ; YES - schedule 1b in normal plan | |
811 ;bra calc_deco_engine_norm_1a ; NO - schedule 1a in normal plan | |
812 | |
813 calc_deco_engine_norm_1a: | |
814 ; normal schedule 1a: OC with optional gas needs | |
815 ; bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (will never be activated in this plan) | |
816 ; bcf lo,DECO_DELAY_FLAG ; switch off delay mode (will never be activated in this plan) | |
817 ; bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation by default (if on, will always be on) | |
818 TSTOSC opt_calc_gasvolume ; shall calculate gas needs? | |
819 bsf hi,DECO_VOLUME_FLAG ; YES - switch on gas needs calculation | |
820 bra calc_deco_engine_norm_start ; start deco engine in normal plan | |
821 | |
822 calc_deco_engine_norm_1b: | |
823 ; normal schedule 1b: OC without delay and gas needs | |
824 ; bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (will never be activated in this plan) | |
825 bcf lo,DECO_DELAY_FLAG ; switch off delay mode | |
826 bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation | |
827 bra calc_deco_engine_norm_start ; start deco engine in normal plan | |
828 | |
623 | 829 IFDEF _ccr_pscr |
631 | 830 calc_deco_engine_norm_2: |
831 ; normal loop schedules | |
832 TSTOSC opt_calc_gasvolume ; gas needs calculation activated? | |
833 bra calc_deco_engine_norm_2c ; YES - schedule 2c in normal plan | |
834 ;bra calc_deco_engine_norm_2ab ; NO - schedules 2a and 2b in normal plan are identical | |
835 | |
836 calc_deco_engine_norm_2ab: | |
837 ; normal schedule 2a & 2b: loop without anything | |
838 bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (may return from real bailout) | |
839 ; bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation (will never be activated in this plans) | |
840 bcf lo,DECO_DELAY_FLAG ; switch off delay mode (may have been set in alt. plan 2b) | |
841 bra calc_deco_engine_norm_start ; start deco engine in normal plan | |
842 | |
843 calc_deco_engine_norm_2c: | |
844 ; normal schedule 2c: loop with switch-back from simulated bailout | |
845 ; switch to CCR/pSCR | |
846 movf active_dil,W ; get current diluent | |
847 call deco_setup_cc_diluents_pre ; set up deco calculation in CCR/pSCR mode with diluents | |
848 calc_deco_engine_norm_2c_XX: | |
849 bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (may return from real bailout) | |
850 bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation | |
851 bcf lo,DECO_DELAY_FLAG ; switch off delay mode | |
852 bra calc_deco_engine_norm_start ; start deco engine in normal plan | |
853 | |
854 calc_deco_engine_norm_3: | |
855 ; real bailout schedule | |
856 bcf lo,DECO_DELAY_FLAG ; switch off delay mode | |
857 bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation by default | |
858 TSTOSC opt_calc_gasvolume ; shall calculate gas needs? | |
859 bsf hi,DECO_VOLUME_FLAG ; YES - switch on gas needs calculation | |
860 bsf lo,DECO_BAILOUT_FLAG ; switch on bailout mode | |
861 ;bra calc_deco_engine_norm_start ; start deco engine in normal plan | |
862 ENDIF ; _ccr_pscr | |
863 | |
864 calc_deco_engine_norm_start: | |
865 bsf lo,DECO_START_NORM ; calculate a normal plan | |
623 | 866 bra calc_deco_engine_start ; start deco engine |
867 | |
634 | 868 |
631 | 869 ; ---- alternative plans ---- |
634 | 870 ; |
623 | 871 calc_deco_engine_alt: |
631 | 872 bcf lo,DECO_COMPLETED_NORM ; clear completion flag from normal plan |
873 IFDEF _ccr_pscr | |
874 btfsc bailout_mode ; in real bailout? | |
875 bra calc_deco_engine_norm_3 ; YES - schedule 3 has no alternative plan | |
876 btfss FLAG_oc_mode ; in OC dive mode? | |
877 bra calc_deco_engine_alt_2 ; NO - loop schedules | |
878 ;bra calc_deco_engine_alt_1 ; YES - OC schedules | |
879 ENDIF ; _ccr_pscr | |
623 | 880 |
881 calc_deco_engine_alt_1: | |
631 | 882 ; alternative OC schedules |
883 TSTOSS char_I_extra_time ; delay mode activated? | |
884 bra calc_deco_engine_norm_1a ; NO - schedule 1a has no alternative plan | |
604 | 885 IFDEF _cave_mode |
631 | 886 btfsc dive_turned ; YES - in cave mode and dive turned? |
887 bra calc_deco_engine_norm_1a ; YES - suppress delay mode -> do schedule 1a in normal plan | |
604 | 888 ENDIF |
631 | 889 ;bra calc_deco_engine_alt_1b ; NO - do schedule 1b in alternative plan |
890 | |
891 calc_deco_engine_alt_1b: | |
892 ; alternative schedule 1b: OC with delay and optional gas needs | |
893 ; bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (will never be activated in this plan) | |
894 ; bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation by default (comes in switched off state) | |
895 TSTOSC opt_calc_gasvolume ; shall calculate gas needs? | |
896 bsf hi,DECO_VOLUME_FLAG ; YES - switch on gas needs calculation | |
897 bsf lo,DECO_DELAY_FLAG ; switch on delay mode | |
898 bra calc_deco_engine_alt_start ; start deco engine in alternative plan | |
899 | |
900 IFDEF _ccr_pscr | |
623 | 901 calc_deco_engine_alt_2: |
631 | 902 ; alternative loop schedules |
903 TSTOSC opt_calc_gasvolume ; gas needs calculation activated? | |
904 bra calc_deco_engine_alt_2c ; YES - 2c in alternative plan | |
905 TSTOSS char_I_extra_time ; NO - delay mode activated? | |
906 bra calc_deco_engine_norm_2ab ; NO - schedule 2a has no alternative plan | |
907 ;bra calc_deco_engine_alt_2b ; YES - schedule 2b in alternative plan | |
908 | |
909 calc_deco_engine_alt_2b: | |
910 ; alternative schedule 2b: loop with delay | |
911 ; bcf lo,DECO_BAILOUT_FLAG ; switch off bailout mode (will be deactivated in normal plan) | |
912 ; bcf hi,DECO_VOLUME_FLAG ; switch off gas needs calculation (will never be activated in this plan) | |
913 bsf lo,DECO_DELAY_FLAG ; switch on delay mode | |
914 bra calc_deco_engine_alt_start ; start deco engine in normal plan | |
915 | |
916 calc_deco_engine_alt_2c: | |
917 ; alternative schedule 2c: simulated bailout (if possible) | |
918 decf best_gas_number,W ; get best gas number -1 into WREG. If not available, WREG will be 255 now. If not computed yet, WREG will be 254 now. | |
919 btfsc WREG,7 ; WREG < 128 (a bailout gas is available)? | |
920 bra calc_deco_engine_alt_2c_XX ; NO - no bailout plan possible because no bailout gas available to switch to | |
921 movf best_gas_number,W ; YES - get number of best gas into WREG | |
922 call deco_setup_oc_gases_pre ; - set up deco calculation in OC mode with OC gases | |
923 ; bcf lo,DECO_DELAY_FLAG ; - switch off delay mode by default (comes in switched off state) | |
924 TSTOSC char_I_extra_time ; - delay mode activated? | |
925 bsf lo,DECO_DELAY_FLAG ; YES - switch on delay mode | |
604 | 926 IFDEF _cave_mode |
631 | 927 btfsc dive_turned ; in cave mode and dive turned? |
928 bcf lo,DECO_DELAY_FLAG ; YES - suppress delay mode | |
604 | 929 ENDIF |
631 | 930 bsf lo,DECO_BAILOUT_FLAG ; - switch on bailout mode |
931 bsf hi,DECO_VOLUME_FLAG ; - switch on gas needs calculation | |
932 bra calc_deco_engine_alt_start ; - start deco engine in alternative plan | |
933 calc_deco_engine_alt_2c_XX: | |
604 | 934 call inval_alternative_plan_data ; invalidate all alternative (bailout) plan data because they are not applicable any more |
631 | 935 bra calc_deco_engine_norm_start ; continue calculating as normal plan |
936 ENDIF ; _ccr_pscr | |
937 | |
938 calc_deco_engine_alt_start: | |
939 bsf lo,DECO_START_ALT ; calculate an alternative plan | |
940 ;bra calc_deco_engine_start ; start deco engine | |
941 | |
634 | 942 |
631 | 943 ; ---- start deco engine ---- |
634 | 944 ; |
623 | 945 calc_deco_engine_start: |
631 | 946 IFDEF _cave_mode |
947 bcf hi,DECO_CAVE_MODE ; deactivate cave mode by default | |
948 btfss cave_mode ; cave mode switched on? | |
949 bra calc_deco_engine_start_1 ; NO - keep deactivated, no backtracking depth recording | |
950 bsf hi,DECO_CAVE_MODE ; YES - activate cave mode | |
951 btfss dive_turned ; - dive turned? | |
952 call write_backtrack_deltatime ; NO - update current delta time | |
953 ENDIF | |
954 calc_deco_engine_start_1: | |
604 | 955 movff hi,char_O_main_status ; write-back char_O_main_status to deco engine interface |
560 | 956 movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface |
0 | 957 |
631 | 958 calc_deco_engine_exec: |
623 | 959 ; +++++++++++++++++++++++++++++++++++++ |
634 | 960 bsf tmr5_preemtion_allowed ; grant preemption allowance for timer 5 (deco engine) |
623 | 961 call deco_calc_hauptroutine ; invoke the deco engine (C-code) |
962 banksel common ; back to bank common | |
634 | 963 bcf tmr5_preemtion_allowed ; revoke preemption allowance |
623 | 964 ; +++++++++++++++++++++++++++++++++++++ |
965 | |
631 | 966 ifdef _debug_output |
623 | 967 call TFT_debug_output ; debug output of scheduling performance data |
631 | 968 endif |
604 | 969 |
970 ; check if new calculation results for normal plan mode are available | |
623 | 971 movff char_O_deco_status,WREG ; get deco status of deco engine |
972 btfsc WREG,DECO_COMPLETED_NORM ; new calculation results for normal plan available? | |
973 bsf new_deco_data_avail ; YES - set flag for new NDL or deco data available | |
631 | 974 |
634 | 975 return ; done |
976 | |
623 | 977 |
631 | 978 IFDEF _ccr_pscr |
623 | 979 IFDEF _external_sensor |
0 | 980 |
634 | 981 ;----------------------------------------------------------------------------- |
982 ; Process Sensor Readings | |
983 ; | |
560 | 984 global calc_deko_divemode_sensor |
985 calc_deko_divemode_sensor: | |
634 | 986 btfsc ext_input_optical ; do we have an optical interface? |
987 bra calc_deko_divemode_sensor_opt ; YES - process received data | |
988 btfss ext_input_s8_ana ; NO - do we have a S8/analog interface? | |
989 return ; NO - nothing to do, done | |
990 TSTOSS opt_s8_mode ; YES - shall use S8 interface? | |
991 bra calc_deko_divemode_sensor_ana ; - NO - use analog interface | |
992 ;bra calc_deko_divemode_sensor_s8 ; YES - use S8 interface | |
993 | |
994 calc_deko_divemode_sensor_s8: | |
995 btfss trigger_S8_data_update ; new data frame available? | |
996 bra calc_deko_divemode_sensor_common; NO - use old values | |
997 bcf trigger_S8_data_update ; YES - clear update flag | |
998 call compute_mvolts_from_rawdata ; - compute mV values from digital data | |
999 bra calc_deko_divemode_sensor_common; - continue with common part | |
1000 | |
583 | 1001 calc_deko_divemode_sensor_opt: |
634 | 1002 ; sensor1_ppO2, sensor2_ppO2 and sensor3_ppO2 are already filled in ISR |
1003 btfss sensor1_active ; check HUD status data and eventually clear use_O2_sensorX | |
1004 bcf use_O2_sensor1 ; ... | |
1005 btfss sensor2_active ; ... | |
1006 bcf use_O2_sensor2 ; ... | |
1007 btfss sensor3_active ; ... | |
1008 bcf use_O2_sensor3 ; ... | |
1009 bra check_sensor_avg ; continue with calculating sensor average | |
1010 | |
1011 calc_deko_divemode_sensor_ana: | |
1012 call get_analog_inputs ; get the analog voltages and continue with the common part | |
1013 ;bra calc_deko_divemode_sensor_common; continue with common part | |
560 | 1014 |
1015 calc_deko_divemode_sensor_common: | |
634 | 1016 |
604 | 1017 ; Check each sensor if it is calibrated and if its mV value is within min_mv and max_mv limits. |
1018 ; If ok: compute o2_ppo2_sensorX = o2_mv_sensorX * opt_x_sX / 1000 | |
582 | 1019 ; If not ok: reset o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before |
0 | 1020 |
604 | 1021 ; check sensor 1 |
582 | 1022 btfss sensor1_calibrated_ok ; check if sensor is usable at all |
1023 bra check_sensor_1_fail ; NO - handle it as failed | |
634 | 1024 SMOVII sensor1_mv,sub_a ; YES - load sensor mV value |
1025 | |
604 | 1026 ; check min threshold |
634 | 1027 rcall check_min_threshold ; check if sensor mV is outside minimum |
582 | 1028 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
1029 bra check_sensor_1_fail ; YES - declare sensor as failed | |
634 | 1030 |
604 | 1031 ; check max_threshold |
634 | 1032 rcall check_max_threshold ; check if sensor mV is outside maximum |
582 | 1033 btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv |
1034 bra check_sensor_1_fail ; NO - declare sensor as failed | |
634 | 1035 |
604 | 1036 ; check HUD data, if available |
582 | 1037 btfss hud_connection_ok ; check if there is a HUD connected |
1038 bra check_sensor_1_ok ; NO - all checks done then and positive | |
604 | 1039 btfss sensor1_active ; YES - HUD status ok? |
1040 bra check_sensor_1_fail ; NO - HUD reports a fail | |
634 | 1041 |
560 | 1042 check_sensor_1_ok: |
623 | 1043 ; sensor1_ppO2 = sensor1_mv:2 * opt_x_s1:2 / 1000 |
634 | 1044 SMOVII sensor1_mv,xA ; get sensor mV into xA |
1045 MOVII opt_x_s1, xB ; get calibration factor into xB | |
1046 rcall compute_ppo2_helper ; compute ppO2 | |
623 | 1047 movff xC+0,sensor1_ppO2 ; result in 0.01 bar |
634 | 1048 bcf attn_det_sensor1_lost ; clear attention |
1049 bcf shown_sensor1_fail ; re-arm custom-view show-up | |
582 | 1050 bra check_sensor_2 ; continue with next sensor |
634 | 1051 |
560 | 1052 check_sensor_1_fail: |
634 | 1053 clrf WREG ; set ppO2 reading to zero |
1054 movff WREG,sensor1_ppO2 ; ... | |
1055 btfsc use_O2_sensor1 ; check if sensor is in use | |
1056 bsf attn_det_sensor1_lost ; YES - set an attention | |
582 | 1057 bcf use_O2_sensor1 ; revoke sensor from usage |
604 | 1058 |
634 | 1059 check_sensor_2: |
1060 ; check sensor 2 | |
582 | 1061 btfss sensor2_calibrated_ok ; check if sensor is usable at all |
1062 bra check_sensor_2_fail ; NO - handle it as failed | |
634 | 1063 SMOVII sensor2_mv,sub_a ; YES - load sensor mV value |
1064 | |
604 | 1065 ; check min threshold |
634 | 1066 rcall check_min_threshold ; check if sensor mV is outside minimum |
582 | 1067 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
1068 bra check_sensor_2_fail ; YES - declare sensor as failed | |
634 | 1069 |
604 | 1070 ; check max_threshold |
634 | 1071 rcall check_max_threshold ; check if sensor mV is outside maximum |
582 | 1072 btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv |
1073 bra check_sensor_2_fail ; NO - declare sensor as failed | |
634 | 1074 |
604 | 1075 ; check HUD data, if available |
582 | 1076 btfss hud_connection_ok ; check if there is a HUD connected |
1077 bra check_sensor_2_ok ; NO - all checks done then and positive | |
604 | 1078 btfss sensor2_active ; YES - HUD status ok? |
1079 bra check_sensor_2_fail ; NO - HUD reports a fail | |
634 | 1080 |
560 | 1081 check_sensor_2_ok: |
623 | 1082 ; sensor2_ppO2 = sensor2_mv:2 * opt_x_s2:2 / 1000 |
634 | 1083 SMOVII sensor2_mv,xA ; get sensor mV into xA |
1084 MOVII opt_x_s2, xB ; get calibration factor into xB | |
1085 rcall compute_ppo2_helper ; compute ppO2 | |
623 | 1086 movff xC+0,sensor2_ppO2 ; result in 0.01 bar |
634 | 1087 bcf attn_det_sensor2_lost ; clear attention |
1088 bcf shown_sensor2_fail ; re-arm custom-view show-up | |
582 | 1089 bra check_sensor_3 ; continue with next sensor |
634 | 1090 |
560 | 1091 check_sensor_2_fail: |
634 | 1092 clrf WREG ; set ppO2 reading to zero |
1093 movff WREG,sensor2_ppO2 ; ... | |
1094 btfsc use_O2_sensor2 ; check if sensor is in use | |
1095 bsf attn_det_sensor2_lost ; YES - set an attention | |
582 | 1096 bcf use_O2_sensor2 ; revoke sensor from usage |
604 | 1097 |
634 | 1098 check_sensor_3: |
1099 ; check sensor 3 | |
582 | 1100 btfss sensor3_calibrated_ok ; check if sensor is usable at all |
1101 bra check_sensor_3_fail ; NO - handle it as failed | |
634 | 1102 SMOVII sensor3_mv,sub_a ; YES - load sensor mV value |
1103 | |
604 | 1104 ; check min threshold |
634 | 1105 rcall check_min_threshold ; check if sensor mV is outside minimum |
582 | 1106 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
1107 bra check_sensor_3_fail ; YES - declare sensor as failed | |
634 | 1108 |
604 | 1109 ; check max threshold |
634 | 1110 rcall check_max_threshold ; check if sensor mV is outside maximum |
582 | 1111 btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv |
1112 bra check_sensor_3_fail ; NO - declare sensor as failed | |
634 | 1113 |
604 | 1114 ; check HUD data, if available |
582 | 1115 btfss hud_connection_ok ; check if there is a HUD connected |
1116 bra check_sensor_3_ok ; NO - all checks done then and positive | |
604 | 1117 btfss sensor3_active ; YES - HUD status ok? |
1118 bra check_sensor_3_fail ; NO - HUD reports a fail | |
634 | 1119 |
560 | 1120 check_sensor_3_ok: |
623 | 1121 ; sensor3_ppO2 = sensor3_mv:2 * opt_x_s1:2 / 1000 |
634 | 1122 SMOVII sensor3_mv,xA ; get sensor mV into xA |
1123 MOVII opt_x_s3, xB ; get calibration factor into xB | |
1124 rcall compute_ppo2_helper ; compute ppO2 | |
623 | 1125 movff xC+0,sensor3_ppO2 ; result in 0.01 bar |
634 | 1126 bcf attn_det_sensor3_lost ; clear attention |
1127 bcf shown_sensor3_fail ; re-arm custom-view show-up | |
1128 bra check_sensor_avg ; continue with calculating sensor average | |
1129 | |
560 | 1130 check_sensor_3_fail: |
634 | 1131 clrf WREG ; set ppO2 reading to zero |
1132 movff WREG,sensor3_ppO2 ; ... | |
1133 btfsc use_O2_sensor3 ; check if sensor is in use | |
1134 bsf attn_det_sensor3_lost ; YES - set an attention | |
582 | 1135 bcf use_O2_sensor3 ; revoke sensor from usage |
604 | 1136 |
634 | 1137 check_sensor_avg: |
1138 ; calculate sensor average | |
623 | 1139 btfss divemode ; in dive mode? |
1140 return ; NO - done here if not in dive mode | |
560 | 1141 |
634 | 1142 ; compute sensor_setpoint = average of all o2_ppo2_sensorX of |
1143 ; those sensors that have use_O2_sensorX == true | |
1144 | |
1145 CLRI xA ; clear sum of sensor values | |
1146 CLRI xB ; clear number of active sensors found | |
1147 | |
1148 check_sensor_avg_1: | |
1149 btfss use_O2_sensor1 ; sensor 1 active? | |
1150 bra check_sensor_avg_2 ; NO | |
1151 movff sensor1_ppO2,WREG ; YES - get ppO2 | |
1152 addwf xA+0,F ; - add into xA:2 | |
1153 movlw .0 ; - ... | |
1154 addwfc xA+1,F ; - ... | |
1155 incf xB+0,F ; - add a sensor | |
1156 | |
1157 check_sensor_avg_2: | |
1158 btfss use_O2_sensor2 ; sensor 2 active? | |
1159 bra check_sensor_avg_3 ; NO | |
1160 movff sensor2_ppO2,WREG ; YES - get ppO2 | |
1161 addwf xA+0,F ; - add into xA:2 | |
1162 movlw .0 ; - ... | |
1163 addwfc xA+1,F ; - ... | |
1164 incf xB+0,F ; - add a sensor | |
1165 | |
1166 check_sensor_avg_3: | |
1167 btfss use_O2_sensor3 ; sensor 3 active? | |
1168 bra check_sensor_avg_compute ; NO | |
1169 movff sensor3_ppO2,WREG ; YES - get ppO2 | |
1170 addwf xA+0,F ; - add into xA:2 | |
1171 movlw .0 ; - ... | |
1172 addwfc xA+1,F ; - ... | |
1173 incf xB+0,F ; add a sensor | |
1174 | |
1175 check_sensor_avg_compute: | |
604 | 1176 ; divide sum of sensor values by number of active sensors found |
634 | 1177 clrf xC+0 ; set zero as default result |
1178 tstfsz xB+0 ; pending div/0 ? | |
1179 call div16x16 ; NO - execute xC = xA / xB = summed ppO2 / number of sensors | |
1180 movff xC+0,sensor_setpoint ; copy result (or its default) | |
604 | 1181 |
1182 ; set default value for pSCR mode: 0 => let p2_deco.c compute the ppO2 based on current dil gas and depth | |
560 | 1183 ; will be overwritten later in case we are in sensor mode and have at least one usable sensor |
634 | 1184 clrf WREG ; pre-load a zero |
1185 btfsc FLAG_pscr_mode ; check if we are in pSCR mode | |
1186 movff WREG,char_I_const_ppO2 ; YES - write 0 to char_I_const_ppo2, | |
1187 ; it will be overwritten if we have a usable sensor reading | |
1188 btfsc bailout_mode ; check if we are in bailout | |
1189 bra check_sensor_vote ; YES - no sensor data transfer to char_I_const_ppO2 in this case | |
640 | 1190 movf dive_ccr_mode,W ; NO - get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) |
634 | 1191 sublw .1 ; - in sensor mode? |
1192 bnz check_sensor_vote ; NO - not in sensor mode - no transfer of sensor data to char_I_const_ppO2 | |
1193 tstfsz xB+0 ; YES - check if we have found at least one usable sensor | |
1194 bra check_sensor_avg_use ; YES - we have at least one usable sensor | |
1195 bsf warn_det_sensors_lost ; NO - we have NO usable sensors | |
1196 btfsc FLAG_ccr_mode ; - check if we are in CCR mode | |
1197 movff opt_setpoint_cbar+0,char_I_const_ppO2 ; YES - select fixed setpoint no. 1 for fallback | |
1198 bra check_sensor_vote ; - continue with voting logic flags | |
1199 | |
1200 check_sensor_avg_use: | |
604 | 1201 ; we have at least one usable sensor with a ppO2 value > 0 |
634 | 1202 bcf warn_det_sensors_lost ; clear warning |
1203 bcf shown_sensors_lost ; re-arm custom view show-up | |
560 | 1204 movff sensor_setpoint,char_I_const_ppO2 ; transfer average sensor value to p2_deco.c code |
634 | 1205 |
1206 check_sensor_vote: | |
1207 ; check if individual sensors agree with their average | |
1208 bsf voting_logic_sensor1 ; default sensor to be within voting | |
1209 movff sensor1_ppO2,WREG ; get sensor's ppO2 | |
1210 rcall check_sensor_voting_helper ; check if sensor is within +/- range around setpoint | |
604 | 1211 tstfsz WREG ; sensor within range (WREG = 0)? |
1212 bcf voting_logic_sensor1 ; NO - vote out this sensor | |
560 | 1213 |
634 | 1214 bsf voting_logic_sensor2 ; default sensor to be within voting |
1215 movff sensor2_ppO2,WREG ; get sensor's ppO2 | |
1216 rcall check_sensor_voting_helper ; check if sensor is within +/- range around setpoint | |
604 | 1217 tstfsz WREG ; sensor within range (WREG = 0)? |
1218 bcf voting_logic_sensor2 ; NO - vote out this sensor | |
560 | 1219 |
634 | 1220 bsf voting_logic_sensor3 ; default sensor to be within voting |
1221 movff sensor3_ppO2,WREG ; get sensor's ppO2 | |
1222 rcall check_sensor_voting_helper ; check if sensor is within +/- range around setpoint | |
604 | 1223 tstfsz WREG ; sensor within range (WREG = 0)? |
1224 bcf voting_logic_sensor3 ; NO - vote out this sensor | |
582 | 1225 |
560 | 1226 ; check if a warning shall be issued on sensor disagreement |
582 | 1227 btfsc FLAG_ccr_mode ; check if we are in CCR mode |
604 | 1228 bra check_warn_sensor_0 ; YES - continue with further checks |
582 | 1229 btfsc FLAG_pscr_mode ; check if we are in pSCR mode |
604 | 1230 bra check_warn_sensor_0 ; YES - continue with further checks |
1231 bra check_warn_sensor_done ; not in CCR and not in pSCR, so no warning | |
634 | 1232 |
604 | 1233 check_warn_sensor_0: ; we are in CCR or pSCR mode |
623 | 1234 btfsc bailout_mode ; check if we are in bailout |
604 | 1235 bra check_warn_sensor_done ; YES - no warning in this case |
640 | 1236 movf dive_ccr_mode,W ; get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) |
604 | 1237 sublw .1 ; in sensor mode? |
1238 bnz check_warn_sensor_done ; NO - not in sensor mode - no warning in this case | |
634 | 1239 |
604 | 1240 check_warn_sensor_1: |
582 | 1241 btfss sensor1_calibrated_ok ; check if sensor has a valid calibration |
1242 bra check_warn_sensor_2 ; NO - sensor can not cause a warning then | |
1243 btfss use_O2_sensor1 ; YES - check if sensor is in use | |
604 | 1244 bra check_warn_sensor_2 ; NO - sensor can not cause a warning then |
1245 btfsc voting_logic_sensor1 ; YES - check if sensor value is within agreement range | |
1246 bra check_warn_sensor_2 ; YES - continue with next sensor | |
634 | 1247 bsf warn_det_sensors_div ; NO - sensors divergence |
1248 return ; - done | |
1249 | |
604 | 1250 check_warn_sensor_2: |
582 | 1251 btfss sensor2_calibrated_ok ; check if sensor has a valid calibration |
1252 bra check_warn_sensor_3 ; NO - sensor can not cause a warning then | |
1253 btfss use_O2_sensor2 ; YES - check if sensor is in use | |
604 | 1254 bra check_warn_sensor_3 ; NO - sensor can not cause a warning then |
1255 btfsc voting_logic_sensor2 ; YES - check if sensor value is within agreement range | |
1256 bra check_warn_sensor_3 ; YES - continue with next sensor | |
634 | 1257 bsf warn_det_sensors_div ; NO - sensors divergence |
1258 return ; - done | |
1259 | |
604 | 1260 check_warn_sensor_3: |
582 | 1261 btfss sensor3_calibrated_ok ; check if sensor has a valid calibration |
1262 bra check_warn_sensor_agree ; NO - sensor can not cause a warning then | |
1263 btfss use_O2_sensor3 ; YES - check if sensor is in use | |
604 | 1264 bra check_warn_sensor_agree ; NO - sensor can not cause a warning then |
1265 btfsc voting_logic_sensor3 ; YES - check if sensor value is within agreement range | |
1266 bra check_warn_sensor_agree ; YES - continue with next sensor | |
634 | 1267 bsf warn_det_sensors_div ; NO - set warning |
1268 return ; - done | |
1269 | |
604 | 1270 check_warn_sensor_done: |
560 | 1271 check_warn_sensor_agree: |
634 | 1272 bcf warn_det_sensors_div ; clear warning |
1273 bcf shown_sensors_diverg ; re-arm custom view show-up | |
1274 return ; done | |
1275 | |
1276 | |
1277 ;----------------------------------------------------------------------------- | |
1278 ; Helper Function - check if sensor mV is outside minimum | |
1279 ; | |
604 | 1280 check_min_threshold: |
623 | 1281 MOVLI min_mv,sub_b ; load minimum mV value |
604 | 1282 goto sub16 ; sub_c = sensor_mv - min_mv (and return) |
1283 | |
634 | 1284 |
1285 ;----------------------------------------------------------------------------- | |
1286 ; Helper Function - check if sensor mV is outside maximum | |
1287 ; | |
604 | 1288 check_max_threshold: |
623 | 1289 MOVLI max_mv,sub_b ; load maximum mV value |
604 | 1290 goto sub16 ; sub_c = sensor_mv - max_mv (and return) |
1291 | |
634 | 1292 |
1293 ;----------------------------------------------------------------------------- | |
1294 ; Helper Function - compute ppO2 from sensor mV and calibration factor | |
1295 ; | |
560 | 1296 compute_ppo2_helper: |
623 | 1297 call mult16x16 ; xC:4 = xA:2 * xB:2 |
634 | 1298 MOVLI .1000,xB ; load scaling factor |
623 | 1299 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder |
1300 tstfsz xC+1 ; is the ppO2 higher than 2.55 bar? | |
1301 setf xC+0 ; YES - set result to 255 aka 2.55 bar | |
634 | 1302 return ; done |
1303 | |
1304 | |
1305 ;----------------------------------------------------------------------------- | |
1306 ; Helper Function - check if sensor is within +/- range around setpoint | |
1307 ; | |
560 | 1308 check_sensor_voting_helper: |
634 | 1309 subwf sensor_setpoint,W ; deviation = setpoint - sensor ppO2 |
1310 btfsc STATUS,N ; result negative? | |
1311 negf WREG,W ; YES - negate deviation | |
1312 sublw sensor_voting_logic_threshold ; WREG = threshold - deviation | |
1313 btfss STATUS,N ; result negative? | |
1314 retlw .0 ; NO - within range | |
1315 retlw .1 ; YES - out of range | |
1316 | |
1317 ; cpfsgt sensor_setpoint ; sensor ppO2 > setpoint? | |
1318 ; bra check_sensor_voting_helper_2 ; NO | |
1319 ; ;bra check_sensor_voting_helper_1 ; YES | |
1320 ; | |
1321 ;check_sensor_voting_helper_1: | |
1322 ; subwf sensor_setpoint,W ; WREG = setpoint - sensor ppO2 | |
1323 ; bra check_sensor_voting_helper_com ; continue with common part | |
1324 ; | |
1325 ;check_sensor_voting_helper_2: | |
1326 ; movwf lo ; copy sensor ppO2 to lo | |
1327 ; movf sensor_setpoint,W ; copy setpoint to WREG | |
1328 ; subwf lo,W ; WREG = sensor ppO2 - setpoint | |
1329 ; ;bra check_sensor_voting_helper_com ; continue with common part | |
1330 ; | |
1331 ;check_sensor_voting_helper_com: | |
1332 ; movwf lo ; copy deviation to lo | |
1333 ; movlw sensor_voting_logic_threshold ; load threshold in 0.01 bar | |
1334 ; cpfsgt lo ; deviation > threshold ? | |
1335 ; retlw .0 ; NO - within range | |
1336 ; retlw .1 ; YES - out of range | |
582 | 1337 |
623 | 1338 ENDIF ; _external_sensor |
631 | 1339 ENDIF ; _ccr_pscr |
623 | 1340 |
560 | 1341 |
604 | 1342 IFDEF _cave_mode |
623 | 1343 |
634 | 1344 ;----------------------------------------------------------------------------- |
1345 ; Cave Mode - on/off Switching | |
1346 ; | |
631 | 1347 cavemode_toggle_onoff: |
1348 bcf request_cave_toggle ; clear request flag | |
1349 btg cave_mode ; toggle the on/off state | |
1350 return ; done | |
1351 | |
634 | 1352 |
1353 ;----------------------------------------------------------------------------- | |
1354 ; Cave Mode - switch off and set Dive as turned | |
1355 ; | |
631 | 1356 cavemode_switch_off_turned: |
1357 bcf request_cave_off_turned ; clear request flag | |
1358 bcf cave_mode ; switch cave mode off | |
1359 bra cavemode_turndive_turn_exec ; set dive as turned (and return) | |
1360 | |
1361 | |
634 | 1362 ;----------------------------------------------------------------------------- |
1363 ; Cave Mode - check if 'turn dive' is allowed | |
1364 ; | |
631 | 1365 global cavemode_turndive_check |
1366 cavemode_turndive_check: | |
1367 btfss cave_mode ; cave mode switched on? | |
1368 retlw 1 ; NO - signal not allowed | |
1369 btfss dive_turned ; YES - is the dive currently turned? | |
1370 retlw 0 ; NO - command is allowed | |
1371 movf backtrack_waypoint_turn,W ; YES - copy turn point number to WREG | |
1372 cpfslt backtrack_waypoint_num ; - current waypoint number < turn point number ? | |
1373 retlw 1 ; NO - signal not allowed | |
1374 retlw 0 ; YES - command is allowed | |
1375 | |
634 | 1376 |
1377 ;----------------------------------------------------------------------------- | |
1378 ; Cave Mode - execute 'turn dive' toggle | |
1379 ; | |
631 | 1380 cavemode_turndive_toggle: |
1381 bcf request_turn_toggle ; clear request flag | |
1382 rcall cavemode_turndive_check ; check if command is allowed | |
1383 tstfsz WREG ; command allowed? | |
1384 return ; NO - abort | |
1385 btfss dive_turned ; YES - is the dive currently turned? | |
1386 bra cavemode_turndive_turn_exec ; NO - turn the dive | |
634 | 1387 bcf dive_turned ; YES - set dive as not turned any more |
1388 bcf backtrack_shutdown ; - set backtracking as not shut down any more | |
1389 call set_logbook_marker ; - set a logbook marker | |
1390 goto resume_backtrack_recording ; - append further logging after current waypoint and return | |
1391 | |
1392 | |
1393 ;----------------------------------------------------------------------------- | |
1394 ; Cave Mode - set the dive as turned | |
1395 ; | |
631 | 1396 cavemode_turndive_turn: |
1397 bcf request_turn_turn ; clear request flag | |
1398 btfss cave_mode ; cave mode switched on? | |
1399 return ; NO - abort | |
1400 btfsc dive_turned ; YES - is the dive already turned? | |
1401 return ; YES - nothing to do any more | |
1402 cavemode_turndive_turn_exec: | |
634 | 1403 bsf dive_turned ; NO - set dive as turned |
1404 call set_logbook_marker ; - set a logbook marker | |
1405 goto write_backtrack_turnpoint ; - write a turn-point waypoint and return | |
1406 | |
1407 | |
1408 ;----------------------------------------------------------------------------- | |
1409 ; Cave Mode - check if setting a Waypoint is allowed | |
1410 ; | |
631 | 1411 global cavemode_waypoint_set_check |
1412 cavemode_waypoint_set_check: | |
1413 btfss cave_mode ; cave mode switched on? | |
1414 retlw 1 ; NO - command not allowed | |
1415 btfsc dive_turned ; YES - is the dive turned? | |
1416 retlw 1 ; YES - no setting of waypoints on way out, command not allowed | |
1417 btfsc backtrack_entire_full ; NO - storage entirely used up? | |
1418 retlw 1 ; YES - out of storage capacity, command not allowed | |
1419 movlw backtrack_waypoint_max ; NO - get highest allowed waypoint number | |
1420 cpfslt backtrack_waypoint_num ; - current waypoint number < max allowed number? | |
1421 retlw 1 ; NO - command not allowed | |
1422 retlw 0 ; YES - command is allowed | |
1423 | |
634 | 1424 |
1425 ;----------------------------------------------------------------------------- | |
1426 ; Cave Mode - set a Waypoint | |
1427 ; | |
631 | 1428 cavemode_waypoint_set: |
1429 bcf request_waypoint_set ; clear request flag | |
1430 rcall cavemode_waypoint_set_check ; check if command is allowed to execute | |
1431 tstfsz WREG ; command allowed? | |
1432 return ; NO - no waypoint setting possible, abort | |
1433 call set_logbook_marker ; YES - set a logbook marker | |
1434 goto write_backtrack_waypoint ; - execute command (and return) | |
1435 | |
1436 | |
634 | 1437 ;----------------------------------------------------------------------------- |
1438 ; Cave Mode - check if stepping one Waypoint outwards is allowed | |
1439 ; | |
631 | 1440 global cavemode_waypoint_out_check |
1441 cavemode_waypoint_out_check: | |
1442 btfss cave_mode ; cave mode switched on? | |
1443 retlw 1 ; NO - command not allowed | |
1444 btfss dive_turned ; YES - is the dive turned? | |
1445 retlw 1 ; NO - no stepping back on way in, command not allowed | |
1446 btfsc waypoint_reached_first ; YES - already at first waypoint? | |
1447 retlw 1 ; YES - command not allowed | |
1448 retlw 0 ; NO - command is allowed | |
1449 | |
634 | 1450 |
1451 ;----------------------------------------------------------------------------- | |
1452 ; Cave Mode - step one Waypoint outwards | |
1453 ; | |
631 | 1454 cavemode_waypoint_out: |
1455 bcf request_waypoint_out ; clear request flag | |
1456 rcall cavemode_waypoint_out_check ; check if command is allowed to execute | |
1457 tstfsz WREG ; command allowed? | |
1458 return ; NO - no further out possible, abort | |
1459 goto backtrack_waypoint_go_out ; YES - execute the command (and return) | |
1460 | |
1461 | |
634 | 1462 ;----------------------------------------------------------------------------- |
1463 ; Cave Mode - check if stepping one Waypoint inwards is allowed | |
1464 ; | |
631 | 1465 global cavemode_waypoint_in_check |
1466 cavemode_waypoint_in_check: | |
1467 btfss cave_mode ; cave mode switched on? | |
1468 retlw 1 ; NO - command not allowed | |
1469 btfss dive_turned ; YES - is the dive turned? | |
1470 retlw 1 ; NO - no stepping forward on way in, command not allowed | |
1471 btfsc waypoint_reached_last ; YES - already at last waypoint? | |
1472 retlw 1 ; YES - command not allowed | |
1473 retlw 0 ; NO - command is allowed | |
1474 | |
634 | 1475 |
1476 ;----------------------------------------------------------------------------- | |
1477 ; Cave Mode - step one Waypoint inwards | |
1478 ; | |
631 | 1479 cavemode_waypoint_in: |
1480 bcf request_waypoint_in ; clear request flag | |
1481 rcall cavemode_waypoint_in_check ; check if command is allowed to execute | |
1482 tstfsz WREG ; command allowed? | |
1483 return ; NO - no further in possible, abort | |
1484 goto backtrack_waypoint_go_in ; YES - execute command (and return) | |
623 | 1485 |
634 | 1486 |
1487 ;----------------------------------------------------------------------------- | |
1488 ; Cave Mode - store current Delta Time | |
1489 ; | |
1490 write_backtrack_deltatime: | |
1491 rcall setup_backtrack_index ; setup writing position | |
1492 bra write_backtrack_datum_deltatime ; store the current delta time (and return) | |
1493 | |
1494 | |
1495 ;----------------------------------------------------------------------------- | |
1496 ; Cave Mode - store a Backtracking Depth Data Set | |
1497 ; | |
1498 write_backtrack_1min_depth: | |
1499 rcall setup_backtrack_index ; setup writing position | |
1500 rcall write_backtrack_datum_depth ; store depth | |
1501 rcall write_backtrack_datum_zerotime ; reset the time elapsed since last depth recording and store it | |
1502 bra write_backtrack_datum_check ; store new writing position, check remaining storage capacity ()and return) | |
1503 | |
1504 | |
1505 ;----------------------------------------------------------------------------- | |
1506 ; Cave Mode - store a Waypoint | |
1507 ; | |
1508 write_backtrack_waypoint: | |
1509 rcall setup_backtrack_index ; setup writing position | |
1510 rcall write_backtrack_datum_deltatime ; store the time elapsed since last depth recording | |
1511 movf POSTINC1,W ; dummy read to increment the writing position index | |
1512 rcall write_backtrack_datum_depth ; store depth | |
1513 rcall write_backtrack_datum_gas ; store gas availability vector | |
1514 rcall write_backtrack_datum_waypoint ; store waypoint number | |
1515 rcall write_backtrack_datum_zerotime ; reset the time elapsed since last depth recording and store it | |
1516 bra write_backtrack_datum_check ; store new writing position, check remaining storage capacity (and return) | |
1517 | |
1518 | |
1519 ;----------------------------------------------------------------------------- | |
1520 ; Cave Mode - store a Turn Point | |
1521 write_backtrack_turnpoint: | |
1522 rcall write_backtrack_waypoint ; write a waypoint (see above) | |
1523 movf POSTDEC1,W ; dummy read to decrement the position index to the waypoint number datum | |
1524 movff FSR1L,char_I_backtrack_index ; store updated writing position | |
1525 movff backtrack_waypoint_num,backtrack_waypoint_turn; memorize this waypoint as turn point | |
1526 return ; done | |
1527 | |
1528 | |
1529 ;----------------------------------------------------------------------------- | |
1530 ; Cave Mode - append further Logging after current Waypoint | |
1531 ; | |
1532 resume_backtrack_recording: | |
1533 clrf backtrack_waypoint_turn ; clear turn point reference | |
1534 bsf waypoint_reached_last ; declare to be at last waypoint now | |
1535 rcall setup_backtrack_index ; setup index position | |
1536 movf POSTINC1,W ; dummy read to increment the position index to the delta time datum | |
1537 rcall write_backtrack_datum_zerotime ; reset the time elapsed since last depth recording and store it | |
1538 bra write_backtrack_datum_check ; store new writing position, check remaining storage capacity (and return) | |
1539 | |
1540 | |
1541 ;----------------------------------------------------------------------------- | |
1542 ; Cave Mode - execute stepping one Waypoint outwards | |
1543 ; | |
1544 backtrack_waypoint_go_out: | |
1545 bcf waypoint_reached_last ; not at last waypoint (or turn point) any more | |
1546 rcall setup_backtrack_index ; setup index position | |
1547 movlw b'11100000'-.1 ; a waypoint datum has bits 5-7 set, -1 because of cpfsgt | |
1548 backtrack_waypoint_go_out_loop: | |
1549 movff POSTDEC1,lo ; dummy read current datum and go to previous datum (there is no PREDEC) | |
1550 cpfsgt INDF1 ; read datum, is it a waypoint datum? | |
1551 bra backtrack_waypoint_go_out_loop ; NO - try next datum | |
1552 movff FSR1L,char_I_backtrack_index ; store new index position | |
1553 movf INDF1,W ; copy waypoint datum to WREG | |
1554 andlw b'00011111' ; remove waypoint tag | |
1555 movwf backtrack_waypoint_num ; store new waypoint number | |
1556 movlw .1 ; number of first waypoint | |
1557 cpfsgt backtrack_waypoint_num ; current waypoint number > number of first waypoint ? | |
1558 bsf waypoint_reached_first ; NO - reached first waypoint | |
1559 goto restart_deco_engine_wo_norm ; invalidate all alternative plan data and restart deco engine | |
1560 | |
1561 | |
1562 ;----------------------------------------------------------------------------- | |
1563 ; Cave Mode - execute stepping one Waypoint inwards | |
1564 ; | |
1565 backtrack_waypoint_go_in: | |
1566 bcf waypoint_reached_first ; not at first waypoint any more | |
1567 rcall setup_backtrack_index ; setup index position | |
1568 movlw b'11100000'-.1 ; a waypoint datum has bits 5-7 set, -1 because of cpfsgt | |
1569 backtrack_waypoint_go_in_loop: | |
1570 cpfsgt PREINC1 ; go to next datum, read it, is it a waypoint datum? | |
1571 bra backtrack_waypoint_go_in_loop ; NO - try next datum | |
1572 movff FSR1L,char_I_backtrack_index ; store new index position | |
1573 movf INDF1,W ; copy waypoint datum to WREG | |
1574 andlw b'00011111' ; remove waypoint tag | |
1575 movwf backtrack_waypoint_num ; store new waypoint number | |
1576 movf backtrack_waypoint_turn,W ; load WREG with waypoint number of turn point | |
1577 cpfslt backtrack_waypoint_num ; new waypoint number < number of turn point ? | |
1578 bsf waypoint_reached_last ; NO - reached last waypoint | |
1579 goto restart_deco_engine_wo_norm ; invalidate all alternative plan data and restart deco engine | |
1580 | |
1581 | |
1582 ;----------------------------------------------------------------------------- | |
1583 ; Cave Mode Helper Function - set up Index Position | |
1584 ; | |
1585 setup_backtrack_index: | |
1586 lfsr FSR1,char_I_backtrack_storage ; load FSR1 with base address of the backtracking storage | |
1587 movff char_I_backtrack_index,FSR1L ; adjust FSR1 to the current index position | |
1588 return | |
1589 | |
1590 | |
1591 ;----------------------------------------------------------------------------- | |
1592 ; Cave Mode Helper Function - reset Time since last Depth Recording and store it | |
1593 ; | |
1594 write_backtrack_datum_zerotime: | |
1595 clrf backtrack_deltatime ; reset the time elapsed since last depth recording | |
1596 ;bra write_backtrack_datum_deltatime ; store the time | |
1597 | |
1598 | |
1599 ;----------------------------------------------------------------------------- | |
1600 ; Cave Mode Helper Function - store Time elapsed since last Depth Recording | |
1601 ; | |
1602 write_backtrack_datum_deltatime: | |
1603 movf backtrack_deltatime,W ; get the time elapsed since last depth recording | |
1604 bsf WREG,7 ; add the time marker (bit 7 set) to the time stored in WREG | |
1605 movwf INDF1 ; write the time and keep the writing position index pointing on it | |
1606 return ; done | |
1607 | |
1608 | |
1609 ;----------------------------------------------------------------------------- | |
1610 ; Cave Mode Helper Function - store Depth | |
1611 ; | |
1612 write_backtrack_datum_depth: | |
1613 movf depth_meter,W ; get current depth in meters into WREG | |
1614 btfsc WREG,7 ; current depth < 128 m ? | |
1615 movlw .127 ; NO - clip depth to 127 meters (protect time marker bit) | |
1616 movwf POSTINC1 ; write the depth entry and increment the writing position index | |
1617 return ; done | |
1618 | |
1619 | |
1620 ;----------------------------------------------------------------------------- | |
1621 ; Cave Mode Helper Function - store Gas Availability Vector | |
1622 ; | |
1623 write_backtrack_datum_gas: | |
1624 ; Cave mode is currently only available with gas needs calculation enabled, | |
1625 ; so deco mode is either OC anyhow or CCR/pSCR in bailout mode. Hence it is | |
1626 ; always the OC (bailout) gases whose staging status needs to be stored. | |
1627 lfsr FSR2,opt_gas_type ; load base address of the OC/bailout gas types | |
1628 movlw NUM_GAS ; load number of gases | |
1629 movwf lo ; initialize loop counter | |
1630 movlw b'00000001' ; load gas bit pattern for the first gas | |
1631 movwf hi ; store gas bit pattern in hi | |
1632 movlw b'11000000' ; initialize WREG with the gas staging status tag | |
1633 write_backtrack_datum_gas_loop: | |
1634 movff POSTINC2,up ; get gas type and increment index | |
1635 btfsc up,gas_staged ; gas staged? | |
1636 iorwf hi,W ; YES - set respective gas bit | |
1637 rlncf hi,F ; rotate gas bit pattern to match the next gas | |
1638 decfsz lo,F ; decrement loop counter, did it became zero? | |
1639 bra write_backtrack_datum_gas_loop ; NO - loop | |
1640 movwf POSTINC1 ; YES - write the gas staging status entry and increment the writing position index | |
1641 return ; - done | |
1642 | |
1643 | |
1644 ;----------------------------------------------------------------------------- | |
1645 ; Cave Mode Helper Function - store a Waypoint Number | |
1646 ; | |
1647 write_backtrack_datum_waypoint: | |
1648 incf backtrack_waypoint_num,F ; increment the waypoint number | |
1649 movf backtrack_waypoint_num,W ; copy waypoint number to WREG | |
1650 iorlw b'11100000' ; add the waypoint marker (bit 7-5 set) to the number stored in WREG | |
1651 movwf POSTINC1 ; write the waypoint datum and increment the writing position index | |
1652 movlw .2 ; load a 2 into WREG | |
1653 cpfslt backtrack_waypoint_num ; new waypoint number >= 2 ? | |
1654 bcf waypoint_reached_first ; YES - not at first waypoint any more | |
1655 return ; done | |
1656 | |
1657 | |
1658 ;----------------------------------------------------------------------------- | |
1659 ; Cave Mode Helper Function - store new writing position and check remaining storage capacity | |
1660 ; | |
1661 write_backtrack_datum_check: | |
1662 movff FSR1L,char_I_backtrack_index ; store new index position | |
1663 movlw backtrack_almost_full_threshold ; load threshold for backtracking storage almost full | |
1664 bcf backtrack_almost_full ; clear almost full state | |
1665 cpfslt FSR1L ; index < threshold ? | |
1666 bsf backtrack_almost_full ; NO - flag backtracking storage is almost full | |
1667 movlw backtrack_entire_full_threshold ; load threshold for backtracking storage entirely full | |
1668 bcf backtrack_entire_full ; clear entirely full state | |
1669 cpfslt FSR1L ; index < threshold ? | |
1670 bsf backtrack_entire_full ; NO - flag backtracking storage is entirely full | |
1671 return ; done | |
1672 | |
1673 ENDIF ; _cave_mode | |
1674 | |
1675 | |
1676 ;----------------------------------------------------------------------------- | |
1677 ; Calculate vertical Velocity | |
1678 ; | |
623 | 1679 calc_velocity: ; called every two seconds |
1680 btfsc velocity_active_num ; was velocity shown in last cycle? | |
1681 bra calc_velocity_1 ; YES - always update if shown before | |
1682 btfss count_divetime ; NO - is the dive time counted, i.e. deeper than dive threshold? | |
1683 return ; NO - display velocity only if deeper than 1m, | |
1684 ; i.e. not at the surface after the dive | |
1685 calc_velocity_1: | |
1686 ; calculate pressure difference | |
1687 MOVII pressure_abs_cached, sub_a; current pressure | |
1688 MOVII last_pressure_velocity,sub_b; last pressure | |
1689 call subU16 ; do an unsigned subtraction | |
1690 | |
1691 ; decide if ascending or descending | |
1692 bcf neg_flag_velocity ; set to ascending by default | |
1693 btfsc neg_flag ; pressure differential negative? | |
1694 bsf neg_flag_velocity ; YES - descending | |
1695 | |
1696 ; store current pressure as last pressure for next round | |
1697 MOVII pressure_abs_cached,last_pressure_velocity | |
1698 | |
1699 ; calculate velocity in m/min | |
1700 MOVII sub_c,xA ; copy pressure differential to xA | |
1701 MOVLI .39,xB ; put scale coefficient into xB (use 77 when called every second) | |
628 | 1702 call mult16x16 ; compute differential pressure in mbar * scale coefficient |
623 | 1703 MOVII xC,divA ; copy result to divA |
631 | 1704 ADDLI .64,divA ; add some round-up |
623 | 1705 movlw .7 ; divide by 2^7 |
1706 call div16 ; divA = divA / 2^WREG, yields velocity in m/min | |
1707 | |
1708 movlw .99 ; load a 99 | |
1709 cpfslt divA+0 ; velocity < 99 m/min ? | |
1710 movwf divA+0 ; NO - limit to 99 m/min | |
1711 | |
1712 bcf STATUS,C ; clear carry flag | |
1713 movlw velocity_display_threshold ; get threshold for displaying vertical velocity | |
1714 subwf divA+0,W ; subtract threshold from velocity | |
1715 btfss STATUS,C ; above threshold? | |
1716 bsf FLAG_TFT_velocity_clear ; NO - don't show / request to clear | |
1717 btfsc STATUS,C ; above threshold? | |
1718 bsf FLAG_TFT_velocity_show ; YES - request to show | |
1719 return ; done | |
0 | 1720 |
1721 | |
634 | 1722 ;----------------------------------------------------------------------------- |
1723 ; Check and Memorize if Dive went into Deco & Deco Region | |
1724 ; | |
628 | 1725 check_deco_states: |
1726 btfsc deco_region ; been within the deco stops region before? | |
1727 return ; YES - been in deco then before too, done | |
1728 movff char_O_deco_info,WREG ; NO - get deco info vector | |
631 | 1729 btfss WREG,deco_stops_norm ; do we have a deco obligation right now? |
628 | 1730 return ; NO - done |
654 | 1731 ; bsf deco_locked ; YES - memorize dive was in deco |
628 | 1732 movff char_O_deco_depth+0,WREG ; - get depth of first stop in meters into WREG |
1733 addlw deco_region_distance+.1 ; - add deco region start distance + 1 meter for the negative test to work | |
631 | 1734 subwf depth_meter,W ; - compute current depth - (first stop depth + deco region distance) |
628 | 1735 btfss STATUS,C ; - result negative? |
1736 bsf deco_region ; YES - memorize to have entered the deco stops region | |
1737 return ; - done | |
1738 | |
634 | 1739 |
1740 ;----------------------------------------------------------------------------- | |
1741 ; Exercise Safety Stop Control | |
1742 ; | |
623 | 1743 safety_stop_control: |
631 | 1744 TSTOSS opt_safetystop ; safety stop enabled? (=1: show safety stop) |
623 | 1745 return ; NO - done |
1746 | |
1747 btfsc FLAG_gauge_mode ; in gauge mode? | |
1748 return ; YES - omit (well, else fix collision of safety stop output with avg depth label) | |
1749 | |
1750 ; setup | |
1751 bcf safety_stop_enabled ; disable safety stop by default | |
1752 | |
1753 ; check for deco | |
1754 btfsc decostop_active ; in deco mode? | |
1755 bra safety_stop_finish ; YES - shut down safety stop | |
1756 | |
1757 ; below "opt_safety_stop_reset"? | |
631 | 1758 MOVII pressure_rel_cur_cached,mpr ; get current pressure into MPR |
1759 call convert_pres_to_depth ; convert pressure in [mbar] to depth in [cm] | |
1760 MOVII mpr,sub_a ; move depth in [cm] to sub_a | |
1761 movff opt_safety_stop_reset,WREG ; load safety stop reset threshold [dm] | |
1762 mullw .10 ; convert threshold from [dm] to [cm] | |
1763 MOVII PROD,sub_b ; move threshold in [cm] to sub_b | |
623 | 1764 call cmpU16 ; sub_a - sub_b |
634 | 1765 btfsc neg_flag ; below threshold depth? |
1766 bra safety_stop_control_chk ; NO - check if above end threshold | |
1767 ;bra safety_stop_reset ; YES - reset safety stop | |
1768 | |
1769 safety_stop_reset: | |
1770 movff opt_safety_stop_length,safety_stop_countdown ; rearm safety stop (load timer) | |
1771 incf safety_stop_countdown,F ; +1 because safety_stop_show decrements first | |
1772 bsf FLAG_TFT_safety_stop_clear ; request to clear safety stop | |
1773 return ; done | |
1774 | |
1775 safety_stop_control_chk: | |
623 | 1776 ; above "opt_safety_stop_end"? |
631 | 1777 movff opt_safety_stop_end,WREG ; load safety stop end threshold [dm] |
1778 mullw .10 ; convert threshold from [dm] to [cm] | |
1779 MOVII PROD,sub_b ; move threshold in [cm] to sub_b | |
623 | 1780 call cmpU16 ; sub_a - sub_b |
1781 btfsc neg_flag ; above or at threshold depth? | |
634 | 1782 bra safety_stop_finish ; YES - finish with safety stop and return |
1783 | |
623 | 1784 ; above "opt_safety_stop_start"? |
631 | 1785 movff opt_safety_stop_start,WREG ; load safety stop start threshold [dm] |
1786 mullw .10 ; convert threshold from [dm] to [cm] | |
1787 MOVII PROD,sub_b ; move threshold in [cm] to sub_b | |
623 | 1788 call cmpU16 ; sub_a - sub_b |
1789 btfss neg_flag ; above or at threshold depth? | |
1790 return ; NO - pause safety stop | |
1791 tstfsz safety_stop_countdown ; YES - safety stop armed? | |
1792 bsf safety_stop_enabled ; YES - enable safety stop | |
634 | 1793 return ; - done |
1794 | |
1795 | |
1796 ;----------------------------------------------------------------------------- | |
1797 ; Show Safety Stop | |
1798 ; | |
623 | 1799 safety_stop_show: |
1800 btfss safety_stop_enabled ; safety stop enabled? | |
1801 return ; NO - done | |
1802 dcfsnz safety_stop_countdown,F ; YES - decrement remaining stop time, reached zero? | |
634 | 1803 bra safety_stop_finish ; YES - finished with safety stop and return |
623 | 1804 bsf FLAG_TFT_safety_stop_show ; NO - request to show safety stop |
1805 return ; - done | |
1806 | |
634 | 1807 |
1808 ;----------------------------------------------------------------------------- | |
1809 ; Finish Safety Stop | |
1810 ; | |
623 | 1811 safety_stop_finish: |
634 | 1812 clrf safety_stop_countdown ; disarm safety stop |
1813 bcf safety_stop_enabled ; disable safety stop | |
1814 bsf FLAG_TFT_safety_stop_clear ; request to clear safety stop | |
1815 return ; done | |
1816 | |
1817 | |
1818 ;----------------------------------------------------------------------------- | |
1819 ; Check for Timeouts (called by tasks every 1/1 second) | |
1820 ; | |
1821 timeout_divemode: | |
1822 btfss dive_main_menu ; main dive menu shown? | |
1823 bra timeout_divemode_1 ; NO - skip | |
1824 btfsc trigger_timeout ; YES - timeout occurred? | |
1825 rcall divemenu_cleanup ; YES - clean up main menu and restore dive data | |
1826 | |
1827 timeout_divemode_1: | |
1828 btfss dive_pre_menu ; pre-menu shown? | |
1829 bra timeout_divemode_2 ; NO - skip | |
1830 btfsc trigger_timeout ; YES - timeout occurred? | |
1831 call menuview_toggle_reset ; YES - terminate the pre-menu | |
1832 | |
1833 timeout_divemode_2: | |
640 | 1834 INCI dive_timeout_timer ; increment timeout timer |
1835 | |
634 | 1836 btfss divetime_longer_1min ; does the dive already last for longer than one minute? |
640 | 1837 bra timeout_divemode_sub_1min ; NO - use a short timeout to achieve some extra hysteris when starting the dive |
634 | 1838 |
1839 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
1840 bra timeout_divemode_apnoe ; YES - use apnoe timeout | |
1841 | |
1842 IFNDEF _DEBUG | |
1843 btfsc sensor_override_active ; in simulator mode? | |
1844 bra timeout_divemode_sim ; YES - use simulator timeout | |
1845 ENDIF | |
1846 | |
1847 movff opt_diveTimeout,WREG ; get dive timeout in minutes into WREG | |
1848 bra timeout_divemode_com_min ; continue with common part for minutes | |
1849 | |
1850 timeout_divemode_apnoe: | |
1851 movlw apnoe_timeout ; get apnoe timeout in minutes into WREG | |
1852 bra timeout_divemode_com_min ; continue with common part for minutes | |
1853 | |
1854 timeout_divemode_sim: | |
1855 MOVLI simulator_timeout,sub_a ; get simulator timeout in seconds directly into sub_a | |
1856 bra timeout_divemode_com_sec ; continue with common part for seconds | |
1857 | |
640 | 1858 timeout_divemode_sub_1min: |
1859 MOVLI divetime_less_1min_timeout,sub_a ; use a short timeout as an extra hysteresis during the descent | |
1860 bra timeout_divemode_com_sec ; continue with common part for seconds | |
1861 | |
634 | 1862 timeout_divemode_com_min: |
1863 mullw .60 ; multiply with 60 to convert minutes in WREG to seconds | |
1864 MOVII PRODL,sub_a ; copy resulting seconds to sub_a | |
1865 | |
1866 timeout_divemode_com_sec: | |
1867 MOVII dive_timeout_timer,sub_b ; copy current timeout timer value to sub_b | |
1868 call cmpU16 ; check sub_a - sub_b | |
1869 btfsc neg_flag ; result negative, i.e. timeout? | |
1870 bcf divemode ; YES - terminate dive mode | |
1871 return ; done | |
1872 | |
1873 | |
1874 ;----------------------------------------------------------------------------- | |
1875 ; Clean up Dive Menu Area and restore Dive Data | |
1876 ; | |
1877 divemenu_cleanup: | |
631 | 1878 bcf dive_main_menu ; clear flag for dive mode menu shown |
1879 call TFT_clear_divemode_menu ; clear menu area | |
1880 | |
1881 btfss custom_view_locked ; was the custom view locked by the menu system? | |
634 | 1882 bra divemenu_cleanup_1 ; NO - continue with redrawing the lower display |
1883 bcf custom_view_locked ; YES - release locked | |
631 | 1884 movf backup_customview,W ; - get previous custom view into WREG |
1885 cpfseq active_customview ; - compare with current custom view, equal? | |
1886 call dive_customview_recall ; NO - redraw previous custom view | |
1887 | |
634 | 1888 divemenu_cleanup_1: |
1889 bsf FLAG_TFT_active_gas_divemode; request redraw of gas/setpoint/diluent | |
1890 bsf FLAG_TFT_temperature ; request redraw of temperature (or resettable dive) | |
631 | 1891 bcf better_gas_blinking ; stop better gas cue |
1892 bcf better_dil_blinking ; stop better dil cue | |
634 | 1893 ;bra request_redraw_NDL_deco_data; request redraw of NDL/deco data and return |
1894 | |
1895 | |
1896 ;----------------------------------------------------------------------------- | |
1897 ; Request redraw of NDL/Deco Data | |
1898 ; | |
623 | 1899 request_redraw_NDL_deco_data: |
1900 btfsc FLAG_gauge_mode ; in gauge mode? | |
1901 return ; YES - done | |
1902 btfss decostop_active ; NO - in deco mode? | |
1903 bra timeout_divemode_menu_ndl ; NO - show NDL again | |
1904 ;bra timeout_divemode_menu_deco ; YES - show deco again | |
1905 | |
1906 timeout_divemode_menu_deco: | |
1907 bsf FLAG_TFT_display_deco_mask ; show deco mask | |
1908 bsf FLAG_TFT_display_deco ; show deco stop | |
1909 bsf FLAG_TFT_display_tts ; show TTS time | |
1910 return ; done | |
582 | 1911 |
1912 timeout_divemode_menu_ndl: | |
623 | 1913 bsf FLAG_TFT_display_ndl_mask ; show NDL mask |
1914 bsf FLAG_TFT_display_ndl ; show NDL time | |
1915 return ; done | |
0 | 1916 |
634 | 1917 |
1918 ;----------------------------------------------------------------------------- | |
1919 ; Check if Dive Mode needs to be started (called from Surface Mode) | |
1920 ; | |
1921 global check_dive_modes_surf | |
1922 check_dive_modes_surf: | |
1923 SMOVII pressure_rel_cur,sub_a ; ISR-safe 2 byte copy of current relative pressure to sub_a | |
650 | 1924 bcf divetime_longer_1min ; not diving when in surface mode |
1925 btfsc cc_active ; charging constant current? | |
1926 bra check_dive_modes_shallow ; YES - abort (And reset debounce counter) | |
1927 btfsc cv_active ; NO - charging constant voltage? | |
1928 bra check_dive_modes_shallow ; YES - abort (And reset debounce counter) | |
1929 bra check_dive_modes ; continue with common part | |
634 | 1930 |
1931 | |
1932 ;----------------------------------------------------------------------------- | |
1933 ; Check if Dive Mode needs to be finished (called from Dive Loop) | |
1934 ; | |
1935 check_dive_modes_dive: | |
1936 MOVII pressure_rel_cur_cached,sub_a ; copy cached relative pressure to sub_a | |
1937 ;bra check_dive_modes ; continue with common part | |
1938 | |
1939 | |
1940 ;----------------------------------------------------------------------------- | |
1941 ; Check for Dive Mode Start/Finish - common Part | |
1942 ; | |
1943 check_dive_modes: | |
1944 btfss high_altitude_mode ; in high altitude mode? | |
1945 bra check_dive_modes_norm ; NO - use normal start-dive threshold | |
1946 btfsc divetime_longer_1min ; YES - diving since > one minute? | |
1947 bra check_dive_modes_norm ; YES - this is a real dive -> use normal start-dive threshold | |
1948 ;bra check_dive_modes_high ; NO - use hight-altitude start-dive threshold | |
1949 | |
1950 check_dive_modes_high: | |
1951 ; high altitude start/end dive thresholds | |
1952 btfss count_divetime ; dive time counting, i.e. already in the dive? | |
1953 bra check_dive_modes_high_start ; NO - select start threshold | |
1954 ;bra check_dive_modes_high_end ; YES - select end threshold | |
1955 | |
1956 check_dive_modes_high_end: | |
1957 MOVLI dive_threshold_high_alt_end,sub_b ; load high altitude end threshold | |
1958 bra check_dive_modes_comm ; continue with common part | |
1959 | |
1960 check_dive_modes_high_start: | |
1961 MOVLI dive_threshold_high_alt_start,sub_b ; load high altitude start threshold | |
1962 bra check_dive_modes_comm ; continue with common part | |
1963 | |
1964 check_dive_modes_norm: | |
1965 ; normal altitude start/end dive thresholds | |
1966 btfss count_divetime ; dive time counting, i.e. already in the dive? | |
1967 bra check_dive_modes_norm_start ; NO - select start threshold | |
1968 ;bra check_dive_modes_norm_end ; YES - select end threshold | |
1969 | |
1970 check_dive_modes_norm_end: | |
1971 MOVLI dive_threshold_norm_alt_end,sub_b ; load normal altitude end threshold | |
1972 bra check_dive_modes_comm ; continue with common part | |
1973 | |
650 | 1974 check_dive_modes_norm_start: |
634 | 1975 MOVLI dive_threshold_norm_alt_start,sub_b ; load normal altitude start threshold |
1976 ;bra check_dive_modes_comm ; continue with common part | |
1977 | |
1978 check_dive_modes_comm: | |
1979 call cmpU16 ; sub_a - sub_b = pressure_rel_cur - start-dive threshold | |
1980 btfsc neg_flag ; pressure_rel_cur > dive_threshold, i.e. deeper than threshold? | |
1981 bra check_dive_modes_shallow ; NO - shallower than threshold | |
1982 btfsc divetime_longer_1min ; YES - diving > one minute? | |
1983 CLRI dive_timeout_timer ; YES - reset timeout counter | |
645 | 1984 decfsz dive_threshold_debounce,F ; debounce counter |
1985 return | |
1986 incf dive_threshold_debounce,F | |
634 | 1987 bsf divemode ; - set dive mode flag |
1988 bsf count_divetime ; - count dive time | |
1989 return ; - done | |
1990 | |
1991 check_dive_modes_shallow: | |
645 | 1992 movlw .5 ; load debounce counter |
1993 movwf dive_threshold_debounce | |
634 | 1994 bcf count_divetime ; stop counting dive time |
640 | 1995 ; btfss divetime_longer_1min ; diving > one minute? |
1996 ; bcf divemode ; NO - quit dive mode as this was no real dive | |
1997 return ; done mH | |
631 | 1998 |
634 | 1999 |
2000 ;----------------------------------------------------------------------------- | |
2001 ; Initialize the resettable Depth and Timer | |
2002 ; | |
2003 resettable_average_depth_init: | |
2004 CLRI pressure_rel_avg_trip ; prime the resettable average depth with 0 | |
2005 bra resettable_average_depth_common ; clear pressure accumulator and timer | |
2006 | |
2007 | |
2008 ;----------------------------------------------------------------------------- | |
2009 ; Reset the resettable Depth and Timer | |
2010 ; | |
2011 resettable_average_depth_reset: | |
2012 bcf request_reset_avg ; clear request | |
2013 MOVII pressure_rel_cur_cached,pressure_rel_avg_trip ; prime the resettable average depth | |
2014 ; with the current relative pressure (depth) | |
2015 ;bra resettable_average_depth_common ; clear pressure accumulator and timer | |
2016 | |
2017 | |
2018 ;----------------------------------------------------------------------------- | |
2019 ; Helper Function - common Part for resettable Depth and Timer init/reset | |
2020 ; | |
2021 resettable_average_depth_common: | |
2022 clrf pressure_rel_accu_trip+0 ; clear the resettable depth accumulator | |
2023 clrf pressure_rel_accu_trip+1 ; .... | |
2024 clrf pressure_rel_accu_trip+2 ; .... | |
2025 clrf pressure_rel_accu_trip+3 ; .... | |
2026 CLRI divesecs_avg_trip ; clear the resettable time accumulator | |
2027 return ; done | |
2028 | |
2029 | |
2030 ;----------------------------------------------------------------------------- | |
2031 ; Calculate Average Depth | |
2032 ; | |
0 | 2033 calc_average_depth: |
623 | 2034 ; 1. compute pressure_rel_cur_cached x 2, because this routine is called every 2nd second only |
634 | 2035 MOVII pressure_rel_cur_cached,xB ; copy current rel pressure to xB |
2036 bcf STATUS,C ; multiply rel pressure x 2 (via shift left) | |
2037 rlcf xB+0,F ; ... | |
2038 rlcf xB+1,F ; ... | |
623 | 2039 |
2040 ; 2a add (pressure_rel_cur_cached x 2) to the resettable depth accumulator | |
2041 ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) | |
634 | 2042 movf xB+0,W ; pressure_rel_accu_trip += xB |
2043 addwf pressure_rel_accu_trip+0,F ; ... | |
2044 movf xB+1,W ; ... | |
2045 addwfc pressure_rel_accu_trip+1,F ; ... | |
2046 movlw .0 ; ... | |
2047 addwfc pressure_rel_accu_trip+2,F ; ... | |
2048 addwfc pressure_rel_accu_trip+3,F ; ... | |
623 | 2049 |
2050 ; 2b add (pressure_rel_cur_cached x 2) to the total depth accumulator | |
2051 ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) | |
634 | 2052 movf xB+0,W ; pressure_rel_accu_total += xB |
2053 addwf pressure_rel_accu_total+0,F ; ... | |
2054 movf xB+1,W ; ... | |
2055 addwfc pressure_rel_accu_total+1,F ; ... | |
2056 movlw .0 ; ... | |
2057 addwfc pressure_rel_accu_total+2,F ; ... | |
2058 addwfc pressure_rel_accu_total+3,F ; ... | |
623 | 2059 |
2060 ; 3a compute the resettable average depth | |
634 | 2061 movff pressure_rel_accu_trip+0,xC+0 ; get the accumulated depth |
2062 movff pressure_rel_accu_trip+1,xC+1 ; ... | |
2063 movff pressure_rel_accu_trip+2,xC+2 ; ... | |
2064 movff pressure_rel_accu_trip+3,xC+3 ; ... | |
2065 MOVII divesecs_avg_trip,xB ; get the accumulated time | |
623 | 2066 |
2067 ; divide accumulated depth by accumulated time | |
604 | 2068 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder |
623 | 2069 |
2070 ; store result | |
2071 MOVII xC,pressure_rel_avg_trip ; resettable average depth | |
2072 btfss count_divetime ; is dive time counted? | |
604 | 2073 return ; NO (e.g. too shallow) |
2074 | |
623 | 2075 ; 3b compute the dive total average depth |
634 | 2076 movff pressure_rel_accu_total+0,xC+0 ; get accumulated depth |
2077 movff pressure_rel_accu_total+1,xC+1 ; ... | |
2078 movff pressure_rel_accu_total+2,xC+2 ; ... | |
2079 movff pressure_rel_accu_total+3,xC+3 ; ... | |
2080 MOVII divesecs_avg_total,xB ; get accumulated time | |
623 | 2081 |
2082 ; divide accumulated depth by accumulated time | |
2083 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
2084 | |
2085 ; store result | |
2086 MOVII xC,pressure_rel_avg_total ; total dive average depth | |
2087 | |
2088 btfsc request_reset_avg ; shall reset the resettable average depth? | |
634 | 2089 rcall resettable_average_depth_reset ; YES - reset the resettable average depth |
623 | 2090 |
2091 TSTOSC opt_2ndDepthDisp ; drawing average depth instead of max depth? | |
2092 bsf FLAG_TFT_depth_maximum ; YES - flag to update display | |
2093 | |
2094 btfsc FLAG_gauge_mode ; in gauge mode? | |
2095 bsf FLAG_TFT_depth_maximum ; YES - flag to update display (needed for alternative layout) | |
2096 | |
2097 return ; done | |
2098 | |
2099 | |
634 | 2100 ;----------------------------------------------------------------------------- |
2101 ; Check Switches, execute Pre-Menu Items (called every second) | |
2102 ; | |
2103 test_switches_divemode: | |
623 | 2104 btfsc dive_main_menu ; dive mode menu shown? |
604 | 2105 bra test_switches_divemode_menu ; YES - use menu processor |
2106 btfsc switch_left ; NO - left button pressed? | |
634 | 2107 goto menuview_toggle ; YES - step through pre-menu |
604 | 2108 btfss switch_right ; NO - right button pressed? |
2109 return ; NO - done | |
623 | 2110 bcf switch_right ; YES - clear button event |
2111 tstfsz active_premenu ; - any pre-menu task selected? | |
634 | 2112 bra test_switches_divemode1 ; YES - execute a pre-menu item |
623 | 2113 bsf request_next_custview ; NO - request next custom view |
604 | 2114 return ; - done |
0 | 2115 |
2116 test_switches_divemode_menu: | |
623 | 2117 btfsc switch_left ; left button pressed? |
2118 bra test_switches_divemode_menu2 ; YES - move cursor | |
2119 btfsc switch_right ; NO - right button pressed? | |
634 | 2120 bra test_switches_divemode_menu3 ; YES - do a menu operation |
623 | 2121 btfss update_menu ; NO - shall update the menu? |
2122 return ; NO - done | |
2123 bcf update_menu ; YES - clear request | |
2124 goto menu_draw_lines_divemode ; - redraw the menu (to update color coding) and return | |
0 | 2125 |
2126 test_switches_divemode_menu1: | |
634 | 2127 clrf menu_pos_cur ; reset menu item number to zero |
0 | 2128 test_switches_divemode_menu2: |
634 | 2129 bcf switch_left ; clear left button event |
2130 incf menu_pos_cur,F ; increment menu item number | |
2131 incf menu_pos_max,W ; get number of items + 1 into WREG | |
2132 cpfslt menu_pos_cur ; incremented item number > number of items ? | |
2133 bra test_switches_divemode_menu1 ; YES - restart from first item | |
2134 call menu_draw_cursor_dive ; draw cursor at new position | |
623 | 2135 movlw divemode_timeout_mainmenu ; get timeout for main menu |
634 | 2136 call restart_timeout_time ; restart the timeout |
2137 return ; done | |
2138 | |
2139 test_switches_divemode_menu3: | |
2140 bcf switch_right ; clear right button event | |
2141 goto do_line_menu ; Warning! trashes STKPTR and returns to | |
2142 ; divemode_option_divemenu_return | |
0 | 2143 |
2144 test_switches_divemode1: | |
634 | 2145 movlw divemode_timeout_premenu ; get timeout for pre-menu |
2146 call restart_timeout_time ; restart the timeout | |
2147 movf active_premenu,W ; get active pre-menu item | |
0 | 2148 dcfsnz WREG,F |
634 | 2149 bra divemode_option_gaschange ; 1: switch to the the "better gas" / "better diluent" |
137 | 2150 dcfsnz WREG,F |
634 | 2151 bra divemode_option_ackn ; 2: acknowledge current advice, attention, or warning |
2152 dcfsnz WREG,F | |
2153 bra divemode_option_divemenu ; 3: enter dive mode menu | |
0 | 2154 dcfsnz WREG,F |
631 | 2155 IFDEF _cave_mode |
634 | 2156 bra divemode_option_cavemenu ; 4: enter cave mode menu |
631 | 2157 ELSE |
634 | 2158 return ; 4: (no cave mode compiled in) |
2159 ENDIF | |
2160 dcfsnz WREG,F | |
2161 bra divemode_option_sim_quit ; 5: quit simulator mode | |
2162 dcfsnz WREG,F | |
2163 bra divemode_option_sim_down ; 6: simulator mode - descent | |
2164 dcfsnz WREG,F | |
2165 bra divemode_option_sim_up ; 7: simulator mode - ascend | |
2166 dcfsnz WREG,F | |
2167 bra divemode_option_sim_time ; 8: simulator mode - +5 min | |
2168 dcfsnz WREG,F | |
2169 bra divemode_option_apnoe_quit ; 9: quit apnoe dive | |
2170 dcfsnz WREG,F | |
2171 bra divemode_option_gauge_reset ; 10: reset stopwatch and avg depth (gauge mode) | |
2172 dcfsnz WREG,F | |
2173 IFDEF _compass | |
2174 bra divemode_option_course ; 11: set bearing | |
2175 ELSE | |
2176 return ; 11: (no compass compiled in) | |
631 | 2177 ENDIF |
0 | 2178 dcfsnz WREG,F |
634 | 2179 bra divemode_option_layout ; 12: switch layout |
2180 return ; catch illegal item number | |
2181 | |
2182 | |
2183 ; item 1: switch to the the "better gas" / "better diluent" | |
2184 ; | |
2185 divemode_option_gaschange: | |
2186 IFDEF _ccr_pscr | |
2187 btfsc FLAG_oc_mode ; in OC mode? | |
2188 bra divemode_option_gaschange_oc ; YES | |
2189 btfsc bailout_mode ; in bailout? | |
2190 bra divemode_option_gaschange_oc ; YES | |
2191 | |
2192 ; in CCR/pSCR mode and not in bailout | |
2193 movff best_dil_number,menu_pos_cur ; select best diluent | |
2194 bcf better_dil_available ; clear flag immediately | |
2195 bra divemode_option_gaschange3 ; continue with common part | |
2196 ENDIF | |
2197 divemode_option_gaschange_oc: | |
2198 movff best_gas_number,menu_pos_cur ; select best gas | |
2199 bcf better_gas_available ; clear better gas cue | |
2200 | |
2201 divemode_option_gaschange3 | |
2202 bsf request_gas_change ; request a gas/diluent change | |
2203 goto menuview_toggle_reset ; terminate the pre-menu (and return) | |
2204 | |
2205 | |
2206 ; item 2: acknowledge current advice, attention, or warning | |
2207 ; | |
2208 divemode_option_ackn: | |
2209 btfss sign_warning ; any warning active? | |
2210 bra divemode_option_ackn_attn ; NO - check for active attentions | |
2211 movff DM_flags_war1_det,DM_flags_war1_ack ; YES - memorize active warnings as acknowledged | |
2212 movff DM_flags_war2_det,DM_flags_war2_ack ; - ... | |
2213 bra divemode_option_ackn_common ; - update screen | |
2214 | |
2215 divemode_option_ackn_attn: | |
2216 btfss sign_attention ; any attention active? | |
2217 bra divemode_option_ackn_advc ; NO - must be active advice then | |
2218 movff DM_flags_att1_det,DM_flags_att1_ack ; YES - memorize active attentions as acknowledged | |
2219 movff DM_flags_att2_det,DM_flags_att2_ack ; - ... | |
2220 movff DM_flags_att3_det,DM_flags_att3_ack ; - ... | |
2221 bra divemode_option_ackn_common ; - update screen | |
2222 | |
2223 divemode_option_ackn_advc: | |
2224 movff DM_flags_advc_det,DM_flags_advc_ack ; memorize active advices as acknowledged | |
2225 ;bra divemode_option_ackn_common ; update screen | |
2226 | |
2227 divemode_option_ackn_common: | |
2228 call menuview_toggle_reset ; terminate pre-menu | |
2229 call divemode_check_sign ; compute if the advice / attention / warning sign shall be shown | |
2230 btfsc FLAG_TFT_sign_show ; shall show the advice / attention / warning sign? | |
2231 goto TFT_divemode_sign_show ; YES - show sign and return | |
2232 goto TFT_divemode_sign_clear ; NO - clear sign and return | |
2233 | |
2234 | |
2235 ; item 3: enter dive mode menu | |
2236 ; | |
2237 divemode_option_divemenu: | |
2238 btfss divemode ; in dive mode? | |
2239 goto menuview_toggle_reset ; NO - block menu, terminate the pre-menu | |
2240 call TFT_clear_divemode_menu ; YES - clear menu area | |
2241 bcf dive_pre_menu ; - set pre-menu as not shown anymore | |
2242 goto do_main_divemenu ; - hand over to menu processor | |
2243 | |
2244 | |
2245 ; item 4: enter cave mode menu | |
2246 ; | |
2247 IFDEF _cave_mode | |
2248 divemode_option_cavemenu: | |
2249 btfss divemode ; in dive mode? | |
2250 goto menuview_toggle_reset ; NO - block menu, terminate the pre-menu | |
2251 call TFT_clear_divemode_menu ; YES - clear menu area | |
2252 bcf dive_pre_menu ; - set pre-menu as not shown anymore | |
2253 goto do_main_cavemenu ; - hand over to menu processor | |
2254 ENDIF | |
2255 | |
2256 | |
2257 ; item 5: quit simulator mode | |
2258 ; | |
2259 divemode_option_sim_quit: | |
2260 clrf simulatormode_depth ; set target depth to zero | |
2261 bsf quit_simulatormode ; request ISR to end simulator mode | |
2262 call menuview_toggle_reset ; terminate the pre-menu | |
2263 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
2264 bcf divemode ; YES - force end of dive mode | |
2265 return ; done | |
2266 | |
2267 | |
2268 ; item 6: simulator mode - descent 1 meter | |
2269 ; | |
2270 divemode_option_sim_down: | |
2271 movlw ostc_depth_max-1 ; load depth limit into WREG | |
2272 cpfsgt simulatormode_depth ; simulated depth < limit ? | |
2273 incf simulatormode_depth,F ; YES - increment simulated depth | |
2274 return ; done | |
2275 | |
2276 | |
2277 ; item 7: simulator mode - ascent 1 meter | |
2278 ; | |
2279 divemode_option_sim_up: | |
2280 tstfsz simulatormode_depth ; simulated depth > 0 ? | |
2281 decf simulatormode_depth,F ; YES - decrement simulated depth | |
2282 return ; done | |
2283 | |
2284 | |
2285 ; item 8: simulator mode - +5 min | |
2286 ; | |
2287 divemode_option_sim_time: | |
2288 movff char_I_sim_advance_time,WREG ; get mailbox content | |
2289 tstfsz WREG ; mailbox clear (=0) ? | |
2290 return ; NO - still having a pending +5' request, refuse new request | |
2291 bra advance_time ; YES - advance time and return | |
2292 | |
2293 | |
2294 ; item 9: quit apnoe dive | |
2295 ; | |
2296 divemode_option_apnoe_quit: | |
2297 btfsc sensor_override_active ; in simulator mode? | |
2298 bra divemode_option_sim_quit ; YES - use simulator quit procedure | |
2299 bcf divemode ; NO - force end of dive mode | |
2300 return ; - done | |
2301 | |
2302 | |
2303 ; item 10: reset stopwatch and avg depth (gauge mode only) | |
2304 ; | |
2305 divemode_option_gauge_reset: | |
2306 bsf request_reset_avg ; request reset of average depth | |
2307 goto menuview_toggle_reset ; terminate pre-menu and return | |
2308 | |
2309 | |
2310 ; item 11: set bearing | |
2311 ; | |
623 | 2312 IFDEF _compass |
634 | 2313 divemode_option_course: |
2314 MOVII compass_heading_shown,compass_bearing | |
2315 bsf compass_bearing_set ; set flag to show heading | |
2316 goto menuview_toggle_reset ; terminate the pre-menu and return | |
623 | 2317 ENDIF |
634 | 2318 |
2319 | |
2320 ; item 12: switch layout | |
2321 ; | |
2322 divemode_option_layout: | |
2323 call menuview_toggle_reset ; terminate the pre-menu | |
2324 call TFT_ClearScreen ; clear the whole screen | |
2325 btg alt_layout_active ; toggle layout | |
2326 | |
2327 bcf depth_color_last ; set warning or attention on the depth not shown | |
2328 bcf depth_inverse_last ; set depth displayed in inverse as not shown | |
2329 bcf sign_shown ; set warning/attention/advice sign not shown | |
2330 bcf velocity_active_num ; set numerical vertical velocity display not shown | |
2331 bcf velocity_active_vsi ; set vertical vertical velocity display not shown | |
2332 bcf safety_stop_active ; set safety stop not shown | |
2333 | |
2334 bsf FLAG_TFT_divemode_mask ; request redraw of dive screen mask | |
2335 bsf FLAG_TFT_divetime ; request redraw of dive time | |
2336 bsf FLAG_TFT_depth_current ; request redraw of current depth | |
2337 bsf FLAG_TFT_depth_maximum ; request redraw of maximum depth | |
2338 bsf FLAG_TFT_active_gas_divemode; request redraw of gas and setpoint | |
2339 bsf FLAG_TFT_temperature ; request redraw of temperature | |
2340 bsf FLAG_TFT_customview_callup ; request redraw of custom view | |
2341 | |
2342 goto request_redraw_NDL_deco_data; request redraw of NDL/deco data and return | |
2343 | |
2344 | |
2345 ;----------------------------------------------------------------------------- | |
2346 ; Helper Function - advance Time by 5 Minutes (Simulator Mode) | |
2347 ; | |
2348 advance_time: | |
2349 ; advance tissues pressures and deco obligation by 5 minutes | |
2350 movlw .5 ; + 5 minutes | |
2351 movff WREG,char_I_sim_advance_time ; copy to mailbox | |
2352 call restart_deco_engine ; condition deco engine to execute the +5 minutes | |
2353 | |
2354 bcf count_divetime ; stop dive time incrementing in ISR | |
2355 ADDLI .5,counted_divetime_mins ; add 5 minutes to counted_divetime_mins | |
2356 ADDLI .300,total_divetime_secs ; add 5 minutes (300 seconds) to total_divetime_secs | |
2357 bsf count_divetime ; continue dive time incrementing in ISR | |
2358 | |
2359 ADDLI .300,divesecs_avg_trip ; add 5 minutes (300 seconds) to resettable time accumulator | |
2360 ADDLI .300,divesecs_avg_total ; add 5 minutes (300 seconds) to total time accumulator | |
2361 | |
2362 MOVII pressure_rel_cur_cached,xB ; calculate 300 x depth in mbar (300 = 5 min * 60 sec/min) | |
2363 MOVLI .300,xA ; ... | |
2364 call mult16x16 ; xC = xA * xB | |
2365 | |
2366 movf xC+0,W ; add to the resettable depth accumulator | |
2367 addwf pressure_rel_accu_trip+0,F ; ... | |
2368 movf xC+1,W ; ... | |
2369 addwfc pressure_rel_accu_trip+1,F ; ... | |
2370 movf xC+2,W ; ... | |
2371 addwfc pressure_rel_accu_trip+2,F ; ... | |
2372 movf xC+3,W ; ... | |
2373 addwfc pressure_rel_accu_trip+3,F ; ... | |
2374 | |
2375 movf xC+0,W ; add to the total depth accumulator | |
2376 addwf pressure_rel_accu_total+0,F ; ... | |
2377 movf xC+1,W ; ... | |
2378 addwfc pressure_rel_accu_total+1,F ; ... | |
2379 movf xC+2,W ; ... | |
2380 addwfc pressure_rel_accu_total+2,F ; ... | |
2381 movf xC+3,W ; ... | |
2382 addwfc pressure_rel_accu_total+3,F ; ... | |
2383 | |
2384 IFDEF _cave_mode | |
2385 ; update backtracking data | |
2386 btfss cave_mode ; cave mode switched on? | |
2387 bra divemode_option_sim_time_exit ; NO - skip backtracking depth recording | |
2388 btfsc dive_turned ; YES - dive turned? | |
2389 bra divemode_option_sim_time_exit ; YES - skip backtracking depth recording | |
2390 ;bra divemode_option_sim_time_exec ; NO - update backtracking depth recording | |
2391 | |
2392 divemode_option_sim_time_exec: | |
2393 movff backtrack_deltatime,hi ; backup time elapsed since last depth recording | |
2394 movlw .5 ; configure 5 minutes | |
2395 movwf lo ; use lo as loop counter | |
2396 | |
2397 divemode_option_sim_time_loop: | |
2398 call write_backtrack_1min_depth ; store a backtracking depth data set | |
2399 btfsc backtrack_entire_full ; backtracking storage entirely used up? | |
2400 bra divemode_option_sim_time_exit ; YES - abort backtracking depth recording | |
2401 decfsz lo,F ; NO - decrement loop counter, did it became zero? | |
2402 bra divemode_option_sim_time_loop ; NO - loop | |
2403 ;bra divemode_option_sim_time_done ; YES - done | |
2404 | |
2405 divemode_option_sim_time_done: | |
2406 movff hi,backtrack_deltatime ; restore time elapsed since last depth recording | |
2407 ENDIF ; _cave_mode | |
2408 | |
2409 divemode_option_sim_time_exit: | |
2410 return ; done (leaving option avail for repeated selection) | |
2411 | |
2412 | |
2413 ;----------------------------------------------------------------------------- | |
2414 ; Change Gas / Diluent | |
2415 ; | |
631 | 2416 gas_switch_common: |
634 | 2417 bcf request_gas_change ; clear request flag |
623 | 2418 IFDEF _ccr_pscr |
634 | 2419 btfss request_back_to_loop ; is a switchback from OC bailout to loop requested? |
2420 bra gas_switched_common0 ; NO - continue with checking if selected gas is valid | |
2421 bcf request_back_to_loop ; YES - clear flag | |
2422 movff active_dil,menu_pos_cur ; - reload last diluent | |
2423 bra gas_switched_common1 ; - continue with common part | |
623 | 2424 ENDIF |
582 | 2425 gas_switched_common0: |
634 | 2426 tstfsz menu_pos_cur ; menu_pos_cur = 0 ? |
2427 bra gas_switched_common1 ; NO - valid gas | |
2428 return ; YES - something went wrong, invalid gas, abort | |
560 | 2429 gas_switched_common1: |
634 | 2430 movf menu_pos_cur,W ; get selected gas into WREG (1-5) |
623 | 2431 IFDEF _ccr_pscr |
634 | 2432 btfsc FLAG_oc_mode ; in OC mode? |
2433 bra gas_switched_common_OC ; YES | |
2434 btfsc bailout_mode ; in bailout? | |
2435 bra gas_switched_common_OC ; YES | |
2436 gas_switched_common_loop: ; NO to both - must be loop mode then | |
2437 call setup_dil_registers ; set up real tissues with WREG = diluent 1-6 | |
2438 call deco_setup_cc_diluents ; set up deco planning with WREG = diluent 1-6 | |
2439 bra gas_switched_common3 ; continue with common part | |
631 | 2440 ENDIF ; _ccr_pscr |
634 | 2441 |
604 | 2442 gas_switched_common_OC: |
634 | 2443 call setup_gas_registers ; set up real tissues with WREG = gas 1-6 |
2444 call deco_setup_oc_gases ; set up deco planning with WREG = gas 1-6 | |
2445 ;bra gas_switched_common3 ; continue with common part | |
2446 | |
560 | 2447 gas_switched_common3: |
605 | 2448 banksel int_O_breathed_ppO2 |
2449 bcf int_O_breathed_ppO2+1,int_low_flag ; | clear all flags that control color-coding | |
2450 bcf int_O_breathed_ppO2+1,int_high_flag ; | to have the new gas initially displayed in | |
2451 bcf int_O_breathed_ppO2+1,int_attention_flag ; | memo color instead of a warning or attention | |
2452 bcf int_O_breathed_ppO2+1,int_warning_flag ; | color that belonged to the previous gas | |
2453 banksel common | |
631 | 2454 bsf FLAG_TFT_active_gas_divemode ; redraw gas/setpoint/diluent |
2455 bsf FLAG_TFT_temperature ; redraw temperature | |
2456 bsf event_occured ; set global event flag | |
623 | 2457 IFDEF _ccr_pscr |
631 | 2458 btfsc bailout_mode ; in bailout mode? |
2459 bsf event_bailout ; YES - set bailout event | |
2460 btfss bailout_mode ; in bailout mode? | |
623 | 2461 ENDIF |
631 | 2462 bsf event_gas_change ; (NO) - set gas change event (normal change) |
2463 goto restart_deco_engine_wo_ceiling ; abort running deco calculations and restart (and return) | |
2464 | |
2465 | |
634 | 2466 ;----------------------------------------------------------------------------- |
2467 ; Reload the current Gas / Diluent | |
2468 ; | |
631 | 2469 gas_update_common: |
2470 bcf request_gas_update ; reset the request flag | |
2471 movf active_gas,W ; load WREG with currently used gas | |
2472 IFDEF _ccr_pscr | |
2473 btfsc FLAG_oc_mode ; in OC mode? | |
2474 bra gas_switched_common_OC ; YES - reload OC gases | |
2475 btfsc bailout_mode ; NO - in bailout? | |
2476 bra gas_switched_common_OC ; YES - reload OC gases | |
2477 movf active_dil,W ; NO - load WREG with currently used diluent | |
2478 bra gas_switched_common_loop ; - set up diluent gases | |
2479 ELSE | |
2480 bra gas_switched_common_OC ; reload OC gases | |
2481 ENDIF | |
560 | 2482 |
634 | 2483 |
2484 ;----------------------------------------------------------------------------- | |
2485 ; Toggle GF/aGF (finalization) | |
2486 ; | |
2487 divemodemode_togglegf: | |
2488 bcf request_toggle_GF ; clear request flag | |
2489 goto restart_deco_engine ; restart the deco engine and return | |
2490 | |
2491 | |
2492 ;----------------------------------------------------------------------------- | |
2493 ; Set a Marker in the Dive Profile | |
2494 ; | |
2495 set_logbook_marker: | |
2496 bcf request_set_marker ; clear request flag | |
2497 movlw d'6' ; set type of alarm: manual marker | |
2498 movwf alarm_type ; copy to alarm register | |
2499 bsf event_occured ; set event flag | |
631 | 2500 return ; done |
0 | 2501 |
634 | 2502 |
2503 ;----------------------------------------------------------------------------- | |
604 | 2504 ; Find the best gas and diluent for the current depth |
2505 ; and check if a gas/diluent change is to be advised. | |
2506 ; | |
2507 ; Output: best_gas_number : number of best gas, 0= none avail, 255= not computed | |
2508 ; best_dil_number : number of best dil, 0= none avail, 255= not computed | |
2509 ; better_gas_available : flag indicating if a change is advised | |
2510 ; better_dil_available : flag indicating if a change is advised | |
2511 ; | |
2512 ; | |
2513 ; in CCR and pSCR mode: - checks both, gases and diluents for respective best gas / best diluent | |
2514 ; - if not in bailout, sets better_dil_available on diluents | |
2515 ; - if in bailout, sets better_gas_available on OC gases | |
2516 ; | |
2517 ; in OC mode : - checks only gases for best gas | |
2518 ; - sets better_gas_available on OC gases | |
0 | 2519 ; |
628 | 2520 global check_gas_best |
604 | 2521 check_gas_best: |
623 | 2522 btfsc FLAG_gauge_mode ; in gauge mode? |
2523 return ; YES - done | |
2524 | |
2525 MOVII pressure_abs_10,xA ; copy absolute pressure / 10 into xA:2, will be used by ppO2 min/max checks later | |
2526 | |
2527 ; compute max. allowed deco ppO2 | |
2528 movff char_I_ppO2_max_deco,WREG ; max ppO2 [cbar] for deco phase | |
2529 mullw .100 ; compute max ppO2 * 100, result is in 0.1 mbar | |
2530 ADDLI ppO2_margin_on_max,PROD ; add ppO2 margin on max value to compensate for surface pressures > 1000 hPa | |
2531 MOVII PROD,ppO2_max_deco ; store as deco ppO2 max | |
2532 | |
2533 ; compute max. allowed default ppO2 | |
604 | 2534 movff char_O_deco_info,lo ; bank-safe copy of deco info vector |
628 | 2535 btfss lo,deco_mode ; is the ppO2 deco limit enabled? |
623 | 2536 bra check_gas_best_1 ; NO - compute default ppO2 max |
2537 MOVII ppO2_max_deco,ppO2_max_default ; YES - copy default ppO2 max from deco max. | |
2538 bra check_gas_best_2 ; - continue with common part | |
2539 | |
2540 check_gas_best_1: | |
2541 movff char_I_ppO2_max_work,WREG ; max ppO2 [cbar] for working phase | |
2542 mullw .100 ; compute max ppO2 * 100, result is in 0.1 mbar | |
2543 ADDLI ppO2_margin_on_max,PROD ; add ppO2 margin on max value to compensate for surface pressures > 1000 hPa | |
2544 MOVII PROD,ppO2_max_default ; store as default ppO2 max | |
2545 | |
2546 check_gas_best_2: | |
2547 | |
2548 IFDEF _ccr_pscr | |
604 | 2549 ; check dive mode |
2550 btfsc FLAG_oc_mode ; in OC mode? | |
2551 bra check_gas_best_gas ; YES - skip diluents, check for best gas only | |
2552 | |
2553 check_gas_best_dil: | |
2554 ; set minimum ppO2 required | |
2555 movff char_I_ppO2_min,WREG ; min ppO2 for pure diluent in CCR mode (default) | |
2556 btfsc FLAG_pscr_mode ; in pSCR mode? | |
623 | 2557 movff char_I_ppO2_min_loop,WREG ; YES - replace by min ppO2 for pure diluent in pSCR mode |
2558 mullw .100 ; min ppO2 * 100, result in 0.1 mbar | |
2559 MOVII PROD,ppO2_min ; store in ppO2_min | |
631 | 2560 ; check diluents |
604 | 2561 lfsr FSR1,opt_dil_O2_ratio ; set base address for diluent arrays |
631 | 2562 movff active_dil,lo ; set number of currently used diluent |
2563 ; preset result to nothing found | |
2564 clrf best_gas_num ; initialize best diluent to 0 = none found yet | |
2565 setf best_gas_depth ; initialize change depth to 255 = any one will be better | |
2566 ; check if current diluent is usable | |
2567 movff lo,check_gas_num ; check if the current diluent is usable | |
2568 rcall check_gas_best_common ; if yes, the current diluent will become the best diluent found so far | |
2569 rcall check_gas_best_all ; check if any other diluent is better | |
604 | 2570 ; store result |
2571 movff best_gas_num,best_dil_number ; store new best diluent found (1-5 or 0 of no usable diluent available) | |
2572 ; check if change advices shall be given in general | |
623 | 2573 btfsc bailout_mode ; in bailout? |
604 | 2574 bra check_gas_best_gas ; YES - no better diluent advice when in bailout |
2575 check_gas_best_dil1: | |
2576 ; check if a change advice shall be given right now | |
631 | 2577 bcf better_dil_available ; default to no better diluent found |
604 | 2578 movf best_dil_number,W ; load number of best diluent into WREG (1-5) |
2579 bz check_gas_best_dil3 ; has a best diluent been found at all? NO - nothing to signal for | |
2580 cpfseq active_dil ; is this the currently used diluent? | |
631 | 2581 bra check_gas_best_dil2 ; NO - a better diluent has been found |
604 | 2582 bra check_gas_best_dil3 ; YES - no need to signal a better diluent if this diluent is already in use |
2583 check_gas_best_dil2: | |
634 | 2584 btfsc warn_det_sensors_lost ; all sensors lost? |
604 | 2585 bra check_gas_best_dil3 ; YES - suppress better diluent prompt in this case |
2586 ; not using the best gas - show better diluent hint whenever a better diluent is available | |
2587 bsf better_dil_available ; signal that a better diluent is available | |
2588 bsf FLAG_TFT_active_gas_divemode ; redraw gas/setpoint/diluent | |
2589 check_gas_best_dil3: | |
2590 btfss better_dil_available ; shall a better diluent be signaled for? | |
623 | 2591 bcf better_dil_blinking ; NO - clear blinking flag |
631 | 2592 ;bra check_gas_best_gas ; ; continue with checking for best bailout gas |
623 | 2593 ENDIF ; _ccr_pscr |
2594 | |
631 | 2595 |
604 | 2596 check_gas_best_gas: |
2597 ; set minimum ppO2 required | |
628 | 2598 movff char_I_ppO2_min,WREG ; min ppO2 for OC and bailout |
623 | 2599 mullw .100 ; min ppO2 * 100, result in 0.1 mbar |
2600 MOVII PROD,ppO2_min ; store in ppO2_min | |
631 | 2601 ; check gases |
604 | 2602 lfsr FSR1,opt_gas_O2_ratio ; set base address for gas arrays |
631 | 2603 movff active_gas,lo ; set number of currently used gas |
2604 ; preset result to nothing found | |
2605 clrf best_gas_num ; initialize best gas to 0 = none found yet | |
2606 setf best_gas_depth ; initialize change depth to 255 = any one will be better | |
2607 ; check if current gas is usable | |
2608 movff lo,check_gas_num ; check if the current gas is usable | |
2609 rcall check_gas_best_common ; if yes, the current gas will become the best gas found so far | |
2610 rcall check_gas_best_all ; check if any other gas is better | |
604 | 2611 ; store result |
2612 movff best_gas_num,best_gas_number ; store new best gas found (1-5 or 0 of no usable gas available) | |
631 | 2613 IFDEF _ccr_pscr |
604 | 2614 ; check if change advices shall be given in general |
2615 btfsc FLAG_oc_mode ; in OC mode? | |
631 | 2616 bra check_gas_best_gas1 ; YES - give advice |
2617 btfsc bailout_mode ; NO - in bailout? | |
2618 bra check_gas_best_gas1 ; YES - give advice | |
2619 return ; NO - no better (OC) gas advice when not in OC or bailout mode | |
2620 ENDIF ; _ccr_pscr | |
604 | 2621 check_gas_best_gas1: ; check if we are already on the best gas |
2622 ; check if a change advice shall be given right now | |
631 | 2623 bcf better_gas_available ; default to no better gas found |
604 | 2624 movf best_gas_number,W ; load number of best gas into WREG (1-5) |
2625 bz check_gas_best_gas3 ; has a best gas been found at all? NO - nothing to signal for | |
2626 cpfseq active_gas ; is this the currently used gas? | |
631 | 2627 bra check_gas_best_gas2 ; NO - a better gas has been found |
604 | 2628 bra check_gas_best_gas3 ; YES - no need to signal a better gas if this gas is already in use |
2629 check_gas_best_gas2: | |
2630 ; not using the best gas - show better gas hint whenever a better gas is available | |
2631 bsf better_gas_available ; YES - signal that a better gas is available | |
2632 bsf FLAG_TFT_active_gas_divemode ; YES - redraw gas/setpoint/diluent | |
2633 check_gas_best_gas3: | |
2634 btfss better_gas_available ; shall a better gas be signaled for? | |
623 | 2635 bcf better_gas_blinking ; NO - clear blinking flag |
582 | 2636 return |
0 | 2637 |
631 | 2638 |
2639 check_gas_best_all: | |
2640 clrf check_gas_num ; increment comes first, so initialize with zero | |
2641 check_gas_best_loop: | |
2642 incf check_gas_num,F ; increment number of gas to check | |
2643 movf lo,W ; copy number of currently used gas to WREG | |
2644 cpfseq check_gas_num ; gas to be checked = currently used gas ? | |
2645 rcall check_gas_best_common ; NO - check the gas | |
2646 movlw NUM_GAS ; get total number of gases | |
2647 cpfseq check_gas_num ; reached last gas? | |
2648 bra check_gas_best_loop ; NO - loop | |
2649 return ; YES - done | |
2650 | |
2651 | |
604 | 2652 check_gas_best_common: ; with gas to be checked in check_gas_num (1-5) |
634 | 2653 ; and current gas in lo (1-5) |
604 | 2654 ; |
2655 ; Memory Map: | |
2656 ; --------------------------------------------------------------------------------------- | |
2657 ; opt_gas_O2_ratio res 5 ; base address for gases | |
2658 ; opt_dil_O2_ratio res 5 ; base address for diluents | |
2659 ; opt_gas_He_ratio res 5 ; (not needed here) | |
2660 ; opt_dil_He_ratio res 5 ; (not needed here) | |
2661 ; opt_gas_type res 5 ; has offset of 20 bytes from base address for gases | |
2662 ; opt_dil_type res 5 ; has offset of 20 bytes from base address for diluents | |
2663 ; opt_gas_change res 5 ; has offset of 10 bytes from opt_gas_type | |
2664 ; opt_dil_change res 5 ; has offset of 10 bytes from opt_dil_type | |
2665 | |
2666 ; get gas data | |
2667 decf check_gas_num,W ; (1-5) -> (0-4) into WREG to be used as index | |
623 | 2668 movff PLUSW1,check_gas_O2_ratio ; copy O2 ratio (%) of current gas/dil to check_gas_O2_ratio |
604 | 2669 addlw .20 ; add offset of 20 bytes to index type in opt_gas_type/opt_dil_type |
623 | 2670 movff PLUSW1,check_gas_type ; copy type of current gas/dil to check_gas_type (0=disabled, 1=first, 2=travel/normal, 3=deco/-) |
604 | 2671 addlw .10 ; add offset of 10 bytes to index change depth in opt_gas_change/opt_dil_change |
623 | 2672 movff PLUSW1,check_gas_depth ; copy change depth of current gas/dil to check_gas_depth |
2673 MOVII ppO2_max_default,sub_b ; select default ppO2 max for first / travel / normal gas | |
628 | 2674 ; check if the gas is the current gas |
2675 movf check_gas_num,W ; get the number of the gas to be checked (1-5) | |
2676 cpfseq lo ; is this the currently used gas? | |
2677 bra check_gas_best_common0 ; NO - do the disabled & deco gas checks | |
2678 bra check_gas_best_common3 ; YES - a gas in use overrides disabled and deco status | |
2679 check_gas_best_common0: | |
623 | 2680 ; check if gas is available (i.e. not disabled) |
631 | 2681 btfsc check_gas_type,gas_lost ; gas/dil lost? |
2682 return ; YES - skip as not available any more | |
2683 btfsc check_gas_type,gas_staged ; gas/dil staged? | |
2684 return ; YES - skip as currently not available | |
623 | 2685 tstfsz check_gas_type ; type = disabled (0) ? |
2686 bra check_gas_best_common1 ; NO - continue checks | |
631 | 2687 return ; YES - skip as not available at all |
623 | 2688 check_gas_best_common1: |
2689 ; skip deco gases (type=3) if there are no stops, but include them when in bailout mode | |
2690 movlw .3 ; coding for deco gas | |
2691 cpfseq check_gas_type ; type = deco (3) ? | |
2692 bra check_gas_best_common3 ; NO - first or travel/normal then, ok to use | |
631 | 2693 IFDEF _ccr_pscr |
623 | 2694 btfsc bailout_mode ; YES - in bailout? |
2695 bra check_gas_best_common2 ; YES - ok to use (using deco gases is always allowed when in bailout) | |
631 | 2696 ENDIF |
2697 TSTOSS opt_ext_stops ; NO - extended stops enabled? | |
2698 bra check_gas_best_common1b ; NO - only ok if in deco region | |
2699 ;bra check_gas_best_common1a ; YES - only ok if in deco mode | |
623 | 2700 check_gas_best_common1a: |
628 | 2701 movff char_O_deco_info,WREG ; get deco info vector |
2702 btfss WREG,deco_mode ; are we in deco mode? | |
2703 return ; NO - skip deco gas while not in deco mode | |
2704 bra check_gas_best_common2 ; YES - deco gases allowed | |
2705 check_gas_best_common1b: | |
2706 btfss deco_region ; are we in the deco region? | |
2707 return ; NO - skip deco gas while not in the deco region | |
2708 ;bra check_gas_best_common2 ; YES - deco gases allowed | |
623 | 2709 check_gas_best_common2: |
2710 MOVII ppO2_max_deco,sub_b ; replace by ppO2 max for a deco gas | |
2711 check_gas_best_common3: | |
604 | 2712 ; check if gas is usable, i.e. its change depth is below or equal to the current depth |
623 | 2713 movf depth_meter,W ; load current depth (in m) into WREG |
604 | 2714 cpfslt check_gas_depth ; change depth of checked gas < (shallower than) current depth? |
623 | 2715 bra check_gas_best_common4 ; NO - gas is usable |
604 | 2716 return ; YES - gas is not usable |
623 | 2717 check_gas_best_common4: |
604 | 2718 ; check if this gas is the first best gas candidate |
2719 movf best_gas_num,W ; get best gas found so far (1-5) or 0 if none found yet | |
2720 tstfsz WREG ; has a best gas candidate been found yet? | |
623 | 2721 bra check_gas_best_common5 ; YES - check if the new one is better than the one we have so far |
2722 bra check_gas_best_common6 ; NO - no need to do the above mentioned check | |
2723 check_gas_best_common5: | |
631 | 2724 ; check if the change depth of the checked gas is < (shallower) than the change depth of the best gas found so far |
604 | 2725 movf best_gas_depth,W ; load change depth of best gas so far into WREG |
631 | 2726 cpfslt check_gas_depth ; change depth of checked gas < (shallower than) change depth of best gas so far? |
2727 return ; NO - this gas is not better than the best already found | |
2728 ;bra check_gas_best_common6 ; YES - this gas is better, continue | |
623 | 2729 check_gas_best_common6: |
604 | 2730 ; check if the gas fits into the ppO2 limits |
623 | 2731 movff check_gas_O2_ratio,xB+0 ; xB = O2 ratio, xA is still loaded with (absolute pressure / 10) |
69 | 2732 clrf xB+1 |
623 | 2733 call mult16x16 ; xC = O2 ratio * (absolute pressure / 10), result in 0.1 mbar |
604 | 2734 ; check for very high ppO2 |
623 | 2735 tstfsz xC+2 ; O2_ratio * absolute pressure / 10 > 65536, i.e. ppO2 > 6.55 bar ? |
604 | 2736 return ; YES - gas is not usable |
623 | 2737 btfsc xC+1,7 ; ppO2 > 3.30 bar ? |
604 | 2738 return ; YES - gas is not usable |
623 | 2739 MOVII xC,sub_a ; NO - gas may be usable |
2740 ; check for high ppO2 | |
2741 call cmpU16 ; sub_a - sub_b | |
2742 btfss neg_flag ; within limit? | |
2743 return ; NO - too high, gas is not usable | |
604 | 2744 ; check for low ppO2 |
623 | 2745 MOVII ppO2_min,sub_b ; copy minimum ppO2 to sub_b |
2746 call cmpU16 ; sub_a - sub_b | |
604 | 2747 btfsc neg_flag ; within limit? |
2748 return ; NO - too low, gas is not usable | |
2749 ; we have a (new) best gas | |
631 | 2750 movff check_gas_num, best_gas_num ; YES - set checked gas (1-5) as best gas |
2751 movff check_gas_depth,best_gas_depth ; - memorize its change depth | |
2752 return ; - done | |
0 | 2753 |
634 | 2754 IFDEF _ccr_pscr |
2755 | |
2756 | |
2757 ;----------------------------------------------------------------------------- | |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2758 ; Check for Auto-SP |
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2759 ; |
634 | 2760 check_dive_autosp: |
640 | 2761 movf dive_ccr_mode,W ; =0: Fixed SP, =1: Sensor, =2: Auto SP |
2762 sublw .2 ; dive_ccr_mode = 2 (Auto SP)? | |
604 | 2763 bz check_dive_autosp2 ; YES - check |
2764 return ; NO - return for sensor or fixed mode | |
634 | 2765 |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2766 check_dive_autosp2: |
640 | 2767 ; check for restart request |
2768 btfss restart_auto_sp ; shall restart from 1st SP? | |
2769 bra check_dive_autosp2a ; NO - skip next | |
2770 bcf restart_auto_sp ; YES - clear request flag | |
2771 bcf FLAG_SP2_used ; - flag SP 2, ... | |
2772 bcf FLAG_SP3_used ; - flag SP 3, ... | |
2773 bcf FLAG_SP4_used ; - flag SP 4, ... | |
2774 bcf FLAG_SP5_used ; - flag SP 5 as unused so far | |
2775 | |
2776 check_dive_autosp2a: | |
631 | 2777 ; check SP2 |
623 | 2778 btfsc FLAG_SP2_used ; SP 2 used so far? |
604 | 2779 bra check_dive_autosp3 ; YES - continue with SP 3 |
623 | 2780 movff opt_setpoint_change+1,lo ; NO - get depth in m |
604 | 2781 tstfsz lo ; - SP change depth = 0 ? |
640 | 2782 bra check_dive_autosp2b ; NO - continue |
604 | 2783 bra check_dive_autosp3 ; YES - continue with SP 3 |
640 | 2784 check_dive_autosp2b: |
604 | 2785 decf lo,W ; SP change depth -1 -> WREG |
623 | 2786 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2787 bra check_dive_autosp3 ; NO - continue with SP 3 |
582 | 2788 ; auto switch to SP2 |
623 | 2789 movff opt_setpoint_cbar+1,char_I_const_ppO2 ; YES - use SP |
604 | 2790 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2791 bsf FLAG_SP2_used ; - set SP 2 used flag |
634 | 2792 |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2793 check_dive_autosp3: |
631 | 2794 ; check SP3 |
623 | 2795 btfsc FLAG_SP3_used ; SP 3 used so far? |
604 | 2796 bra check_dive_autosp4 ; YES - continue with SP 4 |
623 | 2797 movff opt_setpoint_change+2,lo ; NO - get depth in m |
604 | 2798 tstfsz lo ; - SP change depth = 0 ? |
2799 bra check_dive_autosp3a ; NO - continue | |
2800 bra check_dive_autosp4 ; YES - continue with SP 4 | |
560 | 2801 check_dive_autosp3a: |
604 | 2802 decf lo,W ; SP change depth -1 -> WREG |
623 | 2803 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2804 bra check_dive_autosp4 ; NO - continue with SP 4 |
582 | 2805 ; auto switch to SP3 |
623 | 2806 movff opt_setpoint_cbar+2,char_I_const_ppO2 ; YES - use SP |
604 | 2807 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2808 bsf FLAG_SP3_used ; - set SP 3 used flag |
634 | 2809 |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2810 check_dive_autosp4: |
631 | 2811 ; check SP4 |
623 | 2812 btfsc FLAG_SP4_used ; SP 4 used so far? |
604 | 2813 bra check_dive_autosp5 ; YES - continue with SP 5 |
623 | 2814 movff opt_setpoint_change+3,lo ; NO - get depth in m |
604 | 2815 tstfsz lo ; - SP change depth = 0 ? |
2816 bra check_dive_autosp4a ; NO - continue | |
623 | 2817 bra check_dive_autosp5 ; YES - continue with SP 5 |
560 | 2818 check_dive_autosp4a: |
604 | 2819 decf lo,W ; SP change depth -1 -> WREG |
623 | 2820 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2821 bra check_dive_autosp5 ; NO - continue with SP 5 |
582 | 2822 ; auto switch to SP4 |
623 | 2823 movff opt_setpoint_cbar+3,char_I_const_ppO2 ; YES - use SP |
604 | 2824 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2825 bsf FLAG_SP4_used ; - set SP 4 used flag |
634 | 2826 |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2827 check_dive_autosp5: |
631 | 2828 ; check SP5 |
623 | 2829 btfsc FLAG_SP5_used ; SP 5 used so far? |
604 | 2830 bra check_dive_autosp6 ; YES - done |
623 | 2831 movff opt_setpoint_change+4,lo ; NO - get depth in m |
604 | 2832 tstfsz lo ; - SP change depth = 0 ? |
2833 bra check_dive_autosp5a ; NO - continue | |
2834 bra check_dive_autosp6 ; YES - done | |
560 | 2835 check_dive_autosp5a: |
604 | 2836 decf lo,W ; SP change depth -1 -> WREG |
623 | 2837 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2838 bra check_dive_autosp6 ; NO - done |
582 | 2839 ; auto switch to SP5 |
623 | 2840 movff opt_setpoint_cbar+4,char_I_const_ppO2 ; YES - use SP |
604 | 2841 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2842 bsf FLAG_SP5_used ; - set SP 5 used flag |
634 | 2843 |
352
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
339
diff
changeset
|
2844 check_dive_autosp6: |
634 | 2845 return ; done |
2846 | |
2847 | |
2848 ;----------------------------------------------------------------------------- | |
2849 ; Helper Function - transmit new Setpoint to external Electronics and flag Change | |
2850 ; | |
352
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
339
diff
changeset
|
2851 xmit_sp_set_flag: |
623 | 2852 IFDEF _external_sensor |
604 | 2853 call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics |
623 | 2854 ENDIF |
2855 bsf event_occured ; set global event flag | |
2856 bsf event_SP_change ; set setpoint event flag | |
582 | 2857 return |
2858 | |
623 | 2859 ENDIF ; _ccr_pscr |
2860 | |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2861 |
0 | 2862 ;============================================================================= |
634 | 2863 dmode2 CODE |
2864 ;============================================================================= | |
2865 | |
2866 | |
2867 ;----------------------------------------------------------------------------- | |
2868 ; Setup everything to enter OC Dive Mode | |
0 | 2869 ; |
604 | 2870 global dive_boot_oc |
0 | 2871 dive_boot_oc: |
631 | 2872 rcall get_first_gas_to_WREG ; get first gas (1-5) into WREG |
2873 rcall setup_gas_registers ; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5) | |
2874 rcall deco_setup_oc_gases ; set-up of gas list for deco calculations (with WREG = gas 1-5) | |
634 | 2875 return ; done |
2876 | |
2877 | |
2878 ;----------------------------------------------------------------------------- | |
2879 ; Helper Function - get first Gas (1-5) into WREG | |
2880 ; | |
2881 global get_first_gas_to_WREG | |
2882 get_first_gas_to_WREG: | |
2883 lfsr FSR1,opt_gas_type ; load base address of the gas types | |
2884 clrf lo ; start with gas 0 | |
2885 get_first_gas_to_WREG2: | |
2886 movf lo,W ; set index | |
2887 movf PLUSW1,W ; get type of gas (0=Disabled, 1=First, 2=Travel, 3=Deco) | |
2888 sublw .1 ; is it of type First? | |
2889 bz get_first_gas_to_WREG3 ; YES - found the First gas | |
2890 incf lo,F ; NO - increment index | |
2891 movlw NUM_GAS+1 ; - get highest index+1 | |
2892 cpfseq lo ; - all gases checked? | |
2893 bra get_first_gas_to_WREG2 ; NO - not yet | |
2894 movlw .1 ; YES - default to gas 1 | |
2895 movff WREG,opt_gas_type+0 ; - force it to be of type First | |
2896 return ; - done | |
2897 get_first_gas_to_WREG3: | |
2898 movf lo,W ; copy index of gas found to be the First to WREG | |
2899 incf WREG,W ; turn index into gas number (0-4 -> 1-5) | |
2900 return ; done | |
2901 | |
2902 | |
2903 ;----------------------------------------------------------------------------- | |
2904 ; Helper Function - load currently breathed Gas into Deco Engine | |
2905 ; | |
2906 global setup_gas_registers | |
2907 setup_gas_registers: | |
2908 movwf active_gas ; set as current gas | |
2909 movlw .6 ; gas = gas6 ? | |
2910 cpfseq active_gas ; ... | |
2911 bra setup_gas_registers_15 ; NO - load gas 1-5 | |
2912 | |
2913 ; load gas 6 | |
2914 movff opt_gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine | |
2915 IFDEF _helium | |
2916 movff opt_gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine | |
2917 ENDIF | |
2918 movlw .3 ; declare gas6 as a deco gas | |
2919 movff WREG,char_I_current_gas_type ; copy gas type to deco engine | |
2920 movff depth_meter,char_I_gas6_depth ;set current depth as change depth | |
2921 bra setup_gas_registers_com ; continue with common part | |
2922 | |
2923 setup_gas_registers_15: | |
2924 lfsr FSR1,opt_gas_O2_ratio ; load base address of gas data | |
2925 decf active_gas,W ; set index to O2 ratio of current gas (1-5 -> 0-4) | |
2926 movff PLUSW1,char_I_O2_ratio ; copy O2 ratio to deco engine | |
2927 addlw .10 ; advance index from O2 ratio to He ratio | |
2928 IFDEF _helium | |
2929 movff PLUSW1,char_I_He_ratio ; copy He ratio to deco engine | |
2930 ENDIF | |
2931 addlw .10 ; advance index from He ratio to gas type | |
2932 movff PLUSW1,char_I_current_gas_type ; copy gas type (0=Disabled, 1=First, 2=Travel, 3=Deco) | |
2933 setup_gas_registers_com: | |
2934 movff char_O_main_status,lo ; working copy of char_O_main_status in bank common | |
2935 bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (if applicable) | |
2936 bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag | |
2937 movff lo,char_O_main_status ; bank safe write-back of char_O_main_status | |
2938 movf active_gas,W ; reload WREG with gas 1-5 or 6 (important!) | |
2939 return ; done | |
2940 | |
2941 | |
2942 ;----------------------------------------------------------------------------- | |
2943 ; Helper Function - load OC Gases into Deco Engine (currently breathed gas in WREG) | |
2944 ; | |
2945 global deco_setup_oc_gases | |
2946 deco_setup_oc_gases: | |
2947 movff char_O_deco_status,lo ; get working copy of char_O_deco_status in bank common | |
2948 deco_setup_oc_gases_pre: ; entry point with lo preloaded | |
2949 movff WREG,char_I_current_gas_num ; set gas to start with when doing the deco calculations | |
2950 ; | |
2951 ; Memory Map: | |
2952 ; --------------------------------------------------------------------------------- | |
2953 ; opt_gas_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS | |
2954 ; opt_dil_O2_ratio res NUM_GAS | | |
2955 ; opt_gas_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS | |
2956 ; opt_dil_He_ratio res NUM_GAS | | |
2957 ; opt_gas_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS | |
2958 ; opt_dil_type res NUM_GAS | | |
2959 ; opt_gas_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS | |
2960 ; opt_dil_change res NUM_GAS | | |
2961 ; | |
2962 lfsr FSR2,char_I_deco_O2_ratio ; load FSR2 with base address of char_I_deco_O2_ratio | |
2963 ; FSR2 will step through all char_I_deco_... vars | |
2964 lfsr FSR1,opt_gas_O2_ratio ; load FSR1 with base address of opt_gas_O2_ratio | |
2965 rcall deco_setup_copy ; copy all OC O2 ratios | |
2966 lfsr FSR1,opt_gas_He_ratio ; load FSR1 with base address of opt_gas_He_ratio | |
2967 rcall deco_setup_copy ; copy all OC He ratios | |
2968 lfsr FSR1,opt_gas_type ; load FSR1 with base address of opt_gas_type | |
2969 rcall deco_setup_copy ; copy all gas types | |
2970 lfsr FSR1,opt_gas_change ; load FSR1 with base address of opt_gas_change | |
2971 rcall deco_setup_copy ; copy all gas change depths | |
2972 | |
2973 ; switch deco engine to oc mode | |
2974 bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) | |
2975 bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag | |
2976 movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status | |
2977 return ; done | |
2978 | |
2979 | |
2980 ;----------------------------------------------------------------------------- | |
2981 ; Helper Function - dedicated Memory Copy | |
2982 deco_setup_copy: | |
2983 movlw NUM_GAS ; load loop counter with number of gases (5) | |
2984 deco_setup_copy_loop: | |
2985 movff POSTINC1,POSTINC2 ; copy from (FSR1) to (FSR2) | |
2986 decfsz WREG ; decrement loop counter and check if it became 0 | |
2987 bra deco_setup_copy_loop ; NO - not yet, loop | |
2988 return ; YES - done | |
2989 | |
0 | 2990 |
623 | 2991 |
2992 IFDEF _ccr_pscr | |
2993 | |
634 | 2994 ;----------------------------------------------------------------------------- |
2995 ; Setup everything to enter CCR/pSCR Dive Mode - Part 1 | |
2996 ; | |
604 | 2997 global dive_boot_cc |
0 | 2998 dive_boot_cc: |
631 | 2999 rcall get_first_dil_to_WREG ; get first diluent (1-5) into WREG |
3000 rcall setup_dil_registers ; set-up of diluent parameters for currently breathed diluent (with WREG = current diluent 1-5) | |
3001 rcall deco_setup_cc_diluents ; set-up of diluent list for deco calculations (with WREG = current diluent 1-5) | |
634 | 3002 return ; done |
3003 | |
3004 | |
3005 ;----------------------------------------------------------------------------- | |
3006 ; Helper Function - get first Diluent (1-5) into WREG | |
3007 ; | |
3008 global get_first_dil_to_WREG | |
3009 get_first_dil_to_WREG: ; gets first dil (1-5) into WREG | |
3010 lfsr FSR1,opt_dil_type ; load base address of the dil types | |
3011 clrf lo ; start with dil 0 | |
3012 get_first_dil_to_WREG2: | |
3013 movf lo,W ; set index | |
3014 movf PLUSW1,W ; get type of Dil (0=Disabled, 1=First, 2=Normal) | |
3015 sublw .1 ; is it of type First? | |
3016 bz get_first_dil_to_WREG3 ; YES - found the First dil | |
3017 incf lo,F ; NO - increment index | |
3018 movlw NUM_GAS+1 ; - get highest index+1 | |
3019 cpfseq lo ; - dils checked? | |
3020 bra get_first_dil_to_WREG2 ; NO - not yet | |
3021 movlw .1 ; YES - default to dil 1 | |
3022 movff WREG,opt_dil_type+0 ; - force it to be of type First | |
3023 return ; - done | |
3024 get_first_dil_to_WREG3: | |
3025 movf lo,W ; copy index of dil found to be the First to WREG | |
3026 incf WREG,W ; turn index into dil number (0-4 -> 1-5) | |
3027 return ; done | |
3028 | |
3029 | |
3030 ;----------------------------------------------------------------------------- | |
3031 ; Helper Function - load currently breathed Diluent into Deco Engine | |
3032 ; | |
3033 global setup_dil_registers | |
3034 setup_dil_registers: | |
3035 btfsc bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- | |
3036 bra setup_gas_registers ; revert to setting up OC gases in bailout condition | This branch should never happen to be taken... | |
3037 movwf active_dil ; set as current diluent | |
3038 movlw .6 ; diluent = gas6 ? | |
3039 cpfseq active_dil ; ... | |
3040 bra setup_dil_registers_15 ; NO - load diluent 1-5 | |
3041 | |
3042 ; load gas 6 | |
3043 movff opt_gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine | |
3044 IFDEF _helium | |
3045 movff opt_gas6_He_ratio,char_I_He_ratio ; copy gas6 He ratio to deco engine | |
3046 ENDIF | |
3047 movlw .2 ; declare gas6 as a normal diluent | |
3048 movff WREG,char_I_current_gas_type ; copy gas type to deco engine | |
3049 movff depth_meter,char_I_gas6_depth ;set current depth as change depth | |
3050 bra setup_dil_registers_com ; continue with common part | |
3051 | |
3052 setup_dil_registers_15: | |
3053 lfsr FSR1,opt_dil_O2_ratio ; load base address of diluent data | |
3054 decf active_dil,W ; set index to O2 ratio of current diluent (1-5 -> 0-4) | |
3055 movff PLUSW1,char_I_O2_ratio ; copy O2 ratio to deco engine | |
3056 addlw .10 ; advance index from O2 ratio to He ratio | |
3057 IFDEF _helium | |
3058 movff PLUSW1,char_I_He_ratio ; copy He ratio to deco engine | |
3059 ENDIF | |
3060 addlw .10 ; advance index from He ratio to diluent type | |
3061 movff PLUSW1,char_I_current_gas_type ; copy diluent type (0=Disabled, 1=First, 2=Normal) | |
3062 setup_dil_registers_com: | |
3063 movff char_O_main_status,lo ; working copy of char_O_main_status in bank common | |
3064 bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode | |
3065 bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default | |
3066 btfsc FLAG_pscr_mode ; check if we are in pSCR mode | |
3067 bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode | |
3068 movff lo,char_O_main_status ; bank safe write-back of char_O_main_status | |
3069 movf active_dil,W ; reload WREG with diluent 1-5 or 6 (important!) | |
3070 return ; done | |
3071 | |
3072 | |
3073 ;----------------------------------------------------------------------------- | |
3074 ; Helper Function - load Diluents into Deco Engine (currently breathed dil in WREG) | |
3075 ; | |
3076 global deco_setup_cc_diluents | |
3077 deco_setup_cc_diluents: | |
3078 movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common | |
3079 deco_setup_cc_diluents_pre: ; entry point with lo preloaded | |
3080 btfsc bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- | |
3081 bra deco_setup_oc_gases_pre ; YES - revert to setting up OC gases | This branch should never happen to be taken... | |
3082 movff WREG,char_I_current_gas_num ; NO - set diluent to start with when doing the deco calculations | |
3083 ; | |
3084 ; Memory Map: | |
3085 ; --------------------------------------------------------------------------------- | |
3086 ; opt_gas_O2_ratio res NUM_GAS | | |
3087 ; opt_dil_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS | |
3088 ; opt_gas_He_ratio res NUM_GAS | | |
3089 ; opt_dil_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS | |
3090 ; opt_gas_type res NUM_GAS | | |
3091 ; opt_dil_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS | |
3092 ; opt_gas_change res NUM_GAS | | |
3093 ; opt_dil_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS | |
3094 ; | |
3095 lfsr FSR2,char_I_deco_O2_ratio ; load FSR2 with base address of char_I_deco_O2_ratio. | |
3096 ; FSR2 will step through all char_I_deco_... vars. | |
3097 lfsr FSR1,opt_dil_O2_ratio ; load FSR1 with base address of opt_dil_O2_ratio | |
3098 rcall deco_setup_copy ; copy all dil O2 ratios | |
3099 lfsr FSR1,opt_dil_He_ratio ; load FSR1 with base address of opt_dil_He_ratio | |
3100 rcall deco_setup_copy ; copy all dil He ratios | |
3101 lfsr FSR1,opt_dil_type ; load FSR1 with base address of opt_dil_type | |
3102 rcall deco_setup_copy ; copy all dil types | |
3103 lfsr FSR1,opt_dil_change ; load FSR1 with base address of opt_dil_change | |
3104 rcall deco_setup_copy ; copy all dil change depths | |
3105 ; switch to CCR / pSCR mode: | |
3106 bsf lo,DECO_MODE_LOOP_FLAG ; - loop flag is set in both, CCR and pSCR mode | |
3107 bcf lo,DECO_MODE_PSCR_FLAG ; - clear pSCR mode flag by default | |
3108 btfsc FLAG_pscr_mode ; - check if we are in pSCR mode | |
3109 bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode | |
3110 movff lo,char_O_deco_status ; - bank safe write-back of char_O_deco_status | |
3111 return ; done | |
3112 | |
3113 | |
3114 ;----------------------------------------------------------------------------- | |
3115 ; Setup everything to enter CCR / pSCR Dive Mode - Part 2 | |
3116 ; | |
604 | 3117 dive_boot_cc_part2: |
560 | 3118 ; revoke sensors from usage if they do not have a valid calibration |
3119 bsf use_O2_sensor1 | |
3120 btfss sensor1_calibrated_ok | |
3121 bcf use_O2_sensor1 | |
634 | 3122 |
3123 bsf use_O2_sensor2 | |
560 | 3124 btfss sensor2_calibrated_ok |
3125 bcf use_O2_sensor2 | |
634 | 3126 |
3127 bsf use_O2_sensor3 | |
560 | 3128 btfss sensor3_calibrated_ok |
3129 bcf use_O2_sensor3 | |
623 | 3130 |
3131 IFDEF _external_sensor | |
604 | 3132 ; check for external HUD/ppO2 Monitor |
634 | 3133 btfss ext_input_optical ; do we have an optical input? |
604 | 3134 bra dive_boot_cc_part2_1 ; NO |
634 | 3135 btfsc sensor1_active ; YES - process flags from HUD/ppO2 Monitor |
623 | 3136 bsf use_O2_sensor1 ; - ... |
3137 btfsc sensor2_active ; - ... | |
3138 bsf use_O2_sensor2 ; - ... | |
3139 btfsc sensor3_active ; - ... | |
3140 bsf use_O2_sensor3 ; - ... | |
3141 ENDIF | |
3142 | |
604 | 3143 dive_boot_cc_part2_1: |
560 | 3144 ; In pSCR mode, only settings 0 (calculated ppO2) and 1 (ppO2 from sensors) are defined. |
604 | 3145 ; In case we still have 3 (auto SP) selected out of previous CCR mode, we reset to 0. |
634 | 3146 btfss FLAG_pscr_mode ; in pSCR mode? |
3147 bra dive_boot_cc_part2_2 ; NO | |
640 | 3148 movf dive_ccr_mode,W ; YES - get mode (=0: Fixed SP (CCR) / calculated SP (pSCR), =1: Sensor, =2: Auto SP) |
3149 sublw .2 ; dive_ccr_mode = 1 (Auto SP)? | |
634 | 3150 bnz dive_boot_cc_part2_2 ; NO - ok |
640 | 3151 clrf dive_ccr_mode ; YES - revert to calculated SP |
634 | 3152 |
604 | 3153 dive_boot_cc_part2_2: |
623 | 3154 bsf event_SP_change ; set setpoint event flag |
3155 | |
560 | 3156 ; Start with SP1 (CCR) or 0 (pSCR) as default. |
3157 ; If in sensor mode, this value will be overwritten by calc_deko_divemode_sensor | |
623 | 3158 clrf WREG ; pre-load WREG with setpoint value 0 for pSCR calculated |
3159 btfsc FLAG_ccr_mode ; in CCR mode? | |
3160 movff opt_setpoint_cbar+0,WREG ; YES - get value of setpoint 1 into WREG | |
582 | 3161 movff WREG,char_I_const_ppO2 ; write setpoint to deco engine |
634 | 3162 |
623 | 3163 IFDEF _external_sensor |
582 | 3164 call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics |
634 | 3165 goto calc_deko_divemode_sensor ; process sensor readings and return |
623 | 3166 ELSE |
3167 return ; done | |
3168 ENDIF | |
3169 | |
3170 ENDIF ; _ccr_pscr | |
3171 | |
634 | 3172 |
623 | 3173 ;============================================================================= |
634 | 3174 dmode3 CODE |
3175 ;============================================================================= | |
3176 | |
3177 | |
3178 ;----------------------------------------------------------------------------- | |
3179 ; Initialize Dive Mode | |
3180 ; | |
0 | 3181 diveloop_boot: |
604 | 3182 ; do the basic initialization |
634 | 3183 call restart_set_modes_and_flags ; basic settings depending on deco mode |
3184 | |
3185 ; save on energy | |
3186 call I2C_sleep_compass ; stop accelerometer and compass | |
604 | 3187 |
623 | 3188 ; do an early initialization of all deco engine output variables to |
3189 ; avoid glitches in the display outputs during deco engine start-up | |
3190 call deco_init_output_vars; ; (C-code) | |
3191 banksel common ; back to bank common | |
3192 | |
634 | 3193 ; configure screen layout |
3194 TSTOSC opt_layout ; alternative layout enabled? | |
3195 bsf alt_layout_active ; YES - start with alternative layout | |
3196 | |
3197 ; configure tissue graphics | |
635
9a64914a8fca
3.10 re-release addressing some minor issues and language fixes
heinrichsweikamp
parents:
634
diff
changeset
|
3198 TSTOSC opt_tissue_graphics ; shall show: 0= pres+sat, 1= N2+He |
634 | 3199 bsf tissue_graphic_layout ; YES - show press+sat |
3200 TSTOSC char_I_model ; GF factors enabled? | |
3201 bsf tissue_graphic_gf ; YES - show GF lines | |
3202 | |
623 | 3203 ; reset max relative pressure (max depth) |
3204 bsf reset_max_pressure ; request ISR to reset the max pressure | |
3205 | |
640 | 3206 ; make working copy of opt_ccr_mode |
3207 movff opt_ccr_mode,dive_ccr_mode ; copy option setting | |
3208 | |
3209 | |
623 | 3210 IFDEF _min_depth_option |
3211 ; reset the resettable min/max relative pressure (trip-wise min/max depth) | |
3212 bsf reset_trip_pressure ; request ISR to reset the resettable min/max pressure | |
3213 ENDIF | |
3214 | |
604 | 3215 IFDEF _cave_mode |
623 | 3216 ; initialize the cave mode |
631 | 3217 bcf cave_mode ; disable cave mode by default |
3218 TSTOSC opt_cave_mode ; cave mode switched on? | |
3219 bsf cave_mode ; YES - enable cave mode | |
3220 | |
3221 bcf dive_turned ; dive is not turned yet | |
3222 bcf backtrack_almost_full ; backtracking storage is not almost full yet | |
3223 bcf backtrack_entire_full ; backtracking storage is not entirely full yet | |
3224 bsf waypoint_reached_first ; current waypoint is the first recorded waypoint | |
3225 bsf waypoint_reached_last ; current waypoint is the last recorded waypoint | |
3226 | |
3227 clrf backtrack_waypoint_num ; initialize the waypoint number | |
3228 clrf backtrack_waypoint_turn ; no turn point yet | |
3229 | |
3230 movlw .0 ; initialize backtracking index to first position in storage | |
3231 movff WREG,char_I_backtrack_index ; ... | |
3232 | |
3233 clrf depth_meter ; store initial depth data set with depth = surface | |
3234 call write_backtrack_1min_depth ; ... | |
3235 ENDIF ; _cave_mode | |
3236 | |
3237 ; base configuration of the deco engine | |
623 | 3238 clrf hi ; start with everything disabled |
631 | 3239 TSTOSC opt_ext_stops ; shall make extended stops? |
623 | 3240 bsf hi,DECO_EXTENDED_STOPS ; YES - enable extended stops |
604 | 3241 IFDEF _rx_functions |
623 | 3242 btfsc tr_functions_activated ; TR functions activated? |
3243 bsf hi,DECO_TR_FUNCTIONS ; YES - enable TR functions | |
604 | 3244 ENDIF |
631 | 3245 IFDEF _gas_contingency |
3246 ; set contingency mode on/off | |
3247 TSTOSC opt_gas_contingency_dive ; gas contingency for dive mode switched on? | |
3248 bsf hi,DECO_GAS_CONTINGENCY ; YES - activate gas contingency mode | |
3249 ENDIF ; _gas_contingency | |
604 | 3250 movff hi,char_O_main_status ; bank-safe copy to deco engine |
3251 | |
631 | 3252 clrf lo ; start with everything disabled |
3253 bsf lo,DECO_START_NORM ; set flag for doing a normal plan | |
3254 bsf lo,DECO_INITIALIZE ; set flag for initializing the deco engine | |
604 | 3255 movff lo,char_O_deco_status ; bank-safe copy back to deco engine |
0 | 3256 |
623 | 3257 ; disable "fast forward" function |
634 | 3258 movlw .0 ; set fast forward to zero |
3259 movff WREG,char_I_sim_advance_time; ... | |
623 | 3260 |
3261 ; write last stop depth to deco engine | |
631 | 3262 movff opt_last_stop,char_I_last_stop_depth |
623 | 3263 |
3264 ; initialize max depth for apnoe mode | |
634 | 3265 CLRI apnoe_max_pressure ; reset to zero |
623 | 3266 |
3267 ; reset minimum temperature, ISR-safe 2 byte copy | |
3268 SMOVII temperature_cur,temperature_min | |
3269 | |
3270 ; ISR-safe copy of start-of-dive date and time for logbook (6 bytes in total) | |
3271 SMOVSS rtc_year,start_year | |
3272 | |
3273 MOVII int_O_CNS_current,CNS_start ; save current CNS at beginning of dive, but | |
3274 bcf CNS_start+1,int_warning_flag ; without warning flag | |
3275 bcf CNS_start+1,int_attention_flag ; without attention flag | |
3276 | |
3277 ; save supersaturation at beginning of dive (only lower byte is used for value) | |
3278 movff int_O_lead_supersat+0,supersat_start | |
3279 | |
631 | 3280 clrf menu_pos_cur ; reset current menu position |
3281 clrf active_premenu ; no pre-menu task active | |
623 | 3282 |
3283 clrf safety_stop_countdown ; clear safety stop count-down | |
3284 | |
3285 CLRI last_pressure_velocity ; initialize last pressure for velocity calculation | |
3286 CLRI dive_timeout_timer ; initialize timeout counter | |
3287 | |
3288 movlw .1 ; initialize the sampling timer such that the 1st sampling ... | |
3289 movwf sampling_timer ; ... trigger will be given as soon as possible | |
3290 | |
3291 clrf message_page ; initialize message page counter | |
3292 clrf alarm_type ; clear all alarms | |
3293 | |
3294 ; clear the total dive average depth | |
3295 CLRI pressure_rel_avg_total ; average depth | |
3296 CLRI divesecs_avg_total ; time accumulator | |
3297 clrf pressure_rel_accu_total+0 ; depth accumulator | |
631 | 3298 clrf pressure_rel_accu_total+1 ; ... |
3299 clrf pressure_rel_accu_total+2 ; ... | |
3300 clrf pressure_rel_accu_total+3 ; ... | |
604 | 3301 |
3302 IFDEF _rx_functions | |
623 | 3303 |
3304 btfss tr_functions_activated ; TR functions activated? | |
604 | 3305 bra diveloop_boot_0 ; NO - skip TR function initialization |
623 | 3306 |
604 | 3307 banksel int_IO_pressure_value |
634 | 3308 |
3309 clrf WREG ; set WREG to coding for integer numbers -> data not available | |
3310 bsf WREG,int_not_avail_flag ; ... | |
623 | 3311 clrf int_IO_pressure_value+0 ; clear low byte of 1st pressure reading value |
3312 movwf int_IO_pressure_value+1 ; copy to high byte of 1st pressure reading value | |
3313 clrf int_IO_pressure_value+2 ; clear low byte of 2nd pressure reading value | |
3314 movwf int_IO_pressure_value+3 ; copy to high byte of 2nd pressure reading value | |
3315 clrf int_I_pressure_drop+0 ; clear low byte of 1st pressure drop value | |
3316 movwf int_I_pressure_drop+1 ; copy to high byte of 1st pressure drop value | |
3317 clrf int_I_pressure_drop+2 ; clear low byte of 2nd pressure drop value | |
3318 movwf int_I_pressure_drop+3 ; copy to high byte of 1st pressure drop value | |
604 | 3319 clrf char_I_pressure_gas+0 ; clear gas selection of 1st pressure reading |
3320 clrf char_I_pressure_gas+1 ; clear gas selection of 2nd pressure reading | |
3321 clrf char_I_pressure_age+0 ; clear age of 1st pressure reading | |
3322 clrf char_I_pressure_age+1 ; clear age of 2nd pressure reading | |
3323 clrf char_I_pressure_stat+0 ; clear status of 1st pressure reading | |
3324 clrf char_I_pressure_stat+1 ; clear status of 2nd pressure reading | |
623 | 3325 |
604 | 3326 banksel gas__last_1st ; select bank with vars for pressure drop calculation |
3327 setf gas__last_1st ; invalidate last gas of 1st reading | |
623 | 3328 setf gas__last_2nd ; invalidate last gas of 2nd reading |
3329 | |
604 | 3330 banksel common ; back to bank common |
623 | 3331 |
3332 ENDIF ; _rx_functions | |
3333 | |
604 | 3334 |
3335 diveloop_boot_0: | |
3336 setf best_gas_number ; initialize best gas as not computed yet (255) | |
623 | 3337 IFDEF _ccr_pscr |
604 | 3338 setf best_dil_number ; initialize best diluent as not computed yet (255) |
623 | 3339 ENDIF |
604 | 3340 |
3341 btfsc FLAG_oc_mode ; in OC mode? | |
634 | 3342 call dive_boot_oc ; YES - add OC mode settings |
604 | 3343 |
623 | 3344 IFDEF _ccr_pscr |
604 | 3345 btfsc FLAG_ccr_mode ; in CCR mode? |
634 | 3346 call dive_boot_cc ; YES - add CC mode settings |
604 | 3347 btfsc FLAG_ccr_mode ; in CCR mode? |
634 | 3348 call dive_boot_cc_part2 ; YES - add CC sensor and SP settings |
604 | 3349 |
3350 btfsc FLAG_pscr_mode ; in pSCR mode? | |
634 | 3351 call dive_boot_cc ; YES - add CC mode settings |
604 | 3352 btfsc FLAG_pscr_mode ; in pSCR mode? |
634 | 3353 call dive_boot_cc_part2 ; YES - add CC sensor and SP settings |
623 | 3354 ENDIF |
604 | 3355 |
631 | 3356 bcf bailout_mode ; not in bailout mode |
3357 | |
604 | 3358 call ghostwriter_short_header ; write short header with dive number into profile memory |
623 | 3359 call init_recording_params ; set up all the divisors for dive data recording |
3360 | |
3361 ; setup gas selector flag (required to have better gas working) | |
3362 bsf is_diluent_menu ; default to using diluents | |
3363 btfsc FLAG_ccr_mode ; in CCR mode? | |
3364 bra diveloop_boot_3 ; YES - default was right | |
3365 btfsc FLAG_pscr_mode ; in pSCR mode? | |
3366 bra diveloop_boot_3 ; YES - default was right | |
3367 bcf is_diluent_menu ; NO to both - revert to using OC gases | |
604 | 3368 |
3369 diveloop_boot_3: | |
582 | 3370 bcf LEDg ; switch off green LED / release reset to RX circuitry |
604 | 3371 bcf LEDr ; switch off red LED |
623 | 3372 |
3373 btfss sensor_override_active ; in simulator mode? | |
604 | 3374 call disable_rs232 ; NO - disable RS232 |
3375 | |
3376 IFDEF _screendump | |
623 | 3377 btfsc screen_dump_avail ; screen dump function enabled? |
3378 call enable_rs232 ; enable interface (also sets CPU speed to normal) | |
604 | 3379 ENDIF |
3380 | |
623 | 3381 clrf apnoe_surface_mins ; clear apnoe surface time, minutes (8 bit) |
3382 clrf apnoe_surface_secs ; clear apnoe surface time, seconds (8 bit) | |
3383 clrf apnoe_dive_mins ; clear apnoe dive time, minutes (8 bit) | |
3384 clrf apnoe_dive_secs ; clear apnoe dive time, seconds (8 bit) | |
654 | 3385 clrf apnoe_dive_counter ; clear apnoe #dive counter (8 bit) |
604 | 3386 |
3387 return ; done with dive mode boot | |
3388 | |
3389 | |
3390 ;============================================================================= | |
634 | 3391 dmode4 CODE |
3392 ;============================================================================= | |
3393 | |
3394 | |
3395 ;----------------------------------------------------------------------------- | |
3396 ; Check all Sorts of Parameters and issue Warnings and Attentions if applicable | |
3397 ; | |
623 | 3398 divemode_check_warnings: |
604 | 3399 movlw .1 ; one message at a time in alternative layout |
623 | 3400 btfss alt_layout_active ; in alternative layout? |
3401 movlw .2 ; NO - two messages at a time in normal layout | |
634 | 3402 cpfsgt message_counter ; had more than 1 / 2 messages in the last round? |
623 | 3403 bra divemode_check_warnings1 ; NO - update messages every second |
3404 | |
3405 ; ; YES - update every 4 seconds: | |
631 | 3406 ; btfss timebase_1sec ; - on second 1 or 3 ? |
623 | 3407 ; return ; NO - no update in this cycle |
3408 ; btfss timebase_2sec ; YES - on second 3 ? | |
3409 ; return ; NO - no update in this cycle | |
3410 ; ;bra divemode_check_warnings1 ; YES - update messages | |
3411 | |
634 | 3412 ; YES - update every 2 seconds |
623 | 3413 btfsc timebase_1sec ; - on even second? |
3414 return ; NO - done | |
3415 ;bra divemode_check_warnings1 ; YES - update messages | |
3416 | |
3417 divemode_check_warnings1: | |
604 | 3418 clrf message_counter ; clear message counter |
3419 | |
3420 ; messages sorted by severity: highest severity warnings first, then attentions, advices and last info | |
3421 | |
3422 ; warnings for all modes | |
634 | 3423 call check_battery ; check battery status |
3424 rcall check_depth_limit ; check current depth | |
3425 call check_divetimeout ; check dive timeout | |
604 | 3426 |
623 | 3427 btfsc FLAG_apnoe_mode ; in apnoe mode? |
634 | 3428 bra divemode_check_warnings2 ; YES - skip deco mode checks |
623 | 3429 |
604 | 3430 btfsc FLAG_gauge_mode ; in gauge mode? |
634 | 3431 bra divemode_check_warnings2 ; YES - skip deco mode checks |
604 | 3432 |
3433 ; warnings applicable only in deco modes | |
631 | 3434 |
3435 IFDEF _cave_mode | |
3436 rcall check_cavemode ; check cave mode status | |
3437 ENDIF | |
3438 | |
634 | 3439 rcall check_display_ftts ; show fTTS time (or cave mode cTTS) |
3440 rcall check_ppO2 ; check ppO2 | |
0 | 3441 |
623 | 3442 IFDEF _external_sensor |
634 | 3443 rcall check_ext_sensors ; check external sensors |
623 | 3444 ENDIF |
582 | 3445 |
604 | 3446 rcall check_outside ; check of ZHL16 model violation |
560 | 3447 |
634 | 3448 IFDEF _ccr_pscr |
623 | 3449 btfsc FLAG_ccr_mode ; in CCR mode? |
3450 rcall check_OC_gas_avail ; YES - check if a breathable OC (bailout) gas is available | |
3451 btfsc FLAG_pscr_mode ; in pSCR mode? | |
3452 rcall check_OC_gas_avail ; YES - check if a breathable OC (bailout) gas is available | |
634 | 3453 ENDIF |
604 | 3454 |
3455 btfsc decostop_active ; in deco mode? | |
634 | 3456 rcall check_saturation ; YES - check tissue saturation |
604 | 3457 |
3458 rcall check_mbubbles ; check for micro bubbles | |
634 | 3459 rcall check_cns_violation_now ; check current CNS value |
3460 rcall check_cns_violation_eod ; check end-of-dive CNS value (needs to be done after check_cns_violation_now) | |
3461 rcall check_gas_needs ; check for gas needs | |
3462 rcall check_gas_change ; check for diluent or gas change advice | |
3463 | |
3464 IFDEF _ccr_pscr | |
3465 btfsc FLAG_ccr_mode ; in CCR mode? | |
3466 rcall check_gas_density ; YES - check gas density | |
3467 btfsc FLAG_pscr_mode ; in pSCR mode? | |
3468 rcall check_gas_density ; YES - check gas density | |
3469 ENDIF | |
604 | 3470 |
623 | 3471 btfsc use_aGF ; using alternative GF factors? |
634 | 3472 rcall remind_agf_in_use ; YES - show reminder |
582 | 3473 |
623 | 3474 divemode_check_warnings2: |
634 | 3475 |
604 | 3476 IFDEF _rx_functions |
623 | 3477 btfss tr_functions_activated ; TR functions activated? |
3478 bra divemode_check_warnings3 ; NO - skip | |
3479 call check_tr_functions ; YES - check transmitter functions | |
3480 call check_tr_messages ; - check SAC attention and switch advice | |
604 | 3481 ENDIF |
3482 | |
623 | 3483 divemode_check_warnings3: |
634 | 3484 |
3485 ; compute if an advice / attention / warning sign shall be shown | |
3486 rcall divemode_check_sign | |
3487 | |
3488 ; increment message page number | |
623 | 3489 incf message_page,F ; increment page number |
3490 bcf STATUS,C ; clear carry bit | |
3491 movf message_page,W ; get page number into WREG | |
3492 btfss alt_layout_active ; in alternative layout? | |
3493 rlcf WREG,W ; NO - each page can take two messages | |
3494 cpfsgt message_counter ; number of actual messages > message capacity ? | |
3495 clrf message_page ; NO - all messages could be shown, restart from first page next time | |
604 | 3496 |
634 | 3497 ; clear both rows of messages if there is nothing to show at all |
623 | 3498 tstfsz message_counter ; any message to show? |
3499 bra divemode_check_warnings4 ; YES - look if second row needs to be cleared | |
3500 bsf FLAG_TFT_message_clear_both ; NO - request clearing of left-over messages | |
3501 return ; - done | |
3502 | |
3503 divemode_check_warnings4: | |
634 | 3504 ; clear 2nd row of messages if there is nothing to show (on this page) |
623 | 3505 btfss message_2nd_row_used ; does the 2nd row contain a message? |
3506 bsf FLAG_TFT_message_clear_2nd ; NO - set flag to clear the 2nd row | |
3507 return ; done | |
3508 | |
634 | 3509 |
623 | 3510 ;----------------------------------------------------------------------------- |
634 | 3511 ; Helper Function - check if an Advice / Attention / Warning Sign shall be shown |
3512 ; | |
3513 divemode_check_sign: | |
3514 ; clear sign flags | |
3515 bcf sign_advice ; clear flag for showing advice sign | |
3516 bcf sign_attention ; clear flag for showing attention sign | |
3517 bcf sign_warning ; clear flag for showing warning sign | |
3518 | |
3519 ; check for new advices | |
3520 movf DM_flags_advc_det,W ; get current advices | |
3521 andwf DM_flags_advc_ack,W ; keep only those acknowledgments that have current advices | |
3522 movwf DM_flags_advc_ack ; store updated acknowledgments | |
3523 xorwf DM_flags_advc_det,W ; find advices that have not been acknowledged yet | |
3524 tstfsz WREG ; any new advice? | |
3525 bsf sign_advice ; YES - set flag for showing advice sign | |
3526 | |
3527 ; check for new attentions (1) | |
3528 movf DM_flags_att1_det,W ; get current attentions | |
3529 andwf DM_flags_att1_ack,W ; keep only those acknowledgments that have current attentions | |
3530 movwf DM_flags_att1_ack ; store updated acknowledgments | |
3531 xorwf DM_flags_att1_det,W ; find attentions that have not been acknowledged yet | |
3532 tstfsz WREG ; any new attention? | |
3533 bsf sign_attention ; YES - set flag for showing attention sign | |
3534 | |
3535 ; check for new attentions (2) | |
3536 movf DM_flags_att2_det,W ; get current attentions | |
3537 andwf DM_flags_att2_ack,W ; keep only those acknowledgments that have current attentions | |
3538 movwf DM_flags_att2_ack ; store updated acknowledgments | |
3539 xorwf DM_flags_att2_det,W ; find attentions that have not been acknowledged yet | |
3540 tstfsz WREG ; any new attention? | |
3541 bsf sign_attention ; YES - set flag for showing attention sign | |
3542 | |
3543 ; check for new attentions (3) | |
3544 movf DM_flags_att3_det,W ; get current attentions | |
3545 andwf DM_flags_att3_ack,W ; keep only those acknowledgments that have current attentions | |
3546 movwf DM_flags_att3_ack ; store updated acknowledgments | |
3547 xorwf DM_flags_att3_det,W ; find attentions that have not been acknowledged yet | |
3548 tstfsz WREG ; any new attention? | |
3549 bsf sign_attention ; YES - set flag for showing attention sign | |
3550 | |
3551 ; check for new warnings (1) | |
3552 movf DM_flags_war1_det,W ; get current warnings | |
3553 andwf DM_flags_war1_ack,W ; keep only those acknowledgments that have current warnings | |
3554 movwf DM_flags_war1_ack ; store updated acknowledgments | |
3555 xorwf DM_flags_war1_det,W ; find warnings that have not been acknowledged yet | |
3556 tstfsz WREG ; any new warning? | |
3557 bsf sign_warning ; YES - set flag for showing warning sign | |
3558 | |
3559 ; check for new warnings (2) | |
3560 movf DM_flags_war2_det,W ; get current warnings | |
3561 andwf DM_flags_war2_ack,W ; keep only those acknowledgments that have current warnings | |
3562 movwf DM_flags_war2_ack ; store updated acknowledgments | |
3563 xorwf DM_flags_war2_det,W ; find warnings that have not been acknowledged yet | |
3564 tstfsz WREG ; any new warning? | |
3565 bsf sign_warning ; YES - set flag for showing warning sign | |
3566 | |
3567 ; show or clear the advice / attention / warning sign | |
3568 btfsc sign_advice ; shall show advice sign? | |
3569 bsf FLAG_TFT_sign_show ; YES - show sign | |
3570 btfsc sign_attention ; shall show attention sign? | |
3571 bsf FLAG_TFT_sign_show ; YES - show sign | |
3572 btfsc sign_warning ; shall show warning sign? | |
3573 bsf FLAG_TFT_sign_show ; YES - show sign | |
3574 btfss FLAG_TFT_sign_show ; shall show any sign? | |
3575 bsf FLAG_TFT_sign_clear ; NO - then clear the sign | |
3576 | |
3577 return ; done | |
3578 | |
3579 | |
3580 ;----------------------------------------------------------------------------- | |
3581 ; Check Battery Power | |
3582 ; | |
3583 global check_battery | |
3584 check_battery: | |
3585 bcf warn_det_batt_low ; clear warning for battery low | |
623 | 3586 movlw battery_show_level+1 ; get threshold for showing battery level, incremented by 1 |
628 | 3587 cpfslt batt_percent ; battery percentage ok? |
634 | 3588 return ; YES - done |
3589 btfsc battery_low_condition ; NO - battery low condition detected? | |
3590 bsf warn_det_batt_low ; YES - set warning for battery low | |
3591 movf active_customview,W ; - get current custom view | |
3592 xorlw index_clock_batt_surfpress ; - battery shown in custom view? | |
3593 bnz check_battery_mesg ; NO - show message | |
3594 return ; YES - do not show twice, done | |
3595 | |
3596 check_battery_mesg: | |
3597 incf message_counter,F ; increase message counter | |
3598 goto TFT_message_battery_percent ; show message for battery low (battery percent) and return | |
3599 | |
3600 | |
3601 ;----------------------------------------------------------------------------- | |
3602 ; Show Dive Timeout Counter if Dive Time is not counted | |
3603 ; | |
55 | 3604 check_divetimeout: |
623 | 3605 btfsc count_divetime ; is dive time counted? |
634 | 3606 return ; YES - nothing to do, done |
3607 incf message_counter,F ; NO - increase message counter | |
3608 goto TFT_message_divetimeout ; - show timeout counter and return | |
3609 | |
3610 | |
3611 ;----------------------------------------------------------------------------- | |
3612 ; Check ppO2 of all Gases / Diluents in use | |
3613 ; | |
560 | 3614 check_ppO2: |
623 | 3615 IFDEF _ccr_pscr |
634 | 3616 ; check if breathing from the loop |
3617 btfsc FLAG_oc_mode ; in OC mode? | |
604 | 3618 bra check_ppO2_1 ; YES - continue with breathed gas |
623 | 3619 btfsc bailout_mode ; NO - in bailout? |
604 | 3620 bra check_ppO2_1 ; YES - continue with breathed gas |
634 | 3621 ; CCR / pSCR mode - check the pure diluent |
3622 bcf warn_det_ppO2_diluent ; clear warning for pure diluent ppO2 | |
3623 bcf attn_det_ppo2_diluent ; clear attention for pure diluent ppO2 | |
623 | 3624 MOVII int_O_pure_ppO2,mpr ; get value and attention/warning flags for the pure diluent |
634 | 3625 btfsc hi,int_warning_flag ; ppO2 of the pure diluent in warning state? |
3626 bra check_ppO2_dil_warn ; YES - show warning | |
604 | 3627 btfsc hi,int_attention_flag ; ppO2 of the pure diluent in attention state? |
634 | 3628 bra check_ppO2_dil_attn ; YES - show attention |
3629 bra check_ppO2_1 ; continue with checking breathed gas | |
3630 | |
3631 check_ppO2_dil_warn: | |
3632 bsf warn_det_ppO2_diluent ; set warning for pure diluent ppO2 | |
3633 rcall check_ppO2_show_mesg ; show ppO2 message | |
3634 bra check_ppO2_1 ; continue with checking breathed gas | |
3635 | |
3636 check_ppO2_dil_attn: | |
3637 bsf attn_det_ppo2_diluent ; set attention for pure diluent ppO2 | |
3638 rcall check_ppO2_show_mesg ; show ppO2 message | |
3639 ;bra check_ppO2_1 ; continue with checking breathed gas | |
3640 ENDIF ; _ccr_pscr | |
3641 | |
604 | 3642 check_ppO2_1: |
634 | 3643 ; all modes - check breathed gas (OC or loop) |
3644 bcf attn_det_ppo2_breathed ; clear attention for breathed ppO2 | |
3645 bcf warn_det_ppO2_breathed ; clear warning for breathed ppO2 | |
623 | 3646 MOVII int_O_breathed_ppO2,mpr ; get value and attention/warning flags for the breathed gas |
604 | 3647 btfsc hi,int_attention_flag ; breathed ppO2 in attention state (when in loop mode, no attention will be generated)? |
634 | 3648 bra check_ppO2_breath_attn ; YES - set attention flag and show ppO2 |
3649 btfsc hi,int_low_flag ; NO - breathed ppO2 too low? | |
3650 bra check_ppO2_breath_warn_low ; YES - record the warning and show ppO2 | |
3651 btfsc hi,int_high_flag ; NO - breathed ppO2 too high? | |
3652 bra check_ppO2_breath_warn_high ; YES - record the warning and show ppO2 | |
3653 bra check_ppO2_breath_ok ; NO - ppO2 is ok | |
3654 | |
3655 check_ppO2_breath_attn: | |
3656 bsf attn_det_ppo2_breathed ; set attention for breathed ppO2 | |
3657 bra check_ppO2_show ; show ppO2 message | |
3658 | |
3659 check_ppO2_breath_warn_low: | |
582 | 3660 movlw d'4' ; set type of alarm (ppO2 low) |
634 | 3661 bra check_ppO2_breath_common ; continue with common part |
3662 | |
3663 check_ppO2_breath_warn_high: | |
560 | 3664 movlw d'5' ; set type of alarm (ppO2 high) |
634 | 3665 ;bra check_ppO2_breath_common ; continue with common part |
3666 | |
3667 check_ppO2_breath_common: | |
623 | 3668 movwf alarm_type ; copy alarm type to alarm register |
634 | 3669 bsf event_occured ; set event flag |
3670 bsf warn_det_ppO2_breathed ; set warning for breathed ppO2 | |
3671 bra check_ppO2_show ; show ppO2 message | |
3672 | |
3673 check_ppO2_breath_ok: | |
3674 TSTOSS opt_showppo2 ; shall always show ppO2 (0 = no, 1 = yes) | |
3675 return ; NO - done | |
3676 ;bra check_ppO2_show ; YES - show ppO2 message | |
3677 | |
3678 check_ppO2_show: | |
631 | 3679 IFDEF _ccr_pscr |
634 | 3680 btfsc FLAG_oc_mode ; in OC mode? |
3681 bra check_ppO2_show_1 ; YES - show ppO2 message | |
3682 btfsc bailout_mode ; in bailout mode? | |
3683 bra check_ppO2_show_1 ; YES - show ppO2 message | |
604 | 3684 return ; NO - in loop mode, ppO2 is already shown via setpoint display |
634 | 3685 ENDIF |
3686 check_ppO2_show_1: | |
3687 movf active_customview,W ; get current custom view | |
3688 xorlw index_ppo2_ead_end_cns ; ppO2 shown already via custom view? | |
3689 bz check_ppO2_done ; YES - done | |
3690 movf active_customview,W ; get current custom view (again) | |
3691 xorlw index_pscr_info ; ppO2 shown already via custom view? | |
3692 bz check_ppO2_done ; YES - done | |
3693 ;bra check_ppO2_show_mesg ; NO - show ppO2 message | |
3694 | |
3695 check_ppO2_show_mesg: | |
3696 incf message_counter,F ; increase message counter | |
3697 goto TFT_message_ppo2 ; show ppO2 message and return | |
3698 | |
3699 check_ppO2_done: | |
3700 return ; done | |
3701 | |
3702 | |
3703 ;----------------------------------------------------------------------------- | |
3704 ; Show fTTS Message | |
3705 ; | |
604 | 3706 check_display_ftts: |
631 | 3707 IFDEF _ccr_pscr |
3708 btfsc bailout_mode ; in bailout mode? | |
3709 return ; YES - in bailout no fTTS is computed, done | |
3710 ENDIF | |
623 | 3711 btfss count_divetime ; is dive time counted? |
631 | 3712 return ; NO - omit, done |
623 | 3713 movff char_I_extra_time,lo ; YES - get extra time |
3714 tstfsz lo ; - extra time > 0 ? | |
634 | 3715 bra check_display_ftts_mesg ; YES - show fTTS |
631 | 3716 return ; NO - no fTTS computed, done |
634 | 3717 |
3718 check_display_ftts_mesg: | |
631 | 3719 incf message_counter,F ; increase counter |
634 | 3720 goto TFT_message_ftts ; show @+x time |
3721 | |
3722 | |
3723 ;----------------------------------------------------------------------------- | |
3724 ; check current CNS Value | |
3725 ; | |
3726 global check_cns_violation_now | |
3727 check_cns_violation_now: | |
3728 bcf warn_det_cns_current ; clear warning for CNS | |
3729 bcf attn_det_cns_current ; clear attention for CNS | |
623 | 3730 movff int_O_CNS_current+1,WREG ; get current CNS, high byte |
582 | 3731 btfsc WREG,int_warning_flag ; warning flag set? |
634 | 3732 bra check_cns_violation_now_warn; YES - show a warning |
3733 btfsc WREG,int_attention_flag ; attention flag set? | |
3734 bra check_cns_violation_now_attn; YES - show an attention | |
3735 return ; NO - done | |
3736 | |
3737 check_cns_violation_now_warn: | |
3738 bsf warn_det_cns_current ; set warning for CNS | |
3739 bra check_cns_violation_now_mesg; show message | |
3740 | |
3741 check_cns_violation_now_attn: | |
3742 bsf attn_det_cns_current ; set attention for CNS | |
3743 ;bra check_cns_violation_now_mesg; show message | |
3744 | |
3745 check_cns_violation_now_mesg: | |
628 | 3746 IFNDEF _helium |
634 | 3747 movf active_customview,W ; get current custom view |
3748 xorlw index_ppo2_ead_end_cns ; CNS shown? | |
3749 bz check_cns_violation_now_done; YES - done | |
628 | 3750 ENDIF |
634 | 3751 movf active_customview,W ; get current custom view (again) |
3752 xorlw index_CNS ; CNS shown? | |
3753 bz check_cns_violation_now_done; YES - done | |
3754 incf message_counter,F ; NO - increase counter | |
3755 goto TFT_message_cns ; - show message and return | |
3756 | |
3757 check_cns_violation_now_done: | |
3758 return ; done | |
3759 | |
3760 | |
3761 ;----------------------------------------------------------------------------- | |
3762 ; check end-of-Dive CNS Value | |
3763 ; | |
3764 global check_cns_violation_eod | |
3765 check_cns_violation_eod: | |
3766 bcf attn_det_cns_eod ; clear attention for end-of-dive CNS | |
3767 btfsc warn_det_cns_current ; current CNS value in warning state? | |
3768 return ; YES - inhibit end-of-dive CNS checks if current CNS is already in warning | |
3769 ;bra check_cns_violation_eod_norm; NO - check normal plan | |
3770 | |
3771 check_cns_violation_eod_norm: | |
623 | 3772 movff int_O_CNS_norm+1,WREG ; get CNS at end of dive in normal plan, high byte |
560 | 3773 btfsc WREG,int_invalid_flag ; flag for invalid value set? |
634 | 3774 bra check_cns_violation_eod_alt ; YES - continue with checking alternative plan |
582 | 3775 btfsc WREG,int_warning_flag ; NO - flag for warning set? |
634 | 3776 bra check_cns_violation_eod_warn; YES - show message |
3777 ;bra check_cns_violation_eod_alt ; NO - check alternative plan | |
3778 | |
3779 check_cns_violation_eod_alt: | |
623 | 3780 movff int_O_CNS_alt+1,WREG ; get CNS at end of dive in alternative plan, high byte |
560 | 3781 btfsc WREG,int_invalid_flag ; flag for invalid value set? |
634 | 3782 return ; YES - done |
560 | 3783 btfsc WREG,int_warning_flag ; NO - flag for warning set? |
634 | 3784 bra check_cns_violation_eod_warn; YES - show message |
3785 return ; NO - done | |
3786 | |
3787 check_cns_violation_eod_warn: | |
3788 bsf attn_det_cns_eod ; set attention(!) for end-of-dive CNS | |
3789 movf active_customview,W ; get current custom view | |
3790 xorlw index_CNS ; CNS shown? | |
3791 bz check_cns_violation_eod_done; YES - done | |
3792 incf message_counter,F ; NO - increase message counter | |
3793 goto TFT_message_cns_eod ; - show message for end-of-dive CNS and return | |
3794 | |
3795 check_cns_violation_eod_done: | |
3796 return ; done | |
3797 | |
3798 | |
3799 ;----------------------------------------------------------------------------- | |
3800 ; Check current Tissue Supersaturation | |
3801 ; | |
3802 global check_saturation | |
3803 check_saturation: | |
3804 bcf attn_det_saturation ; clear attention for saturation | |
3805 bcf warn_det_saturation ; clear warning for saturation | |
3806 bcf attn_det_ibcd ; clear attention for IBCD | |
3807 movff int_O_lead_supersat+1,WREG ; get upper byte of leading tissue's supersaturation | |
3808 btfss WREG,int_warning_flag ; warning flag set? | |
3809 bra check_saturation_1 ; NO - continue with checking for attention flag | |
3810 movlw d'2' ; YES - set type of alarm | |
3811 movwf alarm_type ; - copy to alarm register | |
3812 bsf event_occured ; - set event flag | |
3813 bsf warn_det_saturation ; - set warning | |
3814 bra check_saturation_mesg ; - show saturation message | |
3815 | |
3816 check_saturation_1: | |
3817 btfss WREG,int_attention_flag ; attention flag set? | |
3818 bra check_saturation_2 ; NO - continue with checking for IBCD | |
3819 bsf attn_det_saturation ; YES - set attention | |
3820 bra check_saturation_mesg ; - show saturation message | |
3821 | |
3822 check_saturation_2: | |
3823 IFDEF _helium | |
3824 TSTOSS opt_enable_IBCD ; IBCD warning activated? | |
3825 bra check_saturation_3 ; NO - continue with checking deco info | |
3826 movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector | |
3827 btfss WREG,IBCD_warning ; - IBCD warning flag set? | |
3828 bra check_saturation_3 ; NO - continue with checking deco info | |
3829 bsf attn_det_ibcd ; YES - set attention | |
3830 bra check_saturation_mesg ; - show saturation message | |
3831 ENDIF | |
3832 | |
3833 check_saturation_3: | |
3834 btfss divemode ; in dive mode? | |
3835 return ; NO - done | |
631 | 3836 IFDEF _ccr_pscr |
634 | 3837 btfsc bailout_mode ; YES - in bailout mode? |
3838 return ; YES - done (deco zone flag is not updated when in bailout mode) | |
631 | 3839 ENDIF |
650 | 3840 TSTOSS opt_warning_level_divemode ; Warning level set to =1 "All" ? |
3841 return ; NO, skip warning/advise then | |
634 | 3842 movff char_O_deco_info,WREG ; NO - get the deco info vector |
3843 btfss WREG,deco_zone ; deco zone flag set? | |
3844 return ; NO - done | |
3845 btfsc use_aGF ; YES - using alternative GF factors? | |
3846 return ; YES - suppress deco zone info | |
3847 btfsc alt_layout_active ; NO - in alternative layout? | |
3848 return ; YES - suppress deco zone info | |
3849 incf message_counter,F ; NO - increase message counter | |
3850 goto TFT_message_deco_info ; - show deco info and return | |
3851 | |
3852 check_saturation_mesg: | |
3853 IFDEF _helium | |
3854 btfss attn_det_ibcd ; IBCD detected? | |
3855 bra check_saturation_mesg_1 ; NO - show saturation message | |
3856 incf message_counter,F ; YES - increase message counter | |
3857 call TFT_message_IBCD ; - show IBCD message | |
3858 ENDIF | |
3859 check_saturation_mesg_1: | |
3860 incf message_counter,F ; increase message counter | |
3861 goto TFT_message_saturation ; show saturation message and return | |
3862 | |
3863 | |
3864 ;----------------------------------------------------------------------------- | |
3865 ; Check Depth Limit | |
3866 ; | |
623 | 3867 check_depth_limit: |
634 | 3868 bcf warn_det_depth_limit ; clear warning by default |
623 | 3869 movff opt_max_depth,WREG ; get depth limit |
3870 cpfsgt depth_meter ; current depth > depth limit? | |
634 | 3871 return ; NO - done |
3872 bsf warn_det_depth_limit ; YES - set warning | |
650 | 3873 TSTOSS opt_warning_level_divemode ; Warning level set to =1 "All" ? |
3874 return ; NO, skip warning/advise then | |
634 | 3875 incf message_counter,F ; - increase message counter |
3876 goto TFT_message_depth_limit ; - show message | |
3877 | |
3878 | |
3879 ;----------------------------------------------------------------------------- | |
650 | 3880 ; Check Bühlmann Model Violation |
634 | 3881 ; |
604 | 3882 check_outside: |
634 | 3883 bcf warn_det_outside ; clear warning |
3884 bcf attn_det_outside ; clear attention | |
604 | 3885 movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings |
634 | 3886 btfss WREG,outside_warning ; currently outside the ZH-L16 model? |
3887 bra check_outside_1 ; NO | |
3888 bsf warn_det_outside ; YES - set warning | |
3889 bra check_outside_mesg ; - show message | |
3890 | |
3891 check_outside_1: | |
3892 btfss WREG,outside_warning_lock ; had been outside of the ZH-L16 model? | |
604 | 3893 return ; NO - done |
634 | 3894 bsf attn_det_outside ; YES - set attention |
3895 ;bra check_outside_mesg ; - show message | |
3896 | |
3897 check_outside_mesg: | |
3898 incf message_counter,F ; increase message counter | |
3899 goto TFT_message_outside ; show message and return | |
3900 | |
3901 | |
3902 ;----------------------------------------------------------------------------- | |
3903 ; Check raised Probability for Micro-Bubbles | |
3904 ; | |
604 | 3905 global check_mbubbles |
3906 check_mbubbles: | |
634 | 3907 bcf warn_det_microbubble ; clear warning |
3908 bcf attn_det_microbubble ; clear attention | |
604 | 3909 movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings |
634 | 3910 btfss WREG,mbubble_warning ; currently in micro bubbling zone? |
3911 bra check_mbubbles_1 ; NO | |
3912 bsf warn_det_microbubble ; YES - set warning | |
3913 bra check_mbubbles_mesg ; - show message | |
3914 | |
650 | 3915 check_mbubbles_1: |
634 | 3916 btfss WREG,mbubble_warning_lock ; had been in micro bubbling zone? |
604 | 3917 return ; NO - done |
634 | 3918 bsf attn_det_microbubble ; YES - set attention |
3919 ;bra check_mbubbles_mesg ; - show message | |
3920 | |
3921 check_mbubbles_mesg: | |
3922 incf message_counter,F ; increase message counter | |
3923 goto TFT_message_mbubbles ; show message and return | |
3924 | |
3925 | |
3926 IFDEF _ccr_pscr | |
3927 ;----------------------------------------------------------------------------- | |
3928 ; Check Gas Density | |
3929 ; | |
3930 check_gas_density: | |
3931 TSTOSS opt_gas_density_check ; shall check gas density? | |
3932 return ; NO - done | |
3933 bcf warn_det_gas_density ; YES - clear attention for gas density by default | |
3934 bcf attn_det_gas_density ; - clear warning for gas density by default | |
3935 movff int_O_gas_density+1,WREG ; - get upper byte of current gas density | |
3936 btfsc WREG,int_warning_flag ; - warning flag set? | |
3937 bra check_gas_density_warn ; YES - generate a warning | |
3938 btfsc WREG,int_attention_flag ; NO - attention flag set? | |
3939 bra check_gas_density_attn ; YES - generate an attention | |
3940 ;bra check_gas_density_ok ; NO - gas density ok | |
3941 | |
3942 check_gas_density_ok: | |
3943 bcf shown_gas_density_attn ; re-arm custom view show-up for warning | |
3944 bcf shown_gas_density_warn ; re-arm custom view show-up for attention | |
3945 return ; done | |
3946 | |
3947 check_gas_density_warn: | |
3948 bsf warn_det_gas_density ; set warning | |
3949 bcf shown_gas_density_attn ; re-arm custom view show-up for attention | |
3950 btfsc shown_gas_density_warn ; has the custom view been shown before on warning level? | |
3951 bra check_gas_density_mesg ; YES - do not show the gas needs custom view again | |
3952 btfsc custom_view_locked ; NO - custom view locked? | |
3953 bra check_gas_density_mesg ; YES - do not show it now | |
3954 bsf shown_gas_density_warn ; NO - set custom view as shown now | |
3955 bra check_gas_density_cv ; - show gas needs custom view | |
3956 | |
3957 check_gas_density_attn: | |
3958 bsf attn_det_gas_density ; set attention | |
3959 bcf shown_gas_density_warn ; re-arm custom view show-up for warning | |
3960 btfsc shown_gas_density_attn ; has the custom view been shown before on attention level? | |
3961 bra check_gas_density_mesg ; YES - do not show the gas needs custom view again | |
3962 btfsc custom_view_locked ; NO - custom view locked? | |
3963 bra check_gas_density_mesg ; YES - do not show it now | |
3964 bsf shown_gas_density_attn ; NO - set custom view as shown now | |
3965 ;bra check_gas_density_cv ; - show gas needs custom view | |
3966 | |
3967 check_gas_density_cv: | |
3968 movlw index_ppo2_ead_end_cns ; get custom view number of gas density | |
3969 call dive_customview_show ; show custom view | |
3970 ;bra check_gas_density_mesg ; show message | |
3971 | |
3972 check_gas_density_mesg: | |
3973 incf message_counter,F ; increase message counter | |
3974 goto TFT_message_gas_density ; show gas density message and return | |
3975 | |
3976 | |
3977 ;----------------------------------------------------------------------------- | |
3978 ; Check if an OC Bailout Gas is available | |
3979 ; | |
3980 check_OC_gas_avail: | |
3981 bcf warn_det_no_bo_gas ; clear warning by default | |
3982 tstfsz best_gas_number ; is a breathable OC (bailout) gas available? | |
3983 return ; YES - a breathable gas is available, done | |
3984 btfsc bailout_mode ; NO - in bailout? | |
3985 return ; YES - suppress warning, done | |
3986 bsf warn_det_no_bo_gas ; NO - set warning for no bailout gas | |
3987 incf message_counter,F ; - increase message counter | |
3988 goto TFT_message_no_BO_gas ; - show message and return | |
3989 | |
3990 ENDIF ; _ccr_pscr | |
631 | 3991 |
604 | 3992 |
3993 IFDEF _cave_mode | |
631 | 3994 |
634 | 3995 ;----------------------------------------------------------------------------- |
3996 ; Check Cave Profile Storage Usage | |
3997 ; | |
604 | 3998 check_cavemode: |
634 | 3999 bcf warn_det_cave_shut_down ; clear warning by default |
4000 bcf attn_det_cave_shut_down ; clear attention by default | |
631 | 4001 btfsc backtrack_entire_full ; is the backtracking storage entirely used up? |
4002 bra check_cavemode_full ; YES - turn dive, switch off cave mode and show warning message | |
4003 btfsc backtrack_almost_full ; NO - backtracking storage almost full? | |
4004 bra check_cavemode_almost_full ; YES - show attention message that cave mode will stop soon | |
634 | 4005 btfss cave_mode ; NO - cave mode switched on? |
4006 return ; NO - do not show info | |
4007 btfsc alt_layout_active ; YES - alternative layout active? | |
4008 return ; YES - suppress info message | |
4009 ;bra check_cavemode_mesg ; NO - show cave mode active info | |
4010 | |
4011 check_cavemode_mesg: | |
4012 incf message_counter,F ; increase message counter | |
4013 goto TFT_message_cave_mode ; show cave mode message | |
631 | 4014 |
4015 check_cavemode_full: | |
4016 btfss backtrack_shutdown ; backtracking shut down already? | |
4017 bsf request_cave_off_turned ; NO - request to switch cave mode off and to set the dive as turned | |
4018 bsf backtrack_shutdown ; remember shut down as been executed (anyhow) | |
634 | 4019 btfss cave_mode ; has the cave mode been switched on again meanwhile? |
4020 bsf warn_det_cave_shut_down ; NO - set warning level | |
631 | 4021 btfsc cave_mode ; has the cave mode been switched on again meanwhile? |
634 | 4022 bsf attn_det_cave_shut_down ; YES - set attention level |
4023 bra check_cavemode_mesg ; show message | |
631 | 4024 |
4025 check_cavemode_almost_full: | |
4026 btfss cave_mode ; cave mode switched on? | |
4027 return ; NO - suppress message | |
634 | 4028 bsf attn_det_cave_shut_down ; YES - set an attention |
4029 bra check_cavemode_mesg ; - show message | |
631 | 4030 |
4031 ENDIF ; _cave_mode | |
4032 | |
604 | 4033 |
634 | 4034 ;----------------------------------------------------------------------------- |
4035 ; Show aGF Reminder | |
4036 ; | |
4037 remind_agf_in_use: | |
4038 incf message_counter,F ; increase message counter | |
4039 goto TFT_message_agf ; show aGF reminder and return | |
4040 | |
4041 | |
4042 ;----------------------------------------------------------------------------- | |
4043 ; Check better Gas / Diluent Advice | |
4044 ; | |
4045 check_gas_change: | |
4046 bcf advc_det_change_gas ; clear advice by default | |
4047 IFDEF _ccr_pscr | |
4048 btfsc better_dil_available ; is a better diluent available? | |
4049 bra check_gas_change_mesg ; YES - show a gas change advice | |
4050 ENDIF | |
4051 btfsc better_gas_available ; is a better gas available? | |
4052 bra check_gas_change_mesg ; YES - show a gas change advice | |
4053 return ; NO - done | |
4054 | |
4055 check_gas_change_mesg: | |
650 | 4056 TSTOSS opt_warning_level_divemode ; Warning level set to =1 "All" ? |
4057 return ; NO, skip warning/advise then | |
634 | 4058 bsf advc_det_change_gas ; set advice |
4059 incf message_counter,F ; increase message counter | |
4060 goto TFT_message_gas_change ; show advice and return | |
4061 | |
604 | 4062 |
4063 IFDEF _rx_functions | |
4064 | |
634 | 4065 ;----------------------------------------------------------------------------- |
4066 ; Check SAC and Swap-Tank Advice | |
4067 ; | |
604 | 4068 check_tr_messages: |
634 | 4069 bcf attn_det_sac_rate ; clear SAC attention by default |
4070 bcf advc_det_switch_tank ; clear switch advice by default | |
623 | 4071 btfss count_divetime ; is the dive time counted, i.e. deeper than dive threshold? |
634 | 4072 return ; NO - suppress check |
623 | 4073 movff int_O_SAC_measured+1,WREG ; YES - bank-safe copy of measured SAC rate |
4074 btfss WREG,int_attention_flag ; - attention flag set? | |
634 | 4075 bra check_tr_messages_chk_swap ; NO - continue with checking for swap advice |
623 | 4076 btfsc WREG,int_not_avail_flag ; SAC rate available? |
634 | 4077 bra check_tr_messages_chk_swap ; NO - continue with checking for swap advice |
4078 bsf attn_det_sac_rate ; YES - set attention for SAC rate | |
4079 movf active_customview,W ; - get current custom view | |
4080 xorlw index_pressures_SAC ; - SAC rate shown? | |
4081 bz check_tr_messages_chk_swap ; YES - do not show twice, continue with swap advice | |
4082 ;bra check_tr_messages_mesg_sac ; NO - show SAC message | |
4083 | |
4084 check_tr_messages_mesg_sac: | |
4085 incf message_counter,F ; increase message counter | |
4086 call TFT_message_sac ; show message for SAC rate | |
4087 ;bra check_tr_messages_chk_swap ; continue with switch advice | |
4088 | |
4089 check_tr_messages_chk_swap: | |
604 | 4090 movff char_O_deco_info,WREG ; bank-safe copy of deco info vector |
4091 btfss WREG,ind_double_switch ; swap tank flag set? | |
634 | 4092 return ; NO - done |
4093 ;bra check_tr_messages_mesg_swap ; YES - show swap message | |
4094 | |
4095 check_tr_messages_mesg_swap: | |
4096 bsf advc_det_switch_tank ; set advice | |
4097 incf message_counter,F ; increase message counter | |
4098 goto TFT_message_switch_tanks ; show message for switching tanks and return | |
4099 | |
4100 | |
4101 ;----------------------------------------------------------------------------- | |
4102 ; Check Transmitter States | |
4103 ; | |
604 | 4104 check_tr_functions: |
634 | 4105 ; check transmitter 1 |
604 | 4106 movff char_I_pressure_stat+0,WREG ; get status of 1st pressure reading |
4107 rcall check_tr_functions_helper1 ; check for transmitter 1 lost | |
4108 rcall check_tr_functions_helper2 ; check for transmitter 1 low battery | |
4109 movff int_IO_pressure_value+1,WREG ; get high byte of 1st pressure reading | |
4110 rcall check_tr_functions_helper3 ; check for transmitter 1 pressure warning | |
4111 rcall check_tr_functions_helper4 ; check for transmitter 1 pressure attention | |
634 | 4112 ; check transmitter 2 |
604 | 4113 movff char_I_pressure_stat+1,WREG ; get status of 2nd pressure reading |
4114 rcall check_tr_functions_helper5 ; check for transmitter 2 lost | |
4115 rcall check_tr_functions_helper6 ; check for transmitter 2 low battery | |
4116 movff int_IO_pressure_value+3,WREG ; get high byte of 2nd pressure reading | |
4117 rcall check_tr_functions_helper7 ; check for transmitter 2 pressure warning | |
4118 rcall check_tr_functions_helper8 ; check for transmitter 2 pressure attention | |
634 | 4119 |
4120 ; results for transmitter | |
4121 btfsc attn_det_xmit1_bat ; do we have a transmitter 1 attention? | |
4122 bra check_tr_functions_xmitter_mesg ; YES - show transmitter message | |
4123 btfsc attn_det_xmit2_bat ; do we have a transmitter 2 attention? | |
4124 bra check_tr_functions_xmitter_mesg ; YES - show transmitter message | |
4125 check_tr_functions_1: | |
4126 btfsc warn_det_pressure1 ; do we have a pressure 1 warning? | |
4127 bra check_tr_functions_pres_mesg ; YES - show pressure message | |
4128 btfsc warn_det_pressure2 ; do we have a pressure 2 warning? | |
4129 bra check_tr_functions_pres_mesg ; YES - show pressure message | |
4130 btfsc attn_det_pressure1 ; do we have a pressure 1 attention? | |
4131 bra check_tr_functions_pres_mesg ; YES - show pressure message | |
4132 btfsc attn_det_pressure2 ; do we have a pressure 2 attention? | |
4133 bra check_tr_functions_pres_mesg ; YES - show pressure message | |
4134 return ; done | |
4135 | |
4136 check_tr_functions_xmitter_mesg: | |
4137 incf message_counter,F ; increase message counter | |
4138 call TFT_message_transmitter ; show transmitter message | |
4139 bra check_tr_functions_1 ; continue with pressure messages | |
4140 | |
4141 check_tr_functions_pres_mesg: | |
4142 incf message_counter,F ; increase message counter | |
4143 goto TFT_message_pressure ; show pressure message and return | |
604 | 4144 |
4145 check_tr_functions_helper1: | |
4146 btfsc WREG,char_transmitter_lost ; transmitter 1 lost? | |
4147 bra check_tr_functions_helper1a ; YES - show transmitter attention message | |
634 | 4148 bcf shown_xmit1_lost ; NO - clear flag for old message |
604 | 4149 return ; - done |
4150 check_tr_functions_helper1a: | |
634 | 4151 btfsc shown_xmit1_lost ; is it a new message? |
604 | 4152 return ; NO - do not show the pressure readings custom view again |
634 | 4153 bsf shown_xmit1_lost ; YES - memorize it's an old message now |
4154 rcall check_tr_functions_show_cv ; - show custom view | |
604 | 4155 |
4156 check_tr_functions_helper2: | |
4157 btfsc WREG,char_transmitter_low_bat ; transmitter 1 low battery? | |
4158 bra check_tr_functions_helper2a ; YES - show transmitter attention message | |
634 | 4159 bcf shown_xmit1_battery ; NO - clear flag for old message |
4160 bcf attn_det_xmit1_bat ; - clear transmitter 1 attention | |
604 | 4161 return ; - done |
4162 check_tr_functions_helper2a: | |
634 | 4163 bsf attn_det_xmit1_bat ; set transmitter 1 attention |
4164 btfsc shown_xmit1_battery ; is it a new message? | |
604 | 4165 return ; NO - do not show the pressure readings custom view again |
634 | 4166 bsf shown_xmit1_battery ; YES - memorize it's an old message now |
4167 rcall check_tr_functions_show_cv ; - show custom view | |
604 | 4168 |
4169 check_tr_functions_helper3: | |
4170 btfsc WREG,int_warning_flag ; transmitter 1 pressure warning? | |
4171 bra check_tr_functions_helper3a ; YES - show pressure reading message as warning | |
634 | 4172 bcf shown_xmit1_pres_warn ; NO - clear flag for old message |
4173 bcf warn_det_pressure1 ; - clear pressure 1 warning | |
604 | 4174 return ; - done |
4175 check_tr_functions_helper3a: | |
634 | 4176 bsf warn_det_pressure1 ; set pressure 1 warning |
4177 btfsc shown_xmit1_pres_warn ; is it a new message? | |
604 | 4178 return ; NO - do not show the pressure readings custom view again |
634 | 4179 bsf shown_xmit1_pres_warn ; YES - memorize it's an old message now |
604 | 4180 bra check_tr_functions_show_cv ; - show custom view |
4181 | |
4182 check_tr_functions_helper4: | |
4183 btfsc WREG,int_attention_flag ; transmitter 1 pressure attention? | |
4184 bra check_tr_functions_helper4a ; YES - show pressure reading message as attention | |
634 | 4185 bcf shown_xmit1_pres_attn ; NO - clear flag for old message |
4186 bcf attn_det_pressure1 ; - clear pressure 1 attention | |
604 | 4187 return ; - done |
4188 check_tr_functions_helper4a | |
634 | 4189 bsf attn_det_pressure1 ; set pressure 1 attention |
4190 btfsc shown_xmit1_pres_attn ; is it a new message? | |
604 | 4191 return ; NO - do not show the pressure readings custom view again |
634 | 4192 bsf shown_xmit1_pres_attn ; YES - memorize it's an old message now |
604 | 4193 bra check_tr_functions_show_cv ; - show custom view |
4194 | |
4195 check_tr_functions_helper5: | |
4196 btfsc WREG,char_transmitter_lost ; transmitter 2 lost? | |
4197 bra check_tr_functions_helper5a ; YES - show transmitter attention message | |
634 | 4198 bcf shown_xmit2_lost ; NO - clear flag for old lost message |
604 | 4199 return ; - done |
4200 check_tr_functions_helper5a: | |
634 | 4201 btfsc shown_xmit2_lost ; is it a new message? |
604 | 4202 return ; NO - do not show the pressure readings custom view again |
634 | 4203 bsf shown_xmit2_lost ; YES - memorize it's an old message now |
604 | 4204 bra check_tr_functions_show_cv ; - show custom view |
4205 | |
4206 check_tr_functions_helper6: | |
4207 btfsc WREG,char_transmitter_low_bat ; transmitter 2 low battery? | |
4208 bra check_tr_functions_helper6a ; YES - show transmitter attention message | |
634 | 4209 bcf shown_xmit2_battery ; NO - clear flag for old battery message |
4210 bcf attn_det_xmit2_bat ; - clear transmitter 2 attention | |
604 | 4211 return ; - done |
4212 check_tr_functions_helper6a: | |
634 | 4213 bsf attn_det_xmit2_bat ; set transmitter 2 attention |
4214 btfsc shown_xmit2_battery ; is it a new message? | |
604 | 4215 return ; NO - do not show the pressure readings custom view again |
634 | 4216 bsf shown_xmit2_battery ; YES - memorize it's an old message now |
604 | 4217 bra check_tr_functions_show_cv ; - show custom view |
4218 | |
4219 check_tr_functions_helper7: | |
4220 btfsc WREG,int_warning_flag ; transmitter 2 pressure warning? | |
4221 bra check_tr_functions_helper7a ; YES - show pressure reading message as warning | |
634 | 4222 bcf shown_xmit2_pres_warn ; NO - clear flag for old message |
4223 bcf warn_det_pressure2 ; - clear pressure 2 warning | |
604 | 4224 return ; - done |
4225 check_tr_functions_helper7a: | |
634 | 4226 bsf warn_det_pressure2 ; set pressure 2 warning |
4227 btfsc shown_xmit2_pres_warn ; is it a new message? | |
604 | 4228 return ; NO - do not show the pressure readings custom view again |
634 | 4229 bsf shown_xmit2_pres_warn ; YES - memorize it's an old message now |
604 | 4230 bra check_tr_functions_show_cv ; - show custom view |
4231 | |
4232 check_tr_functions_helper8: | |
4233 btfsc WREG,int_attention_flag ; transmitter 2 pressure attention? | |
4234 bra check_tr_functions_helper8a ; YES - show pressure reading message as attention | |
634 | 4235 bcf shown_xmit2_pres_attn ; NO - clear flag for old message |
4236 bcf attn_det_pressure2 ; - clear pressure 2 attention | |
604 | 4237 return ; - done |
4238 check_tr_functions_helper8a | |
634 | 4239 bsf attn_det_pressure2 ; set pressure 2 attention |
4240 btfsc shown_xmit2_pres_attn ; is it a new message? | |
604 | 4241 return ; NO - do not show the pressure readings custom view again |
634 | 4242 bsf shown_xmit2_pres_attn ; YES - memorize it's an old message now |
604 | 4243 ;bra check_tr_functions_show_cv ; - show custom view |
4244 | |
4245 check_tr_functions_show_cv: | |
634 | 4246 btfsc custom_view_locked ; NO - custom view locked? |
4247 return ; YES - do not show now | |
4248 movlw index_pressures_SAC ; NO - get custom view number of pressure readings | |
4249 goto dive_customview_show ; - show custom view and return | |
4250 | |
4251 ENDIF ; _rx_functions | |
4252 | |
4253 | |
4254 ;----------------------------------------------------------------------------- | |
4255 ; Check Gas Needs | |
4256 ; | |
631 | 4257 check_gas_needs: |
634 | 4258 bcf attn_det_gas_needs ; clear attention by default |
4259 bcf warn_det_gas_needs ; clear warning by default | |
4260 banksel int_O_gas_need_pres ; switch to bank where int_O_gas_need_pres is stored | |
623 | 4261 movf int_O_gas_need_pres+1,W ; get high byte from pres need of 1st tank |
4262 iorwf int_O_gas_need_pres+3,W ; inclusive or with high byte from pres need of 2nd tank | |
4263 iorwf int_O_gas_need_pres+5,W ; inclusive or with high byte from pres need of 3rd tank | |
4264 iorwf int_O_gas_need_pres+7,W ; inclusive or with high byte from pres need of 4th tank | |
4265 iorwf int_O_gas_need_pres+9,W ; inclusive or with high byte from pres need of 5th tank | |
634 | 4266 banksel common ; back to bank common |
4267 btfsc WREG,int_invalid_flag ; any invalid flag set? | |
4268 bra check_gas_needs_ok ; YES - no further checking required | |
4269 btfsc WREG,int_warning_flag ; NO - any gas with pres_need >= pres_fill ? | |
631 | 4270 bra check_gas_needs_warn ; YES - generate a warning |
634 | 4271 btfsc WREG,int_attention_flag ; NO - any gas with pres_need >= pres_fill * threshold ? |
4272 bra check_gas_needs_attn ; YES - generate an attention | |
4273 ;bra check_gas_needs_ok ; NO - gas needs ok | |
4274 | |
4275 check_gas_needs_ok: | |
4276 bcf shown_gas_needs_warn ; re-arm custom view show-up for warning | |
4277 bcf shown_gas_needs_attn ; re-arm custom view show-up for attention | |
4278 return ; done | |
623 | 4279 |
631 | 4280 check_gas_needs_warn: |
634 | 4281 bsf warn_det_gas_needs ; set warning |
4282 bcf shown_gas_needs_attn ; re-arm custom view show-up for attention | |
4283 btfsc shown_gas_needs_warn ; has the custom view been shown before on warning level? | |
4284 bra check_gas_needs_mesg ; YES - do not show the gas needs custom view again | |
4285 btfsc custom_view_locked ; NO - custom view locked? | |
4286 bra check_gas_needs_mesg ; YES - do not show it now | |
4287 bsf shown_gas_needs_warn ; NO - set custom view as shown now | |
4288 bra check_gas_needs_cv ; - show gas needs custom view | |
4289 | |
4290 check_gas_needs_attn: | |
4291 bsf attn_det_gas_needs ; set attention | |
4292 bcf shown_gas_needs_warn ; re-arm custom view show-up for warning | |
4293 btfsc shown_gas_needs_attn ; has the custom view been shown before on attention level? | |
4294 bra check_gas_needs_mesg ; YES - do not show the gas needs custom view again | |
4295 btfsc custom_view_locked ; NO - custom view locked? | |
4296 bra check_gas_needs_mesg ; YES - do not show it now | |
4297 bsf shown_gas_needs_attn ; NO - set custom view as shown now | |
4298 ;bra check_gas_needs_cv ; - show gas needs custom view | |
4299 | |
4300 check_gas_needs_cv: | |
4301 movlw index_gas_needs_ascent ; get custom view number of gas needs | |
4302 call dive_customview_show ; show custom view | |
4303 ;bra check_gas_needs_mesg ; show message | |
4304 | |
4305 check_gas_needs_mesg: | |
4306 incf message_counter,F ; increase message counter | |
4307 goto TFT_message_gas_needs ; show message for gas needs and return | |
4308 | |
623 | 4309 |
4310 IFDEF _external_sensor | |
582 | 4311 |
634 | 4312 ;----------------------------------------------------------------------------- |
4313 ; Check external Sensors for Loss and Divergence | |
4314 ; | |
4315 check_ext_sensors: | |
4316 btfsc warn_det_sensors_lost ; all sensors lost? | |
4317 bra check_ext_sensors_lost_all ; YES - show a warning and return | |
4318 | |
4319 btfsc attn_det_sensor1_lost ; sensor 1 lost? | |
4320 rcall check_ext_sensors_lost_1 ; YES - show an attention | |
4321 | |
4322 btfsc attn_det_sensor2_lost ; sensor 2 lost? | |
4323 rcall check_ext_sensors_lost_2 ; YES - show an attention | |
4324 | |
4325 btfsc attn_det_sensor3_lost ; sensor 3 lost? | |
4326 rcall check_ext_sensors_lost_3 ; YES - show an attention | |
4327 | |
4328 btfsc warn_det_sensors_div ; sensor values divergence? | |
4329 bra check_ext_sensors_diverg ; YES - show a warning and return | |
4330 | |
4331 return ; done | |
4332 | |
4333 check_ext_sensors_lost_all: | |
4334 btfsc shown_sensors_lost ; has the custom view been shown before? | |
4335 bra warn_sensors_lost_mesg ; YES - do not show the sensor custom view again | |
4336 btfsc custom_view_locked ; NO - custom view locked? | |
4337 bra warn_sensors_lost_mesg ; YES - do not show it now | |
4338 bsf shown_sensors_lost ; NO - set it as shown now | |
4339 movlw index_ppo2_sensors ; - get custom view number of sensors | |
4340 call dive_customview_show ; - show custom view | |
4341 ;bra warn_sensors_lost_mesg ; - show message | |
4342 | |
4343 warn_sensors_lost_mesg: | |
4344 incf message_counter,F ; increase message counter | |
4345 goto TFT_message_fallback ; show message and return | |
4346 | |
4347 check_ext_sensors_lost_1: | |
4348 btfsc shown_sensor1_fail ; has the custom view been shown before for sensor 1? | |
4349 return ; YES - do not show the sensor custom view again | |
4350 btfsc custom_view_locked ; NO - custom view locked? | |
4351 return ; YES - do not show it now | |
4352 bsf shown_sensor1_fail ; NO - set it as shown now | |
4353 bra check_ext_sensors_show_cv ; - show sensor custom view | |
4354 | |
4355 check_ext_sensors_lost_2: | |
4356 btfsc shown_sensor2_fail ; has the custom view been shown before for sensor 2? | |
4357 return ; YES - do not show the sensor custom view again | |
4358 btfsc custom_view_locked ; NO - custom view locked? | |
4359 return ; YES - do not show it now | |
4360 bsf shown_sensor2_fail ; NO - set it as shown now | |
4361 bra check_ext_sensors_show_cv ; - show sensor custom view | |
4362 | |
4363 check_ext_sensors_lost_3: | |
4364 btfsc shown_sensor3_fail ; has the custom view been shown before for sensor 3? | |
4365 return ; YES - do not show the sensor custom view again | |
4366 btfsc custom_view_locked ; NO - custom view locked? | |
4367 return ; YES - do not show it now | |
4368 bsf shown_sensor3_fail ; NO - set it as shown now | |
4369 ;bra check_ext_sensors_show_cv ; - show sensor custom view | |
4370 | |
4371 check_ext_sensors_show_cv: | |
4372 movlw index_ppo2_sensors ; get custom view number of sensors | |
4373 goto dive_customview_show ; show custom view and return | |
4374 | |
4375 check_ext_sensors_diverg: | |
4376 btfsc shown_sensors_diverg ; has the custom view been shown before for divergence? | |
4377 bra check_ext_sensors_diverg_mesg ; YES - do not show the sensor custom view again | |
4378 btfsc custom_view_locked ; NO - custom view locked? | |
4379 bra check_ext_sensors_diverg_mesg ; YES - do not show it now | |
4380 bsf shown_sensors_diverg ; NO - set it as shown now | |
4381 movlw index_ppo2_sensors ; - get custom view number of sensors | |
4382 call dive_customview_show ; - show custom view | |
4383 ;bra check_ext_sensors_diverg_mesg ; - show message | |
4384 | |
4385 check_ext_sensors_diverg_mesg: | |
4386 incf message_counter,F ; increase message counter | |
4387 goto TFT_message_divergence ; show message and return | |
4388 | |
4389 ENDIF ; _external_sensor | |
4390 | |
623 | 4391 |
4392 ;============================================================================= | |
634 | 4393 dmode5 CODE |
623 | 4394 ;============================================================================= |
560 | 4395 |
634 | 4396 |
4397 ;----------------------------------------------------------------------------- | |
4398 ; Restart the Deco Engine | |
4399 ; | |
560 | 4400 global restart_deco_engine |
4401 global restart_deco_engine_wo_ceiling | |
4402 restart_deco_engine: | |
623 | 4403 banksel int_O_ceiling ; switch to bank where the shared "_O_" variables are stored |
4404 bsf int_O_ceiling+1,char_invalid_flag ; invalidate ceiling (int_O_ceiling has its invalid flag on a char's position!) | |
560 | 4405 |
4406 restart_deco_engine_wo_ceiling: | |
634 | 4407 banksel char_O_deco_gas ; switch to bank where the stops table is stored |
623 | 4408 bsf char_O_deco_gas+0,char_invalid_flag ; invalidate deco data (stop table data) |
634 | 4409 banksel int_O_NDL_norm ; switch to bank where the shared "_O_" variables are stored |
631 | 4410 bsf int_O_NDL_norm+1,int_invalid_flag ; invalidate NDL time (normal plan) |
4411 bsf int_O_TTS_norm+1,int_invalid_flag ; invalidate TTS time (normal plan) | |
4412 bsf int_O_TST_norm+1,int_invalid_flag ; invalidate TST time (normal plan) | |
623 | 4413 bsf int_O_CNS_norm+1,int_invalid_flag ; invalidate CNS at end of dive in normal plan |
631 | 4414 |
4415 restart_deco_engine_wo_norm: | |
4416 banksel common ; bank to bank common | |
4417 bsf request_restart_engine ; request restart of the deco engine | |
604 | 4418 |
4419 inval_alternative_plan_data: | |
634 | 4420 banksel int_O_NDL_alt ; switch to bank where the shared "_O_" variables are stored |
631 | 4421 bsf int_O_NDL_alt+1,int_invalid_flag ; invalidate NDL time (alternative plan) |
4422 bsf int_O_TTS_alt+1,int_invalid_flag ; invalidate TTS time (alternative plan) | |
4423 bsf int_O_TST_alt+1,int_invalid_flag ; invalidate TST time (alternative plan) | |
623 | 4424 bsf int_O_CNS_alt+1,int_invalid_flag ; invalidate CNS at end of dive in alternative plan |
4425 bsf int_O_gas_need_pres+1,int_invalid_flag ; invalidate ascent gas needs | |
604 | 4426 |
4427 IFDEF _rx_functions | |
623 | 4428 bsf int_O_pressure_need+1,int_not_avail_flag ; invalidate pressure needs to reading 1 (TR functions) |
4429 bsf int_O_pressure_need+3,int_not_avail_flag ; invalidate pressure needs to reading 2 (TR functions) | |
604 | 4430 ENDIF |
4431 | |
623 | 4432 banksel common ; bank to bank common |
4433 bsf new_deco_data_avail ; set flag for new NDL and deco data available to have the display updated | |
582 | 4434 |
634 | 4435 return ; done |
4436 | |
582 | 4437 |
4438 ;============================================================================= | |
634 | 4439 dmode6 CODE |
4440 ;============================================================================= | |
4441 | |
4442 | |
4443 ;----------------------------------------------------------------------------- | |
4444 ; Start-up Simulator Mode | |
582 | 4445 ; |
634 | 4446 global demo_divemode |
4447 demo_divemode: | |
631 | 4448 call TFT_ClearScreen ; blank screen |
4449 | |
4450 ; leaving menu mode, so have option values in EEPROM up-to-date | |
634 | 4451 btfsc option_changed ; do the options need to be stored to EEPROM ? |
631 | 4452 call option_check_and_store_all ; YES - check and store all option values in EEPROM |
604 | 4453 |
4454 ; +++ COMMENT OUT FOR TESTING PURPOSE ONLY !!! +++ | |
631 | 4455 bsf simulatormode ; restore tissue pressures and CNS value after finishing simulator use |
604 | 4456 ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ |
560 | 4457 |
623 | 4458 call deco_push_tissues_to_vault ; back-up the tissue pressures (C-code) |
4459 banksel common ; back to bank common | |
4460 | |
4461 ; set simulated target depth | |
4462 movff char_I_bottom_depth,simulatormode_depth | |
4463 | |
4464 ; set initial simulated depth (needed to overcome end-of-dive detection) | |
4465 banksel pressure_rel_sim | |
4466 MOVLI simulator_startdepth,pressure_rel_sim | |
4467 banksel common | |
4468 | |
4469 ; switch ISR pressure calculations to simulator mode | |
4470 bcf quit_simulatormode ; clear flag for fast abort request | |
4471 bcf sensor_override_active ; make sure ISR mode switch confirmation is not older than from now on | |
4472 bsf sensor_override_request ; request ISR to switch to simulator mode | |
4473 btfss sensor_override_active ; has the ISR confirmed switch to simulator mode? | |
4474 bra $-2 ; NO - not yet, loop waiting for the ISR to kick in | |
4475 | |
4476 ; branch into dive mode | |
4477 bsf divemode ; activate dive mode (to be done after simulator mode is activated) | |
634 | 4478 goto diveloop ; start dive mode |
4479 | |
4480 ;----------------------------------------------------------------------------- | |
623 | 4481 |
4482 END |