-
Notifications
You must be signed in to change notification settings - Fork 1
Push_RU
Функция push отправляет на устройство команду. И всё.
Пусть у нас есть подключенное устройство с именем "device", которое на команду с номером 1 реагирует включением светодиода, а на команду с номером 2 светодиод выключает. Тогда мигать светодиодом можно следующим образом:
import time
import clapi as api
api.start() # подключаемся ко всем устройствам
for i in range(10):
api.device.push(1) # включили светодиод
time.sleep(0.5)
api.device.push(2) # выключили светодиод
time.sleep(0.5)
Возможно наше устройство управляет скоростью вращения какого-нибудь двигателя. И мы можем изменить текущую скорость при помощи команды номер 3 и аргумента от 0 до 255. Тогда отправить команду мы можем как показано ниже:
api.device.push(3, 255) # включить двигатель на максимальных оборотах
time.sleep(1)
api.device.push(3, 127) # снизить обороты двигателя на 50%
Количество аргументов команды push может быть произвольным.
Асинхронная версия функции push работает почти так же, но запускается другим способом.
api.device.push_async(1)\
.execute() # нужно обязательно вызвать execute, иначе команда не будет отправлена.
Метод execute()
добавит команду push(1)
в общую очередь со всеми остальными командами. Очередь обслуживается отдельным потоком (по одному потоку на каждое устройство). Из плюсов - вы можете сохранить незапущенную команду в переменную и потом вызывать execute()
у этой переменной:
LED_ON = api.device.push_async(1) # запомним команду, но не выполним её
# ...
# здесь какой-то код
# ...
LED_ON.execute() # включим светодиод
Кстати, следующая запись:
api.device.push_async(3, 255)\
.execute()
Эквивалентна записи ниже:
api.device.push_async(3)\
.args(255)\
.execute()
Для ардуинки принципиальной разницы между тем, какой именно командой вы воспользовались для отправки сообщения (push или push_async) нет. Принимает сообщение функция listener
:
#include <Clapi.h>
Clapi *api = new Clapi();
// это тот самый listener
void listener(int code, int argsCount, float args[]) {
if (code == 1) digitalWrite(13, HIGH); // включаем светодиод
if (code == 2) digitalWrite(13, LOW); // выключаем светодиод
if (code == 3) { // регулируем скорость
int speed = static_cast<int>(args[0]); // нам прислали 1 аргумент
analogWrite(11, speed);
}
}
void setup() {
api->init();
api->setMessageListener(listener); // укажем listener для обработки входящих команд
api->query("device_id", "device")->send(); // имя этого устройства - "device"
pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
api->processInput(); // вызываем как можно чаще, чтоб вовремя реагировать на команды
}
В listener в зависимости от номера команды int code
мы выполняем разные действия. На команды 1 и 2 вкл. и выкл. светодиод. На команду 3 меняем напряжение на 11 ШИМ порту.