@@ -32,9 +32,9 @@ class SegAnimationExt : public SegBuffer {
3232 uint8_t from,
3333 bool dec = 1 ) : SegBuffer(buffer, size, dec),
3434 buffer (buffer),
35- _size(size),
3635 _disp(disp),
37- _from(min(from, size)) {}
36+ _from(min(from, disp->getSize ())),
37+ _size(min(size, (uint8_t )(disp->getSize () - _from))) {}
3838
3939 // установить эффект и время его выполнения в мс
4040 void setEffect (SegEffect eff, uint16_t duration = 300 ) {
@@ -68,7 +68,7 @@ class SegAnimationExt : public SegBuffer {
6868
6969 // true - эффект воспроизводится
7070 bool running () {
71- return _count;
71+ return _state && ( _count || _differ ()) ;
7272 }
7373
7474 // ждать окончания воспроизведения эффекта
@@ -91,7 +91,13 @@ class SegAnimationExt : public SegBuffer {
9191
9292 // ручной тикер. Вернёт 0 в холостом, 1 при новом шаге, 2 при завершении анимации
9393 uint8_t tickManual () {
94- if (_eff == SegEffect::None) return 0 ;
94+ if (_eff == SegEffect::None) {
95+ if (_differ ()) {
96+ refresh ();
97+ return GS_ANIMATION_END ;
98+ }
99+ return GS_ANIMATION_IDLE ;
100+ }
95101
96102 if (_count) {
97103 if (_maskall) {
@@ -112,7 +118,7 @@ class SegAnimationExt : public SegBuffer {
112118 if (!_maskall) {
113119 _mask = 0 ;
114120 for (uint8_t i = 0 ; i < min (_size, (uint8_t )32 ); i++) {
115- if (( _disp->buffer [_from + i] & 0x7F ) != ( buffer[i] & 0x7F ) ) _mask |= (1ul << i);
121+ if (_disp->buffer [_from + i] != buffer[i]) _mask |= (1ul << i);
116122 }
117123 }
118124 }
@@ -124,9 +130,9 @@ class SegAnimationExt : public SegBuffer {
124130 uint8_t * buffer = nullptr ;
125131
126132 private:
127- uint8_t _size;
128133 SegBuffer* _disp;
129134 uint8_t _from;
135+ uint8_t _size;
130136
131137 uint16_t _tmr = 0 , _prd = 100 ;
132138 SegEffect _eff = SegEffect::None;
@@ -137,7 +143,7 @@ class SegAnimationExt : public SegBuffer {
137143
138144 bool _differ () {
139145 for (uint8_t i = 0 ; i < _size; i++) {
140- if (( _disp->buffer [_from + i] & 0x7F ) != ( buffer[i] & 0x7F ) ) return 1 ;
146+ if (_disp->buffer [_from + i] != buffer[i]) return 1 ;
141147 }
142148 return 0 ;
143149 // return memcmp(_disp->buffer + _from, buffer, _size);
@@ -201,4 +207,4 @@ class SegAnimationExt : public SegBuffer {
201207 _bitcpy (dst, 6 , src, 3 );
202208 }
203209 }
204- };
210+ };
0 commit comments