00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00041 #include "plugin.h"
00042 #include "neurosky.h"
00043
00044
00046 cbmachine ww;
00047 HWND HScol = NULL;
00048
00049
00051 int OBJNEUROSKYSCOL;
00052
00053
00055
00056
00057 int SCOL_NEUROSKY_ATTENTION_CB = 0;
00058 int NEUROSKY_ATTENTION_CB;
00059
00060
00061 int SCOL_NEUROSKY_MEDITATION_CB = 1;
00062 int NEUROSKY_MEDITATION_CB;
00063
00064
00065 int SCOL_NEUROSKY_BATTERY_CB = 2;
00066 int NEUROSKY_BATTERY_CB;
00067
00068
00069 int SCOL_NEUROSKY_RAW_SIGNAL_CB = 3;
00070 int NEUROSKY_RAW_SIGNAL_CB;
00071
00072
00073 int SCOL_NEUROSKY_POOR_QUALITY_CB = 4;
00074 int NEUROSKY_POOR_QUALITY_CB;
00075
00076
00077 int SCOL_NEUROSKY_EEG_CB = 5;
00078 int NEUROSKY_EEG_CB;
00079
00080
00081 int SCOL_NEUROSKY_CONNECTED_CB = 6;
00082 int NEUROSKY_CONNECTED_CB;
00083
00084
00085 int SCOL_NEUROSKY_DISCONNECTED_CB = 7;
00086 int NEUROSKY_DISCONNECTED_CB;
00087
00088
00089 extern Array<Neurosky*> neuroskyList ;
00090
00091
00093 wchar_t* convertCharToLPCWSTR(char * s_text)
00094 {
00095 int char_count = MultiByteToWideChar(CP_ACP, 0, s_text, -1, NULL, 0);
00096 wchar_t * w_text = new wchar_t[char_count];
00097 MultiByteToWideChar(CP_ACP, 0, s_text, -1, w_text, char_count);
00098
00099 return w_text;
00100 }
00101
00102 char* convertWcharToChar(wchar_t * w_text)
00103 {
00104 int wchar_count = WideCharToMultiByte(CP_ACP, 0, w_text, -1, NULL, 0,NULL,NULL);
00105 char * s_text = new char[wchar_count];
00106 WideCharToMultiByte(CP_ACP, 0, w_text, -1, s_text, wchar_count,NULL,NULL);
00107
00108 return s_text;
00109 }
00110
00111
00120
00121 int destroyNeuroskyObj(mmachine m, int handsys, int NeuroskyTab)
00122 {
00123 Neurosky * NeuroskyObj = (Neurosky *) MMfetch(m, MTOP(NeuroskyTab), 0);
00124 if (NeuroskyObj == NULL) {
00125 MMset(m, 0, NIL);
00126 return 0;
00127 }
00128 SAFE_DELETE(NeuroskyObj);
00129 MMstore(m, MTOP(NeuroskyTab), 0, NULL);
00130 return 0;
00131 }
00132
00133
00142 int _CRNeurosky(mmachine m)
00143 {
00144 #ifdef _SCOL_DEBUG_
00145 MMechostr(MSKDEBUG,"_CRNeurosky\n");
00146 #endif
00147
00148
00149 int channel = MMget(m, 0);
00150
00151 if (channel == NIL) {
00152 MMechostr(MSKDEBUG, "Channel NIL\n");
00153
00154 MMpull(m);
00155 MMpush(m, NIL);
00156 return 0;
00157 }
00158
00159 Neurosky * newNeurosky = new Neurosky();
00160 int neuroskyTab = MMmalloc(m,1,TYPETAB) ;
00161 if ( neuroskyTab == NIL )
00162 {
00163 SAFE_DELETE(newNeurosky) ;
00164 MMpull(m);
00165 return MMpush(m, NIL);
00166 }
00167
00168 MMstore( m, neuroskyTab, 0, (int)newNeurosky ) ;
00169 MMpush(m, PTOM( neuroskyTab )) ;
00170
00171 int k = 0;
00172 k = OBJcreate(m, OBJNEUROSKYSCOL, (int)newNeurosky, -1, -1);
00173
00174 #ifdef _SCOL_DEBUG_
00175 MMechostr(MSKDEBUG,"ok\n");
00176 #endif
00177
00178 return k ;
00179 }
00180
00181
00190 int _DSNeurosky (mmachine m)
00191 {
00192 #ifdef _SCOL_DEBUG_
00193 MMechostr(MSKDEBUG,"_DSNeurosky\n");
00194 #endif
00195
00196 int neuroskyTab = MMget(m, 0);
00197 if (neuroskyTab == NIL) {
00198 MMechostr(MSKDEBUG,"ObjNeurosky NIL\n");
00199 MMset(m, 0, -1);
00200 return 0;
00201 }
00202 OBJdelTM(m, OBJNEUROSKYSCOL, neuroskyTab);
00203 MMset(m, 0, 0);
00204
00205 #ifdef _SCOL_DEBUG_
00206 MMechostr(MSKDEBUG,"ok\n");
00207 #endif
00208 return 0;
00209 }
00210
00211
00221 int _SetNeuroskyBaudrate (mmachine m)
00222 {
00223 #ifdef _SCOL_DEBUG_
00224 MMechostr(MSKDEBUG,"_SetNeuroskyVolume\n");
00225 #endif
00226 ULONG baudrateNeurosky = MTOI(MMpull(m));
00227 int neuroskyTab = MMget(m, 0);
00228 if (neuroskyTab == NIL) {
00229 MMechostr(MSKDEBUG,"ObjNeurosky NIL\n");
00230 MMset(m, 0, -1);
00231 return 0;
00232 }
00233 Neurosky * ObjNeurosky = (Neurosky *) MMfetch(m, MTOP(neuroskyTab), 0);
00234
00235 MMset(m, 0,0);
00236 #ifdef _SCOL_DEBUG_
00237 MMechostr(MSKDEBUG,"ok\n");
00238 #endif
00239 return 0;
00240 }
00241
00242
00252 int _SetNeuroskyDataFormat (mmachine m)
00253 {
00254 #ifdef _SCOL_DEBUG_
00255 MMechostr(MSKDEBUG,"_SetNeuroskyVolume\n");
00256 #endif
00257 ULONG dataFormatNeurosky = MTOI(MMpull(m));
00258 int neuroskyTab = MMget(m, 0);
00259 if (neuroskyTab == NIL) {
00260 MMechostr(MSKDEBUG,"ObjNeurosky NIL\n");
00261 MMset(m, 0, -1);
00262 return 0;
00263 }
00264 Neurosky * ObjNeurosky = (Neurosky *) MMfetch(m, MTOP(neuroskyTab), 0);
00265
00266 MMset(m, 0,0);
00267 #ifdef _SCOL_DEBUG_
00268 MMechostr(MSKDEBUG,"ok\n");
00269 #endif
00270 return 0;
00271 }
00272
00273
00285 int _CBNeuroskyAttentionData(mmachine m)
00286 {
00287 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_ATTENTION_CB);
00288 }
00289 int getNeuroskyAttentionCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00290 {
00291 int k = 0;
00292 Neurosky * NeuroskyObj =(Neurosky *) id;
00293
00294
00295 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_ATTENTION_CB))
00296 return 0;
00297
00298 MMpush(m, FTOM(param));
00299 if ((k=OBJcallreflex(m, 1))) return k;
00300 return k;
00301 }
00302
00303
00315 int _CBNeuroskyMeditationData(mmachine m)
00316 {
00317 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_MEDITATION_CB);
00318 }
00319 int getNeuroskyMeditationCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00320 {
00321 int k = 0;
00322 Neurosky * NeuroskyObj =(Neurosky *) id;
00323
00324
00325 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_MEDITATION_CB))
00326 return 0;
00327
00328 MMpush(m, FTOM(param));
00329 if ((k=OBJcallreflex(m, 1))) return k;
00330 return k;
00331 }
00332
00333
00345 int _CBNeuroskyBatteryData(mmachine m)
00346 {
00347 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_BATTERY_CB);
00348 }
00349 int getNeuroskyBatteryCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00350 {
00351 int k = 0;
00352 Neurosky * NeuroskyObj =(Neurosky *) id;
00353
00354
00355 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_BATTERY_CB))
00356 return 0;
00357
00358 MMpush(m, FTOM(param));
00359 if ((k=OBJcallreflex(m, 1))) return k;
00360 return k;
00361 }
00362
00363
00375 int _CBNeuroskyRawSignalData(mmachine m)
00376 {
00377 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_RAW_SIGNAL_CB);
00378 }
00379 int getNeuroskySignalCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00380 {
00381 int k = 0;
00382 Neurosky * NeuroskyObj =(Neurosky *) id;
00383
00384
00385 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_RAW_SIGNAL_CB))
00386 return 0;
00387
00388 MMpush(m, FTOM(param));
00389 if ((k=OBJcallreflex(m, 1))) return k;
00390 return k;
00391 }
00392
00393
00405 int _CBNeuroskyPoorQualityData(mmachine m)
00406 {
00407 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_POOR_QUALITY_CB);
00408 }
00409 int getNeuroskyPoorQualityCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00410 {
00411 int k = 0;
00412 Neurosky * NeuroskyObj =(Neurosky *) id;
00413 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_POOR_QUALITY_CB))
00414 return 0;
00415 MMpush(m, FTOM(param));
00416 if ((k=OBJcallreflex(m, 1))) return k;
00417 return k;
00418 }
00419
00420
00432 int _CBNeuroskyEEGData(mmachine m)
00433 {
00434 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_EEG_CB);
00435 }
00436 int getNeuroskyEEGCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00437 {
00438 int k = 0;
00439 Neurosky * NeuroskyObj =(Neurosky *) id;
00440
00441
00442 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_EEG_CB))
00443 return 0;
00444 eegResult * eegDatas = (eegResult*)(param) ;
00445 MMpush(m, ITOM(eegDatas->delta));
00446 MMpush(m, ITOM(eegDatas->theta));
00447 MMpush(m, ITOM(eegDatas->low_alpha));
00448 MMpush(m, ITOM(eegDatas->high_alpha));
00449 MMpush(m, ITOM(eegDatas->low_beta));
00450 MMpush(m, ITOM(eegDatas->high_beta));
00451 MMpush(m, ITOM(eegDatas->low_gamma));
00452 MMpush(m, ITOM(eegDatas->high_gamma));
00453
00454 if ((k=OBJcallreflex(m, 8))) return k;
00455 return k;
00456 }
00457
00458
00470 int _CBNeuroskyConnected(mmachine m)
00471 {
00472 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_CONNECTED_CB);
00473 }
00474 int getNeuroskyConnectedCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00475 {
00476 int k = 0;
00477 Neurosky * NeuroskyObj =(Neurosky *) id;
00478
00479
00480 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_CONNECTED_CB))
00481 return 0;
00482 if ((k=OBJcallreflex(m, 0))) return k;
00483 return k;
00484 }
00485
00486
00498 int _CBNeuroskyDisconnected(mmachine m)
00499 {
00500 return OBJaddreflex(m, OBJNEUROSKYSCOL, SCOL_NEUROSKY_DISCONNECTED_CB);
00501 }
00502 int getNeuroskyDisconnectedCb(mmachine m,HWND h,unsigned msg,UINT id,LONG param,int *ret)
00503 {
00504 int k = 0;
00505 Neurosky * NeuroskyObj =(Neurosky *) id;
00506
00507
00508 if (OBJbeginreflex(m, OBJNEUROSKYSCOL, (int)NeuroskyObj, SCOL_NEUROSKY_DISCONNECTED_CB))
00509 return 0;
00510 if ((k=OBJcallreflex(m, 0))) return k;
00511 return k;
00512 }
00513
00514
00516 #define NbTplPKG 13
00517
00518
00522 char *TplName[NbTplPKG] =
00523 {
00524 "ObjNeurosky",
00525 "_CRNeurosky",
00526 "_DSNeurosky",
00527 "_CBNeuroskyAttentionData",
00528 "_CBNeuroskyMeditationData",
00529 "_CBNeuroskyBatteryData",
00530 "_CBNeuroskyPoorQualityData",
00531 "_CBNeuroskyRawSignalData",
00532 "_CBNeuroskyEEGData",
00533 "_CBNeuroskyConnected",
00534 "_CBNeuroskyDisconnected",
00535 "_SetNeuroskyBaudrate",
00536 "_SetNeuroskyDataFormat",
00537
00538 };
00539
00540
00544 int (*TplFunc[NbTplPKG])(mmachine m)=
00545 {
00546 NULL,
00547 _CRNeurosky,
00548 _DSNeurosky,
00549 _CBNeuroskyAttentionData,
00550 _CBNeuroskyMeditationData,
00551 _CBNeuroskyBatteryData,
00552 _CBNeuroskyPoorQualityData,
00553 _CBNeuroskyRawSignalData,
00554 _CBNeuroskyEEGData,
00555 _CBNeuroskyConnected,
00556 _CBNeuroskyDisconnected,
00557 _SetNeuroskyBaudrate,
00558 _SetNeuroskyDataFormat,
00559
00560 };
00561
00562
00566 int TplNArg[NbTplPKG]=
00567 {
00568 TYPTYPE,
00569 1,
00570 1,
00571 3,
00572 3,
00573 3,
00574 3,
00575 3,
00576 3,
00577 3,
00578 3,
00579 2,
00580 2,
00581 };
00582
00583
00587 char* TplType[NbTplPKG]=
00588 {
00589 NULL,
00590 "fun [Chn] ObjNeurosky",
00591 "fun [ObjNeurosky] I",
00592 "fun [ObjNeurosky fun [ObjNeurosky u0 F] u1 u0] ObjNeurosky",
00593 "fun [ObjNeurosky fun [ObjNeurosky u0 F] u1 u0] ObjNeurosky",
00594 "fun [ObjNeurosky fun [ObjNeurosky u0 F] u1 u0] ObjNeurosky",
00595 "fun [ObjNeurosky fun [ObjNeurosky u0 F] u1 u0] ObjNeurosky",
00596 "fun [ObjNeurosky fun [ObjNeurosky u0 F] u1 u0] ObjNeurosky",
00597 "fun [ObjNeurosky fun [ObjNeurosky u0 I I I I I I I I] u1 u0] ObjNeurosky",
00598 "fun [ObjNeurosky fun [ObjNeurosky u0] u1 u0] ObjNeurosky",
00599 "fun [ObjNeurosky fun [ObjNeurosky u0] u1 u0] ObjNeurosky",
00600 "fun [ObjNeurosky I] I",
00601 "fun [ObjNeurosky I] I",
00602 };
00603
00604
00605 void cleanDirtyConnection()
00606 {
00607 for(int i=0;i<neuroskyList.Size();i++)
00608 neuroskyList[i]->disconnect() ;
00609 }
00610
00611
00612
00614
00619 int LoadNeurosky(mmachine m)
00620 {
00621 int k;
00622 HScol = (HWND)SCgetExtra("hscol") ;
00623
00624 OBJNEUROSKYSCOL = OBJregister( 8, 1, destroyNeuroskyObj, "OBJNEUROSKYSCOL" ) ;
00625
00626
00627
00628 NEUROSKY_ATTENTION_CB = OBJgetUserEvent() ;
00629 OBJdefEvent( NEUROSKY_ATTENTION_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyAttentionCb );
00630
00631 NEUROSKY_MEDITATION_CB = OBJgetUserEvent() ;
00632 OBJdefEvent( NEUROSKY_MEDITATION_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyMeditationCb );
00633
00634 NEUROSKY_BATTERY_CB = OBJgetUserEvent() ;
00635 OBJdefEvent( NEUROSKY_BATTERY_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyBatteryCb );
00636
00637 NEUROSKY_RAW_SIGNAL_CB = OBJgetUserEvent() ;
00638 OBJdefEvent( NEUROSKY_RAW_SIGNAL_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskySignalCb );
00639
00640 NEUROSKY_POOR_QUALITY_CB = OBJgetUserEvent() ;
00641 OBJdefEvent( NEUROSKY_POOR_QUALITY_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyPoorQualityCb );
00642
00643 NEUROSKY_EEG_CB = OBJgetUserEvent() ;
00644 OBJdefEvent( NEUROSKY_EEG_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyEEGCb );
00645
00646 NEUROSKY_CONNECTED_CB = OBJgetUserEvent() ;
00647 OBJdefEvent( NEUROSKY_CONNECTED_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyConnectedCb );
00648
00649 NEUROSKY_DISCONNECTED_CB = OBJgetUserEvent() ;
00650 OBJdefEvent( NEUROSKY_DISCONNECTED_CB, (int (__cdecl *)(struct Mmachine *,int,unsigned int,int,int,int *))getNeuroskyDisconnectedCb);
00651
00652 k = PKhardpak(m, "NeuroskyEngine", NbTplPKG, TplName, TplFunc, TplNArg, TplType);
00653
00654 return k;
00655 }
00656
00657
00659
00660
00665 extern "C" __declspec (dllexport) int SCOLloadNEUROSKY(mmachine m, cbmachine w)
00666 {
00667 SCOLinitplugin(w);
00668 MMechostr(MSKDEBUG,"SCOLloadNEUROSKY trying loading neurosky DLL ...\n");
00669 LoadNeurosky(m);
00670 return 0;
00671 }
00672
00673
00678 extern "C" __declspec (dllexport) int SCOLFreeNEUROSKY()
00679 {
00680 cleanDirtyConnection() ;
00681 MMechostr(MSKDEBUG,"Release NeuroSky DLL\n");
00682 MMechostr(MSKDEBUG, "------ ..NeuroSky DLL CLOSED\n\n" );
00683 return 0;
00684 }