Страница 26 из 41
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 2:44 pm
Jager
Bagir писал(а):Скоро выложу вариант отлова разных нажатий для режима P. Только конечно без долгого нажатия. Его не отловить.
Буду ждать, так как вариант с P&R меня не устраивает.
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 2:52 pm
Bagir
Да, он сильно проигрывает при падении сервера, хоть и дает много плюсов. Если в будущем будет раздельная настройка режимов для сервера и автономки, вариант будет беспроигрышный.
Для режима P сделаю по такому же алгоритму. При первом нажатии запускается таймер на одну секунду, и заодно чистится временная переменная. Каждое нажатие пишет в переменную цифру 1. Отработавший таймер запускает код, который ко количество единичек во временной переменной определяет какое было нажатие. Простое, двойное, тройное ...
Минусы такого способа - отсрочка выполнения задачи на время таймера. Но иначе никак. Впрочем эта секунда сильно не портит ситуацию.
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 4:54 pm
Kod.Begemot
Свежая прошивка МегаD(3.26b1) поддерживает команду "*число" в Action, для переключения "0-значение" выхода в режиме PWM. Это удобно для тех, у кого светодиодное освещение и оно управляется мосфетом. Сделал у себя включение / выключение через MDM (с регулировкой яркости), но при неработоспособности сервера выключателем без фиксации уже не мог управлять - только включение на минимальной (2) яркости, выключения небыло. Теперь всё отлично, выключатели могут работать автономно, а могут и с сервером, и всё это живёт дружно вместе с ШИМ-выходами

P.S. пример Action:
10:*200 - переключает ШИМ-выход между значениями 0 и 200
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 5:12 pm
sergejey
Kod.Begemot писал(а):Уважаемые, прощу прощения за, возможно, ламерский вопрос:
Вот класс обновился, загружаем обновление - и всё слетает, все настройки Мег, настройки реакции на входы и т.п. правильно?
ну понятно что можно куда-нибудь скопировать код, и потом его вставлять обратно.
В последнем обновлении при импорте класса можно указать галочкой, чтобы не импортировались объекты, т.е. обновится только класс, а все объекты с их методами и свойствами останутся.
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 5:22 pm
Bagir
Кстати, как еще один вариант для класса MegaD. В нем объекты MegaD1, MegaD2, MegaD3, MegaD4 и MegaD99 с примерами. Вы можете просто дать другое имя объекту своей Меги. Например MegaDgarage или MegaDkitchen. Имя абсолютно не принципиально. Главное, чтобы по нему было понятно, чей это объект.
Код методов в этом классе почти весь общий. А вот incomingMessage у каждого объекта Меги свой.
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 5:38 pm
zelevova
До последнего обновления пробовал давать отличные имена. Все затиралось. Сейчас Сергей вроде поправил, будем проверять.
Сергей, еще может убрать с githuba файл megad.php? А то при обновлении затирается. Вчера минут 10 пытался понять почему мега не посылает сообщения.
Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 6:40 pm
Kod.Begemot
Подтверждаю, при каждом обновлении файл этот восстанавливаю из архива. Сколько раз делал - всё забывал написать! Спасибо

Re: Подключение контроллера MegaD-328
Добавлено: Ср дек 10, 2014 8:39 pm
Bagir
Я еще поигрался с копкой и разными нажатиями. Если очень часто наживать, то Мега может не успеть обработать все нажатия и отпускания, и не сообщит серверу. При этом во временной переменной получится запись, несоответствующая ни одной группе case последнего блока switch ($dt). Тогда прозвучит слово "непонятно". Но это увы не все. Может получиться так, что последнее сообщение от Меги будет о нажатии. Тогда по истечению таймера код посчитает это удержанием. А удержания то нет... И при следующем нажатии запись во временную переменную будет продолжена, а не начата заново, и потом при сравнении опять будет "непонятно". Решение есть. Надо при каждом начале нажатий новой комбинации просто для верности чистить временную переменную. С наименьшими затратами на обработку, можно добавить код сброса временной переменной
Код: Выделить всё
// Сбросить временную переменную
registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
в момент, когда происходит событие нажатия и таймер не существует. Это и будет начало новой комбинации. Таким образом, даже если Мега не успела обработать комбинацию нажатий, то мы в любом случае не рискуем следующей комбинацией. Она точно будет писаться "с чистого листа".
Код: Выделить всё
case 3: // P&R //Задача - Получить любые комбинации
// Получаем детали события
$dt = registeredEventDetails($ot.'_'.$params['pt'].'_clicks');
// Параметр doit будет добавлен при последующем рекурсивном вызове для окончания обработки комбинации нажатия
if (!isset($params['doit'])) {
// Добавить состояние (нажата/отпущена) и записать в детали события
registerEvent($ot.'_'.$params['pt'].'_clicks', $details=$dt.$ms, $expire_in=1);
// Если таймер не существует
if (!timeOutExists($ot.'_'.$params['pt'].'_press')) {
// Нажата или отпущена
if ($ms) {
// Сбросить временную переменную
registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
// создать таймер с рекурсивным вызовом
setTimeOut($ot.'_'.$params['pt'].'_press', "cm($ot.'.incomingMessage', array('pt'=>".$params['pt'].", 'doit'=>1));", 1);
} else {
// сразу рекурсивный вызов
callMethod($ot.'.incomingMessage', array('pt'=>$params['pt'], 'doit'=>1));
}
}
} else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия
// если справа 1 (то есть последнее действие нажал)
if (substr($dt, -1)) {
registerEvent($ot.'_'.$params['pt'].'_clicks', $details=$dt.'-', $expire_in=1);
} else {
registerEvent($ot.'_'.$params['pt'].'_clicks', $details='', $expire_in=1); // тут можно просто удалять
}
/* Закомментировать или удалить этот блок switch после отладки */
switch ($dt) { //1-нажал 0-отпустил
case '10': say('нажатие'); break;
case '1010': say('двойное нажатие'); break;
case '101010': say('тройное нажатие'); break;
case '1': say('удержание'); break;
case '101': say('удержание после двойного'); break;
case '10101': say('удержание после тройного'); break;
case '1-0': say('отпустил'); break;
case '101-0': say('отпустил после двойного'); break;
case '10101-0': say('отпустил после тройного'); break;
default: say('непонятно'); break;
}
// ВЫПОЛНИТЬ нужный метод с передачей ему кода комбинации $dt
}
break;
Отлов разных нажатий для режима P
Добавлено: Ср дек 10, 2014 9:13 pm
Bagir
А вот и вариант для
режима P. Начало я оставил точно такое же как и у кода с режимом P&R. А вот кусок кода, который выполняется после рекурсивного вызова будет совсем другой. Тут уже не нужно сравнивать, а достаточно просто посчитать количество циферок во временной переменной. Надо заметить, что в режиме P Мега видит нажатия лучше. Это и понятно, сообщений то в два раза меньше. Лично у меня получалось весьма стабильно накликивать до 6 нажатий за секунду. Конечно на практике наврятли кто то решит повесить на 6 нажатий какое то действие. Все таки 3 клика это предел границы функционала и удобства.
Но подобные игры навели на мысль, где можно это использовать. Это же пин код!
Код: Выделить всё
case 3: // P //Задача - Определить простое, двойное или тройное нажатие
// Получаем детали события
$dt = registeredEventDetails($ot.'_'.$params['pt'].'_clicks');
// Параметр doit будет добавлен только при последующем рекурсивном вызове для окончания обработки комбинации нажатия
if (!isset($params['doit'])) {
// Добавить состояние (нажата/отпущена) и записать в детали события
registerEvent($ot.'_'.$params['pt'].'_clicks', $details=$dt.$ms, $expire_in=1);
// Если таймер не существует
if (!timeOutExists($ot.'_'.$params['pt'].'_press')) {
// Нажата или отпущена
if ($ms) {
// Сбросить временную переменную
registerEvent($ot.'_'.$params['pt'].'_clicks', $details='1', $expire_in=1);
// создать таймер с рекурсивным вызовом
setTimeOut($ot.'_'.$params['pt'].'_press', "cm($ot.'.incomingMessage', array('pt'=>".$params['pt'].", 'doit'=>1));", 1);
} else {
// сразу рекурсивный вызов
callMethod($ot.'.incomingMessage', array('pt'=>$params['pt'], 'doit'=>1));
}
}
} else { // параметр doit есть. Значит это рекурсивный вызов для окончания обработки комбинации нажатия
// Очистить временную переменную
registerEvent($ot.'_'.$params['pt'].'_clicks', $details='', $expire_in=1); // тут можно просто удалять
// Посчитать количество циферок
$dt = strlen($dt);
say($dt.' нажатий');
// ВЫПОЛНИТЬ нужный метод с передачей ему $dt как число нажатий
}
break;
Дверной звонок + ПинКод на открытие двери
Добавлено: Чт дек 11, 2014 12:30 am
Bagir
У меня кнопка дверного звонка подключена к МД. При нажатии звучит рингтон звонка, и камера домофона делает фотку. Часто приходится выходить в сад. В это время дома может кто то оставаться, а может никого и не быть, но если я далеко не ухожу, то и нет смысла запирать дверь на глухой замок и ставить сигнализацию. Но и просто так оставлять открытой дверь тоже нельзя. Мало ли кто там шарахается, а за домом мне не видно. Именно на такой слечай и хотелось какюю нибудь простенькую экспресс открывалку двери, чтобы не таскать с собой карточку. Конечно хочется по фото. Смотришь в камеру, жмешь кнопку звонка, а дальше либо звенит звонок, либо открывается дверь, если фотка опознана и лицо есть в базе. Но уы, ничего я не нашел. Сравнение лиц на фотографиях вероятно дело будущего. Хотя странно. Телефоны уже это давно делают, и причем вполне хорошо, а для компа варианты не находятся. Думал про сканер отпечатков пальца. Уличные варианты стоят весьма дорого. Так что решил пока на это дело забить. Но есть идея! Использовать пин код на кнопке звонка. Конечно гость может его подслучать. Но гость так же момет увидеть кнопки на наборнике. К тому же никто не мешает при наборе добавить в начало несколько ложных случайных цифр, а в конце вбить правильные. Да и можно создать второй пин код, который бы отменял первый, как два набора ключей в дверях. Такой режим весьма сгодится, если объект не на охране. А вообще, вариант с простеньким пинкодом намного лучше варианта просто с открытой дверью.
Заценяйте, я результатом весьма доволен.
Код: Выделить всё
case 3: // P // Звонок + ПинКод
/*
Пинкод задуман длинной в 3 цифры. Это можно легко изменить при жлании.
При наборе цифры 3 и более звонок не включается.
Последняя цифра пинкода может быть 2, и если пин правильный, то звонок не включится
*/
// Получаем детали события
$dt = registeredEventDetails($ot.'_'.$params['pt'].'_pin');
// Параметр doit будет добавлен только при последующем рекурсивном вызове когда отработает таймер
if (!isset($params['doit'])) {
// Если таймер существует
if (timeOutExists($ot.'_'.$params['pt'].'_press')) {
// Удалить таймер
ClearTimeOut($ot.'_'.$params['pt'].'_press');
// Добавляем +1
$dt = $dt+1;
} else {
// Взять две последние цифры
// Если есть способ проще, ПОПРАВЬТЕ!
if (strlen($dt)>2) { $dt = substr($dt, -2); }
// к двум последним цифрам ВП приклеиваем 1
$dt = $dt.'1';
}
// записать детали в событие
registerEvent($ot.'_'.$params['pt'].'_pin', $details=$dt, $expire_in=1);
// создаем таймер
setTimeOut($ot.'_'.$params['pt'].'_press', "cm($ot.'.incomingMessage', array('pt'=>".$params['pt'].", 'doit'=>1));", 1);
} else { // параметр doit есть. Значит это рекурсивный вызов для проверки пинкода или включения звонка
// Проверяем пинкод * * * * * * * *
if ($dt == 342) {
// Очистить временную переменную (чтобы пин лишний раз не был виден в X-Ray)
registerEvent($ot.'_'.$params['pt'].'_pin', $details='', $expire_in=1); // тут можно просто удалять Event
// Событие правильный пин код
say('пин код');
} else {
// Если набранная цифра меньше 3, включаем звонок
if (substr($dt, -1)<3) {
// Событие Звонок
say('звонок');
}
}
}
break;