#ifndef DIO_APP_H
#define DIO_APP_H

// IOCTLs
#define DIO_IOCTL_INPUT 					0x00
#define DIO_IOCTL_OUTPUT 					0x01
#define DIO_IOCTL_HIGH						0x02
#define DIO_IOCTL_LOW						0x03
#define DIO_IOCTL_ERR_LINE_MASKED			0x04

#define DIO_IOCTL_CAPABLE_INPUTS		0x100
#define DIO_IOCTL_CAPABLE_OUTPUTS		0x101
#define DIO_IOCTL_GET_DRIVER_MASK			0x102
#define DIO_IOCTL_SET_DRIVER_MASK			0x103
#define DIO_IOCTL_GET_DIRECTION				0x104
#define DIO_IOCTL_SET_DIRECTION				0x105

#define DIO_IOCTL_CAPABLE_INT				0x110
#define DIO_IOCTL_CAPABLE_WAKEUP_INT		0x111
#define DIO_IOCTL_GET_INT					0x112
#define DIO_IOCTL_ENABLE_INT				0x113
#define DIO_IOCTL_DISABLE_INT				0x114


typedef struct DIO_INT_T {
	DWORD IntMask;
	DWORD TriggerMode;
} DIO_INT;

#define DIO_TRIGGER_RISING					0x01
#define DIO_TRIGGER_FALLING					0x02
#define DIO_TRIGGER_WAKEUP_RISING			0x04
#define DIO_TRIGGER_WAKEUP_FALLING			0x08
#define DIO_TRIGGER_DISABLED				0x00

// DIO register size in bits
#define DIO_NUM_BITS	32
// DIO register size in bytes
#define DIO_SIZE		4

// DIO register definitions
#define DIO_0			(1 << 0)
#define DIO_1			(1 << 1)
#define DIO_2			(1 << 2)
#define DIO_3			(1 << 3)
#define DIO_4			(1 << 4)
#define DIO_5			(1 << 5)
#define DIO_6			(1 << 6)
#define DIO_7			(1 << 7)
#define DIO_8			(1 << 8)
#define DIO_9			(1 << 9)
#define DIO_10			(1 << 10)
#define DIO_11			(1 << 11)
#define DIO_12			(1 << 12)
#define DIO_13			(1 << 13)
#define DIO_14			(1 << 14)
#define DIO_15			(1 << 15)
#define DIO_16			(1 << 16)
#define DIO_17			(1 << 17)
#define DIO_18			(1 << 18)
#define DIO_19			(1 << 19)
#define DIO_20			(1 << 20)
#define DIO_21			(1 << 21)
#define DIO_22			(1 << 22)
#define DIO_23			(1 << 23)
#define DIO_24			(1 << 24)
#define DIO_25			(1 << 25)
#define DIO_26			(1 << 26)
#define DIO_27			(1 << 27)
#define DIO_28			(1 << 28)
#define DIO_29			(1 << 29)
#define DIO_30			(1 << 30)
#define DIO_31			(1 << 31)

#define DIO_LINE_UNUSED	0			

#endif // DIO_APP_H
