Класс DrvRsrce предоставляет интерфейс для ресурсов (файл конфигурации). Сам он унаследован он класса Resources и реализует драйвер-ориентированные функции, главным образом, связанные со внутренними точками данных драйвера. Для общего драйвера существуют 4 внутренних точки данных, по одной на драйвер. Их привязка к соответствующим именам точек данных осуществляется в файле конфигурации (см. пример ниже). |
В файле конфигурации для каждого менеджера драйверов существует отдельный раздел, начинающийся с драйвер-ориентированного имени (между [ и ]). Кроме того, каждый драйвер также может работать в системе циклически (для связи с разными компонентами периферии, связывающимися через те же протоколы с «КАСКАД Цифра»), в этом случае каждый из них должен запускаться с уникальным номером, который указывается с помощью опции «-num x». Для каждого из драйверов в файле конфигурации может быть дополнительно задан отдельный раздел, в этом случае к названию раздела добавляется номер. В следующем примере раздел [myDrv] обрабатывает все драйверы типа myDrv, а раздел [myDrv_2] — только драйвер myDrv с номером 2. |
Каждая ресурсная запись задается в отдельной строке, начинающейся с имени ресурса, после которого указывается символ «=» и соответствующие параметры. Строки комментариев начинаются с символа «#». |
ПРИМЕР КОНФИГУРАЦИОННОГО ФАЙЛА # Раздел, относящийся ко всем драйверам типа myDrv #(это также может быть запись WCCOAmyDrv) [myDrv] instantGA = «Yes» # Раздел настроек для myDrv с # номером 2 [myDrv_2] drvGQ = «_Driver2.GQ:_original.._value» drvSQ = «_Driver2.SQ:_original.._value» drvSmoothMode = «_Driver2.SM:_original.._value» drvErrorMode = «_Driver2.EM:_original.._value» # Должна быть создана точка данных _Driver2 типа CommonDriver |
Метод readSection() должен быть перезаписан в специальном драйвере для обработки следующих записей: mydrvRsrce::readSection() { static char line[200]; if (!isSection(«mydrv»)) return PVSS_FALSE; getNextEntry(); while (cfgState != CFG_STATE_START && cfgState != CFG_EOF) { if (keyWord == «instantGA») cgfStream >> instantGA; else if (!commonKeyWord()) // проверьте, что keyWord принадлежит //ресурсам ComDrv (drv..) cerr << «unknown keyWord» << endl; // Сообщение об ошибке cfgStream.get(line,200,´/n´); getNextEntry(); } return PVSS_TRUE; } |
Функция getNextEntry() выбирает соответствующую следующую запись из файла конфигурации (следующую строку), проверяет правильность синтаксиса и записывает имя ресурса в переменную keyWord. |
Класс DrvRsrce объявляет enum InternalDpIdType для передачи заданных перечислений enum для следующих типов внутренних точек данных общего драйвера. Это объявление и описание одиночных значений приведены в файле заголовка ComDrv/DrvRsrce.hxx. |
тип точки данных | Задача |
NOT_INTERNAL_DPID | для обратной связи |
INTERNAL_GQ_DPID | внутренняя точка данных для общего запроса (drvGQ) |
INTERNAL_SQ_DPID | внутренняя точка данных для одиночного запроса (drvSQ) |
INTERNAL_SMOOTHMODE_DPID | внутренняя точка данных для сглаживания (drvSmoothMode) |
INTERNAL_ERRMSGMODE_DPID | внутренняя точка данных для (drvErrorMode) |
INTERNAL_DPID | дополнительная внутренняя точка данных (для собственных целей) |
Сглаживание может иметь одно из следующих значений: |
mode | Задача | Исполнение |
SMOOTH_MODE_ALWAYS | Сглаживание выполняется всегда | запись во внутреннюю точку данных drvSmoothMode значения 0 |
SMOOTH_MODE_NOTGQ | Сглаживание только в случае произвольных изменений значения | запись во внутреннюю точку данных drvSmoothMode значения 1 |
SMOOTH_MODE_NEVER | Сглаживание не выполняется | запись во внутреннюю точку данных drvSmoothMode значения 2 |
Приведенные выше значения в общем случае касаются только точек данных, для которых было настроено сглаживание. |
Класс DrvRsrce также предоставляет интерфейс для привязки внутренних точек данных с помощью виртуальных функций: |
int getNumberOfDpNames() — функция для возврата номера внутренней точки данных. |
CharString& getDpName4Query(int index) — эта функция предназначена для получения имени индексированной точки данных (нужно получить соответствующий идентификатор точки данных из менеджера данных). |
void setDpIdentifier(CharString& name, DpIdentifier& dpId) — эта функция вызывается для раскрытия идентификатора точки данных с именем«name». |
PVSSboolean allIdsGot() — должна вернуть PVSS_TRUE, если идентификатор точки данных был раскрыт для всех внутренних точек данных. |
int getNumberOfIds2Connect() — эта функция предназначена для возврата числа идентификаторов точек данных, которые драйвер должен регистрировать с помощью менеджера событий. |
DpIdentifier& getId2Connect(int index) — эта функция предназначена для возврата идентификатора индексированной точки данных, которую драйвер должен регистрировать с помощью менеджера событий. |
InternalDpIdType isInternalDpId(DpIdentifier& dpId) — общий драйвер проверяет, является ли DPID, для которой была получена прямая ссылка, внутренней точкой данных. Это значит, что данная функция должна вернуть INTERNAL_DPID, если dpId является внутренней точкой данных спец. драйвера. Если dpId не является внутренней точкой данных, функция должна вернуть NOT_INTERNAL_DPID. |
void answer4DpId(const DpIdentifier& dpId, Variable * varPtr) — вызывается в случае немедленного ответа на dpCponnect внутренней точки данных в менеджере событий. Новое значение передается в переменной varPtr. Функция должна переработать это изменение в значение. Произвольные прямые ссылки (информация) на внутренние точки данных передаются через объект HWService. |
Для сопоставления имени и идентификатора DpIdentifier, регистрации исходных значений определены различные функции, позволяющие драйверу иметь внутренние точки данных для хранения собственной информации (без регистрации с помощью менеджера событий). |
Класс, унаследованный от DrvRsrce, должен быть реализован в функции main() специального драйвера! |