В системе «Умный дом» введено несколько сущностей для обработки данных. Обо всех этих сущностях описано в статье «Структура системы Умный дом». Здесь я хочу описать такую сущность как «Драйвер устройства».
Драйвер устройства — это динамическая библиотека реализующая в себе функции для получения от устройства или передачи в устройства данных. Драйверы устройств работают с так называемыми «сырыми» данными — то есть данными в том воде в котором устройства способны их воспринимать. За перевод данных из сырого вида в удобный для использования отвечают псевдодрайверы устройств.
Любой драйвер устройств должен экспортировать следующие функции:
function ReadDevice (UID: String): TDLParamForSend; stdcall; export;
Параметры:
UID — Уникальный идентификатор устройства.
Возвращает значение которое возвращает устройство. Поскольку устройство может возвращать несколько значений, то используется TDLParamForSend который содержит в себе строку с параметрами и значениями. Как передавать параметры в подпрограммы динамических библиотек можно прочитать в статье «Передача параметров в функции динамических библиотек».
procedure WriteDevice (UID: String; Values: TDLParamForSend); stdcall; export;
Параметры:
UID — Уникальный идентификатор устройства.
Values — Список параметров которые необходимо передать в устройство.
Эта функция возвращает текущий статус устройства: включено, отключено, занято.
function DeviceStatus (UID: String): String; stdcall; export;
Параметры:
UID — Уникальный идентификатор устройства.
Возвращает значения: ON, OFF, BUSY
Данная функция возвращает все данные об устройстве которые возможно получить. Как минимум она должна возвращать: Имя, UID, Тип. Эта функция будет использоваться при создании подсистемы отвечающей за взаимодействие с пользователем. На данный момент эта функция не используется при работе программы «Умный дом», но её необходимо экспортировать для совместимости с более поздними версиями системы «Умный дом»
function DeviceInfo (UID: String): TDLParamForSend; stdcall; export;
Параметры:
UID — Уникальный идентификатор устройства.
Возвращает список параметров текущего устройства: NAME, UID, TYPE.
Функция возвращает список подключённых к систему устройств работу с которыми производит производить данный драйвер.
function FindDevice: TDLParamForSend; stdcall; export;
Параметры:
Возвращает список устройств которые управляются этим драйвером.
Все функции обязательно должны присутствовать в драйвере вне зависимости от того, умеет ли устройство возвращать значение или это исполняющее устройство.
Дальнейшее описание стандартного драйвера лучше всего провести на примере:
library onoff; {$mode objfpc}{$H+} {$R *.res} uses glb_sharedmemory, {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} heaptrc, Classes, INIFiles, SysUtils, glb_dl_params, FileUtil, glb_vars, LCLProc { you can add units after this }; {$IFDEF WINDOWS}{$R onoff.rc}{$ENDIF} function ReadDevice (UID: String): TDLParamForSend; stdcall; export; // Функция чтения устройства var Params: TDLParams; devfile: TIniFile; tmptxt: String; begin Params := TDLParams.Create; tmptxt := GetCurrentDir+constDirSeparator+'user'+constDirSeparator+'inonoff.ini'; devfile := TIniFile.Create(tmptxt); Params.AddParamAsString('VALUE', devfile.ReadString(UID, 'value', 'off')); devfile.Free; devfile := nil; result := Params.Params; Params.Free; Params:=Nil; end; procedure WriteDevice (UID: String; Values: TDLParamForSend); stdcall; export; // Процедура записи в устройство begin end; function DeviceStatus (UID: String): String; stdcall; export; // Функция статуса устройства begin result := 'ON'; end; function DeviceInfo (UID: String): TDLParamForSend; stdcall; export; // Функция описания устройства var Params: TDLParams; begin Params := TDLParams.Create; Params.AddParamAsString('NAME1', 'Эмулятор выключателя'); Params.AddParamAsString('UID1', UID); Params.AddParamAsString('TYPE1', 'ONOFF'); result := Params.Params; Params.Free; Params := nil; end; function FindDevice: TDLParamForSend; stdcall; export; // Процедура поиска устройства var Params: TDLParams; begin Params := TDLParams.Create; Params.AddParamAsInteger('COLDEVICES', 3); Params.AddParamAsString('NAME1', 'Эмулятор выключателя'); Params.AddParamAsString('UID1', 'ONOFF1'); Params.AddParamAsString('TYPE1', 'ONOFF'); Params.AddParamAsString('NAME2', 'Эмулятор выключателя'); Params.AddParamAsString('UID2', 'ONOFF2'); Params.AddParamAsString('TYPE2', 'ONOFF'); Params.AddParamAsString('NAME3', 'Эмулятор выключателя'); Params.AddParamAsString('UID3', 'ONOFF3'); Params.AddParamAsString('TYPE3', 'ONOFF'); result := Params.Params; Params.Free; Params := nil; end; exports ReadDevice, WriteDevice, DeviceStatus, DeviceInfo, FindDevice; end.
Данный драйвер считывает из файла значение и передает его программе. Естественно вместо файла может быть подключённое устройство.
Необходимо обратить внимание, на то что функция FindDevice возвращает список параметров и одним из параметров (COLDEVICES) является количество устройств которыми управляет этот драйвер. Система умный дом обрабатывает ровно то количество устройств которое указано в этом параметре. При этом все остальные параметры нумеруются от 1 до количества устройств. Для каждого устройства возвращается имя (NAME), уникальный идентификатор (UID) и тип устройства (TYPE).