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();
                }
            }
        }        
    }
}

相关资源已存档在博客园后台处。

 

posted on 2013-01-23 20:21  TeamWork  阅读(5858)  评论(0编辑  收藏  举报