Espruino:Справочник по API/Глобальные методы, переменные и объекты/Функция setWatch()

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Функция setWatch()[1]

Синтаксис

function setWatch(function, pin, options)

Параметры

  • function – функция или строка, которую нужно выполнить
  • pin – контакт, на котором будет срабатывать прерывание
  • options – если здесь будет задано булево значение или целое число, то этот аргумент будет задавать, будет ли функция обратного вызова запущена один раз (false, это вариант по умолчанию) или при каждом новом прерывании (true).

Описание

Задает функцию обратного вызова, которая будет запущена при изменении состояния контакта. Другими словами, создает прерывание на этом контакте. Прерывания, созданные с помощью setWatch(), можно удалить с помощью функции clearWatch().

Возвращает идентификатор созданного прерывания, чтобы его можно было использовать в clearWatch().

Кроме того, здесь также может быть задан объект в формате { repeat: true/false(default), edge:'rising'/'falling'/'both'(default), debounce:10} – более подробно смотрите ниже.

Если аргумент options является объектом, он может содержать следующую информацию (все опционально):

{
   // Здесь задаем, стоит ли продолжать 
   // генерировать функции обратного вызова
   // или удалить прерывание после первого вызова:
   repeat: true/false(default),
   // Здесь задаем, на каком фронте будет срабатывать прерывание:
   // на переднем или заднем. Это может быть строка или
   // 1='rising' (передний), -1='falling' (задний), 0='both' (оба):
   edge:'rising'(default for built-in buttons)/'falling'/'both'(default for pins),
   // Здесь задается программный «антидребезг»,
   // чтобы не допустить лишних вызовов функции обратного вызова
   // если у переключателя возникнет «дребезг».
   // Этот показатель задается в миллисекундах,
   // в течение которых программа будет ждать утихания «дребезга»,
   // или можно задать «0», чтобы отключить функцию «антидребезга»:
   debounce:10 («0» is default for pins, «25» is default for built-in buttons),
   // Продвинутая настройка.
   // Если в аргументе «function» задана «нативная» функция
   // (т.е. скомпилированная функция или ассемблерная вставка),
   // то если задать «irq:true», 
   // именно эта функция и будет вызвана в прерывании:
   irq : false(default)
   // Продвинутая (опциональная) настройка.
   // Здесь задается контакт, с которого будет считываться значение
   // при каждом прерывании, а затем сохраняться в поле «data»
   // функции обратного вызова:
   data : pin
}

Функция обратного вызова function вызывается вместе с аргументом, которым служит объект в формате {state:bool, time:float, lastTime:float}.

  • state – текущее состояние контакта («0» или «1»).
  • time – это время в секундах, когда контакт поменял состояние.
  • lastTime – это время в секундах, когда контакт в последний раз поменял состояние. Использование edge:'rising' или edge:'falling' – это не то же самое, что последний вызов функции.
  • data – этот элемент добавляется, если в аргументе options была задана настройка data:pin. С его помощью можно считывать тактовые данные.

К примеру, если вы хотите измерить продолжительность положительного импульса, в setWatch() можно задать следующее:

setWatch(function(e) { console.log(e.time-e.lastTime); }, BTN, { repeat:true, edge:'falling' });

В результате функция обратного вызова будет запускаться только на заднем фронте импульса, но у нас все равно останется возможность измерить продолжительность импульса, потому что e.lastTime – это момент, когда сигнал проходит передний фронт.

Работает это следующим образом: прерывание записывает точное время изменения контакта в очередь, а функция, заданная в setWatch(), выполняется только из главного цикла событий. Если эта функция является нативной, то вы можете вписать в аргумент options настройку irq:true, и эта функция будет запускаться прямо из прерывания. В этом случае прерывания будут происходить на обоих фронтах, а антидребезг будет отключен.

Примечание: Если вы перед использованием setWatch() не поменяли режим работы контакта на ввод данных при помощи pinMode(), то setWatch() сделает это сама.

Примечание: Чип STM32 (используемый в Espruino Original и Pico) не умеет отслеживать прерывания на двух контактах с одинаковым номером – например, A0 и B0.

Примечание: На чипе nRF52 (используется в Puck.js, Pixl.js и MDBT42Q) использование setWatch() на каком-либо контакте отключит GPIO-вывод на этом контакте. Чтобы у вас снова появилась возможность записывать данные на этот контакт, это прерывание нужно будет отключить с помощью clearWatch().

См.также

Внешние ссылки