Mercurial > public > hwos_code
diff src/gaslist.asm @ 0:11d4fc797f74
init
author | heinrichsweikamp |
---|---|
date | Wed, 24 Apr 2013 19:22:45 +0200 |
parents | |
children | 440e537e19d6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gaslist.asm Wed Apr 24 19:22:45 2013 +0200 @@ -0,0 +1,632 @@ +;============================================================================= +; +; File gaslist.asm +; +; Managing OSTC3 gas list +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= +; HISTORY +; 2011-08-11 : [jDG] Creation. + +#include "ostc3.inc" ; Mandatory header +#include "convert.inc" +#include "math.inc" ; div16x16 for MOD calculations +#include "strings.inc" +#include "tft.inc" +#include "tft_outputs.inc" + +#include "shared_definitions.h" + + CBLOCK tmp+0x40 ; Keep space for menu processor + gaslist_gas + gaslist_O2 + gaslist_He + gaslist_depth + gaslist_Type + ; Reserved to tmp+0x5F + ENDC + + extern convert_mbar_to_feet + +gui CODE +;============================================================================= +; Append gas description to current string. +; Input: PRODL : gas number (0..4) +; FSR2 : Current string position. +; Output: Text appended into buffer pointed by FSR2. + extern customview_show_mix + global gaslist_strcat_gas +gaslist_strcat_gas: + rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) + ; Retrieve gas definition: +gaslist_strcat_gas_0: + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,gaslist_O2 + movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,gaslist_He + + movff gaslist_O2,lo + movff gaslist_He,hi + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + return + + +;============================================================================= +; Append current mix to current string (For divemode) +; Input: FSR2 : Current string position. +; Output: Text appended into buffer pointed by FSR2. + global gaslist_strcat_gasx +gaslist_strcat_gasx: ; Show current O2/He mix + STRCAT_TEXT tGas + STRCAT ": " + movff char_I_O2_ratio,lo + movff char_I_He_ratio,hi + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + return + + global gaslist_show_type + extern tGasDisabled + extern tDilDisabled +gaslist_show_type: + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,gaslist_Type + STRCAT_TEXT tType + lfsr FSR1,tGasDisabled ; Base text number + btfsc ccr_diluent_setup ; In CCR setup? + lfsr FSR1,tDilDisabled ; Base text number + movff gaslist_Type,WREG ; 0-3 + rlncf WREG ; x2 + addwf FSR1L,F + movlw .0 + addwfc FSR1H,F + call strcat_text + return + + global gaslist_toggle_type +gaslist_toggle_type: + movf gaslist_gas,W + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movff PLUSW1,gaslist_Type + incf gaslist_Type,F ; 0-3/0-2 + btfsc ccr_diluent_setup ; In CCR setup? + bra gaslist_toggle_type2 ; Yes + btfsc gaslist_Type,2 ; >3? + clrf gaslist_Type ; Clear to zero + movff gaslist_Type,PLUSW1 ; Copy back result + return + +gaslist_toggle_type2: + movlw .3 + cpfslt gaslist_Type ; >2? + clrf gaslist_Type ; Clear to zero + movf gaslist_gas,W + movff gaslist_Type,PLUSW1 ; Copy back result + return + + global gaslist_setSP +gaslist_setSP: + movff PRODL,gaslist_gas ; 0-4 + return + + extern tbar + global gaslist_strcat_setpoint + global gaslist_strcat_setpoint_0 +gaslist_strcat_setpoint: + call gaslist_setSP +gaslist_strcat_setpoint_0: + bsf leftbind + btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bra gaslist_strcat_setpoint2 ; Short version + STRCAT_TEXT tSP + incf gaslist_gas,W + movwf lo + output_8 + bcf leftbind + PUTC ":" +gaslist_strcat_setpoint2: ; Short version + lfsr FSR1,opt_gas_type + btfsc divemode + bra gaslist_strcat_setpoint4 ; no "*" in divemode + movf gaslist_gas,W + decf PLUSW1,W ; Type-1 into WREG + bnz gaslist_strcat_setpoint3 ; Not "first" + PUTC "*" + bra gaslist_strcat_setpoint4 +gaslist_strcat_setpoint3: + PUTC " " +gaslist_strcat_setpoint4: + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_cbar + movf PLUSW1,W + movwf lo + clrf hi + bsf leftbind + output_16dp d'3' + btfsc divemode + bra gaslist_strcat_setpoint5 ; Skip text in divemode + STRCAT_TEXT tbar +gaslist_strcat_setpoint5: + PUTC " " + ; Read switch depth + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,lo + bra gaslist_strcat_4 ; And return... + +;---------------------------------------------------------------------------- +; Append gas description to current string. +; Input: PRODL : gas number (0..4) +; FSR2 : Current string position. +; Output: Text appended into buffer pointed by FSR2. +; +; NOTE: used in the menu-tree for the MENU_CALLBACK entry. + +gaslist_strcat_gas_better: ; Yes, check if this is a "better gas" + movlw .0 + movff WREG,win_invert + incf gaslist_gas,W ; gaslist_gas+1 -> WREG + cpfseq better_gas_number ; 1-5 for OC/Bailout and 6-10 for diluents + return + movlw color_yellow ; show in yellow + call TFT_set_color + movlw .1 + movff WREG,win_invert ; and invert + return + + global gaslist_strcat_gas_mod +gaslist_strcat_gas_mod: + rcall gaslist_setgas ; Sets gaslist_gas (0-4 for OC/Bailout, 5-9 for Diluents) + + global gaslist_gastitle +gaslist_gastitle: + btfsc short_gas_decriptions ; =1: Use short versions of gaslist_strcat_gas_mod and gaslist_strcat_setpoint + bra gaslist_gastitle2 ; Short version + STRCAT_TEXT tGas + incf gaslist_gas,W + movwf lo + bsf leftbind + output_8 + bcf leftbind + PUTC ":" + +gaslist_gastitle2: ; Short version + lfsr FSR1,opt_gas_type + btfsc divemode + bra gaslist_gastitle3 ; no "*" in divemode + movf gaslist_gas,W + decf PLUSW1,W ; Type-1 into WREG + bnz gaslist_gastitle1 ; Not "First" + PUTC "*" + bra gaslist_gastitle3 +gaslist_gastitle1: + PUTC " " +gaslist_gastitle3: ; Short version + call TFT_standard_color + + btfsc divemode ; In divemode? + rcall gaslist_strcat_gas_better ; Yes, check if this is a "better gas" + + movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) + movf PLUSW1,W + bnz gaslist_strcat_3 + call TFT_disabled_color +gaslist_strcat_3: + rcall gaslist_strcat_gas_0 + PUTC " " + ; Read switch depth + movf gaslist_gas,W ; (0-4 for OC/Bailout, 5-9 for Diluents) + lfsr FSR1,char_I_deco_gas_change + movff PLUSW1,lo + rcall gaslist_calc_mod ; Compute MOD into WREG + cpfsgt lo + bra gaslist_strcat_4 + TFT_WARNINGS_COLOR ; Turn red if bigger +gaslist_strcat_4: + TSTOSS opt_units ; 0=Meters, 1=Feets + bra gaslist_strcat_3_metric +;gaslist_strcat_3_imperial: + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 + STRCAT_TEXT tFeets ; "ft" + return + +gaslist_strcat_3_metric: + output_99 + STRCAT_TEXT tMeters ; "m" + return + +;---------------------------------------------------------------------------- +; Store current menu item, and display gas description later. +; Input: PRODL : gas number (0..4) +; NOTE: used in the menu-tree for the MENU_CALLBACK entry. + global gaslist_setgas +gaslist_setgas: + movff PRODL,gaslist_gas + movlw .5 + btfsc ccr_diluent_setup ; in CCR menus? + addwf gaslist_gas,F ; Yes, offset to gases 5-9 + return + + + global gaslist_cleanup_list ; Takes care that only one gas can be first and first has 0m change depth +gaslist_cleanup_list: + bcf ignore_last_edited_gas + movlw .0 + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + subwf gaslist_gas,F +gaslist_cleanup_list1: + clrf lo + lfsr FSR1,opt_gas_type ; Read opt_gas_type[WREG] + movlw .5 ; Check 5 gases + movwf hi +gaslist_cleanup_list2: + decf hi,w ; 0-4 + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + movff PLUSW1,hi_temp + movlw .1 + cpfseq hi_temp ; gas = first ? + bra gaslist_cleanup_list3 ; No + incf lo,F ; Yes, count "first gases" + + btfss ignore_last_edited_gas ; If we are not in the second-pass mode + bra gaslist_cleanup_list2b + + decf hi,w ; 0-4 + cpfseq gaslist_gas ; Do not disable last edited gas +gaslist_cleanup_list2b: + movff hi,lo_temp ; Keep the last "first gas" found +gaslist_cleanup_list3: + decfsz hi,F + bra gaslist_cleanup_list2 ; Loop + + tstfsz lo ; No gas active? + bra gaslist_cleanup_list4 ; No, at least one is active + + btfsc ccr_diluent_setup ; In CCR-Menu? + bra gaslist_cleanup_list3a ; Yes. + ; make gas1 first and zero + movlw .1 ; First + movwf lo_temp + movwf INDF1 + bra gaslist_cleanup_list5 ; Set change depth to zero + +gaslist_cleanup_list3a: + movlw .5 + addwf FSR1L,F + movlw .0 + addwfc FSR1H,F ; Setup to Diluents + ; make dil1 first and zero + movlw .1 ; First + movwf lo_temp + movwf INDF1 + bra gaslist_cleanup_list5 ; Set change depth to zero + +gaslist_cleanup_list4: + movlw .1 + cpfsgt lo ; More then one "first gas"? + bra gaslist_cleanup_list5 ; No, done. + ; More then one Gas is "first gas" + ; Disable last found "first gas" but keep it's change depth + decf lo_temp,W ; 0-4 + cpfseq gaslist_gas ; Do not disable last edited gas + bra gaslist_cleanup_list4b + ; Do not disable last edited gas + ; search again but ignore last edited gas + bsf ignore_last_edited_gas + bra gaslist_cleanup_list1 ; Loop until only one "first gas" is left + +gaslist_cleanup_list4b: + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + clrf PLUSW1 ; Disable gas + bra gaslist_cleanup_list ; Loop until only one "first gas" is left + +gaslist_cleanup_list5: + lfsr FSR1,char_I_deco_gas_change + decf lo_temp,W + btfsc ccr_diluent_setup ; In CCR-Menu? + addlw .5 ; Yes, adjust offset + clrf PLUSW1 ; Set First gas to zero m + return + +;---------------------------------------------------------------------------- +; Increment/Decrement O2 ratio + global gaslist_pO2 +gaslist_pO2: + movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,gaslist_He + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,gaslist_O2 + + incf gaslist_O2,F ; O2++ + movf gaslist_He,W + addwf gaslist_O2,W + movwf lo + movlw .101 + cpfslt lo ; O2+He<101? + decf gaslist_O2,F ; O2-- (Unchanged) + + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] + return + + global gaslist_mO2 +gaslist_mO2: + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,gaslist_O2 + + decf gaslist_O2,F + movlw gaslist_min_o2 + cpfslt gaslist_O2 + bra gaslist_mO2_1 + movlw gaslist_min_o2 + movwf gaslist_O2 +gaslist_mO2_1: + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] + return + +;---------------------------------------------------------------------------- +; Increment/Decrement He ratio + global gaslist_pHe +gaslist_pHe: + movf gaslist_gas,W + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movff PLUSW1,gaslist_O2 + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,gaslist_He + + incf gaslist_He,F ; He++ + movf gaslist_He,W + addwf gaslist_O2,W + movwf lo + movlw .101 + cpfslt lo ; O2+He<101? + decf gaslist_He,F ; Yes, He-- (Unchanged) + + movf gaslist_gas,W + movff gaslist_He,PLUSW1 ; And write back to opt_gas_He_ratio[WREG] + return + + global gaslist_mHe +gaslist_mHe: + movf gaslist_gas,W + lfsr FSR1,opt_gas_He_ratio ; Read opt_gas_He_ratio[WREG] + movff PLUSW1,gaslist_He + + decf gaslist_He,F + bnn gaslist_mHe_1 + clrf gaslist_He +gaslist_mHe_1: + movf gaslist_gas,W + movff gaslist_He,PLUSW1 ; And write back to opt_gas_He_ratio[WREG] + return + +;---------------------------------------------------------------------------- +; Increment/Decrement switch depth + global gaslist_pDepth +gaslist_pDepth: + movf gaslist_gas,W + lfsr FSR1,char_I_deco_gas_change + movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] + + incf gaslist_O2,F + movlw gaslist_max_change_depth + cpfsgt gaslist_O2 + bra gaslist_pDepth_1 + movlw gaslist_max_change_depth + movwf gaslist_O2 +gaslist_pDepth_1: + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + return + + global gaslist_mDepth +gaslist_mDepth: + movf gaslist_gas,W + lfsr FSR1,char_I_deco_gas_change + movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] + + decf gaslist_O2,F + btfsc STATUS,N + clrf gaslist_O2 + + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; And write back to char_I_deco_gas_change[WREG] + return + + global gaslist_spplus +gaslist_spplus: + movf gaslist_gas,W + lfsr FSR1,char_I_setpoint_cbar + movff PLUSW1,lo ; Read char_I_setpoint_cbar[WREG] + movlw gaslist_sp_stepsize + addwf lo,F + movlw gaslist_sp_max + cpfsgt lo + bra gaslist_spplus2 + movlw gaslist_sp_min + movwf lo +gaslist_spplus2: + movf gaslist_gas,W + movff lo,PLUSW1 ; Write back to char_I_setpoint_cbar + return + + global gaslist_spdepthplus +gaslist_spdepthplus: + movf gaslist_gas,W + bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,gaslist_O2 ; Read char_I_deco_gas_change[WREG] + incf gaslist_O2,F + movlw gaslist_max_change_depth + cpfsgt gaslist_O2 + bra gaslist_spdepthplus_1 + movlw gaslist_max_change_depth + movwf gaslist_O2 +gaslist_spdepthplus_1: + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; Write back to char_I_deco_gas_change[WREG] + return + +gaslist_spdepthplus3: + movlw .0 + movff WREG,char_I_setpoint_change+0 ; Reset to 0m + return + + global gaslist_spdepthminus +gaslist_spdepthminus: + movf gaslist_gas,W + bz gaslist_spdepthplus3 ; Setpoint 1 is always 0m + lfsr FSR1,char_I_setpoint_change + movff PLUSW1,gaslist_O2 ; Read opt_gas_O2_ratio[WREG] + decf gaslist_O2,F + btfsc STATUS,N + clrf gaslist_O2 + movf gaslist_gas,W + movff gaslist_O2,PLUSW1 ; And write back to opt_gas_O2_ratio[WREG] + return + +;---------------------------------------------------------------------------- +; Compute MOD from ppO2 Max and current O2 Ratio. +; +; Input: gaslist_gas = current gas index. +; opt_gas_O2_ratio[gaslist_gas] = current O2 ratio +; Output: WREG = MOD [m] +; +gaslist_calc_mod: + movf gaslist_gas,W ; Read current gas O2 ratio + lfsr FSR1,opt_gas_O2_ratio ; Read opt_gas_O2_ratio[WREG] + movf PLUSW1,W + + btfsc divemode ; In divemode? + bra gaslist_calc_mod_divemode ; Yes. + + ; Pamb max = ppO2 Max / O2 ratio + movwf xB+0 + clrf xB+1 + + movff opt_ppO2_max,WREG + mullw .10 + movff PRODL,xA+0 + movff PRODH,xA+1 + call div16x16 + + ; Prof = Pamb - 1bar. + movf xC+0,W + addlw -.10 + return + +gaslist_calc_mod_divemode: + extern TFT_color_code1 + movwf hi ; Copy O2% + movlw warn_gas_in_gaslist + call TFT_color_code1 ; Color-code current row in Gaslist (%O2 in hi), opt_ppO2_max as threshold + return +;---------------------------------------------------------------------------- + global gaslist_MOD_END +gaslist_MOD_END: + rcall gaslist_calc_mod ; Compute MOD into WREG + movwf lo ; Copy to lo + STRCAT_TEXT tEAD ; EAD: + TSTOSS opt_units ; 0=Meters, 1=Feets + bra gaslist_MOD_metric +;gaslist_MOD_imperial: + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 + STRCAT_TEXT tFeets ; "ft" + bra gaslist_MOD_common +gaslist_MOD_metric: + output_8 + STRCAT_TEXT tMeters ; m +gaslist_MOD_common: + PUTC "/" + STRCAT_TEXT tEND ; END: + rcall gaslist_calc_mod ; Output: WREG = MOD [m] + addlw .10 ; MOD=MOD+10m + movwf xB+0 + clrf xB+1 + movlw d'100' + movwf xA+0 + movf gaslist_He,W ; He value in % -> WREG + subwf xA+0,F ; xA+0 = 100 - He Value in % + clrf xA+1 + call mult16x16 ; xA*xB=xC + movff xC+0,xA+0 + movff xC+1,xA+1 + movlw d'100' + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC with xA as remainder + ; xC:2 = ((MOD+10) * 100 - HE Value in %) / 100 + movlw d'10' + subwf xC+0,F ; Subtract 10m... + movff xC+0,lo +; END 8Bit only +; movlw d'0' +; subwfb xC+1,F +; movff xC+1,hi + TSTOSS opt_units ; 0=Meters, 1=Feets + bra gaslist_END_metric +;gaslist_END_imperial: + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + bsf leftbind + output_16_3 + STRCAT_TEXT tFeets ; "ft" + return +gaslist_END_metric: + output_8 + STRCAT_TEXT tMeters ; m + return + +;---------------------------------------------------------------------------- + global gaslist_reset_mod_title +gaslist_reset_mod_title: + STRCAT_TEXT tDepthReset + +gaslist_reset_mod_title2: + rcall gaslist_calc_mod ; Compute MOD into WREG + movwf lo ; Copy to lo + + movf gaslist_gas,W ; Compare to switch depth + lfsr FSR1,char_I_deco_gas_change + movf PLUSW1,W + cpfslt lo + bra gaslist_strcat_4 ; And return... + TFT_WARNINGS_COLOR ; Turn red if bigger ! + bra gaslist_strcat_4 ; And return... + +;---------------------------------------------------------------------------- + global gaslist_reset_mod +gaslist_reset_mod: + rcall gaslist_calc_mod ; Compute MOD + movwf gaslist_depth + + movf gaslist_gas,W ; Read current gas O2 ratio + lfsr FSR1,char_I_deco_gas_change + movff gaslist_depth,PLUSW1 ; And save new change depth + return +;---------------------------------------------------------------------------- + END \ No newline at end of file