# Принцип декодирования с использованием FastScript

Также как в любом другом случае декодирование на стороне TCPCardReader'a включается строкой.

```
useDecodeCards=1  
```

в TCPCardReader.ini в настройках конкретного считывателя:

```
[READER1]
COMPORT=6
COMPORTPARAMS=baud=9600 data=8 parity=N stop=1
Prefix=;
Postfix=?
useDecodeCards=1
StartTermChars=i
FinishTermChars=?#13;#10;#0;
```

Таким образом при включении декодирования TCPCardReader отправляет часть трека начинающегося с символа следующего за *StartTermChars* и заканчивающимся символом стоящим перед одним из *FinishTermChars в* Decodecards*.*

Итак Decodecards получает только эту часть и декодирует (преобразовывает/выделяет идентификатор) её.

В **decodecards.ini** В секции **\[mask\]** перечисляются маски по префиксам которых можно разделять декодирование разных карт

\[mask\]  
card\_em = ne\*  
card\_mifare = fare\*  
**card = \***

В данном примере если пришедший от TCPCardReader'a трек содержит префикс "ne" ,то обработка такого трека будет описана в секции \[cards.**card\_em**\]. Соответственно если трек содержит префикс "fare" то обработка такого трека описана в секции \[cards.card\_mifare\]. Символ "\*" в данном случае означает любое количество символов.

<p class="callout warning">`Чтение данной секции происходит последовательно, то есть при первом совпадении пришедшего трека с маской дальнейшей просмотр секции не ведётся`</p>

Далее в секциях с названием "cards." и левой частью до знака равенства в секции \[mask\] конкретного типа трека настраивается декодирование.

```
[cards.Card]
code=2
CardDecodeType = FastScript
DecodeTypeEx = 0
```

  
Опцией CardDecodeType = FastScript выбираем алгоритм декодирования с использованием FastScript.

В таком случаем алгоритм декодирования программируется в функции <span style="color: #3366ff;">decodecard </span>во внешнем файле, задаваемым параметром fsUnit в секции \[frf\].

```
[frf]
fsUnit=fsdecodecard.upas
```

Пример внешнего файла <span style="color: #3366ff;">fsdecodecard.upas</span>

```
function fsUnitVersion:integer;
begin
  result := 1;
end;

function DecodeCard(Track:string; var Code:integer):string;
begin
	if ( Length(track) >= 4 ) then
		result :1= copy( track, length(track)-3, 4 )                            
	else
		result := track;
end;

begin

end.
```

<div id="bkmrk-%D0%A2.%D0%B5.-%D0%BF%D1%80%D0%B8-%D1%81%D1%87%D0%B8%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-">Т.е. при считывании идентификатора, для его декодирования будет вызвана функция DecodeCard() из данного файла.</div><div id="bkmrk-%C2%A0-2"> </div><div id="bkmrk-%D0%92%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D1%84%D1%83">**Входные параметры функции:**</div><div id="bkmrk-track%C2%A0--%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9-%D1%82%D1%80%D0%B5%D0%BA-">**Track** - полный трек полученный от считывателя (типа string),</div><div id="bkmrk-code%C2%A0--%D0%BA%D0%BE%D0%B4-%D1%82%D0%B8%D0%BF%D0%B0-%D0%B8%D0%B4%D0%B5%D0%BD">**Code** - код типа идентификатора (типа integer, подлежит изменению в теле функции);</div><div id="bkmrk-%D0%92%D1%8B%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D1%84">**Выходные параметры функции:**</div><div id="bkmrk-result%C2%A0--%D0%BD%D0%BE%D0%BC%D0%B5%D1%80-%D0%B8%D0%B4%D0%B5%D0%BD%D1%82">**Result** - номер идентификатора представленный строкой, после получения должен безошибочно конвертироваться в Int64 (типа string). Т.е результатом работы функции DecodeCard должна быть строка которая должна однозначно приводиться к 10-тиричному числу. </div><div id="bkmrk-%C2%A0-3"> </div><div id="bkmrk-%D0%92-%D1%84%D0%B0%D0%B9%D0%BB%D0%B5-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0-%D0%B4%D0%BE%D1%81%D1%82">В файле скрипта доступны все функции доступные в печатных формах абонемента, что позволяет облегчить написание и отладку скрипта.</div><div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BF%D0%B5%D1%87%D0%B0%D1%82%D0%BD%D0%BE%D0%B9-%D1%84%D0%BE%D1%80%D0%BC">Пример печатной формы для тестирования разрабатываемого скрипта в приложении.</div><div id="bkmrk-"></div><div id="bkmrk--0"></div><div id="bkmrk--1"></div><div id="bkmrk-%C2%A0-4"> </div>Вся обработка происходит в функции DecodeCard в которую передаются трек без *ExcludedPrefix* и *code* указанный в соответствующей секции файла *decodecards.ini.* Чаще всего это *code=2* как в данном примере. В функции можно использовать другие функции реализованные в этом же файле.

Далее TCPCardReader обрамит этот трек префиксом "Prefix=;" и суффиксом "Postfix=?" и отправит клиентам.

**[Третий закон Чизхолма](https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%9C%D0%B5%D1%80%D1%84%D0%B8 "Закон Мерфи")**<sup class="reference" id="bkmrk-%5B1%5D">[\[1\]](https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%A7%D0%B8%D0%B7%D1%85%D0%BE%D0%BB%D0%BC%D0%B0#cite_note-1)</sup>.

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