Mercurial > public > hwos_code
diff src/divemenu_tree.asm @ 623:c40025d8e750
3.03 beta released
author | heinrichsweikamp |
---|---|
date | Mon, 03 Jun 2019 14:01:48 +0200 |
parents | ca4556fb60b9 |
children | 185ba2f91f59 |
line wrap: on
line diff
--- a/src/divemenu_tree.asm Wed Apr 10 10:51:07 2019 +0200 +++ b/src/divemenu_tree.asm Mon Jun 03 14:01:48 2019 +0200 @@ -1,10 +1,10 @@ ;============================================================================= ; -; File divemenu_tree.asm REFACTORED VERSION V2.99e +; File divemenu_tree.asm combined next generation V3.03.4 ; ; OSTC dive mode menu ; -; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all rights reserved. ;============================================================================= ; HISTORY ; 2013-02-02 : [mH] Made out of menu_tree.asm @@ -19,10 +19,10 @@ extern timeout_divemode_menu2 extern restart_deco_engine_wo_ceiling - extern diveloop_loop4 + extern diveloop_menu_exit -dmenu_tree CODE +dmenu_tree CODE ;============================================================================= ; Main Menu @@ -30,27 +30,31 @@ do_return_main_divemenu: call menu_processor_double_pop ; drop exit line and back to last line incf selected_item,W ; item numbers start with 0, menu positions with 1 - movwf menupos1 ; position cursor where we came from + movwf menu_pos_cur ; position cursor where we came from bra do_main_divemenu_common global do_main_divemenu do_main_divemenu: call menu_processor_reset ; restart from first icon movlw .1 - movwf menupos1 ; set to first option in divemode menu + movwf menu_pos_cur ; set to first option in dive mode menu do_main_divemenu_common: + IFDEF _ccr_pscr btfsc FLAG_ccr_mode bra main_divemenu_loop ; goto CCR / pSCR Menu menu btfsc FLAG_pscr_mode bra main_divemenu_loop ; goto CCR / pSCR Menu menu + ENDIF main_divemenu_OC: - bcf FLAG_diluent_setup ; set to operations on OC gases - bcf is_bailout_menu + IFDEF _ccr_pscr + bcf is_diluent_menu ; selecting OC gases ... + bcf is_bailout_menu ; ... not for bailout reason + ENDIF IFDEF _cave_mode - btfss FLAG_cave_mode ; in cave mode? + btfss cave_mode ; in cave mode? bra main_divemenu_OC_no_cave ; NO - do OC menu without turn option MENU_BEGIN tMainMenu, .6 @@ -72,10 +76,13 @@ MENU_CALL tExit, do_exit_divemode_menu MENU_END +;============================================================================= + + IFDEF _ccr_pscr main_divemenu_loop: - bsf FLAG_diluent_setup ; set to operations on diluents - bcf is_bailout_menu ; flag as none-bailout menu + bsf is_diluent_menu ; selecting diluents ... + bcf is_bailout_menu ; ... (definitely) not for bailout reason btfsc FLAG_pscr_mode bra main_divemenu_pscr ; pSCR menu @@ -88,11 +95,15 @@ MENU_CALL tExit, do_exit_divemode_menu MENU_END + main_divemenu_pscr: + + IFDEF _external_sensor btfsc analog_o2_input ; do we have an analog input (OSTC cR)? bra main_divemenu_pscr_sensors ; YES btfsc optical_input ; do we have an optical input (OSTC 3)? bra main_divemenu_pscr_sensors ; YES + ENDIF main_divemenu_pscr_no_sensors: MENU_BEGIN tMainMenu, .6 @@ -104,6 +115,8 @@ MENU_CALL tExit, do_exit_divemode_menu MENU_END + + IFDEF _external_sensor main_divemenu_pscr_sensors: MENU_BEGIN tMainMenu, .6 MENU_CALL tDiveBailout, do_divemode_gaslist_bail @@ -113,7 +126,11 @@ MENU_DYNAMIC do_toggle_gf_label, do_toggle_gf MENU_CALL tExit, do_exit_divemode_menu MENU_END + ENDIF ; _external_sensor + ENDIF ; _ccr_pscr + +;============================================================================= do_toggle_gf: TSTOSS char_I_deco_model ; toggle GF only in GF modes - in GF mode? (0 = ZH-L16, 1 = ZH-L16-GF) @@ -121,10 +138,10 @@ TSTOSS opt_enable_aGF ; =1: aGF can be selected underwater bra do_main_divemenu_common ; NO - do nothing and return movlw index_gf_factors-1 ; custom view number one below GF factors - movwf menupos3 ; set custom view number - bsf toggle_customview ; initiate toggle to desired custom view -> GF factors + movwf active_customview ; set custom view number + bsf request_next_custview ; initiate toggle to desired custom view -> GF factors movlw .1 - movwf menupos1 ; set to first option in dive mode menu + movwf menu_pos_cur ; set to first option in dive mode menu MENU_BEGIN tDivemenu_ToggleGF, .2 MENU_CALL tDivemenu_ToggleGF, do_togglegf @@ -132,16 +149,16 @@ MENU_END do_togglegf: - bsf toggle_gf ; set command flag... + bsf request_toggle_GF ; set request flag bra do_exit_divemode_menu ; continue with exiting menu code do_reset_avg_set_mkr: movlw .1 - movwf menupos1 ; set to first option in dive mode menu + movwf menu_pos_cur ; set to first option in dive mode menu IFDEF _cave_mode - btfss FLAG_cave_mode ; in cave mode? + btfss cave_mode ; in cave mode? bra do_reset_average_no_cave ; NO - do menu without turn option MENU_BEGIN tDivemenu_Avg_Mkr, .4 @@ -161,82 +178,102 @@ do_reset_average: - bsf reset_average_depth ; set flag... - bra do_exit_divemode_menu ; ... and exit + bsf request_reset_avg ; request reset of resettable average depth and dive time + IFDEF _min_depth_option + bsf reset_trip_pressure ; request ISR to reset the min and max trip-wise pressures + ENDIF + bra do_exit_divemode_menu ; exit + do_set_marker: - bsf FLAG_set_marker ; set flag... - bra do_exit_divemode_menu ; ... and exit + bsf request_set_marker ; set request flag + bra do_exit_divemode_menu ; exit + IFDEF _cave_mode do_turn_dive: - bsf toggle_turn_dive ; set flag... - bra do_exit_divemode_menu ; ... and exit + bsf request_turn_dive ; set request flag + bra do_exit_divemode_menu ; exit ENDIF + IFDEF _external_sensor do_switch_sensor: ; entry point when coming from switch to sensor movlw .1 ; switch to sensor - movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP - ; enable all sensors - bsf use_O2_sensor1 - bsf use_O2_sensor2 - bsf use_O2_sensor3 + movff WREG,opt_ccr_mode ; =0: fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP bra do_switch_sp_com ; continue with common part + ENDIF + +;============================================================================= + + IFDEF _ccr_pscr do_switch_sp: ; entry point when coming from manual setpoint selection (CCR) - decf menupos1,W ; 1-5 -> 0-4 - lfsr FSR1,char_I_setpoint_cbar + decf menu_pos_cur,W ; 1-5 -> 0-4 + lfsr FSR1,opt_setpoint_cbar movff PLUSW1,char_I_const_ppO2 ; setup fixed setpoint - movff char_I_const_ppO2,WREG + IFDEF _external_sensor call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics - bcf setpoint_fallback ; clear fallback condition (stops fallback warning) + ENDIF + bcf sp_fallback ; clear fallback condition (stops fallback warning) clrf WREG ; switch to fixed SP movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP bra do_switch_sp_com + do_switch_sp_calc: ; entry point when coming from switch to calculated ppO2 (pSCR) - bcf setpoint_fallback ; clear fallback condition (stops fallback warning) - clrf WREG ; Switch to fixed SP + bcf sp_fallback ; clear fallback condition (stops fallback warning) + clrf WREG ; switch to fixed SP movff WREG,opt_ccr_mode ; =0: Fixed SP (CCR) / calculated (pSCR), =1: Sensor, =2: Auto SP movff WREG,char_I_const_ppO2 ; set setpoint to 0, this forces deco engine to take the computed ppO2 + ;bra do_switch_sp_com -do_switch_sp_com: ; merge point to common part - bsf event_occured ; set global event byte - bsf setpoint_changed ; set flag (for profile) + +do_switch_sp_com: ; common part + bsf event_occured ; set global event byte + bsf event_SP_change ; set setpoint event flag ; Clear some flags in case we were in bailout before... - bcf FLAG_bailout_mode ; end bailout mode - ;bcf is_bailout_menu ; not needed + bcf bailout_mode ; end bailout mode bcf better_gas_available ; =1: a better gas is available and a gas change is advised in dive mode bcf better_dil_available ; =1: a better diluent is available and a gas change is advised in dive mode - bcf blinking_better_gas ; clear blinking flag - bcf blinking_better_dil ; clear blinking flag - bsf redraw_custview_mask ; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label + bcf better_gas_blinking ; clear blinking flag + bcf better_dil_blinking ; clear blinking flag + call dive_customview_mask ; redraw custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label - bsf FLAG_back_to_loop ; indicate that it is a switchback from OC bailout to CCR/pSCR loop - bsf divemode_gaschange ; initiate reconfiguration to loop mode on last diluent + bsf request_back_to_loop ; indicate that it is a switchback from OC bailout to CCR/pSCR loop + bsf request_gaschange ; initiate reconfiguration to loop mode on last diluent bra do_exit_divemode_menu ; continue with exiting menu code do_divemode_gaslist_bail: ; entry point from CCR/pSCR to bailout to OC gases - bcf FLAG_diluent_setup ; switch to OC gases + bcf is_diluent_menu ; select OC gases bsf is_bailout_menu ; flag it is a bailout action + ;bra do_divemode_gaslist + + ENDIF ; _ccr_pscr + +;============================================================================= + do_divemode_gaslist: ; entry point for switching: OC -> gases, loop -> diluents - btfsc FLAG_bailout_mode ; in bailout mode? - bcf FLAG_diluent_setup ; yes - for safety reasons, redirect to OC (bailout) gases - bsf short_gas_decriptions ; do not show "Gas x" etc. + IFDEF _ccr_pscr + btfsc bailout_mode ; in bailout mode? + bcf is_diluent_menu ; YES - for safety reasons, redirect to selecting OC (bailout) gases + ENDIF + bsf short_gas_descriptions ; do not show "Gas x" etc. bsf better_gas_hint ; mark the gas which is the best gas/diluent movf best_gas_number,W ; load number of best gas (1-5)into WREG - btfsc FLAG_diluent_setup ; in diluent selection? + IFDEF _ccr_pscr + btfsc is_diluent_menu ; in diluent selection? movf best_dil_number,W ; YES - overwrite with best diluent (1-5) + ENDIF bnz do_divemode_gaslist_1 ; best gas/dil number = 0 (none available) ? movlw .1 ; YES - default to first gas/dil btfsc WREG,7 ; best gas/dil number >= 128 (not computed yet) ? movlw .1 ; YES - default to first gas/dil do_divemode_gaslist_1: - movwf menupos1 ; position cursor to best gas/dil (or first option if none avail) + movwf menu_pos_cur ; position cursor to best gas/dil (or first option if none avail) MENU_BEGIN tGaslist, .6 MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas MENU_DYNAMIC gaslist_strcat_gas_cd, do_switch_gas @@ -249,12 +286,15 @@ do_divemode_gaslist_more: movlw .1 - movwf menupos1 ; set to first option in dive mode menu + movwf menu_pos_cur ; set to first option in dive mode menu movff char_I_O2_ratio,gas6_O2_ratio ; initialize gas6 with currently breathed gas - O2 ratio + IFDEF _helium movff char_I_He_ratio,gas6_He_ratio ; initialize gas6 with currently breathed gas - He ratio + ENDIF do_divemode_gaslist_more_common: + IFDEF _helium MENU_BEGIN tGaslist, .6 MENU_CALL tO2Plus, do_dive_pO2 MENU_CALL tO2Minus, do_dive_mO2 @@ -263,13 +303,22 @@ MENU_DYNAMIC gaslist_strcat_gas6, do_switch_gas6 MENU_CALL tDivemenu_LostGas, do_lost_gas MENU_END + ELSE + MENU_BEGIN tGaslist, .4 + MENU_CALL tO2Plus, do_dive_pO2 + MENU_CALL tO2Minus, do_dive_mO2 + MENU_DYNAMIC gaslist_strcat_gas6, do_switch_gas6 + MENU_CALL tDivemenu_LostGas, do_lost_gas + MENU_CALL tExit, do_exit_divemode_menu + MENU_END + ENDIF do_lost_gas: movlw .1 - movwf menupos1 ; set to first option in dive mode menu + movwf menu_pos_cur ; set to first option in dive mode menu do_lost_gas_common: - bsf short_gas_decriptions ; do not show "Gas x" etc. + bsf short_gas_descriptions ; do not show "Gas x" etc. bcf better_gas_hint ; do not mark the best gas/diluent MENU_BEGIN tDivemenu_LostGas, .6 MENU_DYNAMIC gaslist_strcat_gas_cd, do_toggle_active ; toggle the gas (in)active @@ -283,35 +332,39 @@ do_switch_gas6: movlw .6 ; gas 6 - movwf menupos1 ; transfer register for selected gas towards gas_switched_common - bsf gas6_changed ; set flag for profile recording + movwf menu_pos_cur ; transfer register for selected gas towards gas_switched_common + bsf event_gas_change_gas6 ; set flag for profile recording ;bra do_switch_gas ; continue with common gas-switched code + do_switch_gas: - bsf divemode_gaschange ; set flag, will also trigger restart of deco_engine + bsf request_gaschange ; initiate gas change, will also trigger restart of deco_engine btfss is_bailout_menu ; doing a bailout? bra do_switch_gas_1 ; NO - bsf FLAG_bailout_mode ; YES - begin bailout mode + bsf bailout_mode ; YES - begin bailout mode IFDEF _cave_mode - btfsc FLAG_cave_mode ; - in cave mode? - bsf FLAG_dive_turned ; YES - set dive as turned + btfsc cave_mode ; - in cave mode? + bsf dive_turned ; YES - set dive as turned ENDIF do_switch_gas_1: - bcf setpoint_fallback ; eventually terminate fallback mode and get rid of its warning - bsf redraw_custview_mask ; request update of custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label + bcf sp_fallback ; eventually terminate fallback mode and get rid of its warning + call dive_customview_mask ; redraw custom view mask to (eventually) rewrite "ppO2(Dil)" to "ppO2" or SAC label ;bra do_exit_divemode_menu ; continue with exiting menu code + do_exit_divemode_menu: call timeout_divemode_menu2 clrf STKPTR - goto diveloop_loop4 + goto diveloop_menu_exit do_toggle_active: movlw .5 - btfsc FLAG_diluent_setup ; operating on diluents? - addwf menupos1,F ; YES - add offset of 5 to shift 1-5 -> 6-10 - decf menupos1,W ; 1-10 -> 0-4 for gases / 5-9 for diluents + IFDEF _ccr_pscr + btfsc is_diluent_menu ; operating on diluents? + addwf menu_pos_cur,F ; YES - add offset of 5 to shift 1-5 -> 6-10 + ENDIF + decf menu_pos_cur,W ; 1-10 -> 0-4 for gases / 5-9 for diluents lfsr FSR1,opt_gas_type ; load base address of gas types movff PLUSW1,lo ; get gas/dil type tstfsz lo ; already disabled? @@ -327,71 +380,86 @@ clrf PLUSW1 ; set type to disabled (0=disabled, 1=first, 2=travel/normal, 3=deco/-) do_toggle_active_common: movlw .5 - btfsc FLAG_diluent_setup ; operating on diluents? - subwf menupos1,F ; NO - back to 0-4 for gases 1-5 - bcf blinking_better_gas ; clear blinking flag for gases to avoid "leftovers" - bcf blinking_better_dil ; clear blinking flag for diluents to avoid "leftovers" + IFDEF _ccr_pscr + btfsc is_diluent_menu ; operating on diluents? + subwf menu_pos_cur,F ; YES - back to 1-5 + bcf better_dil_blinking ; clear blinking flag for diluents to avoid "leftovers" + ENDIF + bcf better_gas_blinking ; clear blinking flag for gases to avoid "leftovers" call restart_deco_engine_wo_ceiling ; invalidate deco data (but not the ceiling) and restart deco engine bra do_lost_gas_common + do_dive_pO2: - banksel gas6_O2_ratio incf gas6_O2_ratio,F ; O2++ + IFDEF _helium movf gas6_He_ratio,W addwf gas6_O2_ratio,W - movwf gas6_temp + ELSE + movf gas6_O2_ratio,W + ENDIF + movwf lo movlw .101 - cpfslt gas6_temp ; O2 + He < 101 ? + cpfslt lo ; O2 + He < 101 ? decf gas6_O2_ratio,F ; O2-- (unchanged) - banksel common bra do_divemode_gaslist_more_common + do_dive_mO2: - banksel gas6_O2_ratio decf gas6_O2_ratio,F ; O2-- movlw gaslist_min_o2 - cpfslt gas6_O2_ratio ; O2 < minimum allowed %O2? + cpfslt gas6_O2_ratio ; O2 < minimum allowed %O2 ? bra do_dive_mO2_done ; NO movlw gaslist_min_o2 ; YES - restore minimum movwf gas6_O2_ratio do_dive_mO2_done: - banksel common bra do_divemode_gaslist_more_common +;============================================================================= + + IFDEF _helium + do_dive_pHe: - banksel gas6_O2_ratio incf gas6_He_ratio,F ; He++ movf gas6_He_ratio,W addwf gas6_O2_ratio,W movwf lo movlw .101 cpfslt lo ; O2 + He < 101 ? - decf gas6_He_ratio,F ; Yes, He-- (unchanged) - banksel common + decf gas6_He_ratio,F ; YES - He-- (unchanged) bra do_divemode_gaslist_more_common do_dive_mHe: - banksel gas6_O2_ratio decf gas6_He_ratio,F ; He-- - bnn do_dive_mHe_done ; H2 < 0? + bnn do_dive_mHe_done ; H2 < 0 ? clrf gas6_He_ratio ; YES - reset to 0 do_dive_mHe_done: - banksel common bra do_divemode_gaslist_more_common + ENDIF + +;============================================================================= + + IFDEF _ccr_pscr do_divemode_splist: - bsf short_gas_decriptions - movlw .1 - movwf menupos1 ; set to first option in dive mode menu + bsf short_gas_descriptions ; do not show "SP" etc. + movlw .1 ; default to first menu item + movff opt_ccr_mode,lo ; get CCR mode (0: Fixed SP, 1: Sensor, 2: Auto SP) + dcfsnz lo,F ; mode = sensor ? + movlw .6 ; YES - load menu item number for 'sensor' + btfsc sp_fallback ; in fallback condition? + movlw .1 ; YES - revert to first menu item + movwf menu_pos_cur ; set cursor position do_divemode_splist_common: - btfsc analog_o2_input ; do we have an analog input (OSTC cR)? + + IFDEF _external_sensor + btfsc analog_o2_input ; do we have an analog or S8 digital input (OSTC cR)? bra do_divemode_splist_sensor ; YES -; btfsc s8_digital ; do we have a digital input? -; bra do_divemode_splist_sensor ; YES btfsc optical_input ; do we have an optical input (OSTC 3)? bra do_divemode_splist_sensor ; YES + ENDIF do_divemode_splist_no_sensor: MENU_BEGIN tGaslist, .5 @@ -402,6 +470,9 @@ MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp MENU_END + + IFDEF _external_sensor + do_divemode_splist_sensor: MENU_BEGIN tGaslist, .6 MENU_DYNAMIC gaslist_strcat_setpoint, do_switch_sp @@ -415,10 +486,10 @@ do_divemode_sensor: movlw index_ppo2_sensors-1 ; custom view number one below ppO2 sensors - movwf menupos3 ; set custom view number - bsf toggle_customview ; initiate toggle to desired custom view -> ppO2 sensors + movwf active_customview ; set custom view number + bsf request_next_custview ; initiate toggle to desired custom view -> ppO2 sensors movlw .1 - movwf menupos1 ; set to 1st option: use sensors + movwf menu_pos_cur ; set to 1st option: use sensors do_return_divemode_sensor: MENU_BEGIN tGaslist, .6 @@ -430,9 +501,10 @@ MENU_CALL tDiveHudMask3, do_toggle_sensor MENU_END + do_divemode_setpoint_pscr: movlw .1 - movwf menupos1 ; set to 1st option: use calculated ppO2 + movwf menu_pos_cur ; set to 1st option: use calculated ppO2 MENU_BEGIN tGaslist, .6 MENU_CALL tCalculated, do_switch_sp_calc MENU_CALL tDivemenu_UseSensor, do_switch_sensor @@ -444,17 +516,22 @@ do_toggle_sensor: - movff menupos1,lo ; backup position - decf menupos1,f ; 4, 5, 6 -> 3, 4, 5 - decf menupos1,f ; 3, 4, 5 -> 2, 3, 4 - decf menupos1,f ; 2, 3, 4 -> 1, 2, 3 - dcfsnz menupos1 ; 1, 2, 3 -> 0, 1, 2 + movff menu_pos_cur,lo ; backup position + decf menu_pos_cur,f ; 4, 5, 6 -> 3, 4, 5 + decf menu_pos_cur,f ; 3, 4, 5 -> 2, 3, 4 + decf menu_pos_cur,f ; 2, 3, 4 -> 1, 2, 3 + dcfsnz menu_pos_cur ; 1, 2, 3 -> 0, 1, 2 btg use_O2_sensor1 ; = - dcfsnz menupos1 ; 0, 1, 2 -> -1, 0, 1 + dcfsnz menu_pos_cur ; 0, 1, 2 -> -1, 0, 1 btg use_O2_sensor2 ; = - dcfsnz menupos1 ; -1,0, 1 -> -2,-1, 0 + dcfsnz menu_pos_cur ; -1,0, 1 -> -2,-1, 0 btg use_O2_sensor3 ; = - movff lo,menupos1 ; restore position + movff lo,menu_pos_cur ; restore position bra do_return_divemode_sensor - END \ No newline at end of file + ENDIF ; _external_sensor + ENDIF ; _ccr_pscr + +;============================================================================= + + END