上上篇:TGAM开发手册翻译
上一篇:神念科技TGAM模块组装测试
将TGAM模块与蓝牙模块组装好,并测试可以从蓝牙或者串口接收数据,然后就是本文的重点:MindViewer,用于将接收到的数据解析并绘制折线图。
本文所涉及的所有关键词和概念等等都在前两篇文章中。
注意:TGAM的数据为大端,一般的Intel CPU为小端
图片来自:https://www.cnblogs.com/jiangyongyawen/p/4238160.html
原始数据
TGAM芯片每秒钟会通过蓝牙发送513包数据,其中有512包的原始数据包和一个包含EEG数据的大包。
512个数据包为:
AA AA 04 80 02 high low checksum
AA AA
通用的包头
接下来的04
表示在最后一位(即校验值)之前有四个字节的数据
接下来的80 02
,80为表示原始数据,02表示原始数据有两个字节
high low两个字节组成了原始数据,计算方法根据官方的手册为:
short raw = (Value[0]<<8) | Value[1];
其中Value[0]是高阶字节,Value[1]是低阶字节。
而最后一位是校验位,将04(不包括)后面和校验值前面的数据加起来进行处理
checksum &= 0xFF;
checksum = ~checksum & 0xFF;
如果值和校验值一样就是有效数据,否则就丢弃。
EEG数据包
此数据包包括两部分,一部分是EEG数据,另一部分是其他数据(冥想值、注意力、眨眼强度、信号强度等等),有可能不同时出现,也有可能只出现一部分。顺序也不一定
典型数据包如下(官方说明文档里面的):
byte: value // Explanation
[ 0]: 0xAA // [SYNC]
[ 1]: 0xAA // [SYNC]
[ 2]: 0x08 // [PLENGTH] (payload length) of 8 bytes
[ 3]: 0x02 // [CODE] POOR_SIGNAL Quality
[ 4]: 0x20 // Some poor signal detected (32/255)
[ 5]: 0x01 // [CODE] BATTERY Level
[ 6]: 0x7E // Almost full 3V of battery (126/127)
[ 7]: 0x04 // [CODE] ATTENTION eSense
[ 8]: 0x12 // eSense Attention level of 18%
[ 9]: 0x05 // [CODE] MEDITATION eSense
[10]: 0x60 // eSense Meditation level of 96%
[11]: 0xE3 // [CHKSUM] (1's comp inverse of 8-bit Payload sum of 0x1C)
会有一种可能
AA 同步
AA 同步
20 是十进制的32,即有32个字节的payload,除掉20本身+两个AA同步+最后校验和
02 代表信号值Signal
C8 信号的值
83 代表EEG Power开始了
18 是十进制的24,说明EEG Power是由24个字节组成的,以下每三个字节为一组
18 Delta 1/3
D4 Delta 2/3
8B Delta 3/3
13 Theta 1/3
D1 Theta 2/3
69 Theta 3/3
02 LowAlpha 1/3
58 LowAlpha 2/3
C1 LowAlpha 3/3
17 HighAlpha 1/3
3B HighAlpha 2/3
DC HighAlpha 3/3
02 LowBeta 1/3
50 LowBeta 2/3
00 LowBeta 3/3
03 HighBeta 1/3
CB HighBeta 2/3
9D HighBeta 3/3
03 LowGamma 1/3
6D LowGamma 2/3
3B LowGamma 3/3
03 MiddleGamma 1/3
7E MiddleGamma 2/3
89 MiddleGamma 3/3
04 代表专注度Attention
00 Attention的值(0到100之间)
05 代表放松度Meditation
00 Meditation的值(0到100之间)
D5 校验和
其他的好理解,EEG数据由三个字节,每个字节八位,结果计算:
delta=(payload[i]<<16) | (payload[(i+1)]<<8) | (payload[(i+2)])
得到一个有符号整数(signed int),可以看出有效值为三个字节(-2^{24}至2^{24}-1)。
官方文档中说明:一个包最小四个字节,最大179个字节。
整理一下:
名称 | 范围 |
---|---|
attention | 0-100 |
meditation | 0-100 |
8个EEG数据 | $-2^{24}至2^{24}-1$ |
signal | 0-200 |
power | 0-128 3v |
16位raw value | -32768~32767 |
blink | 1-255 |
走神程度 | 0-10 |
根据值范围,我将8个EEG数据和原始数据放在一张图像上,其余的值在255以内放在一张图像上。
这些值没有单位,只有多个值一起比较时才有意义。
使用Qt作为界面,qwt来绘制折线图。
数据包解析部分(参考官方提供的实例代码):
int MainWindow::parserData(QByteArray ba, bool &raw, short &rawValue, bool &eeg, struct _eegPkt &pkt)
{
//qDebug()<<"Parsering data";
raw=false;
eeg=false;
if(ba.isEmpty()) return -1;
int size=ba.size();
if(size>179) return -1;//官方说明最多179个字节
int i=0;
uchar state=PARSER_STATE_SYNC;
uchar payloadLength;
uchar payloadSum;
while(i170){
state=PARSER_STATE_SYNC;
return -3;
}else if(payloadLength==170){
return -4;
}else{
payloadSum=0;
//qDebug()<<"parser payload length "<textHex->appendPlainText(QString::number((uchar)ba[z],16));
break;
case PARSER_STATE_NULL:
break;
default:
break;
}
}
//qDebug()<<"all data has been parsered";
return 0;
}
绘图效果:
可以选择只显示某个值折线,也可以全部显示。
软件源码:Github
软件操作视频:神念科技TGAM模块数据采集解析并显示效果
赞赏微信赞赏
支付宝赞赏