16:25 2013/1/19
两种耳机的区别:主要是数据传输方式不一样。MindSet是通过蓝牙发送,MindWave是通过射频发送。
两种开发包的区别:mrt(mind research tool),主要是研究用;mdt(mind develop tool),主要是开发用。
13:31 2013/1/20
其中一种用途,用来根据兴奋状态检测出是否处于睡眠状态,这样就可以在睡眠时减少数据采样速度。
13:52 2013/1/20
终于明白了,原来MRT是要钱的,而且要花500美元,坑爹啊!
13:57 2013/1/20
MDT各种工具的用途:
ThinkGear Connector:提供了一个连接软件,获取数据的话,只需要通过socket来获取就可以了。可以把连接和控制分离,但是要自己去获取socket数据并解析。
ThinkGear Communications Driver:把那些API都给你了,目前看来是最简单的了。
ThinkGear Communications Protocol:最底层的通信协议。一般不用。
14:19 2013/1/20
ThinkGear Connector的Socket地址:127.0.0.1:13854;TCP协议
14:28 2013/1/20
最后还是决定使用ThinkGear Communications Driver来做了,使用C语言版本来做最简单,因为原本就是先用C开发的。了解API后,可以移植到java上,使用JNI调用dll就可以了。
20:13 2013/1/22
TODO:为什么使用package,就无法调用JNI?
/////////////////////////////////////////////////////////////////////////////////////////////
C语言版本使用手册:
1、新建工程后,将ThinkGear.h、ThinkGear.lib、thinkgear_testapp.cpp放入工程;
2、编译后,将thinkgear.dll文件放入exe所在文件夹;
3、将耳机和接收器连接好,启动程序,指示灯应该由红变蓝。
主程序:
#include <stdlib.h> #include <stdio.h> #include "thinkgear.h" int main() { // 获取一个连接句柄 int connectionId = TG_GetNewConnectionId(); if( connectionId < 0 ) { printf( "ERROR: TG_GetNewConnectionId() returned %d.\n", connectionId ); exit( EXIT_FAILURE ); } else printf( "SUCCESS: TG_GetNewConnectionId() returned %d.\n", connectionId ); char *comPortName = "\\\\.\\COM3"; // 注意COM名要和电脑的连接相对应 // TG_BAUD_*可以设置波特率,TG_STREAM_PACKETS是数据格式 int errCode = TG_Connect( connectionId, comPortName, TG_BAUD_9600, TG_STREAM_PACKETS ); if( errCode < 0 ) { printf( "ERROR: TG_Connect() returned %d.\n", errCode ); exit( EXIT_FAILURE ); } else printf( "SUCCESS: TG_Connect() returned %d.\n", errCode ); while( 1 ) { errCode = TG_ReadPackets( connectionId, 1 ); //读取数据包 if( errCode==1 ) { if( TG_GetValueStatus(connectionId, TG_DATA_ATTENTION) != 0 ) { //读取attention数据 printf( "New attention value: %f\n", TG_GetValue(connectionId, TG_DATA_ATTENTION) ); } } } TG_FreeConnection( connectionId ); // 释放句柄 return( EXIT_SUCCESS ); }
API大概说明:
TG_GetNewConnectionId() : 获取一个连接句柄,在后面都要用到
TG_FreeConnection() : 把句柄释放掉
TG_SetStreamLog() : 设置流日志
TG_SetDataLog() : 在把流转换为数据时,记录日志
TG_Connect() : 连接
TG_Disconnect() : 取消连接,调用后一些依赖函数就不可用
TG_ReadPackets() : 读取若干个packet,是读取最新的吗?
TG_GetValueStatus() : 判断数据是否更新过
TG_GetValue() : 读取数据,为主要功能
TG_SetBaudrate() : 运行中改变波特率
TG_SetDataFormat() : 运行中改变数据转化类型
TG_EnableAutoRead() : 开启1个后台线程,每隔1ms刷新一次
TG_EnableBlinkDetection() : 控制是否开启眨眼功能
TG_EnableLowPassFilter() : 。。。
TG_GetDriverVersion() : 获取dll版本
TG_SendByte() : 向耳机发送控制信息,一般不用
TG_GetValue()获取的数据(不同耳机不同,请查阅文档):
#define TG_DATA_BATTERY 0
#define TG_DATA_POOR_SIGNAL 1
#define TG_DATA_ATTENTION 2
#define TG_DATA_MEDITATION 3
#define TG_DATA_RAW 4
#define TG_DATA_DELTA 5
#define TG_DATA_THETA 6
#define TG_DATA_ALPHA1 7
#define TG_DATA_ALPHA2 8
#define TG_DATA_BETA1 9
#define TG_DATA_BETA2 10
#define TG_DATA_GAMMA1 11
#define TG_DATA_GAMMA2 12
#define TG_DATA_BLINK_STRENGTH 37
///////////////////////////////////////////////////////////////////////////////////////
java版本大致相同,只是使用JNI调用而已。
ThinkGear.java中开启了一个线程,用于主动更新数据:
public static int connectionId=0; //主要句柄 public static boolean init() { connectionId = GetNewConnectionId(); if( connectionId < 0 ) return false; String comPortName = "\\\\.\\COM3"; // 注意COM名要和电脑的连接相对应 // TG_BAUD_*可以设置波特率,TG_STREAM_PACKETS是数据格式 int errCode = Connect( connectionId, comPortName, BAUD_9600, STREAM_PACKETS ); if( errCode < 0 ) return false; Runnable auto=new AutoReadThread(); new Thread(auto).start(); return true; } public static int getAttention() { return (int)GetValue(connectionId, DATA_ATTENTION); } //内部类,自动更新数据用 public static class AutoReadThread implements Runnable { @Override public void run() { while(true) { ThinkGear.ReadPackets(connectionId,-1); try { Thread.sleep(5); // 5ms更新一次数据 } catch (Exception e) { e.printStackTrace(); } } } }
Test.java:
/** * 用于从脑电波采集数据 * 使用方法: * 1、使用ThinkGear.init()进行初始化 * 2、然后随时可以使用ThinkGear.getAttention()获取最新数据 * 3、目前要自己调节时间间隔,后面要做什么清楚了再封装为每秒1个数组 * @author 林培东 * */ public class Test { public static final int times=10; //每秒采集10次数据 public static void main(String[] args) { Runnable r=new ReadData(); new Thread(r).start(); } public static class ReadData implements Runnable { @Override public void run() { if( !ThinkGear.init() ) //初始化失败 { System.out.println("Initialize Error!"); System.exit(1); } else { System.out.println("Initialize Succeed!"); } int count=1; System.out.println("The attention data read in every second:"); while(true) //循环采集 { if(count%times==0) System.out.printf("%d\n",ThinkGear.getAttention()); else System.out.printf("%d-", ThinkGear.getAttention()); count++; try { Thread.sleep(1000/times); } catch(Exception e) { e.printStackTrace(); } } } } }
相关资源已存档在博客园后台处。