//
//
//
//			POSNET BASE EXAMPLES
//			EXAMPLE QUEUE MODE
//
//

#include <stdlib.h>
#include <string>
#include <iostream>
#include <istream>
#include <limits>
#ifdef WIN32
#include <windows.h>
#else
#define INFINITE 0xFFFFFFFF
#define Sleep(a) {struct timespec tc,tc1;\
                 tc.tv_sec=a/1000; \
		 tc.tv_nsec=(a%1000)*1000*1000; \
		 nanosleep(&tc,&tc1);   \
		 }
						    
#endif
#include "../../include/posnet.h"

using namespace std;



int main(int argc, char *argv[])
{

#ifdef WIN32
	WSADATA WSAData;
	if (WSAStartup (MAKEWORD(2,0), &WSAData) != 0) 
	{
		MessageBox (NULL, TEXT("WSAStartup failed!"), TEXT("Error"), MB_OK);
		return FALSE;
	}

 #endif
 
#include "../setup.inc"

	/*
		UWAGA: W tym przykładzie obsługę błędów zmiejszono do minimum
		dla czytelności pozostałej części kodu - proszę skorzystać z 
		programu demo_all dla zapoznania się z pełniejszą obsługą błędów.
	*/

	POSNET_HANDLE hRequest;
	int cancel=1;


	// ustawienie parametru - czas pomiędzy poszczególnymi automatycznymi zapytaniami o status drukarki
	unsigned long pi=5;
	POS_SetDeviceParam(hDevice,POSNET_DEV_PARAM_STATUSPOLLINGINTERVAL,&pi);
	
	// pobranie statusu drukarki
	long globalStatus,printerStatus;
	POS_GetPrnDeviceStatus(hLocalDevice,1,&globalStatus,&printerStatus);
	printf("Printer status D:%ld, P%ld\n",globalStatus,printerStatus);
	
	// drobne opóźnienie - tylko dla celów demonstracynych
	Sleep(2000);

	// jeśli drukarka nie gotowa, nie wykonujemy polecenia
	if (globalStatus!=0) 
	{
		cancel=0;
	}
	else
	// poniższa pętla jest trikiem umożliwiającym proste obsługiwanie błędów
	// za pośrednictwem instrukcji break - pętla wykonuje się zawsze raz
	do
	{
		// utworzenie obiektu rozkazowego dla rozkazu trinit (początek transakcji)
		hRequest = POS_CreateRequest(hLocalDevice,"trinit");
		// jeśli nie powiodło się przerywamy działanie
		if (!hRequest)
		{
				printf("POS_CreateRequest status: %d",POS_GetError(hLocalDevice));
				break;		
		}
		// dodanie paramtru "bm" o wartości "1" do obiektu rozkazowego
		POS_PushRequestParam(hRequest,"bm","1");
		// wysłanie polecenia w podstawowym trybie SPOOL
		POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
		// oczekiwanie na zakończenie polecenia (5 sekund)
		POS_WaitForRequestCompleted(hRequest,5000);
		// sprawdzenie statusu rozkazu, przerwa w przypadku błędu
		if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) break;
		// likwidacja wykonanego już rozkazu
		POS_DestroyRequest(hRequest);
		// utworzenie obiektu rozkazowego reprezentującego linię paragonu
		// z automatycznym dodaniem niezbędnych dla tej linii parametrów
		hRequest = POS_CreateRequestEx(hLocalDevice,"trline","na,Bułka Standardowa\nvt,0\npr,35");
			
		if (!hRequest)
		{
				printf("POS_CreateRequestEx status: %d",POS_GetError(hLocalDevice));
				break;		
		}
		// analogicznie jak powyżej - wyslanie i oczekiwanie na zakończenie
		POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
		POS_WaitForRequestCompleted(hRequest,5000);
		if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) break;

		POS_DestroyRequest(hRequest);
		// utworzenie obiektu rozkazowego reprezentującego płatność gotówką
		hRequest = POS_CreateRequestEx(hLocalDevice,"trpayment","ty,0\nre,0\nwa,35");
		if (!hRequest)
		{
				printf("POS_CreateRequestEx status: %d",POS_GetError(hLocalDevice));
				break;		
		}
		// analogicznie jak powyżej - wyslanie i oczekiwanie na zakończenie
		POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
		POS_WaitForRequestCompleted(hRequest,5000);
		if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) break;

		POS_DestroyRequest(hRequest);
		// utworzenie obiektu rozkazowego reprezentującego zakończenie transakcji wraz
		// z dodaniem niezbędnych parametrów
		hRequest = POS_CreateRequestEx(hLocalDevice,"trend","to,35\nfp,35");
		// analogicznie jak powyżej - wyslanie i oczekiwanie na zakończenie
		POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
		POS_WaitForRequestCompleted(hRequest,5000);
		if (POS_GetRequestStatus(hRequest) != POSNET_STATUS_OK) break;

		POS_DestroyRequest(hRequest);
		hRequest=NULL;
		// uniemożliwienie wykonania się sekcji obsługi błedów
		cancel=0;
	}
	while (0);
	if (cancel)
	{
		// likwidacja błędnie wykonanej sekwencji
		if (hRequest) POS_DestroyRequest(hRequest);
		// utworzenie obiektu rozkazowego reprezentującego anulowanie bieżącej transakcji
		hRequest = POS_CreateRequest(hLocalDevice,"prncancel");
		// oraz wyslanie go do drukarki
		POS_PostRequest(hRequest,POSNET_REQMODE_SPOOL);
		POS_WaitForRequestCompleted(hRequest,5000);
		POS_DestroyRequest(hRequest);
	}
	// zamknięcie uchwytów urządzeń
	POS_CloseDevice(hLocalDevice);
	POS_DestroyDeviceHandle(hDevice);
	return 0;
}
