Skip to content

Push_RU

Anton Kolomeytsev edited this page Jun 12, 2019 · 5 revisions

Функция push на стороне Raspberry

clapi.device.push(CODE:int[, ARG1:float, ARG2:float, ...])

Функция 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_async на стороне Raspberry

clapi.device.push_async(CODE:int[, ARG1:float, ARG2:float, ...])

Асинхронная версия функции 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()

Принимаем сообщение на стороне Arduino

Для ардуинки принципиальной разницы между тем, какой именно командой вы воспользовались для отправки сообщения (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 ШИМ порту.