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.