上上篇: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} −224 至 2 24 − 1 2^{24}-1 224−1 )。

官方文档中说明:一个包最小四个字节,最大179个字节。

整理一下:

名称 范围
attention 0-100
meditation 0-100
8个EEG数据 − 2 24 -2^{24} −224 至 2 24 − 1 2^{24}-1 224−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(i<size-1){switch(state){case PARSER_STATE_SYNC://第一个同步字节if((uchar)ba[i]==PARSER_SYNC_BYTE){//qDebug()<<"parser first aa "<<i<<(uchar)ba[i];state=PARSER_STATE_SYNC_CHECK;}++i;break;case PARSER_STATE_SYNC_CHECK:if((uchar)ba[i]==PARSER_SYNC_BYTE){//qDebug()<<"parser second aa "<<i<<(uchar)ba[i];state=PARSER_STATE_PAYLOAD_LENGTH;//准备解析负载长度}else{state=PARSER_STATE_SYNC;}++i;break;case PARSER_STATE_PAYLOAD_LENGTH:payloadLength=(uchar)ba[i];if(payloadLength>170){state=PARSER_STATE_SYNC;return -3;}else if(payloadLength==170){return -4;}else{payloadSum=0;//qDebug()<<"parser payload length "<<i<<(uchar)ba[i];state=PARSER_STATE_CHKSUM;//准备解析有效数据}++i;break;case PARSER_STATE_CHKSUM:{uchar z=i;//首先校验数据是否有效for(int j=0;j<payloadLength;j++){//qDebug()<<(uchar)ba[z+j];payloadSum+=(uchar)ba[z+j];}payloadSum &= 0xff;payloadSum = ~payloadSum & 0xff;z+=payloadLength;if(payloadSum!=(uchar)ba[z]){//如果与校验值不同就丢弃此包数据return -1;}/*else{qDebug()<<"match";}*///qDebug()<<"get data check sum is: "<<z<<(uchar)ba[z];//qDebug()<<"parser check sum "<<i;state=PARSER_STATE_PAYLOAD;break;}case PARSER_STATE_PAYLOAD://解析数据if((uchar)ba[i]==0x02){//数据信号强度值//qDebug()<<"signal value "<<i<<(uchar)ba[i]<<(uchar)ba[i+1]<<(uint)ba[i+1];eeg=true;pkt.signal=(uchar)ba[i+1];state=PARSER_STATE_PAYLOAD;i+=2;}else if((uchar)ba[i]==0x03){}else if((uchar)ba[i]==0x04){//注意力值//qDebug()<<"attention value "<<i<<(uchar)ba[i+1];eeg=true;pkt.attention=(uchar)ba[i+1];state=PARSER_STATE_PAYLOAD;i+=2;}else if((uchar)ba[i]==0x05){//冥想值//qDebug()<<"meditation value "<<i<<(uchar)ba[i+1];eeg=true;pkt.meditation=(uchar)ba[i+1];state=PARSER_STATE_PAYLOAD;i+=2;//qDebug()<<"current i "<<i<<size;}else if((uchar)ba[i]==0x06){//8bit raw value}else if((uchar)ba[i]==0x07){}else if((uchar)ba[i]==0x80){//16位原始数据//qDebug()<<"parser raw value "<<i;//qDebug()<<"parser a is: "<<(uchar)ba[i+2];//qDebug()<<"parser b is: "<<(uchar)ba[i+3];raw=true;rawValue=((uchar)ba[i+3]<<8)|(uchar)ba[i+2];return 0;}else if((uchar)ba[i]==0x81){}else if((uchar)ba[i]==0x83){//eeg数据部分//0x83标志eeg部分开始,下一位表示为eeg部分程度默认为0x18//qDebug()<<"parser eeg data "<<i<<ba[i];//qDebug()<<"parser eeg length "<<(uchar)ba[i+1];eeg=true;pkt.delta =((uint)ba[i+4]<<16)|((uint)ba[i+3]<<8)|((uint)ba[i+2]);pkt.theta =((uint)ba[i+7]<<16)|((uint)ba[i+6]<<8)|((uint)ba[i+5]);pkt.lowAlpha =((uint)ba[i+10]<<16)|((uint)ba[i+9]<<8)|((uint)ba[i+8]);pkt.highAlpha =((uint)ba[i+13]<<16)|((uint)ba[i+12]<<8)|((uint)ba[i+11]);pkt.lowBeta =((uint)ba[i+16]<<16)|((uint)ba[i+15]<<8)|((uint)ba[i+14]);pkt.highBeta =((uint)ba[i+19]<<16)|((uint)ba[i+18]<<8)|((uint)ba[i+17]);pkt.lowGamma =((uint)ba[i+22]<<16)|((uint)ba[i+21]<<8)|((uint)ba[i+20]);pkt.midGamma =((uint)ba[i+25]<<16)|((uint)ba[i+24]<<8)|((uint)ba[i+23]);state=PARSER_STATE_PAYLOAD;i+=26;//qDebug()<<(uchar)ba[i]<<i;}else if((uchar)ba[i]==0x86){break;}//ui->textHex->appendPlainText(QString::number((uchar)ba[z],16));break;case PARSER_STATE_NULL:break;default:break;}}//qDebug()<<"all data has been parsered";return 0;
}

绘图效果:

可以选择只显示某个值折线,也可以全部显示。

软件源码:MindViewer

软件操作视频:神念科技TGAM模块数据采集解析并显示效果

本文首发于:MindViewer-TGAM模块数据图形化软件

MindViewer-TGAM模块数据图形化软件相关推荐

  1. 【Mysql】免费的mysql图形化软件推荐

    以下是几个推荐的免费MySQL图形化软件: phpMyAdmin:这是一个非常流行的MySQL管理工具,提供了一个基于Web的界面,可以方便地管理和操作MySQL数据库. DBeaver Commun ...

  2. [Mixly图形化软件] YFROBOT产品库

    [Mixly图形化软件] YFROBOT产品库 Mixly(米思齐)是一款图形化编程软件.用户可以通过拼接积木块的方式来编写程序.目前为止,Mixly已经支持Arduino,micropython,p ...

  3. Kibana——数据图形化制作

    Kibana把数据图形化,可以帮助我们更好的去分析数据,找到数据里面的结构 注意看一下,上面缩看的界面,是一个聚合的结果,他是由CPU Usage图表.System Load图表.CPU usage ...

  4. python数据图形化—— matplotlib 基础应用

    matplotlib是python中常用的数据图形化工具,用法跟matlab有点相似.调用简单,功能强大.在Windows下可以通过命令行 pip install matplotlib 来进行安装. ...

  5. python中图形绘制技术的应用_python数据图形化—— matplotlib 基础应用

    matplotlib是python中常用的数据图形化工具,用法跟matlab有点相似.调用简单,功能强大.在Windows下可以通过命令行 pip install matplotlib 来进行安装. ...

  6. 如何使用iperf的图形化软件Jperf,并实现windows和Ubuntu之间的网速检测?

    PS:翻了很多的Blog,调试了很多次,才会用Jperf这个软件在windows和Ubuntu之间测试网速.!应该说是实现了这样的效果吧. 还没踩坑或已经入坑的小伙伴们,请于此脱坑咯 总结下思路: 在 ...

  7. 从短信到纸飞机:数据图形化的有趣例子

    为什么80%的码农都做不了架构师?>>>    很多异地情侣的相处模式都是平时发短信,定期搭飞机与另一半见面.Christian Groß 是波茨坦大学的学生,他和远在异国的女朋友 ...

  8. 【Python模块】图形化编程模块-turtle

    Turtle,也称海龟渲染器,是 Python 内置的图形化模块,它使用 tkinter 实现基本图形界面,因此 当前使用的 Python 环境需要支持 tkinter. Turtle 提供了面向对象 ...

  9. 【开源项目】EasyCmd命令图形化软件

    EasyCmd 项目地址:https://gitee.com/showmework/EasyCmd 最新版本:v0.2预览版 介绍 命令行图形化. 让命令行更易于使用,从命令行复杂的参数及语法中解放出 ...

最新文章

  1. list group by java_Java List集合实现MySQL Group By功能
  2. SLPDB推动比特币现金(BCH)Token生态系统出现质的飞跃
  3. 获取文件名和路径函数
  4. 找到一篇有关A*算法文章,不错~收藏
  5. e7用什么主板_主板上这么多扩展插槽,都是干什么用的,看了不后悔
  6. 数据结构之排序五:选择排序
  7. WINCE 加入驱动DLL步骤
  8. sae 微信 java web_[1] 微信公众号与sae的web应用之间的配置
  9. nginx负载均衡算法
  10. mysql子查询更改指定数据库_MySQL数据库update更新子查询
  11. 19/03/17Python笔记
  12. hibernate 逆向工程对数据库进行CRUD操作
  13. 美国目前最流行的五种量化交易模型
  14. 百战程序员怎么样?python介绍和了解python是什么
  15. cad中如何关掉坐标系显示
  16. mysql大于等于、小于等于的写法
  17. 行列式计算程序(基于Python)
  18. SQLMAP插件tamper编写与使用
  19. 计算机网络--万维网实验
  20. 新静安二手房房价依旧上涨

热门文章

  1. 漫画《我》(一个程序员亲手画的)
  2. 上传文件到GitHub上的两种方法(纯新手可以看看)
  3. 谷歌账号被强退,再次登录提示异常原因
  4. vscode 主题
  5. Python解题:Dream to EC-Final 梦回长安
  6. 美和易思湖南生机职院学子喜获湖南普通高校优质课展示竞赛一等奖
  7. 华为交换机DHCP snooping
  8. 解读使用Daisy-chain(菊花链)方式筛选一定范围内素数的代码
  9. 干货!如何用Python处理图像,一文带你了解!
  10. 18、Java面向对象——类和对象的关系及应用、对象数组的应用