Mercurial > public > hwos_code
annotate src/divemode.asm @ 628:cd58f7fc86db
3.05 stable work
author | heinrichsweikamp |
---|---|
date | Thu, 19 Sep 2019 12:01:29 +0200 |
parents | c40025d8e750 |
children | 185ba2f91f59 |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
628 | 3 ; File divemode.asm combined next generation V3.04.3 |
0 | 4 ; |
623 | 5 ; Dive Mode |
0 | 6 ; |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
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 |
582 | 34 extern option_save_all |
35 extern init_recording_params | |
36 | |
623 | 37 IFDEF _compass |
38 extern TFT_dive_compass_heading | |
39 ENDIF | |
40 | |
41 | |
42 ;---- Private local Variables ------------------------------------------------- | |
582 | 43 |
44 CBLOCK local1 ; max size is 16 Byte !!! | |
45 sensor_setpoint ; sensor ppo2 in 0.01bar for deco routine | |
604 | 46 check_gas_num ; used in search for best gas/dil: current gas/dil number (1-5) |
47 check_gas_depth ; used in search for best gas/dil: current gas/dil change depth | |
48 check_gas_type ; used in search for best gas/dil: current gas/dil type | |
49 check_gas_O2_ratio ; used in search for best gas/dil: current gas/dil O2 ratio | |
50 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 ! | |
51 best_gas_depth ; used in search for best gas/dil: best gas/dil change depth | |
623 | 52 last_pressure_velocity:2 ; cached last absolute pressure for velocity calculation |
53 TFT_output_flags_1 ; TFT update flags for output phase 1 | |
54 TFT_output_flags_2 ; TFT update flags for output phase 2 | |
55 TFT_output_flags_3 ; TFT update flags for output phase 3 | |
56 TFT_output_flags_4 ; TFT update flags for output phase 4 | |
57 DM_flags_local ; various dive mode flags | |
58 ENDC ; used: 14 byte, remaining: 2 byte | |
604 | 59 |
60 CBLOCK local2 ; max size is 16 Byte !!! | |
623 | 61 pressure_rel_accu_trip:4 ; pressure accumulator for calculating the resettable average depth |
62 pressure_rel_accu_total:4 ; pressure accumulator for calculating the total dive average depth | |
63 xmitter_flags_stat ; pressure transmitter flags for status | |
64 xmitter_flags_mesg ; pressure transmitter flags for messages | |
65 ppO2_min:2 ; used in search for best gas/dil: minimum ppO2 required | |
66 ppO2_max_default:2 ; used in search for best gas/dil: default maximum ppO2 | |
67 ppO2_max_deco:2 ; used in search for best gas/dil: deco maximum ppO2 | |
68 ENDC ; used: 16 byte, remaining: 0 byte ==> FULL | |
69 | |
70 | |
71 ;---- Private local Flags ---------------------------------------------------- | |
72 | |
73 ; TFT_output_flags_1 - phase 1: every second - before deco calculations, all modes | |
74 #DEFINE FLAG_TFT_depth_current TFT_output_flags_1,0 ; =1: show current depth | |
75 #DEFINE FLAG_TFT_depth_maximum TFT_output_flags_1,1 ; =1: show maximum depth | |
76 #DEFINE FLAG_TFT_active_gas_divemode TFT_output_flags_1,2 ; =1: show active gas and dive mode | |
77 #DEFINE FLAG_TFT_apnoe_surface_time TFT_output_flags_1,3 ; =1: show apnoe mode surface time | |
78 #DEFINE FLAG_TFT_depth_maximum_apnoe TFT_output_flags_1,4 ; =1: show maximum depth of last apnoe dive | |
79 #DEFINE FLAG_TFT_clear_apnoe_surface TFT_output_flags_1,5 ; =1: clear apnoe mode surface data from screen | |
80 #DEFINE FLAG_TFT_apnoe_divetime TFT_output_flags_1,6 ; =1: show apnoe mode dive times | |
81 ; TFT_output_flags_1,7 ; --- unused | |
82 | |
83 ; TFT_output_flags_2 - phase 2: every second - before deco calculations, deco modes only | |
84 #DEFINE FLAG_TFT_divemode_mask TFT_output_flags_2,0 ; =1: show dive mode mask | |
85 #DEFINE FLAG_TFT_divetime TFT_output_flags_2,1 ; =1: show dive time | |
86 #DEFINE FLAG_TFT_safety_stop_show TFT_output_flags_2,2 ; =1: show safety stop | |
87 #DEFINE FLAG_TFT_safety_stop_clear TFT_output_flags_2,3 ; =1: clear safety stop | |
88 #DEFINE FLAG_TFT_temperature TFT_output_flags_2,4 ; =1: show temperature (or resettable dive time when in compass view) | |
89 ; TFT_output_flags_2,5 ; --- unused | |
90 ; TFT_output_flags_2,6 ; --- unused | |
91 ; TFT_output_flags_2,7 ; --- unused | |
92 | |
93 ; TFT_output_flags_3 - phase 3: every second - after deco calculations, deco modes only | |
94 #DEFINE FLAG_TFT_clear_deco_data TFT_output_flags_3,0 ; =1: clear deco data (NDL or stop & TTS) | |
95 #DEFINE FLAG_TFT_display_ndl_mask TFT_output_flags_3,1 ; =1: show NDL mask | |
96 #DEFINE FLAG_TFT_display_deco_mask TFT_output_flags_3,2 ; =1: show deco mask | |
97 #DEFINE FLAG_TFT_display_ndl TFT_output_flags_3,3 ; =1: show NDL data | |
98 #DEFINE FLAG_TFT_display_deco TFT_output_flags_3,4 ; =1: show deco stop data | |
99 #DEFINE FLAG_TFT_display_tts TFT_output_flags_3,5 ; =1: show deco TTS data | |
100 ; TFT_output_flags_3,6 ; --- unused | |
101 ; TFT_output_flags_3,7 ; --- unused | |
102 | |
103 ; TFT_output_flags_4 - phase 4: every second - after deco calculations, all modes | |
104 #DEFINE FLAG_TFT_customview_mask TFT_output_flags_4,0 ; =1: show the custom view mask | |
105 #DEFINE FLAG_TFT_sign_show TFT_output_flags_4,1 ; =1: show the advice / attention / warning sign | |
106 #DEFINE FLAG_TFT_sign_clear TFT_output_flags_4,2 ; =1: clear the advice / attention / warning sign | |
107 #DEFINE FLAG_TFT_message_clear_both TFT_output_flags_4,3 ; =1: clear messages, both rows | |
108 #DEFINE FLAG_TFT_message_clear_2nd TFT_output_flags_4,4 ; =1: clear messages, 2nd row only | |
109 #DEFINE FLAG_TFT_velocity_show TFT_output_flags_4,5 ; =1: show vertical velocity | |
110 #DEFINE FLAG_TFT_velocity_clear TFT_output_flags_4,6 ; =1: clear vertical velocity | |
111 ; TFT_output_flags_4,7 ; --- unused | |
112 | |
113 | |
114 ; Pressure Transmitter Status | |
115 #DEFINE transmitter1_lost xmitter_flags_stat,0 ; =1: transmitter 1 lost is an old message | |
116 #DEFINE transmitter1_battery xmitter_flags_stat,1 ; =1: transmitter 1 battery low is an old message | |
117 #DEFINE transmitter1_pres_warn xmitter_flags_stat,2 ; =1: transmitter 1 pressure warning is an old message | |
118 #DEFINE transmitter1_pres_att xmitter_flags_stat,3 ; =1: transmitter 1 pressure attention is an old message | |
119 #DEFINE transmitter2_lost xmitter_flags_stat,4 ; =1: transmitter 2 lost is an old message | |
120 #DEFINE transmitter2_battery xmitter_flags_stat,5 ; =1: transmitter 2 battery low is an old message | |
121 #DEFINE transmitter2_pres_warn xmitter_flags_stat,6 ; =1: transmitter 2 pressure warning is an old message | |
122 #DEFINE transmitter2_pres_att xmitter_flags_stat,7 ; =1: transmitter 2 pressure attention is an old message | |
123 | |
124 ; Pressure Transmitter Messages | |
125 #DEFINE pres_customview_shown xmitter_flags_mesg,0 ; =1: pressure readings custom view has been shown before | |
126 #DEFINE show_transmitter_attention xmitter_flags_mesg,1 ; =1: show transmitter attention | |
127 #DEFINE show_pres_warning xmitter_flags_mesg,2 ; =1: show transmitter pressure warning | |
128 #DEFINE show_pres_attention xmitter_flags_mesg,3 ; =1: show transmitter pressure attention | |
129 ; xmitter_flags_mesg,4 ; --- unused | |
130 ; xmitter_flags_mesg,5 ; --- unused | |
131 ; xmitter_flags_mesg,6 ; --- unused | |
132 ; xmitter_flags_mesg,7 ; --- unused | |
133 | |
134 ; various Flags | |
135 #DEFINE FLAG_backtrack_full DM_flags_local,0 ; =1: the backtracking storage is full | |
136 #DEFINE new_deco_data_avail DM_flags_local,1 ; =1: new NDL or deco data available | |
137 #DEFINE o2_sensors_agree DM_flags_local,2 ; =1: the ppO2 of all sensors are within the threshold range | |
138 #DEFINE update_menu DM_flags_local,3 ; =1: redraw the dive menu | |
139 #DEFINE FLAG_SP2_used DM_flags_local,4 ; =1: setpoint 2 has been auto-selected already | |
140 #DEFINE FLAG_SP3_used DM_flags_local,5 ; =1: setpoint 3 has been auto-selected already | |
141 #DEFINE FLAG_SP4_used DM_flags_local,6 ; =1: setpoint 4 has been auto-selected already | |
142 #DEFINE FLAG_SP5_used DM_flags_local,7 ; =1: setpoint 5 has been auto-selected already | |
143 | |
144 | |
145 dmode CODE | |
582 | 146 |
147 ;============================================================================= | |
0 | 148 |
149 global diveloop | |
150 diveloop: | |
623 | 151 clrf STKPTR ; clear return addresses stack |
152 | |
153 ; start with a clean time base | |
154 bsf reset_timebase ; request ISR to reset the main timebase, | |
155 ; as we are in dive mode the dive timers will be reset as well | |
156 | |
157 ; reset global flags | |
158 clrf DM_flags_state ; clear all flags for dive mode status | |
159 clrf DM_flags_request ; clear all flags for user requests | |
160 clrf DM_flags_event ; clear all flags for data recording events | |
161 clrf DM_flags_layout1 ; clear all flags for display control / layout (1) | |
162 clrf DM_flags_layout2 ; clear all flags for display control / layout (2) | |
163 clrf DM_flags_message ; clear all flags for display control / messages | |
164 clrf DM_flags_gas_dil ; clear all flags for display control / gases and diluents | |
165 | |
166 bcf dive_main_menu ; clear dive main menu flag | |
167 bcf dive_options_menu ; clear dive options menu flag | |
168 | |
169 ; reset local flags | |
170 clrf TFT_output_flags_1 ; clear all flags for TFT output phase 1 | |
171 clrf TFT_output_flags_2 ; clear all flags for TFT output phase 2 | |
172 clrf TFT_output_flags_3 ; clear all flags for TFT output phase 3 | |
173 clrf TFT_output_flags_4 ; clear all flags for TFT output phase 4 | |
174 clrf xmitter_flags_stat ; clear all pressure transmitter status flags | |
175 clrf xmitter_flags_mesg ; clear all pressure transmitter message flags | |
176 clrf DM_flags_local ; clear all the various other flags, too | |
177 | |
178 ; set initial screen layout | |
179 bcf alt_layout_active ; default to normal layout | |
180 TSTOSC opt_layout ; alternative layout enabled? | |
181 bsf alt_layout_active ; YES - start with alternative layout | |
182 | |
628 | 183 IFDEF _gas_contingency |
184 ; disable gas contingency mode (may be left over activated by deco calculator) | |
185 clrf WREG | |
186 movff WREG,char_I_gas_contingency | |
187 ENDIF | |
188 | |
623 | 189 ; boot tasks for all modes |
190 call diveloop_boot | |
604 | 191 |
192 ; startup tasks for all modes | |
623 | 193 ; clrf CCP1CON ; stop PWM |
194 ; bcf PORTC,2 ; pull PWM output to GND | |
195 ; clrf CCPR1L ; backlight off | |
604 | 196 call TFT_boot ; initialize TFT (includes clear screen) |
623 | 197 call TFT_show_divemode_mask ; display static dive mode mask |
198 call TFT_Display_FadeIn ; dim up the display | |
199 | |
200 ; reload and redraw last custom view | |
201 movff customview_divemode,active_customview | |
202 bsf FLAG_TFT_customview_mask | |
203 | |
204 bcf divetime_longer_1min ; the dive has just begun | |
205 btfsc FLAG_apnoe_mode ; in apnea mode? | |
206 bsf divetime_longer_1min ; YES - force dive to have lasted for longer than 1 minute already | |
207 btfsc sensor_override_active ; in simulator mode? | |
208 bsf divetime_longer_1min ; YES - force dive to have lasted for longer than 1 minute already | |
209 | |
210 bsf trigger_pres_cur_changed ; flag that the pressures have changed to have all data... | |
211 bsf trigger_pres_max_changed ; ... written to the display on the first output round | |
212 | |
213 bsf trigger_temp_changed ; flag that the temperature has changed to have the temperature ... | |
214 ; ... written to the display on the first output round | |
215 | |
216 bsf new_deco_data_avail ; flag that new deco engine results are available to have the initial data ... | |
217 ; ... written to the display on the first output round | |
218 | |
219 ; clear the resettable average depth | |
220 call clear_resettable_average_depth | |
221 | |
222 ; ; initial caching of new absolute and relative pressure, ISR-safe 2 byte copies | |
223 ; SMOVII pressure_abs, pressure_abs_cached | |
224 ; SMOVII pressure_rel_cur,pressure_rel_cur_cached | |
225 | |
226 ; ; initial transfer of absolute pressure to deco engine | |
227 ; MOVII pressure_abs_cached,int_I_pres_respiration | |
228 | |
229 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
230 bra diveloop_1 ; YES - done with initialization | |
231 btfsc FLAG_gauge_mode ; NO - in gauge mode? | |
232 bra diveloop_1 ; YES - done with initialization | |
233 bsf FLAG_TFT_display_ndl_mask ; NO - in deco mode then, display NDL mask | |
234 bsf FLAG_TFT_active_gas_divemode; - request initial display of gas and setpoint | |
235 | |
236 diveloop_1: | |
237 btfsc reset_timebase ; has the ISR confirmed reset of the timebase meanwhile? | |
238 bra $-2 ; NO - not yet, loop waiting for confirmation before entering the dive loop | |
239 | |
240 diveloop_loop: | |
241 ; ### the dive loop starts here ### | |
242 btfsc trigger_full_second ; new 1/1 second? | |
243 bra diveloop_loop_2 ; YES - continue with tasks every 1/1 second | |
244 btfsc trigger_half_second ; NO - new 1/2 second? | |
245 bra diveloop_loop_1 ; YES - continue with tasks every 1/2 second | |
246 | |
247 ; tasks every round except every 1/1 or 1/2 second | |
248 IFDEF _compass | |
249 movlw index_compass_dm ; index of compass view | |
250 cpfseq active_customview ; in compass view? | |
251 bra diveloop_loop_11 ; NO - continue with tasks every round | |
252 call TFT_dive_compass_heading ; YES - update compass heading value | |
253 bsf FLAG_TFT_temperature ; - redraw temperature (will show resettable dive time now) | |
254 ENDIF | |
255 bra diveloop_loop_11 ; - continue tasks every round | |
256 | |
257 diveloop_loop_1: | |
258 ; tasks every 1/2 second | |
259 bcf trigger_half_second ; clear flag | |
260 btfsc FLAG_gauge_mode ; in gauge mode? | |
261 bra diveloop_loop_11 ; YES - done with 1/2 second tasks | |
262 btfsc FLAG_apnoe_mode ; NO - in apnoe mode? | |
263 bra diveloop_loop_11 ; YES - done with 1/2 second tasks | |
264 | |
265 ; tasks every 1/2 second in deco modes | |
266 call calc_deco_engine ; ##### calculate decompression ##### | |
267 bra diveloop_loop_11 ; done with 1/2 second tasks | |
268 | |
269 diveloop_loop_2: | |
270 ; tasks every 1/1 second (code includes tasks every 1/2 second that fall onto the full second) | |
271 bcf trigger_full_second ; clear flag for new 1/1 second | |
272 bcf trigger_half_second ; clear flag for new 1/2 second as well | |
273 | |
274 btfss trigger_temp_changed ; has the temperature changed? | |
275 bra diveloop_loop_3 ; NO - continue with tasks every 1/1 second | |
276 | |
277 bsf FLAG_TFT_temperature ; YES - display temperature | |
278 bcf trigger_temp_changed ; - clear flag | |
279 | |
280 ; "future hardware will need min temperature checked every second..." (?) | |
281 | |
282 MOVII temperature_min,sub_a ; - copy last temperature_min to sub_a | |
283 SMOVII temperature_cur,sub_b ; - ISR-safe 2 byte copy of current temperature to sub_b | |
284 call sub16 ; - sub_c = sub_a - sub_b = temperature_min - temperature | |
285 btfsc neg_flag ; - temperature > temperature_min ? | |
286 bra diveloop_loop_3 ; YES - done | |
287 MOVII sub_b,temperature_min ; NO - store new minimum temperature | |
288 | |
289 diveloop_loop_3: | |
290 ; tasks every 1/1 second | |
291 btfss trigger_pres_cur_changed ; has the pressure changed? | |
292 bra diveloop_loop_4 ; NO - continue with tasks every 1/1 second | |
293 | |
294 ; set flags | |
295 bcf trigger_pres_cur_changed ; clear flag for pressure change | |
296 bsf FLAG_TFT_depth_current ; set flag to display updated depth | |
297 | |
298 ; cache new absolute and relative pressure, ISR-safe 2 byte copies | |
299 SMOVII pressure_abs, pressure_abs_cached | |
300 SMOVII pressure_rel_cur,pressure_rel_cur_cached | |
301 | |
302 ; transfer absolute pressure to deco engine | |
303 MOVII pressure_abs_cached,int_I_pres_respiration | |
304 | |
305 ; compute absolute pressure / 10, will be used later on a couple of times | |
306 MOVII pressure_abs_cached,xA | |
307 MOVLI .10,xB | |
308 call div16x16 ; xC = xA / xB = absolute pressure / 10 | |
309 MOVII xC,pressure_abs_10 ; store result for later use | |
604 | 310 |
311 ; compute current depth in meters | |
623 | 312 MOVII pressure_rel_cur_cached,xA ; copy current relative pressure to xA |
313 ADDLI .50, xA ; add 0.5 meter = 50 mbar for rounding up/down at 0.5 meters | |
314 MOVLI .100,xB ; divide by 100 to turn mbar into meters | |
315 call div16x16 ; xC = xA / xB = depth in full meters | |
316 movff xC+0,depth_meter ; store result in depth_meter, only LSB of result needed | |
317 | |
318 IFDEF _ccr_pscr | |
319 ; adjust auto-setpoint | |
320 btfsc FLAG_ccr_mode ; in CCR mode? | |
321 call check_dive_autosp ; YES - check for Auto-SP | |
322 ENDIF | |
323 | |
324 ; check for new max pressure | |
325 btfss trigger_pres_max_changed ; has the max pressure changed? | |
326 bra diveloop_loop_4 ; NO - continue with tasks every 1/1 second | |
327 bcf trigger_pres_max_changed ; YES - clear flag for new max pressure | |
328 bsf FLAG_TFT_depth_maximum ; - set flag for displaying new max depth | |
329 SMOVII pressure_rel_max,pressure_rel_max_cached ; - cache new max depth | |
330 | |
331 diveloop_loop_4: | |
332 ; continue tasks every 1/1 second | |
333 | |
334 IFDEF _external_sensor | |
335 btfsc FLAG_ccr_mode ; in CCR mode? | |
336 rcall calc_deko_divemode_sensor ; YES - do sensor data acquisition if applicable | |
337 btfsc FLAG_pscr_mode ; in pSCR mode? | |
338 rcall calc_deko_divemode_sensor ; YES - do sensor data acquisition if applicable | |
339 ENDIF | |
340 | |
341 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
342 rcall divemode_apnoe_tasks ; YES - do 1 sec. apnoe tasks | |
343 | |
344 ; display all animated (blinking) values at the beginning of each full second to have a stable timebase | |
345 rcall TFT_output_1 ; do display updates | |
346 | |
347 btfss FLAG_apnoe_mode ; in apnoe mode? | |
348 bra diveloop_loop_5 ; NO - continue with deco mode tasks every 1/1 second | |
349 | |
350 ; apnoe mode tasks every 1/1 second | |
351 call dive_customview_second ; do every second tasks for the custom view area | |
352 bra diveloop_loop_10 ; continue with common tasks every 1/1 second | |
353 | |
354 diveloop_loop_5: | |
355 ; deco mode tasks every 1/1 second | |
356 bsf FLAG_TFT_divetime ; display (new) dive time | |
357 | |
358 rcall safety_stop_show ; serve safety stop | |
359 | |
360 rcall TFT_output_2 ; do display updates | |
361 | |
362 call divemode_check_warnings ; check for warnings | |
604 | 363 |
364 IFDEF _rx_functions | |
623 | 365 btfss tr_functions_activated ; TR functions activated? |
366 bra diveloop_loop_6 ; NO - continue with deco mode tasks every 1/2 second | |
604 | 367 call get_pressure_readings ; YES - get pressure readings |
368 call configure_sac_calculation ; - set up SAC calculation | |
369 ENDIF | |
582 | 370 |
623 | 371 diveloop_loop_6: |
372 ; deco mode tasks every 1/1 second | |
373 INCI divesecs_avg_trip ; increment the resettable dive time | |
628 | 374 INCI divesecs_avg_total ; increment the total dive time |
623 | 375 |
376 btfsc FLAG_gauge_mode ; in gauge mode? | |
377 bra diveloop_loop_7 ; YES - skip deco calculations | |
378 | |
379 call calc_deco_engine ; ##### calculate decompression ##### | |
380 | |
381 btfsc new_deco_data_avail ; new NDL or deco data available? | |
382 call show_new_deco_data ; YES - update the display and update the decostop_active flag | |
383 | |
384 btfsc decostop_active ; in deco mode? | |
385 bsf FLAG_TFT_display_deco ; YES - update deco stop depth & time every second because of depth-dependent color-coding | |
386 | |
387 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) | |
388 | |
389 diveloop_loop_7: | |
390 ; deco mode tasks alternating every 2 seconds on timebase | |
391 btfss timebase_1sec ; on even second of timebase? | |
392 rcall calc_velocity ; YES - calculate velocity and display if > threshold | |
393 btfsc timebase_1sec ; on odd second of timebase? | |
394 call check_gas_best ; YES - check if a better gas cue can be given | |
395 | |
396 diveloop_loop_8: | |
397 ; deco mode tasks alternating every 2 seconds on resettable dive time | |
398 btfss divesecs_avg_trip+0,0 ; on even second of resettable dive time? | |
399 rcall calc_average_depth ; YES - calculate average depth | |
400 btfsc divesecs_avg_trip+0,0 ; on odd second of resettable dive time? | |
401 rcall safety_stop_control ; YES - exercise safety stop control | |
402 | |
403 diveloop_loop_9: | |
404 ; deco mode tasks every 1/1 second | |
628 | 405 rcall check_deco_states ; check and lock if in deco and in the deco stops region |
623 | 406 rcall TFT_output_3 ; do display updates |
407 | |
408 diveloop_loop_10: | |
409 ; common tasks every 1/1 second | |
410 rcall timeout_divemode ; check for timeout condition | |
411 rcall check_dive_modes ; test if depth still deeper than threshold | |
412 | |
413 btfsc trigger_full_minute ; has next minute begun? | |
414 rcall update_divemode60 ; YES - update clock, etc. | |
415 | |
416 btfss FLAG_oc_mode ; are we in OC mode? | |
417 bsf FLAG_TFT_active_gas_divemode; NO - have the gas and setpoint redrawn on every second to update setpoint display, animate the blinking, etc. | |
418 | |
419 btfsc dive_main_menu ; dive mode menu shown? | |
420 bsf update_menu ; YES - request update | |
421 | |
422 rcall TFT_output_4 ; do display updates | |
423 | |
424 ; tasks every round, every mode | |
425 diveloop_loop_11: | |
604 | 426 call test_switches_divemode ; check switches in dive mode |
623 | 427 bra diveloop_loop_12 |
428 | |
429 global diveloop_menu_exit | |
430 diveloop_menu_exit: ; jump-in from menu exit | |
431 bsf FLAG_TFT_temperature ; restore temperature display or resettable dive time (was overwritten by menu) | |
432 | |
433 diveloop_loop_12: | |
434 bsf FLAG_TFT_active_gas_divemode; redraw gas and setpoint (eventually needed to restore the "Bailout" text) | |
435 | |
436 btfsc request_next_custview ; shall show next custom view? | |
437 call dive_customview_toggle ; YES - show next custom view (and delete this flag) | |
438 | |
439 btfsc request_gaschange ; shall change gas? | |
582 | 440 call gas_switched_common ; YES |
0 | 441 |
623 | 442 btfsc request_toggle_GF ; shall toggle GF/aGF? |
582 | 443 rcall divemodemode_togglegf ; YES |
0 | 444 |
604 | 445 IFDEF _cave_mode |
623 | 446 btfsc request_turn_dive ; shall turn dive? |
604 | 447 rcall divemodemode_toggleturn ; YES |
448 ENDIF | |
449 | |
623 | 450 btfsc request_set_marker ; shall set a marker? |
582 | 451 call set_logbook_marker ; YES |
452 | |
623 | 453 btfsc trigger_sample_divedata ; shall store new sample of dive data? |
604 | 454 call store_dive_data ; YES - store profile data |
455 | |
456 btfss divemode ; dive finished? | |
623 | 457 goto ghostwriter_end_dive ; YES - dive finished |
604 | 458 |
459 IFDEF _screendump | |
623 | 460 btfsc screen_dump_avail ; screen dump function enabled? |
604 | 461 call TFT_dump_screen_check ; YES - check if requested and do it |
462 ENDIF | |
463 | |
623 | 464 bra diveloop_loop ; loop in dive mode |
465 | |
466 ;-------------------------------------------------------------------------------------------------------- | |
467 | |
468 TFT_output_1: ; every second - before deco calculations, all mode | |
469 btfsc FLAG_TFT_clear_apnoe_surface ; shall clear apnoe mode surface data from screen? | |
470 call TFT_clear_apnoe_surface ; YES - clear apnoe mode surface data from screen | |
471 | |
472 btfsc FLAG_TFT_depth_current ; shall show depth? | |
473 call TFT_show_depth ; YES - display depth | |
474 btfsc FLAG_TFT_depth_maximum ; shall show max depth? | |
475 call TFT_show_max_depth ; YES - display max depth | |
476 btfsc FLAG_TFT_active_gas_divemode ; shall show active gas and dive mode? | |
477 call TFT_show_active_gas_divemode ; YES - display gas, setpoint and mode | |
478 | |
479 btfsc FLAG_TFT_apnoe_surface_time ; shall show apnoe mode surface time? | |
480 call TFT_show_apnoe_surface ; YES - show apnoe mode surface time | |
481 btfsc FLAG_TFT_depth_maximum_apnoe ; shall show max. depth of last dive? | |
482 call TFT_show_apnoe_max_depth ; YES - show max. depth of last dive | |
483 btfsc FLAG_TFT_apnoe_divetime ; shall show apnoe dive time? | |
484 call TFT_show_apnoe_times ; YES - show apnoe dive time? | |
485 | |
486 clrf TFT_output_flags_1 ; mark all TFT updates done | |
487 return ; done | |
488 | |
489 TFT_output_2: ; every second - before deco calculations, deco modes only | |
490 btfsc FLAG_TFT_divemode_mask ; shall re-draw mask? | |
491 call TFT_show_divemode_mask ; YES - re-draw mask | |
492 btfsc FLAG_TFT_divetime ; shall show dive time? | |
493 call TFT_show_divetime ; YES - show dive time | |
494 btfsc FLAG_TFT_safety_stop_show ; shall show safety stop? | |
495 call TFT_safety_stop_show ; YES - show safety stop | |
496 btfsc FLAG_TFT_safety_stop_clear ; shall clear safety stop? | |
497 call TFT_safety_stop_clear ; YES - clear safety stop | |
498 btfsc FLAG_TFT_temperature ; shall show temperature? | |
499 call TFT_show_temp_divemode ; YES - display temperature (or resettable dive time) | |
500 clrf TFT_output_flags_2 ; mark all TFT updates done | |
501 goto dive_customview_second ; do every-second tasks for the custom view area (in sync with the dive time) and return | |
502 | |
503 TFT_output_3: ; every second - after deco calculations, deco modes only | |
504 btfsc FLAG_TFT_clear_deco_data ; shall clear deco data (NDL or stop & TTS)? | |
505 call TFT_clear_deco_data ; YES - clear deco data (NDL or stop & TTS) | |
506 btfsc FLAG_TFT_display_ndl_mask ; shall show NDL mask? | |
507 call TFT_show_ndl_mask ; YES - show NDL mask | |
508 btfsc FLAG_TFT_display_ndl ; shall show NDL data? | |
509 call TFT_show_ndl ; YES - show NDL data | |
510 btfsc FLAG_TFT_display_deco_mask ; shall show deco mask? | |
511 call TFT_show_deco_mask ; YES - show deco mask | |
512 btfsc FLAG_TFT_display_deco ; shall show deco stop? | |
513 call TFT_show_deco ; YES - show deco stop | |
514 btfsc FLAG_TFT_display_tts ; shall show deco TTS? | |
515 call TFT_show_tts ; YES - show deco TTS | |
516 clrf TFT_output_flags_3 ; mark all TFT updates done | |
517 return ; done | |
518 | |
519 TFT_output_4: ; every second - after deco calculations, all modes | |
520 btfsc FLAG_TFT_customview_mask ; shall redraw the custom view mask? | |
521 call dive_customview_mask ; YES - redraw custom view mask | |
522 btfsc FLAG_TFT_velocity_show ; shall show vertical velocity? | |
523 call TFT_velocity_show ; YES - show vertical velocity? | |
524 btfsc FLAG_TFT_velocity_clear ; shall clear vertical velocity? | |
525 call TFT_velocity_clear ; YES - clear vertical velocity? | |
526 btfsc FLAG_TFT_sign_show ; shall show the advice / attention / warning sign? | |
527 call TFT_divemode_sign_show ; YES - show sign | |
528 btfsc FLAG_TFT_sign_clear ; shall clear the advice / attention / warning sign? | |
529 call TFT_divemode_sign_clear ; YES - clear sign | |
530 btfsc FLAG_TFT_message_clear_both ; shall clear all messages? | |
531 call TFT_clear_message_window ; YES - clear complete message area | |
532 btfsc FLAG_TFT_message_clear_2nd ; shall clear 2nd row of message area? | |
533 call TFT_clear_message_window_row2 ; YES - clear 2nd row of message area | |
534 clrf TFT_output_flags_4 ; mark all TFT updates done | |
535 return ; done | |
582 | 536 |
0 | 537 ;-------------------------------------------------------------------------------------------------------- |
538 | |
628 | 539 divemode_apnoe_tasks: ; 1 sec. apnoe tasks |
540 bsf FLAG_TFT_apnoe_divetime ; show apnoe dive times (current/last dive and total) | |
541 btfsc apnoe_at_surface ; at the surface? | |
542 bra divemode_apnoe_tasks_surf ; YES - at the surface | |
543 ;bra divemode_apnoe_tasks_dive ; NO - in dive phase | |
544 | |
545 divemode_apnoe_tasks_dive: ; apnoe mode, submerged | |
546 btfss apnoe_new_dive ; new dive begun? | |
547 return ; NO - done | |
548 bcf apnoe_new_dive ; YES - clear flag | |
549 bsf FLAG_TFT_clear_apnoe_surface ; - clear apnoe mode surface data from screen | |
550 return ; - done | |
551 | |
552 divemode_apnoe_tasks_surf: ; apnoe mode, at the surface | |
553 bsf FLAG_TFT_apnoe_surface_time ; show apnoe mode surface time | |
623 | 554 ; TODO: these outputs would need to be done only once after surfacing... |
628 | 555 bsf FLAG_TFT_depth_maximum_apnoe ; show max. depth of last dive |
556 bsf FLAG_TFT_depth_maximum ; show max. depth of all dives | |
557 ;bra apnoe_calc_maxdepth ; calculate overall max. depth and return | |
623 | 558 |
0 | 559 |
560 global apnoe_calc_maxdepth | |
561 apnoe_calc_maxdepth: | |
623 | 562 MOVII apnoe_max_pressure, sub_a ; get max depth from all dives to far |
563 MOVII pressure_rel_max_cached,sub_b ; get max depth of last dive | |
564 call cmpU16 ; sub_a - sub_b = apnoe_max_pressure - pressure_rel_max_cached | |
565 btfss neg_flag ; last dive deeper than all the others before? | |
566 return ; NO - done | |
567 MOVII pressure_rel_max_cached,apnoe_max_pressure ; YES - store new overall max depth | |
568 return ; - done | |
0 | 569 |
560 | 570 ; -------------------------------------------------------------------------------------- |
0 | 571 |
623 | 572 calc_deco_engine: |
560 | 573 ; check deco engine state and switch between normal and alternative plan calculations |
574 ; | |
575 ; Remark: Any reconfigurations done here do only affect the ascent & deco calculation settings, | |
604 | 576 ; not the settings for the calculations done on the real tissues. The later ones are only |
577 ; altered in case of a gas change, or in case of a real bailout or switchback to setpoint | |
578 ; or sensor, respectively. | |
579 ; In case of a gas change or real bailout/switchback, the settings for the deco calculations | |
580 ; are also changed to match the settings for the real tissues. This is done on signal through | |
623 | 581 ; 'request_gaschange' and will also leave the deco engine status in state as if having done |
604 | 582 ; the alternative plan last. |
583 | |
584 ; get working copies of char_O_main_status and char_O_deco_status | |
585 movff char_O_main_status,hi ; get char_O_main_status into hi | |
586 movff char_O_deco_status,lo ; get char_O_deco_status into lo | |
587 | |
588 ; check state of deco calculations | |
623 | 589 btfsc lo,DECO_COMPLETED_NORM ; finished calculations for normal plan? |
590 bra calc_deco_engine_alt ; YES - do an alternative plan next (or a normal one with more features enabled) | |
591 btfsc lo,DECO_COMPLETED_ALT ; finished calculations for alternative plan? | |
592 bra calc_deco_engine_norm ; YES - do a normal plan next | |
593 bra calc_deco_engine_cont ; NO to both - continue calculations / do first invocation in INIT mode | |
594 | |
595 calc_deco_engine_norm: | |
604 | 596 ; Last cycle did an alternative plan, or the deco engine has been restarted because of a gas change etc. |
597 ; --> Reconfigure to normal plan for next computation cycle. | |
623 | 598 bcf lo,DECO_COMPLETED_ALT ; clear flag indicating last plan was an alternative one |
599 bsf lo,DECO_START_NORM ; set flag to calculate a normal deco plan next | |
604 | 600 bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation |
601 bcf lo,DECO_BAILOUT_FLAG ; clear flag for bailout mode | |
623 | 602 bcf hi,DECO_VOLUME_FLAG ; clear flag for gas needs calculation |
604 | 603 IFDEF _cave_mode |
604 bcf hi,DECO_CAVE_MODE ; clear flag for cave mode | |
605 ENDIF | |
606 | |
623 | 607 IFDEF _ccr_pscr |
604 | 608 btfsc FLAG_ccr_mode ; in CCR mode? |
623 | 609 bra calc_deco_engine_norm_loop ; YES - reload diluents and reconfigure CCR mode if not in bailout |
604 | 610 btfsc FLAG_pscr_mode ; in pSCR mode? |
623 | 611 bra calc_deco_engine_norm_loop ; YES - reload diluents and reconfigure pSCR mode if not in bailout |
612 ;bra calc_deco_engine_norm_OC ; neither in CCR nor pSCR mode, so reload OC gases and reconfigure OC mode | |
604 | 613 ; (first cycle omits gas needs calculation for faster first deco results) |
623 | 614 ENDIF |
615 | |
616 calc_deco_engine_norm_OC: | |
604 | 617 movff active_gas,WREG ; get current OC gas |
618 call deco_setup_oc_gases_pre ; set up deco calculations in OC mode with OC gases | |
623 | 619 bra calc_deco_engine_start ; start deco engine |
620 | |
621 IFDEF _ccr_pscr | |
622 calc_deco_engine_norm_loop: ; switch to loop calculation if not in a real bailout situation | |
623 btfsc bailout_mode ; check if a real bailout situation is present | |
624 bra calc_deco_engine_norm_OC ; YES - revert to OC mode | |
604 | 625 ; NO - switch to loop calculation: |
626 movff active_dil,WREG ; - get current diluent | |
627 call deco_setup_cc_diluents_pre ; - set up deco calculations in CCR/pSCR mode with diluents | |
623 | 628 bra calc_deco_engine_start ; - start deco engine |
629 ENDIF | |
630 | |
631 calc_deco_engine_alt: | |
604 | 632 ; A normal plan was computed in the last cycle. For the next calculation cycle the mode may be switched |
633 ; to alternative plan, or stay in normal plan but with certain features enabled... | |
634 bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation | |
635 bcf lo,DECO_BAILOUT_FLAG ; clear flag for bailout mode | |
623 | 636 bcf hi,DECO_VOLUME_FLAG ; clear flag for gas needs calculation |
604 | 637 IFDEF _cave_mode |
638 bcf hi,DECO_CAVE_MODE ; clear flag for cave mode | |
639 ENDIF | |
640 | |
623 | 641 btfsc bailout_mode ; check if a real bailout situation is present |
642 bra calc_deco_engine_alt_1 ; YES - stay in normal plan mode and preclude delayed ascent calculation | |
604 | 643 TSTOSS char_I_extra_time ; NO - check if a delayed ascent is enabled |
623 | 644 bra calc_deco_engine_alt_1 ; NO - stay in normal plan mode and preclude delayed ascent calculation |
645 bcf lo,DECO_COMPLETED_NORM ; YES - clear flag indicating last plan was a normal one | |
646 bsf lo,DECO_START_ALT ; - set flag to calculate an alternative deco plan next | |
647 bsf lo,DECO_ASCENT_FLAG ; - set flag for delayed ascent | |
648 | |
649 calc_deco_engine_alt_1: | |
604 | 650 TSTOSS opt_calc_asc_gasvolume ; check if gas volume calculation is enabled |
623 | 651 bra calc_deco_engine_start ; NO - no volume calculation, no simulated bailout plan in this case |
652 bsf hi,DECO_VOLUME_FLAG ; YES - set gas needs calculation flag | |
653 | |
654 btfsc bailout_mode ; check if a real bailout situation is present | |
655 bra calc_deco_engine_start ; YES - normal plan already does bailout (OC) calculation "for real" | |
604 | 656 |
657 IFDEF _cave_mode | |
658 bsf hi,DECO_CAVE_MODE ; activate cave mode by default | |
623 | 659 btfss cave_mode ; cave mode switched on? |
604 | 660 bcf hi,DECO_CAVE_MODE ; NO - deactivate p2deco cave mode again |
623 | 661 btfsc dive_turned ; dive turned? |
604 | 662 bcf hi,DECO_CAVE_MODE ; YES - deactivate p2deco cave mode again |
623 | 663 btfsc FLAG_backtrack_full ; backtracking storage full? |
604 | 664 bcf hi,DECO_CAVE_MODE ; YES - deactivate p2deco cave mode again |
665 ENDIF | |
666 | |
667 btfss lo,DECO_MODE_LOOP_FLAG ; NO - has a loop mode calculation been done during the normal plan? | |
623 | 668 bra calc_deco_engine_start ; NO - when not in loop mode, no simulated bailout to be done |
604 | 669 decf best_gas_number,W ; YES - get best gas number -1 into WREG. If not available, WREG will be 255 now. If not computed yet, WREG will be 254 now. |
670 btfsc WREG,7 ; - WREG < 128 (a bailout gas is available)? | |
623 | 671 bra calc_deco_engine_alt_2 ; NO - no simulated bailout possible because no bailout gas available to switch to |
672 bcf lo,DECO_COMPLETED_NORM ; YES - clear flag indicating last plan was a normal one | |
673 bsf lo,DECO_START_ALT ; - set flag to calculate an alternative deco plan next | |
674 bsf lo,DECO_BAILOUT_FLAG ; - set flag for bailout mode (enables gas switches before 1st stop) | |
604 | 675 movf best_gas_number,W ; - put number of best gas into WREG |
676 call deco_setup_oc_gases_pre ; - set up deco calculations in OC mode with OC gases | |
623 | 677 bra calc_deco_engine_start ; - start in alternative plan mode |
678 | |
679 calc_deco_engine_alt_2: | |
680 bcf lo,DECO_START_ALT ; clear flag to calculate an alternative deco plan next | |
681 bsf lo,DECO_START_NORM ; set flag to calculate a normal deco plan next | |
560 | 682 bcf lo,DECO_ASCENT_FLAG ; clear flag for delayed ascent calculation |
623 | 683 bcf hi,DECO_VOLUME_FLAG ; clear flag for gas needs calculation |
604 | 684 IFDEF _cave_mode |
685 bcf hi,DECO_CAVE_MODE ; clear flag for cave mode | |
686 ENDIF | |
687 call inval_alternative_plan_data ; invalidate all alternative (bailout) plan data because they are not applicable any more | |
688 | |
623 | 689 calc_deco_engine_start: |
604 | 690 movff hi,char_O_main_status ; write-back char_O_main_status to deco engine interface |
560 | 691 movff lo,char_O_deco_status ; write-back char_O_deco_status to deco engine interface |
0 | 692 |
623 | 693 calc_deco_engine_cont: |
694 ; +++++++++++++++++++++++++++++++++++++ | |
695 call deco_calc_hauptroutine ; invoke the deco engine (C-code) | |
696 banksel common ; back to bank common | |
697 ; +++++++++++++++++++++++++++++++++++++ | |
698 | |
699 call TFT_debug_output ; debug output of scheduling performance data | |
604 | 700 |
701 ; check if new calculation results for normal plan mode are available | |
623 | 702 movff char_O_deco_status,WREG ; get deco status of deco engine |
703 btfsc WREG,DECO_COMPLETED_NORM ; new calculation results for normal plan available? | |
704 bsf new_deco_data_avail ; YES - set flag for new NDL or deco data available | |
705 return ; done | |
706 | |
707 | |
708 show_new_deco_data: | |
709 bcf new_deco_data_avail ; reset flag for new NDL or deco data available | |
710 movff char_O_deco_info,WREG ; get the deco info vector | |
711 btfsc WREG,deco_stops ; deco stops found? | |
712 bra show_new_deco_data_deco ; YES - in deco | |
713 ;bra show_new_deco_data_ndl ; NO - within NDL | |
714 | |
715 show_new_deco_data_ndl: ; within NDL | |
716 btfsc decostop_active ; been in deco mode before? | |
717 bsf FLAG_TFT_clear_deco_data ; YES - clear old deco data | |
604 | 718 btfsc decostop_active ; been in deco mode before? |
623 | 719 bsf FLAG_TFT_display_ndl_mask ; YES - display NDL data mask |
720 bcf decostop_active ; clear flag for been in deco mode before | |
582 | 721 bsf FLAG_TFT_display_ndl ; display NDL time |
560 | 722 return |
0 | 723 |
623 | 724 show_new_deco_data_deco: ; in deco |
725 btfss decostop_active ; been in deco mode before? | |
726 bsf FLAG_TFT_clear_deco_data ; NO - clear old deco data | |
727 btfss decostop_active ; been in deco mode before? | |
728 bsf FLAG_TFT_display_deco_mask ; NO - display deco data mask | |
604 | 729 bsf decostop_active ; set flag for being in deco mode |
623 | 730 bsf FLAG_TFT_display_tts ; display TTS time (display or stop data is managed somewhere else) |
560 | 731 return |
732 | |
623 | 733 ;============================================================================= |
734 | |
735 IFDEF _external_sensor | |
0 | 736 |
560 | 737 global calc_deko_divemode_sensor |
738 calc_deko_divemode_sensor: | |
739 ; sensor acquisition code | |
623 | 740 btfss s8_digital_avail ; do we have a digital S8 interface? |
582 | 741 bra calc_deko_divemode_sensor_analog ; NO - check if we have an analog interface |
623 | 742 btfss trigger_S8_data_update ; YES - check if a new data frame was received |
743 bra calc_deko_divemode_sensor_common ; NO - use old values | |
744 bcf trigger_S8_data_update ; YES - clear update flag | |
745 call compute_mvolts_for_all_sensors ; - compute mV values from digital data | |
582 | 746 bra calc_deko_divemode_sensor_common |
604 | 747 calc_deko_divemode_sensor_analog: |
748 btfss analog_o2_input ; do we have an analog input? | |
749 bra calc_deko_divemode_sensor_opt ; NO - check if we have an optical interface | |
750 call get_analog_inputs ; YES - get the analog voltages and continue with the common part | |
751 bra calc_deko_divemode_sensor_common | |
583 | 752 calc_deko_divemode_sensor_opt: |
604 | 753 btfss optical_input ; do we have an optical input? |
754 return ; NO - return (we have no sensors at all: not analog, not S8 and not optical) | |
623 | 755 btfss sensor1_active ; YES - sensor1_ppO2, sensor2_ppO2 and sensor3_ppO2 are already filled in ISR |
604 | 756 bcf use_O2_sensor1 ; check HUD status data and eventually clear use_O2_sensorX |
757 btfss sensor2_active | |
758 bcf use_O2_sensor2 | |
583 | 759 btfss sensor3_active |
604 | 760 bcf use_O2_sensor3 |
761 bra calc_deko_divemode_sensor_A ; continue with calculating sensor average | |
560 | 762 |
763 calc_deko_divemode_sensor_common: | |
604 | 764 ; Check each sensor if it is calibrated and if its mV value is within min_mv and max_mv limits. |
765 ; If ok: compute o2_ppo2_sensorX = o2_mv_sensorX * opt_x_sX / 1000 | |
582 | 766 ; If not ok: reset o2_ppo2_sensorX, reset use_O2_sensorX and show the customview 1 in case the sensor was ok before |
0 | 767 |
604 | 768 ; check sensor 1 |
582 | 769 btfss sensor1_calibrated_ok ; check if sensor is usable at all |
770 bra check_sensor_1_fail ; NO - handle it as failed | |
604 | 771 ; check min threshold |
623 | 772 SMOVII sensor1_mv,sub_a ; load sensor mV value |
604 | 773 rcall check_min_threshold |
582 | 774 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
775 bra check_sensor_1_fail ; YES - declare sensor as failed | |
604 | 776 ; check max_threshold |
777 rcall check_max_threshold | |
582 | 778 btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv |
779 bra check_sensor_1_fail ; NO - declare sensor as failed | |
604 | 780 ; check HUD data, if available |
582 | 781 btfss hud_connection_ok ; check if there is a HUD connected |
782 bra check_sensor_1_ok ; NO - all checks done then and positive | |
604 | 783 btfss sensor1_active ; YES - HUD status ok? |
784 bra check_sensor_1_fail ; NO - HUD reports a fail | |
560 | 785 check_sensor_1_ok: |
623 | 786 ; sensor1_ppO2 = sensor1_mv:2 * opt_x_s1:2 / 1000 |
787 SMOVII sensor1_mv,xA | |
788 MOVII opt_x_s1, xB | |
560 | 789 rcall compute_ppo2_helper |
623 | 790 movff xC+0,sensor1_ppO2 ; result in 0.01 bar |
582 | 791 bra check_sensor_2 ; continue with next sensor |
560 | 792 check_sensor_1_fail: |
793 clrf WREG | |
623 | 794 movff WREG,sensor1_ppO2 ; set ppO2 reading to zero |
582 | 795 btfss use_O2_sensor1 ; check if sensor was in use before |
796 bra check_sensor_1_fail_1 ; NO - no new news then | |
623 | 797 call check_sensor_custview_helper; YES - show sensors custom view on further conditions met |
560 | 798 check_sensor_1_fail_1: |
582 | 799 bcf use_O2_sensor1 ; revoke sensor from usage |
604 | 800 |
801 check_sensor_2: ; check min_mv of sensor 2 | |
582 | 802 btfss sensor2_calibrated_ok ; check if sensor is usable at all |
803 bra check_sensor_2_fail ; NO - handle it as failed | |
604 | 804 ; check min threshold |
623 | 805 SMOVII sensor2_mv,sub_a ; load sensor mV value |
604 | 806 rcall check_min_threshold |
582 | 807 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
808 bra check_sensor_2_fail ; YES - declare sensor as failed | |
604 | 809 ; check max_threshold |
810 rcall check_max_threshold | |
582 | 811 btfss neg_flag ; check if result is nagative, i.e. sensor_mv < max_mv |
812 bra check_sensor_2_fail ; NO - declare sensor as failed | |
604 | 813 ; check HUD data, if available |
582 | 814 btfss hud_connection_ok ; check if there is a HUD connected |
815 bra check_sensor_2_ok ; NO - all checks done then and positive | |
604 | 816 btfss sensor2_active ; YES - HUD status ok? |
817 bra check_sensor_2_fail ; NO - HUD reports a fail | |
560 | 818 check_sensor_2_ok: |
623 | 819 ; sensor2_ppO2 = sensor2_mv:2 * opt_x_s2:2 / 1000 |
820 SMOVII sensor2_mv,xA | |
821 MOVII opt_x_s2, xB | |
560 | 822 rcall compute_ppo2_helper |
623 | 823 movff xC+0,sensor2_ppO2 ; result in 0.01 bar |
582 | 824 bra check_sensor_3 ; continue with next sensor |
560 | 825 check_sensor_2_fail: |
826 clrf WREG | |
623 | 827 movff WREG,sensor2_ppO2 ; set ppO2 reading to zero |
582 | 828 btfss use_O2_sensor2 ; check if sensor was in use before |
829 bra check_sensor_2_fail_1 ; NO - no new news then | |
623 | 830 call check_sensor_custview_helper; YES - show sensors custom view on further conditions met |
560 | 831 check_sensor_2_fail_1: |
582 | 832 bcf use_O2_sensor2 ; revoke sensor from usage |
604 | 833 |
834 check_sensor_3: ; check min_mv of sensor 2 | |
582 | 835 btfss sensor3_calibrated_ok ; check if sensor is usable at all |
836 bra check_sensor_3_fail ; NO - handle it as failed | |
604 | 837 ; check min threshold |
623 | 838 SMOVII sensor3_mv,sub_a ; load sensor mV value |
604 | 839 rcall check_min_threshold |
582 | 840 btfsc neg_flag ; check if result is negative, i.e. sensor_mv < min_mv |
841 bra check_sensor_3_fail ; YES - declare sensor as failed | |
604 | 842 ; check max threshold |
843 rcall check_max_threshold | |
582 | 844 btfss neg_flag ; check if result is negative, i.e. sensor_mv < max_mv |
845 bra check_sensor_3_fail ; NO - declare sensor as failed | |
604 | 846 ; check HUD data, if available |
582 | 847 btfss hud_connection_ok ; check if there is a HUD connected |
848 bra check_sensor_3_ok ; NO - all checks done then and positive | |
604 | 849 btfss sensor3_active ; YES - HUD status ok? |
850 bra check_sensor_3_fail ; NO - HUD reports a fail | |
560 | 851 check_sensor_3_ok: |
623 | 852 ; sensor3_ppO2 = sensor3_mv:2 * opt_x_s1:2 / 1000 |
853 SMOVII sensor3_mv,xA | |
854 MOVII opt_x_s3, xB | |
560 | 855 rcall compute_ppo2_helper |
623 | 856 movff xC+0,sensor3_ppO2 ; result in 0.01 bar |
604 | 857 bra calc_deko_divemode_sensor_A ; continue with calculating sensor average |
560 | 858 check_sensor_3_fail: |
859 clrf WREG | |
623 | 860 movff WREG,sensor3_ppO2 ; set ppO2 reading to zero |
582 | 861 btfss use_O2_sensor3 ; check if sensor was in use before |
862 bra check_sensor_3_fail_1 ; NO - no new news then | |
623 | 863 call check_sensor_custview_helper; YES - show sensors custom view on further conditions met |
560 | 864 check_sensor_3_fail_1: |
582 | 865 bcf use_O2_sensor3 ; revoke sensor from usage |
604 | 866 |
867 calc_deko_divemode_sensor_A: ; calculate sensor average | |
623 | 868 btfss divemode ; in dive mode? |
869 return ; NO - done here if not in dive mode | |
560 | 870 |
604 | 871 ; compute sensor_setpoint = average of all o2_ppo2_sensorX of those sensors that have use_O2_sensorX == true |
582 | 872 ; sum up sensor values (in xA:2) and active sensors in (xB:2) |
623 | 873 CLRI xA |
874 CLRI xB | |
604 | 875 divemode_setup_sensor_1_value: |
623 | 876 btfss use_O2_sensor1 ; sensor 1 active? |
604 | 877 bra divemode_setup_sensor_2_value ; NO |
623 | 878 movff sensor1_ppO2,WREG |
604 | 879 addwf xA+0,F |
582 | 880 movlw .0 |
604 | 881 addwfc xA+1,F ; add into xA:2 |
882 incf xB+0,F ; add a sensor | |
883 divemode_setup_sensor_2_value: | |
623 | 884 btfss use_O2_sensor2 ; sensor 2 active? |
604 | 885 bra divemode_setup_sensor_3_value ; NO |
623 | 886 movff sensor2_ppO2,WREG |
604 | 887 addwf xA+0,F |
582 | 888 movlw .0 |
604 | 889 addwfc xA+1,F ; add into xA:2 |
890 incf xB+0,F ; add a sensor | |
891 divemode_setup_sensor_3_value: | |
623 | 892 btfss use_O2_sensor3 ; sensor 3 active? |
604 | 893 bra divemode_setup_sensor_mean ; NO |
623 | 894 movff sensor3_ppO2,WREG |
604 | 895 addwf xA+0,F |
582 | 896 movlw .0 |
604 | 897 addwfc xA+1,F ; add into xA:2 |
898 incf xB+0,F ; add a sensor | |
899 | |
900 ; divide sum of sensor values by number of active sensors found | |
901 divemode_setup_sensor_mean: | |
902 clrf xC+0 ; set zero as default result | |
903 tstfsz xB+0 ; pending div/0 ? | |
904 call div16x16 ; NO - execute xC = xA / xB = summed ppO2 / number of sensors | |
905 movff xC+0,sensor_setpoint ; copy result (or its default) | |
906 | |
907 ; set default value for pSCR mode: 0 => let p2_deco.c compute the ppO2 based on current dil gas and depth | |
560 | 908 ; will be overwritten later in case we are in sensor mode and have at least one usable sensor |
623 | 909 clrf WREG ; pre-load a zero |
604 | 910 btfsc FLAG_pscr_mode ; check if we are in pSCR mode |
911 movff WREG,char_I_const_ppO2 ; YES - write 0 to char_I_const_ppo2, | |
912 ; it will be overwritten if we have a usable sensor reading | |
623 | 913 btfsc bailout_mode ; check if we are in bailout |
604 | 914 bra calc_deko_divemode_sensor_V ; YES - no sensor data transfer to char_I_const_ppO2 in this case |
915 movff opt_ccr_mode,WREG ; NO - get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) | |
916 sublw .1 ; - in sensor mode? | |
917 bnz calc_deko_divemode_sensor_V ; NO - not in sensor mode - no transfer of sensor data to char_I_const_ppO2 | |
918 tstfsz xB+0 ; YES - check if we have found at least one usable sensor | |
919 bra divemode_setup_sensor_mean1 ; YES - we have at least one usable sensor | |
623 | 920 bsf sp_fallback ; NO - we have NO usable sensors -> initiate fallback |
604 | 921 btfss FLAG_ccr_mode ; - check if we are in CCR mode |
922 bra calc_deko_divemode_sensor_V ; NO - continue with voting logic flags | |
623 | 923 movff opt_setpoint_cbar+0,char_I_const_ppO2 ; YES - select fixed setpoint no. 1 for fallback |
604 | 924 bra calc_deko_divemode_sensor_V ; - continue with voting logic flags |
925 ; we have at least one usable sensor with a ppO2 value > 0 | |
926 divemode_setup_sensor_mean1: | |
623 | 927 bcf sp_fallback ; clear fallback condition |
560 | 928 movff sensor_setpoint,char_I_const_ppO2 ; transfer average sensor value to p2_deco.c code |
604 | 929 ; vote sensors |
930 calc_deko_divemode_sensor_V: | |
582 | 931 bsf voting_logic_sensor1 |
623 | 932 movff sensor1_ppO2,lo |
582 | 933 rcall check_sensor_voting_helper |
604 | 934 tstfsz WREG ; sensor within range (WREG = 0)? |
935 bcf voting_logic_sensor1 ; NO - vote out this sensor | |
560 | 936 |
582 | 937 bsf voting_logic_sensor2 |
623 | 938 movff sensor2_ppO2,lo |
582 | 939 rcall check_sensor_voting_helper |
604 | 940 tstfsz WREG ; sensor within range (WREG = 0)? |
941 bcf voting_logic_sensor2 ; NO - vote out this sensor | |
560 | 942 |
582 | 943 bsf voting_logic_sensor3 |
623 | 944 movff sensor3_ppO2,lo |
582 | 945 rcall check_sensor_voting_helper |
604 | 946 tstfsz WREG ; sensor within range (WREG = 0)? |
947 bcf voting_logic_sensor3 ; NO - vote out this sensor | |
582 | 948 |
560 | 949 ; check if a warning shall be issued on sensor disagreement |
582 | 950 btfsc FLAG_ccr_mode ; check if we are in CCR mode |
604 | 951 bra check_warn_sensor_0 ; YES - continue with further checks |
582 | 952 btfsc FLAG_pscr_mode ; check if we are in pSCR mode |
604 | 953 bra check_warn_sensor_0 ; YES - continue with further checks |
954 bra check_warn_sensor_done ; not in CCR and not in pSCR, so no warning | |
955 check_warn_sensor_0: ; we are in CCR or pSCR mode | |
623 | 956 btfsc bailout_mode ; check if we are in bailout |
604 | 957 bra check_warn_sensor_done ; YES - no warning in this case |
958 movff opt_ccr_mode,WREG ; get mode (0: Fixed SP, 1: Sensor, 2: Auto SP) | |
959 sublw .1 ; in sensor mode? | |
960 bnz check_warn_sensor_done ; NO - not in sensor mode - no warning in this case | |
961 ; check sensor 1 | |
962 check_warn_sensor_1: | |
582 | 963 btfss sensor1_calibrated_ok ; check if sensor has a valid calibration |
964 bra check_warn_sensor_2 ; NO - sensor can not cause a warning then | |
965 btfss use_O2_sensor1 ; YES - check if sensor is in use | |
604 | 966 bra check_warn_sensor_2 ; NO - sensor can not cause a warning then |
967 btfsc voting_logic_sensor1 ; YES - check if sensor value is within agreement range | |
968 bra check_warn_sensor_2 ; YES - continue with next sensor | |
623 | 969 bcf o2_sensors_agree ; NO - issue a warning |
560 | 970 return |
604 | 971 ; check sensor 2 |
972 check_warn_sensor_2: | |
582 | 973 btfss sensor2_calibrated_ok ; check if sensor has a valid calibration |
974 bra check_warn_sensor_3 ; NO - sensor can not cause a warning then | |
975 btfss use_O2_sensor2 ; YES - check if sensor is in use | |
604 | 976 bra check_warn_sensor_3 ; NO - sensor can not cause a warning then |
977 btfsc voting_logic_sensor2 ; YES - check if sensor value is within agreement range | |
978 bra check_warn_sensor_3 ; YES - continue with next sensor | |
623 | 979 bcf o2_sensors_agree ; NO - issue a warning |
560 | 980 return |
604 | 981 ; check sensor 3 |
982 check_warn_sensor_3: | |
582 | 983 btfss sensor3_calibrated_ok ; check if sensor has a valid calibration |
984 bra check_warn_sensor_agree ; NO - sensor can not cause a warning then | |
985 btfss use_O2_sensor3 ; YES - check if sensor is in use | |
604 | 986 bra check_warn_sensor_agree ; NO - sensor can not cause a warning then |
987 btfsc voting_logic_sensor3 ; YES - check if sensor value is within agreement range | |
988 bra check_warn_sensor_agree ; YES - continue with next sensor | |
623 | 989 bcf o2_sensors_agree ; NO - issue a warning |
560 | 990 return |
604 | 991 ; no need for a warning |
992 check_warn_sensor_done: | |
560 | 993 check_warn_sensor_agree: |
623 | 994 bsf o2_sensors_agree |
560 | 995 return |
996 | |
604 | 997 check_min_threshold: |
623 | 998 MOVLI min_mv,sub_b ; load minimum mV value |
604 | 999 goto sub16 ; sub_c = sensor_mv - min_mv (and return) |
1000 | |
1001 check_max_threshold: | |
623 | 1002 MOVLI max_mv,sub_b ; load maximum mV value |
604 | 1003 goto sub16 ; sub_c = sensor_mv - max_mv (and return) |
1004 | |
560 | 1005 compute_ppo2_helper: |
623 | 1006 call mult16x16 ; xC:4 = xA:2 * xB:2 |
1007 MOVLI .1000,xB | |
1008 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
1009 tstfsz xC+1 ; is the ppO2 higher than 2.55 bar? | |
1010 setf xC+0 ; YES - set result to 255 aka 2.55 bar | |
582 | 1011 return |
0 | 1012 |
560 | 1013 check_sensor_custview_helper: |
604 | 1014 btfss divemode ; check if we are in dive mode |
582 | 1015 return ; NO - not in dive mode, return |
604 | 1016 movff opt_ccr_mode,WREG ; YES - =0: Fixed SP, =1: Sensor, =2: Auto SP |
1017 decfsz WREG,W ; - opt_ccr_mode = 1 (sensors)? | |
1018 return ; NO - not using the sensors in the moment | |
623 | 1019 show_sensors_custview: |
1020 movlw index_ppo2_sensors-1 ; YES - custom view number one below ppO2 sensors | |
1021 movwf active_customview ; - set custom view number | |
1022 bsf request_next_custview ; - initiate toggle to desired custom view -> ppO2 sensors | |
560 | 1023 return |
1024 | |
1025 check_sensor_voting_helper: | |
582 | 1026 movf lo,W |
1027 cpfsgt sensor_setpoint | |
604 | 1028 bra check_sensor_voting_helper2 ; lo < sensor_setpoint |
582 | 1029 ; lo > sensor_setpoint |
1030 movf lo,W | |
1031 subwf sensor_setpoint,W | |
1032 movwf lo | |
604 | 1033 check_sensor_voting_helper1: |
1034 movlw sensor_voting_logic_threshold ; threshold in 0.01 bar | |
582 | 1035 cpfsgt lo |
604 | 1036 retlw .0 ; within range |
1037 retlw .1 ; out of range | |
1038 check_sensor_voting_helper2: | |
1039 ; lo < sensor_setpoint | |
582 | 1040 movf sensor_setpoint,W |
1041 subwf lo,F | |
604 | 1042 bra check_sensor_voting_helper1 |
582 | 1043 |
623 | 1044 ENDIF ; _external_sensor |
1045 | |
1046 ;============================================================================= | |
560 | 1047 |
604 | 1048 divemodemode_togglegf: ; toggle aGF/GF |
623 | 1049 bcf request_toggle_GF ; clear request flag |
1050 btg use_aGF ; toggle normal / alternative GF factor selection | |
1051 btfsc use_aGF ; alternative GF factors activated? | |
582 | 1052 bra divemodemode_togglegf_1 ; YES - branch to using aGF |
623 | 1053 movff opt_GF_low, char_I_GF_Low_percentage ; NO - use normal GF factor low |
1054 movff opt_GF_high,char_I_GF_High_percentage ; - use normal GF factor high | |
604 | 1055 bra divemodemode_togglegf_2 ; - continue with common part |
1056 divemodemode_togglegf_1: | |
623 | 1057 movff opt_aGF_low, char_I_GF_Low_percentage ; YES - use alternative GF factor low |
1058 movff opt_aGF_high,char_I_GF_High_percentage ; - use alternative GF factor high | |
582 | 1059 divemodemode_togglegf_2: |
604 | 1060 call TFT_gf_factors_mask ; update custom view mask to show which one is in use |
1061 ; the custom view itself has been called from divemenu_tree before | |
582 | 1062 goto restart_deco_engine ; ...and return |
560 | 1063 |
623 | 1064 ;============================================================================= |
560 | 1065 |
604 | 1066 IFDEF _cave_mode |
623 | 1067 |
604 | 1068 divemodemode_toggleturn: |
623 | 1069 bcf request_turn_dive ; clear request flag |
1070 btg dive_turned ; toggle dive turned state | |
1071 btfsc FLAG_backtrack_full ; backtracking storage full? | |
1072 bsf dive_turned ; YES - allow only activating turned state | |
604 | 1073 goto set_logbook_marker ; set a logbook marker (and return) |
623 | 1074 |
604 | 1075 ENDIF |
1076 | |
623 | 1077 ;============================================================================= |
1078 | |
1079 calc_velocity: ; called every two seconds | |
1080 btfsc velocity_active_num ; was velocity shown in last cycle? | |
1081 bra calc_velocity_1 ; YES - always update if shown before | |
1082 btfss count_divetime ; NO - is the dive time counted, i.e. deeper than dive threshold? | |
1083 return ; NO - display velocity only if deeper than 1m, | |
1084 ; i.e. not at the surface after the dive | |
1085 calc_velocity_1: | |
1086 ; calculate pressure difference | |
1087 MOVII pressure_abs_cached, sub_a; current pressure | |
1088 MOVII last_pressure_velocity,sub_b; last pressure | |
1089 call subU16 ; do an unsigned subtraction | |
1090 | |
1091 ; decide if ascending or descending | |
1092 bcf neg_flag_velocity ; set to ascending by default | |
1093 btfsc neg_flag ; pressure differential negative? | |
1094 bsf neg_flag_velocity ; YES - descending | |
1095 | |
1096 ; store current pressure as last pressure for next round | |
1097 MOVII pressure_abs_cached,last_pressure_velocity | |
1098 | |
1099 ; calculate velocity in m/min | |
1100 MOVII sub_c,xA ; copy pressure differential to xA | |
1101 MOVLI .39,xB ; put scale coefficient into xB (use 77 when called every second) | |
628 | 1102 call mult16x16 ; compute differential pressure in mbar * scale coefficient |
623 | 1103 MOVII xC,divA ; copy result to divA |
628 | 1104 ADDLI .64,divA ; add some round-up TODO: too sensitive with this? |
623 | 1105 movlw .7 ; divide by 2^7 |
1106 call div16 ; divA = divA / 2^WREG, yields velocity in m/min | |
1107 | |
1108 movlw .99 ; load a 99 | |
1109 cpfslt divA+0 ; velocity < 99 m/min ? | |
1110 movwf divA+0 ; NO - limit to 99 m/min | |
1111 | |
1112 bcf STATUS,C ; clear carry flag | |
1113 movlw velocity_display_threshold ; get threshold for displaying vertical velocity | |
1114 subwf divA+0,W ; subtract threshold from velocity | |
1115 btfss STATUS,C ; above threshold? | |
1116 bsf FLAG_TFT_velocity_clear ; NO - don't show / request to clear | |
1117 btfsc STATUS,C ; above threshold? | |
1118 bsf FLAG_TFT_velocity_show ; YES - request to show | |
1119 return ; done | |
0 | 1120 |
1121 | |
1122 ;============================================================================= | |
1123 | |
628 | 1124 check_deco_states: |
1125 btfsc deco_region ; been within the deco stops region before? | |
1126 return ; YES - been in deco then before too, done | |
1127 movff char_O_deco_info,WREG ; NO - get deco info vector | |
1128 btfss WREG,deco_stops ; do we have a deco obligation right now? | |
1129 return ; NO - done | |
1130 bsf deco_locked ; YES - memorize dive was in deco | |
1131 movff char_O_deco_depth+0,WREG ; - get depth of first stop in meters into WREG | |
1132 addlw deco_region_distance+.1 ; - add deco region start distance + 1 meter for the negative test to work | |
1133 subwf depth_meter,W ; - compute current depth - (first stop depth + deco distance) | |
1134 btfss STATUS,C ; - result negative? | |
1135 bsf deco_region ; YES - memorize to have entered the deco stops region | |
1136 return ; - done | |
1137 | |
1138 ;============================================================================= | |
1139 | |
623 | 1140 safety_stop_control: |
604 | 1141 TSTOSS opt_enable_safetystop ; safety stop enabled? (=1: show safety stop) |
623 | 1142 return ; NO - done |
1143 | |
1144 btfsc FLAG_gauge_mode ; in gauge mode? | |
1145 return ; YES - omit (well, else fix collision of safety stop output with avg depth label) | |
1146 | |
1147 ; setup | |
1148 bcf safety_stop_enabled ; disable safety stop by default | |
1149 | |
1150 ; check for deco | |
1151 btfsc decostop_active ; in deco mode? | |
1152 bra safety_stop_finish ; YES - shut down safety stop | |
1153 | |
1154 ; below "opt_safety_stop_reset"? | |
1155 MOVII pressure_rel_cur_cached,mpr ; get current depth into hi:lo | |
1156 call adjust_depth_with_salinity ; compute salinity setting into hi:lo [mbar] | |
1157 MOVII mpr,sub_a ; move adjusted depth to sub_a | |
1158 movff opt_safety_stop_reset,WREG ; load safety stop reset threshold [cbar] | |
1159 mullw .10 ; convert threshold from [cbar] to [mbar] | |
1160 MOVII PROD,sub_b ; move threshold to sub_b | |
1161 call cmpU16 ; sub_a - sub_b | |
1162 btfss neg_flag ; below threshold depth? | |
1163 bra safety_stop_reset ; YES - arm safety stop and delete it from display if still shown | |
1164 | |
1165 ; above "opt_safety_stop_end"? | |
1166 movff opt_safety_stop_end,WREG ; load safety stop end threshold [cbar] | |
1167 mullw .10 ; convert threshold from [cbar] to [mbar] | |
1168 MOVII PROD,sub_b ; move threshold to sub_b | |
1169 call cmpU16 ; sub_a - sub_b | |
1170 btfsc neg_flag ; above or at threshold depth? | |
1171 bra safety_stop_finish ; YES - finish with safety stop | |
1172 | |
1173 ; above "opt_safety_stop_start"? | |
1174 movff opt_safety_stop_start,WREG ; load safety stop start threshold [cbar] | |
1175 mullw .10 ; convert threshold from [cbar] to [mbar] | |
1176 MOVII PROD,sub_b ; move threshold to sub_b | |
1177 call cmpU16 ; sub_a - sub_b | |
1178 btfss neg_flag ; above or at threshold depth? | |
1179 return ; NO - pause safety stop | |
1180 tstfsz safety_stop_countdown ; YES - safety stop armed? | |
1181 bsf safety_stop_enabled ; YES - enable safety stop | |
1182 return ; NO - done | |
1183 | |
1184 safety_stop_show: | |
1185 btfss safety_stop_enabled ; safety stop enabled? | |
1186 return ; NO - done | |
1187 dcfsnz safety_stop_countdown,F ; YES - decrement remaining stop time, reached zero? | |
1188 bra safety_stop_finish ; YES - finished with safety stop | |
1189 bsf FLAG_TFT_safety_stop_show ; NO - request to show safety stop | |
1190 return ; - done | |
1191 | |
1192 safety_stop_finish: | |
1193 clrf safety_stop_countdown ; disarm safety stop | |
1194 bcf safety_stop_enabled ; disable safety stop | |
1195 bsf FLAG_TFT_safety_stop_clear ; request to clear safety stop | |
1196 return ; done | |
1197 | |
1198 safety_stop_reset: | |
1199 movff opt_safety_stop_length,safety_stop_countdown ; arm safety stop (load timer) | |
1200 incf safety_stop_countdown,F ; +1 because safety_stop_show does decrement first | |
1201 bsf FLAG_TFT_safety_stop_clear ; request to clear safety stop | |
1202 return ; done | |
428 | 1203 |
104
223579e905c3
Show a Safety Stop if enabled (Menu "Deco Parameters")
heinrichsweikamp
parents:
102
diff
changeset
|
1204 |
223579e905c3
Show a Safety Stop if enabled (Menu "Deco Parameters")
heinrichsweikamp
parents:
102
diff
changeset
|
1205 ;============================================================================= |
223579e905c3
Show a Safety Stop if enabled (Menu "Deco Parameters")
heinrichsweikamp
parents:
102
diff
changeset
|
1206 |
0 | 1207 timeout_menuview: |
623 | 1208 btfss trigger_timeout ; timeout occurred? |
1209 return ; NO - done | |
1210 goto menuview_toggle_reset ; YES - terminate the pre-menu and return | |
0 | 1211 |
1212 timeout_divemode_menu: | |
623 | 1213 btfss trigger_timeout ; timeout occurred? |
1214 return ; NO - done | |
1215 ;bra timeout_divemode_menu2 ; YES - clean up main menu and restore dive data | |
0 | 1216 |
582 | 1217 global timeout_divemode_menu2 |
604 | 1218 timeout_divemode_menu2: ; called from divemenu_tree.asm |
623 | 1219 bcf dive_main_menu ; timeout, clear flag for dive mode menu shown |
604 | 1220 call TFT_clear_divemode_menu ; clear menu |
1221 bsf FLAG_TFT_active_gas_divemode; redraw gas/setpoint/diluent | |
623 | 1222 bcf better_gas_blinking ; clear flag to have temperature updated once |
1223 bcf better_dil_blinking ; clear flag to have temperature updated once | |
1224 bsf FLAG_TFT_temperature ; display temperature (or resettable dive time when in compass view) | |
1225 | |
1226 request_redraw_NDL_deco_data: | |
1227 btfsc FLAG_gauge_mode ; in gauge mode? | |
1228 return ; YES - done | |
1229 btfss decostop_active ; NO - in deco mode? | |
1230 bra timeout_divemode_menu_ndl ; NO - show NDL again | |
1231 ;bra timeout_divemode_menu_deco ; YES - show deco again | |
1232 | |
1233 timeout_divemode_menu_deco: | |
1234 bsf FLAG_TFT_display_deco_mask ; show deco mask | |
1235 bsf FLAG_TFT_display_deco ; show deco stop | |
1236 bsf FLAG_TFT_display_tts ; show TTS time | |
1237 return ; done | |
582 | 1238 |
1239 timeout_divemode_menu_ndl: | |
623 | 1240 bsf FLAG_TFT_display_ndl_mask ; show NDL mask |
1241 bsf FLAG_TFT_display_ndl ; show NDL time | |
1242 return ; done | |
0 | 1243 |
1244 timeout_divemode: | |
623 | 1245 btfsc dive_main_menu ; main dive menu shown? |
1246 rcall timeout_divemode_menu ; YES - check the timeout for it | |
1247 | |
1248 btfsc dive_options_menu ; pre-menu shown? | |
1249 rcall timeout_menuview ; YES - check the timeout for it | |
1250 | |
1251 btfss divetime_longer_1min ; does dive already last for longer than one minute? | |
1252 return ; NO - suspend timeout | |
604 | 1253 |
1254 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
623 | 1255 bra timeout_divemode_apnoe ; YES - use apnoe timeout |
1256 | |
1257 IFNDEF _DEBUG | |
1258 btfsc sensor_override_active ; in simulator mode? | |
1259 bra timeout_divemode_sim ; YES - use simulator timeout | |
1260 ;bra timeout_divemode_dive ; NO - use normal dive timeout | |
604 | 1261 ENDIF |
1262 | |
623 | 1263 timeout_divemode_dive: |
1264 movff opt_diveTimeout,WREG ; get dive timeout in minutes into WREG | |
1265 ;bra timeout_divemode_com_min | |
1266 | |
1267 timeout_divemode_com_min: | |
1268 mullw .60 ; multiply with 60 to convert minutes in WREG to seconds | |
1269 MOVII PRODL,sub_a ; copy resulting seconds to sub_a | |
1270 timeout_divemode_com_sec: | |
1271 MOVII dive_timeout_timer,sub_b ; copy current timeout timer value to sub_b | |
1272 INCI dive_timeout_timer ; increment timeout timer | |
1273 call cmpU16 ; check sub_a - sub_b | |
1274 btfsc neg_flag ; result negative, i.e. timeout? | |
1275 bcf divemode ; YES - terminate dive mode | |
1276 return ; done | |
1277 | |
1278 timeout_divemode_apnoe: | |
1279 movlw apnoe_timeout ; get apnoe timeout in minutes into WREG | |
1280 bra timeout_divemode_com_min ; continue with common part for minutes | |
1281 | |
1282 timeout_divemode_sim: | |
1283 MOVLI simulator_timeout,sub_a ; get simulator timeout in seconds directly into sub_a | |
1284 bra timeout_divemode_com_sec ; continue with common part for seconds | |
1285 | |
1286 | |
1287 update_divemode60: ; tasks every full minute | |
1288 bcf trigger_full_minute ; clear flag | |
1289 call get_battery_voltage ; get battery voltage | |
1290 rcall set_powersafe ; check if battery is low | |
604 | 1291 IFDEF _cave_mode |
1292 movlw .1 ; prepare to add backtrack data for 1 minute | |
623 | 1293 btfsc cave_mode ; cave mode switched on? |
1294 rcall update_backtrack ; YES - store backtracking data | |
604 | 1295 ENDIF |
623 | 1296 btfss sensor_override_active ; in simulator mode? |
604 | 1297 return ; NO - done |
1298 movlw .20 ; YES - quite dive mode simulation after 21 * 256 sec = 89 min : 36 sec | |
623 | 1299 cpfsgt total_divetime_secs+1 ; - timeout? |
1300 return ; NO - done | |
1301 IFDEF _DEBUG | |
1302 return ; YES - but no timeout in debug mode | |
604 | 1303 ENDIF |
623 | 1304 bra divemode_option1 ; YES - set depth to 0 m and "return" |
1305 | |
1306 ;============================================================================= | |
604 | 1307 |
1308 IFDEF _cave_mode | |
623 | 1309 |
604 | 1310 update_backtrack: |
623 | 1311 btfsc dive_turned ; dive turned? |
604 | 1312 return ; YES - done |
628 | 1313 btfsc FLAG_backtrack_full ; NO - backtracking storage full? |
623 | 1314 return ; YES - done |
628 | 1315 movwf lo ; NO - store minutes to add in lo |
1316 lfsr FSR1,char_I_backtrack_depth ; - load FSR1 with base address of backtrack storage | |
1317 movff char_I_backtrack_time,FSR1L ; - adjust FSR1 to last index | |
1318 update_backtrack_loop: | |
1319 movff depth_meter,PREINC1 ; increment index and write current depth to backtrack storage | |
1320 incfsz FSR1L,W ; increment index once more and dump to WREG, did a wrap-around occur (backtrack storage full)? | |
1321 bra update_backtrack_loop_1 ; NO - continue loop | |
1322 bsf FLAG_backtrack_full ; YES - flag backtracking storage is full | |
1323 return ; - done | |
604 | 1324 update_backtrack_loop_1: |
1325 decfsz lo,F ; decrement loop counter, did it became zero? | |
1326 bra update_backtrack_loop ; NO - loop | |
623 | 1327 movff FSR1L,char_I_backtrack_time ; YES - store updated index |
604 | 1328 return ; - done |
623 | 1329 |
604 | 1330 ENDIF |
0 | 1331 |
623 | 1332 ;============================================================================= |
0 | 1333 |
1334 global set_dive_modes | |
1335 set_dive_modes: | |
623 | 1336 SMOVII pressure_rel_cur,sub_a ; ISR-safe 2 byte copy of current relative pressure to sub_a |
1337 bra set_dive_modes_1 | |
1338 check_dive_modes: | |
1339 MOVII pressure_rel_cur_cached,sub_a; copy cached relative pressure to sub_a | |
1340 set_dive_modes_1: | |
1341 btfss high_altitude_mode ; in high altitude mode? | |
1342 bra set_dive_modes_norm ; NO - use normal start-dive threshold | |
1343 btfsc divetime_longer_1min ; YES - dive lasted longer than one minute? | |
1344 bra set_dive_modes_norm ; YES - this is a real dive -> use normal start-dive threshold | |
1345 ;bra set_dive_modes_high ; NO - use hight-altitude start-dive threshold | |
1346 | |
1347 ; high altitude start/end dive thresholds | |
1348 set_dive_modes_high: | |
1349 btfss count_divetime ; dive time counting, i.e. already in the dive? | |
1350 bra set_dive_modes_high_start ; NO - select start threshold | |
1351 ;bra set_dive_modes_high_end ; YES - select end threshold | |
1352 | |
1353 set_dive_modes_high_end: | |
1354 MOVLI dive_threshold_high_alt_end,sub_b | |
1355 bra set_dive_modes_comm | |
1356 | |
1357 set_dive_modes_high_start: | |
1358 MOVLI dive_threshold_high_alt_start,sub_b | |
1359 bra set_dive_modes_comm | |
1360 | |
1361 ; normal altitude start/end dive thresholds | |
1362 set_dive_modes_norm: | |
1363 btfss count_divetime ; dive time counting, i.e. already in the dive? | |
1364 bra set_dive_modes_norm_start ; NO - select start threshold | |
1365 ;bra set_dive_modes_norm_end ; YES - select end threshold | |
1366 | |
1367 set_dive_modes_norm_end: | |
1368 MOVLI dive_threshold_norm_alt_end,sub_b | |
1369 bra set_dive_modes_comm | |
1370 | |
1371 set_dive_modes_norm_start | |
1372 MOVLI dive_threshold_norm_alt_start,sub_b | |
1373 ;bra set_dive_modes_comm | |
1374 | |
1375 set_dive_modes_comm: | |
1376 call cmpU16 ; sub_a - sub_b = pressure_rel_cur - start-dive threshold | |
1377 btfsc neg_flag ; pressure_rel_cur > dive_threshold, i.e. deeper than threshold? | |
1378 bra set_dive_modes_shallow ; NO - shallower than threshold | |
1379 btfsc divetime_longer_1min ; YES - dive lasted longer than one minute? | |
1380 CLRI dive_timeout_timer ; YES - reset timeout counter | |
1381 bsf divemode ; - set dive mode flag | |
1382 bsf count_divetime ; - count dive time | |
1383 return ; - done | |
1384 set_dive_modes_shallow: | |
1385 bcf count_divetime ; NO - stop counting dive time | |
1386 btfss divetime_longer_1min ; - dive lasted longer than one minute? | |
1387 bcf divemode ; NO - quit dive mode as this was no real dive | |
1388 return ; done | |
1389 | |
0 | 1390 |
1391 set_powersafe: | |
628 | 1392 movlw battery_warn_level_36+1 ; get threshold for 3.6 Volt battery warning, incremented by 1 |
1393 btfss battery_is_36v ; actually a 3.6 Volt battery detected? | |
1394 movlw battery_warn_level_15+1 ; NO - replace with 1.5 Volt battery warning, incremented by 1 | |
1395 cpfslt batt_percent ; current battery level > warning threshold ? | |
623 | 1396 return ; YES - ok, done |
1397 movlw d'7' ; NO - set type of alarm = battery low | |
1398 movwf alarm_type ; - copy to alarm register | |
1399 bsf event_occured ; - set event flag | |
1400 movlw .0 ; - coding of brightness level ECO | |
1401 movff WREG,opt_brightness ; - set brightness to ECO | |
1402 return ; - done | |
1403 | |
1404 | |
1405 clear_resettable_average_depth: | |
1406 ; prime the resettable average depth with 0 | |
1407 CLRI pressure_rel_avg_trip | |
1408 bra reset_resettable_average_depth1 | |
1409 | |
1410 reset_resettable_average_depth: | |
1411 ; clear reset-average request | |
1412 bcf request_reset_avg | |
1413 | |
1414 ; prime the resettable average depth with the current relative pressure (depth) | |
1415 MOVII pressure_rel_cur_cached,pressure_rel_avg_trip | |
1416 | |
1417 reset_resettable_average_depth1: | |
1418 ; clear the resettable depth accumulator | |
1419 clrf pressure_rel_accu_trip+0 | |
1420 clrf pressure_rel_accu_trip+1 | |
1421 clrf pressure_rel_accu_trip+2 | |
1422 clrf pressure_rel_accu_trip+3 | |
1423 | |
1424 ; clear the resettable time accumulator | |
1425 CLRI divesecs_avg_trip | |
604 | 1426 return |
1427 | |
1428 | |
0 | 1429 calc_average_depth: |
623 | 1430 ; 1. compute pressure_rel_cur_cached x 2, because this routine is called every 2nd second only |
1431 | |
1432 ; copy current rel pressure to xB | |
1433 MOVII pressure_rel_cur_cached,xB | |
1434 | |
1435 ; multiply rel pressure x 2 (via shift left) | |
582 | 1436 bcf STATUS,C |
623 | 1437 rlcf xB+0,F |
1438 rlcf xB+1,F | |
1439 | |
1440 ; 2a add (pressure_rel_cur_cached x 2) to the resettable depth accumulator | |
1441 ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) | |
604 | 1442 movf xB+0,W |
623 | 1443 addwf pressure_rel_accu_trip+0,F |
604 | 1444 movf xB+1,W |
623 | 1445 addwfc pressure_rel_accu_trip+1,F |
604 | 1446 movlw .0 |
623 | 1447 addwfc pressure_rel_accu_trip+2,F |
1448 addwfc pressure_rel_accu_trip+3,F | |
1449 | |
1450 ; 2b add (pressure_rel_cur_cached x 2) to the total depth accumulator | |
1451 ; will work up to 9999 mbar * 60 * 60 * 24 = 863913600 mbar (24h @ 90 m depth) | |
604 | 1452 movf xB+0,W |
623 | 1453 addwf pressure_rel_accu_total+0,F |
604 | 1454 movf xB+1,W |
623 | 1455 addwfc pressure_rel_accu_total+1,F |
604 | 1456 movlw .0 |
623 | 1457 addwfc pressure_rel_accu_total+2,F |
1458 addwfc pressure_rel_accu_total+3,F | |
1459 | |
1460 ; 3a compute the resettable average depth | |
1461 | |
1462 ; get the accumulated depth | |
1463 movff pressure_rel_accu_trip+0,xC+0 | |
1464 movff pressure_rel_accu_trip+1,xC+1 | |
1465 movff pressure_rel_accu_trip+2,xC+2 | |
1466 movff pressure_rel_accu_trip+3,xC+3 | |
1467 | |
1468 ; get the accumulated time | |
1469 MOVII divesecs_avg_trip,xB | |
1470 | |
1471 ; divide accumulated depth by accumulated time | |
604 | 1472 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder |
623 | 1473 |
1474 ; store result | |
1475 MOVII xC,pressure_rel_avg_trip ; resettable average depth | |
1476 btfss count_divetime ; is dive time counted? | |
604 | 1477 return ; NO (e.g. too shallow) |
1478 | |
623 | 1479 ; 3b compute the dive total average depth |
1480 | |
1481 ; get accumulated depth | |
1482 movff pressure_rel_accu_total+0,xC+0 | |
1483 movff pressure_rel_accu_total+1,xC+1 | |
1484 movff pressure_rel_accu_total+2,xC+2 | |
1485 movff pressure_rel_accu_total+3,xC+3 | |
1486 | |
1487 ; get accumulated time | |
1488 MOVII divesecs_avg_total,xB | |
1489 | |
1490 ; divide accumulated depth by accumulated time | |
1491 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder | |
1492 | |
1493 ; store result | |
1494 MOVII xC,pressure_rel_avg_total ; total dive average depth | |
1495 | |
1496 btfsc request_reset_avg ; shall reset the resettable average depth? | |
1497 rcall reset_resettable_average_depth ; YES - reset the resettable average depth | |
1498 | |
1499 TSTOSC opt_2ndDepthDisp ; drawing average depth instead of max depth? | |
1500 bsf FLAG_TFT_depth_maximum ; YES - flag to update display | |
1501 | |
1502 btfsc FLAG_gauge_mode ; in gauge mode? | |
1503 bsf FLAG_TFT_depth_maximum ; YES - flag to update display (needed for alternative layout) | |
1504 | |
1505 return ; done | |
1506 | |
1507 | |
1508 test_switches_divemode: ; checks switches in dive mode, called every second | |
1509 btfsc dive_main_menu ; dive mode menu shown? | |
604 | 1510 bra test_switches_divemode_menu ; YES - use menu processor |
1511 btfsc switch_left ; NO - left button pressed? | |
1512 goto menuview_toggle ; YES - menu or simulator tasks; and return... | |
1513 btfss switch_right ; NO - right button pressed? | |
1514 return ; NO - done | |
623 | 1515 bcf switch_right ; YES - clear button event |
1516 tstfsz active_premenu ; - any pre-menu task selected? | |
1517 bra test_switches_divemode1 ; YES - do option or menu tasks | |
1518 bsf request_next_custview ; NO - request next custom view | |
604 | 1519 return ; - done |
0 | 1520 |
1521 test_switches_divemode_menu: | |
623 | 1522 btfsc switch_left ; left button pressed? |
1523 bra test_switches_divemode_menu2 ; YES - move cursor | |
1524 btfsc switch_right ; NO - right button pressed? | |
1525 bra test_switches_divemode_menu3 ; YES - enter sub-menu or do something | |
1526 btfss update_menu ; NO - shall update the menu? | |
1527 return ; NO - done | |
1528 bcf update_menu ; YES - clear request | |
1529 goto menu_draw_lines_divemode ; - redraw the menu (to update color coding) and return | |
0 | 1530 |
1531 test_switches_divemode_menu1: | |
623 | 1532 clrf menu_pos_cur |
0 | 1533 test_switches_divemode_menu2: |
582 | 1534 bcf switch_left |
623 | 1535 incf menu_pos_cur,F |
1536 incf menu_pos_max,W ; menu_pos_max + 1 -> WREG | |
1537 cpfslt menu_pos_cur ; > menu_pos_max ? | |
1538 bra test_switches_divemode_menu1 ; YES - set to 1 | |
1539 call TFT_show_menu_cursor_divemode ; update the cursor | |
1540 movlw divemode_timeout_mainmenu ; get timeout for main menu | |
1541 call reset_timeout_time ; reset timeout | |
582 | 1542 return |
0 | 1543 |
623 | 1544 test_switches_divemode_menu3: ; enter sub-menu or do something |
582 | 1545 bcf switch_right |
623 | 1546 ; decf menu_pos_cur,F ; menu_processor needs 0-5... |
1547 goto do_line_menu ; Warning! trashes STKPTR and returns to diveloop_menu_exit | |
0 | 1548 |
1549 test_switches_divemode1: | |
623 | 1550 movlw divemode_timeout_premenu ; get timeout for pre-menu |
1551 call reset_timeout_time ; reset timeout | |
1552 movff active_premenu,WREG ; get number of active pre-menu | |
0 | 1553 dcfsnz WREG,F |
604 | 1554 bra divemode_option_gaschange ; switch to the the "better gas" / "better diluent" |
137 | 1555 dcfsnz WREG,F |
623 | 1556 bra divemode_option0 ; start/setup dive mode menu |
0 | 1557 dcfsnz WREG,F |
604 | 1558 bra divemode_option1 ; quit simulation? |
0 | 1559 dcfsnz WREG,F |
604 | 1560 bra divemode_option2 ; descent 1m |
0 | 1561 dcfsnz WREG,F |
623 | 1562 bra divemode_option3 ; ascend 1m |
0 | 1563 dcfsnz WREG,F |
623 | 1564 bra divemode_option4 ; quit apnoe mode |
0 | 1565 dcfsnz WREG,F |
604 | 1566 bra divemode_option5 ; reset stopwatch (gauge mode only) |
216
973a0969e0ac
NEW: On-board simulator can increase divetime in 5min steps
heinrichsweikamp
parents:
206
diff
changeset
|
1567 dcfsnz WREG,F |
623 | 1568 bra divemode_option6 ; +5 min simulation |
254
5fe7aff622f3
preparations to set a course for the compass display
heinrichsweikamp
parents:
239
diff
changeset
|
1569 dcfsnz WREG,F |
623 | 1570 IFDEF _compass |
604 | 1571 bra divemode_option7 ; store heading |
623 | 1572 ELSE |
1573 return ; should never happen without compass | |
1574 ENDIF | |
560 | 1575 dcfsnz WREG,F |
623 | 1576 bra divemode_option8 ; switch layout |
582 | 1577 return |
0 | 1578 |
623 | 1579 |
0 | 1580 gas_switched_common: |
623 | 1581 bcf request_gaschange ; clear request flag |
1582 IFDEF _ccr_pscr | |
1583 btfss request_back_to_loop ; is a switchback from OC bailout to loop requested? | |
582 | 1584 bra gas_switched_common0 ; NO - continue with checking if selected gas is valid |
623 | 1585 bcf request_back_to_loop ; YES - clear flag |
1586 movff active_dil,menu_pos_cur ; - reload last diluent | |
1587 bra gas_switched_common1 ; - continue with common part | |
1588 ENDIF | |
582 | 1589 gas_switched_common0: |
623 | 1590 tstfsz menu_pos_cur ; menu_pos_cur = 0 ? |
582 | 1591 bra gas_switched_common1 ; NO - valid gas |
1592 return ; YES - something went wrong, invalid gas, abort | |
560 | 1593 gas_switched_common1: |
623 | 1594 movf menu_pos_cur,W ; get selected gas into WREG (1-6) |
1595 IFDEF _ccr_pscr | |
604 | 1596 btfsc FLAG_oc_mode ; in OC mode? |
1597 bra gas_switched_common_OC ; YES | |
623 | 1598 btfsc bailout_mode ; in bailout? |
604 | 1599 bra gas_switched_common_OC ; YES |
1600 gas_switched_common_loop: ; NO to both - must be loop mode then | |
1601 rcall setup_dil_registers ; with WREG = diluent 1-6 | |
1602 rcall deco_setup_cc_diluents ; with WREG = diluent 1-6 | |
560 | 1603 bra gas_switched_common3 |
623 | 1604 ENDIF |
604 | 1605 gas_switched_common_OC: |
1606 rcall setup_gas_registers ; with WREG = Gas 1-6 | |
1607 rcall deco_setup_oc_gases ; with WREG = Gas 1-6 | |
560 | 1608 gas_switched_common3: |
605 | 1609 banksel int_O_breathed_ppO2 |
1610 bcf int_O_breathed_ppO2+1,int_low_flag ; | clear all flags that control color-coding | |
1611 bcf int_O_breathed_ppO2+1,int_high_flag ; | to have the new gas initially displayed in | |
1612 bcf int_O_breathed_ppO2+1,int_attention_flag ; | memo color instead of a warning or attention | |
1613 bcf int_O_breathed_ppO2+1,int_warning_flag ; | color that belonged to the previous gas | |
1614 banksel common | |
1615 bsf FLAG_TFT_active_gas_divemode ; redraw gas/setpoint/diluent | |
1616 call restart_deco_engine_wo_ceiling ; abort any running deco calculations and restart the deco engine | |
604 | 1617 ; set flags for profile recording |
623 | 1618 bsf event_occured ; set global event flag |
1619 IFDEF _ccr_pscr | |
1620 btfsc bailout_mode ; in bailout mode? | |
1621 bsf event_bailout ; YES - set gas change event due to bailout | |
1622 btfss bailout_mode ; in bailout mode? | |
1623 ENDIF | |
1624 bsf event_gas_change ; NO - set gas change event (normal change) | |
0 | 1625 return |
1626 | |
560 | 1627 |
1628 ; Code to pass all parameters to the C code | |
1629 | |
582 | 1630 global get_first_gas_to_WREG |
604 | 1631 get_first_gas_to_WREG: ; gets first gas (1-5) into WREG |
623 | 1632 lfsr FSR1,opt_gas_type ; load base address of the gas types |
604 | 1633 clrf lo ; start with gas 0 |
560 | 1634 get_first_gas_to_WREG2: |
623 | 1635 movf lo,W ; set index |
1636 movf PLUSW1,W ; get type of gas (0=Disabled, 1=First, 2=Travel, 3=Deco) | |
1637 sublw .1 ; is it of type First? | |
1638 bz get_first_gas_to_WREG3 ; YES - found the First gas | |
1639 incf lo,F ; NO - increment index | |
1640 movlw NUM_GAS+1 ; - get highest index+1 | |
1641 cpfseq lo ; - all gases checked? | |
1642 bra get_first_gas_to_WREG2 ; NO - not yet | |
628 | 1643 movlw .1 ; YES - default to gas 1 |
1644 movff WREG,opt_gas_type+0 ; - force it to be of type First | |
623 | 1645 return ; - done |
560 | 1646 get_first_gas_to_WREG3: |
623 | 1647 movf lo,W ; copy index of gas found to be the First to WREG |
1648 incf WREG,W ; turn index into gas number (0-4 -> 1-5) | |
604 | 1649 return ; done |
560 | 1650 |
623 | 1651 ;============================================================================= |
1652 | |
1653 IFDEF _ccr_pscr | |
1654 | |
582 | 1655 global get_first_dil_to_WREG |
604 | 1656 get_first_dil_to_WREG: ; gets first dil (1-5) into WREG |
623 | 1657 lfsr FSR1,opt_dil_type ; load base address of the dil types |
604 | 1658 clrf lo ; start with dil 0 |
560 | 1659 get_first_dil_to_WREG2: |
623 | 1660 movf lo,W ; set index |
1661 movf PLUSW1,W ; get type of Dil (0=Disabled, 1=First, 2=Normal) | |
1662 sublw .1 ; is it of type First? | |
1663 bz get_first_dil_to_WREG3 ; YES - found the First dil | |
1664 incf lo,F ; NO - increment index | |
1665 movlw NUM_GAS+1 ; - get highest index+1 | |
1666 cpfseq lo ; - dils checked? | |
1667 bra get_first_dil_to_WREG2 ; NO - not yet | |
628 | 1668 movlw .1 ; YES - default to dil 1 |
1669 movff WREG,opt_dil_type+0 ; - force it to be of type First | |
623 | 1670 return ; - done |
560 | 1671 get_first_dil_to_WREG3: |
623 | 1672 movf lo,W ; copy index of dil found to be the First to WREG |
1673 incf WREG,W ; turn index into dil number (0-4 -> 1-5) | |
604 | 1674 return ; done |
1675 | |
623 | 1676 ENDIF |
1677 | |
1678 ;============================================================================= | |
604 | 1679 |
628 | 1680 global deco_setup_oc_gases |
560 | 1681 deco_setup_oc_gases: ; with currently breathed gas in WREG (1-5 or 6) |
1682 movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common | |
604 | 1683 deco_setup_oc_gases_pre: ; entry point with lo preloaded |
623 | 1684 movff WREG,char_I_current_gas_num ; set gas to start with when doing the deco calculations |
604 | 1685 ; |
1686 ; Memory Map: | |
1687 ; --------------------------------------------------------------------------------- | |
1688 ; opt_gas_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS | |
1689 ; opt_dil_O2_ratio res NUM_GAS | | |
1690 ; opt_gas_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS | |
1691 ; opt_dil_He_ratio res NUM_GAS | | |
1692 ; opt_gas_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS | |
1693 ; opt_dil_type res NUM_GAS | | |
1694 ; opt_gas_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS | |
1695 ; opt_dil_change res NUM_GAS | | |
1696 ; | |
628 | 1697 lfsr FSR2,char_I_deco_O2_ratio ; load FSR2 with base address of char_I_deco_O2_ratio |
1698 ; FSR2 will step through all char_I_deco_... vars | |
604 | 1699 lfsr FSR1,opt_gas_O2_ratio ; load FSR1 with base address of opt_gas_O2_ratio |
1700 rcall deco_setup_copy ; copy all OC O2 ratios | |
1701 lfsr FSR1,opt_gas_He_ratio ; load FSR1 with base address of opt_gas_He_ratio | |
1702 rcall deco_setup_copy ; copy all OC He ratios | |
1703 lfsr FSR1,opt_gas_type ; load FSR1 with base address of opt_gas_type | |
1704 rcall deco_setup_copy ; copy all gas types | |
1705 lfsr FSR1,opt_gas_change ; load FSR1 with base address of opt_gas_change | |
1706 rcall deco_setup_copy ; copy all gas change depths | |
1707 ; switch to oc mode | |
560 | 1708 bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) |
1709 bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag | |
1710 movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status | |
1711 return | |
1712 | |
623 | 1713 ;============================================================================= |
1714 | |
1715 IFDEF _ccr_pscr | |
582 | 1716 |
628 | 1717 global deco_setup_cc_diluents |
604 | 1718 deco_setup_cc_diluents: ; with currently breathed diluent in WREG (1-5 or 6) |
560 | 1719 movff char_O_deco_status,lo ; working copy of char_O_deco_status in bank common |
604 | 1720 deco_setup_cc_diluents_pre: ; entry point with lo preloaded |
623 | 1721 btfsc bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- |
604 | 1722 bra deco_setup_oc_gases_pre ; YES - revert to setting up OC gases | This branch should never happen to be taken... |
623 | 1723 movff WREG,char_I_current_gas_num ; NO - set diluent to start with when doing the deco calculations |
604 | 1724 ; |
1725 ; Memory Map: | |
1726 ; --------------------------------------------------------------------------------- | |
1727 ; opt_gas_O2_ratio res NUM_GAS | | |
1728 ; opt_dil_O2_ratio res NUM_GAS | char_I_deco_O2_ratio res NUM_GAS | |
1729 ; opt_gas_He_ratio res NUM_GAS | | |
1730 ; opt_dil_He_ratio res NUM_GAS | char_I_deco_He_ratio res NUM_GAS | |
1731 ; opt_gas_type res NUM_GAS | | |
1732 ; opt_dil_type res NUM_GAS | char_I_deco_gas_type res NUM_GAS | |
1733 ; opt_gas_change res NUM_GAS | | |
1734 ; opt_dil_change res NUM_GAS | char_I_deco_gas_change res NUM_GAS | |
1735 ; | |
623 | 1736 lfsr FSR2,char_I_deco_O2_ratio ; load FSR2 with base address of char_I_deco_O2_ratio. |
604 | 1737 ; FSR2 will step through all char_I_deco_... vars. |
1738 lfsr FSR1,opt_dil_O2_ratio ; load FSR1 with base address of opt_dil_O2_ratio | |
1739 rcall deco_setup_copy ; copy all dil O2 ratios | |
1740 lfsr FSR1,opt_dil_He_ratio ; load FSR1 with base address of opt_dil_He_ratio | |
1741 rcall deco_setup_copy ; copy all dil He ratios | |
1742 lfsr FSR1,opt_dil_type ; load FSR1 with base address of opt_dil_type | |
1743 rcall deco_setup_copy ; copy all dil types | |
1744 lfsr FSR1,opt_dil_change ; load FSR1 with base address of opt_dil_change | |
1745 rcall deco_setup_copy ; copy all dil change depths | |
1746 ; switch to CCR / pSCR mode | |
560 | 1747 bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode |
1748 bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default | |
1749 btfsc FLAG_pscr_mode ; check if we are in pSCR mode | |
1750 bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode | |
604 | 1751 movff lo,char_O_deco_status ; bank safe write-back of char_O_deco_status |
560 | 1752 return |
0 | 1753 |
623 | 1754 ENDIF |
1755 | |
1756 ;============================================================================= | |
1757 | |
604 | 1758 deco_setup_copy: |
1759 movlw NUM_GAS ; load loop counter with number of gases (5) | |
1760 deco_setup_copy_loop: | |
1761 movff POSTINC1,POSTINC2 ; copy from (FSR1) to (FSR2) | |
1762 decfsz WREG ; decrement loop counter and check if it became 0 | |
1763 bra deco_setup_copy_loop ; NO - not yet, loop | |
1764 return ; YES - done | |
1765 | |
1766 | |
628 | 1767 global setup_gas_registers |
582 | 1768 setup_gas_registers: ; with currently breathed gas in WREG (1-5 or 6) |
1769 movwf active_gas ; set as current gas | |
560 | 1770 movlw .6 |
582 | 1771 cpfseq active_gas ; gas = gas6 ? |
1772 bra setup_gas_registers_15 ; NO - load gas 1-5 | |
1773 movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine | |
623 | 1774 IFDEF _helium |
604 | 1775 movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine |
623 | 1776 ENDIF |
604 | 1777 movlw .3 ; declare gas6 as a deco gas |
1778 movff WREG,char_I_current_gas_type; copy gas type to deco engine | |
623 | 1779 movff depth_meter,char_I_gas6_depth;set current depth as change depth |
582 | 1780 bra setup_gas_registers_com ; continue with common part |
560 | 1781 setup_gas_registers_15: |
623 | 1782 lfsr FSR1,opt_gas_O2_ratio ; load base address of gas data |
1783 decf active_gas,W ; set index to O2 ratio of current gas (1-5 -> 0-4) | |
628 | 1784 movff PLUSW1,char_I_O2_ratio ; copy O2 ratio to deco engine |
623 | 1785 addlw .10 ; advance index from O2 ratio to He ratio |
1786 IFDEF _helium | |
628 | 1787 movff PLUSW1,char_I_He_ratio ; copy He ratio to deco engine |
623 | 1788 ENDIF |
1789 addlw .10 ; advance index from He ratio to gas type | |
628 | 1790 movff PLUSW1,char_I_current_gas_type ; copy gas type (0=Disabled, 1=First, 2=Travel, 3=Deco) |
604 | 1791 setup_gas_registers_com: |
582 | 1792 movff char_O_main_status,lo ; working copy of char_O_main_status in bank common |
1793 bcf lo,DECO_MODE_PSCR_FLAG ; clear the pSCR-mode flag (may not be set, but never mind) | |
1794 bcf lo,DECO_MODE_LOOP_FLAG ; clear the loop/CCR-mode flag | |
1795 movff lo,char_O_main_status ; bank safe write-back of char_O_main_status | |
604 | 1796 movf active_gas,W ; reload WREG with gas 1-5 or 6 (important!) |
560 | 1797 return |
137 | 1798 |
623 | 1799 ;============================================================================= |
1800 | |
1801 IFDEF _ccr_pscr | |
1802 | |
628 | 1803 global setup_dil_registers |
582 | 1804 setup_dil_registers: ; with currently breathed gas in WREG (1-5 or 6) |
623 | 1805 btfsc bailout_mode ; check if in bailout condition | --------------- FOR SAFETY ONLY -------------- |
604 | 1806 bra setup_gas_registers ; revert to setting up OC gases in bailout condition | This branch should never happen to be taken... |
1807 movwf active_dil ; set as current diluent | |
560 | 1808 movlw .6 |
604 | 1809 cpfseq active_dil ; diluent = gas6 ? |
582 | 1810 bra setup_dil_registers_15 ; NO - load diluent 1-5 |
1811 movff gas6_O2_ratio,char_I_O2_ratio ; copy gas6 O2 ratio to deco engine | |
623 | 1812 IFDEF _helium |
582 | 1813 movff gas6_He_ratio,char_I_He_ratio ; copy gas6 H2 ratio to deco engine |
623 | 1814 ENDIF |
604 | 1815 movlw .2 ; declare gas6 as a normal diluent |
1816 movff WREG,char_I_current_gas_type; copy gas type to deco engine | |
623 | 1817 movff depth_meter,char_I_gas6_depth;set current depth as change depth |
582 | 1818 bra setup_dil_registers_com ; continue with common part |
560 | 1819 setup_dil_registers_15: |
623 | 1820 lfsr FSR1,opt_dil_O2_ratio ; load base address of diluent data |
1821 decf active_dil,W ; set index to O2 ratio of current diluent (1-5 -> 0-4) | |
628 | 1822 movff PLUSW1,char_I_O2_ratio ; copy O2 ratio to deco engine |
623 | 1823 addlw .10 ; advance index from O2 ratio to He ratio |
1824 IFDEF _helium | |
628 | 1825 movff PLUSW1,char_I_He_ratio ; copy He ratio to deco engine |
623 | 1826 ENDIF |
1827 addlw .10 ; advance index from He ratio to diluent type | |
1828 movff PLUSW1,char_I_current_gas_type ; copy diluent type (0=Disabled, 1=First, 2=Normal) | |
560 | 1829 setup_dil_registers_com: |
582 | 1830 movff char_O_main_status,lo ; working copy of char_O_main_status in bank common |
1831 bsf lo,DECO_MODE_LOOP_FLAG ; loop flag is set in both, CCR and pSCR mode | |
1832 bcf lo,DECO_MODE_PSCR_FLAG ; clear pSCR mode flag by default | |
1833 btfsc FLAG_pscr_mode ; check if we are in pSCR mode | |
1834 bsf lo,DECO_MODE_PSCR_FLAG ; YES - set additional flag for pSCR mode | |
1835 movff lo,char_O_main_status ; bank safe write-back of char_O_main_status | |
604 | 1836 movf active_dil,W ; reload WREG with diluent 1-5 or 6 (important!) |
560 | 1837 return |
1838 | |
623 | 1839 ENDIF |
1840 | |
1841 ;============================================================================= | |
604 | 1842 |
1843 divemode_option_gaschange: ; switch to the "better gas" / "better diluent" | |
623 | 1844 IFDEF _ccr_pscr |
604 | 1845 btfsc FLAG_oc_mode ; in OC mode? |
1846 bra divemode_option_gaschange_oc; YES | |
623 | 1847 btfsc bailout_mode ; in bailout? |
604 | 1848 bra divemode_option_gaschange_oc; YES |
1849 divemode_option_gaschange_loop: ; in CCR/pSCR mode and not in bailout | |
623 | 1850 movff best_dil_number,menu_pos_cur; NO - select best diluent |
604 | 1851 bcf better_dil_available ; - clear flag immediately |
1852 bra divemode_option_gaschange3 ; - continue with common part | |
623 | 1853 ENDIF |
604 | 1854 divemode_option_gaschange_oc: ; in OC or bailout |
623 | 1855 movff best_gas_number,menu_pos_cur; select best gas |
604 | 1856 bcf better_gas_available ; clear flag immediately |
1857 divemode_option_gaschange3 ; common part | |
623 | 1858 bsf request_gaschange ; request a gas/diluent change |
1859 call menuview_toggle_reset ; terminate the pre-menu | |
560 | 1860 return |
1861 | |
623 | 1862 global divemode_option0_return |
604 | 1863 divemode_option0: ; start/setup dive mode menu |
1864 call TFT_clear_divemode_menu ; clear menu area | |
623 | 1865 bcf dive_options_menu ; dive options menu is not shown anymore |
1866 call do_main_divemenu ; hand over to menu processor | |
1867 divemode_option0_return: ; return point for menu processor | |
1868 call TFT_show_menu_cursor_divemode ; show the cursor | |
1869 clrf active_premenu ; set pre-menu is not shown any more | |
1870 bcf safety_stop_active ; set safety stop is not shown any more | |
1871 bsf dive_main_menu ; set main menu is shown now | |
1872 movlw divemode_timeout_mainmenu ; get timeout for main menu | |
1873 call reset_timeout_time ; reload timeout | |
1874 goto diveloop_menu_exit ; go back to dive loop (menu processor resets STKPTR!) | |
604 | 1875 |
1876 divemode_option1: ; quit simulation mode | |
623 | 1877 clrf simulatormode_depth ; set target depth to zero |
1878 bsf quit_simulatormode ; request ISR to end simulator mode | |
1879 call menuview_toggle_reset ; terminate the pre-menu | |
1880 btfsc FLAG_apnoe_mode ; in apnoe mode? | |
1881 bcf divemode ; YES - force end of dive mode | |
1882 return ; done | |
1883 | |
1884 divemode_option2: ; plus 1 meter | |
1885 movlw ostc_depth_max-1 ; load depth limit into WREG | |
1886 cpfsgt simulatormode_depth ; simulated depth <= limit ? | |
1887 incf simulatormode_depth,F ; YES - increment simulated depth | |
1888 return ; done | |
1889 | |
1890 divemode_option3: ; minus 1 meter | |
1891 tstfsz simulatormode_depth ; simulated depth > 0 ? | |
1892 decf simulatormode_depth,F ; YES - decrement simulated depth | |
1893 return ; done | |
1894 | |
1895 divemode_option4: ; quit apnoe mode (available while at the surface only) | |
1896 btfsc sensor_override_active ; in simulator mode? | |
1897 bra divemode_option1 ; YES - use simulator quit procedure | |
1898 bcf divemode ; NO - force end of dive mode | |
1899 return ; - done | |
1900 | |
0 | 1901 |
1902 divemode_option5: | |
623 | 1903 bsf request_reset_avg ; request reset of average depth |
1904 goto menuview_toggle_reset ; terminate pre-menu and return | |
0 | 1905 |
216
973a0969e0ac
NEW: On-board simulator can increase divetime in 5min steps
heinrichsweikamp
parents:
206
diff
changeset
|
1906 divemode_option6: |
628 | 1907 ; check for pending +5 request |
1908 movff char_I_sim_advance_time,WREG; get mailbox content | |
1909 tstfsz WREG ; mailbox clear (=0) ? | |
1910 return ; NO - still having a pending +5' request, refuse new request | |
1911 | |
623 | 1912 ; advance tissues pressures and deco obligation by 5 minutes |
604 | 1913 movlw .5 ; + 5 minutes |
1914 movff WREG,char_I_sim_advance_time; copy to mailbox | |
623 | 1915 call restart_deco_engine ; condition deco engine to execute the +5 minutes |
1916 | |
1917 ; stop dive time incrementing in ISR | |
1918 bcf count_divetime | |
1919 | |
1920 ; add 5 minutes to counted_divetime_mins | |
1921 ADDLI .5,counted_divetime_mins | |
1922 | |
1923 ; add 5 minutes (300 seconds) to total_divetime_secs | |
1924 ADDLI .300,total_divetime_secs | |
604 | 1925 |
1926 ; continue dive time incrementing in ISR | |
623 | 1927 bsf count_divetime |
1928 | |
1929 ; add 5 minutes (300 seconds) to resettable time accumulator | |
1930 ADDLI .300,divesecs_avg_trip | |
1931 | |
1932 ; add 5 minutes (300 seconds) to total time accumulator | |
1933 ADDLI .300,divesecs_avg_total | |
604 | 1934 |
1935 ; calculate 300 x depth in mbar (300 = 5 min * 60 sec/min) | |
623 | 1936 MOVII pressure_rel_cur_cached,xB |
1937 MOVLI .300,xA | |
1938 call mult16x16 ; xC = xA * xB | |
386 | 1939 |
604 | 1940 ; add to the resettable depth accumulator |
1941 movf xC+0,W | |
623 | 1942 addwf pressure_rel_accu_trip+0,F |
604 | 1943 movf xC+1,W |
623 | 1944 addwfc pressure_rel_accu_trip+1,F |
604 | 1945 movf xC+2,W |
623 | 1946 addwfc pressure_rel_accu_trip+2,F |
604 | 1947 movf xC+3,W |
623 | 1948 addwfc pressure_rel_accu_trip+3,F |
604 | 1949 |
1950 ; add to the total depth accumulator | |
386 | 1951 movf xC+0,w |
623 | 1952 addwf pressure_rel_accu_total+0,F |
386 | 1953 movf xC+1,w |
623 | 1954 addwfc pressure_rel_accu_total+1,F |
386 | 1955 movf xC+2,w |
623 | 1956 addwfc pressure_rel_accu_total+2,F |
560 | 1957 movf xC+3,w |
623 | 1958 addwfc pressure_rel_accu_total+3,F |
604 | 1959 |
1960 IFDEF _cave_mode | |
1961 ; update backtracking data | |
623 | 1962 movlw .5 ; configure 5 minutes |
1963 call update_backtrack ; add backtrack data for 5 minutes | |
604 | 1964 ENDIF |
1965 | |
628 | 1966 ; goto menuview_toggle_reset ; terminate the pre-menu and return |
1967 return ; just return, leaving option avail for repeated selection | |
623 | 1968 |
1969 IFDEF _compass | |
254
5fe7aff622f3
preparations to set a course for the compass display
heinrichsweikamp
parents:
239
diff
changeset
|
1970 divemode_option7: |
623 | 1971 ; store heading for compass view |
1972 MOVII compass_heading_shown,compass_bearing | |
1973 bsf compass_bearing_set ; set flag to show heading | |
1974 goto menuview_toggle_reset ; terminate the pre-menu and return | |
1975 ENDIF | |
1976 | |
604 | 1977 |
560 | 1978 divemode_option8: |
604 | 1979 call menuview_toggle_reset ; terminate the pre-menu |
1980 call TFT_ClearScreen ; clear the whole screen | |
623 | 1981 btg alt_layout_active ; toggle layout |
1982 | |
1983 bcf depth_warn_att_last ; set warning or attention on the depth not shown | |
1984 bcf depth_inverse_last ; set depth displayed in inverse as not shown | |
1985 bcf sign_shown ; set warning/attention/advice sign not shown | |
1986 bcf velocity_active_num ; set numerical vertical velocity display not shown | |
1987 bcf velocity_active_vsi ; set vertical vertical velocity display not shown | |
1988 bcf safety_stop_active ; set safety stop not shown | |
1989 | |
1990 bsf FLAG_TFT_divemode_mask ; request redraw of dive screen mask | |
1991 bsf FLAG_TFT_divetime ; request redraw of dive time | |
1992 bsf FLAG_TFT_depth_current ; request redraw of current depth | |
1993 bsf FLAG_TFT_depth_maximum ; request redraw of maximum depth | |
1994 bsf FLAG_TFT_active_gas_divemode; request redraw of gas and setpoint | |
1995 bsf FLAG_TFT_customview_mask ; request redraw of custom view mask | |
1996 bsf FLAG_TFT_temperature ; request redraw of temperature | |
1997 | |
1998 goto request_redraw_NDL_deco_data; request redraw of NDL/deco data and return | |
1999 | |
0 | 2000 |
2001 ;============================================================================= | |
604 | 2002 ; Find the best gas and diluent for the current depth |
2003 ; and check if a gas/diluent change is to be advised. | |
2004 ; | |
2005 ; Output: best_gas_number : number of best gas, 0= none avail, 255= not computed | |
2006 ; best_dil_number : number of best dil, 0= none avail, 255= not computed | |
2007 ; better_gas_available : flag indicating if a change is advised | |
2008 ; better_dil_available : flag indicating if a change is advised | |
2009 ; | |
2010 ; | |
2011 ; in CCR and pSCR mode: - checks both, gases and diluents for respective best gas / best diluent | |
2012 ; - if not in bailout, sets better_dil_available on diluents | |
2013 ; - if in bailout, sets better_gas_available on OC gases | |
2014 ; | |
2015 ; in OC mode : - checks only gases for best gas | |
2016 ; - sets better_gas_available on OC gases | |
0 | 2017 ; |
628 | 2018 global check_gas_best |
604 | 2019 check_gas_best: |
623 | 2020 btfsc FLAG_gauge_mode ; in gauge mode? |
2021 return ; YES - done | |
2022 | |
2023 MOVII pressure_abs_10,xA ; copy absolute pressure / 10 into xA:2, will be used by ppO2 min/max checks later | |
2024 | |
2025 ; compute max. allowed deco ppO2 | |
2026 movff char_I_ppO2_max_deco,WREG ; max ppO2 [cbar] for deco phase | |
2027 mullw .100 ; compute max ppO2 * 100, result is in 0.1 mbar | |
2028 ADDLI ppO2_margin_on_max,PROD ; add ppO2 margin on max value to compensate for surface pressures > 1000 hPa | |
2029 MOVII PROD,ppO2_max_deco ; store as deco ppO2 max | |
2030 | |
2031 ; compute max. allowed default ppO2 | |
604 | 2032 movff char_O_deco_info,lo ; bank-safe copy of deco info vector |
628 | 2033 btfss lo,deco_mode ; is the ppO2 deco limit enabled? |
623 | 2034 bra check_gas_best_1 ; NO - compute default ppO2 max |
2035 MOVII ppO2_max_deco,ppO2_max_default ; YES - copy default ppO2 max from deco max. | |
2036 bra check_gas_best_2 ; - continue with common part | |
2037 | |
2038 check_gas_best_1: | |
2039 movff char_I_ppO2_max_work,WREG ; max ppO2 [cbar] for working phase | |
2040 mullw .100 ; compute max ppO2 * 100, result is in 0.1 mbar | |
2041 ADDLI ppO2_margin_on_max,PROD ; add ppO2 margin on max value to compensate for surface pressures > 1000 hPa | |
2042 MOVII PROD,ppO2_max_default ; store as default ppO2 max | |
2043 | |
2044 check_gas_best_2: | |
2045 | |
2046 IFDEF _ccr_pscr | |
2047 | |
604 | 2048 ; check dive mode |
2049 btfsc FLAG_oc_mode ; in OC mode? | |
2050 bra check_gas_best_gas ; YES - skip diluents, check for best gas only | |
2051 | |
2052 check_gas_best_dil: | |
2053 ; set minimum ppO2 required | |
2054 movff char_I_ppO2_min,WREG ; min ppO2 for pure diluent in CCR mode (default) | |
2055 btfsc FLAG_pscr_mode ; in pSCR mode? | |
623 | 2056 movff char_I_ppO2_min_loop,WREG ; YES - replace by min ppO2 for pure diluent in pSCR mode |
2057 mullw .100 ; min ppO2 * 100, result in 0.1 mbar | |
2058 MOVII PROD,ppO2_min ; store in ppO2_min | |
604 | 2059 ; preset results to nothing found |
2060 clrf best_gas_num ; initialize best diluent as 0 = nothing found yet | |
623 | 2061 bcf better_dil_available ; =1: a better diluent is available and a gas change is advised in dive mode |
604 | 2062 ; ; current diluent = 'gas6' ? |
2063 ; movlw .6 ; | |
2064 ; cpfseq active_dil ; using 'gas6' as current diluent? | |
2065 ; bra check_gas_best_dil0 ; NO - continue | |
2066 ; bra check_gas_best_dil3 ; YES - suppress better diluent search in this case | |
2067 ;check_gas_best_dil0: | |
2068 ; check all diluents | |
2069 lfsr FSR1,opt_dil_O2_ratio ; set base address for diluent arrays | |
2070 movff active_dil,lo ; number of currently used diluent | |
2071 setf best_gas_depth ; initialize change depth of best dil found so far to 255 meter | |
2072 ; original code | |
2073 clrf check_gas_num | |
2074 incf check_gas_num,F | |
2075 rcall check_gas_best_common ; check diluent 1 | |
2076 incf check_gas_num,F | |
2077 rcall check_gas_best_common ; check diluent 2 | |
2078 incf check_gas_num,F | |
2079 rcall check_gas_best_common ; check diluent 3 | |
2080 incf check_gas_num,F | |
2081 rcall check_gas_best_common ; check diluent 4 | |
2082 incf check_gas_num,F | |
2083 rcall check_gas_best_common ; check diluent 5 | |
2084 ; alternative code | |
2085 ; movlw .5 | |
2086 ; movwf check_gas_num | |
2087 ;check_gas_best_dil_loop: | |
2088 ; rcall check_gas_best_common | |
2089 ; decfsz check_gas_num | |
2090 ; bra check_gas_best_dil_loop | |
0 | 2091 ; |
604 | 2092 ; store result |
2093 movff best_gas_num,best_dil_number ; store new best diluent found (1-5 or 0 of no usable diluent available) | |
2094 ; check if change advices shall be given in general | |
623 | 2095 btfsc bailout_mode ; in bailout? |
604 | 2096 bra check_gas_best_gas ; YES - no better diluent advice when in bailout |
2097 check_gas_best_dil1: | |
2098 ; check if a change advice shall be given right now | |
2099 movf best_dil_number,W ; load number of best diluent into WREG (1-5) | |
2100 bz check_gas_best_dil3 ; has a best diluent been found at all? NO - nothing to signal for | |
2101 cpfseq active_dil ; is this the currently used diluent? | |
2102 bra check_gas_best_dil2 ; NO | |
2103 bra check_gas_best_dil3 ; YES - no need to signal a better diluent if this diluent is already in use | |
2104 check_gas_best_dil2: | |
623 | 2105 btfsc sp_fallback ; in fallback condition? |
604 | 2106 bra check_gas_best_dil3 ; YES - suppress better diluent prompt in this case |
2107 ; not using the best gas - show better diluent hint whenever a better diluent is available | |
2108 bsf better_dil_available ; signal that a better diluent is available | |
2109 bsf FLAG_TFT_active_gas_divemode ; redraw gas/setpoint/diluent | |
2110 check_gas_best_dil3: | |
2111 btfss better_dil_available ; shall a better diluent be signaled for? | |
623 | 2112 bcf better_dil_blinking ; NO - clear blinking flag |
604 | 2113 ; continue with checking for best bailout gas |
2114 | |
623 | 2115 ENDIF ; _ccr_pscr |
2116 | |
604 | 2117 check_gas_best_gas: |
2118 ; set minimum ppO2 required | |
628 | 2119 movff char_I_ppO2_min,WREG ; min ppO2 for OC and bailout |
623 | 2120 mullw .100 ; min ppO2 * 100, result in 0.1 mbar |
2121 MOVII PROD,ppO2_min ; store in ppO2_min | |
604 | 2122 ; preset results to nothing found |
2123 clrf best_gas_num ; initialize best gas as 0 = nothing found yet | |
623 | 2124 bcf better_gas_available ; =1: a better gas is available and a gas change is advised in dive mode |
604 | 2125 ; ; current gas = 'gas6' ? |
2126 ; movlw .6 ; | |
2127 ; cpfseq active_gas ; using 'gas6' as current gas? | |
2128 ; bra check_gas_best_gas0 ; NO - continue | |
2129 ; bra check_gas_best_gas3 ; YES - suppress better gas search in this case | |
2130 ;check_gas_best_gas0: | |
2131 ; check all gases | |
2132 lfsr FSR1,opt_gas_O2_ratio ; set base address for gas arrays | |
2133 movff active_gas,lo ; number of currently used gas | |
2134 setf best_gas_depth ; initialize change depth of best gas found so far to 255 meter | |
2135 ; original code | |
2136 clrf check_gas_num | |
2137 incf check_gas_num,F | |
2138 rcall check_gas_best_common ; check gas 1 | |
2139 incf check_gas_num,F | |
2140 rcall check_gas_best_common ; check gas 2 | |
2141 incf check_gas_num,F | |
2142 rcall check_gas_best_common ; check gas 3 | |
2143 incf check_gas_num,F | |
2144 rcall check_gas_best_common ; check gas 4 | |
2145 incf check_gas_num,F | |
2146 rcall check_gas_best_common ; check gas 5 | |
2147 ; alternative code | |
2148 ; movlw .5 | |
2149 ; movwf check_gas_num | |
2150 ;check_gas_best_gas_loop: | |
2151 ; rcall check_gas_best_common | |
2152 ; decfsz check_gas_num | |
2153 ; bra check_gas_best_gas_loop | |
2154 ; | |
2155 ; store result | |
2156 movff best_gas_num,best_gas_number ; store new best gas found (1-5 or 0 of no usable gas available) | |
2157 ; check if change advices shall be given in general | |
2158 btfsc FLAG_oc_mode ; in OC mode? | |
2159 bra check_gas_best_gas1 ; YES | |
623 | 2160 btfsc bailout_mode ; in bailout? |
604 | 2161 bra check_gas_best_gas1 ; YES |
2162 return ; NO - no better (OC) gas advice when not in OC or bailout mode | |
2163 check_gas_best_gas1: ; check if we are already on the best gas | |
2164 ; check if a change advice shall be given right now | |
2165 movf best_gas_number,W ; load number of best gas into WREG (1-5) | |
2166 bz check_gas_best_gas3 ; has a best gas been found at all? NO - nothing to signal for | |
2167 cpfseq active_gas ; is this the currently used gas? | |
2168 bra check_gas_best_gas2 ; NO | |
2169 bra check_gas_best_gas3 ; YES - no need to signal a better gas if this gas is already in use | |
2170 check_gas_best_gas2: | |
2171 ; not using the best gas - show better gas hint whenever a better gas is available | |
2172 bsf better_gas_available ; YES - signal that a better gas is available | |
2173 bsf FLAG_TFT_active_gas_divemode ; YES - redraw gas/setpoint/diluent | |
2174 check_gas_best_gas3: | |
2175 btfss better_gas_available ; shall a better gas be signaled for? | |
623 | 2176 bcf better_gas_blinking ; NO - clear blinking flag |
582 | 2177 return |
0 | 2178 |
604 | 2179 check_gas_best_common: ; with gas to be checked in check_gas_num (1-5) |
2180 ; ; and current gas in lo (1-5) | |
2181 ; | |
2182 ; Memory Map: | |
2183 ; --------------------------------------------------------------------------------------- | |
2184 ; opt_gas_O2_ratio res 5 ; base address for gases | |
2185 ; opt_dil_O2_ratio res 5 ; base address for diluents | |
2186 ; opt_gas_He_ratio res 5 ; (not needed here) | |
2187 ; opt_dil_He_ratio res 5 ; (not needed here) | |
2188 ; opt_gas_type res 5 ; has offset of 20 bytes from base address for gases | |
2189 ; opt_dil_type res 5 ; has offset of 20 bytes from base address for diluents | |
2190 ; opt_gas_change res 5 ; has offset of 10 bytes from opt_gas_type | |
2191 ; opt_dil_change res 5 ; has offset of 10 bytes from opt_dil_type | |
2192 | |
2193 ; get gas data | |
2194 decf check_gas_num,W ; (1-5) -> (0-4) into WREG to be used as index | |
623 | 2195 movff PLUSW1,check_gas_O2_ratio ; copy O2 ratio (%) of current gas/dil to check_gas_O2_ratio |
604 | 2196 addlw .20 ; add offset of 20 bytes to index type in opt_gas_type/opt_dil_type |
623 | 2197 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 | 2198 addlw .10 ; add offset of 10 bytes to index change depth in opt_gas_change/opt_dil_change |
623 | 2199 movff PLUSW1,check_gas_depth ; copy change depth of current gas/dil to check_gas_depth |
2200 MOVII ppO2_max_default,sub_b ; select default ppO2 max for first / travel / normal gas | |
628 | 2201 ; check if the gas is the current gas |
2202 movf check_gas_num,W ; get the number of the gas to be checked (1-5) | |
2203 cpfseq lo ; is this the currently used gas? | |
2204 bra check_gas_best_common0 ; NO - do the disabled & deco gas checks | |
2205 bra check_gas_best_common3 ; YES - a gas in use overrides disabled and deco status | |
2206 check_gas_best_common0: | |
623 | 2207 ; check if gas is available (i.e. not disabled) |
2208 tstfsz check_gas_type ; type = disabled (0) ? | |
2209 bra check_gas_best_common1 ; NO - continue checks | |
628 | 2210 return ; YES - skip disabled gases |
623 | 2211 check_gas_best_common1: |
2212 ; skip deco gases (type=3) if there are no stops, but include them when in bailout mode | |
2213 movlw .3 ; coding for deco gas | |
2214 cpfseq check_gas_type ; type = deco (3) ? | |
2215 bra check_gas_best_common3 ; NO - first or travel/normal then, ok to use | |
2216 btfsc bailout_mode ; YES - in bailout? | |
2217 bra check_gas_best_common2 ; YES - ok to use (using deco gases is always allowed when in bailout) | |
628 | 2218 TSTOSS opt_extended_stops ; NO - extended stops enables? |
2219 bra check_gas_best_common1b ; NO | |
2220 ;bra check_gas_best_common1a ; YES | |
623 | 2221 check_gas_best_common1a: |
628 | 2222 movff char_O_deco_info,WREG ; get deco info vector |
2223 btfss WREG,deco_mode ; are we in deco mode? | |
2224 return ; NO - skip deco gas while not in deco mode | |
2225 bra check_gas_best_common2 ; YES - deco gases allowed | |
2226 check_gas_best_common1b: | |
2227 btfss deco_region ; are we in the deco region? | |
2228 return ; NO - skip deco gas while not in the deco region | |
2229 ;bra check_gas_best_common2 ; YES - deco gases allowed | |
623 | 2230 check_gas_best_common2: |
2231 MOVII ppO2_max_deco,sub_b ; replace by ppO2 max for a deco gas | |
2232 check_gas_best_common3: | |
604 | 2233 ; check if gas is usable, i.e. its change depth is below or equal to the current depth |
623 | 2234 movf depth_meter,W ; load current depth (in m) into WREG |
604 | 2235 cpfslt check_gas_depth ; change depth of checked gas < (shallower than) current depth? |
623 | 2236 bra check_gas_best_common4 ; NO - gas is usable |
604 | 2237 return ; YES - gas is not usable |
623 | 2238 check_gas_best_common4: |
604 | 2239 ; check if this gas is the first best gas candidate |
2240 movf best_gas_num,W ; get best gas found so far (1-5) or 0 if none found yet | |
2241 tstfsz WREG ; has a best gas candidate been found yet? | |
623 | 2242 bra check_gas_best_common5 ; YES - check if the new one is better than the one we have so far |
2243 bra check_gas_best_common6 ; NO - no need to do the above mentioned check | |
2244 check_gas_best_common5: | |
628 | 2245 ; check if the change depth of the checked gas is <= (shallower or equal) the change depth of the best gas found so far |
604 | 2246 movf best_gas_depth,W ; load change depth of best gas so far into WREG |
628 | 2247 cpfsgt check_gas_depth ; change depth of checked gas > (deeper than) change depth of best gas so far? |
2248 bra check_gas_best_common6 ; NO - this gas is better or equal, continue | |
2249 return ; YES - this gas is not better than the best already found | |
623 | 2250 check_gas_best_common6: |
604 | 2251 ; check if the gas fits into the ppO2 limits |
623 | 2252 movff check_gas_O2_ratio,xB+0 ; xB = O2 ratio, xA is still loaded with (absolute pressure / 10) |
69 | 2253 clrf xB+1 |
623 | 2254 call mult16x16 ; xC = O2 ratio * (absolute pressure / 10), result in 0.1 mbar |
604 | 2255 ; check for very high ppO2 |
623 | 2256 tstfsz xC+2 ; O2_ratio * absolute pressure / 10 > 65536, i.e. ppO2 > 6.55 bar ? |
604 | 2257 return ; YES - gas is not usable |
623 | 2258 btfsc xC+1,7 ; ppO2 > 3.30 bar ? |
604 | 2259 return ; YES - gas is not usable |
623 | 2260 MOVII xC,sub_a ; NO - gas may be usable |
2261 ; check for high ppO2 | |
2262 call cmpU16 ; sub_a - sub_b | |
2263 btfss neg_flag ; within limit? | |
2264 return ; NO - too high, gas is not usable | |
604 | 2265 ; check for low ppO2 |
623 | 2266 MOVII ppO2_min,sub_b ; copy minimum ppO2 to sub_b |
2267 call cmpU16 ; sub_a - sub_b | |
604 | 2268 btfsc neg_flag ; within limit? |
2269 return ; NO - too low, gas is not usable | |
2270 ; we have a (new) best gas | |
2271 movff check_gas_num, best_gas_num ; set checked gas (1-5) as best gas | |
2272 movff check_gas_depth,best_gas_depth ; memorize its change depth | |
582 | 2273 return |
0 | 2274 |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2275 |
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2276 ;============================================================================= |
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2277 ; Check for Auto-SP |
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2278 ; |
623 | 2279 IFDEF _ccr_pscr |
2280 | |
604 | 2281 check_dive_autosp: ; check for Auto-SP |
582 | 2282 movff opt_ccr_mode,WREG ; =0: Fixed SP, =1: Sensor, =2: Auto SP |
2283 sublw .2 ; opt_ccr_mode = 2 (Auto SP)? | |
604 | 2284 bz check_dive_autosp2 ; YES - check |
2285 return ; NO - return for sensor or fixed mode | |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2286 check_dive_autosp2: |
582 | 2287 ; Check SP2 |
623 | 2288 btfsc FLAG_SP2_used ; SP 2 used so far? |
604 | 2289 bra check_dive_autosp3 ; YES - continue with SP 3 |
623 | 2290 movff opt_setpoint_change+1,lo ; NO - get depth in m |
604 | 2291 tstfsz lo ; - SP change depth = 0 ? |
2292 bra check_dive_autosp2a ; NO - continue | |
2293 bra check_dive_autosp3 ; YES - continue with SP 3 | |
560 | 2294 check_dive_autosp2a: |
604 | 2295 decf lo,W ; SP change depth -1 -> WREG |
623 | 2296 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2297 bra check_dive_autosp3 ; NO - continue with SP 3 |
582 | 2298 ; auto switch to SP2 |
623 | 2299 movff opt_setpoint_cbar+1,char_I_const_ppO2 ; YES - use SP |
604 | 2300 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2301 bsf FLAG_SP2_used ; - set SP 2 used flag |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2302 check_dive_autosp3: |
582 | 2303 ; Check SP3 |
623 | 2304 btfsc FLAG_SP3_used ; SP 3 used so far? |
604 | 2305 bra check_dive_autosp4 ; YES - continue with SP 4 |
623 | 2306 movff opt_setpoint_change+2,lo ; NO - get depth in m |
604 | 2307 tstfsz lo ; - SP change depth = 0 ? |
2308 bra check_dive_autosp3a ; NO - continue | |
2309 bra check_dive_autosp4 ; YES - continue with SP 4 | |
560 | 2310 check_dive_autosp3a: |
604 | 2311 decf lo,W ; SP change depth -1 -> WREG |
623 | 2312 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2313 bra check_dive_autosp4 ; NO - continue with SP 4 |
582 | 2314 ; auto switch to SP3 |
623 | 2315 movff opt_setpoint_cbar+2,char_I_const_ppO2 ; YES - use SP |
604 | 2316 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2317 bsf FLAG_SP3_used ; - set SP 3 used flag |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2318 check_dive_autosp4: |
582 | 2319 ; Check SP4 |
623 | 2320 btfsc FLAG_SP4_used ; SP 4 used so far? |
604 | 2321 bra check_dive_autosp5 ; YES - continue with SP 5 |
623 | 2322 movff opt_setpoint_change+3,lo ; NO - get depth in m |
604 | 2323 tstfsz lo ; - SP change depth = 0 ? |
2324 bra check_dive_autosp4a ; NO - continue | |
623 | 2325 bra check_dive_autosp5 ; YES - continue with SP 5 |
560 | 2326 check_dive_autosp4a: |
604 | 2327 decf lo,W ; SP change depth -1 -> WREG |
623 | 2328 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2329 bra check_dive_autosp5 ; NO - continue with SP 5 |
582 | 2330 ; auto switch to SP4 |
623 | 2331 movff opt_setpoint_cbar+3,char_I_const_ppO2 ; YES - use SP |
604 | 2332 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2333 bsf FLAG_SP4_used ; - set SP 4 used flag |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2334 check_dive_autosp5: |
582 | 2335 ; Check SP5 |
623 | 2336 btfsc FLAG_SP5_used ; SP 5 used so far? |
604 | 2337 bra check_dive_autosp6 ; YES - done |
623 | 2338 movff opt_setpoint_change+4,lo ; NO - get depth in m |
604 | 2339 tstfsz lo ; - SP change depth = 0 ? |
2340 bra check_dive_autosp5a ; NO - continue | |
2341 bra check_dive_autosp6 ; YES - done | |
560 | 2342 check_dive_autosp5a: |
604 | 2343 decf lo,W ; SP change depth -1 -> WREG |
623 | 2344 cpfsgt depth_meter ; current depth > change depth - 1 ? |
604 | 2345 bra check_dive_autosp6 ; NO - done |
582 | 2346 ; auto switch to SP5 |
623 | 2347 movff opt_setpoint_cbar+4,char_I_const_ppO2 ; YES - use SP |
604 | 2348 rcall xmit_sp_set_flag ; - send SP to external devices |
623 | 2349 bsf FLAG_SP5_used ; - set SP 5 used flag |
352
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
339
diff
changeset
|
2350 check_dive_autosp6: |
582 | 2351 return |
352
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
339
diff
changeset
|
2352 |
5c6da9fa5cb0
add setpoint change to first sample in CCR mode
heinrichsweikamp
parents:
339
diff
changeset
|
2353 xmit_sp_set_flag: |
623 | 2354 IFDEF _external_sensor |
604 | 2355 call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics |
623 | 2356 ENDIF |
2357 bsf event_occured ; set global event flag | |
2358 bsf event_SP_change ; set setpoint event flag | |
582 | 2359 return |
2360 | |
623 | 2361 ENDIF ; _ccr_pscr |
2362 | |
2363 ;============================================================================= | |
2364 | |
582 | 2365 set_logbook_marker: |
623 | 2366 bcf request_set_marker ; clear request flag |
2367 movlw d'6' ; set type of alarm: manual marker | |
2368 movwf alarm_type ; copy to alarm register | |
604 | 2369 bsf event_occured ; set event flag |
582 | 2370 return |
338
2811932b4e99
NEW: Mode Auto SP: Automatically switches the SP during descent (CC Mode)
heinrichsweikamp
parents:
337
diff
changeset
|
2371 |
0 | 2372 ;============================================================================= |
604 | 2373 ; Setup everything to enter dive mode |
0 | 2374 ; |
604 | 2375 global dive_boot_oc_bail |
2376 dive_boot_oc_bail: | |
2377 ; copy opt_gas_types into backup (for "lost gas" feature) | |
623 | 2378 movff opt_gas_type+0,opt_gas_type_backup+0 ; 0=Disabled, 1=First, 2=Travel, 3=Deco |
2379 movff opt_gas_type+1,opt_gas_type_backup+1 ; 0=Disabled, 1=First, 2=Travel, 3=Deco | |
2380 movff opt_gas_type+2,opt_gas_type_backup+2 ; 0=Disabled, 1=First, 2=Travel, 3=Deco | |
2381 movff opt_gas_type+3,opt_gas_type_backup+3 ; 0=Disabled, 1=First, 2=Travel, 3=Deco | |
2382 movff opt_gas_type+4,opt_gas_type_backup+4 ; 0=Disabled, 1=First, 2=Travel, 3=Deco | |
604 | 2383 return |
2384 | |
2385 global dive_boot_oc | |
0 | 2386 dive_boot_oc: |
604 | 2387 ; set-up registers |
623 | 2388 rcall get_first_gas_to_WREG ; get first gas (1-5) into WREG |
2389 rcall setup_gas_registers ; set-up of gas parameters of currently breathed gas (with WREG = gas 1-5) | |
628 | 2390 rcall deco_setup_oc_gases ; set-up of gas list for deco calculations (with WREG = gas 1-5) |
582 | 2391 return |
0 | 2392 |
623 | 2393 ;============================================================================= |
2394 | |
2395 IFDEF _ccr_pscr | |
2396 | |
604 | 2397 global dive_boot_cc |
0 | 2398 dive_boot_cc: |
604 | 2399 ; copy opt_dil_types into backup (for "lost diluent" feature) |
623 | 2400 movff opt_dil_type+0,opt_dil_type_backup+0 ; 0=Disabled, 1=First, 2=Normal |
2401 movff opt_dil_type+1,opt_dil_type_backup+1 ; 0=Disabled, 1=First, 2=Normal | |
2402 movff opt_dil_type+2,opt_dil_type_backup+2 ; 0=Disabled, 1=First, 2=Normal | |
2403 movff opt_dil_type+3,opt_dil_type_backup+3 ; 0=Disabled, 1=First, 2=Normal | |
2404 movff opt_dil_type+4,opt_dil_type_backup+4 ; 0=Disabled, 1=First, 2=Normal | |
604 | 2405 ; set-up registers |
623 | 2406 rcall get_first_dil_to_WREG ; get first diluent (1-5) into WREG |
2407 rcall setup_dil_registers ; set-up of diluent parameters for currently breathed diluent (with WREG = current diluent 1-5) | |
628 | 2408 rcall deco_setup_cc_diluents ; set-up of diluent list for deco calculations (with WREG = current diluent 1-5) |
604 | 2409 ; done |
2410 return | |
2411 | |
623 | 2412 |
604 | 2413 dive_boot_cc_part2: |
560 | 2414 ; revoke sensors from usage if they do not have a valid calibration |
2415 bsf use_O2_sensor1 | |
2416 bsf use_O2_sensor2 | |
2417 bsf use_O2_sensor3 | |
2418 btfss sensor1_calibrated_ok | |
2419 bcf use_O2_sensor1 | |
2420 btfss sensor2_calibrated_ok | |
2421 bcf use_O2_sensor2 | |
2422 btfss sensor3_calibrated_ok | |
2423 bcf use_O2_sensor3 | |
623 | 2424 |
2425 IFDEF _external_sensor | |
604 | 2426 ; check for external HUD/ppO2 Monitor |
583 | 2427 btfss optical_input ; do we have an optical input? |
604 | 2428 bra dive_boot_cc_part2_1 ; NO |
623 | 2429 btfsc sensor1_active ; YES - copy valid flags from HUD/ppO2 Monitor |
2430 bsf use_O2_sensor1 ; - ... | |
2431 btfsc sensor2_active ; - ... | |
2432 bsf use_O2_sensor2 ; - ... | |
2433 btfsc sensor3_active ; - ... | |
2434 bsf use_O2_sensor3 ; - ... | |
2435 ENDIF | |
2436 | |
604 | 2437 dive_boot_cc_part2_1: |
560 | 2438 ; In pSCR mode, only settings 0 (calculated ppO2) and 1 (ppO2 from sensors) are defined. |
604 | 2439 ; In case we still have 3 (auto SP) selected out of previous CCR mode, we reset to 0. |
560 | 2440 btfss FLAG_pscr_mode |
604 | 2441 bra dive_boot_cc_part2_2 |
582 | 2442 movff opt_ccr_mode,WREG ; =0: Fixed SP (CCR) / calculated SP (pSCR), =1: Sensor, =2: Auto SP |
2443 sublw .2 ; opt_ccr_mode = 1 (Auto SP)? | |
604 | 2444 bnz dive_boot_cc_part2_2 |
560 | 2445 movlw .0 |
2446 movff WREG,opt_ccr_mode | |
604 | 2447 dive_boot_cc_part2_2: |
623 | 2448 bsf event_SP_change ; set setpoint event flag |
2449 | |
560 | 2450 ; Start with SP1 (CCR) or 0 (pSCR) as default. |
2451 ; If in sensor mode, this value will be overwritten by calc_deko_divemode_sensor | |
623 | 2452 clrf WREG ; pre-load WREG with setpoint value 0 for pSCR calculated |
2453 btfsc FLAG_ccr_mode ; in CCR mode? | |
2454 movff opt_setpoint_cbar+0,WREG ; YES - get value of setpoint 1 into WREG | |
582 | 2455 movff WREG,char_I_const_ppO2 ; write setpoint to deco engine |
623 | 2456 IFDEF _external_sensor |
582 | 2457 call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics |
2458 goto calc_deko_divemode_sensor ; read & process sensor data (and return) | |
623 | 2459 ELSE |
2460 return ; done | |
2461 ENDIF | |
2462 | |
2463 ENDIF ; _ccr_pscr | |
2464 | |
2465 ;============================================================================= | |
604 | 2466 |
0 | 2467 diveloop_boot: |
604 | 2468 ; do the basic initialization |
0 | 2469 call restart_set_modes_and_flags |
2470 | |
604 | 2471 ; stop accelerometer and compass |
2472 call I2C_sleep_compass | |
2473 | |
623 | 2474 ; do an early initialization of all deco engine output variables to |
2475 ; avoid glitches in the display outputs during deco engine start-up | |
2476 call deco_init_output_vars; ; (C-code) | |
2477 banksel common ; back to bank common | |
2478 | |
2479 ; reset max relative pressure (max depth) | |
2480 bsf reset_max_pressure ; request ISR to reset the max pressure | |
2481 | |
2482 | |
2483 IFDEF _min_depth_option | |
2484 ; reset the resettable min/max relative pressure (trip-wise min/max depth) | |
2485 bsf reset_trip_pressure ; request ISR to reset the resettable min/max pressure | |
2486 ENDIF | |
2487 | |
604 | 2488 IFDEF _cave_mode |
623 | 2489 ; initialize the cave mode |
2490 bsf cave_mode ; enable cave mode by default | |
2491 movff opt_calc_asc_gasvolume,WREG ; get gas needs calculation mode (0= off, 1= on, 2= cave mode) | |
2492 xorlw .2 ; coding for cave mode | |
2493 tstfsz WREG ; cave mode enabled? | |
2494 bcf cave_mode ; NO - disable cave mode again | |
604 | 2495 ENDIF |
2496 | |
2497 ; configure the deco engine | |
623 | 2498 clrf hi ; start with everything disabled |
2499 | |
2500 TSTOSC opt_ZfactorUse ; shall use Z factors? | |
2501 bsf hi,DECO_Z_FACTOR_FLAG ; YES - enable Z factors | |
2502 | |
2503 TSTOSC opt_extended_stops ; shall make extended stops? | |
2504 bsf hi,DECO_EXTENDED_STOPS ; YES - enable extended stops | |
2505 | |
604 | 2506 IFDEF _rx_functions |
623 | 2507 btfsc tr_functions_activated ; TR functions activated? |
2508 bsf hi,DECO_TR_FUNCTIONS ; YES - enable TR functions | |
604 | 2509 ENDIF |
623 | 2510 |
604 | 2511 movff hi,char_O_main_status ; bank-safe copy to deco engine |
2512 | |
2513 movff char_O_deco_status,lo ; bank-safe read | |
623 | 2514 bsf lo,DECO_START_NORM ; set flag for doing a normal plan, |
2515 bcf lo,DECO_START_ALT ; clear flag for doing an alternative plan, | |
2516 bsf lo,DECO_INITIALIZE ; set flag for initializing the deco engine | |
604 | 2517 bcf lo,DECO_ASCENT_FLAG ; disable delayed ascent calculation |
628 | 2518 bcf lo,DECO_CALCULATOR_MODE ; deco engine not run from the deco calculator |
604 | 2519 movff lo,char_O_deco_status ; bank-safe copy back to deco engine |
0 | 2520 |
623 | 2521 ; disable "fast forward" function |
2522 movlw .0 | |
2523 movff WREG,char_I_sim_advance_time | |
2524 | |
2525 ; write last stop depth to deco engine | |
2526 movff opt_last_stop,char_I_depth_last_deco | |
2527 | |
2528 ; initialize max depth for apnoe mode | |
2529 CLRI apnoe_max_pressure | |
2530 | |
2531 ; reset minimum temperature, ISR-safe 2 byte copy | |
2532 SMOVII temperature_cur,temperature_min | |
2533 | |
2534 ; ISR-safe copy of start-of-dive date and time for logbook (6 bytes in total) | |
2535 SMOVSS rtc_year,start_year | |
2536 | |
2537 MOVII int_O_CNS_current,CNS_start ; save current CNS at beginning of dive, but | |
2538 bcf CNS_start+1,int_warning_flag ; without warning flag | |
2539 bcf CNS_start+1,int_attention_flag ; without attention flag | |
2540 | |
2541 ; save supersaturation at beginning of dive (only lower byte is used for value) | |
2542 movff int_O_lead_supersat+0,supersat_start | |
2543 | |
2544 clrf menu_pos_cur | |
2545 clrf active_premenu ; reset to zero (0= no pre-menu task) | |
2546 bsf o2_sensors_agree ; initialize sensors disagree warning system | |
2547 | |
2548 clrf safety_stop_countdown ; clear safety stop count-down | |
2549 | |
2550 CLRI last_pressure_velocity ; initialize last pressure for velocity calculation | |
2551 CLRI dive_timeout_timer ; initialize timeout counter | |
2552 | |
2553 movlw .1 ; initialize the sampling timer such that the 1st sampling ... | |
2554 movwf sampling_timer ; ... trigger will be given as soon as possible | |
2555 | |
2556 clrf message_page ; initialize message page counter | |
2557 clrf alarm_type ; clear all alarms | |
2558 | |
2559 ; clear the total dive average depth | |
2560 CLRI pressure_rel_avg_total ; average depth | |
2561 CLRI divesecs_avg_total ; time accumulator | |
2562 clrf pressure_rel_accu_total+0 ; depth accumulator | |
2563 clrf pressure_rel_accu_total+1 | |
2564 clrf pressure_rel_accu_total+2 | |
2565 clrf pressure_rel_accu_total+3 | |
604 | 2566 |
2567 IFDEF _rx_functions | |
623 | 2568 |
2569 btfss tr_functions_activated ; TR functions activated? | |
604 | 2570 bra diveloop_boot_0 ; NO - skip TR function initialization |
2571 ; YES - initialize TR function variables | |
623 | 2572 |
604 | 2573 banksel int_IO_pressure_value |
623 | 2574 clrf WREG ; clear WREG |
2575 bsf WREG,int_not_avail_flag ; set WREG to coding for integer numbers -> data not available | |
2576 clrf int_IO_pressure_value+0 ; clear low byte of 1st pressure reading value | |
2577 movwf int_IO_pressure_value+1 ; copy to high byte of 1st pressure reading value | |
2578 clrf int_IO_pressure_value+2 ; clear low byte of 2nd pressure reading value | |
2579 movwf int_IO_pressure_value+3 ; copy to high byte of 2nd pressure reading value | |
2580 clrf int_I_pressure_drop+0 ; clear low byte of 1st pressure drop value | |
2581 movwf int_I_pressure_drop+1 ; copy to high byte of 1st pressure drop value | |
2582 clrf int_I_pressure_drop+2 ; clear low byte of 2nd pressure drop value | |
2583 movwf int_I_pressure_drop+3 ; copy to high byte of 1st pressure drop value | |
604 | 2584 clrf char_I_pressure_gas+0 ; clear gas selection of 1st pressure reading |
2585 clrf char_I_pressure_gas+1 ; clear gas selection of 2nd pressure reading | |
2586 clrf char_I_pressure_age+0 ; clear age of 1st pressure reading | |
2587 clrf char_I_pressure_age+1 ; clear age of 2nd pressure reading | |
2588 clrf char_I_pressure_stat+0 ; clear status of 1st pressure reading | |
2589 clrf char_I_pressure_stat+1 ; clear status of 2nd pressure reading | |
623 | 2590 |
604 | 2591 banksel gas__last_1st ; select bank with vars for pressure drop calculation |
2592 setf gas__last_1st ; invalidate last gas of 1st reading | |
623 | 2593 setf gas__last_2nd ; invalidate last gas of 2nd reading |
2594 | |
604 | 2595 banksel common ; back to bank common |
623 | 2596 |
2597 ENDIF ; _rx_functions | |
2598 | |
604 | 2599 |
2600 diveloop_boot_0: | |
2601 setf best_gas_number ; initialize best gas as not computed yet (255) | |
623 | 2602 IFDEF _ccr_pscr |
604 | 2603 setf best_dil_number ; initialize best diluent as not computed yet (255) |
623 | 2604 ENDIF |
604 | 2605 |
2606 rcall dive_boot_oc_bail ; basic settings required for all modes | |
2607 | |
2608 btfsc FLAG_oc_mode ; in OC mode? | |
2609 rcall dive_boot_oc ; YES - add OC mode settings | |
2610 | |
623 | 2611 IFDEF _ccr_pscr |
604 | 2612 btfsc FLAG_ccr_mode ; in CCR mode? |
2613 rcall dive_boot_cc ; YES - add CC mode settings | |
2614 btfsc FLAG_ccr_mode ; in CCR mode? | |
2615 rcall dive_boot_cc_part2 ; YES - add CC sensor and SP settings | |
2616 | |
2617 btfsc FLAG_pscr_mode ; in pSCR mode? | |
2618 rcall dive_boot_cc ; YES - add CC mode settings | |
2619 btfsc FLAG_pscr_mode ; in pSCR mode? | |
2620 rcall dive_boot_cc_part2 ; YES - add CC sensor and SP settings | |
623 | 2621 ENDIF |
604 | 2622 |
2623 call ghostwriter_short_header ; write short header with dive number into profile memory | |
623 | 2624 call init_recording_params ; set up all the divisors for dive data recording |
2625 | |
2626 ; setup gas selector flag (required to have better gas working) | |
2627 bsf is_diluent_menu ; default to using diluents | |
2628 btfsc FLAG_ccr_mode ; in CCR mode? | |
2629 bra diveloop_boot_3 ; YES - default was right | |
2630 btfsc FLAG_pscr_mode ; in pSCR mode? | |
2631 bra diveloop_boot_3 ; YES - default was right | |
2632 bcf is_diluent_menu ; NO to both - revert to using OC gases | |
604 | 2633 |
2634 diveloop_boot_3: | |
582 | 2635 bcf LEDg ; switch off green LED / release reset to RX circuitry |
604 | 2636 bcf LEDr ; switch off red LED |
623 | 2637 |
2638 btfss sensor_override_active ; in simulator mode? | |
604 | 2639 call disable_rs232 ; NO - disable RS232 |
2640 | |
2641 IFDEF _screendump | |
623 | 2642 btfsc screen_dump_avail ; screen dump function enabled? |
2643 call enable_rs232 ; enable interface (also sets CPU speed to normal) | |
604 | 2644 ENDIF |
2645 | |
623 | 2646 clrf apnoe_surface_mins ; clear apnoe surface time, minutes (8 bit) |
2647 clrf apnoe_surface_secs ; clear apnoe surface time, seconds (8 bit) | |
2648 clrf apnoe_dive_mins ; clear apnoe dive time, minutes (8 bit) | |
2649 clrf apnoe_dive_secs ; clear apnoe dive time, seconds (8 bit) | |
604 | 2650 |
2651 return ; done with dive mode boot | |
2652 | |
2653 | |
2654 ;============================================================================= | |
0 | 2655 |
623 | 2656 divemode_check_warnings: |
604 | 2657 movlw .1 ; one message at a time in alternative layout |
623 | 2658 btfss alt_layout_active ; in alternative layout? |
2659 movlw .2 ; NO - two messages at a time in normal layout | |
2660 cpfsgt message_counter ; more than one (alt layout) / 2 (normal layout) messages currently active? | |
2661 bra divemode_check_warnings1 ; NO - update messages every second | |
2662 | |
2663 ; ; YES - update every 4 seconds: | |
2664 ; btfss timebase_1sec - on second 1 or 3 ? | |
2665 ; return ; NO - no update in this cycle | |
2666 ; btfss timebase_2sec ; YES - on second 3 ? | |
2667 ; return ; NO - no update in this cycle | |
2668 ; ;bra divemode_check_warnings1 ; YES - update messages | |
2669 | |
2670 ; NO - update every 2 seconds | |
2671 btfsc timebase_1sec ; - on even second? | |
2672 return ; NO - done | |
2673 ;bra divemode_check_warnings1 ; YES - update messages | |
2674 | |
2675 divemode_check_warnings1: | |
2676 ; start a new message collection cycle | |
604 | 2677 bcf message_advice ; clear flag for messages of level advice |
2678 bcf message_attention ; clear flag for messages of level attention | |
2679 bcf message_warning ; clear flag for messages of level warning | |
2680 clrf message_counter ; clear message counter | |
2681 | |
2682 ; messages sorted by severity: highest severity warnings first, then attentions, advices and last info | |
2683 | |
2684 ; warnings for all modes | |
2685 call check_warn_battery ; check if the battery level should be displayed/warned | |
623 | 2686 rcall check_depth_limit ; check current depth against set depth limit |
604 | 2687 call check_divetimeout ; check and show the dive mode timeout (not actually a warning) |
2688 | |
623 | 2689 btfsc FLAG_apnoe_mode ; in apnoe mode? |
2690 bra divemode_check_warnings2 ; YES | |
2691 | |
604 | 2692 btfsc FLAG_gauge_mode ; in gauge mode? |
623 | 2693 bra divemode_check_warnings2 ; YES |
604 | 2694 |
2695 ; warnings applicable only in deco modes | |
582 | 2696 rcall check_ppO2 ; check ppO2 and displays warning, if required |
0 | 2697 |
623 | 2698 IFDEF _external_sensor |
2699 btfss o2_sensors_agree ; are the sensor values within the threshold range? | |
2700 rcall check_warn_sensors_disagree ; NO - do further evaluation | |
2701 btfsc o2_sensors_agree ; are the sensor values within the threshold range? | |
2702 bcf o2_sensors_warning ; YES - clear flag for a new warning | |
2703 ENDIF | |
582 | 2704 |
604 | 2705 rcall check_outside ; check of ZHL16 model violation |
560 | 2706 |
623 | 2707 IFDEF _helium |
582 | 2708 rcall check_IBCD ; check for IBCD attention or warning |
623 | 2709 ENDIF |
2710 | |
2711 btfsc FLAG_ccr_mode ; in CCR mode? | |
2712 rcall check_OC_gas_avail ; YES - check if a breathable OC (bailout) gas is available | |
2713 btfsc FLAG_pscr_mode ; in pSCR mode? | |
2714 rcall check_OC_gas_avail ; YES - check if a breathable OC (bailout) gas is available | |
604 | 2715 |
2716 btfsc decostop_active ; in deco mode? | |
623 | 2717 rcall check_and_store_sat_violation; YES - sets warnings, if required |
604 | 2718 |
2719 rcall check_mbubbles ; check for micro bubbles | |
623 | 2720 rcall check_cns_violation ; check CNS value and display it, if required |
604 | 2721 rcall check_gas_needs_ascent ; show gas needs warning if any gas need for ascent is > threshold |
2722 rcall check_eod_cns_violation ; check CNS values for end-of-dive and display warning, if required | |
2723 rcall check_display_ftts ; show @+x time | |
2724 | |
2725 IFDEF _cave_mode | |
623 | 2726 btfsc cave_mode ; cave mode switched on? |
604 | 2727 rcall check_cavemode ; YES - check cave mode status |
2728 ENDIF | |
2729 | |
623 | 2730 btfsc use_aGF ; using alternative GF factors? |
604 | 2731 rcall warn_agf ; YES - show memo |
2732 | |
623 | 2733 btfsc sp_fallback ; in fallback condition due to O2 sensor failure? |
604 | 2734 rcall warn_fallback ; YES - show a warning |
2735 | |
2736 btfsc better_dil_available ; is a better diluent available? | |
2737 rcall advice_gas_change ; YES - display an advice | |
623 | 2738 |
604 | 2739 btfsc better_gas_available ; is a better gas available? |
2740 rcall advice_gas_change ; YES - display an advice | |
582 | 2741 |
623 | 2742 divemode_check_warnings2: |
604 | 2743 IFDEF _rx_functions |
623 | 2744 btfss tr_functions_activated ; TR functions activated? |
2745 bra divemode_check_warnings3 ; NO - skip | |
2746 call check_tr_functions ; YES - check transmitter functions | |
2747 call check_tr_messages ; - check SAC attention and switch advice | |
604 | 2748 ENDIF |
2749 | |
623 | 2750 divemode_check_warnings3: |
2751 ; Display / clear the advice, attention or warning icon | |
2752 btfsc message_advice ; any message of level advice? | |
2753 bsf FLAG_TFT_sign_show ; YES | |
2754 btfsc message_attention ; any message of level attention? | |
2755 bsf FLAG_TFT_sign_show ; YES | |
2756 btfsc message_warning ; any message of level warning? | |
2757 bsf FLAG_TFT_sign_show ; YES | |
2758 btfss FLAG_TFT_sign_show ; any message of above levels? | |
2759 bsf FLAG_TFT_sign_clear ; NO - clear sign | |
2760 | |
2761 ; Increment message page number | |
2762 incf message_page,F ; increment page number | |
2763 bcf STATUS,C ; clear carry bit | |
2764 movf message_page,W ; get page number into WREG | |
2765 btfss alt_layout_active ; in alternative layout? | |
2766 rlcf WREG,W ; NO - each page can take two messages | |
2767 cpfsgt message_counter ; number of actual messages > message capacity ? | |
2768 clrf message_page ; NO - all messages could be shown, restart from first page next time | |
604 | 2769 |
2770 ; Clear both rows of messages if there is nothing to show at all | |
623 | 2771 tstfsz message_counter ; any message to show? |
2772 bra divemode_check_warnings4 ; YES - look if second row needs to be cleared | |
2773 bsf FLAG_TFT_message_clear_both ; NO - request clearing of left-over messages | |
2774 return ; - done | |
2775 | |
2776 divemode_check_warnings4: | |
604 | 2777 ; Clear 2nd row of messages if there is nothing to show (on this page) |
623 | 2778 btfss message_2nd_row_used ; does the 2nd row contain a message? |
2779 bsf FLAG_TFT_message_clear_2nd ; NO - set flag to clear the 2nd row | |
2780 return ; done | |
2781 | |
2782 ;----------------------------------------------------------------------------- | |
0 | 2783 |
582 | 2784 global check_warn_battery |
0 | 2785 check_warn_battery: |
623 | 2786 movlw battery_show_level+1 ; get threshold for showing battery level, incremented by 1 |
628 | 2787 cpfslt batt_percent ; battery percentage ok? |
604 | 2788 return ; YES - no display, no warning |
582 | 2789 ; Display Battery, but warn? |
628 | 2790 movlw battery_warn_level_36+1 ; get threshold for 3.6 Volt battery warning, incremented by 1 |
2791 btfss battery_is_36v ; actually a 3.6 Volt battery detected? | |
2792 movlw battery_warn_level_15+1 ; NO - replace with 1.5 Volt battery warning, incremented by 1 | |
2793 cpfsgt batt_percent ; battery percent below warning threshold? | |
604 | 2794 bsf message_warning ; YES - set warning flag |
623 | 2795 movlw index_clock_batt_surfpress ; index of custom view clock, battery and surface pressure |
2796 cpfseq active_customview ; battery shown in custom view? | |
2797 bra check_warn_battery2 ; NO - show warning | |
2798 return ; YES - do not show twice (in custom view and in message area) | |
472
4fdf6886004b
CHANGE: Show warnings either in Customview (If active) _or_ next to warning sign
heinrichsweikamp
parents:
471
diff
changeset
|
2799 check_warn_battery2: |
628 | 2800 incf message_counter,F ; increase counter |
2801 goto TFT_msg_batt_percent_divemode ; show percent (and return) | |
623 | 2802 |
513 | 2803 |
55 | 2804 check_divetimeout: |
623 | 2805 btfsc count_divetime ; is dive time counted? |
604 | 2806 return ; YES - do nothing |
2807 incf message_counter,F ; increase counter | |
2808 goto TFT_divetimeout ; show timeout counter (and return) | |
55 | 2809 |
623 | 2810 |
560 | 2811 check_ppO2: |
623 | 2812 IFDEF _ccr_pscr |
604 | 2813 btfsc FLAG_oc_mode ; are we in OC mode? |
2814 bra check_ppO2_1 ; YES - continue with breathed gas | |
623 | 2815 btfsc bailout_mode ; NO - in bailout? |
604 | 2816 bra check_ppO2_1 ; YES - continue with breathed gas |
2817 ; CCR / pSCR mode - checks on pure diluent | |
623 | 2818 MOVII int_O_pure_ppO2,mpr ; get value and attention/warning flags for the pure diluent |
2819 btfsc hi,int_warning_flag ; is there a ppO2 low or high warning on the pure diluent? | |
604 | 2820 rcall check_ppO2_dw ; YES - show warning and return on next line |
2821 btfsc hi,int_attention_flag ; ppO2 of the pure diluent in attention state? | |
2822 rcall check_ppO2_da ; YES - show attention and return on next line | |
623 | 2823 ENDIF |
604 | 2824 ; all modes - checks on breathed gas (OC or from loop) |
2825 check_ppO2_1: | |
623 | 2826 MOVII int_O_breathed_ppO2,mpr ; get value and attention/warning flags for the breathed gas |
604 | 2827 btfsc hi,int_attention_flag ; breathed ppO2 in attention state (when in loop mode, no attention will be generated)? |
2828 bra check_ppo2_display_a ; YES - set attention flag and show ppO2 | |
623 | 2829 btfsc hi,int_low_flag ; breathed ppO2 too low? |
560 | 2830 bra check_ppO2_low ; YES - record the warning and show ppO2 |
623 | 2831 btfsc hi,int_high_flag ; breathed ppO2 too high? |
560 | 2832 bra check_ppO2_high ; YES - record the warning and show ppO2 |
582 | 2833 TSTOSS opt_showppo2 ; show ppO2 anyhow? (0 = no, 1 = show always) |
604 | 2834 return ; NO - no warnings, no show - done |
2835 bra check_ppO2_common_2 ; YES - but only when in OC or bailout... | |
560 | 2836 check_ppO2_low: |
582 | 2837 movlw d'4' ; set type of alarm (ppO2 low) |
2838 bra check_ppO2_common ; continue with common part | |
560 | 2839 check_ppO2_high: |
2840 movlw d'5' ; set type of alarm (ppO2 high) | |
2841 check_ppO2_common: | |
623 | 2842 movwf alarm_type ; copy alarm type to alarm register |
604 | 2843 bsf event_occured ; set event flag |
2844 bsf message_warning ; show warning sign | |
2845 check_ppO2_common_2: | |
2846 btfsc FLAG_oc_mode ; are we in OC mode? | |
623 | 2847 bra check_ppo2_display ; YES - show |
2848 btfsc bailout_mode ; are we in bailout mode? | |
2849 bra check_ppo2_display ; YES - show | |
604 | 2850 return ; NO - in loop mode, ppO2 is already shown via setpoint display |
2851 check_ppo2_display_a: | |
2852 bsf message_attention ; show attention sign | |
2853 check_ppo2_display: | |
628 | 2854 movlw index_ppo2_ead_end_cns ; index of custom view ppO2, EAD/END and CNS (without He) or gas density (with He) |
623 | 2855 cpfseq active_customview ; ppO2 shown? |
2856 bra check_ppO2_b ; NO | |
2857 return ; YES - do not show twice (in custom view and in warning area) | |
471
9edb1359ce43
NEW: New Customview 11 in dive mode shows ppO2, EAD/END and CNS
heinrichsweikamp
parents:
444
diff
changeset
|
2858 check_ppO2_b: |
604 | 2859 movlw index_pscr_info ; index of custom view with pSCR data |
623 | 2860 cpfseq active_customview ; ppO2 shown? |
2861 bra check_ppO2_d ; NO - show ppO2 | |
604 | 2862 return ; YES - do not show twice (in custom view and in warning area) |
2863 check_ppO2_dw: | |
2864 bsf message_warning ; show warning sign | |
2865 check_ppO2_da: | |
2866 bsf message_attention ; show attention sign (no problem if a warning sign is set as well, as it will take priority) | |
582 | 2867 check_ppO2_d: |
604 | 2868 incf message_counter,F ; increase counter |
623 | 2869 goto TFT_show_ppo2_warning ; show breathed gas or diluent ppO2 warning (and return) |
604 | 2870 |
2871 | |
2872 check_display_ftts: | |
623 | 2873 btfss count_divetime ; is dive time counted? |
2874 return ; NO - omit | |
2875 movff char_I_extra_time,lo ; YES - get extra time | |
2876 tstfsz lo ; - extra time > 0 ? | |
2877 bra check_display_ftts_1 ; YES - continue checking bailout condition | |
2878 return ; NO - done | |
604 | 2879 check_display_ftts_1: |
623 | 2880 btfsc bailout_mode ; in bailout mode? |
604 | 2881 return ; YES - in bailout no fTTS will be computed, so nothing to display |
2882 incf message_counter,F ; NO - increase counter | |
623 | 2883 goto TFT_show_ftts ; - show @+x time |
582 | 2884 |
376
e99bb91f6f92
CHANGE: Do not show ppO2 in warning area if already shown in custom view
heinrichsweikamp
parents:
352
diff
changeset
|
2885 |
582 | 2886 global check_cns_violation |
0 | 2887 check_cns_violation: |
582 | 2888 ; Check if CNS should be displayed |
623 | 2889 movff int_O_CNS_current+1,WREG ; get current CNS, high byte |
582 | 2890 btfsc WREG,int_warning_flag ; warning flag set? |
604 | 2891 bra check_cns_violation_1 ; YES - issue warning |
2892 btfsc WREG,int_attention_flag ; NO - attention flag set? | |
2893 bra check_cns_violation_2 ; YES - issue attention | |
2894 return ; NO - done | |
2895 check_cns_violation_1: | |
2896 bsf message_warning ; show warning sign | |
2897 check_cns_violation_2: | |
2898 bsf message_attention ; show attention sign | |
628 | 2899 IFNDEF _helium |
2900 movlw index_ppo2_ead_end_cns ; index of custom view ppO2, EAD/END and CNS (without He) or gas density (with He) | |
623 | 2901 cpfseq active_customview ; CNS shown? |
2902 bra check_cns_violation_3 ; NO | |
2903 return ; YES - do not show twice (in custom view and in warning area) | |
628 | 2904 ENDIF |
604 | 2905 check_cns_violation_3: |
2906 movlw index_CNS ; index of custom view with CNS values | |
623 | 2907 cpfseq active_customview ; CNS shown? |
604 | 2908 bra check_cns_violation_4 ; NO |
2909 return ; YES - do not show twice (in custom view and in warning area) | |
2910 check_cns_violation_4: | |
2911 incf message_counter,F ; increase counter | |
623 | 2912 goto TFT_show_cns ; show CNS (and return) |
582 | 2913 |
0 | 2914 |
582 | 2915 global check_eod_cns_violation ; check end-of-dive CNS values |
560 | 2916 check_eod_cns_violation: |
623 | 2917 movff int_O_CNS_current+1,WREG ; get current CNS, high byte |
582 | 2918 btfsc WREG,int_warning_flag ; current CNS value in warning state? |
604 | 2919 return ; YES - inhibit end-of-dive warning if current CNS is already in warning |
623 | 2920 movff int_O_CNS_norm+1,WREG ; get CNS at end of dive in normal plan, high byte |
560 | 2921 btfsc WREG,int_invalid_flag ; flag for invalid value set? |
2922 bra check_eod_cns_violation1 ; YES - continue with checking the other CNS value | |
582 | 2923 btfsc WREG,int_warning_flag ; NO - flag for warning set? |
2924 bra check_eod_cns_violation2 ; YES - issue warning | |
2925 check_eod_cns_violation1: ; NO - continue with checking the other CNS value | |
623 | 2926 movff int_O_CNS_alt+1,WREG ; get CNS at end of dive in alternative plan, high byte |
560 | 2927 btfsc WREG,int_invalid_flag ; flag for invalid value set? |
2928 return ; YES - done with CNS checking | |
2929 btfsc WREG,int_warning_flag ; NO - flag for warning set? | |
604 | 2930 bra check_eod_cns_violation2 ; YES - issue warning |
582 | 2931 return ; NO - done with CNS checking |
604 | 2932 check_eod_cns_violation2: ; issue warning (actually only on attention level) |
2933 bsf message_attention ; show attention sign | |
623 | 2934 movlw index_CNS ; index of custom view with CNS values |
2935 cpfseq active_customview ; CNS values shown? | |
2936 bra display_eod_cns_violation ; NO - issue textual warning | |
2937 return ; YES - do not show twice (in custom view and in warning area) | |
560 | 2938 display_eod_cns_violation: |
604 | 2939 incf message_counter,F ; increase counter |
623 | 2940 goto TFT_warning_eod_cns ; issue CNS at end-of-dive warning (and return) |
2941 | |
2942 | |
2943 global check_and_store_sat_violation | |
2944 check_and_store_sat_violation: | |
2945 movff int_O_lead_supersat+1,WREG ; get upper byte of leading tissue's supersaturation | |
560 | 2946 btfss WREG,int_warning_flag ; check if the warning flag is set |
623 | 2947 bra check_and_store_sat_violation2 ; NO - continue with checking for attention flag |
582 | 2948 movlw d'2' ; YES - set type of alarm |
623 | 2949 movwf alarm_type ; - copy to alarm register |
2950 bsf event_occured ; - set event flag | |
2951 bsf message_warning ; - set warning flag | |
2952 bra check_and_store_sat_violation3 ; - show GF warning | |
2953 check_and_store_sat_violation2: | |
582 | 2954 btfsc WREG,int_attention_flag ; check if the attention flag is set |
623 | 2955 bra check_and_store_sat_violation3 ; YES - show gf |
560 | 2956 TSTOSS opt_enable_IBCD ; NO - IBCD warning activated? |
623 | 2957 bra check_and_store_sat_violation4 ; NO - continue checking of deco info |
2958 movff char_O_deco_warnings,WREG ; YES - get the deco warnings vector | |
2959 btfss WREG,IBCD_warning ; - is the IBCD warning flag set? | |
2960 bra check_and_store_sat_violation4 ; NO - continue checking for deco info | |
2961 check_and_store_sat_violation3: ; YES - show GF | |
604 | 2962 bsf message_attention ; show attention sign |
2963 incf message_counter,F ; increase counter | |
623 | 2964 goto TFT_warning_sat ; show saturation (and return) |
2965 check_and_store_sat_violation4: ; check for deco info | |
604 | 2966 btfss divemode ; in dive mode? |
560 | 2967 return ; NO - done, return |
623 | 2968 btfsc bailout_mode ; YES - in bailout mode? |
2969 return ; YES - done, return (deco zone flag is not updated when in bailout mode) | |
604 | 2970 movff char_O_deco_info,WREG ; NO - get the deco info vector |
623 | 2971 btfss WREG,deco_zone ; check if the deco zone flag is set |
604 | 2972 return ; NO - done, return |
628 | 2973 btfsc use_aGF ; YES - using alternative GF factors? |
2974 return ; YES - suppress deco zone info | |
2975 btfsc alt_layout_active ; NO - in alternative layout? | |
2976 return ; YES - suppress deco zone info | |
2977 incf message_counter,F ; NO - increase counter | |
2978 goto TFT_info_deco ; - show deco info | |
604 | 2979 |
2980 | |
623 | 2981 check_depth_limit: |
2982 bcf depth_limit_exceeded ; clear warning flag by default | |
2983 movff opt_max_depth,WREG ; get depth limit | |
2984 cpfsgt depth_meter ; current depth > depth limit? | |
2985 return ; NO | |
2986 bsf depth_limit_exceeded ; YES - set warning flag | |
2987 incf message_counter,F ; - increase counter | |
2988 bsf message_warning ; - set warning flag | |
2989 goto TFT_warning_depth ; - show warning | |
2990 | |
2991 | |
604 | 2992 check_outside: |
2993 movff char_O_deco_warnings,WREG ; bank-safe copy of deco warnings | |
2994 btfss WREG,outside_warning_lock ; are we outside of the ZH-L16 model? | |
2995 return ; NO - done | |
2996 incf message_counter,F ; YES - increase counter | |
2997 bsf message_attention ; - show attention sign | |
2998 btfsc WREG,outside_warning ; - are we outside the ZH-L16 model right now (-> warning)? | |
2999 bsf message_warning ; - set warning flag | |
3000 goto TFT_warning_outside ; - show outside-ZHL-model warning/attention (and return) | |
3001 | |
3002 | |
3003 global check_mbubbles | |
3004 check_mbubbles: | |
3005 movff char_O_deco_warnings,WREG ; bank-safe copy for deco warnings | |
3006 btfsc WREG,mbubble_warning ; are we in micro bubbling zone right now? | |
3007 bra check_mbubbles_warn ; YES | |
3008 btfss WREG,mbubble_warning_lock ; were we in micro bubbling zone? | |
3009 return ; NO - done | |
3010 check_mbubble_att ; YES - attention level | |
3011 incf message_counter,F ; increase counter | |
3012 bsf message_attention ; show attention sign | |
3013 goto TFT_warning_mbubbles ; show micro bubble attention (and return) - TFT_warning_mbubbles switches by itself between attention and warning | |
3014 check_mbubbles_warn: ; locked micro bubbles - warning level if at issue, attention level if locked | |
3015 incf message_counter,F ; increase counter | |
3016 bsf message_warning ; set warning flag | |
3017 goto TFT_warning_mbubbles ; show micro bubbles warning (and return) | |
3018 | |
3019 IFDEF _cave_mode | |
3020 check_cavemode: | |
3021 incf message_counter,F ; increase counter | |
623 | 3022 btfsc dive_turned ; dive turned? |
604 | 3023 goto TFT_info_dive_turned ; YES - show info that dive is turned |
623 | 3024 btfsc FLAG_backtrack_full ; NO - is the backtracking storage full? |
604 | 3025 goto TFT_warn_cave_shutdown ; YES - show that cave mode has shut down |
3026 goto TFT_info_cave_mode ; NO - show that cave mode is active | |
3027 ENDIF | |
3028 | |
0 | 3029 warn_agf: |
604 | 3030 incf message_counter,F ; increase counter |
623 | 3031 goto TFT_warning_agf ; show aGF reminder (and return) |
145
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
138
diff
changeset
|
3032 |
e3ac5b2021bc
NEW: Setpoint-Fallback option for external O2 sensor failure
heinrichsweikamp
parents:
138
diff
changeset
|
3033 warn_fallback: |
604 | 3034 incf message_counter,F ; increase counter |
3035 bsf message_warning ; set warning flag | |
3036 goto TFT_warning_fallback ; show fallback warning (and return) | |
3037 | |
623 | 3038 ;============================================================================= |
604 | 3039 |
3040 IFDEF _rx_functions | |
3041 | |
3042 check_tr_messages: | |
623 | 3043 btfss count_divetime ; is the dive time counted, i.e. deeper than dive threshold? |
3044 return ; NO - suppress messages | |
3045 movff int_O_SAC_measured+1,WREG ; YES - bank-safe copy of measured SAC rate | |
3046 btfss WREG,int_attention_flag ; - attention flag set? | |
3047 bra check_tr_messages2 ; NO - skip | |
3048 btfsc WREG,int_not_avail_flag ; SAC rate available? | |
3049 bra check_tr_messages2 ; NO - continue with swap advice | |
3050 bsf message_attention ; YES - show attention sign | |
3051 movlw index_pressures_SAC ; - index of custom view with SAC rate | |
3052 cpfseq active_customview ; - SAC rate shown right now? | |
604 | 3053 bra check_tr_messages1 ; NO - show attention message |
3054 bra check_tr_messages2 ; YES - do not show twice, continue with swap advice | |
3055 check_tr_messages1: | |
3056 incf message_counter,F ; increase counter | |
3057 call TFT_attention_sac ; show SAC attention | |
3058 check_tr_messages2: | |
3059 movff char_O_deco_info,WREG ; bank-safe copy of deco info vector | |
3060 btfss WREG,ind_double_switch ; swap tank flag set? | |
3061 return ; NO | |
3062 incf message_counter,F ; YES - increase counter | |
3063 bsf message_advice ; - show advice sign | |
3064 goto TFT_advice_switch ; - show swap advice | |
3065 | |
3066 | |
3067 check_tr_functions: | |
623 | 3068 clrf xmitter_flags_mesg ; set all messages as not shown yet |
3069 movlw index_pressures_SAC ; index of custom view pressure readings | |
3070 cpfseq active_customview ; pressure readings shown? | |
3071 bra check_tr_functions_tr1 ; NO - continue with checking transmitter 1 | |
3072 bsf pres_customview_shown ; YES - suppress redraw by faking it has already been redrawn | |
604 | 3073 check_tr_functions_tr1: |
3074 movff char_I_pressure_stat+0,WREG ; get status of 1st pressure reading | |
3075 rcall check_tr_functions_helper1 ; check for transmitter 1 lost | |
3076 rcall check_tr_functions_helper2 ; check for transmitter 1 low battery | |
3077 movff int_IO_pressure_value+1,WREG ; get high byte of 1st pressure reading | |
3078 rcall check_tr_functions_helper3 ; check for transmitter 1 pressure warning | |
3079 rcall check_tr_functions_helper4 ; check for transmitter 1 pressure attention | |
3080 check_tr_functions_tr2: | |
3081 movff char_I_pressure_stat+1,WREG ; get status of 2nd pressure reading | |
3082 rcall check_tr_functions_helper5 ; check for transmitter 2 lost | |
3083 rcall check_tr_functions_helper6 ; check for transmitter 2 low battery | |
3084 movff int_IO_pressure_value+3,WREG ; get high byte of 2nd pressure reading | |
3085 rcall check_tr_functions_helper7 ; check for transmitter 2 pressure warning | |
3086 rcall check_tr_functions_helper8 ; check for transmitter 2 pressure attention | |
3087 check_tr_functions_show_xmtr: | |
628 | 3088 btfss show_transmitter_attention ; shall show transmitter attention message? |
604 | 3089 bra check_tr_functions_show_warn ; NO - continue with pressure warning |
3090 bsf message_attention ; YES - set flag for attention | |
3091 incf message_counter,F ; - increase counter | |
3092 call TFT_attention_transmitter ; - show transmitter attention message | |
3093 check_tr_functions_show_warn: | |
3094 btfss show_pres_warning ; shall show pressure warning? | |
3095 bra check_tr_functions_show_att ; NO - continue with pressure attention | |
3096 bsf message_warning ; YES - set flag for warning | |
3097 incf message_counter,F ; - increase counter | |
3098 goto TFT_warning_pres_reading ; - pressure reading warning message and done then | |
3099 check_tr_functions_show_att: | |
3100 btfss show_pres_attention ; shall show pressure attention? | |
3101 return ; NO - done | |
3102 bsf message_attention ; YES - set flag for attention | |
3103 incf message_counter,F ; - increase counter | |
3104 goto TFT_attention_pres_reading ; - pressure reading warning message and done then | |
3105 | |
3106 check_tr_functions_helper1: | |
3107 btfsc WREG,char_transmitter_lost ; transmitter 1 lost? | |
3108 bra check_tr_functions_helper1a ; YES - show transmitter attention message | |
3109 bcf transmitter1_lost ; NO - clear flag for old lost attention | |
3110 return ; - done | |
3111 check_tr_functions_helper1a: | |
628 | 3112 ; bsf show_transmitter_attention ; show transmitter attention |
604 | 3113 btfsc transmitter1_lost ; is it a new message? |
3114 return ; NO - do not show the pressure readings custom view again | |
3115 bsf transmitter1_lost ; YES - memorize it's an old message now | |
3116 bra check_tr_functions_show_cv ; - show custom view | |
3117 | |
3118 check_tr_functions_helper2: | |
3119 btfsc WREG,char_transmitter_low_bat ; transmitter 1 low battery? | |
3120 bra check_tr_functions_helper2a ; YES - show transmitter attention message | |
3121 bcf transmitter1_battery ; NO - clear flag for old battery attention | |
3122 return ; - done | |
3123 check_tr_functions_helper2a: | |
623 | 3124 bsf show_transmitter_attention ; show transmitter attention |
604 | 3125 btfsc transmitter1_battery ; is it a new message? |
3126 return ; NO - do not show the pressure readings custom view again | |
3127 bsf transmitter1_battery ; YES - memorize it's an old message now | |
3128 bra check_tr_functions_show_cv ; - show custom view | |
3129 | |
3130 check_tr_functions_helper3: | |
3131 btfsc WREG,int_warning_flag ; transmitter 1 pressure warning? | |
3132 bra check_tr_functions_helper3a ; YES - show pressure reading message as warning | |
3133 bcf transmitter1_pres_warn ; NO - clear flag for old warning | |
3134 return ; - done | |
3135 check_tr_functions_helper3a: | |
3136 bsf show_pres_warning ; show pressure warning | |
3137 btfsc transmitter1_pres_warn ; is it a new message? | |
3138 return ; NO - do not show the pressure readings custom view again | |
3139 bsf transmitter1_pres_warn ; YES - memorize it's an old message now | |
3140 bra check_tr_functions_show_cv ; - show custom view | |
3141 | |
3142 check_tr_functions_helper4: | |
3143 btfsc WREG,int_attention_flag ; transmitter 1 pressure attention? | |
3144 bra check_tr_functions_helper4a ; YES - show pressure reading message as attention | |
3145 bcf transmitter1_pres_att ; NO - clear flag for old attention | |
3146 return ; - done | |
3147 check_tr_functions_helper4a | |
3148 bsf show_pres_attention ; show pressure attention | |
3149 btfsc transmitter1_pres_att ; is it a new message? | |
3150 return ; NO - do not show the pressure readings custom view again | |
3151 bsf transmitter1_pres_att ; YES - memorize it's an old message now | |
3152 bra check_tr_functions_show_cv ; - show custom view | |
3153 | |
3154 check_tr_functions_helper5: | |
3155 btfsc WREG,char_transmitter_lost ; transmitter 2 lost? | |
3156 bra check_tr_functions_helper5a ; YES - show transmitter attention message | |
3157 bcf transmitter2_lost ; NO - clear flag for old lost attention | |
3158 return ; - done | |
3159 check_tr_functions_helper5a: | |
628 | 3160 ; bsf show_transmitter_attention ; show transmitter attention |
604 | 3161 btfsc transmitter2_lost ; is it a new message? |
3162 return ; NO - do not show the pressure readings custom view again | |
3163 bsf transmitter2_lost ; YES - memorize it's an old message now | |
3164 bra check_tr_functions_show_cv ; - show custom view | |
3165 | |
3166 check_tr_functions_helper6: | |
3167 btfsc WREG,char_transmitter_low_bat ; transmitter 2 low battery? | |
3168 bra check_tr_functions_helper6a ; YES - show transmitter attention message | |
3169 bcf transmitter2_battery ; NO - clear flag for old battery attention | |
3170 return ; - done | |
3171 check_tr_functions_helper6a: | |
623 | 3172 bsf show_transmitter_attention ; show transmitter attention |
604 | 3173 btfsc transmitter2_battery ; is it a new message? |
3174 return ; NO - do not show the pressure readings custom view again | |
3175 bsf transmitter2_battery ; YES - memorize it's an old message now | |
3176 bra check_tr_functions_show_cv ; - show custom view | |
3177 | |
3178 check_tr_functions_helper7: | |
3179 btfsc WREG,int_warning_flag ; transmitter 2 pressure warning? | |
3180 bra check_tr_functions_helper7a ; YES - show pressure reading message as warning | |
3181 bcf transmitter2_pres_warn ; NO - clear flag for old warning | |
3182 return ; - done | |
3183 check_tr_functions_helper7a: | |
3184 bsf show_pres_warning ; show pressure warning | |
3185 btfsc transmitter2_pres_warn ; is it a new message? | |
3186 return ; NO - do not show the pressure readings custom view again | |
3187 bsf transmitter2_pres_warn ; YES - memorize it's an old message now | |
3188 bra check_tr_functions_show_cv ; - show custom view | |
3189 | |
3190 check_tr_functions_helper8: | |
3191 btfsc WREG,int_attention_flag ; transmitter 2 pressure attention? | |
3192 bra check_tr_functions_helper8a ; YES - show pressure reading message as attention | |
3193 bcf transmitter2_pres_att ; NO - clear flag for old attention | |
3194 return ; - done | |
3195 check_tr_functions_helper8a | |
3196 bsf show_pres_attention ; show pressure attention | |
3197 btfsc transmitter2_pres_att ; is it a new message? | |
3198 return ; NO - do not show the pressure readings custom view again | |
3199 bsf transmitter2_pres_att ; YES - memorize it's an old message now | |
3200 ;bra check_tr_functions_show_cv ; - show custom view | |
3201 | |
3202 check_tr_functions_show_cv: | |
623 | 3203 btfsc pres_customview_shown ; is the pressure readings custom view not shown yet? |
604 | 3204 return ; NO - already shown, done |
623 | 3205 bsf pres_customview_shown ; YES - mark as shown |
3206 movlw index_pressures_SAC-1 ; - custom view number one below pressure readings | |
3207 movwf active_customview ; - set custom view number | |
3208 bsf request_next_custview ; - initiate toggle to desired custom view -> pressure readings view will be shown | |
3209 return ; - done | |
604 | 3210 |
3211 ENDIF | |
3212 | |
623 | 3213 ;============================================================================= |
604 | 3214 |
3215 check_gas_needs_ascent: | |
623 | 3216 banksel int_O_gas_need_pres |
3217 movf int_O_gas_need_pres+1,W ; get high byte from pres need of 1st tank | |
3218 iorwf int_O_gas_need_pres+3,W ; inclusive or with high byte from pres need of 2nd tank | |
3219 iorwf int_O_gas_need_pres+5,W ; inclusive or with high byte from pres need of 3rd tank | |
3220 iorwf int_O_gas_need_pres+7,W ; inclusive or with high byte from pres need of 4th tank | |
3221 iorwf int_O_gas_need_pres+9,W ; inclusive or with high byte from pres need of 5th tank | |
560 | 3222 banksel common |
582 | 3223 btfsc WREG,int_invalid_flag ; check if invalid flag is set |
560 | 3224 return ; YES - no further checking required |
623 | 3225 btfsc WREG,int_warning_flag ; NO - check if any gas has a pres_need >= pres_fill |
3226 bra check_gas_needs_ascent_warn ; YES - generate a warning | |
3227 btfsc WREG,int_attention_flag ; NO - check if any gas has a pres_need >= pres_fill * threshold | |
3228 bra check_gas_needs_ascent_att ; YES - generate an attention | |
3229 bcf gas_needs_attention ; NO - clear flag for a new attention | |
3230 bcf gas_needs_warning ; - clear flag for a new warning | |
3231 return ; - done | |
3232 | |
3233 check_gas_needs_ascent_warn: | |
3234 bsf message_warning ; set warning flag | |
3235 incf message_counter,F ; increase counter | |
3236 btfsc gas_needs_warning ; is it a new warning? | |
3237 goto TFT_warning_gas_needs_warn ; NO - do not show the gas needs custom view again | |
3238 bsf gas_needs_warning ; YES - memorize it's an old now | |
3239 movlw index_gas_needs_ascent-1 ; - custom view number one below gas needs view | |
3240 movwf active_customview ; - set custom view number | |
3241 bsf request_next_custview ; - initiate toggle to desired custom view -> gas needs view will be shown | |
3242 goto TFT_warning_gas_needs_warn ; - show warning message | |
3243 | |
3244 check_gas_needs_ascent_att: | |
3245 bsf message_attention ; set attention flag | |
3246 incf message_counter,F ; increase counter | |
3247 btfsc gas_needs_attention ; is it a new attention? | |
3248 goto TFT_warning_gas_needs_att ; NO - do not show the gas needs custom view again | |
3249 bsf gas_needs_attention ; YES - memorize it's an old now | |
3250 movlw index_gas_needs_ascent-1 ; - custom view number one below gas needs view | |
3251 movwf active_customview ; - set custom view number | |
3252 bsf request_next_custview ; - initiate toggle to desired custom view -> gas needs view will be shown | |
3253 goto TFT_warning_gas_needs_att ; - show attention message | |
3254 | |
3255 ;============================================================================= | |
3256 | |
3257 IFDEF _external_sensor | |
582 | 3258 |
560 | 3259 check_warn_sensors_disagree: |
604 | 3260 incf message_counter,F ; increase counter |
623 | 3261 bsf message_warning ; set warning flag |
3262 btfsc o2_sensors_warning ; is it a new warning? | |
3263 goto TFT_warning_sensor_disagree ; NO - don't show sensor custom view again, just show sensor disagree warning and return | |
3264 bsf o2_sensors_warning ; YES - memorize it's an old warning now | |
3265 call show_sensors_custview ; - show sensors custom view | |
3266 goto TFT_warning_sensor_disagree ; - show sensor disagree warning and return | |
3267 | |
3268 ENDIF | |
3269 | |
3270 ;============================================================================= | |
3271 | |
3272 IFDEF _helium | |
560 | 3273 |
3274 check_IBCD: | |
3275 TSTOSS opt_enable_IBCD ; IBCD warning activated? | |
3276 return ; NO - done | |
3277 movff char_O_deco_warnings,WREG ; YES - get deco warnings vector | |
582 | 3278 btfss WREG,IBCD_warning ; IBCD warning flag set? |
3279 return ; NO - return | |
604 | 3280 incf message_counter,F ; YES - increase counter |
582 | 3281 goto TFT_warning_IBCD ; write warning to display |
560 | 3282 |
623 | 3283 ENDIF |
3284 | |
3285 ;============================================================================= | |
560 | 3286 |
604 | 3287 check_OC_gas_avail: |
623 | 3288 tstfsz best_gas_number ; is a breathable OC (bailout) gas available? |
3289 return ; YES (>0) - a breathable gas is available | |
3290 btfsc bailout_mode ; NO (=0) - in bailout? | |
3291 return ; YES - suppress warning | |
3292 incf message_counter,F ; NO - increase counter | |
3293 bsf message_warning ; - set attention flag | |
3294 goto TFT_warning_no_BO_gas ; - show waring (and return) | |
604 | 3295 |
3296 | |
3297 advice_gas_change: | |
3298 bsf message_advice ; show advice sign | |
3299 incf message_counter,F ; increase counter | |
3300 goto TFT_advice_gas_change | |
3301 | |
3302 | |
560 | 3303 global restart_deco_engine |
3304 global restart_deco_engine_wo_ceiling | |
3305 restart_deco_engine: | |
623 | 3306 banksel int_O_ceiling ; switch to bank where the shared "_O_" variables are stored |
3307 bsf int_O_ceiling+1,char_invalid_flag ; invalidate ceiling (int_O_ceiling has its invalid flag on a char's position!) | |
560 | 3308 |
3309 restart_deco_engine_wo_ceiling: | |
623 | 3310 banksel char_O_deco_gas ; switch to bank where the shared "_O_" variables are stored |
3311 bsf char_O_deco_gas+0,char_invalid_flag ; invalidate deco data (stop table data) | |
3312 bsf int_O_TTS_norm+1,int_invalid_flag ; invalidate ascent time (normal plan) | |
3313 bsf int_O_CNS_norm+1,int_invalid_flag ; invalidate CNS at end of dive in normal plan | |
3314 ; restart deco engine: | |
3315 bcf char_O_deco_status,DECO_COMPLETED_NORM ; eventually clear flag stating completion of normal plan | |
3316 bsf char_O_deco_status,DECO_COMPLETED_ALT ; fake we came from alternative plan to force normal plan to be done next | |
604 | 3317 |
3318 inval_alternative_plan_data: | |
623 | 3319 banksel int_O_TTS_alt ; switch to bank where the shared "_O_" variables are stored |
3320 bsf int_O_TTS_alt+1,int_invalid_flag ; invalidate ascent time (alternative plan) | |
3321 bsf int_O_CNS_alt+1,int_invalid_flag ; invalidate CNS at end of dive in alternative plan | |
3322 bsf int_O_gas_need_pres+1,int_invalid_flag ; invalidate ascent gas needs | |
604 | 3323 |
3324 IFDEF _rx_functions | |
623 | 3325 bsf int_O_pressure_need+1,int_not_avail_flag ; invalidate pressure needs to reading 1 (TR functions) |
3326 bsf int_O_pressure_need+3,int_not_avail_flag ; invalidate pressure needs to reading 2 (TR functions) | |
604 | 3327 ENDIF |
3328 | |
623 | 3329 banksel common ; bank to bank common |
3330 bsf new_deco_data_avail ; set flag for new NDL and deco data available to have the display updated | |
582 | 3331 |
3332 return | |
3333 | |
3334 ;============================================================================= | |
604 | 3335 ; Simulator Mode |
582 | 3336 ; |
3337 global do_demo_divemode | |
3338 do_demo_divemode: | |
604 | 3339 |
3340 ; +++ COMMENT OUT FOR TESTING PURPOSE ONLY !!! +++ | |
623 | 3341 bsf simulatormode ; will restore tissue pressures and CNS value after simulator use |
604 | 3342 ; +++ DO NOT COMMENT OUT IN OPERATIONAL USE !!! +++ |
560 | 3343 |
623 | 3344 call TFT_ClearScreen ; blank screen |
3345 call option_save_all ; save all settings into EEPROM before starting simulation | |
3346 call deco_push_tissues_to_vault ; back-up the tissue pressures (C-code) | |
3347 banksel common ; back to bank common | |
3348 | |
3349 ; set simulated target depth | |
3350 movff char_I_bottom_depth,simulatormode_depth | |
3351 | |
3352 ; set initial simulated depth (needed to overcome end-of-dive detection) | |
3353 banksel pressure_rel_sim | |
3354 MOVLI simulator_startdepth,pressure_rel_sim | |
3355 banksel common | |
3356 | |
3357 ; switch ISR pressure calculations to simulator mode | |
3358 bcf quit_simulatormode ; clear flag for fast abort request | |
3359 bcf sensor_override_active ; make sure ISR mode switch confirmation is not older than from now on | |
3360 bsf sensor_override_request ; request ISR to switch to simulator mode | |
3361 btfss sensor_override_active ; has the ISR confirmed switch to simulator mode? | |
3362 bra $-2 ; NO - not yet, loop waiting for the ISR to kick in | |
3363 | |
3364 ; branch into dive mode | |
3365 bsf divemode ; activate dive mode (to be done after simulator mode is activated) | |
3366 goto diveloop ; branch to dive mode code | |
3367 | |
3368 END |