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