|
|
/*
* INTERNAL.H * * Point-of-Sale Control Panel Applet * * Author: Ervin Peretz * * (c) 2001 Microsoft Corporation */
#define USE_OVERLAPPED_IO FALSE
typedef struct posDevice { #define POSCPL_SIG 'CsoP'
DWORD sig;
LIST_ENTRY listEntry;
/*
* Device type, identified by dialog * id for the device type * (e.g. IDD_POS_CASHDRAWER_DLG). */ DWORD dialogId;
PHIDP_PREPARSED_DATA hidPreparsedData; HIDD_ATTRIBUTES hidAttrib; HIDP_CAPS hidCapabilities;
HWND hDlg;
HANDLE hThread;
PUCHAR readBuffer; PUCHAR writeBuffer;
HANDLE devHandle; WCHAR pathName[MAX_PATH];
#if USE_OVERLAPPED_IO
OVERLAPPED overlappedReadInfo; NTSTATUS overlappedReadStatus; DWORD overlappedReadLen; HANDLE overlappedReadEvent;
OVERLAPPED overlappedWriteInfo; NTSTATUS overlappedWriteStatus; DWORD overlappedWriteLen; HANDLE overlappedWriteEvent; #endif
} posDevice;
/*
* These are non-standard vendor usage values and codes * used by APG Cash Drawer. */ #define USAGE_PAGE_CASH_DEVICE 0x0F0
#define USAGE_CASH_DRAWER 0x0F1
#define USAGE_CASH_DRAWER_NUMBER 0x0F2
#define USAGE_CASH_DRAWER_SET 0x0F3
#define USAGE_CASH_DRAWER_STATUS 0x0F4
enum cashDrawerStates { DRAWER_STATE_OPEN = 1, DRAWER_STATE_CLOSED_READY = 2, DRAWER_STATE_CLOSED_CHARGING = 3, DRAWER_STATE_LOCKED = 4, };
/*
* List macros -- not defined in winnt.h for some reason. */ #define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead)) #define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead)) #define RemoveHeadList(ListHead) \
(ListHead)->Flink;\ {RemoveEntryList((ListHead)->Flink)} #define RemoveTailList(ListHead) \
(ListHead)->Blink;\ {RemoveEntryList((ListHead)->Blink)} #define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\ PLIST_ENTRY _EX_Flink;\ _EX_Flink = (Entry)->Flink;\ _EX_Blink = (Entry)->Blink;\ _EX_Blink->Flink = _EX_Flink;\ _EX_Flink->Blink = _EX_Blink;\ } #define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\ PLIST_ENTRY _EX_ListHead;\ _EX_ListHead = (ListHead);\ _EX_Blink = _EX_ListHead->Blink;\ (Entry)->Flink = _EX_ListHead;\ (Entry)->Blink = _EX_Blink;\ _EX_Blink->Flink = (Entry);\ _EX_ListHead->Blink = (Entry);\ } #define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\ PLIST_ENTRY _EX_ListHead;\ _EX_ListHead = (ListHead);\ _EX_Flink = _EX_ListHead->Flink;\ (Entry)->Flink = _EX_Flink;\ (Entry)->Blink = _EX_ListHead;\ _EX_Flink->Blink = (Entry);\ _EX_ListHead->Flink = (Entry);\ }
/*
* Function prototypes */ VOID LaunchPOSDialog(HWND hwndCPl); INT_PTR APIENTRY POSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR APIENTRY NullPOSDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); posDevice *NewPOSDevice(DWORD dialogId, HANDLE devHandle, PWCHAR devPath, PHIDP_PREPARSED_DATA pHidPreparsedData, PHIDD_ATTRIBUTES pHidAttrib, HIDP_CAPS *pHidCapabilities); VOID DestroyPOSDevice(posDevice *posDev); VOID EnqueuePOSDevice(posDevice *posDev); VOID DequeuePOSDevice(posDevice *posDev); VOID OpenAllHIDPOSDevices(); VOID IntToWChar(WCHAR *buf, DWORD x); VOID HexToWChar(WCHAR *buf, DWORD x); ULONG WStrNCpy(WCHAR *dest, const WCHAR *src, ULONG maxWChars); ULONG AsciiToWChar(WCHAR *dest, const char *src, ULONG maxChars); posDevice *GetDeviceByHDlg(HWND hDlg); VOID LaunchDeviceInstanceThread(posDevice *posDev); DWORD __stdcall DeviceInstanceThread(void *context); BOOL SetCashDrawerState(posDevice *posDev, enum cashDrawerStates newState); #if USE_OVERLAPPED_IO
VOID CALLBACK OverlappedReadCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped); VOID CALLBACK OverlappedWriteCompletionRoutine(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped); #endif
/*
* Externs */ extern HANDLE g_hInst; extern ULONG numDeviceInstances; extern LIST_ENTRY allPOSDevicesList;
|