/*++

Copyright (C) Microsoft Corporation, 1993 - 1999

Module Name:

    debug.h

Abstract:

    This module contains debug macros and goodies.

Author:

    Robbie Harris (Hewlett-Packard) 1-July-1998

Environment:

    Kernel mode

Revision History :

--*/
#define DDPnP1(_x_)
#define DD(_x_)
// #define DDPnP1(_x_) DbgPrint _x_

#ifndef _DEBUG_
#define _DEBUG_

#if (1 == DVRH_DELAY_THEORY)
    extern int DVRH_wt;
    extern int DVRH_wb;
    extern int DVRH_rt;
    extern int DVRH_rb;
#endif

typedef struct tagSTRUCTUREOFFSETSTABLE {
	char * pszField;
	unsigned long dwOffset;
} STRUCTUREOFFSETSTABLE, *PSTRUCTUREOFFSETSTABLE;

#if DBG
    // PAR_TEST_HARNESS is used to enable a special mode to bucket
    // writes and siphon reads to a test harness.  This functionality
    // is for debugging purposes only.
    //          0 - off
    //          1 - on
    #define PAR_TEST_HARNESS    0

    // use with ParDebugLevel and ParDump(...)
    #define PARALWAYS             ((ULONG)0xffffffff)   // Set all the bits. So this will always show

    #define PARERRORS             ((ULONG)0x00000001)
    #define PARUNLOAD             ((ULONG)0x00000002)
    #define PARINITDEV            ((ULONG)0x00000004)
    #define PARIRPPATH            ((ULONG)0x00000008)

    #define PARSTARTER            ((ULONG)0x00000010)
    #define PAROPENCLOSE          ((ULONG)0x00000020)
    #define PARREMLOCK            ((ULONG)0x00000040)
    #define PARTHREAD             ((ULONG)0x00000080)

    #define PARIEEE               ((ULONG)0x00000100)
    #define PAREXIT               ((ULONG)0x00000200)
    #define PARENTRY              ((ULONG)0x00000400)
    #define PARENTRY_EXIT         (PARENTRY | PAREXIT)
    #define PARINFO               ((ULONG)0x00000800)

    #define PARECPTRACE           ((ULONG)0x00001000)
    #define PARALLOCFREEPORT      ((ULONG)0x00002000)
    #define PARSELECTDESELECT     ((ULONG)0x00004000) 
    #define PARDOT3DL             ((ULONG)0x00008000)

    #define PARPNP1               ((ULONG)0x00010000) // device object create/kill - major events
    #define PARPNP2               ((ULONG)0x00020000) // device object create/kill - verbose
    #define PARPNP4               ((ULONG)0x00040000)
    #define PARPNP8               ((ULONG)0x00080000)

    #define PARLGZIP              ((ULONG)0x00100000) // Legacy Zip drive
    #define PARRESCAN             ((ULONG)0x00200000) // bus rescan - QUERY_DEVICE_RELATIONS/BusRelations
    #define PARIOCTL1             ((ULONG)0x00400000) // IOCTL related info
    #define PARIOCTL2             ((ULONG)0x00800000) // IOCTL related info

    #define PARDUMP_PNP_PARPORT   ((ULONG)0x01000000) // ParPort PnP interface and device notification callback activity

    #define PARDUMP_PNP_DL        ((ULONG)0x02000000) // 1284.3 DL PnP
    #define PARREG                ((ULONG)0x04000000) // registry operations
    #define PARPOWER              ((ULONG)0x08000000)

    #define PARDUMP_SILENT        ((ULONG)0x00000000)


    #define PARDUMP_VERBOSE       ((ULONG)0x20000000)
    #define PARDUMP_VERBOSE_VERY  ((ULONG)0x40000000)
    #define PARDUMP_VERBOSE_MAX   ((ULONG)0xFFFFFFFF)

    // use with ParBreakOn
    #define PAR_BREAK_ON_NOTHING                   ((ULONG)0x00000000)
    #define PAR_BREAK_ON_DRIVER_ENTRY              ((ULONG)0x00000001)
    #define PAR_BREAK_ON_UNLOAD                    ((ULONG)0x00000002)
    #define PAR_BREAK_ON_ADD_DEVICE                ((ULONG)0x00000004)
    #define PAR_BREAK_ON_DEV_1                     ((ULONG)0x00000100)


    extern ULONG ParDebugLevel;     // How verbose do we want parallel.sys to be with DbgPrint messages?
    extern ULONG ParBreakOn;        // What conditions do we want to break on?
    extern ULONG ParUseAsserts;     // 0 == disable ASSERTs
#endif // DBG

#if DBG
    // DVRH_SHOW_DEBUG_SPEW 0 - Debug Spew is off
    //                      1 - Debug Spew is on
    //  - Note:  The timer spew is not controlled by this
    //           Look at DVRH_SHOW_SHALLOW_TIMER and
    //           DVRH_SHOW_DEEP_TIMER.                
    #define DVRH_SHOW_DEBUG_SPEW   1

    // DVRH_SHOW_SHALLOW_TIMER  0 - Entry Timers off
    //                          1 - Entry Timers on
    #define DVRH_SHOW_SHALLOW_TIMER 0

    // DVRH_SHOW_DEEP_TIMER 0 - Full Timer off
    //                      1 - Full Timer on
    #define DVRH_SHOW_DEEP_TIMER 0

    // DVRH_SHOW_BYTE_LOG   0 - Byte Log off
    //                      1 - Byte Log on
    #define DVRH_SHOW_BYTE_LOG  0

    // DVRH_PAR_LOGFILE is used to allow for debug logging to a file
    //  This functionality is for debugging purposes only.
    //          0 - off
    //          1 - on
    #define DVRH_PAR_LOGFILE    0

    // DVRH_BUS_RESET_ON_ERROR
    //  This functionality is for debugging purposes only.
    // Holds a bus reset for 100us when a handshaking error
    // is discovered.
    //          0 - off
    //          1 - on
    #define DVRH_BUS_RESET_ON_ERROR    0

#else
    #define DVRH_SHOW_DEBUG_SPEW    0
    #define DVRH_SHOW_SHALLOW_TIMER 0
    #define DVRH_SHOW_DEEP_TIMER    0
    #define DVRH_SHOW_BYTE_LOG  0
    #define DVRH_PAR_LOGFILE    0
    #define DVRH_BUS_RESET_ON_ERROR    0
#endif

#if (1 == DVRH_PAR_LOGFILE)
    #define DEFAULT_LOG_FILE_NAME	L"\\??\\C:\\tmp\\parallel.log"

    BOOLEAN DVRH_LogMessage(PCHAR szFormat, ...);
//    BOOLEAN DVRH_LogByteData(BOOLEAN READ,PCHAR szBuff,ULONG dwTransferred);
    #if 1
        #define DVRH_DbgPrint   DVRH_LogMessage
        #define DDF             DVRH_LogMessage
    #else
        // This is put in so I can pinpoint a single debug message
        #define DVRH_DbgPrint
        // #define DVRH_ShallowDbgMsg     DVRH_LogMessage
        #define DVRH_ShallowDbgMsg
    #endif
#else
    #define DVRH_DbgPrint   DbgPrint
    #define DVRH_ShallowDbgMsg
    #define DDF DbgPrint
#endif

#if (DBG && 1 == DVRH_SHOW_DEBUG_SPEW)
    #define ParAssert( ASSERTION )  if(ParUseAsserts) ASSERT( ASSERTION )

    #define ParDump(LEVEL,STRING) \
            if (ParDebugLevel & (LEVEL))  DVRH_DbgPrint STRING

    #define ParDump2(LEVEL,STRING) \
                if (ParDebugLevel & (LEVEL)) { \
                    DVRH_DbgPrint("PARALLEL: "); \
                    DVRH_DbgPrint STRING; \
                } 

        // display if we want PnP info
    #define ParDumpP(STRING) \
                if (ParDebugLevel & PARPNP1) { \
                    DVRH_DbgPrint("PARALLEL: "); \
                    DVRH_DbgPrint STRING; \
                } 

        // display if we want Register info
    #define ParDumpReg(LEVEL,STRING,ECRADDR,DCRADDR,DSRADDR) \
                if (ParDebugLevel & (LEVEL) ) { \
                    DVRH_DbgPrint("PARALLEL: "); \
                    DVRH_DbgPrint STRING; \
            	    DVRH_DbgPrint(" dsr[%02x] dcr[%02x] ecr[%02x]\r\n", \
            	                (int)READ_PORT_UCHAR(DSRADDR),   \
            	                (int)READ_PORT_UCHAR(DCRADDR),   \
            	                (int)READ_PORT_UCHAR(ECRADDR));   \
                } 

        // verbose - display if ANY debug flag is set
    #define ParDumpV(STRING) \
                if (ParDebugLevel & PARDUMP_VERBOSE_MAX) { \
                    DVRH_DbgPrint("PARALLEL: "); \
                    DVRH_DbgPrint STRING; \
                }

    #define ParBreak(BREAK_CONDITION,STRING) \
        if (ParBreakOn & (BREAK_CONDITION)) { \
            DVRH_DbgPrint("PARALLEL: Break: "); \
            DVRH_DbgPrint STRING; \
            DbgBreakPoint(); \
        }
#endif  // (DBG && 1 == DVRH_SHOW_DEBUG_SPEW)

#if (DBG && 1 == DVRH_SHOW_SHALLOW_TIMER)
    #define ParTimerMainCheck(x)    {                                       \
                                        LARGE_INTEGER myTickCount;           \
                                        KeQueryTickCount(&myTickCount);     \
                                        DVRH_DbgPrint("Parallel:Timer: %d,%d,%I64d, ", \
                                                        PsGetCurrentProcessId(),    \
                                                        PsGetCurrentThreadId(),     \
                                                        myTickCount);               \
                                        DVRH_DbgPrint x; \
                                    }
#endif

#if (DBG && 1 == DVRH_SHOW_DEEP_TIMER)
    #define ParTimerCheck(x)    {                                       \
                                    LARGE_INTEGER myTickCount;           \
                                    KeQueryTickCount(&myTickCount);     \
                                    DVRH_DbgPrint("Parallel:Timer: %d,%d,%I64d, ", \
                                                    PsGetCurrentProcessId(),    \
                                                    PsGetCurrentThreadId(),     \
                                                    myTickCount);               \
                                    DVRH_DbgPrint x; \
                                }
#endif


#if (0 == DVRH_SHOW_DEBUG_SPEW)
    #define ParAssert( X )              //lint !e760
    #define ParDump(LEVEL,STRING)       //lint !e760
    #define ParDump2(LEVEL,STRING)      //lint !e760
    #define ParDumpP(STRING)            //lint !e760
    #define ParDumpReg(LEVEL,STRING,ECRADDR,DCRADDR,DSRADDR)    //lint !e760
    #define ParDumpV(STRING)            //lint !e760
    #define ParBreak(LEVEL,STRING)      //lint !e760
#endif // DBG

#if (0 == DVRH_SHOW_SHALLOW_TIMER)
    #define ParTimerMainCheck(x)        //lint !e760
#endif // DBG
#if (0 == DVRH_SHOW_DEEP_TIMER)
    #define ParTimerCheck(x)            //lint !e760
#endif // DBG

#endif