Mercurial > public > hwos_code
view src/surfmode.asm @ 621:1ad0531e9078
3.01 release
author | heinrichsweikamp |
---|---|
date | Sat, 23 Feb 2019 16:51:14 +0100 |
parents | ca4556fb60b9 |
children | c40025d8e750 |
line wrap: on
line source
;============================================================================= ; ; File surfmode.asm REFACTORED VERSION V2.99e ; ; Surfacemode ; ; 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 "isr.inc" #include "adc_lightsensor.inc" #include "menu_processor.inc" #include "strings.inc" #include "sleepmode.inc" #include "wait.inc" ; speed_* #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" IFDEF _rx_functions #include "rx_ops.inc" ENDIF extern do_main_menu extern TFT_sensor_mV extern TFT_surface_compass_heading extern check_cns_violation extern check_warn_battery extern check_and_store_gf_violation extern check_mbubbles IFDEF _osct_logo extern ostc_logo_block 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 global surfloop surfloop: call speed_normal bcf no_sensor_int ; normal pressure mode bcf LEDr clrf CCP1CON ; stop PWM bcf PORTC,2 ; pull PWM output to GND call TFT_boot ; initialize TFT (includes clear screen) bcf restore_deco_data WIN_TOP .40 WIN_LEFT .10 TFT_WRITE_PROM_IMAGE_BY_ADDR hw_logo_block ; show heinrichsweikamp logo IFDEF _ostc_logo WIN_TOP .100 WIN_LEFT .34 TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ; show OSTC logo ELSE 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 ; show splash ;---- Do any useful initializes that takes time ------------------------- call restart_set_modes_and_flags ; sets deco mode flags bcf pressure_refresh call I2C_sleep_compass call I2C_sleep_accelerometer clrf ext_flash_address+0 clrf ext_flash_address+1 clrf ext_flash_address+2 movlw surface_sp ; in cbar call transmit_setpoint ; transmit current setpoint from WREG (in cbar) to external electronics clrf timeout_counter2 ; clrf timeout_counter3 ; not used / required [rl] bcf menubit ; clear menu flag bcf premenu ; clrf last_pressure+0 ; clrf last_pressure+1 bcf FLAG_bailout_mode ; =1: Bailout bcf FLAG_diluent_setup ; use OC gases for gaslist routine bcf simulatormode_active ; quit simulator mode (if active) 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 ; go to black screen call TFT_ClearScreen ; then change everything WIN_TOP .0 WIN_LEFT .0 WIN_FONT FT_SMALL bcf win_invert ; reset invert flag WIN_COLOR color_lightblue WIN_SMALL menu_pos_column,menu_pos_row STRCPY_TEXT_PRINT tMenu ;"<Menu" WIN_SMALL view_column,view_row STRCPY_TEXT_PRINT tView ;"View>" call TFT_standard_color ; Logo IFDEF _ostc_logo WIN_TOP .0 WIN_LEFT .70 TFT_WRITE_PROM_IMAGE_BY_LABEL ostc_logo_block ; show OSTC logo ELSE WIN_COLOR color_white WIN_STD .100,.0 STRCPY_PRINT "OSTC" ; show "OSTC" WIN_COLOR color_cyan WIN_TINY .140,.0 STRCPY_PRINT "hwOS" ; show "hwOS" WIN_TINY .139,.12 STRCPY_PRINT "tech" ; show "tech" ENDIF call TFT_clock ; display time call update_surfloop60 call get_battery_voltage ; get battery voltage call TFT_update_batt_voltage ; display battery voltage call TFT_update_surf_press ; display surface pressure call TFT_temp_surfmode ; display temperature call TFT_display_decotype_surface call calc_deko_divemode_sensor 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,menupos3; reload last custom view call surf_customview_mask ; redraw last custom view call TFT_Display_FadeIn ; display resulting surface screen bcf switch_left bcf switch_right ;---- Late initializations ----------------------------------------------- movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values movff last_surfpressure_30min+0,last_surfpressure+0 ; use 30min old air pressure movff last_surfpressure_30min+1,last_surfpressure+1 ; use 30min old air pressure movff opt_GF_low,char_I_GF_Low_percentage movff opt_GF_high,char_I_GF_High_percentage ; Startup tasks for all modes ; Desaturation time needs: ; int_I_pres_surface ; char_I_desaturation_multiplier call deco_calc_desaturation_time ; calculate desaturation time banksel common IFDEF _screendump btfsc enable_screen_dumps ; =1: ignore vin_usb, wait for "l" command (Screen dump) call enable_rs232 ; also sets to speed_normal ENDIF surfloop_loop: btfss onesecupdate ; do every second tasks? bra surfloop_loop2 ; NO - loop ; one second tasks for all modes call speed_normal ;call TFT_debug_output call TFT_clock ; update clock call timeout_surfmode ; check timeout call get_battery_voltage ; get battery voltage call TFT_update_batt_voltage ; display battery voltage call set_dive_modes ; tests if depth > threshold btfss secs,0 ; every two seconds... call TFT_temp_surfmode ; ... displays temperature btfss secs,0 ; every two seconds... call surfmode_check_for_warnings ; ... check for warnings (and display/update) them bcf onesecupdate ; every second tasks done IFDEF _rx_functions btfss FLAG_tr_enabled ; YES - TR functions enabled? bra surfloop_loop2 ; NO - skip tank pressure part call get_pressure_readings ; YES - get pressure readings call TFT_surface_tank_pres ; - update first gas/diluent pressure movlw .10 ; - number of tank data custom view cpfseq menupos3 ; - in tank data custom view? bra surfloop_loop2 ; NO - skip call TFT_surface_tankdata ; YES - update tank data custom view ENDIF surfloop_loop2: ; tasks approx. every 50 ms for all modes call test_switches_surfmode ; check switches ;call TFT_debug_output ; one minute tasks for all modes btfsc oneminupdate ; do every minute tasks call update_surfloop60 ; yes, e.g. update time and date ; mode tasks btfsc divemode ; divemode active? goto diveloop ; YES - switch into divemode! btfsc menubit ; shall enter menu? goto do_main_menu ; YES - enter menu btfsc pressure_refresh ; new pressure available? call TFT_update_surf_press ; display surface pressure bcf pressure_refresh ; until new pressure is available ; updates every 1/4 second btfss quarter_second_update bra surfloop_loop2b bcf quarter_second_update ; update sensors call calc_deko_divemode_sensor btfsc FLAG_ccr_mode ; in CCR mode? bra surfloop_loop2a1 ; YES btfsc FLAG_pscr_mode ; in pSCR mode? bra surfloop_loop2a1 ; YES bra surfloop_loop2a ; NO to both surfloop_loop2a1: movff opt_ccr_mode,WREG ; =0: fixed SP, =1: sensor, =2: auto SP decfsz WREG ; opt_ccr_mode = 1 (sensor)? bra surfloop_loop2a ; NO - skip sensor readings call TFT_surface_sensor ; ...update sensor data in surface mode call TFT_sensor_surface_warning ; show a warning arrow-down behind sensor readings when sensor is end-of-life movlw .9 cpfseq menupos3 ; in sensor mV surface custom view? bra surfloop_loop2a ; NO call TFT_sensor_mV ; YES - update mV readings (Each 1/4 second and not each second as in customview.asm) surfloop_loop2a: movlw .6 cpfseq menupos3 ; in compass view? bra surfloop_loop2b ; NO call TFT_surface_compass_heading ; YES - update compass heading value surfloop_loop2b: btfsc toggle_customview ; next view? call surf_customview_toggle ; YES - show next customview (and delete this flag) IFDEF _screendump btfsc enable_screen_dumps ; screendump enabled? call TFT_dump_screen_check ; YES - check if requested and do it ENDIF ;btfsc vusb_in ; USB plugged in? | commented out - do not start COMM mode when charging in surface mode ;call comm_mode ; YES - start COMM mode | btfss sleepmode ; shall we go into sleep mode? bra surfloop_loop ; NO - loop in surface mode movff menupos3,customview_surfmode; YES - save last custom view goto sleeploop ; switch into sleep mode update_surfloop60: ; one minute tasks for all modes call TFT_date ; update date call deco_calc_dive_interval_1min; calculate deco in surface mode. int_I_pres_surface gets updated by call deco_calc_desaturation_time ; TFT_update_surf_press when amb_pressure has changed by >= 10 mbar banksel common ; update tissue diagram if it is on display movlw .5 ; number of tissue custom view cpfseq menupos3 ; is this the current custom view? bra update_surfloop60_1 ; NO call TFT_standard_color ; YES - set standard color call TFT_surface_tissues ; show tissue diagram update_surfloop60_1: ; update last dive info if it is on display movlw .8 ; number of the last dive info custom view cpfseq menupos3 ; is this the current custom view? bra update_surfloop60_2 ; NO call TFT_standard_color ; YES - set standard color call TFT_surface_lastdive ; show last dive infos update_surfloop60_2: bcf oneminupdate return surfmode_check_for_warnings: bcf message_attention ; clear flag for messages of level attention bcf message_warning ; clear flag for messages of level warning 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 rcall surfmode_check_for_desat ; check if desat time should be shown rcall surfmode_check_for_nofly ; check if nofly time should be shown call check_cns_violation ; check CNS value and display it, if required call check_and_store_gf_violation; check GF value and display it, if required call check_mbubbles ; check for micro bubbles surfmode_check_for_warnings2: ; setup message page number incf message_page,F bcf STATUS,C rlcf message_page,W ; *2 cpfsgt message_counter ; > message_counter? clrf message_page ; NO - clear ; clear both rows of warnings if there is nothing to show at all tstfsz message_counter ; any warnings? bra surfmode_check_for_warnings3; YES - look if second row needs to be cleared call TFT_clear_warning_text ; NO - clear complete warnings area return surfmode_check_for_warnings3: ; clear 2nd row of warnings if there is nothing to show (on this page) btfss second_row_warning ; =1: The second row contains a warning call TFT_clear_warning_text_2nd_row ; NO - clear this row return ; 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 bnz surfmode_check_for_desat_1 ; is the desat-time > 0 ? return ; NO surfmode_check_for_desat_1: ; YES incf message_counter,F ; increase counter call TFT_desaturation_time ; show desaturation time return 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 bnz surfmode_check_for_nofly_1 ; is the nofly-time > 0 ? return ; NO surfmode_check_for_nofly_1: ; YES incf message_counter,F ; increase counter call TFT_nofly_time ; show nofly-time return ;============================================================================= test_switches_surfmode: ; check switches in surfacemode btfsc switch_right bra test_switches_surfmode2 btfsc switch_left bra test_switches_surfmode3 ; no button pressed return test_switches_surfmode3: movlw .6 cpfseq menupos3 ; in compass view? bra test_switches_surfmode3a ; NO btfsc premenu ; "Bearing" already shown? bra test_switches_surfmode3b ; YES - remove it call TFT_surf_set_bearing ; NO - show it bcf switch_left return test_switches_surfmode3a: bcf switch_left bcf compass_bearing_set ; clear bearing on entering menu bsf menubit ; enter the main menu return test_switches_surfmode3b: ; clear "Bearing" WIN_BOX_BLACK .158,.190, .15, .99 ; top, bottom, left, right bcf premenu bcf switch_left return test_switches_surfmode2: movlw .6 cpfseq menupos3 ; in compass view? bra test_switches_surfmode2a ; NO btfss premenu ; "Heading?" shown? bra test_switches_surfmode2a ; NO ; set new heading bcf premenu bsf compass_bearing_set movff compass_heading_shown+0,compass_bearing+0 movff compass_heading_shown+1,compass_bearing+1 bcf switch_right return test_switches_surfmode2a: bcf switch_right bsf toggle_customview bcf premenu clrf timeout_counter2 ; and reset timeout return global timeout_surfmode timeout_surfmode: movlw timeout_surfacemode ; load default timeout btfsc menu_update_sensor_mv ; in the "Calibrate" menu? movlw timeout_calibrate_menu ; YES - replace with CCR Calibrate Menu timeout IFDEF _rx_functions btfsc FLAG_pairing_mode ; in the "Setup Tank" menu? movlw timeout_tanksetup_menu ; YES - replace with Tank Setup Menu timeout ENDIF btfsc menubit ; in menu? bra timeout_testmode ; NO - done ; must be in surface mode btfss FLAG_ccr_mode ; in CCR mode? (fixed ppO2 or sensor) bra timeout_testmode ; NO - not CCR movlw timeout_ccr_surface ; YES - replace with CCR surface mode timeout global timeout_testmode timeout_testmode: incf timeout_counter2,F ; increase timeout counter cpfsgt timeout_counter2 ; compare with timeout limit return ; return, no timeout bsf sleepmode ; set flag return ; return END