diff src/surfmode.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children e4e91fe8b09d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/surfmode.asm	Wed Apr 24 19:22:45 2013 +0200
@@ -0,0 +1,415 @@
+;=============================================================================
+;
+;   File surfmode.asm
+;
+;   Surfacemode
+;
+;   Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
+;=============================================================================
+; HISTORY
+;  2011-08-07 : [mH] moving from OSTC code
+
+#include    "ostc3.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"
+
+#DEFINE	menu_pos_row		.215
+#DEFINE	menu_pos_column		.0
+#DEFINE	view_row            .215
+#DEFINE	view_column         .124
+
+   	extern   do_main_menu
+
+gui     CODE
+
+
+;=============================================================================
+; Boot tasks for all modes
+	global	surfloop
+surfloop:
+    call	speed_normal
+    bcf     no_sensor_int           ; Normal pressure mode
+
+    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  ostc3_logo_block
+    movlw   LOW(ostc3_logo_block)
+    movwf   TBLPTRL
+    movlw   HIGH ostc3_logo_block;&0xFFFF
+    movwf   TBLPTRH
+    movlw   UPPER(ostc3_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
+;	call	speed_fastest
+	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
+
+	clrf	timeout_counter2
+	clrf 	timeout_counter3
+	bcf		premenu						; clear premenu flag
+	bcf		menubit						; clear menu flag
+	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)
+	bcf		switch_left
+	bcf		switch_right
+    bcf     LEDg
+    bcf     LEDr
+
+	;---- 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
+	WIN_INVERT	.0					    ; Init new Wordprocessor
+
+;	call	TFT_user_image				; Show the user image/text
+	
+    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
+
+    call    mcp_reset                   ; Setup RX
+	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
+    extern  surf_customview_mask
+    call    surf_customview_mask        ; Update #menupos3 view
+
+    WIN_TOP     .0
+    WIN_LEFT    .70
+    movlw   LOW(ostc3_logo_block)
+    movwf   TBLPTRL
+    movlw   HIGH ostc3_logo_block;&0xFFFF
+    movwf   TBLPTRH
+    movlw   UPPER(ostc3_logo_block)
+    movwf   TBLPTRU
+    call    color_image
+
+	btfsc	FLAG_apnoe_mode				; Ignore in Apnoe mode
+	bra		surfloop1
+	btfsc	FLAG_gauge_mode				; Ignore in Gauge mode
+	bra		surfloop1
+
+surfloop1:
+    call    TFT_Display_FadeIn          ; Display resulting surface screen.
+
+    ;---- Late initialisations -----------------------------------------------    
+	movff	last_surfpressure_30min+0,int_I_pres_respiration+0		; copy surface air pressure to deco routine
+	movff	last_surfpressure_30min+1,int_I_pres_respiration+1		; 30min old values 
+	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
+
+    extern  do_demo_divemode
+;    goto    do_demo_divemode
+
+; Startup tasks for all modes
+    ; Desaturation time needs:
+    ;   int_I_pres_surface
+    ;   char_I_desaturation_multiplier
+	call	deco_calc_desaturation_time ; calculate desaturation time
+	movlb	b'00000001'					; select ram bank 1
+
+    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	timeout_premenu				; timeout premenu
+	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
+
+    btfsc   FLAG_ccr_mode               ; In CCR mode...
+    call    TFT_surface_hud             ; ...update HUD data in surface mode
+
+	bcf		onesecupdate				; every second tasks done
+	
+surfloop_loop2:	
+; Tasks approx. every 50ms for all modes
+	call	test_switches_surfmode		; check switches
+	call	speed_normal
+
+; 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	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
+
+    btfss   quarter_second_update
+    bra     surfloop_loop2a
+    bcf     quarter_second_update
+    movlw   .6
+    cpfseq  menupos3                    ; in compass view?
+    bra     surfloop_loop2a             ; No
+    call    TFT_surface_compass_heading ; Yes, update compass heading value
+
+surfloop_loop2a:
+	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
+    btfsc   vusb_in                     ; USB plugged in?
+    goto    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	divemode					; Divemode active?
+	goto	diveloop					; Yes, switch into Divemode!
+	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
+	call	calc_deko_surfmode			; calculate desaturation every minute
+	bcf		oneminupdate				
+	return
+
+    extern  check_cns_violation,check_warn_battery,check_and_store_gf_violation
+surfmode_check_for_warnings:
+	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
+    call    surfmode_check_for_nofly            ; Check if nofly time should be shown
+    call    surfmode_check_for_desat            ; Check if desat time should be shown
+    call    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
+	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
+
+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
+
+; 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.
+
+surfmode_check_for_interval:
+	movf    	surface_interval+0,W            ; Is interval null ?
+    iorwf   	surface_interval+0,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:
+	movf    	desaturation_time+0,W           ; Is nofly null ?
+    iorwf   	desaturation_time+1,W
+    bnz     	surfmode_check_for_desat2		; No
+    return
+surfmode_check_for_desat2:
+	incf	warning_counter,F			; increase counter
+    call    TFT_desaturation_time
+    return
+
+surfmode_check_for_nofly:
+ 	movf    nofly_time+0,W              ; Is nofly null ?
+    iorwf   nofly_time+1,W
+    bnz     surfmode_check_for_nofly2   ; No...
+    return
+surfmode_check_for_nofly2:
+	incf	warning_counter,F			; increase counter
+    call    TFT_nofly_time
+    return
+
+
+;=============================================================================
+	global	calc_deko_surfmode
+calc_deko_surfmode:
+    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
+	banksel		common
+	return
+
+timeout_premenu:
+	btfsc	premenu					; is "<Menu" displayed?
+	bra		timeout_premenu1		; Yes
+	return
+
+timeout_premenu1:
+	incf	timeout_counter3,F		; Yes...
+	movlw	d'2'
+	cpfsgt	timeout_counter3		; ... longer then premenu_timeout
+	return							; No!
+
+	bcf		premenu					; Yes, so clear "Menu?" and clear pre_menu bit
+
+	WIN_SMALL	menu_pos_column,menu_pos_row
+    WIN_COLOR	color_lightblue
+    STRCPY_TEXT_PRINT  tMenu		; "<Menu"
+	call	TFT_standard_color
+	clrf	timeout_counter3		; Also clear timeout
+	bcf		switch_left				; and debounce switches
+	bcf		switch_right
+	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:
+	bcf		switch_left
+	btfss	premenu
+	bra		test_switches_surfmode4
+	bsf		menubit					; Enter Menu!
+	return
+
+test_switches_surfmode4:
+    WIN_COLOR	color_lightblue
+	WIN_SMALL	view_column,view_row
+    STRCPY_TEXT_PRINT  tView        ;"View"
+	WIN_SMALL	menu_pos_column,menu_pos_row
+	call	TFT_standard_color
+	WIN_INVERT	.1					; Init new Wordprocessor
+	STRCPY_TEXT_PRINT  tMenu		;"<Menu"
+	WIN_INVERT	.0					; Init new Wordprocessor
+	bsf		premenu
+	clrf	timeout_counter2
+	return
+
+test_switches_surfmode2:
+	bcf		switch_right
+	bsf		toggle_customview
+    clrf	timeout_counter2        ; and reset timeout
+	return
+
+test_switches_surfmode5:
+	WIN_SMALL	menu_pos_column,menu_pos_row
+    WIN_COLOR	color_lightblue
+	STRCPY_TEXT_PRINT  tMenu		;"<Menu"
+	call	TFT_standard_color
+    bcf		premenu
+	clrf	timeout_counter2
+	return
+
+	global	timeout_surfmode
+timeout_surfmode:
+	movlw	timeout_surfacemode		; [s]
+	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
\ No newline at end of file