当前位置:网站首页>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 "";
}
边栏推荐
- Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 -下
- Design and exploration of Baidu comment Center
- Cerebral cortex: directed brain connection recognition widespread functional network abnormalities in Parkinson's disease
- 分布式数据库下子查询和 Join 等复杂 SQL 如何实现?
- 如何正确的评测视频画质
- Tdengine already supports the industrial Intel edge insight package
- Develop and implement movie recommendation applet based on wechat cloud
- 【OpenCV 例程200篇】219. 添加数字水印(盲水印)
- Windows uses commands to run kotlin
- [200 opencv routines] 219 Add digital watermark (blind watermark)
猜你喜欢
Apache DolphinScheduler 系统架构设计
TDengine ×英特尔边缘洞见软件包 加速传统行业的数字化转型
宝塔面板MySQL无法启动
Node red series (29): use slider and chart nodes to realize double broken line time series diagram
Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
[technical live broadcast] how to rewrite tdengine code from 0 to 1 with vscode
程序员如何活成自己喜欢的模样?
Tongweb set gzip
TDengine可通过数据同步工具 DataX读写
Wechat applet - simple diet recommendation (2)
随机推荐
Jupiter notebook shortcut key
Getting started with Apache dolphin scheduler (one article is enough)
Six simple cases of QT
Understand the window query function of tdengine in one article
Cerebral Cortex:有向脑连接识别帕金森病中广泛存在的功能网络异常
MySQL数字类型学习笔记
Unity粒子特效系列-毒液喷射预制体做好了,unitypackage包直接用 - 上
tongweb设置gzip
Kotlin compose multiple item scrolling
Kotlin Compose 多个条目滚动
Unity particle special effects series - the poison spray preform is ready, and the unitypackage package can be used directly - next
From "chemist" to developer, from Oracle to tdengine, two important choices in my life
解决Navicat激活、注册时候出现No All Pattern Found的问题
RMS to EAP is simply implemented through mqtt
To bring Euler's innovation to the world, SUSE should be the guide
Mobile heterogeneous computing technology GPU OpenCL programming (Advanced)
Matrix processing practice
让AI替企业做复杂决策真的靠谱吗?参与直播,斯坦福博士来分享他的选择|量子位·视点...
How do enterprises choose the appropriate three-level distribution system?
RMS TO EAP通过MQTT简单实现