diff code_part1/OSTC_code_asm_part1/menu_custom.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children 5c4ba624165d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/menu_custom.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,706 @@
+
+; 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/>.
+
+
+; Menu "Custom Functions", Custom Functions checker (Displays permanent warning if critical custom functions are altered)
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 05/10/30
+; last updated: 08/08/31
+; known bugs:
+; ToDo: 
+
+;First Bank of Custom Functions:
+; The custom functions are stored in the internal EEPROM after 0x80
+; any custom function occupies 4 byte:
+; 2 byte (low:high) store the default value, reset from menu "reset"
+; if bit16=1 then the custrom function is 15bit value, if not it's a 8bit value
+; 2 byte (low:high) store the actual value
+; defaults for custom functions are in menu "reset"
+; get values with GETCUSTOM8	.x with x=0...32 for 8 Bit values (stored in WREG)
+; or with GETCUSTOM15	.x with x=0...32 for 15 Bit values (stored in lo and hi)
+
+;Second Bank of Custom Functions:
+; The custom functions are stored in the internal EEPROM after 0x180
+; any custom function occupies 4 byte:
+; 2 byte (low:high) store the default value, reset from menu "reset"
+; if bit16=1 then the custrom function is 15bit value, if not it's a 8bit value
+; 2 byte (low:high) store the actual value
+; defaults for custom functions are in menu "reset"
+; get values with GETCUSTOM8	.x with x=0...32 for 8 Bit values (stored in WREG)
+; or with GETCUSTOM15	.x with x=0...32 for 15 Bit values (stored in lo and hi)
+
+
+GETCUSTOM8	macro	custom8
+	movlw	custom8
+	call	getcustom8_1
+	endm
+
+getcustom8_1:
+	; # number of requested custom function in wreg
+	movwf	customfunction_temp2
+	
+	movlw	d'31'
+	cpfsgt	customfunction_temp2
+	bra		getcustom8_2			; Lower bank
+	
+	movlw	d'1'					; Upper Bank
+	movwf	EEADRH
+	movlw	d'32'
+	subwf	customfunction_temp2,F
+	bra		getcustom8_3
+
+getcustom8_2:
+	clrf	EEADRH
+getcustom8_3:
+	movf	customfunction_temp2,W
+	mullw	d'4'
+	movf	PRODL,W			; x4 for adress
+	addlw	d'130'
+	movwf	EEADR			; +130 for LOW Byte of value
+	call	read_eeprom		; Lowbyte
+	movf	EEDATA,W		; copied into wreg
+	clrf	EEADRH
+	return					; return
+
+GETCUSTOM15	macro	custom15
+	movlw	custom15
+	call	getcustom15_1
+	endm
+
+getcustom15_1:
+	; # number of requested custom function in wreg
+	movwf	customfunction_temp2
+	
+	movlw	d'31'
+	cpfsgt	customfunction_temp2
+	bra		getcustom15_2			; Lower bank
+	
+	movlw	d'1'					; Upper Bank
+	movwf	EEADRH
+	movlw	d'32'
+	subwf	customfunction_temp2,F
+	bra		getcustom15_3
+getcustom15_2:
+	clrf	EEADRH
+getcustom15_3:
+	movf	customfunction_temp2,W
+	mullw	d'4'
+	movf	PRODL,W			; x4 for adress
+	addlw	d'130'
+	movwf	EEADR			; +130 for LOW Byte of value
+	call	read_eeprom		; Lowbyte
+	movff	EEDATA,lo
+	incf	EEADR,F
+	call	read_eeprom		; Highbyte
+	movff	EEDATA,hi
+	clrf	EEADRH
+	return					; return
+
+menu_custom_functions_page2:
+	movlw	d'154'			; start of custom function descriptors		
+	movwf	customfunction_temp1
+	bsf		customfunction_page	; Use Page I...
+	movlw	d'1'
+	movwf	EEADRH
+	bra		menu_custom_functions0
+
+menu_custom_functions:
+	movlw	d'36'			; start of custom function descriptors		
+	movwf	customfunction_temp1
+	bcf		customfunction_page	; Use Page I...
+	clrf	EEADRH
+	
+menu_custom_functions0:
+	bsf		leftbind
+	call	PLED_ClearScreen
+	movlw	d'1'
+	movwf	menupos
+
+	bcf		menubit4
+	bcf		cursor
+	bcf		sleepmode
+	clrf	decodata+0				; here: # of CustomFunction
+	clrf	divemins+0				; here: # of CustomFunction*4
+	bcf		first_FA				; here: =1: -, =0: +
+	bcf		second_FA				; here: =1: stepsize 1, =0: stepsize 10
+
+	call	PLED_topline_box
+	WIN_INVERT	.1	; Init new Wordprocessor	
+
+	btfss	customfunction_page		;
+	bra		menu_custom_functions10
+	DISPLAYTEXT	.186				; Custom FunctionsII
+	bra		menu_custom_functions11
+	
+menu_custom_functions10:
+	DISPLAYTEXT	.27					; Custom FunctionsI
+	
+menu_custom_functions11:
+	WIN_INVERT	.0	; Init new Wordprocessor	
+
+menu_custom_functions1:
+	clrf	timeout_counter2
+	bcf		menubit2
+	bcf		menubit3
+	WIN_LEFT 	.20
+	WIN_TOP		.35
+	lfsr	FSR2,letter
+	movff	decodata+0,lo
+	
+	movlw	d'0'
+	btfsc	customfunction_page			; Add offset for display
+	movlw	d'32'
+	addwf	lo,F
+	movff	lo,apnoe_mins				; apnoe_mins used as temp for binary CFs
+				
+	output_99x
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor
+
+;	movlw	d'16'
+;	movwf	temp1
+;	WIN_LEFT 	.40
+;	WIN_TOP		.35
+;	call	PLED_display_clear_common_y1
+;
+	movf	customfunction_temp1,W		; start of custom function descriptors		
+	addwf	decodata+0,W				; add # of current custom function, place result in wreg
+	call	displaytext1				; shows descriptor
+
+	movlw	binary_cf1
+	subwf	apnoe_mins,W						; Binary cf?
+	btfsc	STATUS,Z
+	bra		menu_custom_functions10c			; Yes
+
+	movlw	binary_cf2
+	subwf	apnoe_mins,W						; Binary cf?
+	btfsc	STATUS,Z
+	bra		menu_custom_functions10c			; Yes
+
+	movlw	binary_cf3
+	subwf	apnoe_mins,W						; Binary cf?
+	btfsc	STATUS,Z
+	bra		menu_custom_functions10c			; Yes
+
+	movlw	binary_cf4
+	subwf	apnoe_mins,W						; Binary cf?
+	btfsc	STATUS,Z
+	bra		menu_custom_functions10c			; Yes
+
+	movlw	binary_cf5
+	subwf	apnoe_mins,W						; Binary cf?
+	btfsc	STATUS,Z
+	bra		menu_custom_functions10c			; Yes
+
+
+	bra		menu_custom_functions10a			; Not a  binary CF selected
+
+menu_custom_functions10c:
+	movlw	d'1'
+	movwf	apnoe_mins					; Yes, set apnoe_mins to "1"
+	bra		menu_custom_functions10b
+
+menu_custom_functions10a:
+	clrf	apnoe_mins					; Yes, clear apnoe_mins
+menu_custom_functions10b:
+	WIN_LEFT 	.20
+	WIN_TOP		.65
+	lfsr	FSR2,letter
+	movlw	'+'
+	movwf	POSTINC2
+	movlw	'/'
+	movwf	POSTINC2
+	movlw	'-'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'+'
+	btfsc	first_FA
+	movlw	'-'
+	movwf	POSTINC2
+	call	word_processor		
+
+	WIN_LEFT 	.20
+	WIN_TOP		.95
+	lfsr	FSR2,letter
+	movlw	'1'
+	movwf	POSTINC2
+	movlw	'/'
+	movwf	POSTINC2
+	movlw	'1'
+	movwf	POSTINC2
+	movlw	'0'
+	movwf	POSTINC2
+	movlw	':'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	'1'
+	movwf	POSTINC2
+	movlw	'0'
+	btfsc	second_FA
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor		
+
+	WIN_LEFT 	.20
+	WIN_TOP		.125
+	lfsr	FSR2,letter
+	OUTPUTTEXT	d'89'				;"Default:"
+	
+	movf	divemins+0,W
+	addlw	0x80
+	movwf	EEADR
+	call	read_eeprom				; Lowbyte
+	movff	EEDATA,lo
+	movf	divemins+0,W
+	addlw	0x81
+	movwf	EEADR
+	call	read_eeprom				; Highbyte
+	movff	EEDATA,hi
+	bcf		hi,7					; clear Bit 7 of value
+	output_16
+	movlw	'('
+	movwf	POSTINC2
+
+	movlw	'1'
+	btfss	EEDATA,7				; 15Bit?
+	movlw	'8'						; 8Bit!
+	tstfsz  apnoe_mins				; apnoe_mins=0?
+	movlw	'1'						; No, 1Bit!
+	movwf	POSTINC2
+
+	movlw	'5'
+	btfsc	EEDATA,7				; 15Bit?
+	movwf	POSTINC2
+
+	movlw	'B'
+	movwf	POSTINC2
+	movlw	')'
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor		
+
+	WIN_LEFT 	.20
+	WIN_TOP		.155
+	lfsr	FSR2,letter
+	OUTPUTTEXT	d'97'				; "Current:"
+
+	movf	divemins+0,W
+	addlw	0x82
+	movwf	EEADR
+	call	read_eeprom				; Lowbyte
+	movff	EEDATA,lo
+	movf	divemins+0,W
+	addlw	0x83
+	movwf	EEADR
+	call	read_eeprom				; Highbyte
+	movff	EEDATA,hi
+	output_16
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	movlw	' '
+	movwf	POSTINC2
+	call	word_processor		
+
+menu_custom_functions1a:
+	DISPLAYTEXT	.11					; Exit
+
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+	call	PLED_menu_cursor
+
+customfunctions_loop:
+	call	check_switches_logbook
+
+	btfsc	menubit3
+	bra	customfunctions2		; Move cursor or generate next page
+
+	btfsc	menubit2
+	bra	do_customfunction		; call subfunction
+
+	btfsc	divemode
+	goto	restart					; dive started during cf menu
+
+	btfsc	onesecupdate
+	call	timeout_surfmode
+
+	btfsc	onesecupdate
+	call	set_dive_modes
+
+	bcf		onesecupdate			; end of 1sek. tasks
+
+	btfsc	sleepmode
+	bra	exit_customfunctions
+
+	bra	customfunctions_loop
+
+customfunctions2:
+	incf	menupos,F
+	movlw	d'7'
+	cpfseq	menupos					; =7?
+	bra		customfunctions3		; No
+	movlw	d'1'
+	movwf	menupos
+
+customfunctions3:
+	clrf	timeout_counter2
+	call	PLED_menu_cursor
+	
+	call	wait_switches		; Waits until switches are released, resets flag if button stays pressed!
+
+	bcf		menubit3				; clear flag
+	bra		customfunctions_loop
+
+
+do_customfunction:
+	CLRF	EEADRH					
+	movlw	d'1'
+	btfsc	customfunction_page
+	movwf	EEADRH					; Reset EEADRH correct (Was adjusted in check_timeout...)
+
+	dcfsnz	menupos,F
+	bra		next_customfunction
+	dcfsnz	menupos,F
+	bra		toggle_plusminus
+	dcfsnz	menupos,F
+	bra		toggle_oneorten
+	dcfsnz	menupos,F
+	bra		restore_cfn_value
+	dcfsnz	menupos,F
+	bra		adjust_cfn_value
+exit_customfunctions:
+	movlw	d'2'					; Return to correct list entry
+	btfss	customfunction_page
+	movlw	d'1'
+	movwf	menupos					; 
+	clrf	EEADRH					; Clear EEADRH !
+	goto	setup_menu2				; exit...
+
+
+next_customfunction:
+	incf	decodata+0
+	btfsc	decodata+0,5			;>31?
+	clrf	decodata+0				;Yes, so reset to zero
+	
+	movf	decodata+0,W
+	mullw	d'4'
+	movff	PRODL, divemins+0		;divemins+0 for correct addressing
+
+	movlw	d'1'
+	movwf	menupos
+	bra		menu_custom_functions1	; also debounces switches
+
+toggle_plusminus:
+	btg		first_FA
+	movlw	d'2'
+	movwf	menupos
+	bra		menu_custom_functions1	; also debounces switches
+
+toggle_oneorten:
+	btg		second_FA
+	movlw	d'3'
+	movwf	menupos
+	bra		menu_custom_functions1	; also debounces switches
+
+restore_cfn_value:
+	movf	divemins+0,W			; read default value
+	addlw	0x80
+	movwf	EEADR
+	call	read_eeprom				; Lowbyte
+	movff	EEDATA,lo
+	movf	divemins+0,W
+	addlw	0x81
+	movwf	EEADR
+	call	read_eeprom				; Highbyte
+	movff	EEDATA,hi
+	bcf		hi,7					; clear bit 7 of value
+
+	movf	divemins+0,W			; store default value
+	addlw	0x82
+	movwf	EEADR
+	movff	lo,EEDATA
+	call	write_eeprom			; Lowbyte
+	movf	divemins+0,W
+	addlw	0x83
+	movwf	EEADR
+	movff	hi,EEDATA
+	call	write_eeprom			; Highbyte
+
+	movlw	d'4'
+	movwf	menupos
+	bra		menu_custom_functions1	; also debounces switches
+
+adjust_cfn_value:
+	movf	divemins+0,W			; get current value
+	addlw	0x82
+	movwf	EEADR
+	call	read_eeprom				; Lowbyte
+	movff	EEDATA,lo
+	movf	divemins+0,W
+	addlw	0x83
+	movwf	EEADR
+	call	read_eeprom				; Highbyte
+	movff	EEDATA,hi
+
+	movf	divemins+0,W
+	addlw	0x81
+	movwf	EEADR
+	call	read_eeprom				; Highbyte
+	movff	EEDATA,divemins+1		; Highbyte of default value
+
+	movlw	d'1'
+	cpfseq	apnoe_mins				; If apnoe_mins=1 then CF is binary
+	bra		adjust_cfn_value1		; Not Binary
+
+	tstfsz	lo				; =0?
+	setf	lo				; No, Set to 255
+	incf	lo,F			; Increase by one
+	clrf	hi				; Delete hi byte (Not required but to make sure...)
+	bra		adjust_cfn_value3		; Store result
+
+adjust_cfn_value1:
+	btfss	first_FA				; Minus?
+	bra		adjust_cfn_value2		; No, Plus
+
+	movlw	d'1'
+	btfsc	second_FA				; -10?
+	movlw	d'10'
+	
+	subwf	lo,F					; substract value
+	movlw	d'0'
+	btfsc	divemins+1,7			; 8Bit value
+	subwfb	hi,F
+
+	movlw	b'01111111'
+	btfsc	hi,7					; >32768?
+	movwf	hi						
+
+	bra		adjust_cfn_value3
+	
+adjust_cfn_value2:
+	movlw	d'1'
+	btfsc	second_FA				; +10?
+	movlw	d'10'
+	
+	addwf	lo,F					; add value
+	movlw	d'0'
+	btfsc	divemins+1,7			; 8Bit value?
+	addwfc	hi,F
+
+	btfsc	hi,7					; >32768?
+	clrf	hi
+
+adjust_cfn_value3:
+	movf	divemins+0,W			; Store current value
+	addlw	0x82
+	movwf	EEADR
+	movff	lo,EEDATA
+	call	write_eeprom			; Lowbyte
+	movf	divemins+0,W
+	addlw	0x83
+	movwf	EEADR
+	movff	hi,EEDATA
+	call	write_eeprom			; Highbyte 
+	movlw	d'5'
+	movwf	menupos
+	bra		menu_custom_functions1	; also debounces switches
+
+getcustom15_default:
+	; # number of requested custom function in wreg
+	movwf	customfunction_temp2
+	
+	movlw	d'31'
+	cpfsgt	customfunction_temp2
+	bra		getcustom15_d2			; Lower bank
+	
+	movlw	d'1'					; Upper Bank
+	movwf	EEADRH
+	movlw	d'32'
+	subwf	customfunction_temp2,F
+	bra		getcustom15_d3
+getcustom15_d2:
+	clrf	EEADRH
+getcustom15_d3:
+	movf	customfunction_temp2,W
+	mullw	d'4'
+	movf	PRODL,W			; x4 for adress
+	addlw	d'128'
+	movwf	EEADR			; +130 for LOW Byte of value
+	call	read_eeprom		; Lowbyte
+	movff	EEDATA,lo
+	incf	EEADR,F
+	call	read_eeprom		; Highbyte
+	movff	EEDATA,hi
+	clrf	EEADRH
+	return					; return
+
+custom_functions_check_divemode:			;displays warning if a critical custom function is not set to default
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf11
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf12
+	return
+
+custom_functions_check_surfmode:			;displays warning if a critical custom function is not set to default
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf11
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf12
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf17
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf18
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf19
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf29
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf32
+	dcfsnz	cf_checker_counter,F			; counts custom functions to check for warning symbol
+	bra		check_cf33
+	return
+
+check_cf11:
+	movlw	d'11'					; saturation factor
+	rcall	custom_function_check_low	; compares current with default value
+	call	test_and_display_warning	; displays the warning if the custom function is not correct
+	movlw	d'2'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf12:
+	movlw	d'12'					; desaturation factor
+	rcall	custom_function_check_high	; compares current with default value
+	call	test_and_display_warning	; displays the warning if the custom function is not correct
+	movlw	d'3'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf17:
+	movlw	d'17'					; lower threshold ppO2
+	rcall	custom_function_check_low	; compares current with default value
+	call	test_and_display_warning	; displays the warning if the custom function is not correct
+	movlw	d'4'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf18:
+	movlw	d'18'					; upper threshold ppO2
+	rcall	custom_function_check_high	; compares current with default value
+	call	test_and_display_warning	; displays the warning if the custom function is not correct
+	movlw	d'5'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf19:
+	movlw	d'19'					; upper threshold ppO2 display
+	rcall	custom_function_check_high	; compares current with default value
+	call	test_and_display_warning	; displays the warning if the custom function is not correct
+	movlw	d'6'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf29:
+	movlw	d'6'
+	movwf	cf_checker_counter		; upper limit for CF29, here: used as a temp variable
+	movlw	d'29'					; last deco stop in [m]
+	rcall	custom_function_check_high_limit	; compares current with default value
+	call	test_and_display_warning			; displays the warning if the custom function is not correct
+	movlw	d'7'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf32:
+	movlw	d'32'					; GF LOW
+	rcall	custom_function_check_high	; compares current with default value
+	call	test_and_display_warning			; displays the warning if the custom function is not correct
+	movlw	d'8'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+check_cf33:
+	movlw	d'33'					; GF HIGH
+	rcall	custom_function_check_high	; compares current with default value
+	call	test_and_display_warning			; displays the warning if the custom function is not correct
+	movlw	d'1'						; next in testing row
+	movwf	cf_checker_counter			; 
+	return
+
+
+test_and_display_warning:
+	movwf	lo						; copy result
+	tstfsz	lo
+	return							; CF OK
+	goto	custom_warn_surfmode
+
+custom_function_check_low:					; Checks CF (#WREG)
+											; Returns WREG=0 if CF is lower then default
+	movwf	temp1							; save for custom value
+	call	getcustom15_1					; Get Current Value stored in hi and lo
+	movff	lo,sub_a+0
+	movff	hi,sub_a+1						; save value
+	
+	movf	temp1,w
+	call	getcustom15_default				; Get Default value stored in hi and lo
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1						; save value
+	call	sub16							; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+	btfss	neg_flag						; negative?
+	retlw	.255							; no
+	retlw	.0								; yes
+
+custom_function_check_high:					; Checks CF (#WREG)
+											; Returns WREG=0 if CF is higher then default
+	movwf	temp1							; save for custom value
+	call	getcustom15_1					; Get Current Value stored in hi and lo
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1						; save value
+	
+	movf	temp1,w
+	call	getcustom15_default				; Get Default value stored in hi and lo
+	movff	lo,sub_a+0
+	movff	hi,sub_a+1						; save value
+	call	sub16							; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+	btfss	neg_flag						; negative?
+	retlw	.255							; no
+	retlw	.0								; yes
+
+custom_function_check_high_limit:			; Checks if CF (#WREG) is lower then limit (#cf_checker_counter)
+	movwf	temp1							; save for custom value
+	call	getcustom15_1					; Get Current Value stored in hi and lo
+	movff	lo,sub_b+0
+	movff	hi,sub_b+1						; save value
+	movff	cf_checker_counter, sub_a+0
+	clrf	sub_a+1
+	call	sub16							; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a
+	btfss	neg_flag						; negative?
+	retlw	.255							; no
+	retlw	.0								; yes
+