当前位置:网站首页>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 "";
}
边栏推荐
- Understand the window query function of tdengine in one article
- Theme. AppCompat. Light. Darkactionbar not found
- QT timer realizes dynamic display of pictures
- View Slide
- 如何获取GC(垃圾回收器)的STW(暂停)时间?
- 【 conseils 】 obtenir les valeurs des axes X et y de la fonction cdfplot dans MATLAB
- 善用兵者,藏于无形,90 分钟深度讲解最佳推广价值作品
- Node red series (29): use slider and chart nodes to realize double broken line time series diagram
- ThreadLocal source code learning
- Wechat applet - simple diet recommendation (4)
猜你喜欢
idea用debug调试出现com.intellij.rt.debugger.agent.CaptureAgent,导致无法进行调试
oracle 多行数据合并成一行数据
【小技巧】獲取matlab中cdfplot函數的x軸,y軸的數值
Apache dolphin scheduler system architecture design
正式上架!TDengine 插件入驻 Grafana 官网
Node-RED系列(二九):使用slider与chart节点来实现双折线时间序列图
Understand the window query function of tdengine in one article
Analysis on the wallet system architecture of Baidu trading platform
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
Hard core, have you ever seen robots play "escape from the secret room"? (code attached)
随机推荐
Are databases more popular as they get older?
View Slide
TDengine可通过数据同步工具 DataX读写
oracle 多行数据合并成一行数据
[system design] index monitoring and alarm system
【小技巧】获取matlab中cdfplot函数的x轴,y轴的数值
一种用于干式脑电图的高密度256通道电极帽
卷起来,突破35岁焦虑,动画演示CPU记录函数调用过程
正式上架!TDengine 插件入驻 Grafana 官网
RMS TO EAP通过MQTT简单实现
如何正确的评测视频画质
天龙八部TLBB系列 - 单体技能群伤
从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择
Unity particle special effects series - the poison spray preform is ready, and the unitypackage package is directly used - on
90%的人都不懂的泛型,泛型的缺陷和应用场景
解决Navicat激活、注册时候出现No All Pattern Found的问题
百度智能小程序巡检调度方案演进之路
Coordinate system of view
What should we pay attention to when entering the community e-commerce business?
Getting started with Apache dolphin scheduler (one article is enough)