Добавление команды в протокол

Для добавления новой команды в протокол необходимо:

  1. Добавить код её запроса и ответа в виде констант (используйте префикс сt и постфикс Request или Answer в зависимости от того запрос это или ответ);
  2. Добавить в класс протокола новую функцию, которая будет реализовывать данную команду (название команды следует сформировать из названия функции в протоколе. Если функция что-то записывает в устройство, то предпочтительно использовать Write в названии, если читает, то Read. Но это не обязательно)
    • Если команда возвращает несколько значений, что надо создать соответствующую структуру и возвращать её. Возвращать объекты не рекомендуется.
    • Иногда команды, описанные в протоколе, возвращают то что было передано. Это сделано для отладки. Правильно сравнивать переданное и принятое и если они не совпадают — поднимать эксепшен.
    • Для того, что бы передать какие-нибудь параметры их надо превратить в массив байт. Для конвертации можно воспользоваться функциями из модуля KArrayRoutines. Полученный массив надо поместить в переменную RequestArray, для того, чтобы сравнить запрос и полученный ответ, если это предусмотрено семантикой команды.
    • Создать экземпляр пакета нужного типа (например TFreGrafPackage), в который записать код запроса и массив созданный на предыдущем шаге;
    • С помощью передатчика пакетов передать созданный пакет используя метод RequestDevice;
    • Пакет который вернул метод RequestDevice проверить на наличие ошибок с помощью метода DoPackageCheck;
    • Данные из полученного пакета преобразовать к необходимому типу из типа Byte;
    • Вернуть результат работы функции.

Пример функции реализующей команду:

function TDeviceProtocolSingleton.WriteData(InputData: Word): Boolean;
var
  Answer: TFreGrafPackage;
  Temp: TByteArray;
begin
  AddArrays(Temp, ConvertWordToBytes(InputData), Temp);
 
  Answer := TDeviceSingleton.GetInstance.RequestDevice(
    CreatePackage(mtWriteDataRequest, Temp));
  try
    DoPackageCheck(Answer, 6, mtWriteDataAnswer);
 
    // Обработка результата
 
  finally
    Answer.Free;
  end;
end;

См. также