Mercurial > public > hwos_code
view src/surfmode.asm @ 623:c40025d8e750
3.03 beta released
author | heinrichsweikamp |
---|---|
date | Mon, 03 Jun 2019 14:01:48 +0200 |
parents | 1ad0531e9078 |
children | cd58f7fc86db |
line wrap: on
line source
;============================================================================= ; ; File surfmode.asm next combined generation V3.03.2 ; ; Surface Mode ; ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. ;============================================================================= ; HISTORY ; 2011-08-07 : [mH] moving from OSTC code #include "hwos.inc" ; Mandatory header #include "shared_definitions.h" ; Mailbox from/to p2_deco.c #include "start.inc" #include "tft.inc" #include "tft_outputs.inc" #include "adc_lightsensor.inc" #include "menu_processor.inc" #include "strings.inc" #include "sleepmode.inc" #include "wait.inc" #include "external_flash.inc" #include "customview.inc" #include "divemode.inc" #include "mcp.inc" ; RX #include "i2c.inc" #include "comm.inc" #include "eeprom_rs232.inc" #include "calibrate.inc" #include "rx_ops.inc" extern do_main_menu extern check_cns_violation extern check_warn_battery extern check_and_store_sat_violation extern check_mbubbles IFDEF _osct_logo extern ostc_logo_block ENDIF IFDEF _compass extern TFT_surface_compass_heading ENDIF ;---- Private local variables ------------------------------------------------ CBLOCK local1 ; max size is 16 byte !!! ; currently not used ENDC ; used: 0 byte, remaining: 16 byte #DEFINE menu_pos_row .215 #DEFINE menu_pos_column .1 #DEFINE view_row .215 #DEFINE view_column .124 sfmode CODE ;============================================================================= ; Boot tasks for all modes ; ; called after restart via the battery selection, after compass calibration, ; and via ghostwriter at the end of a dive ; global surfloop surfloop: clrf STKPTR ; clear return addresses stack ; clrf CCP1CON ; stop PWM ; bcf PORTC,2 ; pull PWM output to GND clrf CCPR1L ; backlight off call TFT_boot ; initialize TFT (includes clear screen) btfsc restart_fast ; shall make a fast restart? bra surfloop_1 ; YES ; show heinrichsweikamp logo WIN_TOP .40 WIN_LEFT .10 TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block IFDEF _ostc_logo ; show graphical OSTC logo WIN_TOP .100 WIN_LEFT .34 TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ELSE ; show textual OSTC logo WIN_COLOR color_white WIN_STD .30,.90 ; column, row STRCPY_PRINT "Open Source" ; show OSTC banner text, line 1 WIN_STD .20,.130 ; column, row STRCPY_PRINT "Tauch-Computer" ; show OSTC banner text, line 2 ENDIF WIN_COLOR color_white WIN_SMALL .35,.180 PUTC "v" ; print v call TFT_cat_firmware ; print x.y PUTC " " ; print _ call TFT_cat_beta_release ; print BetaZ or Release STRCAT_PRINT "" ; finalize output bcf win_invert ; clean up eventual color-coding call TFT_standard_color ; ditto call TFT_Display_FadeIn ; dim up the display surfloop_1: ;---- Do all useful initializations that take time ----------------------- ; set deco mode flags call restart_set_modes_and_flags bsf trigger_pres_cur_changed; set flag to have pressure written to display on first round of surface loop bsf trigger_temp_changed ; set flag to have temperature written to display on first round of surface loop call I2C_sleep_compass ; shut down compass call I2C_sleep_accelerometer ; shut down accelerometer clrf ext_flash_address+0 clrf ext_flash_address+1 clrf ext_flash_address+2 IFDEF _ccr_pscr movlw surface_sp ; load default surface setpoint (in cbar) movff WREG,char_I_const_ppO2 ; store it as current setpoint ENDIF IFDEF _external_sensor call transmit_setpoint ; transmit current setpoint (in cbar) via S8 digital interface (currently disabled) ENDIF bcf surfmode_menu ; not in surface menu (any more) bcf compass_menu ; not in "set bearing" selection (any more) bcf bailout_mode ; not in bailout menu (any more) bcf switch_left ; clear intermediate button event since start/restart bcf switch_right ; clear intermediate button event since start/restart btfsc restart_fast ; shall make a fast restart? bra surfloop_2 ; YES call wait_1s ; wait <= 1 second call wait_1s ; wait 1 second call wait_1s ; wait 1 second ;---- Fade to standard surface view -------------------------------------- call TFT_Display_FadeOut ; dim down display to black screen call TFT_ClearScreen ; clear screen surfloop_2: WIN_TOP .0 WIN_LEFT .0 WIN_FONT FT_SMALL bcf win_invert ; clear flag for inverted text ; show button functionalities WIN_COLOR color_lightblue WIN_SMALL menu_pos_column,menu_pos_row STRCPY_TEXT_PRINT tMenu ; show "<Menu" WIN_SMALL view_column,view_row STRCPY_TEXT_PRINT tView ; show "View>" call TFT_standard_color ;---- Logo in upper right corner ----------------------------------------- IFDEF _ostc_logo ; show graphical OSTC logo WIN_TOP .0 WIN_LEFT .70 TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ELSE ; show textual OSTC logo WIN_COLOR color_white ; set text color to white WIN_STD .100,.2 ; set output position STRCPY_PRINT "OSTC" ; show "OSTC" WIN_COLOR color_cyan ; set text color to cyan WIN_TINY .138,.2 ; set output position STRCPY_PRINT "hwOS" ; show "hwOS" WIN_TINY .137,.14 ; set output position IFDEF _hwos_sport STRCPY_PRINT "sport" ; show "sport" ELSE STRCPY_PRINT "tech" ; show "tech" ENDIF WIN_TINY .100,.32 ; set output position call TFT_show_firmware ; show firmware version ENDIF ; _ostc_logo ;---- fill screen -------------------------------------------------------- call get_battery_voltage ; get battery voltage call TFT_batt_surfmode ; display battery voltage call TFT_time_surfmode ; display time call TFT_date_surfmode ; display date call TFT_pres_surfmode ; display surface pressure call TFT_temp_surfmode ; display temperature call TFT_decotype_surface ; display deco mode TSTOSS opt_dive_mode ; in OC? (0=OC, 1=CC, 2=Gauge, 3=Apnea, 4=pSCR) call TFT_show_OC_startgas_surface ; YES - show first gas and "OSTC2-like" active gases movff customview_surfmode,active_customview ; reload last custom view call surf_customview_mask ; redraw last custom view call TFT_Display_FadeIn ; display resulting surface screen IFDEF _screendump btfsc screen_dump_avail ; screen dump function enabled? call enable_rs232 ; YES - activate RS232 (also sets CPU to normal speed) ENDIF bcf restart_fast ; clear flag for fast restart bsf imprint_surfmode_data ; start imprinting surface mode data bcf switch_left ; clear pending left button event bcf switch_right ; clear pending right button event rcall reset_timeout_surfmode ; reset timeout surfloop_loop: ; call TFT_debug_output ; optional debug output call test_switches_surfmode ; check switches btfsc request_next_custview ; shall show next custom view? call surf_customview_toggle ; YES - show next custom view (and clear this flag) btfss surfmode_menu ; shall enter surface menu? bra surfloop_loop_1 ; NO bcf imprint_surfmode_data ; YES - stop imprinting surface mode data goto do_main_menu ; - goto surface menu surfloop_loop_1: rcall housekeeping ; handle data imprinting, screen dump request, timeout and entering dive mode bra surfloop_loop ; loop in surface mode surfmode_check_for_warnings: clrf message_counter ; clear message counter ; warnings for all modes call check_warn_battery ; check if the battery level should be displayed/warned btfsc FLAG_apnoe_mode ; done for Apnoe or Gauge mode bra surfmode_check_for_warnings2 btfsc FLAG_gauge_mode ; done for Apnoe or Gauge mode bra surfmode_check_for_warnings2 ; warnings only in deco modes call check_and_store_sat_violation ; check/show tissue saturation call check_cns_violation ; check/show CNS value call check_mbubbles ; check/show micro bubbles warning movff int_O_lead_supersat+1,WREG ; get upper byte of leading tissue's supersaturation btfsc WREG,int_warning_flag ; check if the warning flag is set bra surfmode_check_for_warnings2 ; YES - outside model rcall surfmode_check_for_desat ; NO - check/display desaturation time rcall surfmode_check_for_nofly ; NO - check/display no-fly time surfmode_check_for_warnings2: ; setup message page number incf message_page,F ; increment page number bcf STATUS,C ; clear carry bit rlcf message_page,W ; each page can take two messages cpfsgt message_counter ; number of actual messages > message capacity ? clrf message_page ; NO - all messages could be shown, restart from first page next time ; clear both rows if there is nothing to show at all tstfsz message_counter ; any message to show? bra surfmode_check_for_warnings3 ; YES - look if second row needs to be cleared goto TFT_clear_message_window ; NO - clear complete message area and return surfmode_check_for_warnings3: ; clear 2nd row of messages if there is nothing to show (on this page) btfss message_2nd_row_used ; does the 2nd row contain a message? goto TFT_clear_message_window_row2 ; NO - clear the 2nd row and return return ; YES - done surfmode_check_for_desat: banksel int_O_desaturation_time movf int_O_desaturation_time+0,W iorwf int_O_desaturation_time+1,W banksel common ; back to bank common bnz surfmode_check_for_desat_1 ; is the desat-time > 0 ? return ; NO - done surfmode_check_for_desat_1: incf message_counter,F ; YES - increase counter call TFT_desaturation_time ; - show desaturation time return ; - done surfmode_check_for_nofly: banksel int_O_nofly_time movf int_O_nofly_time+0,W iorwf int_O_nofly_time+1,W banksel common ; back to bank common bnz surfmode_check_for_nofly_1 ; is the nofly-time > 0 ? return ; NO - done surfmode_check_for_nofly_1: incf message_counter,F ; YES - increase counter call TFT_nofly_time ; - show nofly-time return ; - done ;============================================================================= test_switches_surfmode: ; check buttons in surface mode btfsc switch_right ; right button pressed? bra test_switches_surfmode2 ; YES btfsc switch_left ; left button pressed? bra test_switches_surfmode3 ; YES return ; NO to both - done test_switches_surfmode2: ; right button pressed bcf switch_right ; clear button event rcall reset_timeout_surfmode ; reset timeout IFDEF _compass movlw .6 ; coding for surface custom compass view cpfseq active_customview ; in compass view? bra test_switches_surfmode2a ; NO btfss compass_menu ; "set course" selection shown? bra test_switches_surfmode2a ; NO bsf compass_bearing_set ; YES - set new course MOVII compass_heading_shown,compass_bearing bra test_switches_surfmode3b ; - clear "Course" label and return ENDIF test_switches_surfmode2a: bsf request_next_custview ; request next custom view bcf compass_menu ; "set course" selection not shown anymore return test_switches_surfmode3: ; left button pressed bcf switch_left ; clear button event rcall reset_timeout_surfmode ; reset timeout IFDEF _compass movlw .6 ; coding for surface custom view compass cpfseq active_customview ; in compass view? bra test_switches_surfmode3a ; NO btfsc compass_menu ; YES - "set course" selection already shown? bra test_switches_surfmode3b ; YES - remove it call TFT_surf_set_bearing ; NO - show it return ENDIF test_switches_surfmode3a: bcf compass_bearing_set ; clear course on entering menu bsf surfmode_menu ; flag that the surface menu shall be entered return IFDEF _compass test_switches_surfmode3b: WIN_BOX_BLACK .158,.190, .15, .99 ; clear "Course" label (top, bottom, left, right) bcf compass_menu ; clear flag for "set course" selection return ENDIF ; handle data imprinting, screen dump request, timeout and entering dive mode global housekeeping housekeeping: btfss trigger_full_second ; new 1/1 second begun? bra housekeeping_1 ; NO ; tasks any new second bcf trigger_full_second ; YES - clear flag call get_battery_voltage ; - get battery voltage btfsc imprint_time_date ; - shall imprint the current time & date? call TFT_show_time_date_menu ; YES - imprint time and date on display (copies running time to latch registers) IFDEF _rx_functions btfsc tr_functions_activated ; - TR functions activated? call I2C_get_tankdata ; YES - get new transmitter data btfsc imprint_xmitter_pres ; - shall imprint transmitter ID and pressure? call TFT_menu_tank_pres ; YES - imprint transmitter ID and pressure ENDIF btfss imprint_surfmode_data ; - shall imprint all surface mode data? bra housekeeping_0 ; NO call TFT_time_surfmode ; YES - update displayed time call TFT_batt_surfmode ; - update displayed battery voltage btfss timebase_1sec,0 ; - on even second? call surfmode_check_for_warnings ; YES - check for warnings and display/update them IFDEF _rx_functions btfss tr_functions_activated ; - TR functions activated? bra housekeeping_0 ; NO - skip tank pressure part call get_pressure_readings ; YES - get pressure readings call TFT_surface_tank_pres ; - update first gas/diluent pressure movf active_customview,W ; - get current custom view xorlw .10 ; - coding of tank data custom view btfsc STATUS,Z ; - equal? call TFT_surface_tankdata ; YES - update tank data custom view ENDIF housekeeping_0: bsf restart_fast ; default to doing a fast restart (no logos) call set_dive_modes ; check if dive mode needs to be entered, will set dive mode flag if yes btfsc simulatormode ; in simulator mode? bra housekeeping_1 ; YES - can't restart or go to sleep without prior cleanup btfsc divemode ; NO - need to enter dive mode? goto restart ; YES - restart, will proceed to dive mode btfss trigger_timeout ; NO - timeout? bra housekeeping_1 ; NO btfsc surfmode_menu ; YES - in surface menus? goto restart ; YES - goto restart, will proceed to surface mode bcf restart_fast ; NO - set next restart to be done slow, i.e. with logos goto sleeploop ; - goto sleep mode housekeeping_1: btfss trigger_quarter_second ; new 1/4 second begun? bra housekeeping_2 ; NO ; tasks any new 1/4 second bcf trigger_quarter_second ; YES - clear flag IFDEF _external_sensor btfsc imprint_sensor_mv ; - shall imprint sensor mV data? call TFT_menu_calibrate ; YES - imprint sensor mV data ENDIF ; _external_sensor btfss imprint_surfmode_data ; - shall imprint all surface mode data? bra housekeeping_2 ; NO btfsc trigger_pres_cur_changed ; YES - pressure changed? call TFT_pres_surfmode ; YES - display surface pressure bcf trigger_pres_cur_changed ; - clear flag (anyhow) IFDEF _compass movf active_customview,W ; - get current custom view xorlw .6 ; - coding of compass custom view btfsc STATUS,Z ; - equal? call TFT_surface_compass_heading ; YES - update compass view ENDIF ; _compass IFDEF _external_sensor btfsc FLAG_ccr_mode ; - in CCR mode? bra housekeeping_1a ; - YES - handle sensors btfsc FLAG_pscr_mode ; - in pSCR mode? bra housekeeping_1a ; YES - handle sensors bra housekeeping_2 ; NO to both housekeeping_1a: ; handle sensors movff opt_ccr_mode,WREG ; =0: fixed SP, =1: sensor, =2: autoSP decfsz WREG ; opt_ccr_mode = 1 (sensor)? bra housekeeping_2 ; NO - skip sensor readings call calc_deko_divemode_sensor ; YES - read & calculate sensor data call TFT_surface_sensor ; - update displayed sensor data call TFT_sensor_surface_warning ; - show a down-arrow behind sensor readings when sensor is at end-of-life movf active_customview,W ; - get current custom view xorlw .9 ; - coding of sensor mV readings custom view btfsc STATUS,Z ; - equal? call TFT_sensor_mV ; YES - update mV readings ENDIF ; _external_sensor housekeeping_2: btfss trigger_full_minute ; new 1/1 minute begun? bra housekeeping_3 ; NO ; tasks any new minute bcf trigger_full_minute ; YES - clear flag btfsc simulatormode ; - in simulator mode? bra housekeeping_2a ; YES - real tissues are in the vault, skip desaturation calculations call deco_calc_dive_interval_1min; NO - calculate 1 minute at surface conditions (C-code) call deco_calc_desaturation_time ; - calculate desaturation and no-fly/no-altitude time (C-code) banksel common ; - back to bank common housekeeping_2a: btfss imprint_surfmode_data ; - shall imprint all surface mode data? bra housekeeping_3 ; NO call TFT_date_surfmode ; YES - update displayed date btfsc trigger_temp_changed ; - temperature changed? call TFT_temp_surfmode ; YES - display temperature bcf trigger_temp_changed ; - clear flag (anyhow) movf active_customview,W ; - get current custom view xorlw .5 ; - coding of tissue custom view btfsc STATUS,Z ; - equal? call TFT_surface_tissues ; YES - update tissue diagram movf active_customview,W ; - get current custom view xorlw .8 ; - coding of last dive info custom view btfsc STATUS,Z ; - equal? call TFT_surface_lastdive ; YES - update last dive infos housekeeping_3: ; tasks any round IFDEF _screendump btfsc screen_dump_avail ; screen dump function enabled? call TFT_dump_screen_check ; YES - check if requested and do it ELSE btfsc comm_mode_disabled ; COMM mode disabled? return ; YES - done ENDIF btfss surfmode_menu ; in surface menus? return ; NO - done btfsc simulatormode ; currently in simulator (deco calculator) mode? return ; YES - suppress COMM mode to not jeopardize backup/restore of tissue data btfss vusb_in ; USB plugged in? return ; NO - done IFDEF _screendump btfsc screen_dump_avail ; YES - screen dump enabled? return ; YES - no COMM mode to be able to make screen shots of the menu and simulator mode ENDIF goto comm_mode_usb ; YES / NO - proceed to COMM mode, will also set CPU to speed normal global reset_timeout_surfmode reset_timeout_surfmode: movlw surfmode_timeout_default ; load default timeout value btfsc imprint_sensor_mv ; currently imprinting O2 sensor mV data? movlw surfmode_timeout_calibrate ; YES - replace with CCR Calibrate Menu timeout btfsc simulatormode ; currently in simulator (deco calculator) mode? movlw surfmode_timeout_simulator ; YES - replace with simulator timeout IFDEF _rx_functions btfsc imprint_xmitter_ID ; currently selecting pressure transmitter? movlw surfmode_timeout_xmitter ; YES - replace with transmitter selection timeout ENDIF ; _rx_functions IFDEF _external_sensor btfsc surfmode_menu ; in surface menu? bra reset_timeout_time ; YES - keep timeout value btfsc FLAG_ccr_mode ; NO - in CCR mode? bra reset_timeout_surfmode_loop ; YES - continue checking if in sensor mode btfsc FLAG_ccr_mode ; NO - in pSCR mode? bra reset_timeout_surfmode_loop ; YES - continue checking if in sensor mode bra reset_timeout_time ; NO - keep timeout value reset_timeout_surfmode_loop: movff opt_ccr_mode,lo ; get loop mode (=0: fixed/calculated SP, =1: sensor, =2: auto SP) decfsz lo,f ; in sensor mode? bra reset_timeout_time ; NO - keep timeout value movlw surfmode_timeout_sensor ; YES - replace with sensor mode timeout ENDIF ; _external_sensor ;bra reset_timeout_time ; - set timeout value global reset_timeout_time reset_timeout_time: ; entry point with timeout value in WREG movwf isr_timeout_reload ; copy WREG to isr_timeout_reload bsf reset_timeout ; request ISR to reset the timeout bcf trigger_timeout ; clear any pending timeout trigger return ; done ;----------------------------------------------------------------------------- END