view src/divemenu_tree.asm @ 592:05053910d668

BUGFIX: Re-enable Sensors after sleep in PSCR mode
author heinrichsweikamp
date Wed, 18 Apr 2018 17:03:52 +0200
parents 6636cbe64c6d
children ca4556fb60b9
line wrap: on
line source

;=============================================================================
;
;   File divemenu_tree.asm							REFACTORED VERSION V2.98
;
;   OSTC dive mode menu
;
;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
;=============================================================================
; HISTORY
;   2013-02-02 : [mH] Made out of menu_tree.asm

#include "hwos.inc"						; Mandatory header
#include "menu_processor.inc"
#include "shared_definitions.h"			; Mailbox from/to p2_deco.c
#include "tft_outputs.inc"
#include "customview.inc"
#include "strings.inc"
#include "calibrate.inc"

	extern	timeout_divemode_menu2
	extern	diveloop_loop4


divegui		CODE

;=============================================================================
; Main Menu
	global	do_main_divemenu
do_main_divemenu:
	call	menu_processor_reset		; restart from first icon
	movlw	.1
	movwf	menupos1					; set to first option in divemode menu
	btfsc	FLAG_ccr_mode
	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu
	btfsc	FLAG_pscr_mode
	bra		main_divemenu_loop			; goto CCR / pSCR Menu menu

main_divemenu_OC:
	bcf		ccr_diluent_setup
	bcf		is_bailout_menu

	MENU_BEGIN	tMainMenu,	.5
		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
		MENU_CALL	tDivemenu_Marker,	do_set_marker
		MENU_CALL	tExit,				do_exit_divemode_menu
	MENU_END

main_divemenu_loop:
	bsf		ccr_diluent_setup			; default to operations on diluents
	bcf		is_bailout_menu				; default to none-bailout menu
	btfsc	FLAG_pscr_mode
	bra		main_divemenu_pscr			; PSCR Menu

	MENU_BEGIN	tMainMenu,	.6
		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
		MENU_CALL	tDivemenu_Setpoint,	do_divemode_splist
		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
		MENU_CALL	tExit,				do_exit_divemode_menu
	MENU_END

main_divemenu_pscr:
	btfsc	analog_o2_input			; do we have an analog input?
	bra	main_divemenu_pscr_sensors	; YES
	btfsc	s8_digital			; do we have a digital input?
	bra	main_divemenu_pscr_sensors	; YES
	btfsc	optical_input			; do we have an optical input?
	bra	main_divemenu_pscr_sensors	; YES

main_divemenu_pscr_no_sensors:
	MENU_BEGIN	tMainMenu,	.6
		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
		MENU_CALL	tDivemenu_Marker,	do_set_marker
		MENU_CALL	tExit,				do_exit_divemode_menu
	MENU_END

main_divemenu_pscr_sensors:
	MENU_BEGIN	tMainMenu,	.6
		MENU_CALL	tDiveBailout,		do_divemode_gaslist_bail
		MENU_CALL	tCCRSensor,			do_divemode_setpoint_pscr
		MENU_CALL	tDivemenu_Gaslist,	do_divemode_gaslist
		MENU_CALL	tDivemenu_ResetAvg,	do_reset_average
		MENU_CALL	tDivemenu_ToggleGF,	do_toggle_gf
		MENU_CALL	tExit,				do_exit_divemode_menu
	MENU_END


do_toggle_gf:
	movff	char_I_deco_model,WREG		; 0 = ZH-L16, 1 = ZH-L16-GF
	decfsz	WREG,W						; Toggle GF only in GF modes - in GF mode?
	bra		do_main_divemenu			; No, do nothing and return
	TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater
	bra		do_main_divemenu			; No, do nothing and return
	movlw	.4							; Set customview to 5 (GF informations)
	movwf	menupos3					; Customview to come-1
	bsf		toggle_customview			; Set flag, the customview will be toggled very soon now...
	movlw	.1
	movwf	menupos1					; Set to first option in divemode menu

	MENU_BEGIN	tDivemenu_ToggleGF,	.2
		MENU_CALL	tDivemenu_ToggleGF,	do_togglegf
		MENU_CALL	tBack,				do_main_divemenu
	MENU_END

do_togglegf:
	;TSTOSS	opt_enable_aGF				; =1: aGF can be selected underwater ; check is now done before entering menu
	;bra	do_exit_divemode_menu		; continue with exiting menu code
	bsf		toggle_gf					; Set flag...
	bra		do_exit_divemode_menu		; continue with exiting menu code


do_set_marker:
	bsf		FLAG_set_marker				; set flag...
	bra		do_exit_divemode_menu		; ... and exit


do_reset_average:
	bsf		reset_average_depth			; Set Flag
	bra		do_exit_divemode_menu		; continue with exiting menu code


do_switch_sensor:						; entry point when coming from switch to sensor
	movlw	.1							; Switch to Sensor
	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
	; enable all sensors
	bsf		use_O2_sensor1
	bsf		use_O2_sensor2
	bsf		use_O2_sensor3
	bra		do_switch_sp_com			; continue with common part

do_switch_sp:							; entry point when coming from manual setpoint selection (CCR)
	decf	menupos1,W					; 1-5 -> 0-4
	lfsr	FSR1,char_I_setpoint_cbar
	movff	PLUSW1,char_I_const_ppO2	; setup fixed setpoint
	movff	char_I_const_ppO2,WREG
	call	transmit_setpoint			; transmit current setpoint from WREG (in cbar) to external electronics
	bcf		setpoint_fallback			; clear fallback condition (stops fallback warning)
	clrf	WREG						; Switch to fixed SP
	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
	bra		do_switch_sp_com

do_switch_sp_calc:						; entry point when coming from switch to calculated ppO2 (pSCR)
	bcf		setpoint_fallback			; clear fallback condition (stops fallback warning)
	clrf	WREG						; Switch to fixed SP
	movff	WREG,opt_ccr_mode			; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP
	movff	WREG,char_I_const_ppO2		; set setpoint to 0, this forces deco engine to take the computed ppO2

do_switch_sp_com:						; merge point to common part
	bsf		event_occured				; set global event byte
	bsf		setpoint_changed			; set flag (for profile)

	; Clear some flags in case we were in bailout before...
	bcf		is_bailout					; end bailout mode
	;bcf	is_bailout_menu				; not needed
	bcf		better_gas_available		; =1: A better gas is available and a gas change is advised in divemode
	bcf		blinking_better_gas			; clear blinking flag
	call	customview_mask				; update customview mask to (eventually) rewrite ppO2(Dil): to ppO2:

	bsf		FLAG_back_to_loop			; indicate that it is a switchback from OC bailout to CCR/pSCR loop
	bsf		divemode_gaschange			; initiate reconfiguration to loop mode on last diluent

	bra		do_exit_divemode_menu		; continue with exiting menu code


do_divemode_gaslist_bail:				; entry point from CCR/pSCR to bailout to OC gases
	bcf		ccr_diluent_setup			; switch to OC gases
	bsf		is_bailout_menu				; flag it is a bailout action
do_divemode_gaslist:					; entry point for switching: OC -> gases, loop -> diluents
	btfsc	is_bailout					; in bailout mode?
	bcf		ccr_diluent_setup			; yes - for safety reasons, redirect to OC (bailout) gases
do_divemode_gaslist_com:
	bsf		short_gas_decriptions
	movlw	.1
	movwf	menupos1					; Set to first option in divemode menu
	MENU_BEGIN	tGaslist,	.6
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_switch_gas
		MENU_CALL		tMore,					do_divemode_gaslist_more
	MENU_END


do_divemode_gaslist_more:
	movlw	.1
	movwf	menupos1						; Set to first option in divemode menu

	movff	char_I_O2_ratio,gas6_O2_ratio	; initialize gas6 with currently breathed gas - O2 ratio
	movff	char_I_He_ratio,gas6_He_ratio	; initialize gas6 with currently breathed gas - He ratio

do_divemode_gaslist_more_common:
	MENU_BEGIN	tGaslist,	.6
		MENU_CALL		tO2Plus,				do_dive_pO2
		MENU_CALL		tO2Minus,				do_dive_mO2
		MENU_CALL		tHePlus,				do_dive_pHe
		MENU_CALL		tHeMinus,				do_dive_mHe
		MENU_DYNAMIC	gaslist_strcat_gas6,	do_switch_gas6
		MENU_CALL		tDivemenu_LostGas,		do_lost_gas
	MENU_END


do_lost_gas:
	movlw	.1
	movwf	menupos1					; Set to first option in divemode menu
do_lost_gas_common:
	bsf		short_gas_decriptions
	MENU_BEGIN	tDivemenu_LostGas, .6
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
		MENU_DYNAMIC	gaslist_strcat_gas_mod,	do_toggle_active	; Toggle the gas (in)active
		MENU_CALL		tExit,					do_exit_divemode_menu
	MENU_END


do_switch_gas6:
	movlw	.6							; gas 6
	movwf	menupos1					; transfer register for selected gas towards gas_switched_common: 
	bsf		gas6_changed				; set flag for profile recording
	;bra	do_switch_gas				; continue with common gas-switched code

do_switch_gas:
	bsf		divemode_gaschange			; Set flag, will also trigger restart of deco_engine
	btfsc	is_bailout_menu				; Bailout confirmed?
	bsf		is_bailout					; begin bailout mode
	call	customview_mask				; update custom view mask to (eventually) rewrite ppO2(Dil): to ppO2:
	;bra	do_exit_divemode_menu		; continue with exiting menu code

do_exit_divemode_menu:
	call	timeout_divemode_menu2
	clrf	STKPTR
	goto	diveloop_loop4


do_toggle_active:
	extern	restart_deco_engine_wo_ceiling
	call	restart_deco_engine_wo_ceiling
	movlw	.5
	btfsc	ccr_diluent_setup			; diluents?
	addwf	menupos1,F					; yes 1-5 -> 6-10
	decf	menupos1,W					; -> 0-4 for gases / 5-9 for diluents
	lfsr	FSR1,opt_gas_type+0
	movff	PLUSW1,lo
	tstfsz	lo							; Already disabled?
	bra		do_toggle_active2			; No, disable now!
	lfsr	FSR1,opt_gas_type_backup+0	; copy opt_gas_type_backup+W back to opt_gas_type+W
	movff	PLUSW1,lo
	lfsr	FSR1,opt_gas_type+0
	movff	lo,PLUSW1
	lfsr	FSR1,opt_OC_bail_gas_change_backup+0 ; copy opt_OC_bail_gas_change_backup+W back to opt_OC_bail_gas_change+W
	movff	PLUSW1,lo
	lfsr	FSR1,opt_OC_bail_gas_change+0
	movff	lo,PLUSW1
	bra		do_toggle_active3
do_toggle_active2:
	clrf	PLUSW1						; 0=Disabled, 1=First, 2=Travel, 3=Deco
	lfsr	FSR1,opt_OC_bail_gas_change+0
	clrf	PLUSW1						; also delete change depth here to have the menu updated immediately
do_toggle_active3:
	movlw	.5
	btfsc	ccr_diluent_setup			; use OC gases?
	subwf	menupos1,F					; back to 1-5 
	bra		do_lost_gas					; return to list and show updated result


do_dive_pO2:
	banksel	gas6_O2_ratio
	incf	gas6_O2_ratio,F				; O2++
	movf	gas6_He_ratio,W
	addwf	gas6_O2_ratio,W
	movwf	gas6_temp
	movlw	.101
	cpfslt	gas6_temp					; O2 + He < 101 ?
	decf	gas6_O2_ratio,F				; O2-- (unchanged)
	banksel	common
	bra		do_divemode_gaslist_more_common

do_dive_mO2:
	banksel	gas6_O2_ratio
	decf	gas6_O2_ratio,F				; O2--
	movlw	gaslist_min_o2
	cpfslt	gas6_O2_ratio				; O2 < minimum allowed %O2?
	bra		do_dive_mO2_done			; NO
	movlw	gaslist_min_o2				; YES - restore minimum
	movwf	gas6_O2_ratio
do_dive_mO2_done:
	banksel	common
	bra		do_divemode_gaslist_more_common

do_dive_pHe:
	banksel	gas6_O2_ratio
	incf	gas6_He_ratio,F				; He++
	movf	gas6_He_ratio,W
	addwf	gas6_O2_ratio,W
	movwf	lo
	movlw	.101
	cpfslt	lo							; O2 + He < 101 ?
	decf	gas6_He_ratio,F				; Yes, He-- (Unchanged)
	banksel	common
	bra		do_divemode_gaslist_more_common

do_dive_mHe:
	banksel gas6_O2_ratio
	decf	gas6_He_ratio,F				; He--
	bnn		do_dive_mHe_done			; H2 < 0?
	clrf	gas6_He_ratio				; YES - reset to 0
do_dive_mHe_done:
	banksel	common
	bra		do_divemode_gaslist_more_common


do_divemode_splist:
	bsf		short_gas_decriptions
	movlw	.1
	movwf	menupos1					; set to first option in divemode menu

do_divemode_splist_common:
	btfsc	analog_o2_input				; do we have an analog input?
	bra		do_divemode_splist_sensor	; YES
	btfsc	s8_digital				; do we have a digital input?
	bra		do_divemode_splist_sensor	; YES
	btfsc	optical_input				; do we have an optical input?
	bra		do_divemode_splist_sensor	; YES

do_divemode_splist_no_sensor:
	MENU_BEGIN	tGaslist, .5
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
	MENU_END

do_divemode_splist_sensor:
	MENU_BEGIN	tGaslist,	.6
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_DYNAMIC	gaslist_strcat_setpoint,	do_switch_sp
		MENU_CALL		tCCRSensor,					do_divemode_sensor
	MENU_END


do_divemode_sensor:
	clrf	menupos3					; show customview 1 (HUD Data)
	bsf		toggle_customview
	movlw	.1
	movwf	menupos1					; Set to 1st option: use sensors

do_return_divemode_sensor:
	MENU_BEGIN	tGaslist,	.6
		MENU_CALL		tDivemenu_UseSensor,	do_switch_sensor
		MENU_CALL		tBack,					do_divemode_splist
		MENU_CALL		tExit,					do_exit_divemode_menu
		MENU_CALL		tDiveHudMask1,			do_toggle_sensor
		MENU_CALL		tDiveHudMask2,			do_toggle_sensor
		MENU_CALL		tDiveHudMask3,			do_toggle_sensor
	MENU_END

do_divemode_setpoint_pscr:
	movlw	.1
	movwf	menupos1					; Set to 1st option: use calculated ppO2
	MENU_BEGIN	tGaslist,	.6
		MENU_CALL		tCalculated,			do_switch_sp_calc
		MENU_CALL		tDivemenu_UseSensor,	do_switch_sensor
		MENU_CALL		tExit,					do_exit_divemode_menu
		MENU_CALL		tDiveHudMask1,			do_toggle_sensor
		MENU_CALL		tDiveHudMask2,			do_toggle_sensor
		MENU_CALL		tDiveHudMask3,			do_toggle_sensor
	MENU_END


do_toggle_sensor:
	movff	menupos1,lo					; backup position
	decf	menupos1,f					; 4, 5, 6 ->  3, 4, 5
	decf	menupos1,f					; 3, 4, 5 ->  2, 3, 4
	decf	menupos1,f					; 2, 3, 4 ->  1, 2, 3
	dcfsnz	menupos1					; 1, 2, 3 ->  0, 1, 2
	btg		use_O2_sensor1				;			  = 
	dcfsnz	menupos1					; 0, 1, 2 -> -1, 0, 1
	btg		use_O2_sensor2				;				 =
	dcfsnz	menupos1					; -1,0, 1 -> -2,-1, 0
	btg		use_O2_sensor3				;					=
	movff	lo,menupos1					; restore position
	bra		do_return_divemode_sensor

	END