กิจกรรม#

การแนะนำ#

อีเวนต์ช่วยให้คุณเรียกใช้ฟังก์ชันแบบอะซิงโครนัสได้ เมื่อมีการประกาศอีเวนต์ ฟังก์ชันเรียกกลับของอีเวนต์จะถูกเรียกใช้ในงาน (เธรด) ของตัวเอง ทำให้โค้ดหลักของคุณยังคงทำงานต่อไปได้ในเวลาเดียวกัน

สำคัญ: อ็อบเจ็กต์ event event จะเก็บ callback เพียงหนึ่งรายการเท่านั้น หากคุณลงทะเบียนฟังก์ชันอื่นด้วยอ็อบเจ็กต์ event เดียวกัน ฟังก์ชันใหม่จะ แทนที่ callback ก่อนหน้า

หากคุณต้องการให้หลายสิ่งเกิดขึ้นจากตัวกระตุ้นเดียว ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:

  • เรียกใช้ฟังก์ชันช่วยเหลือหลายฟังก์ชันจากฟังก์ชันเรียกกลับเดียว หรือ

  • ใช้ event object หลายตัวและกระจายแต่ละ event object นั้นออกไป

  • Use separate threads to run tasks independently.

ในการสร้างและใช้งานกิจกรรม ให้ทำตามขั้นตอนต่อไปนี้ตามลำดับ:

  1. สร้างเหตุการณ์ด้วย event

  2. ตั้งค่าฟังก์ชันเรียกกลับของเหตุการณ์ โดยใช้ชื่อเหตุการณ์ (เช่น: myEvent(myCallback);)

  3. Broadcast an event:

    • broadcast — เรียกใช้ฟังก์ชันที่ลงทะเบียนทั้งหมดในวัตถุเหตุการณ์ให้ทำงานพร้อมกัน

    • broadcastAndWait — เรียกใช้ฟังก์ชันที่ลงทะเบียนทั้งหมดในออบเจ็กต์เหตุการณ์และรอให้เสร็จสิ้นก่อนดำเนินการต่อ

ตัวสร้างคลาส#

1 — สร้างอ็อบเจ็กต์เหตุการณ์ event โดยไม่มีฟังก์ชันเรียกกลับ

event();

2 — สร้างอ็อบเจ็กต์เหตุการณ์ event พร้อมฟังก์ชันเรียกกลับ

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

3 — Creates an event object from another event with a callback function.

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

4 — สร้างอ็อบเจ็กต์เหตุการณ์ event พร้อมฟังก์ชันเรียกกลับที่รับอาร์กิวเมนต์

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

5 — Creates an event object from another event with a callback function that accepts an argument.

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

ตัวทำลายคลาส#

ทำลายอ็อบเจ็กต์เหตุการณ์ event

~event();

พารามิเตอร์#

พารามิเตอร์

พิมพ์

คำอธิบาย

callback

void (*)(void)

ฟังก์ชันที่กำหนดไว้ล่วงหน้าเพื่อเรียกใช้เมื่อมีการออกอากาศเหตุการณ์

v

event

อ็อบเจ็กต์เหตุการณ์ที่มีอยู่แล้วเพื่อใช้คัดลอก

callback

void (*)(void *)

ฟังก์ชันที่รับอาร์กิวเมนต์เป็นตัวชี้แบบ void และจะทำงานเมื่อมีการประกาศเหตุการณ์นั้น

arg

void *

ตัวชี้ไปยังข้อมูลที่จะถูกส่งต่อไปยังฟังก์ชันเรียกกลับ (callback function)

หมายเหตุ#

  • อ็อบเจ็กต์เหตุการณ์ event จะเก็บ ฟังก์ชันเรียกกลับ (callback) เพียงหนึ่งฟังก์ชัน หากคุณลงทะเบียนฟังก์ชันอื่นกับอ็อบเจ็กต์เหตุการณ์เดียวกัน ฟังก์ชันนั้นจะ แทนที่ ฟังก์ชันเรียกกลับก่อนหน้า

  • หากคุณต้องการให้หลายสิ่งเกิดขึ้นจากตัวกระตุ้นเดียว ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:

    • เรียกใช้ฟังก์ชันช่วยเหลือหลายฟังก์ชันจากฟังก์ชันเรียกกลับเดียว หรือ

    • ใช้ event object หลายตัวและกระจายแต่ละ event object นั้นออกไป

    • ใช้เธรดแยกกันเพื่อรันงานต่างๆ อย่างอิสระ

ตัวอย่าง#

// 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 — เรียกใช้ฟังก์ชัน callback ของเหตุการณ์เพื่อทำงานแบบขนาน

  • broadcastAndWait — เรียกใช้ฟังก์ชัน callback ของเหตุการณ์และรอจนกว่าจะเสร็จสมบูรณ์

ก่อนเรียกใช้ฟังก์ชันสมาชิกเหตุการณ์ 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 starts the event’s callback and continues immediately.

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!");
}