Some classes and macros to enable quick single line trace and watch facilities. Three macros DBUG_INIT, TRACE & WATCH are used to implement all functions. DBUG_INIT is used to allocate the maximum number of watch items that are to be displayed at any time. The remainder of the VT100 emulation screen will be dedicated to the scrolling trace function. The use of macros means that they will be ignored by the compiler when the debug declaration is removed. To assist in formatting the string output I have implemented a caret field that is interpreted as a screen attribute eg ^R reverse video on ^r reverse video off. Look at the VT100 class for further details. This was completed for a rush project about 10 minutes ago so expect a few issues to become apparent.

Dependencies:   mbed

Committer:
ChrisHatfield
Date:
Mon Jan 04 23:25:20 2010 +0000
Revision:
0:0c4137d26c2e

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChrisHatfield 0:0c4137d26c2e 1 #include "VT100.h"
ChrisHatfield 0:0c4137d26c2e 2 #include "DBug.h"
ChrisHatfield 0:0c4137d26c2e 3
ChrisHatfield 0:0c4137d26c2e 4 CDBug::CDBug()
ChrisHatfield 0:0c4137d26c2e 5 : m_nWatches(0)
ChrisHatfield 0:0c4137d26c2e 6 , m_nScrollLimit(CVT100::Rows)
ChrisHatfield 0:0c4137d26c2e 7 , m_nNextWatch(0)
ChrisHatfield 0:0c4137d26c2e 8 {
ChrisHatfield 0:0c4137d26c2e 9 }
ChrisHatfield 0:0c4137d26c2e 10
ChrisHatfield 0:0c4137d26c2e 11 CDBug::~CDBug(void)
ChrisHatfield 0:0c4137d26c2e 12 {
ChrisHatfield 0:0c4137d26c2e 13 }
ChrisHatfield 0:0c4137d26c2e 14
ChrisHatfield 0:0c4137d26c2e 15 void CDBug::Init(unsigned char nWatches)
ChrisHatfield 0:0c4137d26c2e 16 {
ChrisHatfield 0:0c4137d26c2e 17 m_nWatches = nWatches > CVT100::Rows * 2 ? CVT100::Rows * 2 : nWatches;
ChrisHatfield 0:0c4137d26c2e 18 m_nScrollLimit = CVT100::Rows - ((m_nWatches + 1) / 2) - 1;
ChrisHatfield 0:0c4137d26c2e 19 m_VT100.ClearScreen();
ChrisHatfield 0:0c4137d26c2e 20 m_VT100.CursorOff();
ChrisHatfield 0:0c4137d26c2e 21 m_VT100.printf(0, 0, "^_^RTRACE OUTPUT...^r");
ChrisHatfield 0:0c4137d26c2e 22 m_VT100.printf(0, m_nScrollLimit + 1, "^RWATCHES...^r");
ChrisHatfield 0:0c4137d26c2e 23 m_VT100.SetScroll(2, m_nScrollLimit);
ChrisHatfield 0:0c4137d26c2e 24 m_VT100.MoveXY(0, 2);
ChrisHatfield 0:0c4137d26c2e 25 }
ChrisHatfield 0:0c4137d26c2e 26 //
ChrisHatfield 0:0c4137d26c2e 27 void CDBug::Trace(char *lpszFormat, ...)
ChrisHatfield 0:0c4137d26c2e 28 {
ChrisHatfield 0:0c4137d26c2e 29 va_list args;
ChrisHatfield 0:0c4137d26c2e 30 va_start(args, lpszFormat);
ChrisHatfield 0:0c4137d26c2e 31 m_VT100.vprintf(lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 32 va_end(args);
ChrisHatfield 0:0c4137d26c2e 33 }
ChrisHatfield 0:0c4137d26c2e 34
ChrisHatfield 0:0c4137d26c2e 35 void CDBug::Watch(unsigned char &hHandle, const char *lpszFormat, ...)
ChrisHatfield 0:0c4137d26c2e 36 {
ChrisHatfield 0:0c4137d26c2e 37 if (!hHandle && (m_nNextWatch <= m_nWatches))
ChrisHatfield 0:0c4137d26c2e 38 {
ChrisHatfield 0:0c4137d26c2e 39 hHandle = ++m_nNextWatch;
ChrisHatfield 0:0c4137d26c2e 40 }
ChrisHatfield 0:0c4137d26c2e 41 if (hHandle)
ChrisHatfield 0:0c4137d26c2e 42 {
ChrisHatfield 0:0c4137d26c2e 43 va_list args;
ChrisHatfield 0:0c4137d26c2e 44 va_start(args, lpszFormat);
ChrisHatfield 0:0c4137d26c2e 45 m_VT100.vprintf(hHandle & 1 ? 0 : CVT100::Columns / 2, m_nScrollLimit + 2 + ((hHandle - 1) / 2), lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 46 va_end(args);
ChrisHatfield 0:0c4137d26c2e 47 }
ChrisHatfield 0:0c4137d26c2e 48 }