view code_part1/OSTC_code_asm_part1/divemode_menu.asm @ 110:8aa8acada0fd

Display deco-type icon in surface mode.
author JeanDo
date Wed, 22 Dec 2010 03:23:55 +0100
parents 6e635bf5b7a7
children ed7826c740a0
line wrap: on
line source

; OSTC - diving computer code
; Copyright (C) 2008 HeinrichsWeikamp GbR

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;    (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.


; Underwater Menu (Set Gas, Decoplan, etc.)
; written by: Matthias Heinrichs, info@heinrichsweikamp.com
; written: 11/11/05
; last updated: 090305
; known bugs:
; ToDo:


test_switches_divemode:
									; checks switches in divemode
	btfsc	switch_left
	bra		test_switches_divemode2

	btfss	switch_right
	return
	
	bcf		switch_left				; Left button pressed!
	bcf		switch_right
	
	bcf		select_bailoutgas		; Clear Flag for Bailout list
	bsf		premenu					; Set Flag for premenu
	bcf		menubit
	clrf	timeout_counter3		; timeout_divemenu
		
	btfsc	FLAG_apnoe_mode			; In Apnoe mode?
	bra		test_switches_divemode1	; Yes!

test_switches_divemode0:	
	WIN_INVERT		.1
	DISPLAYTEXT	.4			;Menu?
	WIN_INVERT		.0
	return

test_switches_divemode1:
	DISPLAYTEXT	.141			;Quit?
	return

test_switches_divemode2:
	bcf		switch_left			; Also reactivate left button if there was a right press without prior left press
	bcf		switch_right		; enable right button again

	btfsc	premenu
	bra		test_switches_divemode2_2
	btfsc	menubit
	bra		test_switches_divemode2_2	; Not in Premenu or Menu...

	bsf		toggle_customview	; Toggle customview (Cleared in customview.asm)
	btfsc	standalone_simulator	; Standalone Simualtor active?
	bra		divemode_menu_simulator	; Yes, Show simulator menu!

test_switches_divemode2_2:
	btfss	FLAG_apnoe_mode		; In Apnoe mode?
	bra		test_switches_divemode2a; No!
	
	; Yes, so quit Apnoe mode at once...
	bcf		divemode			; Clear Divemode flag...
	bcf		premenu				; clear premenu flag
	return

test_switches_divemode2a:
	bsf		menubit					; Enter Divemode-Menu!
	bcf		premenu					; clear premenu flag
	call	PLED_clear_divemode_menu		; Clear dive mode menu area
	call	PLED_divemode_menu_mask_first	; Write Divemode menu1 mask
	bcf		display_set_simulator			; Clear Simulator-Menu flag
	movlw	d'1'
	movwf	menupos					; reset cursor in divemode menu
	call	PLED_divemenu_cursor	; show cursor
	bcf		switch_right
	bcf		switch_left				; Left button pressed!
	return

reset_stopwatch:
	btfsc	lock_stopwatch_reset	; Reset locked?
	return							; Yes, do not reset (now)...
; Maker Set, also reset average Depth....
	clrf	average_depth_hold+0
	clrf	average_depth_hold+1
	clrf	average_depth_hold+2
	clrf	average_depth_hold+3		; Clear average depth register
	movlw	d'2'
	movwf	average_divesecs+0
	clrf	average_divesecs+1
	call	calc_average_depth
	return

test_switches_divemode_menu:
	btfsc	switch_left
	bra		test_switches_divemode_menu3
	btfss	switch_right
	return

	btfsc 	display_see_deco			; Is the Decoplan displayed?
	bra		divemenu_see_decoplan2		; Yes, exit menu on left button press

	bcf		switch_right				; Left button pressed
	clrf	timeout_counter3			; timout_divemenu!
	incf	menupos,F

; Following routine configures the number of menu entries for the different modes
	movlw	d'6'						; number of available gases+1, ; number of menu options+1
	btfsc	display_set_gas				; Are we in the "Gaslist" menu?
	movlw	d'7'						; Yes, Number of entries for this menu+1 = 7
	btfsc	display_set_setpoint		; In SetPoint Menu?
	movlw	d'5'						; Number of entries for this menu+1 = 5
	cpfseq	menupos						; =limit?
	bra		test_switches_divemode_menu1; No!
	movlw	d'1'						; Yes, reset to position 1!
	movwf	menupos

test_switches_divemode_menu1:
; Finally, check if menuposition 3 should be skipped (No customview with function displayed)

	btfsc	display_set_gas				; Are we in the "Gaslist" or "SetPoint" menu?
	bra		test_switches_divemode_menu1a	; Skip test for sub menus
	btfsc	display_set_xgas				; Are we in the "Gaslist" or "SetPoint" menu?
	bra		test_switches_divemode_menu1a	; Skip test for sub menus

	movlw	d'3'
	cpfseq	menupos						; At position 3?
	bra		test_switches_divemode_menu1a; No
	btfss	menu3_active				; Menu position 3 has functionality?
	incf	menupos,F					; No, +1, skip to menuos=4

test_switches_divemode_menu1a:
	call	PLED_divemenu_cursor		; update cursor
	return

test_switches_divemode_menu3:
	bcf		switch_left
	bcf		switch_right
	bsf		menubit					; Enter Divemode-Menu!
	bcf		premenu					; clear premenu flag
	clrf	timeout_counter3

	btfsc	display_set_gas				; Are we in the "Gaslist" or "SetPoint" menu?
	bra		divemenu_set_gas2			; Yes, so set gas and exit menu

	btfsc 	display_see_deco			; Is the Decoplan displayed?
	bra		divemenu_see_decoplan2		; Yes, exit menu on right button press

	btfsc	display_set_xgas			; Are we in the "Set Gas" menu?
	bra		divemenu_set_xgas2			; Yes, so configure gas or set menu and exit menu

	btfsc	display_set_simulator		; Are we in the Divemode Simulator menu?
	goto	divemode_menu_simulator2	; Yes, so adjust depth or set and exit

; Options for Menu 1
	dcfsnz	menupos,F
	bra		divemenu_set_gas			; Set gas sub-menu
	dcfsnz	menupos,F
	bra		divemenu_see_decoplan		; display the full decoplan
	dcfsnz	menupos,F
	bra		divemode_menu3				; Customview-function
	dcfsnz	menupos,F
	bra		divemode_toggle_brightness	; Toggle OLED-Brightness
	dcfsnz	menupos,F
	bra		timeout_divemenu2			; Quit divemode menu
	return

divemode_menu3:
	movff	menupos3,temp1		; copy
	dcfsnz	temp1,F
	bra		toggle_stopwatch			; Toggle Stopwatch/Average register
	dcfsnz	temp1,F
	bra		set_marker					; Set Marker
	dcfsnz	temp1,F
	bra		divemode_menu3_nothing		; clock...
	dcfsnz	temp1,F
	bra		divemode_menu3_nothing		; leading tissue...

divemode_menu3_nothing:
	bra		timeout_divemenu2			; Quit divemode menu
	return

set_marker:
	movlw	d'6'				; Type of Alarm  (Manual Marker)
	movwf	AlarmType			; Copy to Alarm Register
	bsf		event_occured		; Set Event Flag
	bra		timeout_divemenu2			; quit menu!

toggle_stopwatch:
	btg		stopwatch_active			; Toggle Flag
	
	btfss	stopwatch_active			; Show Stopwatch?
	bra		toggle_stopwatch2			; No, remove outputs

	clrf	average_depth_hold+0
	clrf	average_depth_hold+1
	clrf	average_depth_hold+2
	clrf	average_depth_hold+3		; Clear average depth register
	movlw	d'3'
	movwf	average_divesecs+0
	clrf	average_divesecs+1
	call	calc_average_depth
	bra		timeout_divemenu2			; quit menu!

toggle_stopwatch2:
	call	PLED_clear_customview_divemode	; Remove Stopwatch Outputs
	bra		timeout_divemenu2			; quit menu!

divemode_toggle_brightness:
	read_int_eeprom	d'90'				; Brightness offset? (Dim>0, Normal = 0)
	tstfsz	EEDATA						; Was dimmed?
	bra		divemode_toggle_brightness1	; Yes...

	call	PLED_brightness_low
	movlw	d'1'
	movwf	EEDATA						; Copy to EEDATA
	write_int_eeprom	d'90'			; Brightness offset? (Dim=1, Normal = 0)
	bra		divemode_toggle_brightness3

divemode_toggle_brightness1:
	call	PLED_brightness_full
	movlw	d'0'
	movwf	EEDATA						; Copy to EEDATA
	write_int_eeprom	d'90'			; Brightness offset? (Dim=1, Normal = 0)

divemode_toggle_brightness3:
; Now, redraw all outputs (All modes)
	call	PLED_active_gas_divemode	; Display gas, if required
	call	PLED_temp_divemode			; Displays temperature
	call	PLED_depth					; Displays new depth...
	call	PLED_max_pressure			; ...and max. depth

	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
	bra		timeout_divemenu2			; quit menu!
	btfsc	gauge_mode					; Ignore in Gauge mode
	bra		timeout_divemenu2			; quit menu!

; Redraw Outputs in Deco modes
	btfsc	dekostop_active
	call	PLED_display_deko_mask		; clear nostop time, display decodata
	btfss	dekostop_active
	call	PLED_display_ndl_mask		;  Clear deco data, display nostop time
	bra		timeout_divemenu2			; quit menu!

divemode_set_xgas:						; Set the extra gas...
	bsf		display_set_xgas			; Set Flag
	bcf		display_set_gas				; Clear Flag
	call	PLED_clear_divemode_menu	; Clear Menu

	movff	char_I_O2_ratio, EEDATA		; Reset Gas6 to current gas
	write_int_eeprom	d'24'
	movff	char_I_He_ratio, EEDATA
	write_int_eeprom	d'25'

	call	PLED_divemode_set_xgas		; Show mask

	movlw	d'1'
	movwf	menupos						; reset cursor
	call	PLED_divemenu_cursor		; update cursor
	return

divemode_menu_simulator:
	bsf		menubit					; Enter Divemode-Menu!
	bcf		premenu					; clear premenu flag
	bcf		switch_right
	bcf		switch_left				; Left button pressed!
	bsf		display_set_simulator	; Set Flag
	bsf		menu3_active			; So "+1" is accessible at all times
	call	PLED_clear_divemode_menu	; Clear Menu
	call	PLED_divemode_simulator_mask; Show mask
	movlw	d'1'
	movwf	menupos						; reset cursor
	call	PLED_divemenu_cursor		; update cursor
	return

divemode_menu_simulator2:
	dcfsnz	menupos,F
	bra		timeout_divemenu2			; quit underwater menu!
	dcfsnz	menupos,F
	bra		divemode_menu_simulator_p1	; Adjust +1m
	dcfsnz	menupos,F
	bra		divemode_menu_simulator_m1	; Adjust -1m
	dcfsnz	menupos,F
	bra		divemode_menu_simulator_p10	; Adjust +10m
	dcfsnz	menupos,F
	bra		divemode_menu_simulator_m10	; Adjust -10m
	bra		timeout_divemenu2			; quit underwater menu!

divemode_menu_simulator_common:
	call	PLED_divemode_simulator_mask		; Redraw Simualtor mask

	; Check limits (140m and 0m)
	movlw	LOW		d'15000'
	movwf	sub_a+0
	movlw	HIGH	d'15000'
	movwf	sub_a+1
	movff	sim_pressure+0,sub_b+0
	movff	sim_pressure+1,sub_b+1
	call	sub16				; sub_c = sub_a - sub_b
	btfss	neg_flag	
	bra		divemode_menu_simulator_common2
	; Too deep, limit to 140m
	movlw	LOW		d'15000'
	movwf	sim_pressure+0
	movlw	HIGH	d'15000'
	movwf	sim_pressure+1
	return

divemode_menu_simulator_common2:
	movlw	LOW		d'1000'
	movwf	sub_a+0
	movlw	HIGH	d'1000'
	movwf	sub_a+1
	movff	sim_pressure+0,sub_b+0
	movff	sim_pressure+1,sub_b+1
	call	sub16				; sub_c = sub_a - sub_b
	btfsc	neg_flag	
	return
	; Too shallow, limit to 1m
	movlw	LOW		d'1000'
	movwf	sim_pressure+0
	movlw	HIGH	d'1000'
	movwf	sim_pressure+1
	return

divemode_menu_simulator_m10:
	movlw	LOW		d'1000'
	subwf	sim_pressure+0,F
	movlw	HIGH	d'1000'
	subwfb	sim_pressure+1,F
	movlw	d'5'
	movwf	menupos						; reset cursor
	bra		divemode_menu_simulator_common

divemode_menu_simulator_p10:
	movlw	LOW		d'1000'
	addwf	sim_pressure+0,F
	movlw	HIGH	d'1000'
	addwfc	sim_pressure+1,F
	movlw	d'4'
	movwf	menupos						; reset cursor
	bra		divemode_menu_simulator_common

divemode_menu_simulator_p1:
	movlw	d'100'
	addwf	sim_pressure+0,F
	movlw	d'0'
	addwfc	sim_pressure+1,F
	movlw	d'2'
	movwf	menupos						; reset cursor
	bra		divemode_menu_simulator_common

divemode_menu_simulator_m1:
	movlw	d'100'
	subwf	sim_pressure+0,F
	movlw	d'0'
	subwfb	sim_pressure+1,F
	movlw	d'3'
	movwf	menupos						; reset cursor
	bra		divemode_menu_simulator_common

divemenu_see_decoplan:
	bsf		display_see_deco			; set flag
	call	PLED_clear_divemode_menu	; Clear Menu
	
	read_int_eeprom	d'34'
	movlw	d'3'
	cpfsgt	EEDATA						; in multi-gf mode? Z16 GF OC=4 and Z16 GF CC=5
	bra		divemenu_see_decoplan1		; No, standard ZH-L16

	bsf		multi_gf_display			; Yes, display the multi-gf table screen
	bcf		last_ceiling_gf_shown		; Clear flag

	call	PLED_decoplan_gf_page1			; Display the new screen
	return
	
divemenu_see_decoplan1:	

	movff	char_O_deco_status,deco_status		; 
	tstfsz	deco_status							; deco_status=0 if decompression calculation done
	return										; calculation not yet finished!
	
	call	PLED_decoplan				; display the Decoplan
	return

divemenu_see_decoplan2:
	btfsc	multi_gf_display			; Next Page in Multi-GF Screen?
	bra		divemenu_see_decoplan2_nextgf	; Yes!
; No, remove outputs!
divemenu_see_decoplan2_0:
	bcf		display_see_deco			; clear flag
	bra		timeout_divemenu2			; quit menu!

divemenu_see_decoplan2_nextgf:
	incf	temp8,F
	btfsc	last_ceiling_gf_shown		; last ceiling shown?
	bra		divemenu_see_decoplan2_0	; All done, clear and return

	clrf	timeout_counter3			; Clear timeout Divemode menu
	bra		timeout_divemenu3x			; Display next page

divemenu_set_xgas2:
	dcfsnz	menupos,F
	bra		divemenu_set_xgas2_exit		; Use the gas6 configured and exit
	dcfsnz	menupos,F
	bra		divemenu_set_xgas2_o2plus	; Adjust O2+
	dcfsnz	menupos,F
	bra		divemenu_set_xgas2_o2minus	; Adjust O2-
	dcfsnz	menupos,F
	bra		divemenu_set_xgas2_heplus	; Adjust He+
	dcfsnz	menupos,F
	bra		divemenu_set_xgas2_heminus	; Adjust He-
	return

divemenu_set_xgas2_heminus:
	read_int_eeprom		d'25'			; He value
	movff	EEDATA,lo
	decf	lo,F						; decrease He
	movlw	d'255'
	cpfseq	lo
	bra		divemenu_set_xgas2_heminus2
	incf	lo,F						; limit to min=0
divemenu_set_xgas2_heminus2:
	movff	lo, EEDATA
	write_int_eeprom	d'25'			; He Value

	call	PLED_divemode_set_xgas		; Redraw menu
	movlw	d'5'
	movwf	menupos						; reset cursor
	return

divemenu_set_xgas2_heplus:
	read_int_eeprom		d'25'			; He value
	movff	EEDATA,lo
	incf	lo,F						; increase He
	movlw	d'101'
	cpfseq	lo
	bra		divemenu_set_xgas2_heplus2
	movlw	d'4'						; O2 Limit
	movwf	lo
divemenu_set_xgas2_heplus2:				; test if O2+He>100...
	read_int_eeprom		d'24'			; O2 value
	movf	EEDATA,W
	addwf	lo,W						; add He value
	movwf	hi							; store in temp
	movlw	d'101'
	cpfseq	hi							; O2 and He > 100?
	bra		divemenu_set_xgas2_heplus3	; No!
	decf	lo,F						; reduce He again = unchanged after operation
divemenu_set_xgas2_heplus3:				; save current value
	movff	lo, EEDATA
	write_int_eeprom	d'25'			; He Value

	call	PLED_divemode_set_xgas		; Redraw menu
	movlw	d'4'
	movwf	menupos						; reset cursor
	return

divemenu_set_xgas2_o2minus:
	read_int_eeprom		d'24'			; O2 value
	movff	EEDATA,lo
	decf	lo,F						; decrease O2
	movlw	d'3'						; Limit-1
	cpfseq	lo
	bra		divemenu_set_xgas2_o2minus2
	incf	lo,F						; limit to min=9
divemenu_set_xgas2_o2minus2:
	movff	lo, EEDATA
	write_int_eeprom	d'24'			; O2 Value

	call	PLED_divemode_set_xgas		; Redraw menu
	movlw	d'3'
	movwf	menupos						; reset cursor
	return

divemenu_set_xgas2_o2plus:
	read_int_eeprom		d'24'			; O2 value
	movff	EEDATA,lo
	incf	lo,F						; increase O2
	movlw	d'101'
	cpfseq	lo
	bra		divemenu_set_xgas2_o2plus2
	movlw	d'5'						; O2 limit
	movwf	lo
divemenu_set_xgas2_o2plus2:				; test if O2+He>100...
	read_int_eeprom		d'25'			; He value
	movf	EEDATA,W
	addwf	lo,W						; add O2 value
	movwf	hi							; store in temp
	movlw	d'101'
	cpfseq	hi							; O2 and He > 100?
	bra		divemenu_set_xgas2_o2plus3	; No!
	decf	lo,F						; reduce O2 again = unchanged after operation
divemenu_set_xgas2_o2plus3:				; save current value
	movff	lo, EEDATA
	write_int_eeprom	d'24'			; O2 Value

	call	PLED_divemode_set_xgas		; Redraw menu
	movlw	d'2'
	movwf	menupos						; reset cursor
	return

divemenu_set_xgas2_exit:
	read_int_eeprom		d'25'			; Read He ratio
	movff	EEDATA,char_I_He_ratio		; And copy into hold register

	read_int_eeprom		d'24'			; Read O2 ratio
	movff	EEDATA, char_I_O2_ratio		; O2 ratio
	movff	char_I_He_ratio, wait_temp	; copy into bank1 register
	bsf		STATUS,C					; 
	movlw	d'100'						; 100%
	subfwb	wait_temp,W					; minus He
	subfwb	EEDATA,F					; minus O2
	movff	EEDATA, char_I_N2_ratio		; = N2!
	bsf		manual_gas_changed			; set event flag
	bsf		event_occured				; set global event flag
    bsf		is_bailout					;=1: CC mode, but bailout active!		
	clrf	lo							; clear Setpoint, PLED_const_ppO2_value now displayes "Bail"
	movff	lo,char_I_const_ppO2		
	bra		timeout_divemenu2			; quit underwater menu!

divemenu_set_gas:
	btfsc	FLAG_const_ppO2_mode		; in ppO2 mode?
	bra		divemenu_set_setpoint		; Yes, display SetPoint list

divemenu_set_gas_2:
	bsf		display_set_gas				; set flag	
	call	PLED_clear_divemode_menu	; Clear Menu
	call	PLED_gas_list				; Display all 5 gases
	movlw	d'1'
	movwf	menupos						; reset cursor
	call	PLED_divemenu_cursor		; update cursor
	return

divemenu_set_setpoint:
	bsf		display_set_setpoint		; set flag	
	bsf		display_set_gas				; set flag	

	call	PLED_clear_divemode_menu	; Clear Menu
	call	PLED_splist_start			; Display SetPoints
	DISPLAYTEXT		d'137'				; Bailout (as a sub-menu)
	movlw	d'1'
	movwf	menupos						; reset cursor
	call	PLED_divemenu_cursor		; update cursor
	return


divemenu_set_gas2:
	btfsc	select_bailoutgas			; Are we in the Bailout list?
	bra		divemenu_set_gas2a			; Yes, choose gas

	btfss	FLAG_const_ppO2_mode		; are we in ppO2 mode?
	bra		divemenu_set_gas2a			; no, choose gas
	; Yes, so select SP 1-3
	bcf		is_bailout					;=1: CC mode, but bailout active!		
	call	PLED_show_ppO2_clear		; Clear ppO2 value
	
divemenu_set_gas1:
	movlw	d'4'				
	cpfseq	menupos						; At the "Bailout" position?		
	bra		divemenu_set_gas1b			; No, select SetPoint 1-3
	bsf		select_bailoutgas			; Set Flag
	bcf		display_set_setpoint		; Clear Flag
	bra		divemenu_set_gas_2			; Configure the extra gas / Select Bailout

divemenu_set_gas1b:
	movlw	d'35'						; offset in memory
	addwf	menupos,W					; add SP number 0-2
	movwf	EEADR
	call	read_eeprom					; Read SetPoint
	movff	EEDATA, char_I_const_ppO2	; Use SetPoint
	movff	EEDATA, ppO2_setpoint_store	; Store also in this byte...

divemenu_set_gas1a:
	bcf		display_set_setpoint		; Clear Display Flag
	bsf		stored_gas_changed			; set event flag
	bsf		event_occured				; set global event flag
	bra		timeout_divemenu2			; quit menu!

divemenu_set_gas2a:
	movlw	d'6'				
	cpfseq	menupos						; At the "Gas 6.." position?		
	bra		divemenu_set_gas2b			; No, select Gas1-5 (Stored in Menupos)
	bra		divemode_set_xgas			; Configure the extra gas
divemenu_set_gas2b:
	bsf		is_bailout					;=1: CC mode, but bailout active!		
	clrf	lo							; clear Setpoint, PLED_const_ppO2_value now displayes "Bail"
	movff	lo,char_I_const_ppO2		

	bcf		display_set_gas				; clear flag
	movff	menupos,active_gas			; copy into active gas register
	decf	menupos,W					; # of selected gas (0-4)
	mullw	d'4'						; times 4...
	movf	PRODL,W						;
	addlw	d'7'						; +7 = address for He ratio
	movwf	EEADR
	call	read_eeprom					; Read He ratio
	movff	EEDATA,char_I_He_ratio		; And copy into hold register

	decf	menupos,W					; # of selected gas (0-4)
	mullw	d'4'						; times 4...
	movf	PRODL,W						;
	addlw	d'6'						; +6 = address for O2 ratio
	movwf	EEADR
	call	read_eeprom					; Read O2 ratio
	movff	EEDATA, char_I_O2_ratio		; O2 ratio
	movff	char_I_He_ratio, wait_temp	; copy into bank1 register
	bsf		STATUS,C					; 
	movlw	d'100'						; 100%
	subfwb	wait_temp,W					; minus He
	subfwb	EEDATA,F					; minus O2
	movff	EEDATA, char_I_N2_ratio		; = N2!
	bsf		stored_gas_changed			; set event flag
	bsf		event_occured				; set global event flag
	bra		timeout_divemenu2			; quit menu!
	
timeout_divemenu:
	btfss	menubit					; is the Dive mode menu displayed?
	return							; No


	btfsc	display_set_simulator	; Is the Simulator Mask active?
	bra		timeout_divemenu6		; Yes, update Simulator mask
	
	btfss	display_see_deco		; Is the decoplan active?
	bra		timeout_divemenu1		; No, skip updating the decoplan

	btfsc	multi_gf_display		; display the multi-gf table screen?
	bra		timeout_divemenu3		; Yes...

	movff	char_O_deco_status,deco_status		; 
	tstfsz	deco_status				; deco_status=0 if decompression calculation done
	bra		timeout_divemenu1		; No, skip updating the decoplan
	
	call	PLED_decoplan			; update the Decoplan
	
timeout_divemenu1:	
	incf	timeout_counter3,F		; increase timeout_counter3
	GETCUSTOM8	d'10'				; loads timeout_divemenu into WREG
	cpfsgt	timeout_counter3		; ... longer then timeout_divemenu
	return							; No!
timeout_divemenu2:					; quit divemode menu
	btfss	multi_gf_display		; Was the Multi-GF Table displayed?
	bra		timeout_divemenu2a		; No, normal OLED rebuild

; Restore some outputs
	clrf	temp8					; Page 0-1 of deco list
	btfsc	dekostop_active
	call	PLED_display_deko_mask	; clear nostop time, display decodata
	btfss	dekostop_active
	call	PLED_display_ndl_mask	;  Clear deco data, display nostop time

timeout_divemenu2a:
	bcf		multi_gf_display		; Do not display the multi-gf table screen
	bcf		menubit
	bcf		premenu					; Yes, clear flags and menu, display dive time and mask again
	call	PLED_active_gas_divemode; Display gas, if required
	call	PLED_clear_divemode_menu; Clear dive mode menu
	call	PLED_divemode_mask		; Display mask
	call	PLED_divemins			; Display (new) divetime!
	btfss	dekostop_active
	call	PLED_display_ndl_mask
	btfsc	dekostop_active
	call	PLED_display_deko_mask
	call	customview_mask			; Redraw current customview mask
	clrf	timeout_counter3		; Also clear timeout
	bcf		display_see_deco		; clear all display flags
	bcf		display_set_gas			
	bcf		display_set_xgas
	bcf		display_set_setpoint
	bcf		display_set_simulator
	bcf		switch_left				; and debounce switches
	bcf		switch_right
	bsf		lock_stopwatch_reset	; Lock the stopwatch reset for at least one second (Cleared in "calc_average_depth:")
	return
	
timeout_divemenu3:
	movff	char_O_deco_status,deco_status	; 
	tstfsz	deco_status						; deco_status=0 if decompression calculation done
	bra		timeout_divemenu1				; No, skip updating the decoplan
timeout_divemenu3x:
	call	PLED_decoplan_gf_page_current	; Re-Draw Current page of GF Decoplan
	bra		timeout_divemenu1			; Check timeout
	
timeout_divemenu6:
	; Update Simulator Mask
	call	PLED_divemode_simulator_mask; Show mask
	call	PLED_divemenu_cursor		; update cursor
	bra		timeout_divemenu1			; Check timeout