绘图响应查看器用于解析响应数据并绘制图表。

绘图支持多种数据解析方式以实现根据不同的数据格式绘制图表。
当需要解析的数据为二进制字节流时,可以选择字节流解析方式。 该解析方式将收到的每个字节数据都作为 需要进行绘图的数据,解析时,支持通过指定数据类型来解析收到的数据内容。
例如, 假设收到的数据内容如下:
01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10
0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00
当配置数据类型为uint8,频道数量为 1 时,将绘制如下图表:

当配置数据类型为uint16,频道数量为 2 时,将绘制如下图表:

则,当收到 01 02(即十进制258)时,将其作为第一个频道的数据进行绘制,当收到 03 04 时,将其作为第二个频道的数据进行绘制。
当收到 05 06 时,将其作为第一个频道的数据进行绘制,以此类推。
当数据类型为多字节类型时,可以选择大端或小端模式进行解析。
HEX 匹配模式用于匹配二进制数据流中的指定数据内容,并将匹配到的数据内容作为需要进行绘图的数据。
假设收到的数据内容如下:
AA 01 00 02 FF
AA 02 00 03 FF
AA 03 00 04 FF
AA 04 00 05 FF
AA 05 00 06 FF
AA 06 00 07 FF
AA 07 00 08 FF
AA 08 00 09 FF
匹配模板为如下:
AA @U8<NUM1> @U16BE<NUM2> FF
则绘制的图像为:

以第一行数据为例, AA 01 00 02 FF 则匹配到的 NUM1 为 01, NUM2 为 00 02.
关于HEX匹配的详细说明请参考HEX 匹配。
文本解析器用于解析文本数据并绘制图表。 解析文本时,可配置数字分隔符以及分组分割符,从而将文本数据解析为需要渲染的数据。
例如, 将数字分隔符设置为 ,,分组分際符设置为 \n,则解析如下文本:
1,2,3
2,3,4
得到的绘图结果为:

即, 数字分隔符用于分割每个频道的数据, 分组分隔符用于分割每个频道的一组数据。 以上述文本为例,
第一行数据为 1,2,3,则解析为三个频道的数据,每个频道的数据分别为 1,2,3。
需要注意的是, 当数组不足时, 解析器将会一直等待直到数组完整。
以上述配置为例,如果收到的文本为 1,2,3 而缺少末尾的换行分隔符,则解析器认为该数据不完整,
将会一直等待换行符以获取完整的数据。
正则表达式解析器用于解析文本数据并绘制图表。 在数据解析时,所有的匹配都强制从头开始匹配,
即匹配模式默认会在开头加上 ^ 符号。 例如配置匹配模式为 \d+, 则实际的匹配模式为 ^\d+。
解析的频道信息由正则表达式的分组信息决定。 例如,配置匹配模式为 (?<g1>\d+),(?<g2>\d+),(?<g3>\d+),
则解析后的频道信息为 g1,g2,g3。
例如,我们配置匹配模式如下:
lat=(?<lat>[\d\.]+),lon=(?<lon>[\d\.]+),
当我们发送如下文本:
lat=122,lon=34,
lat=22,lon=55,
...
则我们收到的绘图结果为:

JSON 解析器用于解析 JSON 格式的文本数据并绘制图表。 在配置 JSON 解析器时,需要指定 JSON 路径以获取需要绘制的数据。
假设我们收到的 JSON 数据格式如下:
{
"user": {
"age": 12,
"level": 34
}
}
我们需要将 age 和 level 作为两个频道进行绘制, 则我们可以配置 JSON 路径为 user.age 和 user.level。
我们将age 和 level 作为随机数据进行发送, 则我们收到的绘图结果为:

结构体解析器用于解析结构化数据并绘制图标,在使用结构体解析器时,需要当前指令已配置结构体解析模板,否则将会提示无解析模板使用从而无法进行绘图。
假设我们存在结构体模板如下:

如果我们需要将温度数据作为频道进行绘制, 则可配置解析器如下:

则我们发送随机数据,收到的绘图结果为:

脚本解析器用于自定义解析数据并绘制图表。
示例:
/**
* setup script parser
*/
export function setup() {
// 创建频道 CH01
$this.createChannel("CH01");
// 创建频道 CH02
$this.createChannel("CH02");
}
/**
* parse response content;
*/
export function execute() {
// 读取一个字节
let ch01 = $this.readUInt8();
// 将读取的数据推送到频道 CH01
$this.pushValueToChannel("CH01", ch01);
// 再次读取一个字节
let ch02 = $this.readUInt8();
// 将读取的数据推送到频道 CH02
$this.pushValueToChannel("CH02", ch02);
}
在配置完成脚本后,将会执行 setup 方法进行初始化,当收到数据后执行 execute 方法进行解析。
脚本中支持的方法如下:
createChannel 创建频道, 例如:
// 创建频道 CH01
$this.createChannel("CH01");
pushValueToChannel 将数据推送到指定频道, 例如:
// 将数据推送到频道 CH01
$this.pushValueToChannel("CH01", 1);
clearResponseToCursor 清空从头到当前游标位置的数据,对于脚本收到的数据默认情况下不会主动清空,
所以收到的响应内容会持续的增长, 当接收的数据量比较大时,可以通过该方法清空已经处理过的数据,从而节省空间占用,
例如:
// 清空从头到当前游标位置的数据
$this.clearResponseToCursor();
setCursor 设置游标位置, 例如:
// 设置游标位置
$this.setCursor(0);
storeCursor 临时存储游标位置,例如:
// 存储游标位置
$this.storeCursor();
restoreCursor 恢复游标位置,例如:
// 恢复游标位置
$this.restoreCursor();
readUInt8 读取一个字节,并将游标向后移动一个字节,当无数据读取时返回 null, 例如:
// 读取一个字节
let value = $this.readUInt8();
readInt8 读取一个字节,并将游标向后移动一个字节,当无数据读取时返回 null, 例如:
// 读取一个字节
let value = $this.readInt8();
readUInt16LE 读取一个小端序的 16 位整数,并将游标向后移动两个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 16 位整数
let value = $this.readUInt16LE();
readUInt16BE 读取一个大端序的 16 位整数,并将游标向后移动两个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 16 位整数
let value = $this.readUInt16BE();
readInt16LE 读取一个小端序的 16 位整数,并将游标向后移动两个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 16 位整数
let value = $this.readInt16LE();
readInt16BE 读取一个大端序的 16 位整数,并将游标向后移动两个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 16 位整数
let value = $this.readInt16BE();
readUInt32LE 读取一个小端序的 32 位整数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 32 位整数
let value = $this.readUInt32LE();
readUInt32BE 读取一个大端序的 32 位整数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 32 位整数
let value = $this.readUInt32BE();
readInt32LE 读取一个小端序的 32 位整数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 32 位整数
let value = $this.readInt32LE();
readInt32BE 读取一个大端序的 32 位整数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 32 位整数
let value = $this.readInt32BE();
readUInt64LE 读取一个小端序的 64 位整数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 64 位整数
let value = $this.readUInt64LE();
readUInt64BE 读取一个大端序的 64 位整数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 64 位整数
let value = $this.readUInt64BE();
readInt64LE 读取一个小端序的 64 位整数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 64 位整数
let value = $this.readInt64LE();
readInt64BE 读取一个大端序的 64 位整数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 64 位整数
let value = $this.readInt64BE();
readFloatLE 读取一个小端序的 32 位浮点数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 32 位浮点数
let value = $this.readFloatLE();
readFloatBE 读取一个大端序的 32 位浮点数,并将游标向后移动四个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 32 位浮点数
let value = $this.readFloatBE();
readDoubleLE 读取一个小端序的 64 位浮点数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个小端序的 64 位浮点数
let value = $this.readDoubleLE();
readDoubleBE 读取一个大端序的 64 位浮点数,并将游标向后移动八个字节,当无数据读取时返回 null, 例如:
// 读取一个大端序的 64 位浮点数
let value = $this.readDoubleBE();
readString 读取一个字符串,并将游标向后移动指定长度的字节,当无数据读取时返回 null, 例如:
// 读取一个字符串
let value = $this.readString(10);