0
|
1 ;=============================================================================
|
|
2 ;
|
|
3 ; File divemode.asm
|
|
4 ;
|
|
5 ; Divemode
|
|
6 ;
|
|
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
|
|
8 ;=============================================================================
|
|
9 ; HISTORY
|
|
10 ; 2011-08-15 : [mH] moving from OSTC code
|
|
11
|
275
|
12 #include "hwos.inc" ; Mandatory header
|
0
|
13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c
|
|
14 #include "tft_outputs.inc"
|
|
15 #include "strings.inc"
|
|
16 #include "tft.inc"
|
|
17 #include "eeprom_rs232.inc"
|
|
18 #include "isr.inc"
|
|
19 #include "math.inc"
|
|
20 #include "wait.inc"
|
|
21 #include "customview.inc"
|
|
22 #include "start.inc"
|
|
23 #include "adc_lightsensor.inc"
|
|
24 #include "ghostwriter.inc"
|
|
25 #include "i2c.inc"
|
113
|
26 #include "calibrate.inc"
|
216
|
27 #include "convert.inc"
|
0
|
28
|
|
29 gui CODE
|
|
30
|
|
31 global diveloop
|
|
32 diveloop:
|
|
33 banksel common
|
|
34 call speed_normal
|
|
35 call diveloop_boot ; Boot tasks for all modes
|
|
36
|
|
37 ; Startup Tasks for all modes
|
206
|
38 call TFT_boot ; Initialize TFT (includes clear screen)
|
0
|
39 call TFT_divemode_mask ; Display mask
|
|
40 call TFT_temp_divemode ; Displays temperature
|
39
|
41 movff customview_divemode,menupos3 ; Reload last customview
|
|
42 call customview_mask ; Redraw last custom view
|
0
|
43
|
|
44 btfsc FLAG_apnoe_mode
|
|
45 bsf realdive ; Set Realdive flag in Apnoe mode
|
|
46
|
|
47 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode
|
|
48 bra diveloop_loop
|
|
49 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode
|
|
50 bra diveloop_loop
|
|
51
|
|
52 call TFT_active_gas_divemode ; Display gas/Setpoint
|
|
53 call TFT_display_ndl_mask ; display "NDL"
|
|
54
|
|
55 ; +@5 init
|
|
56 setf WREG ; WAIT marker: display "---"
|
|
57 movff WREG,int_O_extra_ascenttime+0
|
|
58 movff WREG,int_O_extra_ascenttime+1
|
|
59 movlw 1
|
|
60 movwf apnoe_mins ; Start compute after next cycle.
|
|
61
|
|
62 ;--------------------------------------------------------------------------------------------------------
|
|
63 diveloop_loop: ; The diveloop starts here
|
|
64 btfss onesecupdate
|
|
65 bra diveloop_loop3
|
|
66
|
|
67 ; tasks any new second...
|
178
|
68 bcf onesecupdate ; one seconds update, clear flag here in case it's set again in ISR before all tasks are done.
|
|
69
|
0
|
70 btfsc FLAG_apnoe_mode ; Only in apnoe mode
|
|
71 bra diveloop_loop1b ; One Second Tasks in Apnoe mode
|
|
72
|
|
73 call TFT_divemins ; Display (new) divetime!
|
|
74 call customview_second ; Do every-second tasks for the custom view area
|
131
|
75 call divemode_check_for_warnings ; Check for any warnings
|
0
|
76
|
|
77 ; Tasks only for deco modes
|
104
|
78 btfsc show_safety_stop ; Show the safety stop?
|
|
79 call TFT_show_safety_stop ; Yes, show/delete if done.
|
0
|
80 call calc_deko_divemode ; calculate decompression and display result (any two seconds)
|
|
81 bra diveloop_loop1x ; Common Tasks
|
|
82
|
|
83 diveloop_loop1b:
|
|
84 ; Tasks only for Apnoe mode
|
131
|
85 rcall divemode_apnoe_tasks ; 1 sec. Apnoe tasks
|
134
|
86 call customview_second ; Do every-second tasks for the custom view area
|
254
|
87 bra diveloop_loop1x ; Common Tasks
|
0
|
88
|
|
89 diveloop_loop1x:
|
|
90 ; Common 1sec. tasks for all modes
|
131
|
91 rcall timeout_divemode ; dive finished? This routine sets the required flags
|
|
92 rcall set_dive_modes ; tests if depth>threshold
|
|
93 rcall set_min_temp ; store min. temp if required
|
0
|
94
|
|
95 btfsc store_sample ; store new sample?
|
|
96 call store_dive_data ; Store profile data
|
|
97
|
|
98 btfss divemode ; Dive finished?
|
|
99 goto ghostwriter_end_dive ; Dive finished!
|
|
100
|
|
101 btfsc divemode_gaschange ; Gas switch flag set?
|
|
102 rcall gas_switched_common ; Yes
|
|
103
|
|
104 btfsc toggle_gf ; =1: Toggle GF/aGF
|
|
105 rcall divemodemode_togglegf ; Toggle aGF/GF
|
|
106
|
113
|
107 call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays
|
|
108
|
0
|
109 diveloop_loop3:
|
|
110 rcall test_switches_divemode ; Check switches in divemode
|
|
111
|
|
112 global diveloop_loop4
|
|
113 diveloop_loop4: ; Menu-Exit returns here...
|
|
114 btfsc toggle_customview ; Next view?
|
|
115 call customview_toggle ; Yes, show next customview (and delete this flag)
|
|
116
|
|
117 btfsc pressure_refresh ; new pressure available?
|
|
118 rcall update_temp_and_or_depth ; Yes, display new depth and clear "pressure_refresh" flag
|
|
119
|
|
120 btfsc oneminupdate ; one minute tasks
|
|
121 rcall update_divemode60 ; Update clock, etc.
|
|
122
|
239
|
123 ; btfss quarter_second_update
|
|
124 ; bra diveloop_loop4a
|
83
|
125
|
0
|
126 bcf quarter_second_update
|
|
127 movlw .6
|
|
128 cpfseq menupos3 ; in compass view?
|
|
129 bra diveloop_loop4a ; No
|
256
|
130 extern TFT_dive_compass_heading
|
0
|
131 call TFT_dive_compass_heading ; Yes, update compass heading value
|
|
132 diveloop_loop4a:
|
|
133 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
|
|
134 bra diveloop_loop5
|
|
135 bra diveloop_loop6
|
|
136 diveloop_loop5:
|
|
137 btfss vusb_in ; USB (still) plugged in?
|
|
138 bcf enable_screen_dumps ; No, clear flag
|
|
139 call rs232_get_byte
|
|
140 btfsc rs232_recieve_overflow
|
|
141 bra diveloop_loop6
|
|
142 movlw "l"
|
|
143 cpfseq RCREG1
|
|
144 bra diveloop_loop6
|
|
145 call TFT_dump_screen ; Dump the screen contents
|
|
146 diveloop_loop6:
|
|
147
|
|
148 bra diveloop_loop ; Loop the divemode
|
|
149 ;--------------------------------------------------------------------------------------------------------
|
|
150
|
|
151
|
|
152 divemode_apnoe_tasks: ; 1 sec. Apnoe tasks
|
134
|
153 call TFT_display_apnoe_descent ; Yes, Show descent timer
|
0
|
154 call TFT_max_pressure ; use normal max. depth
|
|
155
|
|
156 btfsc divemode2 ; Time running?
|
|
157 bra divemode_apnoe_tasks2 ; New descent, reset data if flag is set
|
|
158
|
|
159 rcall apnoe_calc_maxdepth
|
|
160 call TFT_display_apnoe_surface
|
|
161 call TFT_display_apnoe_last_max ; Show last max. depth
|
|
162 incf apnoe_surface_secs,F
|
|
163 movlw d'60'
|
|
164 cpfseq apnoe_surface_secs
|
|
165 bra divemode_apnoe_tasks1
|
|
166 clrf apnoe_surface_secs
|
|
167 incf apnoe_surface_mins,F
|
|
168
|
|
169 divemode_apnoe_tasks1:
|
|
170 bcf FLAG_active_descent ; Clear flag
|
|
171 btfsc divemode2 ; Time running?
|
|
172 return ; Yes, return
|
|
173 bsf FLAG_active_descent ; Set Flag
|
|
174 return
|
|
175
|
|
176 divemode_apnoe_tasks2:
|
|
177 btfss FLAG_active_descent ; Are we descending?
|
|
178 return ; No, We are at the surface
|
|
179 rcall apnoe_calc_maxdepth ; Yes!
|
|
180 call TFT_apnoe_clear_surface ; Clear Surface timer
|
|
181 clrf apnoe_timeout_counter ; Delete timeout
|
|
182 clrf apnoe_surface_secs
|
|
183 clrf apnoe_surface_mins
|
|
184 clrf apnoe_secs
|
|
185 clrf apnoe_mins ; Reset Descent time
|
|
186 movlw .0
|
|
187 movff WREG,max_pressure+0
|
|
188 movff WREG,max_pressure+1 ; Reset Max. Depth
|
|
189 bcf FLAG_active_descent ; Clear flag
|
|
190 return
|
|
191
|
|
192 global apnoe_calc_maxdepth
|
|
193 apnoe_calc_maxdepth:
|
|
194 movff apnoe_max_pressure+0,sub_a+0
|
|
195 movff apnoe_max_pressure+1,sub_a+1
|
|
196 movff max_pressure+0,sub_b+0
|
|
197 movff max_pressure+1,sub_b+1
|
|
198 call subU16 ; sub_c = sub_a - sub_b
|
|
199 ; apnoe_max_pressure<max_pressure -> neg_flag=1
|
|
200 ; max_pressure<=apnoe_max_pressure -> neg_flag=0
|
|
201 btfss neg_flag
|
|
202 return
|
|
203 ;apnoe_max_pressure<max_pressure
|
|
204 movff max_pressure+0,apnoe_max_pressure+0
|
|
205 movff max_pressure+1,apnoe_max_pressure+1
|
|
206 return
|
|
207
|
|
208
|
|
209 calc_deko_divemode:
|
|
210 btfsc twosecupdate ; two seconds after the last call
|
|
211 bra calc_deko_divemode2 ; Yes, calculate and display deco data ("first second")
|
|
212
|
|
213 bsf twosecupdate ; No, but next second!
|
|
214 ; Routines used in the "other second"
|
|
215 call calc_average_depth ; calculate average depth
|
|
216 call calc_velocity ; calculate vertical velocity and display if > threshold (every two seconds)
|
104
|
217 call set_reset_safety_stop ; Set flags for safety stop and/or reset safety stop
|
0
|
218 call TFT_debug_output
|
|
219
|
|
220 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode
|
|
221 return
|
|
222 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode
|
|
223 return
|
|
224
|
|
225 ; Calculate CNS
|
|
226 rcall set_actual_ppo2 ; Set char_I_actual_ppO2
|
|
227 clrf WREG
|
|
228 movff WREG,char_I_step_is_1min ; Make sure to be in 2sec mode.
|
|
229 call deco_calc_CNS_fraction ; calculate CNS
|
|
230 movlb b'00000001' ; rambank 1 selected
|
|
231
|
|
232 ; Check for a gas change
|
|
233 rcall check_gas_change ; Checks if a better gas should be selected (by user)
|
|
234
|
|
235 return
|
|
236
|
|
237 global set_actual_ppo2
|
|
238 set_actual_ppo2: ; calculate ppO2 in 0.01bar (e.g. 150 = 1.50 bar ppO2)
|
111
|
239 btfsc divemode ; in divemode
|
|
240 bra set_actual_ppo2_dive ; Yes
|
|
241 ; No, use simulated ambient pressure for char_I_actual_ppO2
|
|
242 movff char_I_bottom_depth,WREG
|
|
243 mullw .100
|
|
244 movlw LOW(.1000)
|
|
245 addwf PRODL,W
|
|
246 movwf xA+0
|
|
247 movlw HIGH(.1000)
|
|
248 addwfc PRODH,W
|
|
249 movwf xA+1 ; P_amb in millibar (1000 = 1.00 bar).
|
|
250 bra set_actual_ppo2_common
|
|
251 set_actual_ppo2_dive:
|
0
|
252 SAFE_2BYTE_COPY amb_pressure, xA ; P_amb in millibar (1000 = 1.00 bar).
|
111
|
253 set_actual_ppo2_common:
|
113
|
254 movlw d'10'
|
0
|
255 movwf xB+0
|
|
256 clrf xB+1
|
|
257 call div16x16 ; xC=p_amb/10 (100 = 1.00 bar).
|
|
258 movff xC+0,xA+0
|
|
259 movff xC+1,xA+1
|
|
260 movff char_I_O2_ratio,xB+0
|
|
261 clrf xB+1
|
|
262 call mult16x16 ; char_I_O2_ratio * (p_amb/10)
|
|
263 movff xC+0,xA+0
|
|
264 movff xC+1,xA+1
|
|
265 movlw d'100'
|
|
266 movwf xB+0
|
|
267 clrf xB+1
|
|
268 call div16x16 ; xC=(char_I_O2_ratio * p_amb/10)/100
|
|
269
|
|
270 ; Copy ppO2 for CNS calculation
|
|
271 tstfsz xC+1 ; Is ppO2 > 2.55bar ?
|
|
272 setf xC+0 ; yes: bound to 2.55... better than wrap around.
|
|
273
|
|
274 movff xC+0, char_I_actual_ppO2 ; copy last ppO2 to buffer register
|
|
275 btfsc is_bailout ; In Bailout?
|
|
276 return ; Yes, done.
|
|
277 ; No Bailout, check for ccr mode
|
|
278 btfsc FLAG_ccr_mode ; If FLAG_ccr_mode=1...
|
|
279 movff char_I_const_ppO2, char_I_actual_ppO2 ; ...copy last ppO2 to buffer register
|
|
280 return
|
|
281
|
195
|
282 check_fallback_clear:
|
|
283 call check_sensors ; Setups "use_O2_sensorX" flags
|
|
284 ; Copy use flags to voting logic flags in case we are no longer in fallback
|
|
285 btfsc use_O2_sensor1
|
|
286 bsf voting_logic_sensor1
|
|
287 btfsc use_O2_sensor2
|
|
288 bsf voting_logic_sensor2
|
|
289 btfsc use_O2_sensor3
|
|
290 bsf voting_logic_sensor3
|
|
291 rcall divemode_setup_sensor_values ; Setup sensor values
|
|
292 call check_sensors ; Check O2 sensor thresholds for fallback
|
|
293 return
|
0
|
294
|
|
295 calc_deko_divemode2:
|
145
|
296 bcf twosecupdate
|
0
|
297
|
|
298 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode
|
|
299 return
|
|
300 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode
|
|
301 return
|
|
302
|
|
303 extern deco_setup_dive
|
|
304 call deco_setup_dive ; Pass all parameters to the C code
|
|
305
|
195
|
306
|
|
307 btfsc setpoint_fallback ; Are we in Fallback?
|
|
308 rcall check_fallback_clear ; Yes, check if we still have fallback condition
|
|
309
|
145
|
310 bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure
|
|
311
|
277
|
312 btfsc FLAG_ccr_mode ; In CCR mode?
|
|
313 rcall calc_deko_divemode_sensor ; External sensor stuff
|
152
|
314
|
0
|
315 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; C-code needs the ambient pressure
|
|
316 clrf WREG
|
|
317 movff WREG,char_I_step_is_1min ; Force 2 second deco mode
|
|
318
|
|
319 clrf TMR5L
|
|
320 clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H
|
|
321 call deco_calc_hauptroutine ; calc_tissue
|
|
322 movlb .1
|
|
323
|
|
324 movff char_O_deco_status,WREG ; Is a compute cycle finished ?
|
|
325 iorwf WREG,F
|
|
326 btfss STATUS,Z
|
|
327 return ; Return is status <> 0
|
|
328
|
|
329 ; Check if deco stops are necessary ?
|
|
330 movff char_O_first_deco_depth,wait_temp ; copy ceiling to temp register
|
|
331 tstfsz wait_temp ; Ceiling<0m?
|
|
332 bra calc_deko_divemode3 ; Yes!
|
|
333
|
|
334 btfsc decostop_active ; Already in nodeco mode ?
|
|
335 call TFT_display_ndl_mask ; No, Clear deco data, display nostop time
|
|
336 bcf decostop_active ; clear flag (again)
|
|
337
|
|
338 ; Copy for profile recording
|
|
339 clrf decodata+0
|
|
340 movff char_O_nullzeit,decodata+1 ; NDL
|
|
341
|
|
342 call TFT_display_ndl ; display no deco limit
|
|
343 return
|
|
344
|
|
345 calc_deko_divemode3:
|
|
346 btfss decostop_active ; Already in deco mode ?
|
|
347 call TFT_display_deko_mask ; No, clear nostop time, display decodata
|
|
348 bsf decostop_active ; Set flag (again)
|
|
349
|
|
350 ; Copy for profile recording
|
|
351 movff char_O_first_deco_depth,decodata+0 ; ceiling
|
|
352 movff char_O_first_deco_time,decodata+1 ; length of first stop in minues
|
|
353 call TFT_display_deko ; display decodata
|
|
354 call TFT_show_TTS_divemode ; display TTS
|
|
355
|
|
356 movff char_I_extra_time,WREG
|
|
357 tstfsz WREG ; extra time = 0?
|
|
358 bra calc_deko_divemode4 ; No, compute it
|
|
359 return
|
|
360
|
|
361 calc_deko_divemode4:
|
|
362 ; Check if extra cycles are needed to compute @5 variant:
|
|
363 decfsz apnoe_mins,F ; Reached count-down ?
|
|
364 return ; No: don't compute yet.
|
|
365
|
|
366 movlw .6
|
|
367 movff WREG,char_O_deco_status ; Stole next cycles for @5 variant.
|
|
368
|
|
369 movlw .2 ; Restart countdown.
|
|
370 movwf apnoe_mins
|
|
371 return ; done.
|
277
|
372
|
|
373 calc_deko_divemode_sensor: ; External sensor stuff
|
|
374 TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor
|
|
375 return
|
|
376 rcall divemode_setup_sensor_values ; Setup sensor values
|
|
377 call check_sensors ; Check O2 sensor thresholds for fallback
|
|
378 movff sensor_setpoint,char_I_const_ppO2; Copy sensor result
|
|
379
|
|
380 TSTOSS opt_sensor_fallback ; =1: Fallback to SP1 when sensor is lost
|
|
381 return ; Never fallback
|
|
382
|
|
383 btfsc is_bailout ; In bailout?
|
|
384 return ; Never fallback in bailout
|
|
385 ; Check if we should fallback to SP1
|
|
386 btfsc use_O2_sensor1
|
|
387 return ; At least one sensor is active, no fallback
|
|
388 btfsc use_O2_sensor2
|
|
389 return ; At least one sensor is active, no fallback
|
|
390 btfsc use_O2_sensor3
|
|
391 return ; At least one sensor is active, no fallback
|
|
392 ; No sensor in use -> fallback
|
|
393 movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; Setup fixed Setpoint (Always fallback to SP1), overwrite sensor result
|
|
394 bsf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure
|
|
395 return
|
0
|
396
|
|
397 ;-----------------------------------------------------------------------------
|
|
398
|
|
399 divemodemode_togglegf: ; Toggle aGF/GF
|
|
400 bcf toggle_gf ; clear flag
|
|
401 btg use_agf ; Toggle GF
|
|
402 call TFT_gf_mask ; Setup Mask
|
|
403 clrf WREG
|
|
404 movff WREG,char_O_deco_status ; Restart decoplan computation
|
|
405 return
|
|
406
|
193
|
407 global divemode_setup_sensor_values
|
0
|
408 divemode_setup_sensor_values:
|
|
409 ; sum up sensor values (in xA:2) and active sensors in (xB:2)
|
|
410 clrf xB+0
|
|
411 clrf xB+1
|
|
412 clrf xA+0
|
|
413 clrf xA+1
|
192
|
414 btfss use_O2_sensor1 ; Sensor1 active?
|
|
415 bra divemode_setup_sensor_values2 ; No
|
|
416 btfss voting_logic_sensor1 ; Sensor within voting logic?
|
0
|
417 bra divemode_setup_sensor_values2 ; No
|
|
418 movf o2_ppo2_sensor1,W
|
|
419 addwf xA+0
|
|
420 movlw .0
|
|
421 addwfc xA+1 ; Add into xA:2
|
|
422 incf xB+0,F ; Add a sensor
|
|
423 divemode_setup_sensor_values2:
|
192
|
424 btfss use_O2_sensor2 ; Sensor2 active?
|
|
425 bra divemode_setup_sensor_values3 ; No
|
|
426 btfss voting_logic_sensor2 ; Sensor within voting logic?
|
0
|
427 bra divemode_setup_sensor_values3 ; No
|
|
428 movf o2_ppo2_sensor2,W
|
|
429 addwf xA+0
|
|
430 movlw .0
|
|
431 addwfc xA+1 ; Add into xA:2
|
|
432 incf xB+0,F ; Add a sensor
|
|
433 divemode_setup_sensor_values3:
|
192
|
434 btfss use_O2_sensor3 ; Sensor3 active?
|
|
435 bra divemode_setup_sensor_values4 ; No
|
|
436 btfss voting_logic_sensor3 ; Sensor within voting logic?
|
0
|
437 bra divemode_setup_sensor_values4 ; No
|
|
438 movf o2_ppo2_sensor3,W
|
|
439 addwf xA+0
|
|
440 movlw .0
|
|
441 addwfc xA+1 ; Add into xA:2
|
|
442 incf xB+0,F ; Add a sensor
|
|
443 divemode_setup_sensor_values4:
|
|
444 call div16x16 ; xA/xB=xC with xA+0 as remainder
|
|
445 movff xC+0,sensor_setpoint ; Copy result
|
|
446 return
|
|
447
|
|
448 calc_velocity: ; called every two seconds
|
|
449 btfss divemode
|
307
|
450 return ; display velocity only in divemode (Not at the surface after dive)
|
0
|
451
|
|
452 calc_velocity2:
|
|
453 SAFE_2BYTE_COPY amb_pressure, sub_a
|
|
454 movff last_pressure_velocity+0,sub_b+0
|
|
455 movff last_pressure_velocity+1,sub_b+1
|
|
456 movff sub_a+0,last_pressure_velocity+0 ; store old value for velocity
|
|
457 movff sub_a+1,last_pressure_velocity+1
|
|
458
|
|
459 call subU16 ; sub_c = amb_pressure - last_pressure
|
|
460
|
318
6d8c82fe5a01
VSIbar #3d: more filter, neg_flag_velocity close to calculation, debug color for descend bar
janos_kovacs <kovjanos@gmail.com>
diff
changeset
|
461 bcf neg_flag_velocity
|
6d8c82fe5a01
VSIbar #3d: more filter, neg_flag_velocity close to calculation, debug color for descend bar
janos_kovacs <kovjanos@gmail.com>
diff
changeset
|
462 btfsc neg_flag
|
6d8c82fe5a01
VSIbar #3d: more filter, neg_flag_velocity close to calculation, debug color for descend bar
janos_kovacs <kovjanos@gmail.com>
diff
changeset
|
463 bsf neg_flag_velocity
|
6d8c82fe5a01
VSIbar #3d: more filter, neg_flag_velocity close to calculation, debug color for descend bar
janos_kovacs <kovjanos@gmail.com>
diff
changeset
|
464
|
0
|
465 movff sub_c+0,xA+0
|
|
466 movff sub_c+1,xA+1
|
|
467 movlw d'39' ; 77 when called every second....
|
|
468 movwf xB+0
|
|
469 clrf xB+1
|
|
470 call mult16x16 ; differential pressure in mbar*77...
|
|
471 movff xC+0,divA+0
|
|
472 movff xC+1,divA+1
|
|
473 movlw d'7'
|
|
474 movwf divB+0
|
|
475 call div16 ; devided by 2^7 equals velocity in m/min
|
|
476
|
|
477 movlw d'99'
|
|
478 cpfsgt divA+0 ; limit to 99m/min
|
|
479 bra calc_velocity3
|
|
480 movwf divA+0 ; divA=99
|
|
481
|
|
482 calc_velocity3:
|
|
483 call TFT_display_velocity ; With divA+0 = m/min...
|
|
484 return
|
|
485
|
|
486
|
|
487 ;=============================================================================
|
|
488
|
104
|
489 set_reset_safety_stop: ; Set flags for safety stop and/or reset safety stop
|
|
490 TSTOSS opt_enable_safetystop ; =1: A safety stop is shown
|
|
491 bra delete_safety_stop ; No, don't show safety stop
|
|
492
|
|
493 btfsc decostop_active ; Is a deco stop displayed?
|
|
494 bra delete_safety_stop ; Yes, don't show safety stop
|
|
495 ; Below "safety_stop_reset"? Set flag and reset count-down timer
|
|
496 SAFE_2BYTE_COPY rel_pressure, lo
|
|
497 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
|
|
498 movff lo,sub_a+0
|
|
499 movff hi,sub_a+1
|
|
500 movlw LOW safety_stop_reset
|
|
501 movwf sub_b+0
|
|
502 movlw HIGH safety_stop_reset
|
|
503 movwf sub_b+1
|
|
504 call subU16 ; sub_c = sub_a - sub_b
|
|
505 btfss neg_flag
|
|
506 bra reset_safety_stop ; Below 10m, reset safety stop
|
|
507
|
|
508 ; Above "safety_stop_end"? Clear flag.
|
|
509 SAFE_2BYTE_COPY rel_pressure, lo
|
|
510 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
|
|
511 movff lo,sub_a+0
|
|
512 movff hi,sub_a+1
|
|
513 movlw LOW safety_stop_end
|
|
514 movwf sub_b+0
|
|
515 movlw HIGH safety_stop_end
|
|
516 movwf sub_b+1
|
|
517 call subU16 ; sub_c = sub_a - sub_b
|
|
518 btfsc neg_flag
|
|
519 bra delete_safety_stop ; Above 3m, remove safety stop
|
|
520
|
|
521 ; Above "safety_stop_start"? Activate safety stop
|
|
522 SAFE_2BYTE_COPY rel_pressure, lo
|
|
523 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
|
|
524 movff lo,sub_a+0
|
|
525 movff hi,sub_a+1
|
|
526 movlw LOW safety_stop_start
|
|
527 movwf sub_b+0
|
|
528 movlw HIGH safety_stop_start
|
|
529 movwf sub_b+1
|
|
530 call subU16 ; sub_c = sub_a - sub_b
|
|
531 btfsc neg_flag
|
|
532 bra acivate_safety_stop ; Above 5m, activate safety stop
|
|
533 bra reset_safety_stop2 ; Pause safety stop
|
|
534
|
|
535 acivate_safety_stop:
|
|
536 tstfsz safety_stop_countdown ; Countdown at zero?
|
|
537 bsf show_safety_stop ; No, Set flag!
|
|
538 return
|
|
539
|
|
540 delete_safety_stop:
|
|
541 clrf safety_stop_countdown ; reset timer
|
|
542 bra reset_safety_stop2 ; Remove safety stop from display
|
|
543
|
|
544 reset_safety_stop:
|
|
545 movlw safety_stop_length ;[s]
|
|
546 movwf safety_stop_countdown ; reset timer
|
|
547 reset_safety_stop2:
|
|
548 bcf show_safety_stop ; Clear flag
|
|
549 btfss safety_stop_active ; Safety stop shown
|
|
550 return ; No, don't delete it
|
|
551 bcf safety_stop_active ; Clear flag
|
131
|
552 call TFT_clear_safety_stop ; Clear safety stop
|
104
|
553 return
|
|
554
|
|
555 ;=============================================================================
|
|
556
|
0
|
557 timeout_menuview:
|
|
558 decfsz timeout_counter3,F ; timeout for menuview
|
|
559 return ; No timeout, return
|
|
560 ; Timeout, clear e.g. "Menu?"
|
|
561 goto menuview_toggle_reset ; "returns"
|
|
562
|
|
563 timeout_divemode_menu:
|
|
564 decfsz timeout_counter3,F ; timeout for divemode menu
|
|
565 return
|
|
566
|
|
567 global timeout_divemode_menu2
|
|
568 timeout_divemode_menu2: ; Called from divemenu_tree.asm
|
|
569 bcf divemode_menu ; Timeout! Clear flag
|
|
570 call TFT_clear_divemode_menu ; Clear menu
|
|
571 call TFT_active_gas_divemode ; Redraw gas/setpoint/diluent
|
|
572 bcf blinking_better_gas ; Clear flag to have temperature updated once
|
|
573 call TFT_temp_divemode ; Displays temperature
|
315
|
574 call TFT_draw_gassep_line ; Gas separator grid in spec mode only
|
0
|
575
|
|
576 btfss decostop_active ; In deco mode ?
|
|
577 bra timeout_divemode_menu_ndl ; No, show NDL again
|
|
578 ; Show deco
|
|
579 call TFT_display_deko_mask ; clear nostop time, display decodata
|
|
580 call TFT_display_deko
|
|
581 call TFT_show_TTS_divemode
|
|
582 return
|
|
583 timeout_divemode_menu_ndl: ; Show NDL
|
|
584 call TFT_display_ndl_mask ; Clear deco data, display nostop time
|
|
585 call TFT_display_ndl
|
|
586 return
|
|
587
|
|
588 timeout_divemode:
|
|
589 btfsc divemode_menu ; Divemode menu active?
|
|
590 rcall timeout_divemode_menu ; Yes, check the timeout for it...
|
|
591
|
|
592 btfsc menuview ; is a menuview shown?
|
|
593 rcall timeout_menuview ; Yes, check the timeout for it...
|
|
594
|
|
595 btfss realdive ; Dive longer then one minute
|
|
596 return
|
|
597
|
|
598 btfsc FLAG_apnoe_mode ; In Apnoe mode?
|
35
|
599 bra timeout_divemode2 ; Yes, use apnoe_timeout [min] for timeout
|
0
|
600
|
|
601 ifndef __DEBUG
|
|
602 btfsc simulatormode_active ; In Simulator mode?
|
|
603 bra timeout_divemode3 ; Yes, use simulator timeout
|
|
604 endif
|
|
605
|
|
606 bcf divemode
|
148
|
607 infsnz timeout_counter,F
|
|
608 incf timeout_counter2,F ; timeout is 15bits
|
0
|
609
|
|
610 movlw LOW divemode_timeout
|
|
611 movwf sub_a+0
|
|
612 movlw HIGH divemode_timeout
|
|
613 movwf sub_a+1
|
|
614
|
|
615 movff timeout_counter, sub_b+0
|
|
616 movff timeout_counter2, sub_b+1
|
|
617 call subU16 ; sub_c = sub_a - sub_b
|
|
618 btfss neg_flag ; Result negative?
|
|
619 bsf divemode ; No, set flag
|
|
620 return
|
|
621
|
|
622 timeout_divemode2:
|
|
623 incf timeout_counter,F ; seconds...
|
|
624 movlw d'60'
|
|
625 cpfseq timeout_counter ; timeout_counter=60?
|
|
626 return ; No.
|
|
627 ; One minute timeout done.
|
|
628 clrf timeout_counter
|
|
629 bcf divemode
|
|
630 incf apnoe_timeout_counter,F
|
|
631 movlw apnoe_timeout ; apnoe timeout [min]
|
|
632 cpfseq apnoe_timeout_counter
|
|
633 bsf divemode
|
|
634 return
|
|
635
|
|
636 timeout_divemode3:
|
|
637 bcf divemode
|
|
638 incf timeout_counter,F
|
|
639 movlw simulator_timeout ; simulator timeout
|
|
640 cpfsgt timeout_counter
|
|
641 bsf divemode
|
|
642 return
|
|
643
|
|
644 update_temp_and_or_depth: ; New sensor data arrived...
|
|
645 btfsc temp_changed
|
|
646 call TFT_temp_divemode ; Displays temperature
|
|
647
|
|
648 btfsc pressure_refresh
|
|
649 call TFT_depth ; Displays new depth
|
|
650
|
|
651 rcall set_max_depth ; update max. depth if required
|
|
652 bcf pressure_refresh ; until new pressure is available
|
|
653 return
|
|
654
|
|
655 update_divemode60: ; update any minute
|
|
656 call get_battery_voltage ; gets battery voltage
|
218
|
657 rcall set_powersafe ; Battery low?
|
0
|
658 call TFT_max_pressure ; Update max. depth
|
|
659 call customview_minute ; Do every-minute tasks for the custom view area
|
|
660 bcf oneminupdate
|
|
661
|
|
662 btfss simulatormode_active ; in simulator mode?
|
|
663 return ; No
|
|
664 ; Yes, quite dive mode simulation after 21*256s=89min:36s
|
|
665 movlw .20
|
|
666 cpfsgt total_divetime_seconds+1 ; Timeout?
|
|
667 return ; No
|
|
668 ifdef __DEBUG
|
|
669 return ; No simulator timeout in debug mode
|
|
670 endif
|
|
671 bra divemode_option1 ; Yes, set to 0m and "return"
|
|
672
|
|
673 set_max_depth:
|
|
674 movff max_pressure+0,sub_a+0
|
|
675 movff max_pressure+1,sub_a+1
|
|
676 SAFE_2BYTE_COPY rel_pressure, sub_b
|
|
677 call subU16 ; sub_c = sub_a - sub_b
|
|
678 ; max_pressure<rel_pressure -> neg_flag=1
|
|
679 ; rel_pressure<=max_pressure -> neg_flag=0
|
|
680 btfss neg_flag
|
|
681 return
|
|
682 ; max_pressure<rel_pressure
|
|
683 movff sub_b+0,max_pressure+0
|
|
684 movff sub_b+1,max_pressure+1
|
|
685 call TFT_max_pressure ; No, use normal max. depth
|
|
686 return
|
|
687
|
|
688 set_min_temp:
|
|
689 movff minimum_temperature+0,sub_a+0
|
|
690 movff minimum_temperature+1,sub_a+1
|
|
691 SAFE_2BYTE_COPY temperature,sub_b
|
|
692 call sub16 ; sub_c = sub_a - sub_b
|
|
693 ; minimum_temperature<T -> neg_flag=1
|
|
694 ; T<=minimum_temperature -> neg_flag=0
|
|
695 btfsc neg_flag
|
|
696 return
|
|
697 ; minimum_temperature>=T
|
|
698 movff sub_b+0,minimum_temperature+0
|
|
699 movff sub_b+1,minimum_temperature+1
|
|
700 return
|
|
701
|
|
702 global set_dive_modes
|
|
703 set_dive_modes:
|
|
704 btfsc high_altitude_mode ; In high altitude (Fly) mode?
|
|
705 bra set_dive_modes3 ; Yes!
|
|
706
|
|
707 set_dive_modes0:
|
|
708 movlw LOW start_dive_threshold
|
|
709 movwf sub_a+0 ; dive_treshold is in cm
|
|
710 movlw HIGH start_dive_threshold
|
|
711 movwf sub_a+1 ; dive_treshold is in cm
|
|
712
|
|
713 set_dive_modes1:
|
|
714 SAFE_2BYTE_COPY rel_pressure, sub_b
|
|
715 call subU16 ; sub_c = sub_a - sub_b
|
|
716
|
|
717 btfss neg_flag
|
|
718 bra set_dive_modes2 ; too shallow (rel_pressure<dive_threshold)
|
|
719
|
|
720 btfsc realdive ; Dive longer than one minute?
|
|
721 clrf timeout_counter ; Yes, reset timout counter
|
|
722
|
|
723 bsf divemode ; (Re-)Set divemode flag
|
|
724 bsf divemode2 ; displayed divetime is running
|
|
725 return
|
|
726
|
|
727 set_dive_modes2:
|
|
728 bcf divemode2 ; Stop time
|
|
729 btfss realdive ; dive longer then one minute?
|
|
730 bcf divemode ; no -> this was no real dive
|
|
731 return ; No, return
|
|
732
|
|
733
|
|
734 set_dive_modes3: ; High-altitude mode
|
|
735 btfsc realdive ; dive longer then one minute?
|
|
736 bra set_dive_modes0 ; Yes -> this is a real dive -> Use start_dive_threshold or ascend
|
|
737
|
|
738 movlw HIGH high_altitude_dive_threshold
|
|
739 movwf sub_a+1
|
|
740 movlw LOW high_altitude_dive_threshold
|
|
741 movwf sub_a+0
|
|
742 bra set_dive_modes1
|
|
743
|
|
744 set_powersafe:
|
|
745 movlw color_code_battery_low+1; [%]
|
|
746 cpfslt batt_percent
|
|
747 return
|
|
748
|
|
749 movlw d'7' ; Type of Alarm (Battery Low)
|
|
750 movwf AlarmType ; Copy to Alarm Register
|
|
751 bsf event_occured ; Set Event Flag
|
|
752 movlw .0
|
|
753 movff WREG,opt_brightness ; Set Brightness to ECO
|
|
754 return ; return
|
|
755
|
|
756 calc_average_depth:
|
176
|
757 btfsc reset_average_depth ; Reset the Average depth?
|
0
|
758 rcall reset_average1 ; Reset the resettable average depth
|
|
759
|
|
760 ; 1. Add new 2xdepth to the Sum of depths registers
|
|
761 SAFE_2BYTE_COPY rel_pressure, xB ; Buffer...
|
|
762 bcf STATUS,C
|
|
763 rlcf xB+0,F
|
|
764 rlcf xB+1,F ; x2
|
|
765
|
|
766 movf xB+0,w
|
|
767 addwf average_depth_hold+0,F
|
|
768 movf xB+1,w
|
|
769 addwfc average_depth_hold+1,F
|
|
770 movlw d'0'
|
|
771 addwfc average_depth_hold+2,F
|
|
772 addwfc average_depth_hold+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar
|
|
773
|
|
774 ; Do the same for the _total registers (Non-Resettable)
|
|
775 movf xB+0,w
|
|
776 addwf average_depth_hold_total+0,F
|
|
777 movf xB+1,w
|
|
778 addwfc average_depth_hold_total+1,F
|
|
779 movlw d'0'
|
|
780 addwfc average_depth_hold_total+2,F
|
|
781 addwfc average_depth_hold_total+3,F ; Will work up to 9999mbar*60*60*24=863913600mbar
|
|
782
|
|
783 ; 2. Compute Average Depth on base of average_divesecs:2
|
|
784 movff average_divesecs+0,xB+0
|
|
785 movff average_divesecs+1,xB+1 ; Copy
|
|
786 movff average_depth_hold+0,xC+0
|
|
787 movff average_depth_hold+1,xC+1
|
|
788 movff average_depth_hold+2,xC+2
|
|
789 movff average_depth_hold+3,xC+3
|
|
790
|
|
791 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
|
|
792 movff xC+0,avr_rel_pressure+0
|
|
793 movff xC+1,avr_rel_pressure+1
|
|
794
|
89
|
795 btfss divemode2 ; displayed divetime is running?
|
|
796 return ; No (e.g. too shallow)
|
|
797
|
0
|
798 ; 3. Compute Total Average Depth on base of total_divetime_seconds:2
|
|
799 movff total_divetime_seconds+0,xB+0
|
|
800 movff total_divetime_seconds+1,xB+1 ; Copy
|
|
801 movff average_depth_hold_total+0,xC+0
|
|
802 movff average_depth_hold_total+1,xC+1
|
|
803 movff average_depth_hold_total+2,xC+2
|
|
804 movff average_depth_hold_total+3,xC+3
|
|
805 call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
|
|
806 movff xC+0,avr_rel_pressure_total+0
|
|
807 movff xC+1,avr_rel_pressure_total+1
|
|
808 return
|
|
809
|
|
810 reset_average1:
|
|
811 clrf average_depth_hold+0
|
|
812 clrf average_depth_hold+1
|
|
813 clrf average_depth_hold+2
|
|
814 clrf average_depth_hold+3 ; Clear average depth register
|
|
815 movlw d'2'
|
|
816 movwf average_divesecs+0
|
|
817 clrf average_divesecs+1
|
|
818 bcf reset_average_depth ; Clear flag
|
|
819 return
|
|
820
|
|
821 test_switches_divemode: ; checks switches in divemode
|
|
822 btfsc divemode_menu ; Divemode menu shown?
|
|
823 bra test_switches_divemode_menu ; Yes, use menu processor
|
|
824 btfsc switch_left
|
|
825 bra test_switches_divemode2 ; Enter button pressed, check if we need to do something
|
|
826 btfss switch_right
|
|
827 return ; No button press
|
|
828 tstfsz menupos2 ; any option shown?
|
|
829 bra test_switches_divemode1 ; Yes, do option tasks
|
|
830 bsf toggle_customview ; No, toggle custom view
|
|
831 return
|
|
832
|
|
833 test_switches_divemode_menu:
|
|
834 btfsc switch_left
|
|
835 bra test_switches_divemode_menu2 ; Move cursor
|
|
836 btfsc switch_right
|
|
837 bra test_switches_divemode_menu3 ; Enter submenu or do something
|
|
838 return ; No button press
|
|
839
|
|
840 test_switches_divemode_menu1:
|
|
841 clrf menupos
|
|
842 test_switches_divemode_menu2:
|
|
843 incf menupos,F
|
|
844 incf menupos4,W ; menupos4+1 -> WREG
|
|
845 cpfslt menupos ; >menupos4 (Set in menu_processor.asm)?
|
|
846 bra test_switches_divemode_menu1; > Yes, set to 1
|
|
847 call TFT_divemode_menu_cursor ; Update the cursor
|
|
848 bcf switch_left
|
|
849 movlw divemode_menu_timeout ; Reload timeout
|
|
850 movwf timeout_counter3 ; timeout for divemode menu
|
|
851 return
|
|
852
|
|
853 test_switches_divemode_menu3: ; Enter submenu or do something
|
|
854 bcf switch_right
|
|
855 ; decf menupos,F ; menu_processor needs 0-5...
|
|
856 extern do_line_menu
|
|
857 goto do_line_menu ; Warning! Trashes STKPTR and returns to diveloop_loop4:
|
|
858
|
|
859 test_switches_divemode1:
|
|
860 bcf switch_right
|
|
861 movlw divemode_menuview_timeout
|
|
862 movwf timeout_counter3 ; Reload timeout
|
216
|
863 movff menupos2,WREG ; menupos2 holds number of customview/divemode menu function
|
0
|
864 dcfsnz WREG,F
|
137
|
865 bra divemode_option_gaschange ; Switch to the indicated "better gas"
|
|
866 dcfsnz WREG,F
|
0
|
867 bra divemode_option0 ; Start/Setup Divemode menu
|
|
868 dcfsnz WREG,F
|
|
869 bra divemode_option1 ; Quit Simulation?
|
|
870 dcfsnz WREG,F
|
|
871 bra divemode_option2 ; Descent 1m
|
|
872 dcfsnz WREG,F
|
|
873 bra divemode_option3 ; Ascend 1m
|
|
874 dcfsnz WREG,F
|
|
875 bra divemode_option4 ; Quit Apnoe mode
|
|
876 dcfsnz WREG,F
|
|
877 bra divemode_option5 ; Reset Stopwatch (In Gauge mode)
|
216
|
878 dcfsnz WREG,F
|
|
879 bra divemode_option6 ; +5mins simulation
|
254
|
880 dcfsnz WREG,F
|
|
881 bra divemode_option7 ; Store heading
|
0
|
882 return
|
|
883
|
|
884 test_switches_divemode2:
|
|
885 call menuview_toggle ; Menu or Simulator tasks
|
|
886 return
|
|
887
|
|
888 gas_switched_common:
|
99
|
889 bcf divemode_gaschange ; Clear flag
|
|
890
|
274
9347893b74ce
BUGFIX: Fast Gas change near the ppO2 limit could cause switching to a non-available Gas #0
heinrichsweikamp
diff
changeset
|
891 tstfsz menupos ; menupos=0?
|
9347893b74ce
BUGFIX: Fast Gas change near the ppO2 limit could cause switching to a non-available Gas #0
heinrichsweikamp
diff
changeset
|
892 bra $+4 ; No
|
9347893b74ce
BUGFIX: Fast Gas change near the ppO2 limit could cause switching to a non-available Gas #0
heinrichsweikamp
diff
changeset
|
893 return ; Yes, do not switch gas (There is no Gas #0 !)
|
9347893b74ce
BUGFIX: Fast Gas change near the ppO2 limit could cause switching to a non-available Gas #0
heinrichsweikamp
diff
changeset
|
894
|
0
|
895 decf menupos,W ; 1-5 -> 0-4
|
|
896 btfss FLAG_ccr_mode ; Choose OC Gases
|
|
897 rcall setup_gas_registers ; With WREG=Gas 0-4
|
|
898 btfsc FLAG_ccr_mode ; Choose CC Diluents
|
|
899 rcall setup_dil_registers ; With WREG=Gas 0-4
|
|
900
|
|
901 decf menupos,W ; 1-5 -> 0-4
|
|
902 btfsc is_bailout ; Choose OC Bailouts (OC Gases)
|
|
903 rcall setup_gas_registers ; With WREG=Gas 0-4
|
|
904
|
|
905 call TFT_active_gas_divemode ; Display gas/Setpoint
|
|
906 clrf WREG
|
|
907 movff WREG,char_O_deco_status ; Restart decoplan computation
|
98
|
908
|
|
909 ; Set flags for profile recording
|
|
910 bsf event_occured ; Set global event byte
|
|
911 btfsc is_bailout ; Choose OC Bailouts (OC Gases)
|
|
912 bsf bailoutgas_event ; Bailout gas change
|
|
913 btfss is_bailout ; Choose OC Bailouts (OC Gases)
|
|
914 bsf stored_gas_changed ; OC gas change
|
0
|
915 return
|
|
916
|
|
917 global setup_gas_registers
|
|
918 setup_gas_registers: ; With WREG=Gas 0-4
|
|
919 lfsr FSR1,opt_gas_O2_ratio+0
|
|
920 movff PLUSW1,char_I_O2_ratio ; O2 (For ppO2 calculations)
|
|
921 lfsr FSR1,opt_gas_He_ratio+0
|
|
922 movff PLUSW1,char_I_He_ratio ; He
|
|
923 incf WREG,W ; Gas# 1-5
|
|
924 movff WREG,char_I_current_gas ; Set gas
|
|
925 movff WREG,active_gas ; Set for logbook and display
|
|
926 banksel char_I_O2_ratio
|
|
927 movf char_I_O2_ratio,W ; Add O2...
|
|
928 addwf char_I_He_ratio,W ; ...and He...
|
|
929 sublw .100 ; ...subtract both from 100
|
|
930 movwf char_I_N2_ratio ; -> N2!
|
|
931 banksel common
|
|
932 return
|
|
933
|
|
934 global setup_dil_registers
|
|
935 setup_dil_registers: ; With WREG=dil 0-4
|
97
|
936 btfsc is_bailout
|
|
937 return ; Ignore in bailout
|
0
|
938 lfsr FSR1,opt_dil_O2_ratio+0
|
|
939 movff PLUSW1,char_I_O2_ratio ; O2 (For ppO2 calculations)
|
|
940 lfsr FSR1,opt_dil_He_ratio+0
|
|
941 movff PLUSW1,char_I_He_ratio ; He
|
|
942 incf WREG,W ; Gas# 1-5
|
|
943 movff WREG,char_I_current_gas ; Set gas
|
|
944 movff WREG,active_gas ; Set for logbook and display
|
97
|
945 movff WREG,active_diluent ; As a backup when switching back from Bailout to CCR
|
0
|
946 banksel char_I_O2_ratio
|
|
947 movf char_I_O2_ratio,W ; Add O2...
|
|
948 addwf char_I_He_ratio,W ; ...and He...
|
|
949 sublw .100 ; ...subtract both from 100
|
|
950 movwf char_I_N2_ratio ; -> N2!
|
|
951 banksel common
|
|
952 return
|
|
953
|
137
|
954 divemode_option_gaschange: ; Switch to the better gas
|
|
955 movff better_gas_number,menupos; 1-5
|
|
956 bsf divemode_gaschange ; Change the gas in the dive mode loop...
|
|
957 call menuview_toggle_reset ; Reset to zero (Zero=no menuview)
|
138
|
958 bcf better_gas_available ; Clear flag immediately
|
137
|
959 return
|
|
960
|
0
|
961 divemode_option0: ; Start/Setup Divemode menu
|
|
962 call TFT_clear_divemode_menu ; Clear menu area
|
|
963 bcf menuview
|
|
964 extern do_main_divemenu
|
|
965 call do_main_divemenu
|
|
966 global divemode_option0_return
|
|
967 divemode_option0_return:
|
|
968 ; movlw .1
|
|
969 ; movwf menupos ; Set to first option in divemode menu
|
|
970 call TFT_divemode_menu_cursor; Show the cursor
|
|
971 movlw divemode_menu_timeout
|
|
972 movwf timeout_counter3 ; timeout for divemode menu
|
|
973 bsf divemode_menu ; Set flag
|
|
974 clrf menupos2 ; Clear option counter
|
|
975 bra diveloop_loop4 ; Goto back to diveloop (Menuprocessor trashes STKPTR!)
|
|
976
|
|
977 divemode_option4:
|
|
978 movlw d'58' ; two seconds left
|
|
979 movwf timeout_counter
|
|
980 movlw apnoe_timeout-1 ; apnoe timeout [min]
|
|
981 movwf apnoe_timeout_counter
|
|
982 btfss simulatormode_active ; in simulator mode?
|
|
983 return ; No
|
|
984 divemode_option1: ; Quit simulation mode
|
|
985 banksel isr_backup
|
|
986 movlw low .1000
|
|
987 movwf sim_pressure+0
|
|
988 movlw high .1000
|
|
989 movwf sim_pressure+1 ; Set to 0m -> End of Dive
|
|
990 banksel common
|
|
991 call menuview_toggle_reset ; Reset to zero (Zero=no menuview)
|
|
992
|
|
993 btfss FLAG_apnoe_mode ; In Apnoe mode?
|
|
994 return ; No
|
|
995 movlw d'58' ; two seconds left
|
|
996 movwf timeout_counter
|
|
997 movlw apnoe_timeout-1 ; apnoe timeout [min]
|
|
998 movwf apnoe_timeout_counter
|
|
999 return
|
|
1000
|
|
1001 divemode_option3: ; minus 1m
|
|
1002 banksel isr_backup
|
315
|
1003 movlw d'100'
|
0
|
1004 subwf sim_pressure+0
|
|
1005 movlw .0
|
|
1006 subwfb sim_pressure+1
|
|
1007 rcall divemode_simulator_check_limits
|
|
1008 banksel common
|
|
1009 return
|
|
1010
|
|
1011 divemode_option2: ; plus 1m
|
|
1012 banksel isr_backup
|
315
|
1013 movlw d'100'
|
0
|
1014 addwf sim_pressure+0
|
|
1015 movlw .0
|
|
1016 addwfc sim_pressure+1
|
|
1017 rcall divemode_simulator_check_limits
|
|
1018 banksel common
|
|
1019 return
|
|
1020
|
|
1021 divemode_option5:
|
|
1022 call menuview_toggle_reset ; Reset to zero (Zero=no menuview)
|
|
1023 bsf reset_average_depth ; Set Flag
|
|
1024 return
|
|
1025
|
216
|
1026 divemode_option6:
|
|
1027 bcf divemode2 ; Stop divetime
|
|
1028 movlw .5
|
|
1029 addwf divemins+0,F
|
|
1030 movlw .0
|
254
|
1031 addwfc divemins+1,F ; Add 5 mins
|
216
|
1032 movlw .5
|
254
|
1033 movwf up ; counter
|
216
|
1034 ; 1min mode
|
|
1035 divemode_option6_2:
|
|
1036 movlw .1
|
|
1037 movff WREG,char_I_step_is_1min ; Force 1min mode
|
|
1038 clrf TMR5L
|
|
1039 clrf TMR5H ; 30,51757813µs/bit in TMR5L:TMR5H
|
|
1040 call deco_calc_hauptroutine ; calc_tissue
|
|
1041 movlb .1
|
|
1042 decfsz up,F ; Done?
|
|
1043 bra divemode_option6_2 ; Not yet
|
|
1044 bsf divemode2 ; continue divetime
|
|
1045 call menuview_toggle_reset
|
|
1046 return
|
|
1047
|
254
|
1048 divemode_option7:
|
|
1049 ; Store heading for compass view
|
255
|
1050 movff compass_heading_shown+0,compass_bearing+0
|
|
1051 movff compass_heading_shown+1,compass_bearing+1
|
|
1052 bsf compass_bearing_set ; set flag
|
254
|
1053 call menuview_toggle_reset ; Done.
|
216
|
1054 return
|
|
1055
|
0
|
1056 divemode_simulator_check_limits:
|
|
1057 ; Check limits (150m and 0m)
|
|
1058 movlw LOW d'16000' ; Compare to 16bar=16000mbar (150m).
|
|
1059 subwf sim_pressure+0,W
|
|
1060 movlw HIGH d'16000'
|
|
1061 subwfb sim_pressure+1,W
|
|
1062 bnc divemode_simulator_check_limits2 ; No-carry = borrow = not deeper
|
|
1063
|
|
1064 ; Too deep, limit to 150m
|
|
1065 movlw LOW d'16000'
|
|
1066 movwf sim_pressure+0
|
|
1067 movlw HIGH d'16000'
|
|
1068 movwf sim_pressure+1
|
|
1069 return
|
|
1070 divemode_simulator_check_limits2:
|
|
1071 movlw LOW d'1000' ; Compare to 1bar == 0m == 1000 mbar.
|
|
1072 subwf sim_pressure+0,W
|
|
1073 movlw HIGH d'1000'
|
|
1074 subwfb sim_pressure+1,W
|
|
1075 btfsc STATUS,C ; No-carry = borrow = not deeper.
|
|
1076 return ; Deeper than 0m == Ok.
|
|
1077 ; Too shallow, limit to 0m
|
|
1078 movlw LOW d'1000'
|
|
1079 movwf sim_pressure+0
|
|
1080 movlw HIGH d'1000'
|
|
1081 movwf sim_pressure+1
|
|
1082 return
|
|
1083
|
|
1084 ;=============================================================================
|
|
1085 ; Compare all enabled gas in list, to see if a better one is available.
|
|
1086 ;
|
|
1087 ; Output: better_gas_available, better_gas_number
|
|
1088 ;
|
|
1089 check_gas_change: ; Checks if a better gas should be selected (by user)
|
|
1090 bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
|
1091 clrf better_gas_number ; Clear better gas register
|
|
1092
|
|
1093 SAFE_2BYTE_COPY rel_pressure,xA
|
|
1094 movlw d'100'
|
|
1095 movwf xB+0
|
|
1096 clrf xB+1
|
|
1097 call div16x16 ; compute depth in full m -> result in xC+0
|
|
1098
|
|
1099 btfss FLAG_ccr_mode ; In CCR mode...
|
|
1100 bra check_gas_change_OC_bail; No, check for OC or bailout
|
|
1101 btfsc is_bailout ; Bailout?
|
|
1102 bra check_gas_change_OC_bail; Yes, check for OC or bailout
|
|
1103
|
|
1104 ; Check Diluents
|
160
|
1105 bsf ccr_diluent_setup ; in CCR menus
|
0
|
1106 movlw .0
|
|
1107 rcall check_dil_common ; With Gas 0-4 in WREG
|
|
1108 movlw .1
|
|
1109 rcall check_dil_common ; With Gas 0-4 in WREG
|
|
1110 movlw .2
|
|
1111 rcall check_dil_common ; With Gas 0-4 in WREG
|
|
1112 movlw .3
|
|
1113 rcall check_dil_common ; With Gas 0-4 in WREG
|
|
1114 movlw .4
|
|
1115 rcall check_dil_common ; With Gas 0-4 in WREG
|
|
1116 bra check_gas_change_exit
|
|
1117
|
|
1118 check_gas_change_OC_bail:
|
160
|
1119 bcf ccr_diluent_setup ; in OC menus
|
0
|
1120 movlw .0
|
|
1121 rcall check_gas_common ; With Gas 0-4 in WREG
|
|
1122 movlw .1
|
|
1123 rcall check_gas_common ; With Gas 0-4 in WREG
|
|
1124 movlw .2
|
|
1125 rcall check_gas_common ; With Gas 0-4 in WREG
|
|
1126 movlw .3
|
|
1127 rcall check_gas_common ; With Gas 0-4 in WREG
|
|
1128 movlw .4
|
|
1129 rcall check_gas_common ; With Gas 0-4 in WREG
|
|
1130 ; bra check_gas_change_exit
|
|
1131 check_gas_change_exit:
|
|
1132 btfss better_gas_available ; Is a better gas available
|
|
1133 bcf blinking_better_gas ; No, Clear blinking flag
|
|
1134 btfss better_gas_available ; Is a better gas available
|
|
1135 clrf better_gas_number ; No, Clear better_gas_number (For gaslist display)
|
|
1136 call TFT_active_gas_divemode ; Display gas/Setpoint
|
|
1137 return
|
|
1138
|
|
1139 check_gas_common: ; With Gas 0-4 in WREG
|
|
1140 btfsc better_gas_available ; Better Gas already found?
|
|
1141 return ; Yes, return
|
|
1142 lfsr FSR1,opt_gas_type ; 0=Disabled, 1=First, 2=Travel, 3=Deco
|
|
1143 btfss PLUSW1,0 ; Test for Bit0 and 1 -> type=3 -> Deco
|
|
1144 return ; No
|
|
1145 btfss PLUSW1,1 ; Test for Bit0 and 1 -> type=3 -> Deco
|
|
1146 return ; No
|
|
1147 incf WREG,W ; 1-5
|
|
1148 cpfseq active_gas ; is this gas currently selected?
|
|
1149 bra check_gas_common2 ; No
|
|
1150 return ; Yes, skip test for active gas
|
|
1151 check_gas_common2:
|
|
1152 decf WREG,W ; 0-4
|
|
1153 movwf hi ; Save tested gas 0-4
|
97
|
1154 lfsr FSR1,opt_OC_bail_gas_change
|
0
|
1155 movff PLUSW1,lo ; Change depth into lo
|
|
1156 movlw minimum_change_depth
|
|
1157 cpfsgt lo ; Change depth>minimum_change_depth?
|
|
1158 return ; No, Change depth not deep enough, skip!
|
|
1159 movf xC+0,W ; load depth in m into WREG
|
|
1160 cpfsgt lo ; gas_change_depth < current depth?
|
69
|
1161 bra check_gas_common3 ; No, check if we are within the better_gas_window_pos window
|
|
1162 incf hi,W ; 1-5
|
|
1163 movwf better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available
|
|
1164 movlw better_gas_window_neg
|
|
1165 subwf lo,W ; Change depth-better_gas_window_neg
|
|
1166 cpfslt xC+0 ; current depth<Change depth-better_gas_window_neg?
|
|
1167 bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
|
1168 return
|
|
1169
|
|
1170 check_gas_common3:
|
0
|
1171 incf hi,W ; 1-5
|
|
1172 movwf better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available
|
69
|
1173 movlw better_gas_window_pos
|
|
1174 addwf lo,W ; Change depth+better_gas_window_pos
|
|
1175 cpfsgt xC+0 ; current depth>Change depth+better_gas_window_pos?
|
|
1176 bra check_gas_common4 ; Ok, now check the better gas ppO2<opt_ppO2_max
|
|
1177 return
|
|
1178
|
|
1179 check_gas_common4:
|
|
1180 movf hi,W ; 0-4
|
|
1181 lfsr FSR1,char_I_deco_N2_ratio
|
|
1182 movff PLUSW1,lo ; N2 ratio into lo
|
|
1183 lfsr FSR1,char_I_deco_He_ratio
|
|
1184 movff PLUSW1,xB+0 ; He ratio into xB+0
|
|
1185 movf xB+0,W
|
|
1186 addwf lo,F
|
|
1187 movlw .101
|
|
1188 bcf STATUS,C
|
|
1189 subfwb lo,F ; O2 ratio in lo
|
|
1190
|
|
1191 SAFE_2BYTE_COPY amb_pressure, xA
|
|
1192 movlw d'10'
|
|
1193 movwf xB+0
|
|
1194 clrf xB+1
|
|
1195 call div16x16 ; xC=p_amb/10
|
|
1196 movff xC+0,xA+0
|
|
1197 movff xC+1,xA+1
|
|
1198 movff lo,xB+0 ; =O2 ratio
|
|
1199 clrf xB+1
|
|
1200 call mult16x16 ; lo * p_amb/10
|
|
1201
|
|
1202 ; Check very high ppO2 manually
|
|
1203 tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
|
|
1204 return ; Done.
|
|
1205 ; Check if ppO2>3,30bar
|
|
1206 btfsc xC+1,7
|
|
1207 return ; Done.
|
|
1208
|
|
1209 ; ; Check for low ppo2
|
|
1210 ; movff xC+0,sub_b+0
|
|
1211 ; movff xC+1,sub_b+1
|
|
1212 ; movff opt_ppO2_min,WREG
|
|
1213 ; mullw d'100' ; opt_ppO2_min*100
|
|
1214 ; movff PRODL,sub_a+0
|
|
1215 ; movff PRODH,sub_a+1
|
|
1216 ; call subU16
|
|
1217 ; btfss neg_flag
|
|
1218 ; return ; Done (Too low).
|
|
1219
|
|
1220 ;check if we are within our warning thresholds!
|
|
1221 movff xC+0,sub_b+0
|
|
1222 movff xC+1,sub_b+1
|
|
1223 movff opt_ppO2_max,WREG ; PPO2 Max for MOD calculation and color coding in divemode
|
|
1224 addlw .1 ; e.g. >1.60
|
|
1225 mullw d'100' ; opt_ppO2_max*100
|
|
1226 movff PRODL,sub_a+0
|
|
1227 movff PRODH,sub_a+1
|
|
1228 call subU16
|
|
1229 btfss neg_flag
|
0
|
1230 bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
69
|
1231 return ; Done.
|
0
|
1232
|
|
1233 check_dil_common: ; With Dil 0-4 in WREG
|
|
1234 btfsc better_gas_available ; Better Diluent already found?
|
|
1235 return ; Yes, return
|
|
1236 lfsr FSR1,opt_dil_type ; 0=Disabled, 1=First, 2=Normal
|
|
1237 tstfsz PLUSW1 ; =0?
|
|
1238 bra check_dil_common1 ; No
|
|
1239 return ; Yes, skip inactive diluents for test
|
|
1240 check_dil_common1:
|
|
1241 incf WREG,W ; 1-5
|
|
1242 cpfseq active_gas ; is this diluent currently selected?
|
|
1243 bra check_dil_common2 ; No
|
|
1244 return ; Yes, skip test for active diluent
|
|
1245 check_dil_common2:
|
|
1246 decf WREG,W ; 0-4
|
|
1247 movwf hi ; Save tested diluent 0-4
|
|
1248 lfsr FSR1,char_I_dil_change
|
|
1249 movff PLUSW1,lo ; Change depth into lo
|
|
1250 movlw minimum_change_depth
|
|
1251 cpfsgt lo ; Change depth>minimum_change_depth?
|
|
1252 return ; No, Change depth not deep enough, skip!
|
|
1253 movf xC+0,W ; load depth in m into WREG
|
|
1254 cpfsgt lo ; gas_change_depth < current depth?
|
|
1255 return ; No, check next gas
|
|
1256 incf hi,W ; 1-5
|
|
1257 movwf better_gas_number ; number (1-5) of the "better gas" in divemode, =0: no better gas available
|
69
|
1258 movlw better_gas_window_neg
|
|
1259 subwf lo,W ; Change depth-better_gas_window_neg
|
|
1260 cpfslt xC+0 ; current depth<Change depth-better_gas_window_neg?
|
0
|
1261 bsf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
|
1262 return
|
|
1263
|
|
1264 ;=============================================================================
|
|
1265 ; Setup everything to enter divemode.
|
|
1266 ;
|
|
1267
|
|
1268 dive_boot_oc:
|
|
1269 extern get_first_gas_to_WREG
|
|
1270 call get_first_gas_to_WREG ; Gets first gas (0-4) into WREG
|
|
1271 movff WREG,char_I_first_gas ; Copy for compatibility
|
|
1272 rcall setup_gas_registers ; With WREG=Gas 0-4
|
197
|
1273 banksel char_I_first_gas
|
|
1274 incf char_I_first_gas,F ; 0-4 -> 1-5
|
|
1275 banksel common
|
0
|
1276 return
|
|
1277
|
|
1278 dive_boot_cc:
|
277
|
1279 bcf is_bailout ; =1: Bailout
|
|
1280 bcf setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure
|
|
1281 bcf blinking_setpoint ; Reset blinking SP flag
|
192
|
1282 call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays
|
|
1283 bsf voting_logic_sensor1
|
|
1284 bsf voting_logic_sensor2
|
|
1285 bsf voting_logic_sensor3
|
0
|
1286 rcall divemode_setup_sensor_values ; setup sensor values
|
192
|
1287
|
0
|
1288 TSTOSS opt_ccr_mode ; =0: Fixed SP, =1: Sensor
|
|
1289 movff char_I_setpoint_cbar+0,char_I_const_ppO2 ; Setup fixed Setpoint (Always start with SP1)
|
|
1290 extern get_first_dil_to_WREG
|
|
1291 call get_first_dil_to_WREG ; Gets first gas (0-4) into WREG
|
|
1292 movff WREG,char_I_first_gas ; Copy for compatibility
|
|
1293 rcall setup_dil_registers ; With WREG=Gas 0-4
|
197
|
1294 banksel char_I_first_gas
|
|
1295 incf char_I_first_gas,F ; 0-4 -> 1-5
|
|
1296 banksel common
|
277
|
1297 rcall calc_deko_divemode_sensor ; External sensor stuff
|
0
|
1298 return
|
|
1299
|
|
1300 diveloop_boot:
|
|
1301 call restart_set_modes_and_flags
|
|
1302
|
|
1303 call I2C_sleep_accelerometer ; Stop accelerometer
|
|
1304 call I2C_sleep_compass ; Stop compass
|
|
1305
|
|
1306 clrf WREG
|
|
1307 movff WREG,max_pressure+0 ; clear some variables
|
|
1308 movff WREG,max_pressure+1
|
255
|
1309 movff WREG,compass_bearing+0
|
|
1310 movff WREG,compass_bearing+1
|
|
1311
|
|
1312 bcf compass_bearing_set
|
0
|
1313
|
|
1314 bcf use_agf ; Start with normal GF set
|
|
1315 bcf divemode_menu ; clear divemode menu flag
|
|
1316 movlw d'1'
|
|
1317 movwf apnoe_max_pressure+0
|
|
1318 clrf apnoe_max_pressure+1
|
|
1319 clrf apnoe_surface_mins
|
|
1320 clrf apnoe_surface_secs
|
|
1321 clrf apnoe_mins
|
|
1322 clrf divemins+0
|
|
1323 clrf divemins+1
|
277
|
1324 bcf no_more_divesecs ; =1: Do no longer show seconds in divemode
|
0
|
1325 bcf divemode_menu_active
|
|
1326 clrf menupos
|
277
|
1327 clrf menupos2 ; Reset to zero (Zero=no premenu or simulator task)
|
0
|
1328
|
|
1329 btfss FLAG_ccr_mode
|
|
1330 rcall dive_boot_oc
|
|
1331 btfsc FLAG_ccr_mode
|
|
1332 rcall dive_boot_cc
|
|
1333
|
|
1334 bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
|
1335 clrf better_gas_number ; Clear better gas register
|
|
1336
|
104
|
1337 bcf show_safety_stop ;=1: Show the safety stop
|
|
1338 clrf safety_stop_countdown ; Clear count-down
|
|
1339
|
0
|
1340 clrf samplesecs
|
|
1341 clrf apnoe_timeout_counter ; timeout in minutes
|
|
1342 clrf timeout_counter ; takes care of the timeout (Low byte)
|
|
1343 clrf timeout_counter2 ; takes care of the timeout (High byte)
|
|
1344 clrf AlarmType ; Clear all alarms
|
|
1345 bcf event_occured ; clear flag
|
|
1346 clrf total_divetime_seconds+1
|
|
1347 clrf average_depth_hold_total+0
|
|
1348 clrf average_depth_hold_total+1
|
|
1349 clrf average_depth_hold_total+2
|
|
1350 clrf average_depth_hold_total+3 ; Clear Non-Resettable Average
|
|
1351 rcall reset_average1 ; Reset the resettable average depth
|
|
1352 bcf decostop_active
|
|
1353 bcf better_gas_available ;=1: A better gas is available and a gas change is advised in divemode
|
204
|
1354 call ghostwriter_short_header ; Write short header with divenumber into profile memory
|
0
|
1355
|
|
1356 btfsc simulatormode_active
|
|
1357 bra diveloop_boot_1
|
|
1358 ; Normal mode = Surface pressure is the pressure 30mn before dive.
|
|
1359 SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ;copy surfacepressure to deco routine
|
|
1360 SAFE_2BYTE_COPY last_surfpressure_30min, last_surfpressure ;copy surfacepressure to last_surfpressure for correct depth
|
|
1361 bra diveloop_boot_2
|
|
1362
|
|
1363 diveloop_boot_1:
|
|
1364 ; Simulator mode: Surface pressure is 1bar.
|
|
1365 movlw LOW .1000
|
|
1366 movff WREG,int_I_pres_surface+0 ; LOW copy surfacepressure to deco routine
|
|
1367 movlw HIGH .1000
|
|
1368 movff WREG,int_I_pres_surface+1 ; HIGH copy surfacepressure to deco routine
|
|
1369
|
|
1370 diveloop_boot_2:
|
|
1371 SAFE_2BYTE_COPY temperature,minimum_temperature ; Reset Min-Temp registers
|
|
1372
|
|
1373 ; Init profile recording parameters
|
23
|
1374 movff samplingrate,samplesecs_value ; to avoid EEPROM access in the ISR
|
0
|
1375 movlw div_temperature
|
|
1376 movwf divisor_temperature ; load divisors for profile storage
|
|
1377 movlw div_deco
|
|
1378 movwf divisor_deco
|
|
1379 movlw div_gf
|
|
1380 movwf divisor_gf
|
|
1381 movlw div_ppo2_sensors
|
|
1382 movwf divisor_ppo2_sensors
|
|
1383 movlw div_decoplan
|
|
1384 movwf divisor_decoplan
|
|
1385 movlw div_cns
|
|
1386 movwf divisor_cns
|
|
1387 movlw div_tank
|
|
1388 movwf divisor_tank
|
|
1389
|
|
1390 btfss FLAG_apnoe_mode ; In Apnoe mode?
|
102
|
1391 bra divemode_boot1
|
0
|
1392 ; Overwrite some parameters in Apnoe mode....
|
|
1393 movlw samplingrate_apnoe
|
|
1394 movwf samplesecs_value ; to avoid EEPROM access in the ISR
|
102
|
1395 divemode_boot1:
|
|
1396 btfsc FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active
|
|
1397 bra divemode_boot2
|
|
1398 ; in OC Mode, disable ppO2 logging
|
|
1399 movlw .0
|
|
1400 movwf divisor_ppo2_sensors
|
|
1401 divemode_boot2:
|
0
|
1402
|
|
1403 bcf LEDg
|
|
1404 bcf LEDr
|
|
1405 bcf realdive
|
|
1406 btfss simulatormode_active ; do not disable in simulator mode!
|
|
1407 call disable_rs232 ; Disable RS232
|
|
1408 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
|
|
1409 call enable_rs232 ; Also sets to speed_normal ...
|
39
|
1410 ; Reset divetime seconds
|
|
1411 movlw .2 ; Start at 2seconds
|
0
|
1412 movwf total_divetime_seconds+0
|
39
|
1413 movwf divesecs
|
|
1414 movwf apnoe_secs
|
0
|
1415 bsf divemode2 ; displayed divetime is running (Divetime starts HERE)
|
|
1416
|
|
1417 movff int_O_CNS_fraction+0,CNS_start+0
|
|
1418 movff int_O_CNS_fraction+1,CNS_start+1 ; Save CNS value at beginning of dive
|
|
1419 movff char_O_relative_gradient_GF,GF_start ; Save GF value at beginning of dive
|
|
1420 return ; Done with divemode boot
|
|
1421
|
|
1422 divemode_check_for_warnings:
|
131
|
1423 movlw .2
|
|
1424 cpfsgt warning_counter ; only two warnings active?
|
|
1425 bra divemode_check_for_warnings1 ; Yes, update every second
|
|
1426
|
|
1427 btfss secs,0 ; Every two seconds...
|
|
1428 return
|
|
1429 btfss secs,1 ; Every four seconds...
|
0
|
1430 return
|
|
1431
|
131
|
1432 divemode_check_for_warnings1:
|
0
|
1433 movf warning_counter_backup,W
|
|
1434 cpfseq warning_counter ; warning_counter_backup = warning_counter?
|
|
1435 call TFT_clear_warning_text ; No, clear all warnings
|
|
1436 movff warning_counter,warning_counter_backup ; copy warning_counter
|
|
1437
|
|
1438 bcf warning_active ; Clear flag
|
|
1439 clrf warning_counter ; Clear counter
|
|
1440
|
|
1441 ; Warnings for all modes
|
|
1442 call check_warn_battery ; Check if the battery level should be displayed/warned
|
55
|
1443 call check_divetimeout ; Not actually a warning. Check and show the divemode timeout
|
0
|
1444
|
|
1445 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode
|
|
1446 bra divemode_check_for_warnings2
|
|
1447 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode
|
|
1448 bra divemode_check_for_warnings2
|
|
1449
|
|
1450 ; Warnings only in deco modes
|
|
1451 btfss FLAG_ccr_mode ; Don't check in CCR mode
|
|
1452 rcall check_ppO2 ; check ppO2 and displays warning, if required
|
|
1453 btfsc is_bailout ; But check in Bailout case...
|
|
1454 rcall check_ppO2 ; check ppO2 and displays warning, if required
|
|
1455 rcall check_cns_violation ; Check CNS value and display it, if required
|
|
1456 btfsc decostop_active ; In deco mode?
|
|
1457 rcall check_and_store_gf_violation ; Yes, Sets warnings, if required
|
|
1458 btfsc decostop_active ; In deco mode?
|
|
1459 call TFT_ftts ; Show @+x time
|
|
1460 btfsc use_agf ; In aGF mode?
|
|
1461 rcall warn_agf ; Yes, show a warning for it
|
145
|
1462 btfsc setpoint_fallback ; =1: Fallback to SP1 due to external O2 sensor failure
|
|
1463 rcall warn_fallback ; Show the warning
|
0
|
1464
|
|
1465 divemode_check_for_warnings2:
|
|
1466 ; Display the warning icon?
|
|
1467 btfsc warning_active ; Any warning active?
|
|
1468 call TFT_divemode_warning ; Yes
|
|
1469 btfss warning_active ; Any warning active?
|
|
1470 call TFT_divemode_warning_clear ; No, clear warning icon
|
|
1471
|
|
1472 ; Setup warning_page number
|
|
1473 incf warning_page,F
|
|
1474 bcf STATUS,C
|
|
1475 rlcf warning_page,W ; *2
|
|
1476 cpfsgt warning_counter ; > warning_counter
|
|
1477 clrf warning_page ; No, clear
|
|
1478
|
|
1479 ; Clear 2nd row of warnings if there is nothing to show (on this page)
|
|
1480 btfss second_row_warning ; =1: The second row contains a warning
|
|
1481 call TFT_clear_warning_text_2nd_row ; No, clear this row
|
|
1482 return ; Done.
|
|
1483
|
|
1484 global check_warn_battery
|
|
1485 check_warn_battery:
|
|
1486 movff batt_percent,lo
|
|
1487 movlw battery_show_level+1
|
|
1488 cpfslt lo
|
|
1489 return ; No Display, no warning
|
|
1490 ; Display Battery, but warn?
|
|
1491 incf warning_counter,F ; increase counter
|
|
1492 call TFT_update_batt_percent_divemode ; Show percent
|
|
1493
|
86
|
1494 movff batt_percent,lo
|
0
|
1495 movlw color_code_battery_low+1
|
|
1496 cpfslt lo ;
|
|
1497 return ; No warning
|
|
1498 bsf warning_active ; Set Warning flag
|
|
1499 return
|
|
1500
|
55
|
1501 check_divetimeout:
|
|
1502 btfsc divemode2
|
|
1503 return ; displayed divetime is not running
|
|
1504 incf warning_counter,F ; increase counter
|
|
1505 call TFT_divetimeout ; Show timeout counter
|
|
1506 return
|
|
1507
|
|
1508
|
0
|
1509 check_ppO2: ; check current ppO2 and display warning if required
|
|
1510 SAFE_2BYTE_COPY amb_pressure, xA
|
|
1511 movlw d'10'
|
|
1512 movwf xB+0
|
|
1513 clrf xB+1
|
|
1514 call div16x16 ; xC=p_amb/10
|
|
1515
|
|
1516 movff xC+0,xA+0
|
|
1517 movff xC+1,xA+1
|
|
1518 movff char_I_O2_ratio,xB+0 ; =O2 ratio
|
|
1519 clrf xB+1
|
|
1520 call mult16x16 ; char_I_O2_ratio * p_amb/10
|
|
1521
|
|
1522 ; Check very high ppO2 manually
|
|
1523 tstfsz xC+2 ; char_I_O2_ratio * p_amb/10 > 65536, ppO2>6,55bar?
|
|
1524 bra check_ppO2_1 ; Yes, display Value!
|
|
1525 ; Check if ppO2>3,30bar
|
|
1526 btfsc xC+1,7
|
|
1527 bra check_ppO2_1 ; Yes!
|
|
1528
|
|
1529 ; Check for low ppo2
|
|
1530 movff xC+0,sub_b+0
|
|
1531 movff xC+1,sub_b+1
|
|
1532 movff opt_ppO2_min,WREG
|
|
1533 mullw d'100' ; opt_ppO2_min*100
|
|
1534 movff PRODL,sub_a+0
|
|
1535 movff PRODH,sub_a+1
|
|
1536 call subU16
|
|
1537 btfsc neg_flag
|
|
1538 bra check_ppO2_0 ; Not too low
|
|
1539 ; ppO2 low
|
|
1540 incf warning_counter,F ; increase counter
|
|
1541 call TFT_display_ppo2 ; Show ppO2
|
|
1542 movlw d'4' ; Type of Alarm (ppO2 low)
|
|
1543 movwf AlarmType ; Copy to Alarm Register
|
|
1544 bsf event_occured ; Set Event Flag
|
|
1545 bsf warning_active ; Set Warning flag
|
|
1546 return ; Done.
|
|
1547
|
|
1548 check_ppO2_0:
|
|
1549 ; Check if ppO2 should be displayed
|
|
1550 movlw ppo2_display_high
|
|
1551 mullw d'100' ; ppo2_display_high*100
|
|
1552 movff PRODL,sub_a+0
|
|
1553 movff PRODH,sub_a+1
|
|
1554 call subU16
|
|
1555 btfss neg_flag
|
|
1556 return ; No Display, no warning
|
|
1557 ; Display ppO2, but warn?
|
|
1558 incf warning_counter,F ; increase counter
|
|
1559 call TFT_display_ppo2 ; Show ppO2
|
|
1560
|
|
1561 ;check if we are within our warning thresholds!
|
|
1562 movff xC+0,sub_b+0
|
|
1563 movff xC+1,sub_b+1
|
|
1564 movff opt_ppO2_max,WREG ; PPO2 Max for MOD calculation and color coding in divemode
|
69
|
1565 addlw .1 ; e.g. >1.60
|
0
|
1566 mullw d'100' ; opt_ppO2_max*100
|
|
1567 movff PRODL,sub_a+0
|
|
1568 movff PRODH,sub_a+1
|
|
1569 call subU16
|
|
1570 btfss neg_flag
|
|
1571 return ; Done. Not too high
|
|
1572 movlw d'5' ; Type of Alarm (ppO2 high)
|
|
1573 movwf AlarmType ; Copy to Alarm Register
|
|
1574 bsf event_occured ; Set Event Flag
|
|
1575 bsf warning_active ; Set Warning flag
|
|
1576 return ; Done.
|
|
1577
|
|
1578 check_ppO2_1: ; ppO2 very high
|
|
1579 incf warning_counter,F ; increase counter
|
|
1580 call TFT_display_ppo2 ; Show ppO2
|
|
1581 movlw d'5' ; Type of Alarm
|
|
1582 movwf AlarmType ; Copy to Alarm Register
|
|
1583 bsf event_occured ; Set Event Flag
|
|
1584 bsf warning_active ; Set Warning flag
|
|
1585 return ; Done.
|
|
1586
|
|
1587 global check_cns_violation
|
|
1588 check_cns_violation:
|
|
1589 ; Check if CNS should be displayed
|
|
1590 movff int_O_CNS_fraction+1,lo ; copy into bank1
|
|
1591 tstfsz lo ; >255% ?
|
|
1592 bra check_cns_violation2 ; Yes
|
|
1593 movff int_O_CNS_fraction+0,lo ; copy into bank1
|
|
1594
|
|
1595 movlw cns_warning_high ; cns_warning_high
|
|
1596 subwf lo,W
|
|
1597 btfsc STATUS,C
|
|
1598 bsf warning_active ; Set Warning flag
|
|
1599
|
|
1600 movlw cns_display_high ; cns_display_high
|
|
1601 subwf lo,W
|
|
1602 btfss STATUS,C
|
|
1603 return ; No Display, no warning
|
|
1604 ; Display CNS
|
|
1605 incf warning_counter,F ; increase counter
|
|
1606 call TFT_display_cns ; Show CNS
|
|
1607 return
|
|
1608
|
|
1609 check_cns_violation2:
|
|
1610 incf warning_counter,F ; increase counter
|
|
1611 call TFT_display_cns ; Show CNS
|
|
1612 bsf warning_active ; Set Warning flag
|
|
1613 return
|
|
1614
|
|
1615 global check_and_store_gf_violation
|
|
1616 check_and_store_gf_violation:
|
|
1617 movff char_O_gradient_factor,lo ; gradient factor absolute (Non-GF model)
|
|
1618 movff char_I_deco_model,hi
|
|
1619 decfsz hi,F ; jump over next line if char_I_deco_model == 1
|
|
1620 movff char_O_relative_gradient_GF,lo ; gradient factor relative (GF model)
|
|
1621
|
|
1622 movlw gf_warning_high
|
|
1623 cpfsgt lo
|
|
1624 bra check_and_store_gf_violation2 ; No warning
|
|
1625 movlw d'2' ; Type of Alarm
|
|
1626 movwf AlarmType ; Copy to Alarm Register
|
|
1627 bsf event_occured ; Set Event Flag
|
|
1628 bsf warning_active ; Set Warning flag
|
|
1629 check_and_store_gf_violation2:
|
|
1630 movlw gf_display_high
|
|
1631 cpfsgt lo
|
|
1632 return ; No Display, no warning
|
|
1633 ; Display GF
|
|
1634 incf warning_counter,F ; increase counter
|
|
1635 call TFT_warning_gf ; Show GF Warning
|
|
1636 return
|
|
1637
|
|
1638 warn_agf:
|
|
1639 incf warning_counter,F ; increase counter
|
|
1640 call TFT_warning_agf ; Show aGF warning
|
145
|
1641 return
|
|
1642
|
|
1643 warn_fallback:
|
|
1644 incf warning_counter,F ; increase counter
|
|
1645 call TFT_warning_fallback ; Show fallback warning
|
|
1646 bsf warning_active ; Set Warning flag
|
0
|
1647 return
|
|
1648
|
|
1649
|
|
1650 END |