Текущий раздел:

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.2. События блока и связанные с ними описания

А.2.4. События общего назначения

А.2.4.22. RDS_BFM_VARCHECK – проверка допустимости структуры статических переменных блока

# Приложения

## Приложение А. Функции, константы и структуры RDS

### А.2. События блока и связанные с ними описания

#### А.2.4. События общего назначения

##### А.2.4.22. RDS_BFM_VARCHECK – проверка допустимости структуры статических переменных блока

Поток, в котором вызывается функция модели

Главный поток RDS.

Первый параметр функции модели (int CallMode)

Константа RDS_BFM_VARCHECK.

Третий параметр функции модели (void *ExtParam)

Указатель на строку типа (char*) статических переменных блока.

Возвращаемое функцией модели значение

RDS_BFR_DONE | Структура переменных блока удовлетворяет требованиям модели.
RDS_BFR_ERROR | Структура переменных блока не удовлетворяет требованиям модели, все дальнейшие реакции, кроме RDS_BFM_CLEANUP и новых RDS_BFM_VARCHECK, будут заблокированы.
RDS_BFR_BADVARSMSG | Структура переменных блока не удовлетворяет требованиям модели, все дальнейшие реакции, кроме RDS_BFM_CLEANUP и новых RDS_BFM_VARCHECK, будут заблокированы, пользователю будет выведено сообщение.

Примечания

Событие RDS_BFM_VARCHECK возникает при подключении к простому блоку новой модели после события RDS_BFM_INIT, а также при любом изменении структуры статических переменных блока. У подсистем, внешних входов/выходов и вводов шин это событие не возникает. Реагируя на это событие, функция модели должна сообщить RDS, подходит ли ей данная структура переменных. Если функция вернет константу RDS_BFR_DONE, структура будет считаться подходящей, и модель блока будет вызываться RDS для реакции на все остальные события. Если же она вернет RDS_BFR_ERROR или RDS_BFR_BADVARSMSG, все события, кроме очистки данных блока (RDS_BFM_CLEANUP) и повторных проверок структуры переменных не будут передаваться в модель блока. Таким образом, написав реакцию на событие RDS_BFM_VARCHECK, программист может быть уверен, что структура статических переменных блока соответствует его ожиданиям, что даст ему возможность обращаться к этим переменным по фиксированным смещениям относительно начала дерева переменных. Работа со статическими переменными блока и примеры реакций на событие RDS_BFM_VARCHECK подробно рассмотрены в §2.5 руководства программиста.

Текущая структура переменных блока, которую модель должна проанализировать, передается в третьем параметре функции в виде строки типа, в которой каждой переменной соответствует символ, обозначающий ее тип (все символы относятся к латинскому алфавиту):

Символ | Константа в RDS | Обозначаемый тип
--- | --- | ---
S | RDS_VARTYPE_SIGNAL | Сигнал (1 байт)
L | RDS_VARTYPE_LOGICAL | Логический (1 байт)
C | RDS_VARTYPE_CHAR | char (целый, 1 байт)
H | RDS_VARTYPE_SHORT | short int (целый, 2 байта)
I | RDS_VARTYPE_INT | int (целый, 4 байта)
F | RDS_VARTYPE_FLOAT | float (вещественный, 4 байта)
D | RDS_VARTYPE_DOUBLE | double (вещественный двойной точности, 8 байтов)
A | RDS_VARTYPE_STRING | Строка в кодировке UTF8 (char*, завершается нулевым байтом)
V | RDS_VARTYPE_RUNTIME | Произвольный тип (изменяется в процессе работы)
M | RDS_VARTYPE_ARRAY | Массив или матрица (следующий символ – тип элемента)
{ | RDS_VARTYPE_STRUCT | Начало структуры (начиная со следующего символа описываются типы полей структуры)
} | RDS_VARTYPE_STRUCTEND | Конец структуры (описание типов полей структуры закончилось)

Последовательность таких символов однозначно описывает структуру статических переменных блока и их размещение в памяти. Поскольку вся совокупность переменных блока с точки зрения RDS является структурой, строка типа всегда начинается с символа «{» и заканчивается символом «}». Ниже приведены некоторые примеры строк типа переменных блоков:

Строка | Расшифровка
--- | ---
«{SSDD}» | Две первых переменных блока – сигналы («S»), за ними следуют две вещественных переменных двойной точности («D»).
«{SSMIA}» | Две первых переменных блока – сигналы («S»), за ними следует массив или матрица целых чисел («MI»), за ней – строка («A»).
«{SSVMMD}» | Два сигнала («S»), переменная произвольного типа («V»), матрица матриц вещественных чисел («MMD»).
«{SS{DD}I{DD}}» | Два сигнала («S»), структура с двумя вещественными полями двойной точности («{DD}»), целое число («I»), снова структура с двумя вещественными полями двойной точности («{DD}»).
«{SSM{IDMA}}» | Два сигнала («S») и матрица («M») структур, содержащих три поля: целое («I»), вещественное («D») и матрицу строк («MA»).

Строка типа переменных простого блока всегда начинается с двух букв «S», поскольку две первых переменных любого простого блока – это сигнал запуска и сигнал готовности. В строке типа не содержится никакой информации о том, является ли переменная входом или выходом, о ее имени и об именах используемых структур (для структур указываются только типы их полей). Вся эта информация не влияет на собственно структуру дерева переменных, то есть на смещения к данным каждой переменной от начала дерева. По той же причине в строке типа не делается различия между матрицами и массивами – в RDS они хранятся в памяти одинаково (см. §2.5.3 руководства программиста).

Модель блока должна сравнить полученную ей в реакции на событие RDS_BFM_VARCHECK строку типа с одной или несколькими заложенными в нее строками, и вернуть RDS константу, указывающую на допустимость данной структуры переменных для данной модели. Возврат RDS_BFR_ERROR отличается от возврата RDS_BFR_BADVARSMSG только тем, что в последнем случае RDS выведет пользователю сообщение о недопустимости структуры переменных блока.

Пример

Реакция на событие RDS_BFM_VARCHECK в модели, которая, помимо двух обязательных сигналов, должна иметь три вещественных переменных двойной точности:

      switch(CallMode)
          {
            case RDS_BFM_VARCHECK:
              if(strcmp((char*)ExtParam,"{SSDDD}")==0)
                return RDS_BFR_DONE;
              return RDS_BFR_BADVARSMSG;

См. также

RDS_BFM_CLEANUP, RDS_BLOCKDATA.