/**
 *	Frame a string for output to MTT.  Characters not in [0x20, 0x7e]
 *	are converted to blanks (0x20).
 *
 *	@param	p_dest	(out)	pointer to destination buffer
 *	@param	p_src	(in)	pointer to source buffer
 *	@param	buflen	(in)	size of the destination buffer
 *	@return	int		frame length, or -1 on error
 **/
int BCMMTT_FrameString(char *p_dest, const char *p_src, int buflen)
{
	int slen = MTTLOG_StringLen(p_src);
	int n;
	char *pSbuf;
	unsigned long systime;

	if (slen == 0)
		return 0;

	if (slen > buflen - MTTLOG_NumFrameBytes)
		return 0;

	systime = MTTLOG_GetTime();

	pSbuf = p_dest;

	*pSbuf++ = MTTLOG_FrameSync0;
	*pSbuf++ = MTTLOG_FrameSync1;
	if (CpCrashDumpInProgress())
		*pSbuf++ = cp_crash_frame_counter++;
	else
		pSbuf++;
	*pSbuf++ = MTTLOG_MttVersion;

	*pSbuf++ = (systime >> 24);
	*pSbuf++ = (systime >> 16) & 0xff;
	*pSbuf++ = (systime >> 8) & 0xff;
	*pSbuf++ = (systime) & 0xff;

	*pSbuf++ = MTTLOG_MsgTypeASCII >> 8;
	*pSbuf++ = MTTLOG_MsgTypeASCII & 0xFF;

	*pSbuf++ = slen >> 8;
	*pSbuf++ = slen & 0xFF;

	if (CpCrashDumpInProgress()) {
		n = pSbuf - p_dest;
		*pSbuf++ = MTTLOG_Checksum16((unsigned char *)p_dest, n);
	} else
		pSbuf++;

	while (*p_src) {
		/* [0x20 .. 0x7E] is range of 'printable' characters */
		if (*p_src < 0x20 || *p_src > 0x7E) {
			*pSbuf++ = ' ';
			p_src++;
		} else {
			*pSbuf++ = *p_src++;
		}
	}

	n = MTTLOG_Checksum16((unsigned char *)(pSbuf - slen), slen);

	*pSbuf++ = n >> 8;
	*pSbuf++ = n & 0xFF;

	return MTTLOG_NumFrameBytes + slen;
}
/**
 *	Return the MTT frame header required for MTT signal payload of specified size
 *
 *	@param	inPayloadSize (in)	    size of MTT payload to be sent
 *	@param	outFrameHdrBuf (out)    buffer where frame header should be stored
 *                                  (allocated by caller)
 *	@return	int				    size of header written to outFrameHdrBuf or -1 on error
 **/
int BCMMTT_MakeMTTSignalHeader( unsigned short inPayloadSize, unsigned char* outFrameHdrBuf )
{
	unsigned char* pHbuf;
	unsigned short i;
	unsigned long trace_time_stamp;

    
	trace_time_stamp = timer_get_tick_count() / 32;	

	pHbuf = outFrameHdrBuf;

	*pHbuf++ = MTTLOG_FrameSync0;
	*pHbuf++ = MTTLOG_FrameSync1;

	if (CpCrashDumpInProgress())
		*pHbuf++ = cp_crash_frame_counter++;
	else
	pHbuf++;
	*pHbuf++ = MTTLOG_MttVersion;
	*pHbuf++ = trace_time_stamp>>24;
	*pHbuf++ = (trace_time_stamp>>16)&0xFF;
	*pHbuf++ = (trace_time_stamp>>8)&0xFF;
	*pHbuf++ = trace_time_stamp & 0xFF;
	i = MTTLOG_MsgTypeSDL;
	*pHbuf++ = i>>8;
	*pHbuf++ = i & 0xFF;
	*pHbuf++ = inPayloadSize>>8;
	*pHbuf++ = inPayloadSize & 0xFF;
	// done at logging driver to assure sequential increase of 
	if (CpCrashDumpInProgress())
	{
		*pHbuf++ = MTTLOG_Checksum16( outFrameHdrBuf, 12 );
	}
	else
	pHbuf++;

	return (int)(pHbuf - outFrameHdrBuf);
}