当前位置:网站首页>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 "";
}
边栏推荐
- 【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
- Tdengine already supports the industrial Intel edge insight package
- MySQL字符类型学习笔记
- The writing speed is increased by dozens of times, and the application of tdengine in tostar intelligent factory solution
- Android SQLite database encryption
- Implementation of smart home project
- 正式上架!TDengine 插件入驻 Grafana 官网
- 让AI替企业做复杂决策真的靠谱吗?参与直播,斯坦福博士来分享他的选择|量子位·视点...
- H. 265 introduction to coding principles
- Apache DolphinScheduler 入门(一篇就够了)
猜你喜欢

基于单片机步进电机控制器设计(正转反转指示灯挡位)

Roll up, break through 35 year old anxiety, and animate the CPU to record the function call process

The most comprehensive promotion strategy: online and offline promotion methods of E-commerce mall

H. 265 introduction to coding principles

Comment obtenir le temps STW du GC (collecteur d'ordures)?

写入速度提升数十倍,TDengine 在拓斯达智能工厂解决方案上的应用

【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值

Wechat applet - simple diet recommendation (4)

mysql80服务不启动

How Windows bat script automatically executes sqlcipher command
随机推荐
oracle 多行数据合并成一行数据
Implementation of smart home project
Design and exploration of Baidu comment Center
Wechat applet - simple diet recommendation (2)
cent7安装Oracle数据库报错
Mysql80 service does not start
Six simple cases of QT
What should we pay attention to when entering the community e-commerce business?
MySQL数字类型学习笔记
Solve liquibase – waiting for changelog lock Cause database deadlock
剪掉ImageNet 20%数据量,模型性能不下降!Meta斯坦福等提出新方法,用知识蒸馏给数据集瘦身...
小程序启动性能优化实践
Data visualization platform based on template configuration
How to use sqlcipher tool to decrypt encrypted database under Windows system
Tdengine offline upgrade process
天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
Generics, generic defects and application scenarios that 90% of people don't understand
Comment obtenir le temps STW du GC (collecteur d'ordures)?
How to choose the right chain management software?
Cut off 20% of Imagenet data volume, and the performance of the model will not decline! Meta Stanford et al. Proposed a new method, using knowledge distillation to slim down the data set