当前位置:网站首页>QT VT100 parser

QT VT100 parser

2022-07-05 10:09:00 cppphp

Recently, with Qt Developing a serial port program requires that VT100 To analyze , The current project has been accepted , For the sake of remembering VT100 The decoding part is sorted out , It can also provide a reference for those who need it .

 One 、VT100 Control code 
    VT100 Is a terminal type definition ,VT100  The control code is the code used to expand the display on the terminal . For example, any coordinate on the terminal displays characters in different colors . All controllers are '\033'( octal ) start .

    VT100  The control code is as follows :
       \033[0m               Cancel all previous properties 
       \033[1m               High brightness 
       \033[4m               Underline 
       \033[5m               flashing 
       \033[7m               Reflexion 
       \033[8m               Blanking 
       \033[30m -- \033[37m  Set the foreground 
       \033[40m -- \033[47m  Set background color 
       \033[nA               The cursor moves up  n  That's ok 
       \033[nB               The cursor moves down  n  That's ok 
       \033[nC               The cursor moves right  n  That's ok 
       \033[nD               The cursor moves left  n  That's ok 
       \033[y;xH             Set cursor position 
       \033[2J               Clear the screen 
       \033[K                Clear the contents from the cursor to the end of the line 
       \033[s                Save cursor position 
       \033[u                Restore cursor position 
       \033[?25l             hide cursor 
       \033[?25h             Show cursor      

     Background color range :40----49
            40: black 
            41: Crimson 
            42: green 
            43: yellow 
            44: Blue 
            45: violet 
            46: Dark green 
            47: white 

     Word foreground color range :30----39
            30: black 
            31: red 
            32: green 
            33: yellow 
            34: Blue 
            35: violet 
            36: Dark green 
            37: white 
 Two 、 Program  
// VT100  analysis 
QString comBySocket::backDataConvent(QString read)
{
	const QTextCursor::MoveOperation moCursor[] = {QTextCursor::Up,QTextCursor::Down,QTextCursor::Right,QTextCursor::Left};
	QString subRead = read;
	bool hasTail = false;
	int index = subRead.indexOf("\033[");
	int vtLen = 1;
	int x,y;
	int n;
	QTextCursor tc;
    tc = ui.textEditIn->textCursor();
	while(index>-1 && hasTail==false){
		QString tem;
		if(index>=0){
			ui.textEditIn->insertPlainText(subRead.left(index));
			ui.textEditIn->moveCursor(QTextCursor::EndOfLine);
			subRead = subRead.right(subRead.length()-index-2);
		}
		if(subRead.length()<1){
			hasTail = true;
			break;
		}
		switch(subRead[0].toAscii()){
		case 'K':// Clear the contents from the cursor to the end of the line 
			tc.movePosition(QTextCursor::EndOfLine,QTextCursor::KeepAnchor);
			tc.removeSelectedText();
			vtLen = 1;
			break;
		case 's':// Save cursor position 
			vtLen = 1;
			break;
		case'a':// Restore cursor position 
			vtLen = 1;
			break;
		case'?':
			if(subRead.length()<4)
				hasTail = true;
			else{
				tem = subRead.mid(1,3);
				if(tem=="25l"){// hide cursor 
					ui.textEditIn->setCursor(Qt::BlankCursor);
				}else if(tem=="25h"){// Show cursor 
					ui.textEditIn->setCursor(Qt::ArrowCursor);
				}
				vtLen = 4;
			}
			break;
		default:
			n=1;
			while(subRead.length()>n && subRead[n]>='0' && subRead[n]<='9'){
				n++;
			}
			if(n>=subRead.length()){
				hasTail = true;
			}else{
				y = subRead.mid(0,n).toInt();
				switch(subRead[n].toAscii()){
				case 'm':
					switch(y){
					case 0:// Turn off all properties 
						ui.textEditIn->setFontUnderline(false);
						ui.textEditIn->setTextColor(Qt::black);
						ui.textEditIn->setTextBackgroundColor(Qt::white);
						ui.textEditIn->setCursor(Qt::ArrowCursor);
						vtLen = 2;
						break;
					case 1:// Set to highlight 
						ui.textEditIn->setTextBackgroundColor(textBackColor.lighter(150));
						vtLen = 2;
						break;
					case 4:// Underline 
						ui.textEditIn->setFontUnderline(true);
						vtLen = 2;
						break;
					case 5:// flashing 
						//tc.set
						vtLen = 2;
						break;
					case 7:// Reflexion 
						ui.textEditIn->setTextColor(textBackColor);
						ui.textEditIn->setTextBackgroundColor(textColor);
						vtLen = 2;
						break;
					case 8:// Blanking 
						vtLen = 2;
						break;
					case 30:// Set the foreground   black 
					case 31:// Set the foreground   Red 
					case 32:// Set the foreground   green 
					case 33:// Set the foreground   yellow 
					case 34:// Set the foreground   Blue 
					case 35:// Set the foreground   violet 
					case 36:// Set the foreground   Cyan 
					case 37:// Set the foreground   white 
					case 38:// Set the foreground   white 
					case 39:// Set the foreground   white 
					case 40:// Set background color   black 
					case 41:// Set background color   Red 
					case 42:// Set background color   green 
					case 43:// Set background color   yellow 
					case 44:// Set background color   Blue 
					case 45:// Set background color   violet 
					case 46:// Set background color   Cyan 
					case 47:// Set background color   white 
					case 48:// Set background color   white 
					case 49:// Set background color   white 
						setForntColor(y);
						vtLen = 3;
						break;
					}
					break;
				case 'J':
					if(y==2 && n==1){// Clear the screen 
						inClear();
						vtLen = 2;
					}
					break;
				case 'A':// The cursor moves up  n  That's ok 
				case 'B':// The cursor moves down  n  That's ok 
				case 'C':// The cursor moves right  n  That's ok 
				case 'D':// The cursor moves left  n  That's ok 
					tc.movePosition(moCursor[subRead[0].toAscii()-'A'],QTextCursor::MoveAnchor,y);
					vtLen = n+1;
					break;
				case ';':
					x = n++;
					while(subRead.length()>n && subRead[n]>='0' && subRead[n]<='9'){
						n++;
					}
					if(n>=subRead.length()){
						hasTail = true;
					}else{
						//QString tem = subRead.mid(x+1,n-x-1);
						x = subRead.mid(x+1,n-x-1).toInt();
						vtLen = n+1;
						//QMessageBox::information(NULL,QString::number(y, 10)+","+QString::number(x, 10)+"("+tem+")",subRead, QMessageBox::Ok);
						if(subRead[n]=='H'){// Set cursor position 
							ui.textEditIn->moveCursor(QTextCursor::Start);
							tc.movePosition(QTextCursor::Down,QTextCursor::MoveAnchor,y);
							tc.movePosition(QTextCursor::Right,QTextCursor::MoveAnchor,x);
						}else if(subRead[n]=='m'){
							setForntColor(x);
							setForntColor(y);
						}
					}
					break;
				}
			}
		}
		if(hasTail) break;
		int strlen = subRead.length()-vtLen;
		if(strlen>=0)
			subRead = subRead.right(strlen);
		index = subRead.indexOf("\033[");
	}
	if(hasTail)
		return "\033["+subRead;
	else{
		if(subRead.length()>0){
			if(subRead[subRead.length()-1] == '\033'){
				ui.textEditIn->insertPlainText(subRead.left(subRead.length()-1));
				return "\033";
			}
			ui.textEditIn->insertPlainText(subRead);
			//ui.textEditIn->append(subRead);
		}
	}
	ui.textEditIn->moveCursor(QTextCursor::End);
	return "";
}

 

原网站

版权声明
本文为[cppphp]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140534598268.html