использование имени сообщения в событии сообщения


Я пытаюсь объявить сообщение, а затем использовать имя сообщения в событии on message, но получаю ошибку Expecting message name or identifier

мой код:

variables
{
  message CAN1.foo bar;
}

on message bar //got the error here
{
  //do stuff
}

Я знаю, что могу заменить bar на CAN1.foo в on messageevent, но расположение этого сообщения может меняться в зависимости от проекта, в котором выполняется код capl. поэтому я хочу сделать его как можно более «общим», поэтому я могу изменить часть в variables только при переключении проекта.


person Flying_whale    schedule 11.02.2019    source источник


Ответы (2)


Невозможно иметь «динамический» обработчик on message.

Ваш вариант использования может быть решен путем использования общего обработчика on message * и сравнения имени сообщения.

Что-то вроде этого:

variables
{
  char messageName[256] = "foo";
}

on message *
{
  dword context = 0x00010000;
  char buffer[256];
  getMessageName(this.ID, context | this.CAN, buffer, elcount(buffer));

  if(strncmp(buffer, messageName, strlen(buffer) == 0)
  {
    // do stuff
  }
}

Вы должны проконсультироваться с документацией о значении второго параметра getMessageName, также я не уверен, возвращает ли getMessageName foo или CAN1.foo

person M. Spiller    schedule 11.02.2019
comment
спасибо за Ваш ответ! :) тем временем я нашел другой способ сделать это, используя on message * { if(strncmp(this.name, bar.name, 256) == 0) ... кажется короче и легче читать - person Flying_whale; 11.02.2019
comment
Да, намного лучше. Я не знал, что this.name был представлен тем временем. - person M. Spiller; 11.02.2019

Учитывая, что динамические имена сообщений не подходят, рассмотрите альтернативный вариант.

Если //do stuff — это функция, которую вы можете использовать повторно, объявите ее в своем основном CAPL-скрипте или включите ее из doStuff.cin.

Затем, в зависимости от вашего проекта, включите prjMessageEventHandler.cin, состоящее из on message yourProjectDependendMessages (вы также можете объявить списки сообщений):

on message 1,2,3,4
{
    // call to doStuff.cin suitable function
}

Поскольку ваш prjMessageEventHandler.cin такой простой, вы можете создать его программно из xml.

Таким образом, единственное, что вам нужно изменить в тестовом сценарии CAPL, это то, что prjMessageEventHandler.cin вы хотите включить.

person Daemon Painter    schedule 13.02.2019