当前位置:网站首页>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 "";
}
边栏推荐
- The king of pirated Dall · e? 50000 images per day, crowded hugging face server, and openai ordered to change its name
- 程序员如何活成自己喜欢的模样?
- Generics, generic defects and application scenarios that 90% of people don't understand
- 百度智能小程序巡检调度方案演进之路
- Tdengine already supports the industrial Intel edge insight package
- 从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择
- Understand the window query function of tdengine in one article
- Baidu app's continuous integration practice based on pipeline as code
- Kotlin compose multiple item scrolling
- Observation cloud and tdengine have reached in-depth cooperation to optimize the cloud experience of enterprises
猜你喜欢
Wechat applet - simple diet recommendation (4)
ArcGIS Pro 创建要素
Comment obtenir le temps STW du GC (collecteur d'ordures)?
Wechat applet - simple diet recommendation (3)
如何获取GC(垃圾回收器)的STW(暂停)时间?
Mysql80 service does not start
Data visualization platform based on template configuration
【 conseils 】 obtenir les valeurs des axes X et y de la fonction cdfplot dans MATLAB
cent7安装Oracle数据库报错
Solve liquibase – waiting for changelog lock Cause database deadlock
随机推荐
The most comprehensive promotion strategy: online and offline promotion methods of E-commerce mall
7 月 2 日邀你来TD Hero 线上发布会
Are databases more popular as they get older?
Matrix processing practice
oracle 多行数据合并成一行数据
【技术直播】如何用 VSCode 从 0 到 1 改写 TDengine 代码
Mobile heterogeneous computing technology GPU OpenCL programming (Advanced)
Observation cloud and tdengine have reached in-depth cooperation to optimize the cloud experience of enterprises
Application of data modeling based on wide table
从“化学家”到开发者,从甲骨文到 TDengine,我人生的两次重要抉择
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
分布式数据库下子查询和 Join 等复杂 SQL 如何实现?
Viewpager pageradapter notifydatasetchanged invalid problem
卷起来,突破35岁焦虑,动画演示CPU记录函数调用过程
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
Roll up, break through 35 year old anxiety, and animate the CPU to record the function call process
How to implement complex SQL such as distributed database sub query and join?
Kotlin Compose 与原生 嵌套使用
[NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
Develop and implement movie recommendation applet based on wechat cloud