Zastosowanie takiego rozwiązania ma dodatkową zaletę. Drobne korekty w rozkazach obsługi drukarki w tym dodanie nowych czy zmiana ilości i rodzaju parametrów nie wymagają zmian w bibliotece komunikacyjnej, a jedynie dostosowania aplikacji do tych zmian.
Po wykonaniu takiego obiektu rozkazowego przez drukarkę (por. Przepływ informacji) wyniki dostępne są w analogiczny sposób - przez zestaw funkcji pobierających je kolejno z obiektu rozkazowego.
Całość transmisji obsługiwana jest przez dwa niezależne wątki, jeden transmisyjny, drugi odbiorczy operujące na odpowiednich kolejkach rozkazów. Dodatkowo dla każdego urządzenia istnieje osobny wątek wykonujący cykliczne zapytania o status urządzenia.
Do obsługi zdarzeń w tym trybie został przygotowany zestaw funkcji opisany w module Obsługa zdarzeń asynchronicznych statusu drukarek. Aplikacja główna może zostać powiadomiona o przyjściu nowego zdarzenia za pomocą:
Aplikacja może też cyklicznie sprawdzać status urzadzenia (polling).
UWAGA: Z natury działania drukarki sprawdzenie pełnego statusu drukarki składa się z dwóch niezaleznych operacji, w związku z tym w momencie przejscia drukarki ze stanu poprawngo do stanu awarii mechanizmu drukującego wystąpią dwa kolejne zdarzenia asynchroniczne (pierwsze wskazujące zmiane statusu drukarki, drugie statusu mechanizmu).
UWAGA: Jeśli status drukarki nie wskazuje na błąd mechanizmu drukarki wartość statusu mechanizmu jest nieistotna (nieważna).
\\ Przygotowanie i otwarcie urzadzenia
void *hDevice=NULL;
hDevice=POS_CreateDeviceHandle(type);
POS_SetDebugLevel(hDevice,POSNET_DEBUG_ALL & 0xFFFFFFFE);
POS_SetDeviceParam(hDevice,POSNET_DEV_PARAM_COMSETTINGS,(void*)"COM1,9600,8,N,1,H");
void *hLocalDevice=POS_OpenDevice(hDevice);
\\ Wysłanie kolejnych rozkazów paragonu
\\ Wersja z uzupełnianiem parametrów pojedynczo
hRequest = POS_CreateRequest(hLocalDevice,"trinit");
POS_PushRequestParam(hRequest,"bm","1");
POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
\\ Oczekiwanie na wykonanie rozkazu
POS_WaitForRequestCompleted(hRequest,5000);
\\ Sprawdzenie statusu wykonania
if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) { OBSLUGA_BLEDU }
\\ Usuniecie rozkazu
POS_DestroyRequest(hRequest);
\\ Nastepne polecenia, wersja z tworzeniem rozkazu z parametrami
hRequest = POS_CreateRequestEx(hLocalDevice,"trline","na,Bułka Standardowa\nvt,0\npr,35");
POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
POS_WaitForRequestCompleted(hRequest,5000);
if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) { OBSLUGA_BLEDU }
POS_DestroyRequest(hRequest);
hRequest = POS_CreateRequestEx(hLocalDevice,"trpayment","ty,0\nre,0\nwa,35");
POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
POS_WaitForRequestCompleted(hRequest,5000);
if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) { OBSLUGA_BLEDU }
POS_DestroyRequest(hRequest);
hRequest = POS_CreateRequestEx(hLocalDevice,"trend","to,35\nfp,35");
POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
POS_WaitForRequestCompleted(hRequest,5000);
if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) { OBSLUGA_BLEDU }
POS_DestroyRequest(hRequest);
\\ zamkniecie urzadzenia
POS_CloseDevice(hLocalDevice);
POS_DestroyDeviceHandle(hDevice);
Biblioteka posiada zestaw aplikacji demonstrujących różne sekwencje poleceń dla drukarki.
Poniżej przedstawiono przykładowy kod dla VBA.
Private Declare Function POS_WaitForRequestCompleted Lib "posnet.dll" (ByVal H As Long, ByVal P As Long) As Long
Podobny kod dla Delphi 7
function POS_WaitForRequestCompleted (hDevice : THandle; k: longint) : THandle; stdcall; external 'posnet.dll'
libposcmbth.so.1.0
oraz
libptypes.so.2.0.2 (http://www.melikyan.com/ptypes/)
Biblioteki te są zależne także od dostępnych na licencji LGPL bibliotek obsługujących podsystem USB:
libusb - w wersji 0.1.11+ dostępnej standardowo w większości dystrybucji (http://libusb.sourceforge.net/)
oraz
libftdi w wersji 0.7+ (http://www.intra2net.com/de/produkte/opensource/ftdi/index.php) do obsługi konwertera FTDI zastosowanego w urządzeniu.
UWAGA!!! W przypadku korzystania z trybu natywnego USB (POSNET_INTERFACE_USB) do poprawnego działania drukarki niezbędne jest zablokowanie automatycznego ładowania i usunięcie jesli jest załadowany modułu jądra ftdi_sio. W przeciwnym razie połączenie z drukarką nie będzie możliwe (w pliku logu zgłaszany będzie błąd o kodzie -5), gdyż moduł ten przejmuje kontrolę nad konwerterem FTDI tworząc wirtualny port szeregowy (/dev/ttyUSBx).
W przypadku korzystania w trybie wirtualnego portu szeregowego, sterownik ftdi_sio jest potrzebny.
1.5.5