Mercurial > public > hwos_code
diff src/compass_ops.asm @ 582:b455b31ce022
work on 2.97 stable
author | heinrichsweikamp |
---|---|
date | Mon, 26 Feb 2018 16:40:28 +0100 |
parents | b8f45b57302d |
children | ca4556fb60b9 |
line wrap: on
line diff
--- a/src/compass_ops.asm Sun Feb 25 18:25:38 2018 +0100 +++ b/src/compass_ops.asm Mon Feb 26 16:40:28 2018 +0100 @@ -1,105 +1,123 @@ -#include "hwos.inc" -#include "i2c.inc" -#include "tft_outputs.inc" -#include "isr.inc" +;============================================================================= +; +; File compass_ops.asm V2.98 +; +; Compass Operations +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= + +#include "hwos.inc" +#include "i2c.inc" +#include "tft_outputs.inc" +#include "isr.inc" #include "tft.inc" #include "strings.inc" -#include "wait.inc" ; speed_* -#include "surfmode.inc" -#include "divemode.inc" -#include "math.inc" -#include "convert.inc" +#include "wait.inc" ; speed_* +#include "surfmode.inc" +#include "divemode.inc" +#include "math.inc" +#include "convert.inc" ; Make sure symbols from the .inc are available to the C code: - ; Filtered data - global compass_DX_f, compass_DY_f, compass_DZ_f - global accel_DX_f, accel_DY_f, accel_DZ_f + ; Filtered data + global compass_DX_f + global compass_DY_f + global compass_DZ_f - ; Calibration data - global compass_CX_f - global compass_CY_f - global compass_CZ_f + global accel_DX_f + global accel_DY_f + global accel_DZ_f + + ; Calibration data + global compass_CX_f + global compass_CY_f + global compass_CZ_f - ; Tmp values to pass Q15 arithmetics around - global compass_a - global compass_b + ; Tmp values to pass Q15 arithmetics around + global compass_a + global compass_b - ; Result - global compass_heading; , compass_roll, compass_pitch + ; Result + global compass_heading +; global compass_roll +; global compass_pitch - extern compass - extern compass_reset_calibration - extern compass_add_calibration - extern compass_solve_calibration - extern menu_processor_bottom_line + extern compass + extern compass_reset_calibration + extern compass_add_calibration + extern compass_solve_calibration + extern menu_processor_bottom_line + extern option_save_all + extern compass + compass_ops code + +;============================================================================= + ;----------------------------------------------------------------------------- ; Filter compass values ; ; Apply linear filtering to input parameters. -; Apply filtering formula: -; reg_f += (reg - reg_f) / 4 -FILTER16 MACRO reg, reg_f - movf reg_f+0,W - subwf reg+0,W - movwf PRODL - movf reg_f+1,W - subwfb reg+1,W - rcall filter_16_common - addwf reg_f+0,F - movf PRODH,W - addwfc reg_f+1,F - ENDM +; Apply filtering formula: reg_f += (reg - reg_f) / 4 +FILTER16 MACRO reg, reg_f + movf reg_f+0,W + subwf reg+0,W + movwf PRODL + movf reg_f+1,W + subwfb reg+1,W + rcall filter_16_common + addwf reg_f+0,F + movf PRODH,W + addwfc reg_f+1,F + ENDM filter_16_common: - movwf PRODH - - bcf STATUS,C ; Copy sign bit into carry - btfsc PRODH,7 - bsf STATUS,C - rrcf PRODH,F ; 16bit shift right - rrcf PRODL,F + movwf PRODH + bcf STATUS,C ; Copy sign bit into carry + btfsc PRODH,7 + bsf STATUS,C + rrcf PRODH,F ; 16bit shift right + rrcf PRODL,F + bcf STATUS,C ; Copy sign bit into carry + btfsc PRODH,7 + bsf STATUS,C + rrcf PRODH,F ; 16bit shift right + rrcf PRODL,W + return - bcf STATUS,C ; Copy sign bit into carry - btfsc PRODH,7 - bsf STATUS,C - rrcf PRODH,F ; 16bit shift right - rrcf PRODL,W - return - - global compass_filter + global compass_filter compass_filter: - banksel compass_DX - - FILTER16 compass_DX, compass_DX_f - FILTER16 compass_DY, compass_DY_f - FILTER16 compass_DZ, compass_DZ_f - FILTER16 accel_DX, accel_DX_f - FILTER16 accel_DY, accel_DY_f - FILTER16 accel_DZ, accel_DZ_f - banksel common - return + banksel compass_DX + FILTER16 compass_DX, compass_DX_f + FILTER16 compass_DY, compass_DY_f + FILTER16 compass_DZ, compass_DZ_f + FILTER16 accel_DX, accel_DX_f + FILTER16 accel_DY, accel_DY_f + FILTER16 accel_DZ, accel_DZ_f + banksel common + return ;----------------------------------------------------------------------------- compass_filter_init: - movff compass_DX+0, compass_DX_f+0 - movff compass_DX+1, compass_DX_f+1 - movff compass_DY+0, compass_DY_f+0 - movff compass_DY+1, compass_DY_f+1 - movff compass_DZ+0, compass_DZ_f+0 - movff compass_DZ+1, compass_DZ_f+1 - movff accel_DX+0, accel_DX_f+0 - movff accel_DX+1, accel_DX_f+1 - movff accel_DY+0, accel_DY_f+0 - movff accel_DY+1, accel_DY_f+1 - movff accel_DZ+0, accel_DZ_f+0 - movff accel_DZ+1, accel_DZ_f+1 - return + movff compass_DX+0, compass_DX_f+0 + movff compass_DX+1, compass_DX_f+1 + movff compass_DY+0, compass_DY_f+0 + movff compass_DY+1, compass_DY_f+1 + movff compass_DZ+0, compass_DZ_f+0 + movff compass_DZ+1, compass_DZ_f+1 + movff accel_DX+0, accel_DX_f+0 + movff accel_DX+1, accel_DX_f+1 + movff accel_DY+0, accel_DY_f+0 + movff accel_DY+1, accel_DY_f+1 + movff accel_DZ+0, accel_DZ_f+0 + movff accel_DZ+1, accel_DZ_f+1 + return ;----------------------------------------------------------------------------- ; Q15 fractional numbers: a * b / 2**16 (UNSIGNED) @@ -112,1345 +130,1333 @@ ; ; (a/2**15) * (b/2**15) = a*b / 2**30 = (a*b/2**16) / 2**14. ; So to get back a Q15 number, we need a shift-left... - global compass_umul + global compass_umul compass_umul: - rcall compass_mul_16 + rcall compass_mul_16 ; The 2x time, by left-shifting inserting the missing bit: compass_mul_2: - rlcf compass_r+2,F ; Missing bit into carry - rlcf compass_r+0,F - rlcf compass_r+1,F - movff compass_r+0,PRODL ; return value into ProdH:L - movff compass_r+1,PRODH - return + rlcf compass_r+2,F ; Missing bit into carry + rlcf compass_r+0,F + rlcf compass_r+1,F + movff compass_r+0,PRODL ; return value into ProdH:L + movff compass_r+1,PRODH + return ; The 16x16-> multiply: compass_mul_16: - banksel compass_a + banksel compass_a - movf compass_a+1,W ; Block ah*bh - mulwf compass_b+1 - movff PRODL,compass_r+0 ; and copy - movff PRODH,compass_r+1 + movf compass_a+1,W ; Block ah*bh + mulwf compass_b+1 + movff PRODL,compass_r+0 ; and copy + movff PRODH,compass_r+1 - movf compass_a+0,W ; Block al*bl - mulwf compass_b+0 - movff PRODH,compass_r+2 ; Into fraction byte + movf compass_a+0,W ; Block al*bl + mulwf compass_b+0 + movff PRODH,compass_r+2 ; Into fraction byte - movf compass_a+1,W ; Block ah*bl - mulwf compass_b+0 - movf PRODL,W - addwf compass_r+2,F ; Fraction part to carry. - movf PRODH,W ; and add16 - addwfc compass_r+0,F - movlw 0 - addwfc compass_r+1,F + movf compass_a+1,W ; Block ah*bl + mulwf compass_b+0 + movf PRODL,W + addwf compass_r+2,F ; Fraction part to carry. + movf PRODH,W ; and add16 + addwfc compass_r+0,F + movlw 0 + addwfc compass_r+1,F - movf compass_a+0,W ; Block al*bh - mulwf compass_b+1 - movf PRODL,W - addwf compass_r+2,F ; Fraction part to carry. - movf PRODH,W ; and add16 - addwfc compass_r+0,F - movlw 0 - addwfc compass_r+1,F + movf compass_a+0,W ; Block al*bh + mulwf compass_b+1 + movf PRODL,W + addwf compass_r+2,F ; Fraction part to carry. + movf PRODH,W ; and add16 + addwfc compass_r+0,F + movlw 0 + addwfc compass_r+1,F - return + return ;----------------------------------------------------------------------------- ; Q15 fractional numbers: a * b / 2**16 (SIGNED) - global compass_imul + global compass_imul compass_imul: - rcall compass_mul_16 + rcall compass_mul_16 - btfss compass_b+1,7 - bra compass_mul_3 + btfss compass_b+1,7 + bra compass_mul_3 - movf compass_a+0,W - subwf compass_r+0,F - movf compass_a+1,W - subwfb compass_r+1,F + movf compass_a+0,W + subwf compass_r+0,F + movf compass_a+1,W + subwfb compass_r+1,F compass_mul_3: - btfss compass_a+1,7 - bra compass_mul_4 + btfss compass_a+1,7 + bra compass_mul_4 - movf compass_b+0,W - subwf compass_r+0,F - movf compass_b+1,W - subwfb compass_r+1,F + movf compass_b+0,W + subwf compass_r+0,F + movf compass_b+1,W + subwfb compass_r+1,F compass_mul_4: - bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x - btfsc compass_r+1,7 - bsf compass_r+1,6 - bra compass_mul_2 + bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x + btfsc compass_r+1,7 + bsf compass_r+1,6 + bra compass_mul_2 - global compass_calibration_loop -compass_calibration_loop: ; Compass calibration - bsf no_sensor_int ; No Sensor ISR - call I2C_sleep_accelerometer ; Stop accelerometer - call I2C_sleep_compass ; Stop compass - call TFT_ClearScreen - ; Mask - WIN_COLOR color_greenish - WIN_SMALL .16,.0 - STRCPY_TEXT_PRINT tCompassMenu - btfss switch_right2 ; wait until button is released - bra $-4 + global compass_calibration_loop +compass_calibration_loop: ; Compass calibration + bsf no_sensor_int ; No Sensor ISR + call I2C_sleep_accelerometer ; Stop accelerometer + call I2C_sleep_compass ; Stop compass + call TFT_ClearScreen + ; Mask + WIN_COLOR color_greenish + WIN_SMALL .16,.0 + STRCPY_TEXT_PRINT tCompassMenu + btfss switch_right2 ; wait until button is released + bra $-4 - call TFT_standard_color -; WIN_SMALL .0,.215 -; STRCPY_TEXT_PRINT tExit - WAITMS d'255' - WAITMS d'255' - - movlw .7 ; Gain init - movff WREG,opt_compass_gain -compass_calibration_gainset: ; Reduce the gain, set bank here! - banksel opt_compass_gain - decf opt_compass_gain,F ; Reduce by one - btfsc STATUS,N ; <0? - clrf opt_compass_gain ; Yes, keep at zero + call TFT_standard_color +; WIN_SMALL .0,.215 +; STRCPY_TEXT_PRINT tExit + WAITMS d'255' + WAITMS d'255' - banksel common - call I2C_init_accelerometer - call I2C_init_compass - -; btfsc compass_type ; compass1? -; bra compass_calibration_loop1 ; Yes, skip gain stuff + movlw .7 ; Gain init + movff WREG,opt_compass_gain +compass_calibration_gainset: ; Reduce the gain, set bank here! + banksel opt_compass_gain + decf opt_compass_gain,F ; Reduce by one + btfsc STATUS,N ; <0? + clrf opt_compass_gain ; Yes, keep at zero - rcall TFT_compass_show_gain ; Show the current compass gain + banksel common + call I2C_init_accelerometer + call I2C_init_compass + +; btfsc compass_type ; compass1? +; bra compass_calibration_loop1 ; Yes, skip gain stuff + + rcall TFT_compass_show_gain ; show the current compass gain - WAITMS d'250' - WAITMS d'250' ; Wait for first reading... + WAITMS d'250' + WAITMS d'250' ; wait for first reading... - clrf timeout_counter2 - clrf timeout_counter3 + clrf timeout_counter2 +; clrf timeout_counter3 ; not used / required [rl] - call speed_fastest - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; read Accelerometer + call speed_fastest + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; read Accelerometer - ; Test all axes for +4096 (Hi byte=16) - banksel compass_DX+1 - movlw .16 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset + ; Test all axes for +4096 (Hi byte=16) + banksel compass_DX+1 + movlw .16 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset - ; Test all axes for -4096 (Hi byte=240) - movlw .240 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset - banksel common + ; Test all axes for -4096 (Hi byte=240) + movlw .240 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset + banksel common -compass_calibration_loop1: ; Done with Gain - rcall compass_filter_init ; set DX_f values - call compass_reset_calibration ; Reset CX_f values - banksel common +compass_calibration_loop1: ; Done with Gain + rcall compass_filter_init ; set DX_f values + call compass_reset_calibration ; Reset CX_f values + banksel common compass_calibration_loop2: - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; Test Accelerometer - rcall compass_filter ; Filter compass raw data - banksel common + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; Test Accelerometer + rcall compass_filter ; Filter compass raw data + banksel common - ; Twice - call I2C_RX_compass ; read compass - call I2C_RX_accelerometer ; Test Accelerometer - rcall compass_filter ; Filter compass raw data - banksel common - -; btfsc compass_type ; compass1? -; bra compass_calibration_loop3 ; Yes, skip gain stuff + ; Twice + call I2C_RX_compass ; read compass + call I2C_RX_accelerometer ; Test Accelerometer + rcall compass_filter ; Filter compass raw data + banksel common + +; btfsc compass_type ; compass1? +; bra compass_calibration_loop3 ; Yes, skip gain stuff - ; Test all axes for +4096 (Hi byte=16) - banksel compass_DX+1 - movlw .16 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset + ; Test all axes for +4096 (Hi byte=16) + banksel compass_DX+1 + movlw .16 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset - ; Test all axes for -4096 (Hi byte=240) - movlw .240 - cpfseq compass_DX+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DY+1 - bra $+4 - bra compass_calibration_gainset - cpfseq compass_DZ+1 - bra $+4 - bra compass_calibration_gainset - banksel common + ; Test all axes for -4096 (Hi byte=240) + movlw .240 + cpfseq compass_DX+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DY+1 + bra $+4 + bra compass_calibration_gainset + cpfseq compass_DZ+1 + bra $+4 + bra compass_calibration_gainset + banksel common ; -; ; Three -; call I2C_RX_compass ; read compass -; call I2C_RX_accelerometer ; Test Accelerometer -; call compass_filter ; Filter compass raw data -; banksel common +; ; Three +; call I2C_RX_compass ; read compass +; call I2C_RX_accelerometer ; Test Accelerometer +; call compass_filter ; Filter compass raw data +; banksel common ; -; ; Four times to get cleaner values -; call I2C_RX_compass ; read compass -; call I2C_RX_accelerometer ; Test Accelerometer -; call compass_filter ; Filter compass raw data +; ; Four times to get cleaner values +; call I2C_RX_compass ; read compass +; call I2C_RX_accelerometer ; Test Accelerometer +; call compass_filter ; Filter compass raw data compass_calibration_loop3: - ; And register only one value out of four: - call compass_add_calibration ; check and store new max/min values - banksel common + ; And register only one value out of four: + call compass_add_calibration ; check and store new max/min values + banksel common - rcall TFT_compass_fast ; show values + rcall TFT_compass_fast ; show values - btfsc sleepmode ; Sleepmode active? - bra compass_calibration_exit ; Yes, exit + btfsc sleepmode ; Sleepmode active? + bra compass_calibration_exit ; Yes, exit - btfss onesecupdate ; do every second tasks? - bra compass_calibration_loop2 ; no, loop here + btfss onesecupdate ; do every second tasks? + bra compass_calibration_loop2 ; no, loop here - movlw .60 - call timeout_testmode ; check timeout - movlw .60 - rcall TFT_show_timeout_testmode ; Show the timeout - - bcf onesecupdate ; clear flag + movlw .60 + call timeout_testmode ; check timeout + movlw .60 + rcall TFT_show_timeout_testmode ; Show the timeout - bra compass_calibration_loop2 ; loop here + bcf onesecupdate ; clear flag + + bra compass_calibration_loop2 ; loop here compass_calibration_exit: - call compass_solve_calibration - banksel common - ; Done. - extern option_save_all - call option_save_all ; save all settings into EEPROM - bcf sleepmode ; Clear the flag before exiting to surfacemode - movlw .6 - movwf customview_surfmode ; Set to compass view... - goto surfloop ; ...and exit + call compass_solve_calibration + banksel common + ; Done. + call option_save_all ; save all settings into EEPROM + bcf sleepmode ; Clear the flag before exiting to surface mode + movlw .6 + movff WREG,customview_surfmode ; Set to compass view... + goto surfloop ; ...and exit - global TFT_compass_fast + global TFT_compass_fast TFT_compass_fast: WIN_TINY .20,.50 - STRCPY "X:" - movff compass_DX+0,lo - movff compass_DX+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 - STRCAT " Y:" - movff compass_DY+0,lo - movff compass_DY+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 - STRCAT " Z:" - movff compass_DZ+0,lo - movff compass_DZ+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - output_16 + STRCPY "X:" + movff compass_DX+0,lo + movff compass_DX+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 + STRCAT " Y:" + movff compass_DY+0,lo + movff compass_DY+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 + STRCAT " Z:" + movff compass_DZ+0,lo + movff compass_DZ+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + output_16 STRCAT_PRINT " " - return + return -TFT_show_timeout_testmode: ; With timeout in WREG... - movwf hi - WIN_TINY .20,.68 - STRCPY "T:" - movf timeout_counter2,W ; current timeout - subwf hi,W ; subtract from timeout value - addlw .1 ; +1 - movwf lo - bsf leftbind - output_8 ; Display timeout - bcf leftbind - STRCAT_PRINT "s " - return - +TFT_show_timeout_testmode: ; With timeout in WREG... + movwf hi + WIN_TINY .20,.68 + STRCPY "T:" + movf timeout_counter2,W ; current timeout + subwf hi,W ; subtract from timeout value + addlw .1 ; +1 + movwf lo + bsf leftbind + output_8 ; Display timeout + bcf leftbind + STRCAT_PRINT "s " + return -TFT_compass_show_gain: ; Show the current compass gain -; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) -; tstfsz lo -; return ; Do not show unless gain=0 - WIN_TINY .20,.86 - STRCPY_TEXT tCompassGain - movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) - bsf leftbind - output_8 - bcf leftbind - STRCAT_PRINT "" - return +TFT_compass_show_gain: ; Show the current compass gain +; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) +; tstfsz lo +; return ; Do not show unless gain=0 + WIN_TINY .20,.86 + STRCPY_TEXT tCompassGain + movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) + bsf leftbind + output_8 + bcf leftbind + STRCAT_PRINT "" + return TFT_surface_compass_bearing: - WIN_SMALL surf_compass_bear_column,surf_compass_bear_row - movff compass_bearing+0,lo - movff compass_bearing+1,hi - PUTC "(" - bsf leftbind - output_16dp .2 ; Result is "0.000" - bcf leftbind - ; rearrange figures to "000" - movff buffer+3,buffer+1 - movff buffer+4,buffer+2 - movff buffer+5,buffer+3 - lfsr FSR2,buffer+4 - STRCAT "° " - rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 - STRCAT_PRINT ")" - return + WIN_SMALL surf_compass_bear_column,surf_compass_bear_row + movff compass_bearing+0,lo + movff compass_bearing+1,hi + PUTC "(" + bsf leftbind + output_16dp .2 ; Result is "0.000" + bcf leftbind + ; rearrange figures to "000" + movff buffer+3,buffer+1 + movff buffer+4,buffer+2 + movff buffer+5,buffer+3 + lfsr FSR2,buffer+4 + STRCAT "° " + rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 + STRCAT_PRINT ")" + return - global TFT_surface_compass_mask + global TFT_surface_compass_mask TFT_surface_compass_mask: - WIN_SMALL surf_compass_mask_column,surf_compass_mask_row + WIN_SMALL surf_compass_mask_column,surf_compass_mask_row call TFT_standard_color - STRCPY_TEXT_PRINT tHeading ; Heading: - return + STRCPY_TEXT_PRINT tHeading ; Heading: + return - global TFT_dive_compass_mask + global TFT_dive_compass_mask TFT_dive_compass_mask: - WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 - return + WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 + return - global TFT_surface_compass_heading + global TFT_surface_compass_heading TFT_surface_compass_heading: - rcall compass_heading_common - WIN_STD surf_compass_head_column,surf_compass_head_row + rcall compass_heading_common + WIN_STD surf_compass_head_column,surf_compass_head_row call TFT_standard_color -TFT_surface_compass_heading_com: ; Show "000° N" - movff compass_heading+0,lo - movff compass_heading+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required +TFT_surface_compass_heading_com: ; Show "000° N" + movff compass_heading+0,lo + movff compass_heading+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - ; Shown and actual identical? - movff compass_heading_shown+0,WREG - cpfseq lo - bra TFT_surface_compass_heading_com1 ; Not equal - movff compass_heading_shown+1,WREG - cpfseq hi - bra TFT_surface_compass_heading_com1 ; Not equal - bra TFT_surface_compass_heading_com3 ; equal, skip smoothing + ; Shown and actual identical? + movff compass_heading_shown+0,WREG + cpfseq lo + bra TFT_surface_compass_heading_com1 ; Not equal + movff compass_heading_shown+1,WREG + cpfseq hi + bra TFT_surface_compass_heading_com1 ; Not equal + bra TFT_surface_compass_heading_com3 ; equal, skip smoothing TFT_surface_compass_heading_com1: - movff lo,sub_a+0 - movff hi,sub_a+1 - movff compass_heading_shown+0,sub_b+0 - movff compass_heading_shown+1,sub_b+1 - call subU16 - btfsc neg_flag - bra TFT_surface_compass_heading_com2 ; shown > actual - ; shown < actual - banksel compass_heading_shown - infsnz compass_heading_shown+0,F - incf compass_heading_shown+1,F ; +1 - bra TFT_surface_compass_heading_com3 + movff lo,sub_a+0 + movff hi,sub_a+1 + movff compass_heading_shown+0,sub_b+0 + movff compass_heading_shown+1,sub_b+1 + call subU16 + btfsc neg_flag + bra TFT_surface_compass_heading_com2 ; shown > actual + ; shown < actual + banksel compass_heading_shown + infsnz compass_heading_shown+0,F + incf compass_heading_shown+1,F ; +1 + bra TFT_surface_compass_heading_com3 TFT_surface_compass_heading_com2: - banksel compass_heading_shown - movlw d'1' - subwf compass_heading_shown+0,F - movlw d'0' - subwfb compass_heading_shown+1,F ; -1 + banksel compass_heading_shown + movlw d'1' + subwf compass_heading_shown+0,F + movlw d'0' + subwfb compass_heading_shown+1,F ; -1 TFT_surface_compass_heading_com3: - banksel common - movff compass_heading_shown+0,lo - movff compass_heading_shown+1,hi - bsf leftbind - output_16dp .2 ; Result is "0.000" - bcf leftbind - ; rearrange figures to "000" - movff buffer+2,buffer+0 - movff buffer+3,buffer+1 - movff buffer+4,buffer+2 - lfsr FSR2,buffer+3 - STRCAT "° " - rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 - clrf WREG - movff WREG,buffer+.7 ; limit to 7 chars - STRCAT_PRINT "" + banksel common + movff compass_heading_shown+0,lo + movff compass_heading_shown+1,hi + bsf leftbind + output_16dp .2 ; Result is "0.000" + bcf leftbind + ; rearrange figures to "000" + movff buffer+2,buffer+0 + movff buffer+3,buffer+1 + movff buffer+4,buffer+2 + lfsr FSR2,buffer+3 + STRCAT "° " + rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 + clrf WREG + movff WREG,buffer+.7 ; limit to 7 chars + STRCAT_PRINT "" - btfsc divemode - return ; Done for divemode. - ; Show bearing on the surface? - btfss compass_bearing_set - return ; No, return - btfsc premenu ; "Bearing?" shown? - return ; Yes, return - bra TFT_surface_compass_bearing + btfsc divemode + return ; Done for divemode + ; Show bearing on the surface? + btfss compass_bearing_set + return ; No, return + btfsc premenu ; "Bearing?" shown? + return ; Yes, return + bra TFT_surface_compass_bearing - global TFT_dive_compass_heading + global TFT_dive_compass_heading TFT_dive_compass_heading: - rcall compass_heading_common -; ; ToDo - these are for development only, hardcoding the bearing position -; ; 244° : SW - W -; movlw low(d'244') -; movff WREG,compass_bearing+0 -; movlw high(d'244') -; movff WREG,compass_bearing+1 + rcall compass_heading_common +; ; ToDo - these are for development only, hard-coding the bearing position +; ; 244° : SW - W +; movlw low(d'244') +; movff WREG,compass_bearing+0 +; movlw high(d'244') +; movff WREG,compass_bearing+1 - movff compass_heading_shown+0,xA+0 - movff compass_heading_shown+1,xA+1 - ; xRD and xRDlft - ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale - movlw high(d'292') - movff WREG,sub_a+1 - movlw low(d'292') - movff WREG,sub_a+0 - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xA>292 - bra TFT_dive_compass_heading_1 ;yes - ; no, xA<=292 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 + movff compass_heading_shown+0,xA+0 + movff compass_heading_shown+1,xA+1 + ; xRD and xRDlft + ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale + movlw high(d'292') + movff WREG,sub_a+1 + movlw low(d'292') + movff WREG,sub_a+0 + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xA > 292 ? + bra TFT_dive_compass_heading_1 ; yes + ; no, xA<=292 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 TFT_dive_compass_heading_1: - ; 2. -80: left pixel offset from the center - movlw low( d'80' ) - subwf xA+0,1 - btfss STATUS,C - decf xA+1 - ; 3. save it to xRD - movff xA+0,xRD+0 - movff xA+1,xRD+1 - ; 4. add 160 (display px width) - movlw high(d'160') - addwf xA+1,1 - movlw low(d'160') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - ; 5. save it to xRDr - movff xA+0,xRDr+0 - movff xA+1,xRDr+1 + ; 2. -80: left pixel offset from the center + movlw low( d'80' ) + subwf xA+0,1 + btfss STATUS,C + decf xA+1 + ; 3. save it to xRD + movff xA+0,xRD+0 + movff xA+1,xRD+1 + ; 4. add 160 (display px width) + movlw high(d'160') + addwf xA+1,1 + movlw low(d'160') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + ; 5. save it to xRDr + movff xA+0,xRDr+0 + movff xA+1,xRDr+1 - btfss compass_bearing_set - bra TFT_dive_compass_ruler ; no value in the bearing, skip calc + btfss compass_bearing_set + bra TFT_dive_compass_ruler ; no value in the bearing, skip calc - ; we have bearing set, we will need xRD180 calculated - ; xRD180 is xRDr-180 - movff xRDr+1,sub_a+1 - movff xRDr+0,sub_a+0 - movlw high(d'180') - movff WREG,sub_b+1 - movlw low(d'180') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xRD180+1 - movff sub_c+0,xRD180+0 + ; we have bearing set, we will need xRD180 calculated + ; xRD180 is xRDr-180 + movff xRDr+1,sub_a+1 + movff xRDr+0,sub_a+0 + movlw high(d'180') + movff WREG,sub_b+1 + movlw low(d'180') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xRD180+1 + movff sub_c+0,xRD180+0 TFT_dive_compass_bearing_1: - ; calculate bearing position and visibility (ahead or behind) - bcf compass_bearing_vis ; default is not-visibly - bcf compass_bearing_ahd ; default is behind - ; get the bearing virtual display offset, store it to divA - movff compass_bearing+0,xA+0 - movff compass_bearing+1,xA+1 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - ; save it to reuse for upper/lower turns and ahead/behind checks - movff xA+1,divA+1 - movff xA+0,divA+0 + ; calculate bearing position and visibility (ahead or behind) + bcf compass_bearing_vis ; default is not-visibly + bcf compass_bearing_ahd ; default is behind + ; get the bearing virtual display offset, store it to divA + movff compass_bearing+0,xA+0 + movff compass_bearing+1,xA+1 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + ; save it to reuse for upper/lower turns and ahead/behind checks + movff xA+1,divA+1 + movff xA+0,divA+0 - ; check if it's ahead - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's ahead with an upper turn - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - movlw high(d'360') - addwf sub_b+1,1 - movlw low(d'360') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead with an upper turn + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + movlw high(d'360') + addwf sub_b+1,1 + movlw low(d'360') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's ahead with a lower turn - ; load the bearing offset into sub_a - movff divA+1,sub_a+1 - movff divA+0,sub_a+0 - movlw high(d'360') - addwf sub_a+1,1 - movlw low(d'360') - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - ; load the display offset back to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - rcall TFT_dive_compass_bearing_ap - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; check if it's ahead with a lower turn + ; load the bearing offset into sub_a + movff divA+1,sub_a+1 + movff divA+0,sub_a+0 + movlw high(d'360') + addwf sub_a+1,1 + movlw low(d'360') + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + ; load the display offset back to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + rcall TFT_dive_compass_bearing_ap + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; marker is not ahead of us, check if it's behind us - ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display - ; load the display offset back to sub_a - movff xRD180+0,sub_a+0 - movff xRD180+1,sub_a+1 - ; load the marker's offset into sub_b - movff divA+0,sub_b+0 - movff divA+1,sub_b+1 - rcall TFT_dive_compass_bearing_bp - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ; marker is not ahead of us, check if it's behind us + ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display + ; load the display offset back to sub_a + movff xRD180+0,sub_a+0 + movff xRD180+1,sub_a+1 + ; load the marker's offset into sub_b + movff divA+0,sub_b+0 + movff divA+1,sub_b+1 + rcall TFT_dive_compass_bearing_bp + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ;check if it's behind with the lower turn - movff xRD180+0,sub_a+0 - movff xRD180+1,sub_a+1 - movlw high(d'360') - addwf sub_a+1,1 - movlw low(d'360') - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - ; load the marker's offset into sub_b - movff divA+0,sub_b+0 - movff divA+1,sub_b+1 - rcall TFT_dive_compass_bearing_bp - ;test if we found it - btfsc compass_bearing_vis - bra TFT_dive_compass_bearing_dir + ;check if it's behind with the lower turn + movff xRD180+0,sub_a+0 + movff xRD180+1,sub_a+1 + movlw high(d'360') + addwf sub_a+1,1 + movlw low(d'360') + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + ; load the marker's offset into sub_b + movff divA+0,sub_b+0 + movff divA+1,sub_b+1 + rcall TFT_dive_compass_bearing_bp + ;test if we found it + btfsc compass_bearing_vis + bra TFT_dive_compass_bearing_dir - ; check if it's behind with the upper turn - movff divA+1,sub_b+1 - movff divA+0,sub_b+0 - movlw high(d'360') - addwf sub_b+1,1 - movlw low(d'360') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - rcall TFT_dive_compass_bearing_bp - bra TFT_dive_compass_bearing_dir + ; check if it's behind with the upper turn + movff divA+1,sub_b+1 + movff divA+0,sub_b+0 + movlw high(d'360') + addwf sub_b+1,1 + movlw low(d'360') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + rcall TFT_dive_compass_bearing_bp + bra TFT_dive_compass_bearing_dir TFT_dive_compass_bearing_ap: - ; xCM received in sub_a - ; xRD received in sub_b - ; 1/a. check if it's viewable from the left side - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xRD>divA - return ;no, - ; yes, store the RO=RP-RD for drawing - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 - ; 1/b. check if it's viewable from the right side? - movlw d'2' ; avoid thin mess on the side of the display - addwf sub_a+0,1 - btfsc STATUS, C - incf sub_a+1 - ; load the display offset right side into sub_b - movlw high(d'158') - addwf sub_b+1,1 - movlw low(d'158') - addwf sub_b+0,1 - btfsc STATUS,C - incf sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xRDr>xA(+2) - return ; no, - ; print the bearing lines on the screen - movff xC+0,xCM - bsf compass_bearing_vis ; set visible - bsf compass_bearing_ahd ; set ahead - return ; done, + ; xCM received in sub_a + ; xRD received in sub_b + ; 1/a. check if it's viewable from the left side + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xRD>divA + return ; no + ; yes, store the RO=RP-RD for drawing + movff sub_c+0,xC+0 + movff sub_c+1,xC+1 + ; 1/b. check if it's viewable from the right side? + movlw d'2' ; avoid thin mess on the side of the display + addwf sub_a+0,1 + btfsc STATUS, C + incf sub_a+1 + ; load the display offset right side into sub_b + movlw high(d'158') + addwf sub_b+1,1 + movlw low(d'158') + addwf sub_b+0,1 + btfsc STATUS,C + incf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xRDr > xA(+2) ? + return ; no + ; print the bearing lines on the screen + movff xC+0,xCM + bsf compass_bearing_vis ; set visible + bsf compass_bearing_ahd ; set ahead + return ; done, TFT_dive_compass_bearing_bp: - ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display - ; the marker's offset received in sub_b - ; the xRD180 display offset received in sub_a - ; xRD180 - xCM - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; CM>xRD180 - return ; no, not on screen - ; 160 - (X) - movlw high(d'158') - movff WREG,sub_a+1 - movlw low(d'158') - movff WREG,sub_a+0 - movff sub_c+1,sub_b+1 - movff sub_c+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; X>160 - return ; no, not on screen - ; check if not overflow - this sounds a double check... - movlw d'1' - cpfslt sub_c+1 - return ; high set, >160 - movlw d'158' - cpfslt sub_c+0 - return ; low >160 - ; print the bearing lines on the screen - movff sub_c+0,xCM - bsf compass_bearing_vis - return ; done + ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display + ; the marker's offset received in sub_b + ; the xRD180 display offset received in sub_a + ; xRD180 - xCM + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; CM > xRD180 ? + return ; no, not on screen + ; 160 - (X) + movlw high(d'158') + movff WREG,sub_a+1 + movlw low(d'158') + movff WREG,sub_a+0 + movff sub_c+1,sub_b+1 + movff sub_c+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; X>160 + return ; no, not on screen + ; check if not overflow - this sounds a double check... + movlw d'1' + cpfslt sub_c+1 + return ; high set, >160 + movlw d'158' + cpfslt sub_c+0 + return ; low >160 + ; print the bearing lines on the screen + movff sub_c+0,xCM + bsf compass_bearing_vis + return ; done TFT_dive_compass_bearing_dir: - ; check if bearing to heading, and calculate the direction - bcf compass_bearing_eq - btfss compass_bearing_vis - bra TFT_dive_compass_bearing_lr - btfss compass_bearing_ahd - bra TFT_dive_compass_bearing_lr - movff xCM,xA+0 - movlw d'80' - cpfseq xA+0 - bra TFT_dive_compass_bearing_lr - bsf compass_bearing_eq - bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler + ; check if bearing to heading, and calculate the direction + bcf compass_bearing_eq + btfss compass_bearing_vis + bra TFT_dive_compass_bearing_lr + btfss compass_bearing_ahd + bra TFT_dive_compass_bearing_lr + movff xCM,xA+0 + movlw d'80' + cpfseq xA+0 + bra TFT_dive_compass_bearing_lr + bsf compass_bearing_eq + bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler TFT_dive_compass_bearing_lr: - ; get the bearing virtual display offset - movff compass_bearing+0,xA+0 - movff compass_bearing+1,xA+1 - ; divA =IF (U10>292;U10;U10+360) - movlw high(d'292') - movff WREG,sub_a+1 - movlw low(d'292') - movff WREG,sub_a+0 - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xA>292 - bra TFT_dive_compass_bearing_lr_1 ;yes - ; no, xA<=292 - movlw high(d'360') - addwf xA+1,1 - movlw low(d'360') - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 + ; get the bearing virtual display offset + movff compass_bearing+0,xA+0 + movff compass_bearing+1,xA+1 + ; divA =IF (U10>292;U10;U10+360) + movlw high(d'292') + movff WREG,sub_a+1 + movlw low(d'292') + movff WREG,sub_a+0 + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xA > 292 ? + bra TFT_dive_compass_bearing_lr_1 ; yes + ; no, xA <= 292 + movlw high(d'360') + addwf xA+1,1 + movlw low(d'360') + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 TFT_dive_compass_bearing_lr_1: - ; 1. calculate whether bearing is to left or to right - bsf compass_bearing_lft ; to the left by default - ; xC: save center value to compare the direction to front value - movff xA+1,xC+1 - movff xA+0,xC+0 - ; xB: we need the left side for comparism... left = -180 - movff xA+1,sub_a+1 - movff xA+0,sub_a+0 - movlw high(d'180') - movff WREG,sub_b+1 - movlw low(d'180') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center - movff sub_c+0,xB+0 - ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) - movff xC+1,sub_a+1 - movff xC+0,sub_a+0 - movlw d'100' - addwf sub_a+0,1 - btfsc STATUS,C - incf sub_a+1 - movff xRD+1,sub_b+1 - movff xRD+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; xRD>xC+100 - bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 - ; no, xA = xRD+80 - movff xRD+1,xA+1 - movff xRD+0,xA+0 - movlw d'80' - addwf xA+0,1 - btfsc STATUS,C - incf xA+1 - bra TFT_dive_compass_bearing_lr_c + ; 1. calculate whether bearing is to left or to right + bsf compass_bearing_lft ; to the left by default + ; xC: save center value to compare the direction to front value + movff xA+1,xC+1 + movff xA+0,xC+0 + ; xB: we need the left side for comparison... left = -180 + movff xA+1,sub_a+1 + movff xA+0,sub_a+0 + movlw high(d'180') + movff WREG,sub_b+1 + movlw low(d'180') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center + movff sub_c+0,xB+0 + ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) + movff xC+1,sub_a+1 + movff xC+0,sub_a+0 + movlw d'100' + addwf sub_a+0,1 + btfsc STATUS,C + incf sub_a+1 + movff xRD+1,sub_b+1 + movff xRD+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; xRD>xC+100 + bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 + ; no, xA = xRD+80 + movff xRD+1,xA+1 + movff xRD+0,xA+0 + movlw d'80' + addwf xA+0,1 + btfsc STATUS,C + incf xA+1 + bra TFT_dive_compass_bearing_lr_c TFT_dive_compass_bearing_lr_2: - ; xA=xRD-280 - movff xRD+1,sub_a+1 - movff xRD+0,sub_a+0 - movlw high(d'280') - movff WREG,sub_b+1 - movlw low(d'280') - movff WREG,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - movff sub_c+1,xA+1 - movff sub_c+0,xA+0 - ;bra TFT_dive_compass_bearing_lr_c + ; xA=xRD-280 + movff xRD+1,sub_a+1 + movff xRD+0,sub_a+0 + movlw high(d'280') + movff WREG,sub_b+1 + movlw low(d'280') + movff WREG,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+1,xA+1 + movff sub_c+0,xA+0 + ;bra TFT_dive_compass_bearing_lr_c TFT_dive_compass_bearing_lr_c: - ; xB < xA < xC => right, otherwise left (default) - movff xA+1,sub_b+1 - movff xA+0,sub_b+0 - movff xB+1,sub_a+1 - movff xB+0,sub_a+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xA>xB ? - bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left - movff xA+1,sub_a+1 - movff xA+0,sub_a+0 - movff xC+1,sub_b+1 - movff xC+0,sub_b+0 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; xC>xA ? - bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left - bcf compass_bearing_lft + ; xB < xA < xC => right, otherwise left (default) + movff xA+1,sub_b+1 + movff xA+0,sub_b+0 + movff xB+1,sub_a+1 + movff xB+0,sub_a+0 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xA>xB ? + bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left + movff xA+1,sub_a+1 + movff xA+0,sub_a+0 + movff xC+1,sub_b+1 + movff xC+0,sub_b+0 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; xC>xA ? + bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left + bcf compass_bearing_lft TFT_dive_compass_ruler: - ; calculate mod15 for the ticks - movff xRD+0,xA+0 - movff xRD+1,xA+1 + ; calculate mod15 for the ticks + movff xRD+0,xA+0 + movff xRD+1,xA+1 movlw d'15' movwf xB+0 clrf xB+1 - call div16x16 ;xA/xB=xC with xA+0 as remainder - ; check xA+0, it has the remainder - movlw d'0' - cpfsgt xA+0 ; mod15 > 0 - bra TFT_dive_compass_ruler_1 ; no, RM = 0 - ; yes RM = 15 - RDmod15 - movlw d'15' - subfwb xA+0,1 + call div16x16 ; xA/xB=xC with xA+0 as remainder + ; check xA+0, it has the remainder + movlw d'0' + cpfsgt xA+0 ; mod15 > 0 + bra TFT_dive_compass_ruler_1 ; no, RM = 0 + ; yes RM = 15 - RDmod15 + movlw d'15' + subfwb xA+0,1 TFT_dive_compass_ruler_1: - ; xA+0 holds the RM, store it to 'lo' - movff xA+0,lo - ; init DD to zero, store it to 'hi' - clrf hi + ; xA+0 holds the RM, store it to 'lo' + movff xA+0,lo + ; init DD to zero, store it to 'hi' + clrf hi TFT_dive_compass_ruler_loop: - ; 1. check if we run of from the display - movlw d'159' ; Looks like 159 works because TFT_box limits the dispay - cpfslt lo,1 - bra TFT_dive_compass_ruler_lend ; xRM >= W - ; 2. Clear the tick area from DD to RM - in segments to avoid blinking - ; don't do a clear if we are at 0 (zero) otherwise it will blink - ; because of the width underflow - movlw d'0' - cpfsgt lo,1 - bra TFT_dive_compass_ruler_loop_zz - rcall TFT_dive_compass_clr_ruler + ; 1. check if we run of from the display + movlw d'159' ; Looks like 159 works because TFT_box limits the display + cpfslt lo,1 + bra TFT_dive_compass_ruler_lend ; xRM >= W + ; 2. Clear the tick area from DD to RM - in segments to avoid blinking + ; don't do a clear if we are at 0 (zero) otherwise it will blink + ; because of the width underflow + movlw d'0' + cpfsgt lo,1 + bra TFT_dive_compass_ruler_loop_zz + rcall TFT_dive_compass_clr_ruler TFT_dive_compass_ruler_loop_zz: - ; 3. Draw the markers @ RM - ; we receive RM in lo and DD in hi - movlw dm_custom_compass_tick_top_top - movwf win_top - movlw dm_custom_compass_tick_height - movwf win_height - movlw d'2' - movwf win_width+0 - clrf win_width+1 - movwf win_bargraph - movff lo,win_leftx2 ; 0..159 - call TFT_standard_color - call TFT_box - movlw dm_custom_compass_tick_bot_top - movwf win_top - movlw dm_custom_compass_tick_height - movwf win_height - call TFT_standard_color ; color in WREG is trashed, must be set again! - call TFT_box - ; 4. If D<82 and RM>79: means we put something over the center line - ; redraw the center line - movlw d'82' - cpfslt hi,1 - bra TFT_dive_compass_ruler_loop_zz2 - movlw d'79' - cpfsgt lo,1 - bra TFT_dive_compass_ruler_loop_zz2 - ;enough to print cline as bearing marker is not in the ticker area - movlw color_yellow - WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow + ; 3. Draw the markers @ RM + ; we receive RM in lo and DD in hi + movlw dm_custom_compass_tick_top_top + movwf win_top + movlw dm_custom_compass_tick_height + movwf win_height + movlw d'2' + movwf win_width+0 + clrf win_width+1 + movwf win_bargraph + movff lo,win_leftx2 ; 0..159 + call TFT_standard_color + call TFT_box + movlw dm_custom_compass_tick_bot_top + movwf win_top + movlw dm_custom_compass_tick_height + movwf win_height + call TFT_standard_color ; color in WREG is trashed, must be set again! + call TFT_box + ; 4. If D<82 and RM>79: means we put something over the center line + ; redraw the center line + movlw d'82' + cpfslt hi,1 + bra TFT_dive_compass_ruler_loop_zz2 + movlw d'79' + cpfsgt lo,1 + bra TFT_dive_compass_ruler_loop_zz2 + ; enough to print cline as bearing marker is not in the ticker area + movlw color_yellow + WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow TFT_dive_compass_ruler_loop_zz2: - ; 5. set D = RM + 2 : position after the 2px tick - movff lo,hi - movlw d'2' - addwf hi,F - ; 6. set RM = RM + 15 : position to the next tick - movlw d'15' - addwf lo,F - ; 7. loop - bra TFT_dive_compass_ruler_loop + ; 5. set D = RM + 2 : position after the 2px tick + movff lo,hi + movlw d'2' + addwf hi,F + ; 6. set RM = RM + 15 : position to the next tick + movlw d'15' + addwf lo,F + ; 7. loop + bra TFT_dive_compass_ruler_loop -TFT_dive_compass_ruler_lend: ; loop end - ; 8. clear the rest of the tick area if D<160 - movlw d'160' - cpfslt hi - bra TFT_dive_compass_ruler_lend2 ; D >= W - ; 9. position left to end of display to clear the remaining area - movlw d'159' - movwf lo - ; 10. clear it - rcall TFT_dive_compass_clr_ruler +TFT_dive_compass_ruler_lend: ; loop end + ; 8. clear the rest of the tick area if D<160 + movlw d'160' + cpfslt hi + bra TFT_dive_compass_ruler_lend2 ; D >= W + ; 9. position left to end of display to clear the remaining area + movlw d'159' + movwf lo + ; 10. clear it + rcall TFT_dive_compass_clr_ruler TFT_dive_compass_ruler_lend2: - ; done with the compass ruler, put the labels on the screen - ; get the RD abck to sub_b - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - ; hi stores the display position - clrf hi - clrf xHI - ; lo stores the last item's display position - clrf lo - clrf xLO - - movlw low( d'219' ) ; position of the label - movwf sub_a+0 - movlw high( d'219' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_1 - STRCPY_TEXT_PRINT tSW ; yes - print it -dcr_1: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'267' ) ; position of the label - movwf sub_a+0 - movlw high( d'267' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_2 - STRCPY_TEXT_PRINT tW ; yes - print it -dcr_2: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'309' ) ; position of the label - movwf sub_a+0 - movlw high( d'309' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_3 - STRCPY_TEXT_PRINT tNW ; yes - print it -dcr_3: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'358' ) ; position of the label - movwf sub_a+0 - movlw high( d'358' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_4 - STRCPY_TEXT_PRINT tN ; yes - print it -dcr_4: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'399' ) ; position of the label - movwf sub_a+0 - movlw high( d'399' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_5 - STRCPY_TEXT_PRINT tNE ; yes - print it -dcr_5: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; done with the compass ruler, put the labels on the screen + ; get the RD abck to sub_b + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + ; hi stores the display position + clrf hi + clrf xHI + ; lo stores the last item's display position + clrf lo + clrf xLO - movlw low( d'448' ) ; position of the label - movwf sub_a+0 - movlw high( d'448' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_6 - STRCPY_TEXT_PRINT tE ; yes - print it + movlw low( d'219' ) ; position of the label + movwf sub_a+0 + movlw high( d'219' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_1 + STRCPY_TEXT_PRINT tSW ; yes - print it +dcr_1: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'267' ) ; position of the label + movwf sub_a+0 + movlw high( d'267' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_2 + STRCPY_TEXT_PRINT tW ; yes - print it +dcr_2: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'309' ) ; position of the label + movwf sub_a+0 + movlw high( d'309' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_3 + STRCPY_TEXT_PRINT tNW ; yes - print it +dcr_3: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'358' ) ; position of the label + movwf sub_a+0 + movlw high( d'358' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_4 + STRCPY_TEXT_PRINT tN ; yes - print it +dcr_4: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'399' ) ; position of the label + movwf sub_a+0 + movlw high( d'399' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_5 + STRCPY_TEXT_PRINT tNE ; yes - print it +dcr_5: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'448' ) ; position of the label + movwf sub_a+0 + movlw high( d'448' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_6 + STRCPY_TEXT_PRINT tE ; yes - print it dcr_6: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'489' ) ; position of the label - movwf sub_a+0 - movlw high( d'489' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_7 - STRCPY_TEXT_PRINT tSE ; yes - print it + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'489' ) ; position of the label + movwf sub_a+0 + movlw high( d'489' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_7 + STRCPY_TEXT_PRINT tSE ; yes - print it dcr_7: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'538' ) ; position of the label - movwf sub_a+0 - movlw high( d'538' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_8 - STRCPY_TEXT_PRINT tS ; yes - print it + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'538' ) ; position of the label + movwf sub_a+0 + movlw high( d'538' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_8 + STRCPY_TEXT_PRINT tS ; yes - print it dcr_8: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'579' ) ; position of the label + movwf sub_a+0 + movlw high( d'579' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_9 + STRCPY_TEXT_PRINT tSW ; yes - print it +dcr_9: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'627' ) ; position of the label + movwf sub_a+0 + movlw high( d'627' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_10 + STRCPY_TEXT_PRINT tW ; yes - print it +dcr_10: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + movlw low( d'669' ) ; position of the label + movwf sub_a+0 + movlw high( d'669' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_11 + STRCPY_TEXT_PRINT tNW ; yes - print it +dcr_11: + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - movlw low( d'579' ) ; position of the label - movwf sub_a+0 - movlw high( d'579' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_9 - STRCPY_TEXT_PRINT tSW ; yes - print it -dcr_9: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'627' ) ; position of the label - movwf sub_a+0 - movlw high( d'627' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_10 - STRCPY_TEXT_PRINT tW ; yes - print it -dcr_10: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'669' ) ; position of the label - movwf sub_a+0 - movlw high( d'669' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_11 - STRCPY_TEXT_PRINT tNW ; yes - print it -dcr_11: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - - movlw low( d'718' ) ; position of the label - movwf sub_a+0 - movlw high( d'718' ) - rcall TFT_dive_compass_label_proc ; check if the label should be on screen - btfss print_compass_label ; Yes? - bra dcr_12 - STRCPY_TEXT_PRINT tN ; yes - print it + movlw low( d'718' ) ; position of the label + movwf sub_a+0 + movlw high( d'718' ) + rcall TFT_dive_compass_label_proc ; check if the label should be on screen + btfss print_compass_label ; Yes? + bra dcr_12 + STRCPY_TEXT_PRINT tN ; yes - print it dcr_12: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker TFT_dive_compass_label_end: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - ; restore lo and hi for the final cleanup - movff xLO,lo - movff xHI,hi - ; clear the rest of the SQ area if there are more space - movlw d'159' - cpfslt hi - bra TFT_dive_compass_label_end2 ; D >= 160, no more space - ; position left to end of display to clear the remaining area - movlw d'158' - movwf lo - ; clear it - rcall TFT_dive_compass_clr_label + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; restore lo and hi for the final cleanup + movff xLO,lo + movff xHI,hi + ; clear the rest of the SQ area if there are more space + movlw d'159' + cpfslt hi + bra TFT_dive_compass_label_end2 ; D >= 160, no more space + ; position left to end of display to clear the remaining area + movlw d'158' + movwf lo + ; clear it + rcall TFT_dive_compass_clr_label TFT_dive_compass_label_end2: - rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker - ; do we have bearing set? - btfsc compass_bearing_set - bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) - rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) - rcall TFT_dive_compass_dir_rclr - bra TFT_dive_compass_text + rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker + ; do we have bearing set? + btfsc compass_bearing_set + bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) + rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) + rcall TFT_dive_compass_dir_rclr + bra TFT_dive_compass_text TFT_dive_compass_dir_text: - ; bearing set, but does it point to heading? - btfss compass_bearing_eq - bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir - rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers - rcall TFT_dive_compass_dir_rclr - bra TFT_dive_compass_text + ; bearing set, but does it point to heading? + btfss compass_bearing_eq + bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir + rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers + rcall TFT_dive_compass_dir_rclr + bra TFT_dive_compass_text TFT_dive_compass_dir_text_2: - movlw color_green - call TFT_set_color - btfsc compass_bearing_lft - bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker + movlw color_green + call TFT_set_color + btfsc compass_bearing_lft + bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker ;TFT_dive_compass_text_rdir: - WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT ">>" - ; do not forget to clear the left - rcall TFT_dive_compass_dir_lclr - bra TFT_dive_compass_text + WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT ">>" + ; do not forget to clear the left + rcall TFT_dive_compass_dir_lclr + bra TFT_dive_compass_text TFT_dive_compass_dir_ldir: - WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT "<<" - ; do not forget to clear the right - rcall TFT_dive_compass_dir_rclr - ;bra TFT_dive_compass_text + WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT "<<" + ; do not forget to clear the right + rcall TFT_dive_compass_dir_rclr + ;bra TFT_dive_compass_text TFT_dive_compass_text: - ; Clear some unused space on the right mH - WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right + ; Clear some unused space on the right mH + WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right - ; Text output - call TFT_standard_color - WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row - rcall TFT_surface_compass_heading_com ; Show "000° N" - return + ; Text output + call TFT_standard_color + WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row + rcall TFT_surface_compass_heading_com ; Show "000° N" + return TFT_dive_compass_dir_lclr: - WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT " " - return + WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT " " + return TFT_dive_compass_dir_rclr: - WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 - STRCPY_PRINT " " - return + WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 + STRCPY_PRINT " " + return TFT_dive_compass_label_proc: - movwf sub_a+1 - movlw d'14' - movwf up ; cardinal width in px - bcf print_compass_label - ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? - ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): - movff xRD+0,sub_b+0 - movff xRD+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfsc neg_flag ; >=0? - return ; No - ; store the RO=RP-RD for drawing - movff sub_c+0,xC+0 - movff sub_c+1,xC+1 + movwf sub_a+1 + movlw d'14' + movwf up ; cardinal width in px + bcf print_compass_label + ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? + ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): + movff xRD+0,sub_b+0 + movff xRD+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfsc neg_flag ; >=0? + return ; No + ; store the RO=RP-RD for drawing + movff sub_c+0,xC+0 + movff sub_c+1,xC+1 - ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 - ; if already above, no need to process the rest of the labels - movff up,WREG ; take care about the width - addwf sub_a+0,1 - btfsc STATUS, C - incf sub_a+1 + ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 + ; if already above, no need to process the rest of the labels + movff up,WREG ; take care about the width + addwf sub_a+0,1 + btfsc STATUS, C + incf sub_a+1 - movff xRDr+0,sub_b+0 - movff xRDr+1,sub_b+1 - call subU16 ; sub_c = sub_a - sub_b - btfss neg_flag ; ? <0 - bra TFT_dive_compass_label_end ; No + movff xRDr+0,sub_b+0 + movff xRDr+1,sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + btfss neg_flag ; ? <0 + bra TFT_dive_compass_label_end ; No - ; 2. restore RO=RP-RD from 1/a. - movff xC+0,lo + ; 2. restore RO=RP-RD from 1/a. + movff xC+0,lo - ; 3. Clear the segment from DD(hi) to lo - ; don't do a clear if we are at 0 (zero) otherwise it will blink - ; ?because of the width underflow? - movlw d'1' - cpfsgt lo - bra TFT_dive_compass_label_proc_p - rcall TFT_dive_compass_clr_label + ; 3. Clear the segment from DD(hi) to lo + ; don't do a clear if we are at 0 (zero) otherwise it will blink + ; ?because of the width underflow? + movlw d'1' + cpfsgt lo + bra TFT_dive_compass_label_proc_p + rcall TFT_dive_compass_clr_label TFT_dive_compass_label_proc_p: - ; 4. print the SQ on the screen - call TFT_standard_color - bsf print_compass_label + ; 4. print the SQ on the screen + call TFT_standard_color + bsf print_compass_label ;TFT_dive_compass_label_print: - movlw dm_custom_compass_label_row - movff WREG,win_top - movff lo,win_leftx2 - movlw FT_SMALL - movff WREG,win_font - ; 6. retain the new display positions - movff lo,hi - movff up,WREG - addwf hi,F - movff lo,xLO - movff hi,xHI - return + movlw dm_custom_compass_label_row + movff WREG,win_top + movff lo,win_leftx2 + movlw FT_SMALL + movff WREG,win_font + ; 6. retain the new display positions + movff lo,hi + movff up,WREG + addwf hi,F + movff lo,xLO + movff hi,xHI + return TFT_dive_compass_c_mk: - ; Common task to draw center line and marker - ; until a proper implementation make it simple: - rcall TFT_dive_compass_mk - movlw color_yellow - WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow - return + ; Common task to draw center line and marker + ; until a proper implementation make it simple: + rcall TFT_dive_compass_mk + movlw color_yellow + WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow + return TFT_dive_compass_mk: - ; draw the bearing on the screen if visible and if we just put something over it - btfss compass_bearing_set - return ; bearing_set=0 nothing to display + ; draw the bearing on the screen if visible and if we just put something over it + btfss compass_bearing_set + return ; bearing_set=0 nothing to display - btfss compass_bearing_vis - return ; bearing set but not visible + btfss compass_bearing_vis + return ; bearing set but not visible - ; save lo/hi from trashing - movff lo,xA+0 - movff hi,xA+1 + ; save lo/hi from trashing + movff lo,xA+0 + movff hi,xA+1 - ; did we just update the marker's position? - ; DD.......DD - ; CM+2>=DD(old) or CM-2<=DD - ; ToDo + ; did we just update the marker's position? + ; DD.......DD + ; CM+2>=DD(old) or CM-2<=DD + ; ToDo - btfss compass_bearing_ahd - bra TFT_dive_compass_mk_rear + btfss compass_bearing_ahd + bra TFT_dive_compass_mk_rear ;TFT_dive_compass_mk_front: - clrf lo - movff xCM,lo - bsf print_compass_label ; set=green marker - rcall TFT_dive_compass_mk_print - bcf print_compass_label - bra TFT_dive_compass_mk_end + clrf lo + movff xCM,lo + bsf print_compass_label ; set=green marker + rcall TFT_dive_compass_mk_print + bcf print_compass_label + bra TFT_dive_compass_mk_end TFT_dive_compass_mk_rear: - clrf lo - movff xCM,lo - bcf print_compass_label ; set=red marker - rcall TFT_dive_compass_mk_print + clrf lo + movff xCM,lo + bcf print_compass_label ; set=red marker + rcall TFT_dive_compass_mk_print TFT_dive_compass_mk_end: - movff xA+0,lo - movff xA+1,hi - return + movff xA+0,lo + movff xA+1,hi + return TFT_dive_compass_mk_print: - movlw d'1' - cpfsgt lo - bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line - movlw d'2' - subwf lo,0 -; movff WREG,win_leftx2 - rcall TFT_dive_compass_mk_print_3 + movlw d'1' + cpfsgt lo + bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line + movlw d'2' + subwf lo,0 +; movff WREG,win_leftx2 + rcall TFT_dive_compass_mk_print_3 TFT_dive_compass_mk_print_2: - ; save hi/lo - movff hi,divA+1 - movff lo,divA+0 - ; clear the middle of the bearing marker - movff lo,hi - movlw d'2' - addwf lo,1 - rcall TFT_dive_compass_clr_label - ; restore hi/lo - movff divA+1,hi - movff divA+0,lo - ; print a dot on the middle - movff lo,WREG - rcall TFT_dive_compass_mk_print_dot - ; finally print the right marker line - movlw d'2' - addwf lo,0 -; rcall TFT_dive_compass_mk_print_3 -; return + ; save hi/lo + movff hi,divA+1 + movff lo,divA+0 + ; clear the middle of the bearing marker + movff lo,hi + movlw d'2' + addwf lo,1 + rcall TFT_dive_compass_clr_label + ; restore hi/lo + movff divA+1,hi + movff divA+0,lo + ; print a dot on the middle + movff lo,WREG + rcall TFT_dive_compass_mk_print_dot + ; finally print the right marker line + movlw d'2' + addwf lo,0 +; rcall TFT_dive_compass_mk_print_3 +; return TFT_dive_compass_mk_print_3: - movwf win_leftx2 - movlw dm_custom_compass_label_row - movwf win_top - movlw dm_custom_compass_label_height-.2 - movwf win_height - bra TFT_dive_compass_mk_print_4 + movwf win_leftx2 + movlw dm_custom_compass_label_row + movwf win_top + movlw dm_custom_compass_label_height-.2 + movwf win_height + bra TFT_dive_compass_mk_print_4 TFT_dive_compass_mk_print_dot: - movwf win_leftx2 - movlw dm_custom_compass_label_row + .9 - movwf win_top - movlw d'4' - movwf win_height + movwf win_leftx2 + movlw dm_custom_compass_label_row + .9 + movwf win_top + movlw d'4' + movwf win_height TFT_dive_compass_mk_print_4: - movlw .158 - cpfslt win_leftx2 - bra TFT_dive_compass_mk_print_5 - movlw d'2' - movwf win_width+0 - clrf win_width+1 - movwf win_bargraph - movlw color_green - btfss print_compass_label - movlw color_red - call TFT_set_color - call TFT_box + movlw .158 + cpfslt win_leftx2 + bra TFT_dive_compass_mk_print_5 + movlw d'2' + movwf win_width+0 + clrf win_width+1 + movwf win_bargraph + movlw color_green + btfss print_compass_label + movlw color_red + call TFT_set_color + call TFT_box TFT_dive_compass_mk_print_5: - banksel common - return + banksel common + return TFT_dive_compass_clr_label: - movlw dm_custom_compass_label_row-.2 ; set top & height - movff WREG,win_top - movlw dm_custom_compass_label_height+.2 - movff WREG,win_height - rcall TFT_dive_compass_clear - return + movlw dm_custom_compass_label_row-.2 ; set top & height + movff WREG,win_top + movlw dm_custom_compass_label_height+.2 + movff WREG,win_height + rcall TFT_dive_compass_clear + return TFT_dive_compass_clr_ruler: - ; top tick - movlw dm_custom_compass_tick_top_top ; set top & height - movff WREG,win_top - movlw dm_custom_compass_tick_height - movff WREG,win_height - rcall TFT_dive_compass_clear - ;bottom tick - movlw dm_custom_compass_tick_bot_top ; set top & height - movff WREG,win_top - movlw dm_custom_compass_tick_height - movff WREG,win_height -; rcall TFT_dive_compass_clear -; return + ; top tick + movlw dm_custom_compass_tick_top_top ; set top & height + movff WREG,win_top + movlw dm_custom_compass_tick_height + movff WREG,win_height + rcall TFT_dive_compass_clear + ;bottom tick + movlw dm_custom_compass_tick_bot_top ; set top & height + movff WREG,win_top + movlw dm_custom_compass_tick_height + movff WREG,win_height +; rcall TFT_dive_compass_clear +; return TFT_dive_compass_clear: - ; we receive RM in lo and DD in hi - ; calculate width = RM-D - movff hi,WREG - subwf lo,W - bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do - movwf win_width+0 ; RM-DD - movwf win_bargraph - clrf win_width+1 - movlw .1 - cpfsgt win_width+0 - bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) - movff hi,win_leftx2 - movlw color_black - call TFT_set_color - call TFT_box + ; we receive RM in lo and DD in hi + ; calculate width = RM-D + movff hi,WREG + subwf lo,W + bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do + movwf win_width+0 ; RM-DD + movwf win_bargraph + clrf win_width+1 + movlw .1 + cpfsgt win_width+0 + bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) + movff hi,win_leftx2 + movlw color_black + call TFT_set_color + call TFT_box TFT_dive_compass_clear3: - return + return tft_compass_cardinal: - btfsc hi,0 ; Heading >255°? - bra tft_compass_cardinal2 ; Yes must be W, NW or N - ; No, Must be W, SW, S, SE, E, NE or N - movlw .23 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_N - movlw .68 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_NE - movlw .113 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_E - movlw .158 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_SE - movlw .203 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_S - movlw .248 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_SW - bra tft_compass_cardinal_W + btfsc hi,0 ; Heading >255°? + bra tft_compass_cardinal2 ; Yes must be W, NW or N + ; No, Must be W, SW, S, SE, E, NE or N + movlw .23 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_N + movlw .68 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_NE + movlw .113 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_E + movlw .158 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_SE + movlw .203 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_S + movlw .248 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_SW + bra tft_compass_cardinal_W tft_compass_cardinal2: - movlw .37 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_W - movlw .82 - subwf lo,W - btfss STATUS,C - bra tft_compass_cardinal_NW -; bra tft_compass_cardinal_N + movlw .37 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_W + movlw .82 + subwf lo,W + btfss STATUS,C + bra tft_compass_cardinal_NW +; bra tft_compass_cardinal_N + tft_compass_cardinal_N: - STRCAT_TEXT tN - return + STRCAT_TEXT tN + return tft_compass_cardinal_NE: - STRCAT_TEXT tNE - return + STRCAT_TEXT tNE + return tft_compass_cardinal_E: - STRCAT_TEXT tE - return + STRCAT_TEXT tE + return tft_compass_cardinal_SE: - STRCAT_TEXT tSE - return + STRCAT_TEXT tSE + return tft_compass_cardinal_S: - STRCAT_TEXT tS - return + STRCAT_TEXT tS + return tft_compass_cardinal_SW: - STRCAT_TEXT tSW - return + STRCAT_TEXT tSW + return tft_compass_cardinal_W: - STRCAT_TEXT tW - return + STRCAT_TEXT tW + return tft_compass_cardinal_NW: - STRCAT_TEXT tNW - return + STRCAT_TEXT tNW + return compass_heading_common: call speed_normal - movlw compass_averaging ; numbers of extra averaging - movwf up + movlw compass_averaging ; numbers of extra averaging + movwf up compass_heading_common2: - rcall TFT_get_compass - decfsz up,F - bra compass_heading_common2 - extern compass - call compass ; Do compass corrections. - banksel common + rcall TFT_get_compass + decfsz up,F + bra compass_heading_common2 + call compass ; Do compass corrections. + banksel common - ; More then compass_fast_treshold? - movff compass_heading_old+0,sub_a+0 - movff compass_heading_old+1,sub_a+1 - movff compass_heading+0,sub_b+0 - movff compass_heading+1,sub_b+1 - call sub16 - btfss neg_flag ; <0? - bra compass_heading_common3 ; No, test for threshold - ; Yes, subtract the other way round - movff compass_heading+0,sub_a+0 - movff compass_heading+1,sub_a+1 - movff compass_heading_old+0,sub_b+0 - movff compass_heading_old+1,sub_b+1 - call sub16 + ; More then compass_fast_treshold? + movff compass_heading_old+0,sub_a+0 + movff compass_heading_old+1,sub_a+1 + movff compass_heading+0,sub_b+0 + movff compass_heading+1,sub_b+1 + call sub16 + btfss neg_flag ; <0? + bra compass_heading_common3 ; No, test for threshold + ; Yes, subtract the other way round + movff compass_heading+0,sub_a+0 + movff compass_heading+1,sub_a+1 + movff compass_heading_old+0,sub_b+0 + movff compass_heading_old+1,sub_b+1 + call sub16 compass_heading_common3: - movff compass_heading+0,compass_heading_old+0 ; copy new "old" - movff compass_heading+1,compass_heading_old+1 + movff compass_heading+0,compass_heading_old+0 ; copy new "old" + movff compass_heading+1,compass_heading_old+1 - bcf compass_fast_mode - movlw compass_fast_treshold - cpfslt sub_c+0 ; > compass_fast_treshold? - bsf compass_fast_mode ; Yes! + bcf compass_fast_mode + movlw compass_fast_treshold + cpfslt sub_c+0 ; > compass_fast_treshold? + bsf compass_fast_mode ; Yes! - btfss compass_fast_mode ; In fast mode? - return ; No. - ; Yes. - movff compass_heading+0,lo - movff compass_heading+1,hi - call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required - movff lo,compass_heading_shown+0 - movff hi,compass_heading_shown+1 - return + btfss compass_fast_mode ; In fast mode? + return ; No. + ; Yes. + movff compass_heading+0,lo + movff compass_heading+1,hi + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + movff lo,compass_heading_shown+0 + movff hi,compass_heading_shown+1 + return TFT_get_compass: - call I2C_RX_compass ; Test Compass - call I2C_RX_accelerometer ; Test Accelerometer - call compass_filter ; Filter Raw compass + accel readings. - banksel common - return + call I2C_RX_compass ; Test Compass + call I2C_RX_accelerometer ; Test Accelerometer + call compass_filter ; Filter Raw compass + accel readings. + banksel common + return - global TFT_surf_set_bearing + global TFT_surf_set_bearing TFT_surf_set_bearing: - btfsc premenu - return ; Already shown, return - bsf premenu ; set flag - WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right - WIN_SMALL surf_compass_bear_column,surf_compass_bear_row - WIN_COLOR color_yellow - bsf win_invert - STRCPY_TEXT_PRINT tSetHeading ; 7 chars - bcf win_invert - return + btfsc premenu + return ; Already shown, return + bsf premenu ; set flag + WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right + WIN_SMALL surf_compass_bear_column,surf_compass_bear_row + WIN_COLOR color_yellow + bsf win_invert + STRCPY_TEXT_PRINT tSetHeading ; 7 chars + bcf win_invert + return - END + END