Changes between Initial Version and Version 1 of ProtocolEmotiv


Ignore:
Timestamp:
09/19/13 15:41:04 (7 years ago)
Author:
sc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ProtocolEmotiv

    v1 v1  
     1= Protocol: Emotiv = 
     2 
     3* Taken from Puzzlebox Jigsaw  
     4 
     5{{{ 
     6#!div style="font-size: 80%" 
     7Code highlighting: 
     8  {{{#!python 
     9# -*- coding: utf-8 -*- 
     10 
     11# Copyright Puzzlebox Productions, LLC (2012) 
     12 
     13__changelog__ = """\ 
     14Last Update: 2012.04.03 
     15""" 
     16 
     17import time 
     18 
     19##################################################################### 
     20# Headers 
     21##################################################################### 
     22 
     23cdef extern from "edk.h": 
     24        ctypedef void* EmoEngineEventHandle 
     25        ctypedef void* EmoStateHandle 
     26         
     27        ctypedef enum EE_Event_t: 
     28                EE_UnknownEvent         = 0x0000, 
     29                EE_EmulatorError        = 0x0001, 
     30                EE_ReservedEvent        = 0x0002, 
     31                EE_UserAdded            = 0x0010, 
     32                EE_UserRemoved          = 0x0020, 
     33                EE_EmoStateUpdated      = 0x0040, 
     34                EE_ProfileEvent         = 0x0080, 
     35                EE_CognitivEvent        = 0x0100, 
     36                EE_ExpressivEvent       = 0x0200, 
     37                EE_InternalStateChanged = 0x0400, 
     38                EE_AllEvent             = EE_UserAdded | EE_UserRemoved | EE_EmoStateUpdated | EE_ProfileEvent | EE_CognitivEvent | EE_ExpressivEvent | EE_InternalStateChanged 
     39         
     40        ctypedef enum EE_ExpressivAlgo_t: 
     41                EXP_NEUTRAL     = 0x0001, 
     42                EXP_BLINK       = 0x0002, 
     43                EXP_WINK_LEFT   = 0x0004, 
     44                EXP_WINK_RIGHT  = 0x0008, 
     45                EXP_HORIEYE     = 0x0010, 
     46                EXP_EYEBROW     = 0x0020, 
     47                EXP_FURROW      = 0x0040, 
     48                EXP_SMILE       = 0x0080, 
     49                EXP_CLENCH      = 0x0100, 
     50                EXP_LAUGH       = 0x0200, 
     51                EXP_SMIRK_LEFT  = 0x0400, 
     52                EXP_SMIRK_RIGHT = 0x0800 
     53         
     54        ctypedef enum EE_CognitivAction_t: 
     55                COG_NEUTRAL                  = 0x0001, 
     56                COG_PUSH                     = 0x0002, 
     57                COG_PULL                     = 0x0004, 
     58                COG_LIFT                     = 0x0008, 
     59                COG_DROP                     = 0x0010, 
     60                COG_LEFT                     = 0x0020, 
     61                COG_RIGHT                    = 0x0040, 
     62                COG_ROTATE_LEFT              = 0x0080, 
     63                COG_ROTATE_RIGHT             = 0x0100, 
     64                COG_ROTATE_CLOCKWISE         = 0x0200, 
     65                COG_ROTATE_COUNTER_CLOCKWISE = 0x0400, 
     66                COG_ROTATE_FORWARDS          = 0x0800, 
     67                COG_ROTATE_REVERSE           = 0x1000, 
     68                COG_DISAPPEAR                = 0x2000 
     69         
     70        cdef int EE_EngineRemoteConnect(char* szHost, unsigned short port) 
     71        cdef int EE_EngineGetNextEvent(EmoEngineEventHandle hEvent) 
     72        cdef EmoEngineEventHandle EE_EmoEngineEventCreate() 
     73        cdef EmoStateHandle EE_EmoStateCreate() 
     74         
     75        cdef int EE_EngineDisconnect() 
     76        cdef void EE_EmoStateFree(EmoStateHandle state) 
     77        cdef void EE_EmoEngineEventFree(EmoEngineEventHandle hEvent) 
     78         
     79        cdef EE_Event_t EE_EmoEngineEventGetType(EmoEngineEventHandle hEvent) 
     80        cdef int EE_EmoEngineEventGetUserId(EmoEngineEventHandle hEvent, unsigned int *pUserIdOut) 
     81        cdef int EE_EmoEngineEventGetEmoState(EmoEngineEventHandle hEvent, EmoStateHandle hEmoState) 
     82         
     83        cdef float ES_GetTimeFromStart(EmoStateHandle state) 
     84        cdef int ES_GetHeadsetOn(EmoStateHandle state) 
     85        cdef int ES_GetNumContactQualityChannels(EmoStateHandle state) 
     86        cdef int ES_GetContactQualityFromAllChannels(EmoStateHandle state) 
     87        cdef int ES_GetWirelessSignalStatus(EmoStateHandle state) 
     88        cdef void* ES_GetBatteryChargeLevel(EmoStateHandle state) 
     89         
     90        cdef EE_ExpressivAlgo_t EE_ExpressivEventGetType(EmoStateHandle state) 
     91         
     92        cdef float ES_AffectivGetExcitementShortTermScore(EmoStateHandle state) 
     93        cdef float ES_AffectivGetExcitementLongTermScore(EmoStateHandle state) 
     94        cdef float ES_AffectivGetMeditationScore(EmoStateHandle state) 
     95        cdef float ES_AffectivGetFrustrationScore(EmoStateHandle state) 
     96        cdef float ES_AffectivGetEngagementBoredomScore(EmoStateHandle state) 
     97         
     98        cdef EE_CognitivAction_t ES_CognitivGetCurrentAction(EmoStateHandle state) 
     99        cdef float ES_CognitivGetCurrentActionPower(EmoStateHandle state) 
     100 
     101 
     102EDK_ERROR_CODES = { 
     103        'EDK_OK': 0x0000, # Default success value 
     104        'EDK_UNKNOWN_ERROR': 0x0001, #An internal error occurred 
     105        'EDK_INVALID_DEV_ID_ERROR': 0x0002, #Invalid Developer ID 
     106        'EDK_INVALID_PROFILE_ARCHIVE': 0x0101, #The contents of the buffer supplied to EE_SetUserProfile aren't a valid, serialized EmoEngine profile. 
     107        'EDK_NO_USER_FOR_BASEPROFILE': 0x0102, #Returned from EE_EmoEngineEventGetUserId if the event supplied contains a base profile (which isn't associated with specific user). 
     108        'EDK_CANNOT_ACQUIRE_DATA': 0x0200, #The EmoEngine is unable to acquire EEG data for processing. 
     109        'EDK_BUFFER_TOO_SMALL': 0x0300, #The buffer supplied to the function isn't large enough 
     110        'EDK_OUT_OF_RANGE': 0x0301, #A parameter supplied to the function is out of range 
     111        'EDK_INVALID_PARAMETER': 0x0302, #One of the parameters supplied to the function is invalid 
     112        'EDK_PARAMETER_LOCKED': 0x0303, #The parameter value is currently locked by a running detection and cannot be modified at this time. 
     113        'EDK_COG_INVALID_TRAINING_ACTION': 0x0304, #The current training action is not in the list of expected training actions 
     114        'EDK_COG_INVALID_TRAINING_CONTROL': 0x0305, #The current training control is not in the list of expected training controls 
     115        'EDK_COG_INVALID_ACTIVE_ACTION': 0x0306, #One of the field in the action bits vector is invalid 
     116        'EDK_COG_EXCESS_MAX_ACTIONS': 0x0307, #The current action bits vector contains more action types than it is allowed 
     117        'EDK_EXP_NO_SIG_AVAILABLE': 0x0308, #A trained signature is not currently available for use - addition actions (including neutral) may be required 
     118        'EDK_FILESYSTEM_ERROR': 0x0309, #A filesystem error occurred that prevented the function from succeeding 
     119        'EDK_INVALID_USER_ID': 0x0400, #The user ID supplied to the function is invalid 
     120        'EDK_EMOENGINE_UNINITIALIZED': 0x0500, #The EDK needs to be initialized via EE_EngineConnect or EE_EngineRemoteConnect 
     121        'EDK_EMOENGINE_DISCONNECTED': 0x0501, #The connection with a remote instance of the EmoEngine (made via EE_EngineRemoteConnect) has been lost 
     122        'EDK_EMOENGINE_PROXY_ERROR': 0x0502, #The API was unable to establish a connection with a remote instance of the EmoEngine. 
     123        'EDK_NO_EVENT': 0x0600, #There are no new EmoEngine events at this time 
     124        'EDK_GYRO_NOT_CALIBRATED': 0x0700, #The gyro is not calibrated. Ask the user to stay still for at least 0.5s 
     125        'EDK_OPTIMIZATION_IS_ON': 0x0800, #Operation failure due to optimization 
     126        'EDK_RESERVED1': 0x0900, #Reserved return value 
     127} 
     128 
     129EE_AffectivAlgo = { 
     130        'AFF_EXCITEMENT': 0x0001, \ 
     131        'AFF_MEDITATION': 0x0002, \ 
     132        'AFF_FRUSTRATION': 0x0004, \ 
     133        'AFF_ENGAGEMENT_BOREDOM': 0x0008 
     134} 
     135 
     136EE_CognitivAction = { 
     137        'COG_NEUTRAL': 0x0001, \ 
     138        'COG_PUSH': 0x0002, \ 
     139        'COG_PULL': 0x0004, \ 
     140        'COG_LIFT': 0x0008, \ 
     141        'COG_DROP': 0x0010, \ 
     142        'COG_LEFT': 0x0020, \ 
     143        'COG_RIGHT': 0x0040, \ 
     144        'COG_ROTATE_LEFT': 0x0080, \ 
     145        'COG_ROTATE_RIGHT': 0x0100, \ 
     146        'COG_ROTATE_CLOCKWISE': 0x0200, \ 
     147        'COG_ROTATE_COUNTER_CLOCKWISE': 0x0400, \ 
     148        'COG_ROTATE_FORWARDS': 0x0800, \ 
     149        'COG_ROTATE_REVERSE': 0x1000, \ 
     150        'COG_DISAPPEAR': 0x2000 
     151} 
     152 
     153EE_EEG_ContactQuality = [ 
     154        'EEG_CQ_NO_SIGNAL', \ 
     155        'EEG_CQ_VERY_BAD', \ 
     156        'EEG_CQ_POOR', \ 
     157        'EEG_CQ_FAIR', 
     158        'EEG_CQ_GOOD' 
     159] 
     160 
     161EE_Event = { 
     162        'EE_UnknownEvent'         : 0x0000, 
     163        'EE_EmulatorError'        : 0x0001, 
     164        'EE_ReservedEvent'        : 0x0002, 
     165        'EE_UserAdded'            : 0x0010, 
     166        'EE_UserRemoved'          : 0x0020, 
     167        'EE_EmoStateUpdated'      : 0x0040, 
     168        'EE_ProfileEvent'         : 0x0080, 
     169        'EE_CognitivEvent'        : 0x0100, 
     170        'EE_ExpressivEvent'       : 0x0200, 
     171        'EE_InternalStateChanged' : 0x0400, 
     172        'EE_AllEvent'             : EE_UserAdded | EE_UserRemoved | EE_EmoStateUpdated | EE_ProfileEvent | EE_CognitivEvent | EE_ExpressivEvent | EE_InternalStateChanged, 
     173} 
     174 
     175EE_CognitivAction = { 
     176        'COG_NEUTRAL':                  0x0001, 
     177        'COG_PUSH':                     0x0002, 
     178        'COG_PULL':                     0x0004, 
     179        'COG_LIFT':                     0x0008, 
     180        'COG_DROP':                     0x0010, 
     181        'COG_LEFT':                     0x0020, 
     182        'COG_RIGHT':                    0x0040, 
     183        'COG_ROTATE_LEFT':              0x0080, 
     184        'COG_ROTATE_RIGHT':             0x0100, 
     185        'COG_ROTATE_CLOCKWISE':         0x0200, 
     186        'COG_ROTATE_COUNTER_CLOCKWISE': 0x0400, 
     187        'COG_ROTATE_FORWARDS':          0x0800, 
     188        'COG_ROTATE_REVERSE':           0x1000, 
     189        'COG_DISAPPEAR':                0x2000, 
     190} 
     191 
     192##################################################################### 
     193# Globals 
     194##################################################################### 
     195 
     196DEBUG = 1 
     197 
     198#UserID = 0 
     199 
     200EMOTIV_SERVER_HOST = '127.0.0.1' 
     201EMOTIV_SERVER_PORT_CONTROL_PANEL = 3008 
     202EMOTIV_SERVER_PORT_EMOCOMPOSER = 1726 
     203 
     204MINIMUM_SLEEP_BETWEEN_PACKETS = 0.10 
     205 
     206CONNECTED = False 
     207KEEP_RUNNING = True 
     208 
     209##################################################################### 
     210# Classes 
     211##################################################################### 
     212 
     213##################################################################### 
     214# Functions 
     215##################################################################### 
     216 
     217def printPacket(packet): 
     218         
     219        print 
     220        print 
     221        print "INFO [Emotiv]: Packet Received:" 
     222        for group in packet.keys(): 
     223                for key in packet[group].keys(): 
     224                        print '[%s][%s]:' % (group, key), 
     225                        if type(packet[group][key]) == type(0.0): 
     226                                print '%.2f' % packet[group][key] 
     227                        else: 
     228                                print packet[group][key] 
     229 
     230 
     231##################################################################### 
     232 
     233def start(host=EMOTIV_SERVER_HOST, \ 
     234          port=EMOTIV_SERVER_PORT_CONTROL_PANEL, \ 
     235          initialized=True, \ 
     236          parent=None): 
     237         
     238        if not initialized: 
     239                 
     240                result = EE_EngineRemoteConnect(host, port) 
     241                 
     242                CONNECTED = True 
     243         
     244         
     245        eEvent = EE_EmoEngineEventCreate() 
     246        eState = EE_EmoStateCreate() 
     247         
     248         
     249        while KEEP_RUNNING: 
     250                 
     251                state = EE_EngineGetNextEvent(eEvent) 
     252                 
     253                # New event needs to be handled 
     254                if (state == EDK_ERROR_CODES['EDK_OK']): 
     255                         
     256                        eventType = EE_EmoEngineEventGetType(eEvent) 
     257                        #EE_EmoEngineEventGetUserId(eEvent, &userID) 
     258                         
     259                        # Log the EmoState if it has been updated 
     260                        if (eventType == EE_Event['EE_EmoStateUpdated']): 
     261                         
     262                                result = EE_EmoEngineEventGetEmoState(eEvent, eState) 
     263                                 
     264                                packet = {} 
     265                                 
     266                                packet['timestamp'] = time.time() 
     267                                 
     268                                # Headset Status 
     269                                time_from_start = ES_GetTimeFromStart(eState) 
     270                                headset_on = (ES_GetHeadsetOn(eState)) 
     271                                contact_number_of_quality_channels = ES_GetNumContactQualityChannels(eState) 
     272                                #contact_quality_from_all_channels = ES_GetContactQualityFromAllChannels(eState) 
     273                                wireless_signal_status = ES_GetWirelessSignalStatus(eState) 
     274                                #battery = ES_GetBatteryChargeLevel(eState) 
     275                                 
     276                                packet['emotivStatus'] = {} 
     277                                packet['emotivStatus']['timeFromStart'] = time_from_start 
     278                                packet['emotivStatus']['headsetOn'] = headset_on 
     279                                packet['emotivStatus']['contactNumberOfQualityChannels'] = contact_number_of_quality_channels 
     280                                #packet['emotiv_status']['contact_quality_from_all_channels'] = contact_quality_from_all_channels 
     281                                packet['emotivStatus']['wireless'] = wireless_signal_status 
     282                                #packet['emotiv_status']['battery'] = battery 
     283                                 
     284                                 
     285                                # Expressiv Suite 
     286                                packet['expressiv'] = {} 
     287                                packet['expressiv']['currentAction'] = EE_ExpressivEventGetType(eState) 
     288                                 
     289                                 
     290                                # Affectiv Suite 
     291                                excitement = ES_AffectivGetExcitementShortTermScore(eState) 
     292                                excitement_long_term = ES_AffectivGetExcitementLongTermScore(eState) 
     293                                meditation = ES_AffectivGetMeditationScore(eState) 
     294                                frustration = ES_AffectivGetFrustrationScore(eState) 
     295                                engagement_boredom = ES_AffectivGetEngagementBoredomScore(eState) 
     296                                 
     297                                packet['affectiv'] = {} 
     298                                packet['affectiv']['excitement'] = excitement 
     299                                packet['affectiv']['longTermExcitement'] = excitement_long_term 
     300                                packet['affectiv']['meditation'] = meditation 
     301                                packet['affectiv']['frustration'] = frustration 
     302                                packet['affectiv']['engagementBoredom'] = engagement_boredom 
     303                                 
     304                                 
     305                                # Cognitiv Suite 
     306                                current_action = ES_CognitivGetCurrentAction(eState) 
     307                                current_action_power = ES_CognitivGetCurrentActionPower(eState) 
     308                                 
     309                                packet['cognitiv'] = {} 
     310                                packet['cognitiv']['currentAction'] = current_action 
     311                                packet['cognitiv']['currentActionPower'] = current_action_power 
     312                                 
     313                                 
     314                                if DEBUG > 2: 
     315                                        printPacket(packet) 
     316                                 
     317                                 
     318                                # Pass the packet up to the parent object 
     319                                if parent != None: 
     320                                        parent.processPacketEmotiv(packet) 
     321                 
     322                 
     323                time.sleep(MINIMUM_SLEEP_BETWEEN_PACKETS) 
     324         
     325         
     326        # no longer "KEEP_RUNNING" 
     327         
     328        if DEBUG: 
     329                print "INFO [Synapse:Emotiv:Protocol] Disconnecting from Emotiv Engine" 
     330         
     331        result = EE_EngineDisconnect() 
     332        EE_EmoStateFree(eState) 
     333        EE_EmoEngineEventFree(eEvent) 
     334         
     335        CONNECTED = False 
     336 
     337 
     338##################################################################### 
     339# Main 
     340##################################################################### 
     341 
     342if __name__ == '__main__': 
     343        start() 
     344}}} 
     345}}}