Mercurial > public > hwos_code
diff src/sleepmode.asm @ 490:8dfb93e80338
NEW: Deep Sleep mode for OSTC Plus and OSTC 2 (2017) (Entered automatically)
NEW: Logbook detail page in larger font (And nicer layout)
CHANGE: Sleep mode current slightly reduced for all hwOS devices
NEW: Logbook now records battery information
NEW: Markers in internal logbook drawn as small "m" next to the profile
author | heinrichsweikamp |
---|---|
date | Wed, 29 Mar 2017 21:35:12 +0200 |
parents | aadfe9f2edaf |
children | 66b9b8c082a9 |
line wrap: on
line diff
--- a/src/sleepmode.asm Mon Mar 27 16:06:09 2017 +0200 +++ b/src/sleepmode.asm Wed Mar 29 21:35:12 2017 +0200 @@ -34,43 +34,142 @@ sleeploop: ; enter sleepmode! call disable_ir_s8 ; IR/S8 off call mcp_sleep - bcf LEDg - bcf LEDr + bcf LEDg + bcf LEDr movff menupos3,customview_surfmode; save last customview call TFT_Display_FadeOut call TFT_DisplayOff ; display off + bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) call disable_rs232 ; USB off - call vault_decodata_into_eeprom ; store deco data - call I2C_sleep_accelerometer - call I2C_sleep_compass + call vault_decodata_into_eeprom ; store deco data call ext_flash_enable_protection ; enable write protection for external flash call update_battery_registers ; update battery registers into EEPROM clrf divemins+0 clrf divemins+1 + clrf apnoe_max_pressure+0 + clrf apnoe_max_pressure+1 call speed_normal - bsf no_sensor_int ; No sensor interrupt - bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) - clrf ADCON0 ; Power-Down ADC Module + bsf no_sensor_int ; No sensor interrupt + clrf ADCON0 ; Power-Down ADC Module +sleeploop_pre: + bcf deep_sleep ; Normal sleepmode + call I2C_sleep_accelerometer + call I2C_sleep_compass + btfss analog_switches + bra sleeploop_loop ; no analog switches + + bsf power_sw1 + bsf power_sw2 + movlw .4 ; Wait for button circuity + movwf apnoe_max_pressure+0 ; Used as temp + bcf onesecupdate +sleeploop_pre1: + sleep + sleep + btfss onesecupdate ; Wait 1 second + bra sleeploop_pre1 + bcf onesecupdate + decfsz apnoe_max_pressure+0,F + bra sleeploop_pre1 + + movlw .32 ; Wait for button circuity + movwf apnoe_max_pressure+0 ; Used as temp +sleeploop_pre2: + call get_analog_switches + decfsz apnoe_max_pressure+0,F + bra sleeploop_pre2 + + bcf PIR1,TMR1IF + bcf INTCON,INT0IF + bcf INTCON3,INT1IF + bcf PIR5,TMR7IF + bcf switch_left + bcf switch_right + bcf analog_sw2_pressed + bcf analog_sw1_pressed + bsf PIE1,0 ; (Re)Start Timer 1 Interrupt + bsf PIE2,1 ; (Re)Start Timer 2 Interrupt + bsf PIE5,3 ; (Re)Start Timer 7 Interrupt + bsf INTCON,4 ; (Re)Start INT0 Interrupt + bsf INTCON3,3 ; (Re)Start INT1 Interrupt + sleeploop_loop: btfsc onesecupdate ; one second in sleep? rcall onesec_sleep ; check switches, check pressure sensor, etc. - btfss sleepmode ; wake up? (This bit will be set in other routines) - goto restart ; yes + btfss sleepmode ; wake up? (This bit will be set in other routines) + goto restart ; yes + + btfsc deep_sleep ; Enter deep sleep? + bra deepsleep ; Yes rcall sleepmode_sleep ; Wait at least 35ms (every 62,5ms Timer7 wakeup) ; Any button pressed in sleep? - btfsc switch_left - rcall onesec_sleep1a - btfsc switch_right - rcall onesec_sleep1a - - btfss sleepmode ; wake up? (This bit will be set in other routines) - goto restart ; yes +; btfsc switch_left +; rcall onesec_sleep1a +; btfsc switch_right +; rcall onesec_sleep1a +; +; btfss sleepmode ; wake up? (This bit will be set in other routines) +; goto restart ; yes bra sleeploop_loop ; do loop until someting happens +deepsleep: + btfss analog_switches + return ; no analog switches + + bcf PIE1,0 ; Stop Timer 1 Interrupt + bcf PIE2,1 ; Stop Timer 2 Interrupt + bcf PIE5,3 ; Stop Timer 7 Interrupt + bcf INTCON,4 ; Stop INT0 Interrupt + bcf INTCON3,3 ; Stop INT1 Interrupt + bcf power_sw1 + bcf power_sw2 + rcall deepsleep_get_accel ; Read accelerometer into WREG + movwf apnoe_max_pressure+0 ; Store init value + +deepsleep_loop: + btfsc onesecupdate ; one second in sleep? + rcall onesec_deepsleep ; check accelerometer + + btfsc onesecupdate ; one second in sleep? + rcall onesec_sleep ; check switches, check pressure sensor, etc. + + sleep + + btfss deep_sleep ; Enter normal sleepmode? + bra sleeploop_pre ; Yes + + bra deepsleep_loop ; do loop until someting happens + +onesec_deepsleep: + rcall deepsleep_get_accel ; Read accelerometer into WREG + subwf apnoe_max_pressure+0,W ; apnoe_max_pressure+0 - accel_DZ+0 -> WREG + btfsc STATUS,N ; Result negative? + negf WREG ; Yes, negate it + movwf apnoe_max_pressure+1 ; change of acceleration in Z-axis + movlw .50 ; Threshold (mg) + cpfslt apnoe_max_pressure+1 ; bigger then the threshold? + bcf deep_sleep ; Yes! + +; extern piezo_config_tx +; movff apnoe_max_pressure+0,WREG +; call piezo_config_tx +; movff accel_DZ+0,WREG +; call piezo_config_tx +; movff apnoe_max_pressure+1,WREG +; call piezo_config_tx + return + +deepsleep_get_accel: + call I2C_init_compass + call I2C_RX_accelerometer ; read Accelerometer + call I2C_sleep_compass + movff accel_DZ+0,WREG + return + onehour_sleep: call update_battery_registers ; update battery registers into EEPROM call vault_decodata_into_eeprom ; update deco data @@ -78,9 +177,12 @@ return onemin_sleep: - btfsc onehourupdate ; one hour in sleep? - rcall onehour_sleep ; Yes + btfsc onehourupdate ; one hour in sleep? + rcall onehour_sleep ; Yes + btfsc battery_gauge_available + call get_battery_voltage ; Check for charger + ;---- adjust airpressure compensation any 15 minutes incf divemins+1,F ; counts to 14... movlw d'14' @@ -88,6 +190,8 @@ bra onemin_sleep2 ; 15 minutes not done! ; Tasks every 15 minutes in sleep + bsf deep_sleep ; enter deep-sleep mode + clrf divemins+1 ; reset counter call deco_calc_CNS_decrease_15min ; compute CNS decay in sleep only @@ -125,18 +229,18 @@ btfsc oneminupdate ; one minute in sleep? rcall onemin_sleep ; do oneminute tasks, e.g. calculate desaturation - btfsc battery_gauge_available - call get_battery_voltage ; Check for charger +; btfsc battery_gauge_available +; call get_battery_voltage ; Check for charger - incf divemins+0,F ; counts to #test_pressure_in_sleep (5) - movlw d'5' - cpfsgt divemins+0 ; here: temp variable - bra onesec_sleep1 ; #test_pressure_in_sleep not done yet + incf divemins+0,F ; counts to #test_pressure_in_sleep (10) + movlw d'10' + cpfsgt divemins+0 ; here: temp variable + bra onesec_sleep1 ; #test_pressure_in_sleep not done yet clrf divemins+0 ; clear counter rcall pressuretest_sleep_fast ; Gets pressure without averaging (faster!) ; compare current ambient pressure with wake_up_from_sleep - movlw LOW wake_up_from_sleep + movlw LOW wake_up_from_sleep movwf sub_a+0 ; power on if ambient pressure is greater threshold movlw HIGH wake_up_from_sleep movwf sub_a+1 ; power on if ambient pressure is greater threshold @@ -151,20 +255,20 @@ bra onesec_sleep1a ; Yes, skip button checks, wake up! onesec_sleep1: - bcf onesecupdate ; all done. + bcf onesecupdate ; all done. ; Check switches btfsc switch_left - bra onesec_sleep1a + bra onesec_sleep1a btfsc switch_right - bra onesec_sleep1a + bra onesec_sleep1a ; No button pressed - bcf INTCON,INT0IF ; Clear flag - bcf INTCON3,INT1IF ; Clear flag +; bcf INTCON,INT0IF ; Clear flag +; bcf INTCON3,INT1IF ; Clear flag return onesec_sleep1a: ; At least one button pressed or amb_pressure > wake_up_from_sleep - bcf INTCON,INT0IF ; Clear flag - bcf INTCON3,INT1IF ; Clear flag +; bcf INTCON,INT0IF ; Clear flag +; bcf INTCON3,INT1IF ; Clear flag bcf sleepmode ; wake up! SAFE_2BYTE_COPY last_surfpressure_30min, amb_pressure ; copy for compatibility movlw .0