Сообщение#

Введение#

Два программирующих робота VEX AIM можно соединить для обмена данными во время работы над проектом. Методы обмена сообщениями позволяют одному роботу отправлять сообщение другому. Сообщение может содержать только текст или текст, включающий до трех цифр.

Полученные сообщения хранятся в очереди по принципу «первым пришел — первым вышел» (FIFO). Это означает, что первое полученное сообщение будет первым прочитано.

Используйте is_message_available, чтобы проверить, готово ли сообщение к чтению. Затем используйте get_message, чтобы прочитать следующее текстовое сообщение. Если сообщение также содержит числа, используйте get_message_and_data, чтобы прочитать текст и числа вместе.

Примечание: Для отправки и получения сообщений оба робота должны быть связаны и оба робота должны запускать проекты, использующие методы Message.

Ниже приведён список всех методов:

Действие — Передача сообщений между роботами.

  • send_message — Отправляет текст и до трех чисел подключенному роботу.

Геттеры — Чтение сообщений или проверка состояния соединения.

  • get_message — Возвращает следующее полученное текстовое сообщение.

  • get_message_and_data — Возвращает следующее полученное текстовое сообщение и числа.

  • is_connected — Возвращает значение, указывающее, связан ли робот с другим роботом.

  • is_message_available — Возвращает значение, указывающее, доступно ли сообщение для чтения.

  • get_name — Возвращает имя связанного робота.

Обратные вызовы — Запускают функции при возникновении событий, связанных с сообщениями.

  • handle_message — Выполняет функцию при получении конкретного сообщения.

  • connected — Выполняет функцию, когда робот связан с другим роботом.

  • disconnected — Выполняет функцию, когда робот больше не связан с другим роботом.

Действие#

send_message#

send_message отправляет текст и до трех чисел связанному роботу. Используйте этот метод на одном роботе, когда другому роботу необходимо получить команду, сигнал или короткую информацию. Отправляйте только текст, если сообщения достаточно. Добавляйте числа, когда сообщение требует связанных значений, например, отправьте “heading” с текущим значением заголовка робота.

На принимающем роботе используйте is_message_available, чтобы проверить, поступило ли сообщение. Затем используйте get_message для сообщения только с текстом или get_message_and_data для сообщения, содержащего числа.

Usage:
robot.link.send_message(message, arg1, arg2, arg3)

Параметр

Описание

message

Текст, который нужно отправить связанному роботу.

arg1

Необязательно. Номер, который нужно отправить вместе с сообщением.

arg2

Необязательно. Второй номер для отправки вместе с сообщением.

arg3

Необязательно. Третий номер для отправки вместе с сообщением.

Пример

Код для робота 1

# Press the screen to tell Robot 2 which way to turn
robot.screen.print("Robot 1")

while not robot.screen.pressing():
    wait(5, MSEC)

robot.link.send_message("right")

Код для робота 2

# Turn in the direction that Robot 1 sends
robot.screen.print("Robot 2")

while not robot.link.is_message_available():
    wait(5, MSEC)

direction = robot.link.get_message()

if direction == "left":
    robot.turn_for(LEFT, 90)
elif direction == "right":
    robot.turn_for(RIGHT, 90)

# Robot 1: continuously send the current heading to Robot 2
robot.screen.print("Robot 1")

while True:
    robot.link.send_message("heading", robot.inertial.get_heading())
    wait(50, MSEC)

# Robot 2: turn to match Robot 1's heading
robot.screen.print("Robot 2")

while True:
    if robot.link.is_message_available():
        message, heading = robot.link.get_message_and_data()
        robot.turn_to(heading)

    wait(50, MSEC)

Геттеры#

get_message#

Метод get_message возвращает следующее полученное текстовое сообщение из очереди сообщений. Используйте этот метод на принимающем роботе, когда связанный робот отправил сообщение только с текстом. Обычно используется следующий порядок действий: is_message_available, чтобы проверить, поступило ли сообщение, затем используется get_message перед отображением, сравнением или использованием возвращенного текста в другом методе.

Используйте send_message на другом роботе, чтобы отправить сообщение только в текстовом формате.

Usage:
robot.link.get_message(timeout)

Параметр

Описание

timeout

Необязательный параметр. Максимальное время ожидания сообщения в миллисекундах перед продолжением. Значение по умолчанию: 1000.

Пример

Код для робота 1

# Press the screen to send a message to Robot 2
robot.screen.print("Robot 1")

while not robot.screen.pressing():
    wait(5, MSEC)

robot.link.send_message("Hello, Robot 2!")

Код для робота 2

# Display the message sent by Robot 1
robot.screen.print("Robot 2")
robot.screen.next_row()

while not robot.link.is_message_available():
    wait(5, MSEC)

message = robot.link.get_message()
robot.screen.print(message)

get_message_and_data#

get_message_and_data возвращает следующее полученное текстовое сообщение и числа из очереди сообщений в виде кортежа. Используйте этот метод на принимающем роботе, когда связанный робот отправил текст с одним или несколькими числами. Обычно используется следующий порядок действий: is_message_available, чтобы проверить, поступило ли сообщение, затем используется get_message_and_data перед использованием возвращенного текста и чисел.

Используйте send_message на другом роботе, чтобы отправить текст и цифры вместе.

Usage:
robot.link.get_message_and_data(timeout)

Параметр

Описание

timeout

Необязательный параметр. Максимальное время ожидания сообщения в миллисекундах перед продолжением. Значение по умолчанию: 1000.

Пример

Код для робота 1

# Continuously send the current heading to Robot 2
robot.screen.print("Robot 1")

while True:
    robot.link.send_message("heading", robot.inertial.get_heading())
    wait(50, MSEC)

Код для робота 2

# Turn to match Robot 1's heading
robot.screen.print("Robot 2")

while True:
    if robot.link.is_message_available():
        message, heading = robot.link.get_message_and_data()
        robot.turn_to(heading)

    wait(50, MSEC)

is_connected#

is_connected возвращает значение, указывающее, связан ли робот с другим роботом. Используйте этот метод перед отправкой или ожиданием сообщений, если проекту необходимо проверить готовность соединения между роботами.

  • True — Робот связан с другим роботом.

  • False — Робот не связан с другим роботом.

Usage:
robot.link.is_connected()

Параметры

Описание

Этот метод не имеет параметров.

# Display whether the robot is connected
while True:
    robot.screen.clear_screen()
    robot.screen.set_cursor(1, 1)
    robot.screen.print(robot.link.is_connected())
    wait(50, MSEC)

is_message_available#

is_message_available возвращает, ожидает ли сообщение в очереди сообщений. Используйте этот метод перед get_message или get_message_and_data, чтобы принимающий робот пытался прочитать сообщение только после того, как оно уже поступило.

  • True — Доступно сообщение для прочтения.

  • False — Нет сообщений, доступных для прочтения.

Usage:
robot.link.is_message_available()

Параметры

Описание

Этот метод не имеет параметров.

Пример

Код для робота 1

# Press the screen to send a message to Robot 2
robot.screen.print("Robot 1")

while not robot.screen.pressing():
    wait(5, MSEC)

robot.link.send_message("Hello, Robot 2!")

Код для робота 2

# Wait until a message is available, then display it
robot.screen.print("Robot 2")
robot.screen.next_row()

while not robot.link.is_message_available():
    wait(5, MSEC)

message = robot.link.get_message()
robot.screen.print(message)

get_name#

get_name возвращает имя связанного робота. Используйте этот метод, чтобы показать, какой робот подключен, прежде чем отправлять или получать сообщения. Если ни один робот не подключен, этот метод возвращает None.

Usage:
robot.link.get_name()

Параметры

Описание

Этот метод не имеет параметров.

# Display the name of the linked robot
robot.screen.print(robot.link.get_name())

Обратные звонки#

handle_message#

handle_message регистрирует функцию, которая запускается, когда робот получает определенное текстовое сообщение. Используйте этот метод, когда робот должен автоматически реагировать на известное сообщение, а не проверять очередь сообщений в цикле. Сначала определите функцию обратного вызова, затем зарегистрируйте ее с помощью handle_message и текста сообщения, которое нужно отслеживать.

Usage:
robot.link.handle_message(callback, message)

Параметр

Описание

callback

Ранее определенная функция, которая запускается, когда полученное сообщение соответствует message.

message

Текст, по которому следует проверять входящие сообщения.

Пример

Код для робота 1

# Press the screen to send "smile" to Robot 2
robot.screen.print("Robot 1")

while not robot.screen.pressing():
    wait(5, MSEC)

robot.link.send_message("smile")

Код для робота 2

# Show a happy emoji when Robot 1 sends "smile"
def robot_smile():
    robot.screen.show_emoji(HAPPY)

robot.link.handle_message(robot_smile, "smile")

while True:
    wait(50, MSEC)

connected#

connected регистрирует функцию, которая выполняется при соединении робота с другим роботом. Используйте этот метод, если проект должен отвечать сразу после установления соединения между роботами. Сначала определите функцию обратного вызова, а затем зарегистрируйте ее с помощью connected.

Usage:
robot.link.connected(callback, args)

Параметр

Описание

callback

Ранее определенная функция, которая запускается при соединении робота с другим роботом.

args

Необязательно. Кортеж, содержащий аргументы для передачи в функцию обратного вызова. См. Использование функций с параметрами для получения дополнительной информации.

# Show a happy emoji when connected
def robot_smile():
    robot.screen.show_emoji(HAPPY)

robot.link.connected(robot_smile)

disconnected#

disconnected регистрирует функцию, которая запускается, когда робот больше не связан с другим роботом. Используйте этот метод, если проект должен реагировать сразу после потери связи между роботами. Сначала определите функцию обратного вызова, а затем зарегистрируйте ее с помощью disconnected.

Usage:
robot.link.disconnected(callback, args)

Параметр

Описание

callback

Ранее определенная функция, которая запускается, когда робот больше не связан с другим роботом.

args

Необязательно. Кортеж, содержащий аргументы для передачи в функцию обратного вызова. См. Использование функций с параметрами для получения дополнительной информации.

# Show a sad emoji when disconnected
def robot_sad():
    robot.screen.show_emoji(SAD)

robot.link.disconnected(robot_sad)