Вы здесь

Драйверы устройств

В системе «Умный дом» введено несколько сущностей для обработки данных. Обо всех этих сущностях описано в статье «Структура системы Умный дом». Здесь я хочу описать такую сущность как «Драйвер устройства».

Драйвер устройства — это динамическая библиотека реализующая в себе функции для получения от устройства или передачи в устройства данных. Драйверы устройств работают с так называемыми «сырыми» данными — то есть данными в том воде в котором устройства способны их воспринимать. За перевод данных из сырого вида в удобный для использования отвечают псевдодрайверы устройств.

Любой драйвер устройств должен экспортировать следующие функции:

  1. Функция чтения устройства

    function ReadDevice (UID: String): TDLParamForSend; stdcall; export;

    Параметры:
    UID — Уникальный идентификатор устройства.
    Возвращает значение которое возвращает устройство. Поскольку устройство может возвращать несколько значений, то используется TDLParamForSend который содержит в себе строку с параметрами и значениями. Как передавать параметры в подпрограммы динамических библиотек можно прочитать в статье «Передача параметров в функции динамических библиотек».

  2. Процедура записи в устройство

    procedure WriteDevice (UID: String; Values: TDLParamForSend); stdcall; export;

    Параметры:
    UID — Уникальный идентификатор устройства.
    Values — Список параметров которые необходимо передать в устройство.

  3. Функция статуса устройства

    Эта функция возвращает текущий статус устройства: включено, отключено, занято.

    function DeviceStatus (UID: String): String; stdcall; export;

    Параметры:
    UID — Уникальный идентификатор устройства.
    Возвращает значения: ON, OFF, BUSY

  4. Функция описания устройства

    Данная функция возвращает все данные об устройстве которые возможно получить. Как минимум она должна возвращать: Имя, UID, Тип. Эта функция будет использоваться при создании подсистемы отвечающей за взаимодействие с пользователем. На данный момент эта функция не используется при работе программы «Умный дом», но её необходимо экспортировать для совместимости с более поздними версиями системы «Умный дом»

    function DeviceInfo (UID: String): TDLParamForSend; stdcall; export;

    Параметры:
    UID — Уникальный идентификатор устройства.
    Возвращает список параметров текущего устройства: NAME, UID, TYPE.

  5. Функция поиска устройства

    Функция возвращает список подключённых к систему устройств работу с которыми производит производить данный драйвер.

    function FindDevice: TDLParamForSend; stdcall; export;

    Параметры:
    Возвращает список устройств которые управляются этим драйвером.

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

Дальнейшее описание стандартного драйвера лучше всего провести на примере:

  1. library onoff;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8. glb_sharedmemory,
  9. {$IFDEF UNIX}{$IFDEF UseCThreads}
  10. cthreads,
  11. {$ENDIF}{$ENDIF}
  12. heaptrc,
  13. Classes, INIFiles, SysUtils, glb_dl_params, FileUtil, glb_vars, LCLProc
  14. { you can add units after this };
  15.  
  16. {$IFDEF WINDOWS}{$R onoff.rc}{$ENDIF}
  17.  
  18.  
  19. function ReadDevice (UID: String): TDLParamForSend; stdcall; export; // Функция чтения устройства
  20. var
  21. Params: TDLParams;
  22. devfile: TIniFile;
  23. tmptxt: String;
  24. begin
  25. Params := TDLParams.Create;
  26. tmptxt := GetCurrentDir+constDirSeparator+'user'+constDirSeparator+'inonoff.ini';
  27. devfile := TIniFile.Create(tmptxt);
  28. Params.AddParamAsString('VALUE', devfile.ReadString(UID, 'value', 'off'));
  29. devfile.Free;
  30. devfile := nil;
  31. result := Params.Params;
  32. Params.Free;
  33. Params:=Nil;
  34. end;
  35.  
  36. procedure WriteDevice (UID: String; Values: TDLParamForSend); stdcall; export; // Процедура записи в устройство
  37. begin
  38.  
  39. end;
  40.  
  41. function DeviceStatus (UID: String): String; stdcall; export; // Функция статуса устройства
  42. begin
  43. result := 'ON';
  44. end;
  45.  
  46. function DeviceInfo (UID: String): TDLParamForSend; stdcall; export; // Функция описания устройства
  47. var
  48. Params: TDLParams;
  49. begin
  50. Params := TDLParams.Create;
  51.  
  52. Params.AddParamAsString('NAME1', 'Эмулятор выключателя');
  53. Params.AddParamAsString('UID1', UID);
  54. Params.AddParamAsString('TYPE1', 'ONOFF');
  55.  
  56. result := Params.Params;
  57. Params.Free;
  58. Params := nil;
  59. end;
  60.  
  61. function FindDevice: TDLParamForSend; stdcall; export; // Процедура поиска устройства
  62. var
  63. Params: TDLParams;
  64. begin
  65. Params := TDLParams.Create;
  66. Params.AddParamAsInteger('COLDEVICES', 3);
  67.  
  68. Params.AddParamAsString('NAME1', 'Эмулятор выключателя');
  69. Params.AddParamAsString('UID1', 'ONOFF1');
  70. Params.AddParamAsString('TYPE1', 'ONOFF');
  71.  
  72. Params.AddParamAsString('NAME2', 'Эмулятор выключателя');
  73. Params.AddParamAsString('UID2', 'ONOFF2');
  74. Params.AddParamAsString('TYPE2', 'ONOFF');
  75.  
  76. Params.AddParamAsString('NAME3', 'Эмулятор выключателя');
  77. Params.AddParamAsString('UID3', 'ONOFF3');
  78. Params.AddParamAsString('TYPE3', 'ONOFF');
  79.  
  80. result := Params.Params;
  81. Params.Free;
  82. Params := nil;
  83.  
  84. end;
  85.  
  86. exports
  87. ReadDevice,
  88. WriteDevice,
  89. DeviceStatus,
  90. DeviceInfo,
  91. FindDevice;
  92. end.

Данный драйвер считывает из файла значение и передает его программе. Естественно вместо файла может быть подключённое устройство.

Необходимо обратить внимание, на то что функция FindDevice возвращает список параметров и одним из параметров (COLDEVICES) является количество устройств которыми управляет этот драйвер. Система умный дом обрабатывает ровно то количество устройств которое указано в этом параметре. При этом все остальные параметры нумеруются от 1 до количества устройств. Для каждого устройства возвращается имя (NAME), уникальный идентификатор (UID) и тип устройства (TYPE).