Baseline for the Occipital/Parietal areas
This Node-Red flow is part of the Collection entitled “Fuzzy shell for developing a custom EEG BCI”. This flow allows you to perform the reference phase for the occipital and parietal regions. For more details see: A. Lekova, I. Chavdarov, “A fuzzy shell for developing an interpretable BCI based on the spatiotemporal dynamics of the evoked oscillations,” Computational Intelligence and Neuroscience, 2021, DOI:https://doi.org/10.1155/2020/6685672
How to import the flow: 1. This flow requires EmotivBCI Node-RED Toolbox. If you are not already installed - go to your command prompt and run: $ npm install node-red-contrib-emotiv-emotiv-bci 2. Connect your Emotiv EPOC+ device by any Cortex service, e.g. Emotiv App. 3. Start Node-RED in your command prompt. 4. On your web-browser, open Node-RED on http://127.0.0.1:1880 5. On the top-right screen, go to Menu/Import/Clipboard and paste the contents of the JSON file below in "example directory". 6. Wire the two “link in” nodes to the “link out” nodes in the flow entitled “Data registered by EPOC” and deploy the flow using EmotivBCI Node-RED Toolbox. 7. Start the flow by the Start/Stop node.
[{"id":"81700953.7ae278","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"28fb623d.304f6e","type":"inject","z":"81700953.7ae278","name":"ON","repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"true","payloadType":"bool","x":270,"y":140,"wires":[["c2179ba8.8e2cf8"]]},{"id":"11c7b288.87e66d","type":"inject","z":"81700953.7ae278","name":"OFF","repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"false","payloadType":"bool","x":270,"y":180,"wires":[["c2179ba8.8e2cf8"]]},{"id":"7f8007e.81a0af8","type":"debug","z":"81700953.7ae278","name":"","active":true,"tosidebar":true,"console":false,"complete":"false","x":730,"y":160,"wires":[]},{"id":"c2179ba8.8e2cf8","type":"change","z":"81700953.7ae278","name":"Enable / Disable EMOTIV flow","rules":[{"t":"set","p":"start-stop","pt":"flow","to":"payload","tot":"msg"},{"t":"set","p":"dt","pt":"flow","to":"250","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":160,"wires":[["7f8007e.81a0af8"]]},{"id":"aa32e0e0.1000b","type":"link in","z":"81700953.7ae278","name":"LINK2 start EMOTIV data here","links":["a2174f70.0e45"],"x":195,"y":220,"wires":[["faaf7b25.19b958"]]},{"id":"faaf7b25.19b958","type":"switch","z":"81700953.7ae278","name":"Is Flow enabled?","property":"start-stop","propertyType":"flow","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":290,"y":260,"wires":[["342a937a.6f1b1c","4583691e.231298","b7af2c5c.1a2c5","96c62bbc.7404a8"]]},{"id":"afcd13fe.f173d","type":"inject","z":"81700953.7ae278","name":"","repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":80,"wires":[["6986647a.5ec60c"]]},{"id":"6986647a.5ec60c","type":"function","z":"81700953.7ae278","name":"initialize variables","func":"flow.set(\"samples\", 100);\nflow.set(\"thrshT\", 50);\nflow.set(\"thrshB\", 7);\n\nflow.set('count1',0);\nflow.set('count2',0);\nflow.set('count3',0);\nflow.set('count4',0);\n\n\n\nvar A1 =[];var A2 =[];var A3 =[];var A4 =[];\n\n\n\nflow.set(\"P8BH_Array\",A1);\n\nflow.set(\"O2T_Array\",A2);\n\nflow.set(\"O2G_Array\",A3);\n\nflow.set(\"P8G_Array\",A4);\n\n\n\n\n","outputs":1,"noerr":0,"x":490,"y":80,"wires":[[]]},{"id":"eba6f05b.f022d","type":"function","z":"81700953.7ae278","name":"P8_BH ERS\"","func":"var new_acc=flow.get('accP8_BH')||0;\nvar c=flow.get(\"count1\");\nvar samples=flow.get(\"samples\");\nvar thrsh=flow.get(\"thrshB\");\nc++;\nflow.set('count1',c);\n \nif(c>4 && c<samples){\nA1 = flow.get(\"P8BH_Array\");\nif(Math.abs(new_acc*1000000)<thrsh )\n{\nA1.push((new_acc*1000000).toFixed(2));\nflow.set(\"P8BH_Array\", A1); \n}\n \n}\n\nif(c===samples-1){\n msg.payload= flow.get(\"P8BH_Array\");\n c++;\n flow.set('count1',c);\n return msg;\n }\n else {\n return null\n}\n\n\n","outputs":1,"noerr":0,"x":450,"y":340,"wires":[["7c398bfc.b68454"]]},{"id":"7c398bfc.b68454","type":"function","z":"81700953.7ae278","name":"identify FS","func":"msg1={};\nmsg2={};\nvar Ar = msg.payload;\nmsg1.payload=Ar;\nmsg1.topic = \"mean\";\nmsg2.payload=Ar;\nmsg2.topic = \"standardDeviation\";\nreturn[[msg1], msg2];","outputs":2,"noerr":0,"x":630,"y":340,"wires":[["f7fba6c0.d131b8"],["842a0397.9503e"]]},{"id":"f7fba6c0.d131b8","type":"statistics","z":"81700953.7ae278","name":"mean","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":320,"wires":[["7e9a6044.794"]]},{"id":"342a937a.6f1b1c","type":"function","z":"81700953.7ae278","name":"get P8 BH","func":"var dt=flow.get('dt');\nvar xP8_BH = flow.get('xP8_BH')||0;\nvar xxP8_BH = flow.get('xxP8_BH')||0;\nvar dxP8_BH = flow.get('dxP8_BH')||0;\nvar dxxP8_BH = flow.get('dxxP8_BH')||0;\n\nvar pow=context.global.storeP8BH();\nvar res=(pow-xxP8_BH)/dt;\nflow.set('xxP8_BH', xP8_BH);\nflow.set('xP8_BH', pow);\nflow.set('dxxxP8_BH', dxxP8_BH);\nflow.set('dxxP8_BH', dxP8_BH);\nflow.set('dxP8_BH', res);\nvar new_acc=(flow.get('dxP8_BH')-flow.get('dxxxP8_BH'))/dt;\nflow.set('accP8_BH', new_acc);\nmsg.payload=(res*1000).toFixed(2);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":250,"y":340,"wires":[["eba6f05b.f022d"]]},{"id":"7e9a6044.794","type":"function","z":"81700953.7ae278","name":"store m_P8_BH","func":"context.global.store_m_P8_BH=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":320,"wires":[[]]},{"id":"36590afa.9d5ff6","type":"function","z":"81700953.7ae278","name":"store std_P8_BH","func":"context.global.store_std_P8_BH=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":950,"y":360,"wires":[[]]},{"id":"96c62bbc.7404a8","type":"function","z":"81700953.7ae278","name":"get O2 T","func":"var dt=flow.get('dt');//4ppms-250ms dt=0.5s\nvar xO2_T = flow.get('xO2_T')||0;\nvar xxO2_T = flow.get('xxO2_T')||0;\nvar dxO2_T = flow.get('dxO2_T')||0;\nvar dxxO2_T = flow.get('dxxO2_T')||0;\nvar old_acc= flow.get('accO2_T')||0;\nif(flow.get('flag_art')===0) flow.set('old_accO2_T', old_acc);\n\nvar pow=context.global.storeO2T();\nvar res=(pow-xxO2_T)/dt;\nflow.set('xxO2_T', xO2_T);\nflow.set('xO2_T', pow);\nflow.set('dxxxO2_T', dxxO2_T);\nflow.set('dxxO2_T', dxO2_T);\nflow.set('dxO2_T', res);\nvar new_acc=(flow.get('dxO2_T')-flow.get('dxxxO2_T'))/dt;\nflow.set('accO2_T', new_acc);\nmsg.payload=(res*1000).toFixed(2);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":420,"wires":[["81908642.9e5e48"]]},{"id":"81908642.9e5e48","type":"function","z":"81700953.7ae278","name":" O2_T ERS\"","func":"var new_acc=flow.get('accO2_T')||0;\nvar c=flow.get(\"count2\");\nvar samples=flow.get(\"samples\");\nvar thrsh=flow.get(\"thrshT\");\nc++;\nflow.set('count2',c);\n \nif(c>4 && c<samples){\nA2 = flow.get(\"O2T_Array\");\n\n\nif(Math.abs(new_acc*1000000)<thrsh )\n{\nA2.push((new_acc*1000000).toFixed(2));\nflow.set(\"O2T_Array\", A2); \n}\n \n}\n\nif(c===samples-1){\n msg.payload= flow.get(\"O2T_Array\");\n c++;\n flow.set('count2',c);\n return msg;\n }\n else {\n return null\n}\n\n\n","outputs":1,"noerr":0,"x":450,"y":420,"wires":[["ee49b9f2.4ff548"]]},{"id":"ee49b9f2.4ff548","type":"function","z":"81700953.7ae278","name":"identify FS","func":"msg1={};\nmsg2={};\nvar Ar = msg.payload;\nmsg1.payload=Ar;\nmsg1.topic = \"mean\";\nmsg2.payload=Ar;\nmsg2.topic = \"standardDeviation\";\nreturn[[msg1], msg2];","outputs":2,"noerr":0,"x":630,"y":420,"wires":[["50f94e7e.ef92e"],["f4fb6894.a28538"]]},{"id":"50f94e7e.ef92e","type":"statistics","z":"81700953.7ae278","name":"mean","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":400,"wires":[["baaf6a3d.9f8e68"]]},{"id":"f4fb6894.a28538","type":"statistics","z":"81700953.7ae278","name":"std","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":440,"wires":[["ca28bd09.2f088"]]},{"id":"baaf6a3d.9f8e68","type":"function","z":"81700953.7ae278","name":"store m_O2_T","func":"context.global.store_m_O2_T=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":400,"wires":[[]]},{"id":"ca28bd09.2f088","type":"function","z":"81700953.7ae278","name":"store std_O2_T","func":"context.global.store_std_O2_T=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":440,"wires":[[]]},{"id":"beb52f9c.a6cc8","type":"function","z":"81700953.7ae278","name":"store m_P8_G","func":"context.global.store_m_P8_G=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":560,"wires":[[]]},{"id":"75826802.c9ff78","type":"function","z":"81700953.7ae278","name":"store std_P8_G","func":"context.global.store_std_P8_G=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":600,"wires":[[]]},{"id":"4583691e.231298","type":"function","z":"81700953.7ae278","name":"get O2 G","func":"var dt=flow.get('dt');//4ppms-250ms dt=0.5s\nvar xO2_G = flow.get('xO2_G')||0;\nvar xxO2_G = flow.get('xxO2_G')||0;\nvar dxO2_G = flow.get('dxO2_G')||0;\nvar dxxO2_G = flow.get('dxxO2_G')||0;\n\nvar pow=context.global.storeO2G();\nvar res=(pow-xxO2_G)/dt;\nflow.set('xxO2_G', xO2_G);\nflow.set('xO2_G', pow);\nflow.set('dxxxO2_G', dxxO2_G);\nflow.set('dxxO2_G', dxO2_G);\nflow.set('dxO2_G', res);\nvar new_acc=(flow.get('dxO2_G')-flow.get('dxxxO2_G'))/dt;\nflow.set('accO2_G', new_acc);\n//msg.payload=(res*1000).toFixed(2);\n//msg.payload=(context.global.storeO2G()).toFixed(2);\nmsg.payload=(new_acc*1000).toFixed(2);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":500,"wires":[["8effc72.d4daf38"]]},{"id":"8effc72.d4daf38","type":"function","z":"81700953.7ae278","name":"O2_G ERS\"","func":"var new_acc=flow.get('accO2_G')||0;\nvar c=flow.get(\"count3\");\nvar samples=flow.get(\"samples\");\nvar thrsh=flow.get(\"thrshB\");\nc++;\nflow.set('count3',c);\n \nif(c>4 && c<samples){\nA3 = flow.get(\"O2G_Array\");\nif(Math.abs(new_acc*1000000)<thrsh )\n{\nA3.push((new_acc*1000000).toFixed(2));\nflow.set(\"O2G_Array\", A3); \n}\n \n}\n\nif(c===samples-1){\n msg.payload= flow.get(\"O2G_Array\");\n c++;\n flow.set('count3',c);\n return msg;\n }\n else {\n return null\n}\n\n\n","outputs":1,"noerr":0,"x":450,"y":500,"wires":[["41a1d41a.592dac"]]},{"id":"41a1d41a.592dac","type":"function","z":"81700953.7ae278","name":"identify FS","func":"msg1={};\nmsg2={};\nvar Ar = msg.payload;\nmsg1.payload=Ar;\nmsg1.topic = \"mean\";\nmsg2.payload=Ar;\nmsg2.topic = \"standardDeviation\";\nreturn[[msg1], msg2];","outputs":2,"noerr":0,"x":630,"y":500,"wires":[["dd754328.992aa"],["98828209.14344"]]},{"id":"dd754328.992aa","type":"statistics","z":"81700953.7ae278","name":"mean","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":480,"wires":[["7301186e.7af608"]]},{"id":"98828209.14344","type":"statistics","z":"81700953.7ae278","name":"std","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":520,"wires":[["c5f6c25d.2465"]]},{"id":"7301186e.7af608","type":"function","z":"81700953.7ae278","name":"store m_O2_G","func":"context.global.store_m_O2_G=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":480,"wires":[["e3da497d.f35bf8"]]},{"id":"c5f6c25d.2465","type":"function","z":"81700953.7ae278","name":"store std_O2_G","func":"context.global.store_std_O2_G=function() { return msg.payload};\n\nreturn msg;","outputs":1,"noerr":0,"x":940,"y":520,"wires":[[]]},{"id":"842a0397.9503e","type":"statistics","z":"81700953.7ae278","name":"std","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":360,"wires":[["36590afa.9d5ff6"]]},{"id":"162ba97d.3e1007","type":"statistics","z":"81700953.7ae278","name":"mean","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":560,"wires":[["beb52f9c.a6cc8"]]},{"id":"a3866663.6b84a8","type":"statistics","z":"81700953.7ae278","name":"std","dataSetSize":"0","inputField":"payload","inputFieldType":"msg","resultField":"payload","resultFieldType":"msg","parameterField":"","parameterFieldType":"payload","stripFunction":false,"resultOnly":true,"x":770,"y":600,"wires":[["75826802.c9ff78"]]},{"id":"24ac3922.dead46","type":"function","z":"81700953.7ae278","name":"pop_up FMFs ","func":"// set ling_var and its FMFs \n//TrapezMembershipFunction(a, b, c, d);\n\nvar cg=1.2;//coeficients c1, c2, c3\nvar cb=1.4;\nvar ct=2;\n\n\n\nvar m1=context.global.store_m_P8_BH();\nvar std1=context.global.store_std_P8_BH();\n\nvar m2=context.global.store_m_O2_T();\nvar std2=context.global.store_std_O2_T();\n\nvar m3=context.global.store_m_O2_G();\nvar std3=context.global.store_std_O2_G();\n\nvar m4=context.global.store_m_P8_G();\nvar std4=context.global.store_std_P8_G();\n\n\n\nvar FMFs_1 = [];\nvar FMFs_2 = [];\nvar FMFs_3 = [];\nvar FMFs_4 = [];\n\n\nFMFs_1.push([(m1-std1*cg),(m1-std1),(m1+std1),(m1+std1*cg)]);//ref\nFMFs_1.push([(m1+std1),(m1+std1*cg),(m1+std1*cb),(m1+std1*ct)]);//low\nFMFs_1.push([(m1+std1*cb),(m1+std1*ct), (m1+ct*3*std1),(m1+ct*3*std1)]);//high\n\nFMFs_2.push([(m2-std2*cg),(m2-std2),(m2+std2),(m2+std2*cg)]);//ref\nFMFs_2.push([(m2+std2),(m2+std2*cg),(m2+std2*cb),(m2+std2*ct)]);//low\nFMFs_2.push([(m2+std2*cb),(m2+std2*ct), (m2+ct*3*std2),(m2+ct*3*std2)]);//high\n\nFMFs_3.push([(m3-std3*cg),(m3-std3),(m3+std3),(m3+std3*cg)]);//ref\nFMFs_3.push([(m3+std3),(m3+std3*cg),(m3+std3*cb),(m3+std3*ct)]);//low\nFMFs_3.push([(m3+std3*cb),(m3+std3*ct), (m3+ct*3*std3),(m3+ct*3*std3)]);//high\n\nFMFs_4.push([(m4-std4*cg),(m4-std4),(m4+std4),(m4+std4*cg)]);//ref\nFMFs_4.push([(m4+std4),(m4+std4*cg),(m4+std4*cb),(m4+std4*ct)]);//low\nFMFs_4.push([(m4+std4*cb),(m4+std4*ct), (m4+ct*3*std4),(m4+ct*3*std4)]);//high\n\n\n\n\n\nglobal.set(\"FM_P8_BH_ERS\", FMFs_1);\nglobal.set(\"FM_O2_T_ERS\", FMFs_2);\nglobal.set(\"FM_O2_G_ERS\", FMFs_3);\nglobal.set(\"FM_P8_G_ERS\", FMFs_4);\n\n\nmsg.payload=[FMFs_1,FMFs_2,FMFs_3,FMFs_4];\n\nreturn msg;\n\n\n\n\n\n","outputs":1,"noerr":0,"x":580,"y":680,"wires":[["799dc5fd.f6147c","f18c1f0.b3718e"]]},{"id":"799dc5fd.f6147c","type":"debug","z":"81700953.7ae278","name":"","active":true,"tosidebar":true,"console":false,"complete":"false","x":770,"y":680,"wires":[]},{"id":"e3da497d.f35bf8","type":"delay","z":"81700953.7ae278","name":"","pauseType":"delay","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":420,"y":680,"wires":[["24ac3922.dead46"]]},{"id":"b7af2c5c.1a2c5","type":"function","z":"81700953.7ae278","name":"get P8 G","func":"var dt=flow.get('dt');//4ppms-250ms dt=0.5s\nvar xP8_G = flow.get('xP8_G')||0;\nvar xxP8_G = flow.get('xxP8_G')||0;\nvar dxP8_G = flow.get('dxP8_G')||0;\nvar dxxP8_G = flow.get('dxxP8_G')||0;\n\nvar af3T=context.global.storeP8G();\nvar res=(af3T-xxP8_G)/dt;\nflow.set('xxP8_G', xP8_G);\nflow.set('xP8_G', af3T);\nflow.set('dxxxP8_G', dxxP8_G);\nflow.set('dxxP8_G', dxP8_G);\nflow.set('dxP8_G', res);\nvar new_acc=(flow.get('dxP8_G')-flow.get('dxxxP8_G'))/dt;\nflow.set('accP8_G', new_acc);\nmsg.payload=(res*1000).toFixed(2);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":240,"y":580,"wires":[["521f900d.839ee"]]},{"id":"521f900d.839ee","type":"function","z":"81700953.7ae278","name":"P8_G ERS\"","func":"var new_acc=flow.get('accP8_G')||0;\nvar c=flow.get(\"count4\");\nvar samples=flow.get(\"samples\");\nvar thrsh=flow.get(\"thrshB\");\nc++;\nflow.set('count4',c);\n \nif(c>4 && c<samples){\nA4 = flow.get(\"P8G_Array\");\nif(Math.abs(new_acc*1000000)<thrsh )\n{\nA4.push((new_acc*1000000).toFixed(2));\nflow.set(\"P8G_Array\", A4); \n \n}\n}\n\nif(c===samples-1){\n msg.payload= flow.get(\"P8G_Array\");\n c++;\n flow.set('count4',c);\n return msg;\n }\n else {\n return null\n}\n\n\n","outputs":1,"noerr":0,"x":450,"y":580,"wires":[["aae6689f.026598"]]},{"id":"aae6689f.026598","type":"function","z":"81700953.7ae278","name":"identify FS","func":"msg1={};\nmsg2={};\nvar Ar = msg.payload;\nmsg1.payload=Ar;\nmsg1.topic = \"mean\";\nmsg2.payload=Ar;\nmsg2.topic = \"standardDeviation\";\nreturn[[msg1], msg2];","outputs":2,"noerr":0,"x":630,"y":580,"wires":[["162ba97d.3e1007"],["a3866663.6b84a8"]]},{"id":"f18c1f0.b3718e","type":"function","z":"81700953.7ae278","name":"stop flow","func":"\nmsg.payload=false;\nreturn msg;","outputs":1,"noerr":0,"x":560,"y":740,"wires":[["c2179ba8.8e2cf8"]]}]