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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показаны 3 промежуточные версии 2 участников)
Строка 7: Строка 7:
==Синтаксис==
==Синтаксис==


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
function setWatch(function, pin, options)
function setWatch(function, pin, options)
</syntaxhighlight>
</syntaxhighlight>
Строка 27: Строка 27:
Если аргумент ''options'' является объектом, он может содержать следующую информацию (все опционально):
Если аргумент ''options'' является объектом, он может содержать следующую информацию (все опционально):


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
{
{
   // Здесь задаем, стоит ли продолжать  
   // Здесь задаем, стоит ли продолжать  
Строка 66: Строка 66:
К примеру, если вы хотите измерить продолжительность положительного импульса, в setWatch() можно задать следующее:
К примеру, если вы хотите измерить продолжительность положительного импульса, в setWatch() можно задать следующее:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
setWatch(function(e) { console.log(e.time-e.lastTime); }, BTN, { repeat:true, edge:'falling' });
setWatch(function(e) { console.log(e.time-e.lastTime); }, BTN, { repeat:true, edge:'falling' });
</syntaxhighlight>
</syntaxhighlight>
Строка 74: Строка 74:
Работает это следующим образом: прерывание записывает точное время изменения контакта в очередь, а функция, заданная в ''setWatch()'', выполняется только из главного цикла событий. Если эта функция является нативной, то вы можете вписать в аргумент ''options'' настройку ''irq:true'', и эта функция будет запускаться прямо из прерывания. В этом случае прерывания будут происходить на обоих фронтах, а антидребезг будет отключен.
Работает это следующим образом: прерывание записывает точное время изменения контакта в очередь, а функция, заданная в ''setWatch()'', выполняется только из главного цикла событий. Если эта функция является нативной, то вы можете вписать в аргумент ''options'' настройку ''irq:true'', и эта функция будет запускаться прямо из прерывания. В этом случае прерывания будут происходить на обоих фронтах, а антидребезг будет отключен.


Примечание: Если вы перед использованием ''setWatch()'' не поменяли режим работы контакта на ввод данных при помощи [[Espruino:Справочник по API/Глобальные методы, переменные и объекты/Функция pinMode()|pinMode()]], то ''setWatch()'' сделает это сама.
{{Примечание1|Если вы перед использованием ''setWatch()'' не поменяли режим работы контакта на ввод данных при помощи [[Espruino:Справочник по API/Глобальные методы, переменные и объекты/Функция pinMode()|pinMode()]], то ''setWatch()'' сделает это сама.}}


'''Примечание:''' Чип STM32 (используемый в [https://www.espruino.com/Original Espruino Original] и [https://www.espruino.com/Pico Pico]) не умеет отслеживать прерывания на двух контактах с одинаковым номером – например, ''A0'' и ''B0''.
{{Примечание1|Чип STM32 (используемый в [https://www.espruino.com/Original Espruino Original] и [https://www.espruino.com/Pico Pico]) не умеет отслеживать прерывания на двух контактах с одинаковым номером – например, ''A0'' и ''B0''.}}


'''Примечание:''' На чипе [[nRF52]] (используется в [[Puck.js]], [[Pixl.js]] и [[MDBT42Q]]) использование ''setWatch()'' на каком-либо контакте отключит GPIO-вывод на этом контакте. Чтобы у вас снова появилась возможность записывать данные на этот контакт, это прерывание нужно будет отключить с помощью [[Espruino:Справочник по API/Глобальные методы, переменные и объекты/Функция clearWatch()|clearWatch()]].
{{Примечание1|На чипе [[nRF52]] (используется в [[Puck.js]], [[Pixl.js]] и [[MDBT42Q]]) использование ''setWatch()'' на каком-либо контакте отключит GPIO-вывод на этом контакте. Чтобы у вас снова появилась возможность записывать данные на этот контакт, это прерывание нужно будет отключить с помощью [[Espruino:Справочник по API/Глобальные методы, переменные и объекты/Функция clearWatch()|clearWatch()]].}}


=См.также=
=См.также=
{{ads}}


=Внешние ссылки=
=Внешние ссылки=
Строка 88: Строка 86:
<references />
<references />


{{Навигационная таблица/Espruino}}
{{Навигационная таблица/Портал/Espruino}}
{{Навигационная таблица/Телепорт}}

Текущая версия от 09:50, 4 июня 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Функция 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().

См.также

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