diff --git a/avr/modules/lcd2/gui2/aqhome/sensorwatch.asm b/avr/modules/lcd2/gui2/aqhome/sensorwatch.asm index 3e78a89..888b65a 100644 --- a/avr/modules/lcd2/gui2/aqhome/sensorwatch.asm +++ b/avr/modules/lcd2/gui2/aqhome/sensorwatch.asm @@ -14,6 +14,8 @@ ; *************************************************************************** ; defines +.equ SENSORWATCH_AVG_VALUE_COUNT = 4 ; CAVEAT: change sensorWatchAvgValues if value changes! + .equ SENSORWATCH_OFFS_BEGIN = VLAYOUT_SIZE .equ SENSORWATCH_OFFS_BASEVALUEID = SENSORWATCH_OFFS_BEGIN+0 .equ SENSORWATCH_OFFS_EEPROMID = SENSORWATCH_OFFS_BEGIN+1 @@ -30,7 +32,10 @@ .equ SENSORWATCH_OFFS_VALUE_LO = SENSORWATCH_OFFS_BEGIN+12 .equ SENSORWATCH_OFFS_VALUE_HI = SENSORWATCH_OFFS_BEGIN+13 .equ SENSORWATCH_OFFS_TYPE = SENSORWATCH_OFFS_BEGIN+14 -.equ SENSORWATCH_SIZE = SENSORWATCH_OFFS_BEGIN+15 +.equ SENSORWATCH_OFFS_VALUES_CNT = SENSORWATCH_OFFS_BEGIN+15 +.equ SENSORWATCH_OFFS_VALUES_IDX = SENSORWATCH_OFFS_BEGIN+16 +.equ SENSORWATCH_OFFS_VALUES_ARRAY = SENSORWATCH_OFFS_BEGIN+17 +.equ SENSORWATCH_SIZE = SENSORWATCH_OFFS_VALUES_ARRAY+(SENSORWATCH_AVG_VALUE_COUNT*2) ; values (not used for now) .equ SENSORWATCH_VALUE = WIDGET_VALUE_NEXTFREE+0 @@ -336,6 +341,91 @@ SensorWatch_GetValueLabel: +; --------------------------------------------------------------------------- +; @routine sensorWatchAddValue +; +; @param r19:r18 new value +; @clobbers r16-r19 + +sensorWatchAddValue: + push xl + push xh + mov xl, yl + mov xh, yh + adiw xh:xl, SENSORWATCH_OFFS_VALUES_ARRAY + ldd r16, Y+SENSORWATCH_OFFS_VALUES_IDX + clr r17 + lsl r16 + rol r17 + add xl, r16 + adc xh, r17 + st X+, r18 + st X, r19 + ldd r16, Y+SENSORWATCH_OFFS_VALUES_IDX + inc r16 + cpi r16, SENSORWATCH_AVG_VALUE_COUNT + brcs sensorWatchAddValue_storeIdx + clr r16 +sensorWatchAddValue_storeIdx: + std Y+SENSORWATCH_OFFS_VALUES_IDX, r16 + ldd r16, Y+SENSORWATCH_OFFS_VALUES_CNT + cpi r16, SENSORWATCH_AVG_VALUE_COUNT + brcc sensorWatchAddValue_done + inc r16 + std Y+SENSORWATCH_OFFS_VALUES_CNT, r16 +sensorWatchAddValue_done: + pop xh + pop xl + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine sensorWatchAvgValues +; +; @clobbers r16-r22 + +sensorWatchAvgValues: + ldd r22, Y+SENSORWATCH_OFFS_VALUES_CNT + cpi r22, SENSORWATCH_AVG_VALUE_COUNT + brcs sensorWatchAvgValues_ret ; array not full, don't update + + clr r16 ; r18:r17:r16=sum of values + clr r17 + clr r18 + clr r19 ; zero to be added below + push xl + push xh + mov xl, yl + mov xh, yh + adiw xh:xl, SENSORWATCH_OFFS_VALUES_ARRAY +sensorWatchAvgValues_loop: + ld r20, X+ + ld r21, X+ + add r16, r20 + adc r17, r21 + adc r18, r19 + dec r22 + brne sensorWatchAvgValues_loop + pop xh + pop xl +.if SENSORWATCH_AVG_VALUE_COUNT == 4 + lsr r18 ; /2 + ror r17 + ror r16 + lsr r18 ; /4 + ror r17 + ror r16 +.endif + std Y+SENSORWATCH_OFFS_VALUE_LO, r16 + std Y+SENSORWATCH_OFFS_VALUE_HI, r17 +sensorWatchAvgValues_ret: + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine SensorWatch_OnRecvReport @global ; @@ -353,16 +443,11 @@ SensorWatch_OnRecvReport: cp r16, r17 brne SensorWatch_OnRecvReport_ret ; store value - std Y+SENSORWATCH_OFFS_VALUE_LO, r18 - std Y+SENSORWATCH_OFFS_VALUE_HI, r19 - + rcall sensorWatchAddValue ; (r16-r19) + rcall sensorWatchAvgValues ; (r16-r22) ; setup background color - push xl - push xh - rcall sensorWatchSetColor ; (any, !Y) - rcall sensorWatchSetValueLabel ; (any, !Y) - pop xh - pop xl + rcall sensorWatchSetColor ; (any, !Y) + rcall sensorWatchSetValueLabel ; (any, !Y) SensorWatch_OnRecvReport_ret: clc ret