Введение

MCR алгоритмы обеспечивают обработку сигналов с различных устройств ввода. Драйвер устройства отправляет данные о сигнале устройства (DeviceSignal), идентификатор устройства (DeviceIdent) и строку полученных входных данных. DeviceIdent задаётся в параметре драйвера Device Identifier. DeviceSignal бывает 5 типов: sgMagCard(Магнитная карта), sgBarCode(Штрих-код), sgDallas(Даллас), sgKBDInterface(Клавиатура), sgNoTouch(Бесконтактный). В результате обработки сигнала определяется набор MCR алгоритмов, которые признали этот сигнал «своим». При этом каждый из этих алгоритмов выделяет из поступившей информации «параметр» - информацию для дальнейшей обработки. Смысл параметра зависит от области. Способ извлечения параметра из исходной информации зависит от типа алгоритма.

Существует несколько типов алгоритмов, различающихся методом обработки данных. Не все из них используют всю информацию, предоставляемую драйвером, например, может анализироваться только строка ввода. Для проверки корректности работы MCR алгоритмов существует форма, в которой задаются входные воздействия и отображается их результат (список отработавших алгоритмов и выданных ими параметров и объектов).

Для всех MCR алгоритмов задают свойства:

  • Тип алгоритма
  • Типы устройств – набор типов устройств, сигналы с которых будут обрабатываться этим алгоритмом
  • Область – способ дальнейшей обработки MCR алгоритма или тип объекта.

Объект заполняется для всех областей кроме работник, карта входа, штрихкод элемента меню, код элемента меню. Именно этот выбранный объект будет посылаться кассе после обработки сигнала от входного устройства.

Заполнять поле ввода параметром – поле видимо только вместе с полем объект. При обработке многих объектов используется поле ввода в форме редактирования заказа. Например, при обработке элемента меню в поле ввода ожидается количество. Если стоит галочка в этом свойстве, то  параметр, полученный при обработке MCR алгоритмов будет обрабатываться так, как будто эта информация была введена в поле ввода. Например, на магнитной полосе записано 1234, существует MCR алгоритм типа префикс с префиксом «123», областью «Элемент меню» и выставленным флагом «Заполнять поле ввода параметром». При прокатывании карточки параметр определится как 4 (результат отсечения префикса 123). В результате, добавится блюдо с количеством 4.

Область применения

Область – способ дальнейшей обработки MCR алгоритма или тип объекта. Способы обработки без объекта – работник, карта входа, штрихкод элемента меню, код элемента меню. В остальных случаях объект задаётся прямо в MCR алгоритме.
Работник – регистрация работника в системе (в том числе для подтверждения операции). Параметр, полученный при обработке MCR алгоритма, сравнивается со свойством работников «Код Карты» (см. свойство «Учётная запись») и находится нужный работник.
Карта входа – обработка карты на входе.

Штрихкод элемента меню – поиск блюда по штрих-коду и добавление в заказ. Параметр, полученный при обработке MCR алгоритма, сравнивается со свойством элементов меню «Штрих-Коды» и находится нужный. Кроме того штрих-код может содержать вес, который тоже должен быть добавлен в параметр с разделителем «;». Пример MCR алгоритма для обработки весовых блюд есть в стандартной поставке.
Код элемента меню – поиск блюда по коду и добавление в заказ. Параметр, полученный при обработке MCR алгоритма, сравнивается со свойством элементов меню «Код» и находится нужный.

Валюта, Элемент Меню, Тип заказа, Скидка – для этих областей заполняется соответствующий объект. Как правило, при обработке таких MCR алгоритмов параметр не важен, однако он может использоваться как информация из поля ввода см. Заполнять поле ввода параметром 
Интерфейс – для MCR алгоритмов этой области очень важно правильное определение параметра, так как именно параметр будет обрабатываться интерфейсом для связи с другими системами.

Типы MCR-алгоритмов 

DLL вер. 7.0

Разбором входных данных занимается DLL (библиотека), имя которой задано в поле «Имя DLL».

Прототип функции выглядит следующим образом:

function (
Device:	 byte; // Тип устройства
DeviceID:	word; // ID устройства
const Src:	pChar; // Указатель на входные данные (полученная строка)
ResBuffer:	pchar	// Указатель на буфер, в который будет помещена обработанная строка-параметр
): integer; stdcall;

Возвращаемое значение:

Если входные данные нужного типа, функция должна вернуть число от 0 до 255. В этом случае это число считается длиной результата в ResBuffer. Числа вне диапазона 0..255 считаются признаком того, что данные не подходят алгоритму.

Префикс

Алгоритм проверяет, что данные на входе начинаются с последовательности, заданной в поле «Префикс». Оставшаяся часть передается как параметр. Например, для префикса "321" входные данные вида "32167" будут верны, полученный параметр будет "67".

Обработка по маске

Обработка идет по маске, заданной в поле «Маска обработки». Правила обработки следующие: символы 0123456789+-/=,A..Z обязательны на позициях, где стоят, a..f - текстовые, i..n - цифровые части распознанного текста для параметра, r - код ресторана, ? - игнорируется (учитывается в длине), символы после * не учитываются. Например, для маски "?bbb=jjj=aaa/iii*" и данных "Q456=000=123/789SOMEINFO" маска сработает и параметр будет таким: 123;456;789;000. 
Для обработки весовых товаров следует добавить алгоритм с обработкой по маске и типом объекта “Штрихкод элемента меню” (либо ”Код элемента меню”). Существует предустановленный элемент, который можно поправить. Например, формат данных:
280aaaabbbbb?
указывает, что цифры 280 являются контрольными, а на месте символа ? может находиться любой – символ введен для контроля длины. Такой алгоритм присутствует в стандартной поставке. Рассмотрим строку ввода:
280aaaabbbbb?
2800198015007 В соответствии с маской выражение разберется:
___019801500 Parameter = 0198;01500
0198 Штрихкод блюда (или код в случае типа объекта ”Код элемента меню”)
01500 Вес блюда. Вес блюда будет разделен на значение, указанное в параметре BarcodeDivisor (Группа параметров «Весовой товар»).
Таким образом, если выбран тип объекта ”Код элемента меню” или “Штрихкод элемента меню”, то параметр содержит идентифицирующий код (штрихкод) и, при необходимости, вес блюда. Если штрихкод весовой, то свойство ”Коэффициент количества” штрихкода игнорируется.
Если в строке ввода нет идентификаторов, которые следует передать в параметр, то при соответствии строки ввода маске передается вся строка ввода, например:
Маска: 992=?A??, ввод: 992=BAYZ Так как ввод соответствует маске, то параметр будет 992=BAYZ.

Интерфейс

Разбором входных данных занимается некий интерфейс. Интерфейс (за исключением внутренних) представляет собой DLL, соответствующую определённым спецификациям. Использование интерфейса только для обработки устройств ввода нецелесообразно. Если у Вас имеется некий интерфейс, используемый с какой-либо системой, предоставленной третьей стороной, и Вы желаете включить в него возможность обработки устройств ввода, следует обратиться к разработчиками с запросом.

Скрипт вер. 7.0

Позволяет составить скрипт для обработки непосредственно в интерфейсе программы, таким образом нет необходимости для составления собственной DLL. Обработка основана на Innerfuse Pascal Script. Синтаксис языка такой же, как в языке Pascal, но набор функций ограничен и будет перечислен ниже. Обработчик поддерживает: 
1. Стандартные типы: Byte, Shortint, Char, Word, SmallInt, Cardinal, Longint, Integer, String, Real, Double, Single, Extended, Comp, Boolean, Array, Record, Variant;
2. Переменные, константы; 
3. Стандартные выражения: Begin/End, If/Then/Else, For/To/Downto/Do, Case x Of, Repeat/Until, While, With, Uses, Try/Except/Finally Exit, Continue, Break; 
4. Функции, процедуры, параметры Array of Const, Var;

Каждый скрипт имеет заголовок вида:

function (
DeviceSignal: Integer; // Сигнал устройства sgXXXX
DeviceIdent: Integer; // идентификатор устройства, см. Device identifier
var Parameter: String	// На входе – вся информация, на выходе - параметр
): Boolean;

Возвращаемое значение:

Если TRUE, то скрипт считается корректно отработавшим, параметр берется из переменной Parameter. 
Список поддерживаемых функций представлен в файле RK7Scripts.doc.
Существует возможность вызова функций из DLL. Для этого необходимо создать MCR алгоритм с типом “Скрипт вер. 7.0” и областью “Script Header”. Такие алгоритмы не являются алгоритмами распознавания и служат для задания заголовков других алгоритмов. При этом свойство “типы устройств” указывает, что данный заголовок будет присоединяться только к скриптам алгоритмов, поддерживающих хоть один тип устройств из списка поддерживаемых алгоритмом с областью “Script Header”. В поле скрипт такого алгоритма необходимо указать объявление внешней функции в виде:

function MessageBox(hWnd: Longint; lpText, lpCaption: PChar; uType: Longint): Longint; external 'MessageBoxA@user32.dll stdcall';

В данном примере:

MessageBox Имя функции для вызова из скрипта
external Указывает, что функция внешняя
MessageBoxA Имя функции в DLL
user32.dll Имя DLL
Stdcall Указание спецификации вызова

Теперь функцию можно вызывать из скриптов алгоритмов:

MessageBox(0, ‘Some Text’, ‘Some Caption’, 0);