Події#

Вступ#

Події дозволяють запускати функцію асинхронно. Коли подія транслюється, функція зворотного виклику події запускається в окремому завданні (потоці), тому ваш основний код може продовжувати виконуватися одночасно.

Важливо: Об’єкт події event зберігає один зворотний виклик. Якщо ви зареєструєте іншу функцію з тим самим об’єктом події, вона замінить попередній зворотний виклик.

Якщо ви хочете, щоб один тригер відбувався одночасно, виконайте одне з наведених нижче дій.

  • Виклик кількох допоміжних функцій з одного зворотного виклику, або

  • Використовуйте кілька об’єктів подій та транслюйте кожен з них.

  • Використовуйте окремі потоки для незалежного виконання завдань.

Щоб створити та використовувати подію, виконайте такі дії в такому порядку:

  1. Створіть подію з event.

  2. Встановити зворотний виклик події з використанням назви події (наприклад: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Запускає всі зареєстровані функції в об’єкті події для паралельного виконання.

    • broadcastAndWait — Запускає всі зареєстровані функції в об’єкті події та очікує їх завершення, перш ніж продовжити.

Конструктори класів#

1 — Створює об’єкт події event без функції зворотного виклику.

event();

2 — Створює об’єкт події event з функцією зворотного виклику.

event( void (* callback)(void) );

3 — Створює об’єкт події event з іншої події за допомогою функції зворотного виклику.

event( 
  event v, 
  void (* callback)(void) );

4 — Створює об’єкт події event з функцією зворотного виклику, яка приймає аргумент.

event( void (* callback)(void *), void *arg );

5 — Створює об’єкт події event з іншої події за допомогою функції зворотного виклику, яка приймає аргумент.

event( event v, void (* callback)(void *), void *arg );

Деструктор класів#

Знищує об’єкт події event та звільняє пов’язані з ним ресурси.

~event();

Параметри#

Параметр

Тип

Опис

callback

void (*)(void)

Функція, яку попередньо визначено для виконання під час трансляції події.

v

event

Існуючий об’єкт події для копіювання.

callback

void (*)(void *)

Функція, яка приймає аргумент void-покажчик та виконується, коли подія транслюється.

arg

void *

Вказівник на дані, які будуть передані до функції зворотного виклику.

Нотатки#

  • Об’єкт події event зберігає один зворотний виклик. Якщо зареєструвати іншу функцію з тим самим об’єктом події, вона замінить попередній зворотний виклик.

  • Якщо ви хочете, щоб один тригер відбувався одночасно, виконайте одне з наведених нижче дій.

    • Виклик кількох допоміжних функцій з одного зворотного виклику, або

    • Використовуйте кілька об’єктів подій та транслюйте кожен з них.

    • Використовуйте окремі потоки для незалежного виконання завдань.

Приклад#

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

int main() {
  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);
}

Функції-члени#

Клас event містить такі функції-члени:

  • operator — Встановлює функцію зворотного виклику для події.

  • broadcast — Запускає функцію зворотного виклику події для паралельного виконання.

  • broadcastAndWait — Запускає функцію зворотного виклику події та очікує завершення.

Перед викликом будь-яких функцій-членів з подією event необхідно створити екземпляр події event , як показано нижче:

/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */

// Create an event without a callback
event myEvent;

// Or create an event with a callback
event myEvent(onMyEvent);

operator#

Встановлює функцію зворотного виклику для події за допомогою оператора виклику функції.

Available Functions
void operator()( void (* callback)() );

Parameters

Параметр

Тип

Опис

callback

void (*)(void)

Попередньо визначена функція зворотного виклику, яка викликається автоматично під час трансляції події. Функція повинна відповідати необхідному підпису зворотного виклику. Див. Функції зворотного виклику для отримання додаткової інформації.

Return Values

Ця функція не повертає значення.

Notes
  • Повторне встановлення зворотного виклику замінює попередній зворотний виклик.

  • Функція зворотного виклику не повинна мати параметрів та повертати значення void.

Examples
void drawSquare() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawRectangle(40, 40, 120, 120);
}

void drawCircle() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawCircle(100, 100, 60);
}

int main() {
  // Create the event drawEvent.
  event drawEvent;

  Brain.Screen.print("Drawing a square...");

  // Set the event to drawSquare.
  drawEvent(drawSquare);

  wait(1, seconds);

  // Trigger the event.
  drawEvent.broadcast();

  wait(1, seconds);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Drawing a circle...");

  // Replace drawSquare with drawCircle.
  drawEvent(drawCircle);

  wait(1, seconds);

  // Trigger the event a second time.
  drawEvent.broadcast();
}

broadcast#

broadcast запускає зворотний виклик події та негайно продовжується.

Member Functions
void broadcast();

Parameters

Ця функція не приймає жодних параметрів.

Return Values

Ця функція не повертає значення.

Examples
// Create a callback function.
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

int main() {
  Brain.Screen.print("Broadcasting in 2 seconds...");

  // Create an event called myEvent and set onMyEvent
  // as the callback function.
  event myEvent(onMyEvent);

  wait(2, seconds);

  // Trigger the event.
  myEvent.broadcast();
}

broadcastAndWait#

Запускає зворотний виклик та очікує його завершення (або тайм-ауту).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Параметр

Тип

Опис

timeout

int32_t

Кількість мілісекунд, яку потрібно зачекати перед повторним початком виконання коду (за замовчуванням — 60000).

Return Values

Ця функція не повертає значення.

Notes
  • Використовуйте це лише з зворотними викликами, які завершуються (без нескінченних циклів).

  • Це функція очікування, яка блокує виконання, доки зворотний виклик не завершиться або не мине час очікування.

Examples
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

int main() {
  Brain.Screen.print("Starting drive...");

  event driveEvent(startDriving);

  // Give the event time to be set.
  wait(0.25, seconds);

  // Run the event and wait until it finishes.
  driveEvent.broadcastAndWait();

  // Stop driving after 2 seconds.
  Drivetrain.stop();
  Brain.Screen.clearScreen();
  Brain.Screen.print("Drive complete!");
}