view src/surfmode.asm @ 564:54346c651b6a

bring digital S8 HUD back to life...
author heinrichsweikamp
date Mon, 05 Feb 2018 17:59:55 +0100
parents b7eb98dbd800
children b455b31ce022
line wrap: on
line source

;=============================================================================
;
;   File surfmode.asm								REFACTORED VERSION	V2.94
;
;   Surfacemode
;
;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
;=============================================================================
; HISTORY
;  2011-08-07 : [mH] moving from OSTC code

#include    "hwos.inc"					; Mandatory header
#include    "shared_definitions.h"      ; Mailbox from/to p2_deco.c
#include    "start.inc"
#include    "tft.inc"
#include    "tft_outputs.inc"
#include    "isr.inc"
#include    "adc_lightsensor.inc"
#include    "menu_processor.inc"
#include    "strings.inc"
#include    "sleepmode.inc"
#include    "wait.inc"                  ; speed_*
#include    "external_flash.inc"
#include    "customview.inc"
#include    "divemode.inc"
#include    "mcp.inc"                   ; RX
#include    "i2c.inc"
#include    "comm.inc"
#include    "eeprom_rs232.inc"
#include    "calibrate.inc"

   	extern   do_main_menu

#DEFINE	menu_pos_row		.215
#DEFINE	menu_pos_column		.1
#DEFINE	view_row            .215
#DEFINE	view_column         .124

gui     CODE


;=============================================================================
; Boot tasks for all modes
	global	surfloop
surfloop:
    call    speed_normal
    bcf     no_sensor_int           ; Normal pressure mode

    bcf     LEDr

    clrf    CCP1CON					; stop PWM
    bcf	    PORTC,2					; Pull PWM output to GND
    call    TFT_boot                ; Initialize TFT (includes clear screen)
    bcf	    restore_deco_data

    WIN_TOP     .50
    WIN_LEFT    .10
    movlw   LOW     0x1E000
    movwf   TBLPTRL
    movlw   HIGH    0x1E000
    movwf   TBLPTRH
    movlw   UPPER   0x1E000
    movwf   TBLPTRU
    extern  color_image
    call    color_image             ; Show logo

    WIN_TOP     .100
    WIN_LEFT    .34
    extern  ostc_logo_block
    movlw   LOW(ostc_logo_block)
    movwf   TBLPTRL
    movlw   HIGH ostc_logo_block;&0xFFFF
    movwf   TBLPTRH
    movlw   UPPER(ostc_logo_block)
    movwf   TBLPTRU
    call    color_image
    call    TFT_Display_FadeIn      ; Show splash
	call	TFT_serial              ; Show serial and firmware version

    ;---- Do any usefull initializes that takes time -------------------------
	call	restart_set_modes_and_flags	; Sets decomode flags
	bcf		pressure_refresh
    call    I2C_init_compass
    call    I2C_init_accelerometer
	clrf	ext_flash_address+0
	clrf	ext_flash_address+1
	clrf	ext_flash_address+2

    movlw   surface_sp                  ; in cbar
    call    transmit_setpoint           ; Transmit current setpoint from WREG (in cbar) to external electronics

	clrf	timeout_counter2
	clrf 	timeout_counter3
	bcf		menubit						; clear menu flag
    bcf     premenu
	clrf	last_pressure+0
	clrf	last_pressure+1
    bcf     is_bailout                  ; =1: Bailout
    bcf     ccr_diluent_setup           ; Use OC gases for gaslist routine

	bcf		simulatormode_active		; Quit simulator mode (if active)

	; MOVE from here to below ## V2.94
	; bcf		switch_left
	; bcf		switch_right

	;---- Fade to standard surface view --------------------------------------
	; Wait 1 second
	bcf		onesecupdate
	btfss	onesecupdate
	bra		$-2
	; Wait 1 second
	bcf		onesecupdate
	btfss	onesecupdate
	bra		$-2

	call    TFT_Display_FadeOut         ; Go to black screen
	call	TFT_ClearScreen             ; Then change everything
	WIN_TOP		.0
	WIN_LEFT	.0
	WIN_FONT 	FT_SMALL
	bcf     win_invert              ; Reset invert flag

    WIN_COLOR	color_lightblue
	WIN_SMALL	menu_pos_column,menu_pos_row
    STRCPY_TEXT_PRINT  tMenu		;"<Menu"
	WIN_SMALL	view_column,view_row
    STRCPY_TEXT_PRINT  tView        ;"View>"
	call    TFT_standard_color

; Logo
    WIN_TOP     .0
    WIN_LEFT    .70
    movlw   LOW(ostc_logo_block)
    movwf   TBLPTRL
    movlw   HIGH ostc_logo_block;&0xFFFF
    movwf   TBLPTRH
    movlw   UPPER(ostc_logo_block)
    movwf   TBLPTRU
    call    color_image

	call	TFT_clock					; display time
    call    update_surfloop60
	call	get_battery_voltage			; get battery voltage
	call	TFT_update_batt_voltage		; display battery voltage
	call	TFT_update_surf_press		; display surface pressure
	call	TFT_temp_surfmode			; Displays temperature
	call	TFT_display_decotype_surface
	
	call	calc_deko_divemode_sensor

    movff   opt_dive_mode,lo            ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR
    tstfsz  lo
    bra     surfloop_no_oc              ; Not OC
    call    TFT_show_OC_startgas_surface; Show first gas and "OSTC2-like" active gases
surfloop_no_oc:
    movff   customview_surfmode,menupos3    ; Reload last customview
    call    surf_customview_mask        ; Update #menupos3 view

    call    TFT_Display_FadeIn          ; Display resulting surface screen.

	; MOVED from above to here	## V2.94
	bcf		switch_left
	bcf		switch_right
	
    ;---- Late initialisations -----------------------------------------------    
	movff	last_surfpressure_30min+0,int_I_pres_respiration+0		; copy surface air pressure to deco routine		## not used any more (!?)
	movff	last_surfpressure_30min+1,int_I_pres_respiration+1		; 30min old values 								## not used any more (!?)
	movff	last_surfpressure_30min+0,int_I_pres_surface+0			; copy surface air pressure to deco routine
	movff	last_surfpressure_30min+1,int_I_pres_surface+1			; 30min old values 
	movff	last_surfpressure_30min+0,last_surfpressure+0			; Use 30min old airpressure 
	movff	last_surfpressure_30min+1,last_surfpressure+1			; Use 30min old airpressure

	; NEW	## no fly
	movff	opt_GF_low,char_I_GF_Low_percentage
	movff	opt_GF_high,char_I_GF_High_percentage
	
    ; Startup tasks for all modes
    ; Desaturation time needs:
    ;   int_I_pres_surface
    ;   char_I_desaturation_multiplier
	call	deco_calc_desaturation_time ; calculate desaturation time
	
	; REPLACE	## (code unification)
	; movlb	b'00000001'					; select ram bank 1
	; BY
	banksel	common

    btfsc   enable_screen_dumps         ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
    call	enable_rs232				; Also sets to speed_normal ...

surfloop_loop:
	btfss	onesecupdate				; do every second tasks?
	bra		surfloop_loop2				; no, loop

; One Second tasks for all modes
	call	speed_normal
	;call	TFT_debug_output
	call	TFT_clock					; update clock
	call	timeout_surfmode			; check timeout 
	call	get_battery_voltage			; get battery voltage
	call	TFT_update_batt_voltage		; display battery voltage
	call	set_dive_modes				; tests if depth>threshold
    btfss   secs,0                      ; Every two seconds...
	call	TFT_temp_surfmode			; Displays temperature
    btfss   secs,0                      ; Every two seconds...
    call    surfmode_check_for_warnings ; ... check for warnings (and display/update) them
	bcf		onesecupdate				; every second tasks done
	
surfloop_loop2:	
; Tasks approx. every 50ms for all modes
	call	test_switches_surfmode		; check switches
	call	TFT_debug_output

; One minute tasks for all modes
	btfsc	oneminupdate				; do every minute tasks
	call	update_surfloop60			; yes, e.g. update time and date

; Mode tasks
	btfsc	divemode					; Divemode active?
	goto	diveloop					; Yes, switch into Divemode!

	btfsc	menubit						; Menu?
	goto	do_main_menu				; Menu!

	btfsc	pressure_refresh			; new pressure available?
	call	TFT_update_surf_press		; display surface pressure
	bcf		pressure_refresh			; until new pressure is available

; Updates every 1/4 second
    btfss   quarter_second_update
    bra     surfloop_loop2b

    bcf     quarter_second_update
    
    call	calc_deko_divemode_sensor
	
    btfsc   FLAG_ccr_mode               ; In CCR mode?
    bra	    surfloop_loop2a1			; Yes.
    btfss   FLAG_pscr_mode              ; In PSCR mode?
    bra	    surfloop_loop2a				; No, skip
        
surfloop_loop2a1:    
    movff   opt_ccr_mode,WREG           ; =0: Fixed SP, =1: Sensor,  =2: Auto SP
    sublw   .1                          ; opt_ccr_mode = 1 (Sensor)?
    bnz     surfloop_loop2a				; No, skip

    call    TFT_surface_sensor          ; ...update sensor data in surface mode
    call    TFT_sensor_surface_warning	; Show a warning arrow-down behind sensor readings when sensor is end-of-life
    movlw   .9 
    cpfseq  menupos3					; in Sensor mV surface custom view? 
    bra	    surfloop_loop2a				; No
    extern  TFT_sensor_mV 
    call    TFT_sensor_mV		; Yes, update mV readings (Each 1/4 second and not each second as in customview.asm)

surfloop_loop2a:
    movlw   .6
    cpfseq  menupos3                    ; in compass view?
    bra     surfloop_loop2b             ; No
    extern  TFT_surface_compass_heading
    call    TFT_surface_compass_heading ; Yes, update compass heading value

surfloop_loop2b:
	btfsc	toggle_customview			; Next view?
	call	surf_customview_toggle      ; Yes, show next customview (and delete this flag)

    btfsc   enable_screen_dumps         ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
    bra     surfloop_loop3
	
	; DELETE - In surface mode, only charing is available now - but now you can see the charging status :-)	## USB
	;          To do USB communication, you now need to be in menu or logbook mode
    ;btfsc   vusb_in                     ; USB plugged in?
    ;call    comm_mode                   ; Start COMM mode
	
    bra     surfloop_loop4
surfloop_loop3:
    btfss   vusb_in                     ; USB (still) plugged in?
    bcf     enable_screen_dumps         ; No, clear flag
    call    rs232_get_byte
    btfsc   rs232_recieve_overflow
    bra     surfloop_loop4
    movlw   "l"
    cpfseq	RCREG1
    bra     surfloop_loop4
    call    TFT_dump_screen             	; Dump the screen contents
surfloop_loop4:
	btfsc	sleepmode						; Sleepmode active?
	goto	sleeploop						; Yes, switch into sleepmode!

	bra		surfloop_loop					; loop surfacemode

update_surfloop60:
; One minute tasks for all modes
	call	TFT_date						; Update date
	
	; REPLACE	## no fly 2
	; call	calc_deko_surfmode				; calculate desaturation time every minute
	; BY
	call	deco_calc_wo_deco_step_1_min	; calculate deco in surface mode. int_I_pres_surface gets updated by
	call	deco_calc_desaturation_time		; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar
	banksel	common
	
	; NEW	## deco engine
	; update tissue diagram if it is on display
	movlw	.5								; number of tissue custom view
	cpfseq	menupos3						; is this the current customview?
	bra		update_surfloop60_1				; NO	
	call    TFT_standard_color				; YES - set standard color
    call	TFT_surface_tissues				; 	    show tissue diagram
update_surfloop60_1:

	; NEW	## no fly
	; update last dive info if it is on display
	movlw	.8								; number of the last dive info customview
	cpfseq	menupos3						; is this the current customview?
	bra		update_surfloop60_2				; NO	
	call    TFT_standard_color				; YES - set standard color
    call	TFT_surface_lastdive			; 	    show last dive infos
update_surfloop60_2:

	bcf		oneminupdate				
	return

    extern  check_cns_violation,check_warn_battery,check_and_store_gf_violation
surfmode_check_for_warnings:

	; DELETE	## (screen flicker)
	; movf	warning_counter_backup,W
	; cpfseq	warning_counter						; warning_counter_backup = warning_counter?
	; call	TFT_clear_warning_text              ; No, clear all warnings
	; movff	warning_counter,warning_counter_backup	; copy warning_counter

	bcf		warning_active                      ; Clear flag
	clrf	warning_counter						; Clear counter

    ; Warnings for all modes
    call	check_warn_battery                  ; Check if the battery level should be displayed/warned
	
	; DELETE HERE...	## (general fix)
    ; rcall   surfmode_check_for_nofly            ; Check if nofly time should be shown
    ; rcall   surfmode_check_for_desat            ; Check if desat time should be shown
	
	; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more	## no fly
    ; rcall   surfmode_check_for_interval         ; Check if surface interval should be shown

	btfsc	FLAG_apnoe_mode             		; Done for Apnoe or Gauge mode
    bra     surfmode_check_for_warnings2
	btfsc	FLAG_gauge_mode             		; Done for Apnoe or Gauge mode
	bra     surfmode_check_for_warnings2

    ; Warnings only in deco modes
	
	; ...INSERT HERE ## (general fix) - desat and no-fly time belong to deco modes
	rcall   surfmode_check_for_desat            ; Check if desat time should be shown
	rcall   surfmode_check_for_nofly            ; Check if nofly time should be shown
	
	call	check_cns_violation					; Check CNS value and display it, if required
    call	check_and_store_gf_violation		; Check GF value and display it, if required

	; NEW	## microbubbles
	movff	char_O_deco_warnings,WREG			; bank-safe copy for deco warnings
	btfsc	WREG,mbubble_warning_lock			; do we have a microbubbles warning?
	extern	warn_mbubbles
	call	warn_mbubbles						; YES	

surfmode_check_for_warnings2:
; Setup warning_page number
    incf    warning_page,F
    bcf     STATUS,C
    rlcf    warning_page,W                      ; *2
    cpfsgt  warning_counter                     ; > warning_counter
    clrf    warning_page                        ; No, clear
	
	; NEW	## (screen flicker)
; Clear both rows of warnings if there is nothing to show at all
	tstfsz	warning_counter						; any warnings?
	bra		surfmode_check_for_warnings3		; YES - look if second row needs to be cleared
	call	TFT_clear_warning_text              ; NO  - clear complete warnings area
	return
surfmode_check_for_warnings3:

; Clear 2nd row of warnings if there is nothing to show (on this page)
    btfss   second_row_warning                  ; =1: The second row contains a warning
    call    TFT_clear_warning_text_2nd_row      ; No, clear this row
    return                                      ; Done.

; DELETE - surface interval is now shown in last dive custom view, not as "warning" any more	## no fly
;
;surfmode_check_for_interval:
;	movf    surface_interval+0,W           		; Is interval null ?
;    iorwf   surface_interval+1,W
;    bnz     surfmode_check_for_interval2		; No
;    return
;surfmode_check_for_interval2:
;	incf    warning_counter,F					; increase counter
;    call    TFT_interval
;    return


surfmode_check_for_desat:
	; REPLACE	## no fly
	; movf    desaturation_time+0,W           	; Is nofly null ?
    ; iorwf   desaturation_time+1,W
	; BY
	banksel	int_O_desaturation_time
	movf    int_O_desaturation_time+0,W			; Is nofly null ?
	iorwf   int_O_desaturation_time+1,W
	
    bnz     surfmode_check_for_desat2			; No
	
	; NEW	## no fly
	banksel common
	
    return

surfmode_check_for_desat2:
	; NEW	## no fly
	banksel common
	
	incf	warning_counter,F					; increase counter
    call    TFT_desaturation_time
    return

surfmode_check_for_nofly:
	; REPLACE	## no fly
 	; movf    nofly_time+0,W              		; Is nofly null ?
    ; iorwf   nofly_time+1,W
	; BY
	banksel	int_O_nofly_time
	movf    int_O_nofly_time+0,W           		; Is nofly null ?
	iorwf   int_O_nofly_time+1,W
	
    bnz     surfmode_check_for_nofly2   		; No...
	
	; NEW	## no fly
	banksel	common
	
    return

surfmode_check_for_nofly2:
	; NEW	## no fly
	banksel	common
	
	incf	warning_counter,F					; increase counter
    call    TFT_nofly_time
    return


;=============================================================================

; DELETE - not used any more	## no fly
;	global	calc_deko_surfmode
;calc_deko_surfmode:
;
;	; DELETE - deco_calc_wo_deco_step_1_min uses int_I_pres_surface, not int_I_pres_respiration	## no fly
;    ; SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine
;
;	call	deco_calc_wo_deco_step_1_min    			; calculate deco in surface mode
;	
;	; NEW	## no fly
;	; call	deco_calc_desaturation_time
;	
;	banksel		common
;	return

test_switches_surfmode:		; checks switches in surfacemode
	btfsc	switch_right
	bra		test_switches_surfmode2
	btfsc	switch_left
	bra		test_switches_surfmode3		
	
	; No button press
	return

test_switches_surfmode3:
    movlw   .6
    cpfseq  menupos3                    ; in compass view?
    bra     test_switches_surfmode3a    ; No

    btfsc   premenu                     ; already shown "Bearing"
    bra     test_switches_surfmode3b    ; Yes, remove it

    extern  TFT_surf_set_bearing
    call    TFT_surf_set_bearing        ; Yes.
    bcf		switch_left
    return

test_switches_surfmode3a:
	bcf		switch_left
	bsf		menubit						; Enter Menu!
	return

test_switches_surfmode3b:
    ; Clear "Heading?"
    WIN_BOX_BLACK   .158,.190, .15, .99  ; top, bottom, left, right
    bcf     premenu
    bcf		switch_left
    return

test_switches_surfmode2:
    movlw   .6
    cpfseq  menupos3                    ; in compass view?
    bra     test_switches_surfmode2a    ; No
    btfss   premenu                     ; "Heading?" shown?
    bra     test_switches_surfmode2a    ; No
    ; Set new heading
    bcf     premenu
    bsf     compass_bearing_set
    movff   compass_heading_shown+0,compass_bearing+0
    movff   compass_heading_shown+1,compass_bearing+1
	bcf		switch_right
    return

test_switches_surfmode2a:
	bcf		switch_right
	bsf		toggle_customview
    bcf     premenu
    clrf	timeout_counter2        ; and reset timeout
	return

	global	timeout_surfmode
timeout_surfmode:
	movlw	timeout_surfacemode		; [s] Default timeout
    btfsc   menu_show_sensors2      ; In the "Calibrate" menu?
    movlw   timeout_calibrate_menu  ; [s] CCR Calibrate Menu timeout
    btfsc   menubit                 ; in Menu?
    bra     timeout_testmode        ; No, done.
    ; Must be in surface mode
    btfss   FLAG_ccr_mode           ; =1: CCR mode (Fixed ppO2 or Sensor) active
    bra     timeout_testmode        ; No, not CCR
    movlw   timeout_ccr_surface     ; [s] CCR Surface mode timeout

	global	timeout_testmode
timeout_testmode:
	incf	timeout_counter2,F		; increase timeout counter
	cpfsgt	timeout_counter2		; Compare with timeout_counter2
	return							; return, no timeout
	bsf		sleepmode				; Set Flag
	return							; Return

 END