/*=========================================================================

	dbg.cpp

	Author:		PKG
	Created: 
	Project:	
	Purpose: 

	Copyright (c) 2000 Climax Development Ltd

===========================================================================*/


/*----------------------------------------------------------------------
	Includes
	-------- */

#include "dbg.h"

#ifdef	DBG_ACTIVE

#ifndef __SYSTEM_VSPRINTF_H__
#include "system\vsprintf.h"
#endif


/*	Std Lib
	------- */

#include <stdio.h>
#include <stdarg.h>
#include <string.h>


/*	Data
	---- */

/*----------------------------------------------------------------------
	Tyepdefs && Defines
	------------------- */

/*
Available options are:
	DBG_OUTPUT_TO_DEBUGGER					Send output to the debug console
	DBG_OUTPUT_TO_LOG						Send output to an internal log
	DBG_MAX_MESSAGE_LENGTH	chars				Length of entries in this log
	DBG_LOG_LINES			lines				Number of lines in the log buffer
	DBG_SHOW_MESSAGE_ORIGIN					Prepend file and linenumber to messages
	DBG_FILENAME_LENGTH		chars				This many chars of the filename are shown
	DBG_DEFAULT_CHANNEL		channelflags	Channels to listen to by default
*/

#ifdef	__USER_charles__
	#define DBG_OUTPUT_TO_DEBUGGER
	#define DBG_SHOW_MESSAGE_ORIGIN
	#define	DBG_FILENAME_LENGTH		16
	#define DBG_DEFAULT_CHANNEL		DC_CHARLES|DC_SYSTEM
#elif	__USER_daveo__
	#define DBG_OUTPUT_TO_DEBUGGER
	#define DBG_SHOW_MESSAGE_ORIGIN
	#define	DBG_FILENAME_LENGTH		16
	#define DBG_DEFAULT_CHANNEL		DC_DAVE|DC_SYSTEM
#elif	__USER_paul__
	#define DBG_OUTPUT_TO_DEBUGGER
	#define DBG_OUTPUT_TO_LOG
	#define	DBG_MAX_MESSAGE_LENGTH	256
	#define DBG_LOG_LINES			8
	#define DBG_SHOW_MESSAGE_ORIGIN
	#define	DBG_FILENAME_LENGTH		12
	#define DBG_DEFAULT_CHANNEL		DC_PAUL|DC_SYSTEM|DC_SOUND|DC_GUI|DC_MEMCARD
#else
	#define DBG_OUTPUT_TO_DEBUGGER
	#define	DBG_FILENAME_LENGTH		16
	#define DBG_DEFAULT_CHANNEL		DC_SYSTEM
#endif



/*----------------------------------------------------------------------
	Structure defintions
	-------------------- */

/*----------------------------------------------------------------------
	Function Prototypes
	------------------- */

/*----------------------------------------------------------------------
	Vars
	---- */

static DEBUG_CHANNEL_FLAG	s_activeChannelFlags=(DEBUG_CHANNEL_FLAG)(DBG_DEFAULT_CHANNEL);

static int					s_dbgTransientChannelFlags=DC_NONE;
static char					s_dbgTransientFilename[DBG_FILENAME_LENGTH+1]="\0";
static int					s_dbgTransientLine=0;

#ifdef DBG_OUTPUT_TO_LOG
static char					s_logLines[DBG_LOG_LINES][DBG_MAX_MESSAGE_LENGTH];
static int					s_logLineCount=0;
static int					s_logLinePtr=0;
#endif


/*----------------------------------------------------------------------
	Function:
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */
void __setActiveDbgChannels(DEBUG_CHANNEL_FLAG _channelFlags)
{
	s_activeChannelFlags=_channelFlags;
}


/*----------------------------------------------------------------------
	Function:
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */
DEBUG_CHANNEL_FLAG __getActiveDbgChannels()
{
	return s_activeChannelFlags;
}


/*----------------------------------------------------------------------
	Function:
	Purpose:	Used by the__DBGMSG() macro
	Params:
	Returns:
  ---------------------------------------------------------------------- */
void __setDbgChannels(DEBUG_CHANNEL_FLAG _channelFlags)
{
	s_dbgTransientChannelFlags=_channelFlags;
}


/*----------------------------------------------------------------------
	Function:
	Purpose:	Used by the__DBGMSG() macro
	Params:
	Returns:
  ---------------------------------------------------------------------- */
void __setDbgFilenameAndLine(const char *_filename,int _line)
{
	int	filenameLength;
	int	start,len;
	filenameLength=strlen(_filename);
	if(filenameLength<DBG_FILENAME_LENGTH)
	{
		for(int i=0;i<DBG_FILENAME_LENGTH-filenameLength;i++)
			s_dbgTransientFilename[i]=' ';
		start=0;
		len=filenameLength;
	}
	else
	{
		start=strlen(_filename)-DBG_FILENAME_LENGTH;
		len=DBG_FILENAME_LENGTH;
	}

	strncpy(s_dbgTransientFilename+DBG_FILENAME_LENGTH-len,_filename+start,len);
	s_dbgTransientLine=_line;
}


/*----------------------------------------------------------------------
	Function:
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */
void __writeDbgMessage(const char *_format,...)
{
	if(s_dbgTransientChannelFlags&s_activeChannelFlags)
	{
		char		messageBuffer[256];
		__va_list	va;
		int			start;//,len;
		
		__va_start(va,_format);
#ifdef DBG_SHOW_MESSAGE_ORIGIN
		sprintf(messageBuffer,"%s:%04d ",s_dbgTransientFilename,s_dbgTransientLine);
		start=strlen(messageBuffer);
//		len=DBG_MAX_MESSAGE_LENGTH-start;
#else
		start=0;
//		len=DBG_MAX_MESSAGE_LENGTH;
#endif
		__vsprintf(messageBuffer+start,_format,va);
		__va_end(va);


#ifdef DBG_OUTPUT_TO_DEBUGGER
		printf("%s\n",messageBuffer);
#endif
#ifdef DBG_OUTPUT_TO_LOG
		strncpy(s_logLines[s_logLinePtr],messageBuffer,DBG_MAX_MESSAGE_LENGTH);
		s_logLinePtr=(s_logLinePtr+1)%DBG_LOG_LINES;
		if(s_logLineCount<DBG_LOG_LINES)s_logLineCount++;
#endif
	}
}


/*----------------------------------------------------------------------
	Function:
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */
int __getNumberOfDbgLinesInLog()
{
#ifdef DBG_OUTPUT_TO_LOG
	return s_logLineCount;
#else
	return 0;
#endif
}


/*----------------------------------------------------------------------
	Function:
	Purpose:
	Params:
	Returns:
  ---------------------------------------------------------------------- */
char *__getDbgLineFromLog(int _line)
{
#ifdef DBG_OUTPUT_TO_LOG
	return s_logLines[(s_logLinePtr+_line)%DBG_LOG_LINES];
#else
	return "Damn fool..";
#endif
}

#endif	/* DBG_ACTIVE */





#ifdef __VERSION_DEBUG__
#define OnScreenDebug
#include "gfx\font.h"
#include 	"system\vid.h"
#include 	"gfx\prim.h"

/*****************************************************************************/
void DoAssert( const char * Txt, const char * file, const int line )
{
	printf( "%s", Txt );

#ifdef	OnScreenDebug

	FontBank	F;
	char		Text[2048];

	ClearScreenImage();

	sprintf( Text, "%s\nLine %d in %s", Txt, line, file );

	F.initialise( &standardFont );
	F.setJustification( FontBank::JUST_CENTRE );
	F.setOt( 0 );

	InitOTag(OtPtr, MAX_OT);
	F.print( (512 >> 1), (256 >> 1), Text );

	VSync(0);
	VidSwapDraw();
//	PrimDisplay();
	DrawOTag(OtPtr);

	while(DrawSync(1));

	InitOTag(OtPtr, MAX_OT);
	F.print( (512 >> 1), (256 >> 1), Text );

	VSync(0);
	VidSwapDraw();
//	PrimDisplay();
	DrawOTag(OtPtr);

	while(DrawSync(1));

	F.dump();

#endif
	PSYQpause();
}

/*****************************************************************************/
void	DbgPollHost()
{
#ifndef __CLIMAX_DEVKIT__
	#if			__FILE_SYSTEM__==PC
		pollhost();
	#endif
#endif
}

#endif	/* __VERSION_DEBUG__ */





/*===========================================================================
 end */