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 <stdio.h>
ChrisHatfield 0:0c4137d26c2e 2 #include "mbed.h"
ChrisHatfield 0:0c4137d26c2e 3 #include "VT100.h"
ChrisHatfield 0:0c4137d26c2e 4
ChrisHatfield 0:0c4137d26c2e 5 CVT100::CVT100(void)
ChrisHatfield 0:0c4137d26c2e 6 : m_pVT100(NULL)
ChrisHatfield 0:0c4137d26c2e 7 {
ChrisHatfield 0:0c4137d26c2e 8 m_pVT100 = new Serial(USBTX, USBRX);
ChrisHatfield 0:0c4137d26c2e 9 }
ChrisHatfield 0:0c4137d26c2e 10
ChrisHatfield 0:0c4137d26c2e 11 CVT100::~CVT100(void)
ChrisHatfield 0:0c4137d26c2e 12 {
ChrisHatfield 0:0c4137d26c2e 13 delete m_pVT100;
ChrisHatfield 0:0c4137d26c2e 14 }
ChrisHatfield 0:0c4137d26c2e 15
ChrisHatfield 0:0c4137d26c2e 16 void CVT100::printf(const char *lpszFormat, ...)
ChrisHatfield 0:0c4137d26c2e 17 {
ChrisHatfield 0:0c4137d26c2e 18 char szBuffer[256];
ChrisHatfield 0:0c4137d26c2e 19 va_list args;
ChrisHatfield 0:0c4137d26c2e 20 va_start(args, lpszFormat);
ChrisHatfield 0:0c4137d26c2e 21 vsprintf(szBuffer, lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 22 va_end(args);
ChrisHatfield 0:0c4137d26c2e 23 PutString(FormatString(szBuffer));
ChrisHatfield 0:0c4137d26c2e 24 }
ChrisHatfield 0:0c4137d26c2e 25
ChrisHatfield 0:0c4137d26c2e 26 void CVT100::vprintf(const char *lpszFormat, va_list args)
ChrisHatfield 0:0c4137d26c2e 27 {
ChrisHatfield 0:0c4137d26c2e 28 char szBuffer[256];
ChrisHatfield 0:0c4137d26c2e 29 vsprintf(szBuffer, lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 30 printf(szBuffer);
ChrisHatfield 0:0c4137d26c2e 31 }
ChrisHatfield 0:0c4137d26c2e 32
ChrisHatfield 0:0c4137d26c2e 33 void CVT100::printf(unsigned char nCol, unsigned char nRow, const char *lpszFormat, ...)
ChrisHatfield 0:0c4137d26c2e 34 {
ChrisHatfield 0:0c4137d26c2e 35 char szBuffer[256];
ChrisHatfield 0:0c4137d26c2e 36 SaveCursor();
ChrisHatfield 0:0c4137d26c2e 37 MoveXY(nCol, nRow);
ChrisHatfield 0:0c4137d26c2e 38 va_list args;
ChrisHatfield 0:0c4137d26c2e 39 va_start(args, lpszFormat);
ChrisHatfield 0:0c4137d26c2e 40 vsprintf(szBuffer, lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 41 va_end(args);
ChrisHatfield 0:0c4137d26c2e 42 printf(szBuffer);
ChrisHatfield 0:0c4137d26c2e 43 RestoreCursor();
ChrisHatfield 0:0c4137d26c2e 44 }
ChrisHatfield 0:0c4137d26c2e 45
ChrisHatfield 0:0c4137d26c2e 46 void CVT100::vprintf(unsigned char nCol, unsigned char nRow, const char *lpszFormat, va_list args)
ChrisHatfield 0:0c4137d26c2e 47 {
ChrisHatfield 0:0c4137d26c2e 48 char szBuffer[256];
ChrisHatfield 0:0c4137d26c2e 49 vsprintf(szBuffer, lpszFormat, args);
ChrisHatfield 0:0c4137d26c2e 50 printf(nCol, nRow, szBuffer);
ChrisHatfield 0:0c4137d26c2e 51 }
ChrisHatfield 0:0c4137d26c2e 52
ChrisHatfield 0:0c4137d26c2e 53 void CVT100::ClearScreen(void)
ChrisHatfield 0:0c4137d26c2e 54 {
ChrisHatfield 0:0c4137d26c2e 55 PutString("\x1b[2J\x1b[0m");
ChrisHatfield 0:0c4137d26c2e 56 }
ChrisHatfield 0:0c4137d26c2e 57
ChrisHatfield 0:0c4137d26c2e 58 void CVT100::MoveXY(unsigned char nCol, unsigned char nRow)
ChrisHatfield 0:0c4137d26c2e 59 {
ChrisHatfield 0:0c4137d26c2e 60 char szBuffer[32];
ChrisHatfield 0:0c4137d26c2e 61 sprintf(szBuffer, "\x1b[%d;%dH", nRow, nCol);
ChrisHatfield 0:0c4137d26c2e 62 PutString(szBuffer);
ChrisHatfield 0:0c4137d26c2e 63 }
ChrisHatfield 0:0c4137d26c2e 64
ChrisHatfield 0:0c4137d26c2e 65 void CVT100::SetScroll(unsigned char nStart, unsigned char nEnd)
ChrisHatfield 0:0c4137d26c2e 66 {
ChrisHatfield 0:0c4137d26c2e 67 char szBuffer[32];
ChrisHatfield 0:0c4137d26c2e 68 sprintf(szBuffer, "\x1b[%d;%dr", nStart, nEnd);
ChrisHatfield 0:0c4137d26c2e 69 PutString(szBuffer);
ChrisHatfield 0:0c4137d26c2e 70 }
ChrisHatfield 0:0c4137d26c2e 71
ChrisHatfield 0:0c4137d26c2e 72 void CVT100::SaveCursor(void)
ChrisHatfield 0:0c4137d26c2e 73 {
ChrisHatfield 0:0c4137d26c2e 74 PutString("\x1b""7");
ChrisHatfield 0:0c4137d26c2e 75 }
ChrisHatfield 0:0c4137d26c2e 76
ChrisHatfield 0:0c4137d26c2e 77 void CVT100::RestoreCursor(void)
ChrisHatfield 0:0c4137d26c2e 78 {
ChrisHatfield 0:0c4137d26c2e 79 PutString("\x1b""8");
ChrisHatfield 0:0c4137d26c2e 80 }
ChrisHatfield 0:0c4137d26c2e 81
ChrisHatfield 0:0c4137d26c2e 82 char* CVT100::FormatString(const char *lpszFormat)
ChrisHatfield 0:0c4137d26c2e 83 {
ChrisHatfield 0:0c4137d26c2e 84 static char buffer[4096];
ChrisHatfield 0:0c4137d26c2e 85 static char copy[4096];
ChrisHatfield 0:0c4137d26c2e 86
ChrisHatfield 0:0c4137d26c2e 87 strcpy(copy, lpszFormat); // Store Copies
ChrisHatfield 0:0c4137d26c2e 88 strcpy(buffer, lpszFormat);
ChrisHatfield 0:0c4137d26c2e 89
ChrisHatfield 0:0c4137d26c2e 90 char *p = strstr(copy, "^");
ChrisHatfield 0:0c4137d26c2e 91 while(p) // Is substr in str?
ChrisHatfield 0:0c4137d26c2e 92 {
ChrisHatfield 0:0c4137d26c2e 93 strncpy(buffer, copy, p - copy); // Copy characters
ChrisHatfield 0:0c4137d26c2e 94 switch (p[1])
ChrisHatfield 0:0c4137d26c2e 95 {
ChrisHatfield 0:0c4137d26c2e 96 case 'B': // Bold On
ChrisHatfield 0:0c4137d26c2e 97 sprintf(buffer + (p - copy), "%s%s", "\x1b[1m", p + 2);
ChrisHatfield 0:0c4137d26c2e 98 break;
ChrisHatfield 0:0c4137d26c2e 99 case 'b': // Bold off
ChrisHatfield 0:0c4137d26c2e 100 sprintf(buffer + (p - copy), "%s%s", "\x1b[21m", p + 2);
ChrisHatfield 0:0c4137d26c2e 101 break;
ChrisHatfield 0:0c4137d26c2e 102 case 'F': // Blink On
ChrisHatfield 0:0c4137d26c2e 103 sprintf(buffer + (p - copy), "%s%s", "\x1b[5m", p + 2);
ChrisHatfield 0:0c4137d26c2e 104 break;
ChrisHatfield 0:0c4137d26c2e 105 case 'f': // Blink off
ChrisHatfield 0:0c4137d26c2e 106 sprintf(buffer + (p - copy), "%s%s", "\x1b[25m", p + 2);
ChrisHatfield 0:0c4137d26c2e 107 break;
ChrisHatfield 0:0c4137d26c2e 108 case 'L': // Low Intensity On
ChrisHatfield 0:0c4137d26c2e 109 sprintf(buffer + (p - copy), "%s%s", "\x1b[2m", p + 2);
ChrisHatfield 0:0c4137d26c2e 110 break;
ChrisHatfield 0:0c4137d26c2e 111 case 'l': // Low Intensity off
ChrisHatfield 0:0c4137d26c2e 112 sprintf(buffer + (p - copy), "%s%s", "\x1b[22m", p + 2);
ChrisHatfield 0:0c4137d26c2e 113 break;
ChrisHatfield 0:0c4137d26c2e 114 case 'R': // Reverse Video On
ChrisHatfield 0:0c4137d26c2e 115 sprintf(buffer + (p - copy), "%s%s", "\x1b[7m", p + 2);
ChrisHatfield 0:0c4137d26c2e 116 break;
ChrisHatfield 0:0c4137d26c2e 117 case 'r': // Reverse Video off
ChrisHatfield 0:0c4137d26c2e 118 sprintf(buffer + (p - copy), "%s%s", "\x1b[27m", p + 2);
ChrisHatfield 0:0c4137d26c2e 119 break;
ChrisHatfield 0:0c4137d26c2e 120 case 'U': // Underline On
ChrisHatfield 0:0c4137d26c2e 121 sprintf(buffer + (p - copy), "%s%s", "\x1b[4m", p + 2);
ChrisHatfield 0:0c4137d26c2e 122 break;
ChrisHatfield 0:0c4137d26c2e 123 case 'u': // Underline off
ChrisHatfield 0:0c4137d26c2e 124 sprintf(buffer + (p - copy), "%s%s", "\x1b[24m", p + 2);
ChrisHatfield 0:0c4137d26c2e 125 break;
ChrisHatfield 0:0c4137d26c2e 126 case '_': // All Attributes off
ChrisHatfield 0:0c4137d26c2e 127 sprintf(buffer + (p - copy), "%s%s", "\x1b[0m", p + 2);
ChrisHatfield 0:0c4137d26c2e 128 break;
ChrisHatfield 0:0c4137d26c2e 129 case '^': // Caret Character
ChrisHatfield 0:0c4137d26c2e 130 sprintf(buffer + (p - copy), "%s%s", "^", p + 2);
ChrisHatfield 0:0c4137d26c2e 131 break;
ChrisHatfield 0:0c4137d26c2e 132 default: // Delete the Caret (or Infinite Loop)
ChrisHatfield 0:0c4137d26c2e 133 sprintf(buffer + (p - copy), "%s", p + 2);
ChrisHatfield 0:0c4137d26c2e 134 break;
ChrisHatfield 0:0c4137d26c2e 135 }
ChrisHatfield 0:0c4137d26c2e 136 strcpy(copy, buffer);
ChrisHatfield 0:0c4137d26c2e 137 p = strstr(copy, "^");
ChrisHatfield 0:0c4137d26c2e 138 }
ChrisHatfield 0:0c4137d26c2e 139 return buffer;
ChrisHatfield 0:0c4137d26c2e 140 }
ChrisHatfield 0:0c4137d26c2e 141
ChrisHatfield 0:0c4137d26c2e 142 void CVT100::PutString(const char *lpszOutput)
ChrisHatfield 0:0c4137d26c2e 143 {
ChrisHatfield 0:0c4137d26c2e 144 int i(0);
ChrisHatfield 0:0c4137d26c2e 145 while(lpszOutput[i])
ChrisHatfield 0:0c4137d26c2e 146 m_pVT100->putc(lpszOutput[i++]);
ChrisHatfield 0:0c4137d26c2e 147 }
ChrisHatfield 0:0c4137d26c2e 148
ChrisHatfield 0:0c4137d26c2e 149 void CVT100::CursorOff(bool bOff /*= true*/)
ChrisHatfield 0:0c4137d26c2e 150 {
ChrisHatfield 0:0c4137d26c2e 151 if (bOff)
ChrisHatfield 0:0c4137d26c2e 152 PutString("\x1b[?25l");
ChrisHatfield 0:0c4137d26c2e 153 else
ChrisHatfield 0:0c4137d26c2e 154 PutString("\x1b[?25h");
ChrisHatfield 0:0c4137d26c2e 155 }