当前位置:网站首页>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 "";
}
边栏推荐
- Android SQLite database encryption
- Tongweb set gzip
- Comment obtenir le temps STW du GC (collecteur d'ordures)?
- 一文读懂TDengine的窗口查询功能
- The popularity of B2B2C continues to rise. What are the benefits of enterprises doing multi-user mall system?
- 历史上的今天:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生...
- Windows uses commands to run kotlin
- idea用debug调试出现com.intellij.rt.debugger.agent.CaptureAgent,导致无法进行调试
- Design and exploration of Baidu comment Center
- Observation cloud and tdengine have reached in-depth cooperation to optimize the cloud experience of enterprises
猜你喜欢

Node red series (29): use slider and chart nodes to realize double broken line time series diagram

Analysis on the wallet system architecture of Baidu trading platform

Apache DolphinScheduler 系统架构设计

【OpenCV 例程200篇】219. 添加数字水印(盲水印)

ArcGIS Pro creating features

MySQL字符类型学习笔记

To bring Euler's innovation to the world, SUSE should be the guide

Unity particle special effects series - the poison spray preform is ready, and the unitypackage package can be used directly - next

Getting started with Apache dolphin scheduler (one article is enough)
![[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution](/img/f3/782246100bca3517d95869be80d9c5.png)
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
随机推荐
程序员搞开源,读什么书最合适?
为什么不建议你用 MongoDB 这类产品替代时序数据库?
[C language] the use of dynamic memory development "malloc"
How to use sqlcipher tool to decrypt encrypted database under Windows system
From "chemist" to developer, from Oracle to tdengine, two important choices in my life
从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择
tongweb设置gzip
mysql80服务不启动
About getfragmentmanager () and getchildfragmentmanager ()
Is it really reliable for AI to make complex decisions for enterprises? Participate in the live broadcast, Dr. Stanford to share his choice | qubit · viewpoint
程序员如何活成自己喜欢的模样?
如何獲取GC(垃圾回收器)的STW(暫停)時間?
Tianlong Babu TLBB series - questions about skill cooling and the number of attack ranges
Why does everyone want to do e-commerce? How much do you know about the advantages of online shopping malls?
Apache DolphinScheduler 系统架构设计
Openes version query
解决idea调试过程中liquibase – Waiting for changelog lock….导致数据库死锁问题
90%的人都不懂的泛型,泛型的缺陷和应用场景
从“化学家”到开发者,从甲骨文到 TDengine,我人生的两次重要抉择
Comparison of batch merge between Oracle and MySQL