Автор | Сообщение |
|
Отправлено: 24.08.16 16:32. Заголовок: Слайдер и задержка
Добрый день, Получаю аналоговое значение со слайдера, в Simpl + преобразую это все в нужный формат строки и кидаю по TCP. Только не хочется обрабатывать каждый шаг изменения слайдера. В идеале задержку на обработку значения. То есть пользователь хоть пол часа будет дергать слайдер, но только как он его отпустит и пройдет пауза 1 секунда без изменения значения, то последнее значение обрабатывается и кидаетсяв сеть. Пробовал Delay вставить в процедуру CHANGE Value_Input { Delay(200); Serial_Out = ITOA(Value_Input) + "\x0D\x0A"; } Но он с задержкой все равно все изменения мне обрабатывает. А как можно прервать ожидание Delay(200) и запустить его заново, пока идет изменение Value_Input? Спасибо.
|
|
|
Ответов - 12
[только новые]
|
|
|
| постоянный участник
|
|
|
Отправлено: 24.08.16 16:46. Заголовок: Зачем так? Нужно отп..
Зачем так? Нужно отправлять значение когда юзер палец от экрана оторвал или изменения остановились на 0.2-0.3 сек. Для регулирования громкости такой способ вообще неприемлем.
|
|
|
|
Отправлено: 24.08.16 17:14. Заголовок: Это не громкость. Уп..
Это не громкость. Управление шторами Lutron. Получилось с пальцем от экрана. Только у Shade Controller есть такая особенность. Если нажать на Shade Controller и пальцем потянуть вверх или вниз, выходя за границы слайдера, то значение слайдера изменится, а когда палец отпускаешь за пределами слайдера, то Join остается высоким до тех пор пока я вновь не нажму на слайдер. Итог: значение слайдера изменилось а штора не поехала(
|
|
|
|
Отправлено: 24.08.16 17:15. Заголовок: Игорь K. а каким обр..
Игорь K. а каким образом отследить что изменения остановились на 0.2-0.3 сек?
|
|
|
|
Отправлено: 24.08.16 20:37. Заголовок: RuckShot1 пишет: А ..
RuckShot1 пишет: цитата: | А как можно прервать ожидание Delay(200) и запустить его заново, пока идет изменение Value_Input? |
| Используйте wait: CHANGE Value_Input { CancelAllWait (); //любое новое измнение рестартует wait, закрывая запущенный ранее не выполняя его тело и запускает новый wait(20) //отправка при отсутствии изменений по истечении 0.2с { Serial_Out = ITOA(Value_Input) + "\x0D\x0A"; } }
|
|
|
|
Отправлено: 24.08.16 21:03. Заголовок: Вячеслав пишет: Can..
Игорь K. пишет: цитата: | Зачем так? Нужно отправлять значение когда юзер палец от экрана оторвал или изменения остановились на 0.2-0.3 сек. |
| Например для [Color Piker] который разом шлёт 3 аналога, только вот приходят они (иногда) с микро запазданием. Или для управления 3 слайдерами R & G & B, чтоб слалось конечное значение со всех 3 например с задержкой 5 сек. а не по отпусканию каждого. При этом фидбыки можно вывести без задержки в Color Chip для наглядности выбора перед тем как пошлётся. Если не охота кнопку [Применить] для ручного отправления после выбора цвета. Вячеслав пишет: Сбросит все таймеры что не есть гуд Мой вариант... пришол к нему... когда вынес себе мозг с 3мя (CHANGE RED,GREEN,BLUE) значениями RGB в один DTP232 (0xFFFFFF) для KNX THREADSAFE - по желанию ... integer SendDelay = 200; THREADSAFE CHANGE INPUT; { TRACE ("Бл.... опять поменялось"); Wait(SendDelay,SendingDelayTimer){ // SendDelay - вермя ожидания, SendingDelayTimer - таймер (имя "ответственного держателя") при каждом CHANGE сбрасывается на SendDelay TRACE ("Ну да ладно... Шлём"); OUTPUT=INPUT; } } P.S. Для нескольких входов: integer SendDelay2 = 100; integer OuptutSum; THREADSAFE CHANGE INPUT1, INPUT2; { TRACE ("Бл.... опять поменялось"); OuptutSum=INPUT1+INPUT2; //считается при всех изменениях Wait(SendDelay2,SendingDelayTimer2){ // SendDelay2 - вермя ожидания 2, SendingDelayTimer2 - таймер 2 (имя "ответственного держателя") при каждом CHANGE сбрасывается на SendDelay2 TRACE ("Ну да ладно... Шлём"); OUTPUT_SUM=OuptutSum; // отошлётся только конечный результат. } }
|
|
|
|
Отправлено: 24.08.16 21:13. Заголовок: Никакие таймеры не с..
Никакие таймеры не сбрасываются. Я такого не писал. Перезапускается (отменяется его отложенное выполнение) Wait с тем же таймером 0.2с
|
|
|
|
Отправлено: 24.08.16 21:19. Заголовок: Вячеслав пишет: Ник..
Вячеслав пишет: цитата: | Никакие таймеры не сбрасываются. Я такого не писал. Перезапускается (отменяется его отложенное выполнение) Wait с тем же таймером 0.2с |
| Я такое написал ;) Представьте что у вас два: 1) CHANGE Value_Input 2) другой таймер (для фиг поймёш чего) в этом же модуле что сделает CancelAllWait (); со вторым? оно нам надо? P.S. PUSH KillWait1 { TRACE ("Хотя нет... фигушки первому"); Cancelwait(SendingDelayTimer); } PUSH KillWait2 { TRACE ("Хотя нет... фигушки и второму"); Cancelwait(SendingDelayTimer2); }
|
|
|
|
Отправлено: 24.08.16 22:26. Заголовок: Джентльмены, вы всер..
Джентльмены, вы всерьез собираетесь решать эту задачу средствами Simpl+ ?
|
|
|
|
Отправлено: 24.08.16 22:28. Заголовок: про 2 wait-а никто н..
про 2 wait-а никто не говорил ) Если в модуле используется более одного wait, то используем персональный идентификатор NAME=Lutron и выносим wait в функцию (иначе не скомпилим модуль) Function SEND_VALUE() { wait(20,Lutron) //отправка при отсутствии изменений по истечении 0.2с { Serial_Out = ITOA(Value_Input) + "\x0D\x0A"; } } CHANGE Value_Input { CancelWait (Lutron); //любое новое изменение рестартует wait c именемLutron, закрывая запущенный ранее не выполняя его тело и запускает новый SEND_VALUE(); }
|
|
|
|
Отправлено: 24.08.16 22:31. Заголовок: Igor пишет: Джентль..
Igor пишет: цитата: | Джентльмены, вы всерьез собираетесь решать эту задачу средствами Simpl+ ? |
| Самый короткий путь - это известный путь. Предложите на "квадратиках" или средствами VTP может? ) Сравним размер кода и приклоним колени перед мастером. P.S. мы уже её решили
|
|
|
|
| постоянный участник
|
|
|
Отправлено: 25.08.16 02:00. Заголовок: Хватание за S+ До то..
Хватание за S+ До того как исследован механизм и принцип взаимодействия пользователя с системой - плохой сигнал. ПО нужно проектировать и потом искать инструмент.
|
|
|
|
|
Отправлено: 25.08.16 09:42. Заголовок: Всем спасибо, появил..
Всем спасибо, появилось много вариантов решения задачи. Изучу все)
|
|
|
|