Mercurial > public > hwos_code
diff src/simulator.asm @ 623:c40025d8e750
3.03 beta released
author | heinrichsweikamp |
---|---|
date | Mon, 03 Jun 2019 14:01:48 +0200 |
parents | ca4556fb60b9 |
children | cd58f7fc86db |
line wrap: on
line diff
--- a/src/simulator.asm Wed Apr 10 10:51:07 2019 +0200 +++ b/src/simulator.asm Mon Jun 03 14:01:48 2019 +0200 @@ -1,8 +1,8 @@ ;============================================================================= ; -; File simulator.asm REFACTORED VERSION V2.99e +; File simulator.asm combined next generation V3.03.3 ; -; Decoplan interface to C model code. +; Deco Calculator ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= @@ -14,228 +14,280 @@ #include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "strings.inc" ; STRCPY,... #include "tft.inc" ; WIN_LEFT,... -#include "wait.inc" ; speed_* #include "start.inc" #include "divemode.inc" +#include "sleepmode.inc" #include "math.inc" #include "eeprom_rs232.inc" #include "tft_outputs.inc" #include "gaslist.inc" -#include "isr.inc" +#include "surfmode.inc" +#include "wait.inc" - extern deco_clear_tissue + extern deco_push_tissues_to_vault extern deco_calc_dive_interval extern deco_calc_hauptroutine extern deco_pull_tissues_from_vault - extern TFT_display_decotype_surface1 - extern log_screendump_and_onesecond - extern logbook_preloop_tasks + extern TFT_decotype_logbook extern do_return_demo_planner extern dive_boot_oc_bail extern dive_boot_oc + + IFDEF _ccr_pscr extern dive_boot_cc + ENDIF -;---- Private local variables ------------------------------------------------- +;---- Private local Variables ------------------------------------------------- CBLOCK local1 ; max size is 16 Byte !!! decoplan_index ; within each page decoplan_gindex ; global index - decoplan_last ; depth of last stop (CF#29) - decoplan_flags ; various private flags + decoplan_last ; depth of last stop + decoplan_flags ; private flags decoplan_page ; page number decoplan_warnings ; deco engine warnings - gas_counter ; counter for looping through the gases - row_pos ; used for positioning of graphic elements + gas_index ; counter for looping through the gases + output_row ; used for positioning of the results output ENDC ; used: 8 byte, remaining: 8 byte -;---- Defines ---------------------------------------------------------------- + +;---- Private local Flags ---------------------------------------------------- -#define decoplan_last_ceiling_shown decoplan_flags,0 -#define decoplan_abort decoplan_flags,1 +#define decoplan_abort decoplan_flags,0 ; =1: deco calculations were aborted +#define decoplan_last_stop_shown decoplan_flags,1 ; =1: last deco stop is shown +#define decoplan_pressures_shown decoplan_flags,2 ; =1: show gas volumes in bar as per tank sizes +#define decoplan_overflow decoplan_flags,3 ; =1: result > 999 +#define decoplan_toggleflag decoplan_flags,4 ; used to show calculation progress +; decoplan_flags,5 ; --- unused +; decoplan_flags,6 ; --- unused +; decoplan_flags,7 ; --- unused -simulator CODE +simulator CODE +;----------------------------------------------------------------------------- -;---- Demo deco planner ------------------------------------------------------ - +;============================================================================= +; Deco Calculator Main Function +; global do_demo_planner do_demo_planner: btfsc FLAG_gauge_mode ; in gauge mode? bra do_demo_planner_exit ; YES - abort - btfsc FLAG_apnoe_mode ; in Apnea mode? + btfsc FLAG_apnoe_mode ; in apnea mode? bra do_demo_planner_exit ; YES - abort - bcf decoplan_abort ; initialize (clear) abort flag - bcf FLAG_bailout_mode ; clear bailout condition (may have remained set from last invocation) - rcall deco_planer - btfss decoplan_abort ; skip recall deco_show_plan if calculations were aborted - rcall deco_show_plan + + clrf decoplan_flags ; clear all local flags + bsf simulatormode ; activate simulator mode + bsf reset_timebase ; request ISR to reset the timebase +; btfsc reset_timebase ; has the ISR confirmed reset of the timebase? +; bra $-2 ; NO - not yet, loop waiting for the ISR + call deco_push_tissues_to_vault ; back-up the state of the real tissues (C-code) + banksel common ; back to bank common + + rcall deco_calculate ; calculate deco plan + btfss decoplan_abort ; was the deco plan calculation aborted? + rcall deco_results ; NO - show results + + movff simulator_time,char_I_dive_interval ; get the deco calculator runtime + call deco_pull_tissues_from_vault ; restore the status of the real tissues (C-code) + call deco_calc_dive_interval ; catch up with tissue desaturation (C-code) + call deco_calc_desaturation_time ; calculate desaturation and no-fly/no-altitude time after catch-up (C-code) + banksel common ; back to bank common + + bcf switch_left ; clear left button event (may be left over from abort/exit) + bcf simulatormode ; terminate simulator mode + bsf reset_timebase ; request ISR to reset the timebase +; btfsc reset_timebase ; has the ISR confirmed reset of timebase? +; bra $-2 ; NO - not yet, loop waiting for the ISR + + btfsc divemode ; shall go into dive mode? + goto restart ; YES - goto restart which will dispatch further on to dive mode + + btfss trigger_timeout ; timeout on any button press? + bra do_demo_planner_exit ; NO - take normal exit into surface menu + bcf trigger_timeout ; YES - clear timeout flag + bcf restart_fast ; - set next restart to be done slow, i.e. with logos + goto sleeploop ; - goto sleep mode + do_demo_planner_exit: - goto do_return_demo_planner + goto do_return_demo_planner ; return to simulator menu -deco_setup: - call dive_boot_oc_bail ; basic setup for all modes +;============================================================================= +; Calculate the Deco Plan +; +deco_calculate: + call request_speed_fastest ; request CPU speed change to fastest speed + call TFT_ClearScreen ; clear screen to show that calculator is starting up + + ; initialization of the deco engine + btfsc update_surface_pressure ; is there a pending surface pressure update? + bra $-2 ; YES - loop waiting for the ISR to kick in + + ; set mode and gases + call dive_boot_oc_bail ; basic setup for all modes, also clears bailout_mode + + IFDEF _ccr_pscr btfsc FLAG_oc_mode ; in OC mode? call dive_boot_oc ; YES - set up OC mode btfss FLAG_oc_mode ; in OC mode? call dive_boot_cc ; NO - set up CCR/pSCR mode - - ; use ambient conditions for deco calculation - SAFE_2BYTE_COPY last_surfpressure_30min, int_I_pres_surface ; copy surface pressure to deco routine - - movlw deco_distance - movff WREG,char_I_deco_distance + ELSE + call dive_boot_oc ; set up OC mode + ENDIF - movff opt_last_stop,char_I_depth_last_deco - movff opt_GF_low,char_I_GF_Low_percentage - movff opt_GF_high,char_I_GF_High_percentage + ; set absolute pressure at selected depth + movff char_I_bottom_depth,WREG ; get selected depth in meters + mullw .100 ; multiply with 100 to get relative pressure in mbar + movff int_I_pres_surface+0,WREG ; low byte - get surface pressure to WREG + addwf PRODL,W ; - add relative pressure + movff WREG,int_I_pres_respiration+0 ; - store as absolute pressure at depth + movff int_I_pres_surface+1,WREG ; high byte - get surface pressure to WREG + addwfc PRODH,W ; - add relative pressure + movff WREG,int_I_pres_respiration+1 ; - store as absolute pressure at depth - ; overwrite GF if aGF is wanted - bsf use_agf ; set flag to use alternative GF factors by default - TSTOSS opt_sim_use_aGF ; shall use alternative GF factors? - bcf use_agf ; NO - clear flag again - - btfsc use_agf ; =1: use aGF - movff opt_aGF_low,char_I_GF_Low_percentage - btfsc use_agf ; =1: use aGF - movff opt_aGF_high,char_I_GF_High_percentage + ; set deco stop settings + movlw deco_distance ; get deco distance safety factor + movff WREG,char_I_deco_distance ; write deco distance safety factor to deco engine + movff opt_last_stop,char_I_depth_last_deco ; write last stop depth to deco engine - ; setup char_I_const_ppO2 for CC modes - clrf WREG - btfsc FLAG_pscr_mode - movff WREG,char_I_const_ppO2 ; configure pSCR computations to calculated ppO2 - btfss FLAG_ccr_mode - return ; done if not in CCR mode - movff opt_sim_setpoint_number,WREG ; configure CCR computations to selected setpoint - decf WREG,W ; 1-5 -> 0-4 - lfsr FSR1,char_I_setpoint_cbar ; load base address of setpoint list - movff PLUSW1,char_I_const_ppO2 ; setup setpoint - return + ; set GF factors + movff opt_GF_low, char_I_GF_Low_percentage ; load normal GF factors by default + movff opt_GF_high,char_I_GF_High_percentage ; ... + TSTOSS opt_sim_use_aGF ; shall use alternative GF factors in simulation? + bra deco_calculate_1 ; NO - keep normal GF factors + movff opt_aGF_low ,char_I_GF_Low_percentage ; YES - overwrite with alternative GF factors + movff opt_aGF_high,char_I_GF_High_percentage ; - ... + +deco_calculate_1: -;============================================================================= -; Launch deco planning -; - global deco_planer -deco_planer: - call speed_fastest ; quick! - call TFT_ClearScreen ; clear screen to show that calculator is starting up - call deco_push_tissues_to_vault ; C-code: back-up state of the real tissues - banksel common - rcall deco_setup ; setup all model parameters + IFDEF _ccr_pscr + ; set char_I_const_ppO2 for pSCR/CCR mode + clrf WREG ; load coding for pSCR calculated ppO2 + btfsc FLAG_pscr_mode ; in pSCR mode? + movff WREG,char_I_const_ppO2 ; YES - configure pSCR computations to calculated ppO2 + btfss FLAG_ccr_mode ; in CCR mode? + bra deco_calculate_2 ; NO - skip next + movff opt_sim_setpoint_number,WREG ; YES - get selected setpoint + decf WREG,W ; - 1-5 -> 0-4 + lfsr FSR1,opt_setpoint_cbar ; - load base address of setpoint list + movff PLUSW1,char_I_const_ppO2 ; - configure setpoint value + ENDIF -;---- Specific settings ------------------------------------------------------ +deco_calculate_2: - ; configure the deco engine for normal plan, CNS & gas volume calculation and no delayed ascent - movff char_O_deco_status,lo ; bank-safe copy - bcf lo,DECO_PLAN_FLAG ; normal plan mode, - bsf lo,DECO_VOLUME_FLAG ; enable gas volume calculation, and - bcf lo,DECO_ASCENT_FLAG ; disable delayed ascent calculation - movff lo,char_O_deco_status ; bank-safe copy back + ; configure the deco engine - char_O_main_status + movff char_O_main_status,hi ; get the configuration set by dive_boot_oc / dive_boot_cc + bsf hi,DECO_VOLUME_FLAG ; enable gas volume calculation + bsf hi,DECO_BOTTOM_FLAG ; include bottom segment into gas needs + bcf hi,DECO_CAVE_MODE ; cave mode not supported in deco calculator + bcf hi,DECO_Z_FACTOR_FLAG ; disable Z factors by default + TSTOSC opt_ZfactorUse ; shall use Z factors? + bsf hi,DECO_Z_FACTOR_FLAG ; YES - enable Z factors + bcf hi,DECO_EXTENDED_STOPS ; disable extended stops by default + TSTOSC opt_extended_stops ; shall make extended stops? + bsf hi,DECO_EXTENDED_STOPS ; YES - activate extended stops + bcf hi,DECO_TR_FUNCTIONS ; execution of TR functions is not needed in deco calculator mode + movff hi,char_O_main_status ; bank-safe copy to deco engine control - ; configure the deco engine for total-dive gas volume calculation - movff char_O_main_status,hi ; bank-safe copy - bcf hi,DECO_TR_FUNCTIONS ; execution of TR functions is not needed in deco calculator mode - bsf hi,DECO_BOTTOM_FLAG ; set bottom flag - bsf hi,DECO_Z_FACTOR_FLAG ; enable use of Z factor by default - TSTOSS opt_ZfactorUse ; shall use Z factor? - bcf hi,DECO_Z_FACTOR_FLAG ; NO - disable again - movff hi,char_O_main_status ; bank-safe copy back + ; configure the deco engine - char_O_deco_status + movff char_O_deco_status,lo ; get the configuration set by dive_boot_oc / dive_boot_cc + bcf lo,DECO_START_NORM ; clear flag for normal plan mode + bcf lo,DECO_START_ALT ; clear flag for alternative plan mode + bsf lo,DECO_INITIALIZE ; set flag for once-per-dive initialization + bcf lo,DECO_BAILOUT_FLAG ; no gas switches before first deco stop + bcf lo,DECO_ASCENT_FLAG ; no delayed ascent + movff lo,char_O_deco_status ; bank-safe copy to deco engine control + +deco_calculate_redo: + + call request_speed_fastest ; request CPU speed change to fastest speed (again, if in redo) -deco_planer_redo: - ; show deco calculation is in progress - call TFT_ClearScreen - WIN_COLOR color_greenish - TEXT_SMALL .20,.40, tCalculating - WIN_COLOR color_lightblue - WIN_SMALL .1,.215 - STRCPY_TEXT_PRINT tAbort - - ; configure the deco engine for initialization - movff char_O_deco_status,lo ; bank-safe copy - bsf lo,DECO_STATUS_0_FLAG ; configure init ... - bsf lo,DECO_STATUS_1_FLAG ; ... state, - movff lo,char_O_deco_status ; bank-safe copy back + ; show that the deco calculation is in progress + call TFT_ClearScreen ; clear screen from last results + WIN_COLOR color_lightblue ; select color for abort label + TEXT_SMALL .1,.215, tAbort ; print abort label + WIN_COLOR color_white ; select color for title and progress outputs + TEXT_SMALL .0, .40, tCalculating ; print "Calculating..." -;---- add delay at surface, if requested ------------------------------------- - banksel char_I_dive_interval - tstfsz char_I_dive_interval - call deco_calc_dive_interval + ; calculated the surface interval + TSTOSS opt_surface_interval ; surface interval > 0 ? + bra deco_calculate_bottom ; NO - continue with bottom segment + TEXT_SMALL .20,.75, tCalcSurfInter ; YES - print what we are doing + movff opt_surface_interval,char_I_dive_interval ; - copy surface interval to deco engine + call deco_calc_dive_interval ; - calculate surface interval (C-code) + banksel common ; - back to bank common -;---- Dive loop -------------------------------------------------------------- - ; compute dive ambient conditions - banksel char_I_bottom_depth - movf char_I_bottom_depth,W - mullw .100 - movlw LOW (.1000) - addwf PRODL,W - movwf int_I_pres_respiration+0 - movlw HIGH(.1000) - addwfc PRODH,W - movwf int_I_pres_respiration+1 + ; calculate the bottom segment +deco_calculate_bottom: + ; advance tissues by selected bottom time, + ; char_I_sim_advance_time is cleared by deco engine after execution + movff char_I_bottom_time,char_I_sim_advance_time + + TEXT_SMALL .20,.100, tCalcBotSeg ; print what we are doing + + ; invoke the deco engine once to condition the real tissues + ; to their pressure state at the end of the bottom segment + call deco_calc_hauptroutine ; (C-code) banksel common - movff char_I_bottom_time,char_I_sim_advance_time - - clrf TMR5L ; restart timer used to preempt stops calculation - clrf TMR5H ; - - call deco_calc_hauptroutine ; initialization, complete bottom time part and initial ascent - banksel common - - btfss FLAG_bailout_mode ; doing a bailout deco plan? - bra deco_planer_loop ; NO - keep gases and go on - ; YES - switch to OC gas and restart deco plan + IFDEF _ccr_pscr + ; conditional switch to bailout mode + btfss bailout_mode ; shall calculate a bailout plan? + bra deco_calculate_ascent ; NO - skip next -;---- BAILOUT: Switch to OC gases for ascent ----------------------------------- + call dive_boot_oc ; YES - switch to OC mode and gases + movff char_O_main_status,hi ; - bank-safe copy from deco engine control (main status) + bcf hi,DECO_BOTTOM_FLAG ; - exclude bottom segment from gas needs, i.e. calculate ascent needs only + movff hi,char_O_main_status ; - bank-safe copy back to deco engine control + movff char_O_deco_status,lo ; - bank-safe copy from deco engine control (deco status) + bsf lo,DECO_BAILOUT_FLAG ; - allow gas switches before first deco stop + bsf lo,DECO_ASCENT_FLAG ; - allow delayed ascent + movff lo,char_O_deco_status ; - bank-safe copy back to deco engine control - ; reconfigure the deco engine for delayed ascent & bailout mode and start a new calculation cycle - movff char_O_deco_status,lo ; bank-safe copy - bsf lo,DECO_ASCENT_FLAG ; set flag for delayed ascent calculation - bsf lo,DECO_BAILOUT_FLAG ; set bailout mode flag to allow gas changes on initial ascent - bcf lo,DECO_STATUS_0_FLAG ; configure start of a new... - bcf lo,DECO_STATUS_1_FLAG ; ... deco calculation cycle - movff lo,char_O_deco_status ; bank-safe copy back - - ; reconfigure the deco engine for bailout ascent needs - movff char_O_main_status,hi ; bank-safe copy - bcf hi,DECO_BOTTOM_FLAG ; clear bottom flag - movff hi,char_O_main_status ; bank-safe copy back + TEXT_SMALL .20,.125, tCalcBailout ; - print what we are doing + ENDIF - ; reconfigure gas settings to OC gases - call dive_boot_oc ; configure deco engine for OC mode - -;---- Wait until status reaches zero ------------------------------------------- -deco_planer_loop: - clrf TMR5L ; restart timer used to preempt stops calculation - clrf TMR5H ; - call deco_calc_hauptroutine ; simulate more dive time to trigger the deco calculations - banksel common + ; calculate ascent +deco_calculate_ascent: + movff char_O_deco_status,lo ; bank-safe copy from deco engine control + bsf lo,DECO_START_NORM ; start calculation of a normal plan + movff lo,char_O_deco_status ; bank-safe copy back to deco engine control + TEXT_SMALL .20,.150, tCalcAscent ; print what we are doing +deco_calculate_loop: + btfsc switch_left ; was the left button pressed? + bra deco_calculate_abort ; YES - set abort flag, do some clean-up and return + call deco_calc_hauptroutine ; NO - invoke the deco engine so that it can do the deco calculation (C-code) + banksel common ; - back to bank common + movff char_O_depth_sim,lo ; - get the depth reached (in meters) + WIN_SMALL .70,.150 ; - set output position + output_8 ; - print depth reached (in meters) + STRCAT " m" ; - print unit (meters) + btg decoplan_toggleflag ; - toggle the toggle flag + btfsc decoplan_toggleflag ; - toggle flag set? + bra deco_calculate_loop_1 ; YES - print ". " + STRCAT_PRINT " ." ; NO - print " ." + bra deco_calculate_loop_2 ; +deco_calculate_loop_1: ; + STRCAT_PRINT ". " ; +deco_calculate_loop_2: ; + movff char_O_deco_status,lo ; - get deco calculation status + btfss lo,DECO_COMPLETED_NORM ; - deco calculation completed? + bra deco_calculate_loop ; NO - loop + movff char_O_deco_warnings,decoplan_warnings; YES - copy warnings for later display + bra deco_calculate_finish ; - do some clean-up and return +deco_calculate_abort: + bcf switch_left ; clear button event + bsf decoplan_abort ; set abort flag +deco_calculate_finish: + goto request_speed_normal ; request switch back to normal speed and return to deco calculator main function - btfss switch_left ; check if left button was pressed - bra deco_planer_finishing_1 ; NO - continue calculations - bsf decoplan_abort ; YES - set abort flag so that deco_show_plan will not be called - bra deco_planer_finishing_2 ; do some clean-up and return -deco_planer_finishing_1: - movff char_O_main_status,hi ; working copy of char_O_main_status in bank common - btfss hi,DECO_COMPLETED_NORM ; calculations completed? - bra deco_planer_loop ; NO - needs more computation cycles - -;---- Done: add CNS from decoplan, and restore tissues -deco_planer_finishing_2: - movff char_O_deco_warnings,decoplan_warnings ; copy warnings - - call deco_pull_tissues_from_vault ; C-code: restore status of the real tissues - banksel common ; back to bank 1 - - movlw b'00111000' ; 1:8 Prescaler -> 65,536ms@16MHz - movwf T3CON - goto speed_normal ; (and return) ;----------------------------------------------------------------------------- -; Draw a stop of the deco plan (simulator or dive). +; Draw a stop of the deco plan (simulator or dive) ; Inputs: lo = depth ; hi = minutes ; win_top = line to draw on screen. @@ -245,250 +297,223 @@ ; WREG, PROD, TBLPTR TABLAT. ; deco_plan_show_stop: - ;---- Print depth ---------------------------------------------------- - lfsr FSR2,char_O_deco_gas ; needed to be initialized here every time because... - movf decoplan_gindex,W ; ...FSR2 is also used for string operations - movff PLUSW2,WREG ; get current gas and copy it to WREG for color-coding - call TFT_color_code_gas ; set output color dependent on gas (1-5) + ; print depth + lfsr FSR2,char_O_deco_gas ; needed to be initialized here every time because... + movf decoplan_gindex,W ; ...FSR2 is also used for string operations + movff PLUSW2,WREG ; get current gas and copy it to WREG for color-coding + call TFT_color_code_gas ; set output color dependent on gas (1-5) - lfsr FSR2,buffer + lfsr FSR2,buffer ; set up output buffer - TSTOSS opt_units ; 0=Meter, 1=Feet - bra deco_plan_show_nstd_stop_metric - - movff hi,ul ; back-up hi (minutes) + TSTOSS opt_units ; 0=Meter, 1=Feet + bra deco_plan_show_nstd_stop_metric ; 0 - do metric + ; 1 - do imperial + movff hi,ul ; back-up hi (minutes) WIN_LEFT .80 - movf lo,W ; lo = m - mullw .100 ; PRODL:PRODH = hPa - movff PRODL,lo - movff PRODH,hi - ; Convert with 334feet/100m to have 10ft, 20ft, 30ft stops... - movff lo,xA+0 - movff hi,xA+1 - movlw LOW d'334' ; 334feet/100m - movwf xB+0 - movlw HIGH d'334' - movwf xB+1 - call mult16x16 ; xA*xB=xC (lo:hi * 328) - movlw d'50' ; round up - addwf xC+0,F - movlw .0 - addwfc xC+1,F - addwfc xC+2,F - addwfc xC+3,F - movlw d'100' - movwf xB+0 - clrf xB+1 - call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder - movff xC+0,lo - movff xC+1,hi ; restore lo and hi with updated value - bsf ignore_digit4 ; only full feet - output_16 + call convert_meter_to_feet ; convert value in lo from meters to feet + output_16_3 ; limit output to 0...999 STRCAT_PRINT "ft" - movff ul,hi ; restore hi (minutes) + movff ul,hi ; restore hi (minutes) bra deco_plan_show_nstd_stop_common deco_plan_show_nstd_stop_metric: WIN_LEFT .85 - output_8 ; outputs into postinc2 + output_8 ; outputs into postinc2 STRCAT_PRINT "m" deco_plan_show_nstd_stop_common: - ;---- Print duration ------------------------------------------------- + + ; print duration WIN_LEFT .135 lfsr FSR2,buffer movff hi,lo - output_99 ; stop entries are 99 min max. + output_99 ; stop entries are 99 min max. STRCAT_PRINT "'" - ;--------------------------------------------------------------------- - ; Draw the bar graph used for deco stops (deco plan in simulator or dive) + ; draw the bar graph used for deco stops (lo = minutes) incf win_top,F movlw .19 movwf win_height movlw .118 - movwf win_leftx2 ; column left (0-159) - movlw .16 - movwf win_width+0 ; column max width - clrf win_width+1 + movwf win_leftx2 ; column left (0-159) + MOVLI .16,win_width ; column max width +; movlw .16 ; limit length to max. column width - not needed, done by TFT_box +; cpfslt lo +; movwf lo + incf lo,W ; add 1 for a minimum visible active bargraph area + movwf win_bargraph ; set width of the active bargraph area + call TFT_box ; draw bargraph - ; Draw used area (lo = minutes): - movlw .16 ; limit length to max. column width - cpfslt lo - movwf lo - movff lo,win_bargraph ; active width, the rest is cleared - call TFT_box - - ; Restore win_top + ; restore win_top call TFT_standard_color - decf win_top,F ; restore win_top + decf win_top,F ; restore win_top return ;----------------------------------------------------------------------------- ; Clear unused area below last stop -; Inputs: win_top : last used area... +; Inputs: win_top : last used area +; deco_plan_show_clear_bottom: - movf win_top,W ; get back from bank0 - sublw .239 ; bottom row in planning + movf win_top,W ; get back from bank0 + sublw .239 ; bottom row in planning movwf win_height - WIN_LEFT .85 ; full dive menu width - movlw .159-.85+.1 - movwf win_width+0 - clrf win_width+1 + WIN_LEFT .85 ; full dive menu width + MOVLI .75,win_width ; .159-.85+.1 - clrf win_color1 ; fill with black + clrf win_color1 ; fill with black clrf win_color2 - goto TFT_box ; and return + goto TFT_box ; and return ;----------------------------------------------------------------------------- -; Display the deco plan (simulator). +; Display the deco plan (simulator) ; Inputs: char_O_deco_table (array of stop times, in minutes) ; decoplan_page = page number. ; -deco_show_plan_page: - bcf win_invert ; reset invert flag +deco_results_page: + bcf win_invert ; reset invert flag + WIN_COLOR color_greenish + IFDEF _ccr_pscr + btfss bailout_mode ; bailout results? + bra deco_results_page_1 ; NO + TEXT_SMALL .80,.1, tDiveBailout ; YES + bra deco_results_page_2 + ENDIF +deco_results_page_1: + TEXT_SMALL .80,.1, tDivePlan +deco_results_page_2: + movff char_O_deco_depth,WREG ; get depth of the first deco stop + iorwf WREG ; is there at least one deco stop? + bnz deco_plan_show_1 ; YES - ;---- Are there deco stops ? ------------------------------------------ - movff char_O_first_deco_depth,WREG - iorwf WREG - bnz deco_plan_show_1 - - ;---- No Deco -------------------------------------------------------- + ;---- no deco -------------------------------------------------------- call TFT_standard_color - TEXT_SMALL .80, .0, tNoDeco + TEXT_SMALL .80, .25, tNoDeco ; output of remaining NDL time - WIN_SMALL .80, .50 ; same line as bottom time - movff char_O_nullzeit,lo ; remaining NDL at end of bottom time + WIN_SMALL .80, .50 ; same line as bottom time + movff char_O_NDL_norm,lo ; get NDL time in normal plan output_8 PUTC "'" PUTC " " - STRCAT_TEXT_PRINT tNDLleft ; "left" + STRCAT_TEXT_PRINT tNDLleft ; "left" - bsf decoplan_last_ceiling_shown + bsf decoplan_last_stop_shown return + ;---- deco stops --------------------------------------------------------- deco_plan_show_1: - lfsr FSR0,char_O_deco_depth ; initialize indexed addressing + lfsr FSR0,char_O_deco_depth ; initialize indexed addressing lfsr FSR1,char_O_deco_time - clrf decoplan_index ; start with index = 0 + clrf decoplan_index ; start with index = 0 movlw .24 - movwf win_top ; and row = 0 at position 24 + movwf win_top ; and row = 0 at position 24 - ; Read stop parameters, indexed by decoplan_index and decoplan_page - movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index - mullw .8 ; 8 lines/page in deco plan + ; read stop parameters, indexed by decoplan_index and decoplan_page + movf decoplan_page,W ; decoplan_gindex = 6*decoplan_page + decoplan_index + mullw .8 ; 8 lines/page in deco plan movf decoplan_index,W addwf PRODL,W - movwf decoplan_gindex ; --> decoplan_gindex + movwf decoplan_gindex ; --> decoplan_gindex - bcf decoplan_last_ceiling_shown ; not done yet... + bcf decoplan_last_stop_shown ; not done yet... deco_plan_show_2: - btfsc decoplan_gindex,5 ; reached table length (32) ? - bra deco_plan_show_99 ; YES - done + btfsc decoplan_gindex,5 ; reached table length (32) ? + bra deco_plan_show_99 ; YES - done - ; Read stop parameters, indexed by decoplan_index - movf decoplan_gindex,W ; index - movff PLUSW0,lo ; char_O_deco_depth[gindex] - movff PLUSW1,hi ; char_O_deco_time [gindex] + ; read stop parameters, indexed by decoplan_index + movf decoplan_gindex,W ; index + movff PLUSW0,lo ; char_O_deco_depth[decoplan_gindex] + movff PLUSW1,hi ; char_O_deco_time [decoplan_gindex] movf lo,W - bz deco_plan_show_99 ; depth == 0 : done + bz deco_plan_show_99 ; depth == 0 -> done - ; Display the stop line + ; display the stop line rcall deco_plan_show_stop - ; Next + ; next movlw .24 - addwf win_top,F ; row: += 24 - incf decoplan_index,F ; local index += 1 - incf decoplan_gindex,F ; global index += 1 + addwf win_top,F ; row: += 24 + incf decoplan_index,F ; local index += 1 + incf decoplan_gindex,F ; global index += 1 - ; Max number of lines/page reached ? - movlw .8 ; 8 lines/page in deco plan + ; max number of lines/page reached? + movlw .8 ; 8 lines/page in deco plan cpfseq decoplan_index - bra deco_plan_show_2 ; NO - loop + bra deco_plan_show_2 ; NO - loop - ; Check if next stop is end-of-list ? + ; check if next stop is end-of-list? movf decoplan_gindex,W - movf PLUSW0,W ; char_O_deco_depth[gindex] - bz deco_plan_show_99 ; end of list + movf PLUSW0,W ; char_O_deco_depth[decoplan_gindex] + bz deco_plan_show_99 ; end of list - ; Display the message "more..." - rcall deco_plan_show_clear_bottom ; clear from next line + ; display the message "more..." + rcall deco_plan_show_clear_bottom ; clear from next line call TFT_standard_color TEXT_SMALL .88, .220, tMore return deco_plan_show_99: - bsf decoplan_last_ceiling_shown ; nothing more in table to display - rcall deco_plan_show_clear_bottom ; clear from next line + bsf decoplan_last_stop_shown ; nothing more in table to display + rcall deco_plan_show_clear_bottom ; clear from next line + call TFT_standard_color return -;----------------------------------------------------------------------------- -; Loop to show all pages of the deco plan (surface mode) - - global deco_show_plan -deco_show_plan: - clrf decoplan_page +;============================================================================= +; Show Deco Calculation Results +; +deco_results: call TFT_ClearScreen - WIN_COLOR color_greenish - btfsc FLAG_bailout_mode - bra deco_show_plan_bail_title - TEXT_SMALL .1,.1, tDivePlan - bra deco_show_plan2 -deco_show_plan_bail_title: - TEXT_SMALL .1,.1, tDiveBailout -deco_show_plan2: call TFT_standard_color - ;---- Display Plan Parameters + + ; display plan parameters WIN_SMALL .0,.25 - STRCPY "Int.:" + STRCPY "Int. :" movff char_I_dive_interval,lo - bsf leftbind output_8 - bcf leftbind STRCAT_PRINT "'" WIN_SMALL .0,.50 STRCPY_TEXT tBtTm_short movff char_I_bottom_time,lo - bsf leftbind output_8 - bcf leftbind STRCAT_PRINT "'" WIN_SMALL .0,.75 STRCPY_TEXT tDepth PUTC ":" movff char_I_bottom_depth,lo - bsf leftbind output_8 - bcf leftbind STRCAT_PRINT "m" WIN_SMALL .0,.105 ; set position for warnings or sat/dsat factors - ;---- Check for Stop Table Overflow + ; check for stop table overflow btfss decoplan_warnings,stoptable_overflow ; check if we have a overflow warning - bra deco_show_plan2a ; NO - skip - ;---- Display Overflow warning - call TFT_warnings_color ; YES - show overflow warning + bra deco_results_0a ; NO - skip + + ; display overflow warning + call TFT_warning_color ; YES - show overflow warning STRCAT_PRINT "incomplete" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors + bra deco_results_m1 ; skip displaying sat/dsat factors + +deco_results_0a: -deco_show_plan2a: - ;---- Check for IBCD Warning + IFDEF _helium + ; check for IBCD warning btfss decoplan_warnings,IBCD_warning_lock ; check if we have a locked IBCD warning - bra deco_show_plan2b ; NO - skip - ;---- Display IBCD warning + bra deco_results_2b ; NO - skip + + ; display IBCD warning call TFT_attention_color ; YES - show IBCD warning STRCAT_PRINT "IBCD!" ; max 10 characters - bra deco_show_plan_m1 ; skip displaying sat/dsat factors + bra deco_results_m1 ; skip displaying sat/dsat factors + ENDIF -deco_show_plan2b: - ;---- Display Sat/Desat Factors --> omitted if there were warnings +deco_results_2b: + + ; display Sat/Desat factors --> omitted if there were warnings STRCAT_PRINT "SD:" WIN_SMALL .25,.105 movff char_I_saturation_multiplier,lo @@ -498,15 +523,16 @@ output_8 STRCAT_PRINT "" -deco_show_plan_m1: +deco_results_m1: + call TFT_standard_color ; clean-up from warnings - ;---- get Model - movff char_I_deco_model,WREG - iorwf WREG - bz deco_show_plan_m2 + ; get model + movff char_I_deco_model,WREG ; 0: straight Buhlmann, 1: with GF + iorwf WREG ; GF factors in use? + bz deco_results_m2 ; NO - ;---- Display GF low/high values + ; display GF low/high factors WIN_SMALL .0,.130 STRCAT_PRINT "GF:" WIN_SMALL .25,.130 @@ -517,14 +543,17 @@ output_8 STRCAT_PRINT "" -deco_show_plan_m2: - ;---- Display Deco Mode +deco_results_m2: + + ; display deco mode WIN_SMALL .0,.155 lfsr FSR2,buffer - movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=PSCR - call TFT_display_decotype_surface1 + movff opt_dive_mode,lo ; 0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR + call TFT_decotype_logbook + + IFDEF _ccr_pscr btfss FLAG_ccr_mode ; current dive mode = CCR ? - bra deco_show_plan2c ; NO - branch + bra deco_results_2c ; NO - skip WIN_SMALL .25,.155 STRCPY "SP:" ; output setpoint used for calculation movff opt_sim_setpoint_number,lo @@ -532,31 +561,39 @@ output_8 bcf leftbind STRCAT_PRINT "" + ENDIF -deco_show_plan2c: - ;---- Display TTS result +deco_results_2c: + + btfss FLAG_oc_mode ; current dive mode = OC ? + bra deco_results_2d ; NO - skip + TSTOSS opt_extended_stops ; YES - extended stops activated? + bra deco_results_2d ; NO - skip + WIN_SMALL .18,.155 ; YES - set position + STRCAT_PRINT "ext.Stop" ; - print notice + +deco_results_2d: + + ; display TTS result WIN_SMALL .0,.180 STRCPY_TEXT tTTS STRCAT ": " - movff int_O_ascenttime+0,lo - movff int_O_ascenttime+1,hi + MOVII int_O_TTS_norm,mpr bsf leftbind output_16 bcf leftbind STRCAT_PRINT "'" - ;---- Display CNS result + ; display CNS result WIN_TOP .205 STRCPY_TEXT tCNS2 ; "CNS:" - movff int_O_CNS_fraction+0,lo - movff int_O_CNS_fraction+1,hi + MOVII int_O_CNS_current,mpr ; get current CNS call TFT_color_code_cns ; color-code CNS output bsf leftbind output_16_3 ; limit to 999 and display only (0-999) bcf leftbind STRCAT "%\x92" ; "->" - movff int_O_normal_CNS_fraction+0,lo - movff int_O_normal_CNS_fraction+1,hi + MOVII int_O_CNS_norm,mpr ; get CNS at end of dive in normal plan call TFT_color_code_cns ; color-code CNS output bsf leftbind output_16_3 ; limit to 999 and display only (0-999) @@ -564,124 +601,154 @@ STRCAT_PRINT "%" call TFT_standard_color - ;---- Loop through pages -deco_show_plan_1: - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right - - rcall deco_show_plan_page - incf decoplan_page,F - call logbook_preloop_tasks -deco_show_plan_2: - btfsc switch_right - bra deco_show_plan_3 - btfsc switch_left - return ; return to simulator menu - call log_screendump_and_onesecond ; check if we need to make a screen shot and check for new second - btfsc sleepmode ; timeout? - goto restart - bra deco_show_plan_2 - -deco_show_plan_3: - btfss decoplan_last_ceiling_shown - bra deco_show_plan_1 - ; all stops shown - -;----in CCR and pSCR mode, compute a BAILOUT deco plan ----------------------- - movff char_O_deco_status,WREG ; get deco calculation status - btfss WREG,DECO_MODE_LOOP_FLAG ; check if in CCR or pSCR mode - bra simulator_show_decoplan5_0 ; NO - normal OC mode: just display - bsf FLAG_bailout_mode ; YES - redo 2nd deco-plan in bailout mode - rcall deco_planer_redo ; redo plan computation - - btfss decoplan_abort ; shall we abort? - bra deco_show_plan ; NO - display bailout stops + ; loop through deco plan pages +deco_results_1: + clrf decoplan_page ; start from first page + bcf decoplan_pressures_shown ; when showing the gas needs, start with volumes (liter) +deco_results_1a: + WIN_BOX_BLACK .0, .239, .80, .159 ; clear the complete stop result column (top, bottom, left, right) + rcall deco_results_page ; show a results page + incf decoplan_page,F ; increment results page number + call reset_timeout_surfmode ; reset timeout + bcf switch_right ; clear left-over right button event + bcf switch_left ; clear left-over left button event +deco_results_2: + btfsc switch_right ; right button pressed? + bra deco_results_3 ; YES - show further results + btfsc switch_left ; left button pressed? + return ; YES - return to deco calculator main function + call housekeeping ; NO to both - handle screen dump request, timeout and need to enter dive mode + btfsc divemode ; shall go into dive mode? + bsf decoplan_abort ; YES - set abort flag + btfsc trigger_timeout ; timeout on any button press? + bsf decoplan_abort ; YES - set abort flag + btfss decoplan_abort ; shall abort? + bra deco_results_2 ; NO - loop return ; YES - -;---- in OC+BAIL modes, show the gas usage special page ----------------------- -simulator_show_decoplan5_0: - ; Clear the complete stop result column: - WIN_BOX_BLACK .0, .239, .80, .159 ; top, bottom, left, right +deco_results_3: + btfss decoplan_last_stop_shown ; was the last stop shown already? + bra deco_results_1a ; NO - loop - movlw .25 - movwf row_pos ; row for gas list is .25+.25 - clrf gas_counter ; gas counter - lfsr FSR0,int_O_ascent_volumes ; initialize indexed addressing + IFDEF _ccr_pscr + movff char_O_deco_status,WREG ; YES - get deco calculation status + btfss WREG,DECO_MODE_LOOP_FLAG ; - check if calculation was made for loop mode (CCR/pSCR) + bra deco_results_gas_volumes ; NO - normal OC mode or bailout mode, show gas needs + bsf bailout_mode ; YES - do a 2nd deco-plan in bailout mode + rcall deco_calculate_redo ; - redo deco calculation + btfss decoplan_abort ; - was the calculation aborted? + bra deco_results ; NO - redo display of deco stops + return ; YES - return to deco calculator main function + ENDIF + ;---- show the gas needs (OC and bailout only) --------------------------- +deco_results_gas_volumes: + lfsr FSR0,int_O_gas_need_vol ; load base address of gas needs in volume + +deco_results_gas_common: + WIN_BOX_BLACK .0, .239, .80, .159 ; clear the complete stop result column (top, bottom, left, right) + movlw .25 ; output row is 25 (fixed offset set here) + n*25 (line increment, see below) + movwf output_row ; set fixed vertical offset for output row WIN_LEFT .80 ; set column call TFT_standard_color - - bcf FLAG_diluent_setup ; steer gaslist_strcat_gas to use OC gases + clrf gas_index ; initialize gas counter + bcf is_diluent_menu ; working on OC gases -simulator_show_decoplan5_loop: - movff gas_counter,PRODL ; copy to PRODL first - incf gas_counter,F ; increment gas # +deco_results_gas_loop: + movff gas_index,PRODL ; copy gas index to PRODL (interface to gaslist_strcat_gas) + incf gas_index,F ; increment gas index - movff gas_counter,WREG ; copy current gas to WREG for color-coding + movf gas_index,W ; copy gas index to WREG for color-coding call TFT_color_code_gas ; set output color according to gas (1-5) - lfsr FSR2,buffer - bsf short_gas_decriptions - bsf divemode ; tweak "customview_show_mix:" - call gaslist_strcat_gas ; input: PRODL : gas number (0..4), Output: "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 - bcf divemode ; tweak "customview_show_mix:" + lfsr FSR2,buffer ; load base address of output buffer + bsf short_gas_descriptions ; configure gaslist_strcat_gas output format + bsf divemode ; configure gaslist_strcat_gas output format + call gaslist_strcat_gas ; write "Nxlo", "Txlo/hi", "Air" or "O2" into output buffer + bcf divemode ; cleanup above - movlw .25 - addwf row_pos,F ; increase row position - movff row_pos,win_top ; set row + movlw .25 ; spacing between outputs + addwf output_row,F ; increase row position + movff output_row,win_top ; set row position - movff POSTINC0,lo ; read (16bit) result, low first, - movff POSTINC0,hi ; then high + movff POSTINC0,lo ; read gas volume low byte + movff POSTINC0,hi ; high byte + + bcf decoplan_overflow ; no overflow in gas needs by default + + btfsc decoplan_pressures_shown ; results in bar? + bra deco_results_gas_volumes_1 ; YES - movf lo,W - andwf hi,W - incf WREG ; > 65535 ? - bnz simulator_show_decoplan5_1 ; NO - STRCAT_PRINT ">65500" ; YES - bra simulator_show_decoplan5_2 + ; output of gas needs in liter + movf lo,W ; check if hi:lo = 65535: copy low byte to WREG + andwf hi,W ; and do a bitwise AND with the high byte + incfsz WREG ; add 1, result zero now? + bra deco_results_gas_volumes_2 ; NO - print volume + STRCAT_PRINT ">65500" ; YES - print ">65500" + bra deco_results_gas_volumes_3 ; - continue checking if all gases are shown -simulator_show_decoplan5_1: - PUTC ":" - bsf leftbind - output_16 ; no decimal anymore - bcf leftbind - STRCAT_PRINT "" + ; output of gas needs in bar +deco_results_gas_volumes_1: + btfsc hi,int_high_flag ; overflow in result? + bsf decoplan_overflow ; YES - remember it + bcf hi,int_high_flag ; clear flag for overflow in result + btfsc hi,int_warning_flag ; gas needs above available amount? + bsf win_invert ; YES - print in inverse + bcf hi,int_warning_flag ; clear flag for gas needs above available amount + bcf hi,int_attention_flag ; clear flag for gas needs close to available amount + bcf hi,int_invalid_flag ; clear flag for invalid data + bcf hi,int_is_zero ; clear flag for zero - ; Loop for all 5 gas -simulator_show_decoplan5_2: - movlw d'5' ; list all five gases - cpfseq gas_counter ; all gases shown? - bra simulator_show_decoplan5_loop ; NO - loop - - WIN_COLOR color_greenish +deco_results_gas_volumes_2: + PUTC ":" ; print ":" + output_16 ; print 16 bit number + movlw '>' ; load coding of ">" sign into WREG + btfsc decoplan_overflow ; overflow in result? + movff WREG,buffer+.7 ; YES - place ">" before number + STRCAT_PRINT "" ; finalize output + bcf win_invert ; back to none-inverse printing - WIN_SMALL .80,.25 - STRCPY_TEXT tGasUsage ; "Gas Usage" - STRCAT_PRINT ":" +deco_results_gas_volumes_3: + movlw NUM_GAS ; 5 gases to show + cpfseq gas_index ; all gases shown? + bra deco_results_gas_loop ; NO - loop + + WIN_COLOR color_greenish ; set color + TEXT_SMALL .80,.01,tGasUsage ; "Gas Usage" - WIN_SMALL .120,.175 - STRCPY_TEXT_PRINT tLiterLong ; "Liter" + btfsc decoplan_pressures_shown ; results shown in bar? + bra deco_results_gas_volumes_4 ; YES + TEXT_SMALL .120,.25,tLiterLong ; NO - in Liter then + bra deco_results_gas_volumes_5 ; - continue with initialization of housekeeping - call TFT_standard_color - call logbook_preloop_tasks +deco_results_gas_volumes_4: + TEXT_SMALL .120,.25,tbar ; " bar" (with leading space) -simulator_show_decoplan5_3: - btfss switch_right - bra simulator_show_decoplan5_3a - bcf switch_right - clrf decoplan_page - bra deco_show_plan_1 ; toggle between stops plan and gas usage -simulator_show_decoplan5_3a: - btfss switch_left - bra simulator_show_decoplan5_4 - bcf FLAG_bailout_mode ; back to normal - return ; return to simulator menu +deco_results_gas_volumes_5: + call TFT_standard_color ; revert to standard color + call reset_timeout_surfmode ; reset timeout + bcf switch_right ; clear left-over right button event + bcf switch_left ; clear left-over left button event +deco_results_gas_volumes_6: + btfsc switch_right ; right button pressed? + bra deco_results_gas_volumes_7 ; YES - show results in bar or restart with deco stops again + btfsc switch_left ; left button pressed? + return ; YES - return to deco calculator main function + call housekeeping ; NO to both - handle screen dump request, timeout and need to enter dive mode + btfsc divemode ; shall go into dive mode? + bsf decoplan_abort ; YES - set abort flag + btfsc trigger_timeout ; timeout on any button press? + bsf decoplan_abort ; YES - set abort flag + btfss decoplan_abort ; shall abort? + bra deco_results_gas_volumes_6 ; NO - loop + return ; YES -simulator_show_decoplan5_4: - call log_screendump_and_onesecond ; check if we need to make a screen shot and check for new second - btfsc sleepmode ; timeout? - goto restart - bra simulator_show_decoplan5_3 +deco_results_gas_volumes_7: + btfsc decoplan_pressures_shown ; results shown in bar? + bra deco_results_1 ; YES - show deco stops again + bsf decoplan_pressures_shown ; NO - but now + lfsr FSR0,int_O_gas_need_pres ; - load base address of gas needs in bar + bra deco_results_gas_common ; - re-run gas needs output in pressure mode + END \ No newline at end of file