//////////////////////////////////////////////////////////////////////////
//
// AbsoluteRead library
//
// version 1.2.8
//
//////////////////////////////////////////////////////////////////////////

#ifndef __AR__
#define __AR__

//////////////////////////////////////////////////////////////////////////
// EResult
//////////////////////////////////////////////////////////////////////////
enum EResult {
   erOK,                                                                // no error
   //
   erUninitialized,                                                     // library is not initialized - call ARDeviceOpen
   //
   erInvalidFunction,                                                   // function is not valid ATM (e.g. item set call before any item exists)
   erInvalidParameter,                                                  // function do not support that parameter (e.g. setting invalid set item parameter)
   erInvalidParameterType,                                              // function parameter is not in correct type
   //
   erScanError,                                                         // ARDocumentScan error scanning code 
   erCodeError,                                                         // ARDocumentScan error decoding scanned code
   //
   erNoCode,                                                            // calling ARDocumentGet before code is prepared
   //
   erDeviceError,                                                       // error with AR device
   //
   erMissingCodeData,                                                   // data validation - mission data (check debug output for details)
   erInvalidCodeData,                                                   // data validation - invalid data (check debug output for details)
};

//////////////////////////////////////////////////////////////////////////
// EDeviceData
//////////////////////////////////////////////////////////////////////////
enum EDeviceData {
   ddID,
   ddVAT,
   ddSubscriptionStartDate,
   ddSubscriptionEndDate,
   ddOnTime,
};

//////////////////////////////////////////////////////////////////////////
// EARDeviceStatus
//////////////////////////////////////////////////////////////////////////
enum EARDeviceStatus {
   adsDeviceError,
   adsDeviceUninitialized,
   //
   adsUninitialized,
   adsInitialized,
   adsInitializedDemoMode,
   //
   adsSubscriptionExpired,
   adsLocked,
   adsDisabled,
   //
   adsRTCError,
   adsFlashError,
   adsUninitializedError,
   //
   adsUnknownError,
};


//////////////////////////////////////////////////////////////////////////
// EDocumentType
//////////////////////////////////////////////////////////////////////////
enum EDocumentType {
   dtInvalid,
   dtInvoice,                                                           // racun
   dtDeliveryNote,                                                      // dobavnica
   dtOffer,                                                             // ponudba
   dtReceivingSheet,                                                    // prevzemnica
   dtCreditNote,                                                        // dobropis
   dtDebetNote,                                                         // bremepis
   dtReminder,                                                          // opomin
   dtCertificatee,                                                      // potrdilo
   dtPurchaseOrder,                                                     // narocilnica
};

//////////////////////////////////////////////////////////////////////////
// EBankAccountType
//////////////////////////////////////////////////////////////////////////
enum EBankAccountType {
   batInvalid,
   batBankAccount,
   batCreditCard,
   batPayPall,
   batMoneyTransfer,
};

//////////////////////////////////////////////////////////////////////////
// EUnit
//////////////////////////////////////////////////////////////////////////
enum EUnit {
   uInvalid,
   uPiece,
   uMeter,
   uKilogram,
   uSecond,
   uAmpere,
   uKelvin,
   uMole,
   uCandela,
   uLiter,
   uMiliMeter,
   uCentiMeter,
   uKiloMeter,
   uMiliGram,
   uGram,
   uDekaGram,
   uTone,
   uNanoSecond,
   uMiliSecond,
   uMinute,
   uHour,
   uWeek,
   uMonth,
   uYear,
   uPercent,
   uPromile,
   uSquareMeter,
   uCubicMeter,
   uKilogramPerMeter,
   uKilogramPerSquareMeter,
   uRole,
   uFarad,
   uGramPerLiter,
   uGramPerSquareMeter,
   uGray,
   uHenry,
   uHerz,
   uJoule,
   uByte,
   uKiloByte,
   uMegaByte,
   uGigaByte,
   uTeraByte,
   uPaperBox,
   uKiloWatt,
   uKiloWattHour,
   uLumen,
   uLux,
   uMeterPerSecond,
   uNewton,
   uNewtonMeter,
   uPascal,
   uOhm,
   uColoumb,
   uTesla,
   uVolt,
   uWatt,
   uWattHour,
   uWeber,
};

//////////////////////////////////////////////////////////////////////////
// ECurrency (ISO 4217 codes http://en.wikipedia.org/wiki/ISO_4217 )
//////////////////////////////////////////////////////////////////////////
enum ECurrency {
   cInvalid,
   cEUR	                                 = 978,
   cUSD	                                 = 840,
   cGBP	                                 = 826,
   cCHF	                                 = 756,
};

//////////////////////////////////////////////////////////////////////////
// EImageFileType
//////////////////////////////////////////////////////////////////////////
enum EImageFileType {
   iftInvalid,
   //
   iftTGA,
   iftBMP,
   iftPNG,
   //
   iftBMP_1bit,
};

//////////////////////////////////////////////////////////////////////////
// EDocumentData
//////////////////////////////////////////////////////////////////////////
enum EDocumentData {
   ddType,
   ddNumber,
   ddDocumentDate,
   ddServiceDate,
   ddPaymentDue,
   ddReference,
   ddAmount,
   ddInvoiceReference,
   ddCurency,
   ddComment,
   ddItems,
   //
   ddPieces,
   ddWeight,
   //
   ddDiscount,
   ddSuperDiscount,
   //
   ddSpecial1,
   ddSpecial2,
   ddSpecial3,
   ddSpecial4,
   //
   ddInvoiceReferenceType,
   ddInvoiceReferenceDate,
   //
   ddLast,
};

//////////////////////////////////////////////////////////////////////////
// EDocumentCompanyData
//////////////////////////////////////////////////////////////////////////
enum EDocumentCompanyData {
   dcdName,
   //
   dcdStreet,
   dcdCityArea,
   dcdCity,
   dcdCountry,
   dcdPostalCode,
   //
   dcdBusinessUnit,
   dcdBUStreet,
   dcdBUCityArea,
   dcdBUCity,
   dcdBUCountry,
   dcdBUPostalCode,
   //
   dcdTelephone,
   dcdFax,
   dcdEMail,
   dcdWebPage,
   dcdVATId,
   dcdBusinessId,
   //
   dcdBankAccountType1,
   dcdBank1,
   dcdBankAccount1,
   dcdSWIFT1,
   dcdIBAN1,
   //
   dcdBankAccountType2,
   dcdBank2,
   dcdBankAccount2,
   dcdSWIFT2,
   dcdIBAN2,
   //
   dcdBankAccountType3,
   dcdBank3,
   dcdBankAccount3,
   dcdSWIFT3,
   dcdIBAN3,
   //
   dcdBankAccountType4,
   dcdBank4,
   dcdBankAccount4,
   dcdSWIFT4,
   dcdIBAN4,
   //
   dcdReferent,
   dcdSignature,
   //
   dcdComment,
   //
   dcdSpecial1,
   dcdSpecial2,
   dcdSpecial3,
   dcdSpecial4,
   //
   dcdLast,
};

//////////////////////////////////////////////////////////////////////////
// EDocumentItemData
//////////////////////////////////////////////////////////////////////////
enum EDocumentItemData {
   didEAN,
   didName,
   //
   didLevel,
   //
   didPrice,
   didAmount,
   didPacking,
   didUnit,
   didWeight,
   //
   didVAT,
   didDiscount,
   didSuperDiscount,
   //
   didManufactureDate,
   didExpirationDate,
   //
   didSerialNumber,
   didTrackingNumber,
   didVeterinaryNumber,
   //
   didReferenceDocumentType,
   didReferenceDocumentDate,
   didReferenceDocumentName,
   //
   didComment,
   //
   didSpecial1,
   didSpecial2,
   didSpecial3,
   didSpecial4,
   //
   didRecomendedPrice,
   //
   didLast,
};

//////////////////////////////////////////////////////////////////////////
// EDocumentSpecialParameter
//////////////////////////////////////////////////////////////////////////
enum EDocumentSpecialParameter {
   dspItemRounding,                       // number of decimal places the items are rounded to; default=2
   dspAmountRounding,                     // number of decimal places the amount is rounded to; default=2
   dspCheckAmountTolerance,               // check amount tolerance (performed in ARPrepareDocument); default=0.2
   //
   dspLast,
};

typedef void                              (*TDisplayImageCallback)(void *image, int width, int height, int bpp, int type);
typedef void                              (*TDeviceCallback)(int status);

//////////////////////////////////////////////////////////////////////////
//
// AR Device
//
//////////////////////////////////////////////////////////////////////////

const char * __stdcall                    ARGetSDKVersion();

EResult __stdcall                         ARDeviceOpen();
EResult __stdcall                         ARDeviceClose();

EResult __stdcall                         ARSetDebug(const char *filename);

EARDeviceStatus __stdcall                 ARDeviceGetStatus();

EResult __stdcall                         ARDeviceGet(EDeviceData type, const char **data);
EResult __stdcall                         ARDeviceGetSC(EDeviceData type, char *data, int size);
EResult __stdcall                         ARDeviceGetInt(EDeviceData type, int *data);
EResult __stdcall                         ARDeviceGetDate(EDeviceData type, int *year, int *month, int *day);

//////////////////////////////////////////////////////////////////////////
//
// AR Document Create
//
//////////////////////////////////////////////////////////////////////////

EResult __stdcall                         ARDocumentSetSpecialParameter(EDocumentSpecialParameter parameter, double value);
EResult __stdcall                         ARDocumentClear();
EResult __stdcall                         ARDocumentPrepare();
EResult __stdcall                         ARDocumentDone();
//
EResult __stdcall                         ARDocumentGetStats(int *datasize, int *datasizecomp, int *datalastcodeleft);
//
EResult __stdcall                         ARDocumentGetCodeCount(int *num);
EResult __stdcall                         ARDocumentGetCode(int index, void *image, int *width);
//
EResult __stdcall                         ARDocumentSetCSV(const char *data);
//
EResult __stdcall                         ARDocumentSet(EDocumentData type, const char *data);
EResult __stdcall                         ARDocumentSetInt(EDocumentData type, int data);
EResult __stdcall                         ARDocumentSetDouble(EDocumentData type, double data);
EResult __stdcall                         ARDocumentSetDate(EDocumentData type, int year, int month, int day);
//
EResult __stdcall                         ARDocumentSetInvoicee(EDocumentCompanyData type, const char *data);
EResult __stdcall                         ARDocumentSetInvoiceeInt(EDocumentCompanyData type, int data);
//
EResult __stdcall                         ARDocumentSetCustomer(EDocumentCompanyData type, const char *data);
//
EResult __stdcall                         ARDocumentAddItem(); 
EResult __stdcall                         ARDocumentGetItemCount(int *count); 
EResult __stdcall                         ARDocumentSetItemIndex(int index); 
//
EResult __stdcall                         ARDocumentSetItem(EDocumentItemData type, const char *data);
EResult __stdcall                         ARDocumentSetItemInt(EDocumentItemData type, int data);
EResult __stdcall                         ARDocumentSetItemDouble(EDocumentItemData type, double data);
EResult __stdcall                         ARDocumentSetItemDate(EDocumentItemData type, int year, int month, int day);

//////////////////////////////////////////////////////////////////////////
//
// AR Document Scan
//
//////////////////////////////////////////////////////////////////////////

EResult __stdcall                         ARDocumentScan();
EResult __stdcall                         ARDocumentScanThread();
EResult __stdcall                         ARDocumentTest(int idx);
//
EResult __stdcall                         ARDocumentScanSimulate(const char *data);
//
EResult __stdcall                         ARDocumentGetCSV(const char **data);
EResult __stdcall                         ARDocumentSaveCSV(const char *filename);
//
EResult __stdcall                         ARDocumentGet(EDocumentData type, const char **data);
EResult __stdcall                         ARDocumentGetSC(EDocumentData type, char *data, int size);
EResult __stdcall                         ARDocumentGetInt(EDocumentData type, int *data);
EResult __stdcall                         ARDocumentGetDouble(EDocumentData type, double *data);
EResult __stdcall                         ARDocumentGetDate(EDocumentData type, int *year, int *month, int *day);
//
EResult __stdcall                         ARDocumentGetInvoicee(EDocumentCompanyData type, const char **data);
EResult __stdcall                         ARDocumentGetInvoiceeSC(EDocumentCompanyData type, char *data, int size);
EResult __stdcall                         ARDocumentGetInvoiceeInt(EDocumentCompanyData type, int *data);
//
EResult __stdcall                         ARDocumentGetCustomer(EDocumentCompanyData type, const char **data);
EResult __stdcall                         ARDocumentGetCustomerSC(EDocumentCompanyData type, char *data, int size);
//
EResult __stdcall                         ARDocumentGetItem(EDocumentItemData type, const char **data);
EResult __stdcall                         ARDocumentGetItemSC(EDocumentItemData type, char *data, int size);
EResult __stdcall                         ARDocumentGetItemInt(EDocumentItemData type, int *data);
EResult __stdcall                         ARDocumentGetItemDouble(EDocumentItemData type, double *data);
EResult __stdcall                         ARDocumentGetItemDate(EDocumentItemData type, int *year, int *month, int *day);

EResult __stdcall                         ARDocumentSaveCode(int index, const char *filename, EImageFileType filetype);
EResult __stdcall                         ARDocumentSaveCodes(int x, int y, const char *filename, EImageFileType filetype);
EResult __stdcall                         ARDocumentGetBitmap(int index, int *handle);

//////////////////////////////////////////////////////////////////////////
//
// AR Misc
//
//////////////////////////////////////////////////////////////////////////

EResult __stdcall                         ARControlPanel();
EResult __stdcall                         ARControlPanelThread();
//
void __stdcall                            ARSetCallback(TDeviceCallback callback);
void __stdcall                            ARSetCallbackImage(TDisplayImageCallback callback);

#endif

//////////////////////////////////////////////////////////////////////////
//
//
//
//////////////////////////////////////////////////////////////////////////