MindWave——脑电波设备开发笔记by林培东

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

                }

            }

        }        

    }

}

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

 

你可能感兴趣的:(开发)