Mensagem#

Introdução#

Dois robôs de programação VEX AIM podem ser ligados para que comuniquem durante um projeto. Os métodos de mensagens permitem que um robô envie uma mensagem ao outro. Uma mensagem pode incluir apenas texto ou texto com até três números.

As mensagens recebidas são armazenadas numa fila FIFO (first in, first out). Isto significa que a primeira mensagem recebida será a primeira a ser lida.

Utilize is_message_available para verificar se uma mensagem está pronta para ser lida. De seguida, utilize get_message para ler a mensagem de texto seguinte. Se a mensagem também incluir números, utilize get_message_and_data para ler o texto e os números em conjunto.

Nota: Para que as mensagens sejam enviadas e recebidas, ambos os robots devem estar ligados e ambos devem estar a executar projetos que utilizem métodos de mensagens.

Segue-se uma lista de todos os métodos:

Ação — Enviar mensagens entre robôs.

  • send_message — Envia texto e até três números para o robô ligado.

Getters — Ler mensagens ou verificar o estado da ligação.

Callbacks — Executam funções quando ocorrem eventos de mensagens.

  • handle_message — Executa uma função quando é recebida uma mensagem específica.

  • connected — Executa uma função quando o robô está ligado com outro robô.

  • disconnected — Executa uma função quando o robô já não está ligado com outro robô.

Ação#

send_message#

send_message envia texto e até três números para o robô ligado. Utilize este método num robô quando o outro necessita de receber um comando, sinal ou uma breve informação. Envie apenas o texto quando a mensagem for suficiente por si só. Adicione números quando a mensagem necessitar de valores relacionados, como por exemplo, enviar “heading” com o valor da direção atual do robô.

No robô recetor, utilize is_message_available para verificar se chegou uma mensagem. Em seguida, utilize get_message para uma mensagem apenas de texto ou get_message_and_data para uma mensagem que inclua números.

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

Parâmetro

Descrição

message

O texto a enviar para o robô ligado.

arg1

Opcional. Um número para enviar com a mensagem.

arg2

Opcional. Um segundo número para enviar com a mensagem.

arg3

Opcional. Um terceiro número para enviar com a mensagem.

Exemplo

Código para o Robot 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")

Código para o Robot 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)

Getters#

get_message#

get_message devolve a próxima mensagem de texto recebida da fila de mensagens. Utilize este método no robô recetor quando o robô ligado envia uma mensagem apenas de texto. Uma ordem comum é utilizar is_message_available para verificar se uma mensagem chegou e, em seguida, utilizar get_message antes de apresentar, comparar ou utilizar o texto devolvido noutro método.

Utilize send_message no outro robô para enviar uma mensagem apenas de texto.

Usage:
robot.link.get_message(timeout)

Parâmetro

Descrição

timeout

Opcional. O tempo máximo, em milissegundos, para aguardar por uma mensagem antes de continuar. O predefinido é 1000.

Exemplo

Código para o Robot 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!")

Código para o Robot 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 devolve a próxima mensagem de texto recebida e os números da fila de mensagens como uma tupla. Utilize este método no robô recetor quando o robô ligado envia um texto com um ou mais números. Uma ordem comum é utilizar is_message_available para verificar se uma mensagem chegou e, em seguida, utilizar get_message_and_data antes de utilizar o texto e os números devolvidos.

Utilize send_message no outro robô para enviar o texto e os números em conjunto.

Usage:
robot.link.get_message_and_data(timeout)

Parâmetro

Descrição

timeout

Opcional. O tempo máximo, em milissegundos, para aguardar por uma mensagem antes de continuar. O predefinido é 1000.

Exemplo

Código para o 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)

Código para o 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)

is_connected#

O valor is_connected is_connected` retorna se o robô está ligado a outro robô. Utilize este método antes de enviar ou aguardar mensagens caso o projeto necessite de verificar se a ligação entre robôs está pronta.

  • True — O robô está ligado a outro robô.

  • False — O robô não está ligado a outro robô.

Usage:
robot.link.is_connected()

Parâmetros

Descrição

Este método não tem parâmetros.

# 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 retorna se uma mensagem está à espera na fila de mensagens. Utilize este método antes de get_message ou get_message_and_data para que o robô recetor só tente ler uma mensagem depois de esta chegar.

  • True — Existe uma mensagem disponível para leitura.

  • False — Não existem mensagens disponíveis para leitura.

Usage:
robot.link.is_message_available()

Parâmetros

Descrição

Este método não tem parâmetros.

Exemplo

Código para o Robot 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!")

Código para o Robot 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 devolve o nome do robô ligado. Utilize este método para mostrar qual o robô que está ligado antes de enviar ou receber mensagens. Se não estiver ligado nenhum robô, este método retorna None.

Usage:
robot.link.get_name()

Parâmetros

Descrição

Este método não tem parâmetros.

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

Retornos de chamada#

handle_message#

handle_message regista uma função que é executada quando o robô recebe uma mensagem de texto específica. Utilize este método quando o robô necessitar de responder automaticamente a uma mensagem conhecida, em vez de verificar a fila de mensagens num loop. Defina primeiro a função de callback e, em seguida, registe-a com handle_message e o texto da mensagem a monitorizar.

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

Parâmetro

Descrição

callback

Uma função previamente definida que é executada quando a mensagem recebida corresponde à mensagem message.

message

O texto a comparar com as mensagens recebidas.

Exemplo

Código para o Robot 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")

Código para o Robot 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 regista uma função que é executada quando o robô é ligado a outro robô. Utilize este método quando o projeto necessitar de responder assim que a ligação entre robôs estiver estabelecida. Defina primeiro a função de retorno de chamada e, em seguida, registe-a com connected.

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

Parâmetro

Descrição

callback

Uma função previamente definida que é executada quando o robô está ligado a outro robô.

args

Opcional. Uma tupla contendo argumentos para passar para a função de callback. Consulte Utilizar funções com parâmetros para obter mais informações.

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

robot.link.connected(robot_smile)

disconnected#

disconnected regista uma função que é executada quando o robô já não está ligado a outro robô. Utilize este método quando o projeto necessitar de responder assim que a ligação entre robôs for perdida. Defina primeiro a função de retorno de chamada e, em seguida, registe-a com disconnected.

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

Parâmetro

Descrição

callback

Uma função previamente definida que é executada quando o robô deixa de estar ligado a outro robô.

args

Opcional. Uma tupla contendo argumentos para passar para a função de callback. Consulte Utilizar funções com parâmetros para obter mais informações.

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

robot.link.disconnected(robot_sad)