view src/simulator.asm @ 598:e1f0f5e3d4e4

BUGFIX: Internal deco planner did not display results in imperial units
author heinrichsweikamp
date Mon, 30 Jul 2018 19:45:53 +0200
parents b455b31ce022
children ca4556fb60b9
line wrap: on
line source

;=============================================================================
;
;   File simulator.asm								REFACTORED VERSION V2.98
;
;   Decoplan interface to C model code.
;
;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
;=============================================================================
; HISTORY
; 2011-07-09 : [jDG] Creation...

#include "hwos.inc"					; Mandatory include
#include "convert.inc"				; output_*
#include "shared_definitions.h"		; Mailbox from/to p2_deco.c
#include "strings.inc"				; STRCPY,...
#include "tft.inc"					; WIN_LEFT,...
#include "wait.inc"					; speed_*
#include "start.inc"
#include "divemode.inc"
#include "math.inc"
#include "eeprom_rs232.inc"
#include "tft_outputs.inc"
#include "gaslist.inc"
#include "isr.inc"

gui		CODE

	extern deco_clear_tissue
	extern deco_push_tissues_to_vault
	extern deco_calc_dive_interval
	extern deco_calc_hauptroutine
	extern deco_pull_tissues_from_vault
	extern TFT_display_decotype_surface1
	extern get_first_dil_to_WREG
	extern get_first_gas_to_WREG
	extern setup_dil_registers
	extern setup_gas_registers
	extern deco_setup_cc_diluents
	extern deco_setup_oc_gases
	extern log_screendump_and_onesecond
	extern logbook_preloop_tasks
	extern do_return_demo_planner


;---- Private local variables -------------------------------------------------

	CBLOCK local1				; max size is 16 Byte !!!
		decoplan_index			; within each page
		decoplan_gindex			; global index
		decoplan_last			; Depth of last stop (CF#29)
		decoplan_flags			; Various private flags.
		decoplan_page			; page number
		decoplan_warnings		; deco engine warnings
		gas_counter				; counter for looping through the gases
		row_pos					; used for positioning of graphic elements
	ENDC						; used: 8 byte, remaining: 8 byte

;---- Defines ----------------------------------------------------------------

#define decoplan_last_ceiling_shown	decoplan_flags,0
#define decoplan_abort				decoplan_flags,1

;---- Demo deco planner ------------------------------------------------------

	global	do_demo_planner
do_demo_planner:
	btfsc	FLAG_gauge_mode				; =1: In Gauge mode
	goto	do_return_demo_planner
	btfsc	FLAG_apnoe_mode				; =1: In Apnea mode
	goto	do_return_demo_planner
	bcf		decoplan_abort				; initialize (clear) abort flag
	bcf		is_bailout					; clear bailout condition (may have remained set from last invocation)
	rcall	deco_planer
	btfss	decoplan_abort				; skip recall deco_show_plan if calculations were aborted
	rcall	deco_show_plan
	goto	do_return_demo_planner


	global	deco_setup
deco_setup:
	btfsc	FLAG_ccr_mode
	bra		deco_setup_cc
	btfsc	FLAG_pscr_mode
	bra		deco_setup_cc
deco_setup_oc:
	call	get_first_gas_to_WREG			; gets first gas (1-5) into WREG
	call	setup_gas_registers				; with WREG=Gas 1-5
	call	deco_setup_oc_gases				; setup OC/Bailout Gases and configure for OC deco calculation
	bra		deco_setup_cont
deco_setup_cc:
	call	get_first_dil_to_WREG			; gets first gas (1-5) into WREG
	call	setup_dil_registers				; with WREG=Gas 1-5
	call	deco_setup_cc_diluents			; setup CCR/pSCR diluents and configure for CCR/pSCR deco calculation
deco_setup_cont:
	; use ambient conditions for simulation
	SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface	; copy surface pressure to deco routine

	movlw	deco_distance
	movff	WREG,char_I_deco_distance

	movff	opt_last_stop,char_I_depth_last_deco
	movff	opt_GF_low,char_I_GF_Low_percentage
	movff	opt_GF_high,char_I_GF_High_percentage

	; overwrite GF if aGF is wanted
	bsf		use_agf
	TSTOSS	opt_sim_use_aGF
	bcf		use_agf

	btfsc	use_agf							; =1: Use aGF
	movff	opt_aGF_low,char_I_GF_Low_percentage
	btfsc	use_agf							; =1: Use aGF
	movff	opt_aGF_high,char_I_GF_High_percentage

	bcf		is_bailout

	; setup char_I_const_ppO2 for CC modes
	clrf	WREG
	btfsc	FLAG_pscr_mode
	movff	WREG,char_I_const_ppO2			; configure pSCR computations to calculated ppO2
	btfss	FLAG_ccr_mode
	return									; done if not in CCR mode
	movff	opt_sim_setpoint_number,WREG	; configure CCR computations to selected setpoint
	decf	WREG,W							; 1-5 -> 0-4
	lfsr	FSR1,char_I_setpoint_cbar		; load base address of setpoint list
	movff	PLUSW1,char_I_const_ppO2		; setup setpoint
	return

;=============================================================================
; Launch deco planning
;
		global	deco_planer
deco_planer:
	call	speed_fastest					; Quick !
	call	deco_push_tissues_to_vault		; C-code: back-up state of the real tissues
	banksel	common
	rcall	deco_setup						; Setup all model parameters.

;---- Specific settings ------------------------------------------------------

	; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent
	movff	char_O_deco_status,WREG			; bank-safe copy
	bcf		WREG,DECO_PLAN_FLAG				; normal plan mode,
	bsf		WREG,DECO_CNS_FLAG				; enable CNS calculation (CNS at end of dive),
	bsf		WREG,DECO_VOLUME_FLAG			; enable gas volume calculation, and
	bcf		WREG,DECO_ASCENT_FLAG			; disable delayed ascent calculation
	movff	WREG,char_O_deco_status			; bank-safe copy back

	; configure the deco engine for total-dive gas volume calculation
	movff	char_O_main_status,WREG			; bank-safe copy
	bsf		WREG,DECO_BOTTOM_FLAG			; set bottom flag
	movff	WREG,char_O_main_status			; bank-safe copy back

deco_planer_redo:
	; show deco calculation is in progress
	call	TFT_ClearScreen
	WIN_COLOR	color_greenish
	TEXT_SMALL	.20,.40, tCalculating
	WIN_COLOR	color_lightblue
	WIN_SMALL	.1,.215
	STRCPY_TEXT_PRINT tAbort

	; configure the deco engine for restart:
	movff	char_O_deco_status,WREG			; bank-safe copy
	bsf		WREG,DECO_STATUS_0_FLAG			; configure init ...
	bsf		WREG,DECO_STATUS_1_FLAG			; ... state,
	movff	WREG,char_O_deco_status			; bank-safe copy back

;---- Add delay at surface, if needed ----------------------------------------
	banksel	char_I_dive_interval
	tstfsz	char_I_dive_interval
	call	deco_calc_dive_interval

;---- Dive loop --------------------------------------------------------------
	; Compute dive ambient conditions
	banksel	char_I_bottom_depth
	movf	char_I_bottom_depth,W
	mullw	.100
	movlw	LOW(.1000)
	addwf	PRODL,W
	movwf	int_I_pres_respiration+0
	movlw	HIGH(.1000)
	addwfc	PRODH,W
	movwf	int_I_pres_respiration+1
	banksel common

	movff	char_I_bottom_time,char_I_sim_advance_time

	clrf	TMR5L
	clrf	TMR5H							; 30,51757813µs/bit in TMR5L:TMR5H

	call	deco_calc_hauptroutine			; C-code: initialization + complete bottom time part
	banksel	common

;---- BAILOUT: Switch to OC gases for ascent cycles --------------------------
	btfss	is_bailout						; Doing a bailout deco plan ?
	bra	 deco_planer_finishing				; NO  - keep gases
											; YES - switch to OC gas 

	; reconfigure the deco engine for delayed ascent mode
	movff	char_O_deco_status,lo			; bank-safe copy
	bsf		lo,DECO_ASCENT_FLAG				; set flag for delayed ascent calculation
	movff	lo,char_O_deco_status			; bank-safe copy back

	; configure the deco engine for delayed ascent part gas volume calculation
	movff	char_O_main_status,WREG			; bank-safe copy
	bcf		WREG,DECO_BOTTOM_FLAG			; set bottom flag
	movff	WREG,char_O_main_status			; bank-safe copy back

	; reconfigure gas settings to OC gases
	call	get_first_gas_to_WREG			; get first gas (1-5) into WREG
	call	setup_gas_registers				; With WREG=Gas 1-5 (or 6, not applicable here)
	call	deco_setup_oc_gases				; With WREG=Gas 1-5 (or 6, not applicable here)

	; set the gas change override flag to allow gas changes before deco stops as done in alternative plan
	movff	char_O_main_status,lo			; bank-safe copy
	bsf		lo,DECO_GASCHANGE_OVRD			; set flag for gas change override
	movff	lo,char_O_main_status			; bank-safe copy back

;---- Wait until status reaches zero -------------------------------------------
deco_planer_finishing:
	call	deco_calc_hauptroutine			; C-code: Simulate more dive time to trigger the deco calculations
	banksel	common

	btfss	switch_left						; check if left button was pressed
	bra		deco_planer_finishing_1			; NO  - continue calculations
	bsf		decoplan_abort					; YES - set abort flag so that deco_show_plan will not be called
	bra		deco_planer_finishing_2			;       do some clean-up and return
deco_planer_finishing_1:
	movff	char_O_deco_status,lo			; working copy of char_O_deco_status in bank common
	movlw	DECO_STATUS_MASK				; bit mask for deco status bit set
	andwf	lo,W							; mask out bits showing state of computation
	tstfsz	WREG							; check if a compute cycle is finished (bits 1 and 0 == 0)
	bra		deco_planer_finishing			; NO - needs more computation cycles

;---- Done: add CNS from decoplan, and restore tissues
deco_planer_finishing_2:
	movff	char_O_deco_warnings,decoplan_warnings	; copy warnings

	call	deco_pull_tissues_from_vault	; C-code: restore status of the real tissues
	banksel	common							; back to bank 1

	movlw	b'00111000'						; 1:8 Prescaler -> 65,536ms@16MHz
	movwf	T3CON
	goto	speed_normal					; (and return)

;-----------------------------------------------------------------------------
; Draw a stop of the deco plan (simulator or dive).
; Inputs:  lo      = depth
;          hi      = minutes
;          win_top = line to draw on screen.
;
; Trashed: hi, lo,
;          win_height, win_leftx2, win_width, win_color*,
;          WREG, PROD, TBLPTR TABLAT.
;
deco_plan_show_stop:
	;---- Print depth ----------------------------------------------------
	lfsr	FSR2,char_O_deco_gas		; needed to be initialized here every time because...
	movf	decoplan_gindex,W			; ...FSR2 is also used for string operations
	movff	PLUSW2,WREG					; get current gas and copy it to WREG for color-coding
	call	TFT_color_code_gas			; set output color dependent on gas (1-5)

	lfsr	FSR2,buffer

	TSTOSS	opt_units					; 0=Meters, 1=Feets
	bra		deco_plan_show_nstd_stop_metric

	movff	hi,up						; backup hi (minutes)
	WIN_LEFT .85
	movf	lo,W						; lo = m
	mullw	.100						; PRODL:PRODH = mbar
	movff	PRODL,lo
	movff	PRODH,hi
	; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops...
	movff	lo,xA+0
	movff	hi,xA+1
	movlw	LOW  d'334'					; 334feet/100m
	movwf	xB+0
	movlw	HIGH d'334'
	movwf	xB+1
	call	mult16x16					; xA*xB=xC (lo:hi * 328)
	movlw	d'50'						; round up
	addwf	xC+0,F
	movlw	.0
	addwfc	xC+1,F
	addwfc	xC+2,F
	addwfc	xC+3,F
	movlw	d'100'
	movwf	xB+0
	clrf	xB+1
	call	div32x16					; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder
	movff	xC+0,lo
	movff	xC+1,hi						; restore lo and hi with updated value
	bsf		leftbind
	bsf		ignore_digit4				; Only full feet
	output_16
	bcf		leftbind
	STRCAT_PRINT "ft "
	movff	up,hi						; restore hi (minutes)
	bra		deco_plan_show_nstd_stop_common

deco_plan_show_nstd_stop_metric:
	WIN_LEFT .90
	bsf	leftbind
	output_8							; outputs into Postinc2!
	bcf	leftbind
	STRCAT_PRINT "m "

deco_plan_show_nstd_stop_common:
	;---- Print duration -------------------------------------------------
	WIN_LEFT .135
	lfsr	FSR2,buffer

	movf	lo,W						; Swap hi & lo
	movff	hi,lo
	movwf	hi

	output_8							; Allow up to 240'
	clrf	WREG
	movff	WREG,buffer+.3				; limit to 2 chars
	STRCAT_PRINT ""

	movf	lo,W						; Swap back hi & lo
	movff	hi,lo
	movwf	hi

	;---------------------------------------------------------------------
	; Draw the bar graph used for deco stops (deco plan in simulator or dive).
	incf	win_top,F
	movlw	.19
	movwf	win_height
	movlw	.118
	movwf	win_leftx2					; column left (0-159)
	movlw	.16
	movwf	win_width+0					; column max width.
	clrf	win_width+1

	; Draw used area (hi = minutes):
	movlw	.16							; Limit length (16min)
	cpfslt	hi
	movwf	hi
	movff	hi,win_bargraph				; Active width, the rest is cleared.
	call	TFT_box

	; Restore win_top
	call	TFT_standard_color
	decf	win_top,F					; Restore win_top
	return

;-----------------------------------------------------------------------------
; Clear unused area below last stop
; Inputs: win_top : last used area...
deco_plan_show_clear_bottom:
	movf	win_top,W					; Get back from bank0
	sublw	.239						; No: bottom row in planning
	movwf	win_height

	WIN_LEFT .85						; Full dive menu width
	movlw	.159-.85+.1
	movwf	win_width+0
	clrf	win_width+1

	clrf	win_color1					; Fill with black
	clrf	win_color2

	goto	TFT_box						; and return

;-----------------------------------------------------------------------------
; Display the deco plan (simulator).
; Inputs: char_O_deco_table (array of stop times, in minutes)
;         decoplan_page = page number.
;
deco_show_plan_page:
	bcf	 win_invert						; Reset invert flag

	;---- Is there deco stops ? ------------------------------------------
	movff	char_O_first_deco_depth,WREG
	iorwf	WREG
	bnz		deco_plan_show_1

	;---- No Deco --------------------------------------------------------
	call	TFT_standard_color
	TEXT_SMALL .80, .0, tNoDeco
	bsf		decoplan_last_ceiling_shown
	return

deco_plan_show_1:
	lfsr	FSR0,char_O_deco_depth		; Initialize indexed addressing.
	lfsr	FSR1,char_O_deco_time

	clrf	decoplan_index				; Start with index = 0
	clrf	win_top						; and row = 0

	; Read stop parameters, indexed by decoplan_index and decoplan_page
	movf	decoplan_page,W				; decoplan_gindex = 6*decoplan_page + decoplan_index
	mullw	.8							; 8 lines/page in deco plan
	movf	decoplan_index,W
	addwf	PRODL,W
	movwf	decoplan_gindex				; --> decoplan_gindex

	bcf		decoplan_last_ceiling_shown	; Not finished yet...

deco_plan_show_2:
	btfsc	decoplan_gindex,5			; Reached table length (32) ?
	bra		deco_plan_show_99			; YES: finished...

	; Read stop parameters, indexed by decoplan_index
	movf	decoplan_gindex,W			; index
	movff	PLUSW0,lo					; char_O_deco_depth[gindex]
	movff	PLUSW1,hi					; char_O_deco_time [gindex]
	movf	lo,W
	bz		deco_plan_show_99			; depth == 0 : finished.

	; Display the stop line
	rcall	deco_plan_show_stop

	; Next
	movlw	.24
	addwf	win_top,F					; row: += 24
	incf	decoplan_index,F			; local index += 1
	incf	decoplan_gindex,F			; global index += 1

	; Max number of lines/page reached ?
	movlw	.8							; 8 lines/page in deco plan
	cpfseq	decoplan_index
	bra		deco_plan_show_2			; NO: loop

	; Check if next stop is end-of-list ?
	movf	decoplan_gindex,W
	movf	PLUSW0,W					; char_O_deco_depth[gindex]
	bz		deco_plan_show_99			; End of list...

	; Display the message "more..."
	rcall	deco_plan_show_clear_bottom	; Clear from next line

	call	TFT_standard_color
	TEXT_SMALL .88, .220, tMore
	return

deco_plan_show_99:
	bsf		decoplan_last_ceiling_shown ; Nothing more in table to display.
	rcall	deco_plan_show_clear_bottom ; Clear from next line
	return

;-----------------------------------------------------------------------------
; Loop to show all pages of the deco plan (surface mode)

	global	deco_show_plan
deco_show_plan:
	clrf	decoplan_page
	call	TFT_ClearScreen
	WIN_COLOR color_greenish
	btfsc	is_bailout
	bra		deco_show_plan_bail_title
	TEXT_SMALL .1,.1, tDivePlan
	bra		deco_show_plan2
deco_show_plan_bail_title:	
		TEXT_SMALL .1,.1, tDiveBailout
deco_show_plan2:
	call	TFT_standard_color
	;---- Display Plan Parameters
	WIN_SMALL .0,.25
	STRCPY	"Int:"
	movff	char_I_dive_interval,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	STRCAT_PRINT "'"
	WIN_SMALL .0,.50
	STRCPY_TEXT tBtTm_short
	movff	char_I_bottom_time,lo
	bsf	leftbind
	output_8
	bcf	leftbind
	STRCAT_PRINT "'"
	WIN_SMALL .0,.75
	STRCPY_TEXT tDepth
	PUTC	":"
	movff	char_I_bottom_depth,lo
	bsf	leftbind
	output_8
	bcf	leftbind
	STRCAT_PRINT "m"
	WIN_SMALL .0,.105								; set position for warnings or sat/dsat factors

	;---- Check for Stop Table Overflow
	btfss	decoplan_warnings,stoptable_overflow	; check if we have a overflow warning
	bra		deco_show_plan2a						; NO  - skip
	;---- Display Overflow warning
	call	TFT_warnings_color						; YES - show overflow warning
	STRCAT_PRINT "incomplete"						; max 10 characters
	bra		deco_show_plan_m1						; skip displaying sat/dsat factors

deco_show_plan2a:
	;---- Check for IBCD Warning
	btfss	decoplan_warnings,IBCD_warning_lock		; check if we have a locked IBCD warning
	bra		deco_show_plan2b						; NO  - skip
	;---- Display IBCD warning
	call	TFT_attention_color						; YES - show IBCD warning
	STRCAT_PRINT "IBCD!"							; max 10 characters
	bra		deco_show_plan_m1						; skip displaying sat/dsat factors

deco_show_plan2b:
	;---- Display Sat/Desat Factors --> omitted if there were warnings
	STRCAT_PRINT "SD:"
	WIN_SMALL .25,.105
	movff	char_I_saturation_multiplier,lo
	output_8
	STRCAT "/"
	movff	char_I_desaturation_multiplier,lo
	output_8
	STRCAT_PRINT ""

deco_show_plan_m1:
	call	TFT_standard_color				; clean-up from warnings

	;---- Get Model
	movff	char_I_deco_model,WREG
	iorwf	WREG
	bz	 deco_show_plan_m2

	;---- Display GF low/high values
	WIN_SMALL .0,.130
	STRCAT_PRINT "GF:"
	WIN_SMALL .25,.130
	movff	char_I_GF_Low_percentage,lo
	output_99x
	STRCAT	"/"
	movff	char_I_GF_High_percentage,lo
	output_99x
	STRCAT_PRINT ""

deco_show_plan_m2:
	;---- Display Deco Mode
	WIN_SMALL .0,.155
	lfsr	FSR2,buffer
	movff	opt_dive_mode,lo				; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
	call	TFT_display_decotype_surface1
	btfss	FLAG_ccr_mode					; current dive mode = CCR ?
	bra		deco_show_plan2c				; NO  - branch
	WIN_SMALL .25,.155
	STRCPY	"SP:"							; output setpoint used for calculation
	movff	opt_sim_setpoint_number,lo
	bsf		leftbind
	output_8
	bcf		leftbind
	STRCAT_PRINT ""

deco_show_plan2c:
	;---- Display TTS result
	WIN_SMALL .0,.180
	STRCPY_TEXT tTTS
	STRCAT	": "
	movff	int_O_ascenttime+0,lo
	movff	int_O_ascenttime+1,hi
	bsf		leftbind
	output_16
	bcf		leftbind
	STRCAT_PRINT "'"

	;---- Display CNS result
	WIN_TOP	.205
	STRCPY_TEXT tCNS2						; "CNS:"
	movff	int_O_CNS_fraction+0,lo
	movff	int_O_CNS_fraction+1,hi
	call	TFT_color_code_cns				; Color-code CNS output
	bsf		leftbind
	output_16_3								; limit to 999 and display only (0-999)
	bcf		leftbind
	STRCAT	"%\x92"							; "->"
	movff	int_O_normal_CNS_fraction+0,lo
	movff	int_O_normal_CNS_fraction+1,hi
	call	TFT_color_code_cns				; Color-code CNS output
	bsf		leftbind
	output_16_3								; limit to 999 and display only (0-999)
	bcf		leftbind
	STRCAT_PRINT "%"
	call	TFT_standard_color

	;---- Loop through pages
deco_show_plan_1:
	; Clear the complete stop result column:
	WIN_BOX_BLACK .0, .239, .80, .159		; top, bottom, left, right

	rcall	deco_show_plan_page
	incf	decoplan_page,F
	call	logbook_preloop_tasks
deco_show_plan_2:
	btfsc	switch_right
	bra		deco_show_plan_3
	btfsc	switch_left
	return									; Return to simulator menu
	call	log_screendump_and_onesecond	; Check if we need to make a screen shot and check for new second
	btfsc	sleepmode						; Timeout?
	goto	restart
	bra		deco_show_plan_2

deco_show_plan_3:
	btfss	decoplan_last_ceiling_shown
	bra		deco_show_plan_1
	; All stops shown

;---- In CCR and pSCR mode, compute a BAILOUT deco plan -----------------------
	movff	char_O_deco_status,WREG			; get deco calculation status
	btfss	WREG,DECO_MODE_LOOP_FLAG		; check if in CCR or pSCR mode
	bra		simulator_show_decoplan5_0		; NO  - normal OC mode: just display
	bsf		is_bailout						; YES - redo 2nd deco-plan in bailout mode
	rcall	deco_planer_redo				;       redo plan computation

	btfss	decoplan_abort					; shall we abort?
	bra		deco_show_plan					; NO  - display bailout stops
	return									; YES


;---- In OC+BAIL modes, show the gas usage special page -----------------------
simulator_show_decoplan5_0:
	; Clear the complete stop result column:
	WIN_BOX_BLACK .0, .239, .80, .159		; top, bottom, left, right

	movlw	.25
	movwf	row_pos							; Row for gas list is .25+.25
	clrf	gas_counter						; Gas counter
	lfsr	FSR0,int_O_gas_volumes			; Initialize indexed addressing.

	WIN_LEFT .80							; Set column
	call	TFT_standard_color

simulator_show_decoplan5_loop:
	movff	gas_counter,PRODL				; Copy to PRODL first
	incf	gas_counter,F					; Increment gas #

	movff	gas_counter,WREG				; copy current gas to WREG for color-coding
	call	TFT_color_code_gas				; set output color according to gas (1-5)

	lfsr	FSR2,buffer
	bsf		short_gas_decriptions
	bsf		divemode						; Tweak "customview_show_mix:"
	call	gaslist_strcat_gas				; Input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2
	bcf		divemode						; Tweak "customview_show_mix:"

	movlw	.25
	addwf	row_pos,F						; Increase row position
	movff	row_pos,win_top					; Set Row

	movff	POSTINC0,lo						; Read (16bit) result, low first,
	movff	POSTINC0,hi						; then high.

	movf	lo,W
	andwf	hi,W
	incf	WREG							; > 65535? 
	bnz		simulator_show_decoplan5_1		; NO
	STRCAT_PRINT ">65500"					; YES
	bra		simulator_show_decoplan5_2

simulator_show_decoplan5_1:
	PUTC	":"
	bsf		leftbind
	output_16								; No decimal anymore.
	bcf		leftbind
	STRCAT_PRINT ""

	; Loop for all 5 gas
simulator_show_decoplan5_2:
	movlw	d'5'							; list all five gases
	cpfseq	gas_counter						; All gases shown?
	bra		simulator_show_decoplan5_loop	; No

	WIN_COLOR color_greenish

	movlw	.30
	addwf	row_pos,F						; Increase row position
	movff	row_pos,win_top					; Set Row
	STRCPY_TEXT_PRINT tBarLiter				; "Bar Liter"

	WIN_SMALL .80,.25
	STRCPY_TEXT tGasUsage					; "Gas Usage"
	STRCAT_PRINT ":"

	call	TFT_standard_color
	call	logbook_preloop_tasks

simulator_show_decoplan5_3:
	btfss	switch_right
	bra		simulator_show_decoplan5_3a
	bcf		switch_right
	clrf	decoplan_page
	bra		deco_show_plan_1				; toggle between stops plan and gas usage
simulator_show_decoplan5_3a:
	btfss	switch_left
	bra		simulator_show_decoplan5_4
	bcf		is_bailout						; Back to normal
	bcf		ccr_diluent_setup				; init for OC/Bailout
	return									; Return to simulator menu

simulator_show_decoplan5_4:
	call	log_screendump_and_onesecond	; Check if we need to make a screen shot and check for new second
	btfsc	sleepmode						; Timeout?
	goto	restart
	bra		simulator_show_decoplan5_3

	END