Zastosowanie takiego rozwi¹zania ma dodatkow¹ zaletê. Drobne korekty w rozkazach obs³ugi kasy w tym dodanie nowych czy zmiana iloœci i rodzaju parametrów nie wymagaj¹ wtedy zmian w bibliotece komunikacyjnej, a jedynie dostosowania aplikacji do tych zmian.
Po wykonaniu takiego obiektu rozkazowego przez kasê (por. Przep³yw informacji) wyniki dostêpne s¹ w analogiczny sposób - przez zestaw funkcji pobieraj¹cych je kolejno z obiektu rozkazowego.
Cztery niezale¿ne kolejki rozkazowe (rozkazy oczekuj¹ce, rozkazy wykonane, zdarzenia asynchroniczne i pozycje paragonowe) umo¿liwiaj¹ jednoczeœnie du¿¹ swobodê przy tworzeniu aplikacji klienckiej zostawiaj¹c znaczn¹ swobodê wybory sposobu obs³ugi kasy jej twórcy.
Ca³oœæ transmisji obs³ugiwana jest przez dwa niezale¿ne w¹tki, jeden transmisyjny, drugi odbiorczy operuj¹ce na odpowiednich kolejkach rozkazów.
Do obs³ugi zdarzeñ w tym trybie zosta³ przygotowany zestaw funkcji opisany w module Obs³uga zdarzeñ asynchronicznych. Przychodz¹ce zdarzenia asynchroniczne gromadzone s¹ w osobnej kolejce zdarzeñ, w której oczekuj¹ na obs³ugê. Aplikacja g³ówna mo¿e zostac powiadomiona o przyjœciu nowego zdarzenia za pomoc¹:
Aplikacja mo¿e te¿ cyklicznie sprawdzaæ, czy w kolejce znajduj¹ siê nowe zdarzenia asynchroniczne (polling).
W ten sposób w¹tek odbioru danych paragonowych mo¿e wysy³aæ zapytania o pozycje paragonowe w standadowy sposób (do g³ównej kolejki rozkazów). G³ówna kolejka rozkazów do wys³ania mo¿e równolegle otrzymywaæ rozkazy przygotowywane przez ró¿ne w¹tki (jest w pe³ni wielow¹tkowa), serializowaæ je i wysy³ac w kolejnoœci otrzymania do kasy.
Odpowiedzi s¹ natomiast rozdzielane od siebie i trafiaj¹ do dwóch osobnych kolejek odbiorczych. W kolejce pozycji paragonowych umieszczane s¹ wy³¹cznie wyniki wysy³anych rozkazów dotycz¹cych pozycji paragonowych.
Mog¹ to byæ w³asciwe pozycje paragonowe lub informacje o b³êdach wykonania tych rozkazów.
Aby w³¹czyæ tryb modemowy nale¿y ustawiæ parametr urz¹dzenia RS232 POSNET_DEV_PARAM_MODEMMODE na wartoœæ 1. Po wykonaniu tej czynnoœci urz¹dzenie nie bêdzie wykonywa³o zleconych poleceñ do momentu nawi¹zania po³¹czenia modemowego. Urz¹dzenie jest tak¿e gotowe do przyjmowania po³¹czeñ przychodz¹cych. W przypadku pojawienia siê sygna³u RING na modemie zostanie automatycznie odebrana rozmowa.
UWAGA: W trybie odbioru rozmowy nie ma mo¿liwoœci ustawienia modemu ci¹giem inicjuj¹cym bezpoœrednio (tryb zaczyna siê pasywnie) – mo¿na to jednak zrobiæ za poœrednictwem polecenia dzwonienia bez ustawiania numeru telefonu (polecenie to zakoñczy siê b³êdem POSNET_STATUS_MODEM_BADDIAL) ale wyœle do modemu ci¹g inicjuj¹cy.
Dla urz¹dzenia modemowego mo¿na ustawiæ dwa ci¹gi:
Urz¹dzenie modemowe NIGDY samo nie wybiera numeru i nie ponawia przerwanych po³¹czeñ – ta operacja pozostawiona jest w gestii aplikacji zarz¹dzaj¹cej kasami.
Do obs³ugi trybu modemowego s³u¿¹ nastêpuj¹ce funkcje
Przyk³ad u¿ycia – patrz demo demo_modem.exe.
// Deklaracje zmiennych POSNET_HANDLE hDevice; POSNET_HANDLE hGlobalDevice; POSNET_HANDLE hRequest; // Wyniki unsigned char kontrast; unsigned char podswietlenie; unsigned char tryb; // Utworzenie obiektu urz¹dzenia hGlobalDevice = POS_CreateDeviceHandle(POSNET_INTERFACE_RS232); // Ustawienie parametrów urz¹dzenia POS_SetDeviceParam(hGlobalDevice, POSNET_DEV_PARAM_COMSETTINGS,"COM1,19200,8,N,1,H"); // Otwarcie urz¹dzenia hDevice = POS_OpenDevice(hGlobalDevice); // Przygotowanie polecenia // Numer polecenia DSPPARAMGET = 101 hRequest = POS_CreateRequest(hDevice,POSNET_CMDID_DSPPARAMGET); // Przygotowanie parametrów polecenia // Pobierz dane dla wyœwietlacza operatora // Wymagany 1 paramter typu 'B' o wartoœci 0 POS_PushRequestParamByte(hRequest,0); // Wyœlij rozkaz do kasy w trybie interaktywnym POS_PostRequest(hRequest,POSNET_REQMODE_IMMEDIATE); // Oczekuj na wykonanie POS_WaitForRequestCompleted(hRequest,INFINITE); // SprawdŸ czy zakoñczy³o siê sukcesem if (POS_GetRequestStatus(hRequest) == POSNET_STATUS_OK) { // Pobranie wyników, polecenie zwraca 3 wartoœci typu byte unsigned char kontrast,podswietlenie,tryb; POS_PopResponseValueByte(hRequest,&kontrast); POS_PopResponseValueByte(hRequest,&podswietlenie); POS_PopResponseValueByte(hRequest,&tryb); } // Usuñ stworzone zapytanie POS_DestroyRequest(hRequest); // Zamknij urz¹dzenie POS_CloseDevice(hDevice);
Poni¿ej przedstawiono przyk³adowy kod dla VBA.
Private Declare Function POS_PopSalesQueue Lib "posnet.dll" (ByVal H As Long, ByVal P As Long) As Long
Podobny kod dla Delphi 7
function POS_PopSalesQueue (hDevice : THandle; k: longint) : THandle; stdcall; external 'posnet.dll'
libposnet.so.1.0
libhlapi.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 kasy 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 kas¹ 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.