示例#1
0
文件: main.cpp 项目: ediril/BCI
void GenerateSample( void)
{
  // Increment sample no
  SampleNo++;

  // Fill in spikecount header, assume spike count itself has already been filled, and send it
  MDF_SPM_SPIKECOUNT *sc = (MDF_SPM_SPIKECOUNT*) SpikeCountMessage.GetDataPointer();
  sc->sample_header.DeltaTime = ((double)0.020);
  sc->sample_header.SerialNo = SampleNo;
  sc->sample_header.Flags = 0;
  sc->source_timestamp = LatestSourceTimestamp;
  sc->count_interval = RawCountInterval * ((double)RAW_COUNTS_PER_SAMPLE);
  dragonfly.SendMessage( &SpikeCountMessage);

  MDF_SAMPLE_GENERATED *sg = (MDF_SAMPLE_GENERATED*) SampleGeneratedMessage.GetDataPointer();
  //MDF_SAMPLE_GENERATED sgd;
  //MDF_SAMPLE_GENERATED *sg = &sgd;
  sg->sample_header.DeltaTime = ((double)0.020);
  sg->sample_header.SerialNo = SampleNo;
  sg->sample_header.Flags = 0;
  sg->source_timestamp = LatestSourceTimestamp;
  //SampleGeneratedMessage.SetData( sg, sizeof(MDF_SAMPLE_GENERATED));
  dragonfly.SendMessage( &SampleGeneratedMessage);


  // Update list of active sources
  UpdateActiveSources();

  // Reset count
  ResetCount();

  //PrintCount( SpikeCountData);
}
示例#2
0
void SendLFPs(int nsp_index,double ptime)
{
	//printf("~");
	int buffer_length=0;
	LFPData.GetAndReset(lfpdata, &buffer_length);

	// Fill in the Dragonfly message data struct
	MDF_RAW_CTSDATA sc;
	memset( &sc, 0, sizeof(sc));
	sc.source_index = nsp_index;
	sc.source_timestamp = ptime;

	for( int i = 0; i < ((MAX_SPIKE_CHANS_PER_SOURCE+MAX_ANALOG_CHANS)*LFPSAMPLES_PER_HEARTBEAT); i++)	
	{
		if ( i <= buffer_length)
		{
			sc.data[i] = lfpdata[i];
		}
		else
		{
			sc.data[i] = 0;
		}
	}

	// Send the message
	msg.Set( MT_RAW_CTSDATA, &sc, sizeof(sc));
	dragonfly.SendMessage( &msg);
}
示例#3
0
文件: main.cpp 项目: ediril/BCI
//bool ProcessMessage(RTMA_Module *rtma, CMessage *M)
bool ProcessMessage(Dragonfly_Module *dragonfly, CMessage *M)
{
  bool keep_running = true;
  switch( M->msg_type) {
  case MT_RAW_SPIKECOUNT:
    {
      MDF_RAW_SPIKECOUNT *rc = (MDF_RAW_SPIKECOUNT*) M->GetDataPointer();
      ProcessRawCount( rc);
      //fprintf(stdout,".");
      break;
    }
  case MT_EXIT:
    {
        if ((M->dest_mod_id == 0) || (M->dest_mod_id == dragonfly->GetModuleID()))
        {
            fprintf(stdout,"got exit!\n");
            dragonfly->SendSignal(MT_EXIT_ACK);
            dragonfly->DisconnectFromMMM();
            keep_running = false;
        }
        break;
    }
  case MT_PING:
    {
      char MODULE_NAME[] = "SPM_Combiner";
      MDF_PING *pg = (MDF_PING *) M->GetDataPointer();
      if ( (strcmp(pg->module_name, MODULE_NAME) == 0) || 
           (strcmp(pg->module_name, "*") == 0) ||
           (M->dest_mod_id == dragonfly->GetModuleID()) )
      {
        MDF_PING_ACK *pa = (MDF_PING_ACK *) PingAckMessage.GetDataPointer();
        
        memset(pa,0,sizeof(MDF_PING_ACK));        
        for (int i = 0; i < strlen(MODULE_NAME); i++)
        {
          pa->module_name[i] = MODULE_NAME[i];
        }

        dragonfly->SendMessage( &PingAckMessage);
      }
      
      break;
    }
  }
  fflush(stdout);
  return keep_running;
}
示例#4
0
void SendDigEvents()
{
	Dig_Message_Number--;

	for (int i = 0; i<=Dig_Message_Number; i++)
	{
		// Send the message
		msg.Set( MT_DIGITAL_EVENT, de_msgs[i], sizeof(*de_msgs[i]));
		dragonfly.SendMessage( &msg);
		delete de_msgs[i];
	}

	Dig_Message_Number = 0;
}
示例#5
0
void SendStimSyncEvents()
{
	Sse_Message_Number--;

	for (int i = 0; i<=Sse_Message_Number; i++)
	{
		// Send the message
		msg.Set( MT_STIM_SYNC_EVENT, sse_msgs[i], sizeof(*sse_msgs[i]));
		dragonfly.SendMessage( &msg);
		delete sse_msgs[i];
	}

	Sse_Message_Number = 0;
}
示例#6
0
void SendCounts( double timestamp, unsigned char *count, int num_chans, int nsp_index)
{
	//printf("c");
	// Fill in the Dragonfly message data struct
	MDF_RAW_SPIKECOUNT sc;
	memset( &sc, 0, sizeof(sc));
	sc.source_index = nsp_index;
	sc.source_timestamp = timestamp;
	sc.count_interval = CEREBUS_HEARTBEAT_INTERVAL;
	if( num_chans > MAX_TOTAL_SPIKE_CHANS_PER_SOURCE) throw std::exception("SendCounts(): num_chans exceeds MAX_RAW_TOTAL_SPIKE_CHANS");
	for( int i = 0; i < num_chans; i++)	sc.counts[i] = count[i];

	// Send the message
	msg.Set( MT_RAW_SPIKECOUNT, &sc, sizeof(sc));
	dragonfly.SendMessage( &msg);
}
示例#7
0
文件: main.cpp 项目: ediril/BCI
int main(int argc, char *argv[])
{
  // Process command line arguments
  char *config_filename = NULL;
  if( argc > 1) {
	config_filename = argv[1];
  }
  char *mm_ip = NULL;
  if( argc > 2) {
	mm_ip = argv[2];
  }

  static CMessage inMsg;

  Initialize();

  bool try_again = true;
  while(try_again) {
    
    try {	
      fprintf(stdout, "Connecting to Dragonfly\n");
	  if( mm_ip == NULL) dragonfly.ConnectToMMM();
	  else dragonfly.ConnectToMMM(mm_ip);
      dragonfly.Subscribe(MT_EXIT);
      dragonfly.Subscribe(MT_PING);
      dragonfly.Subscribe(MT_RAW_SPIKECOUNT);
      dragonfly.SendModuleReady();
      fprintf(stdout, "Connected to Dragonfly\n");
      ResetCount();
      ResetActiveSources();
      bool keep_running = true;
      while(keep_running) {
		double timeout = .5; // seconds
		bool got_msg = dragonfly.ReadMessage( &inMsg, timeout);
		if( got_msg) {
		  keep_running = ProcessMessage(&dragonfly, &inMsg);
		  if( !keep_running) {
			try_again = false;
			break;
		  }
		} else {
		  //fprintf(stdout, "Waiting for messages\n");
		}
      }
    }
    catch(UPipeClosedException) {
      fprintf(stderr, "Reconnecting to Dragonfly\n");
      Sleep(500); // milliseconds
    }
    catch(UPipeException) {
      fprintf(stderr, "Cannot connect to Dragonfly, waiting to reconnect\n");
      Sleep(500); // milliseconds
    }
  } 
}
示例#8
0
void SendSnippets()
{
	//printf("$");
	if (Overall_Spike_Count == 0)
		Snippet_Message_Number--;

	for (int i = 0; i<=Snippet_Message_Number; i++)
	{
		// Send the message
			msg.Set( MT_SPIKE_SNIPPET, ss_msgs[i], sizeof(*ss_msgs[i]));
			dragonfly.SendMessage( &msg);
			delete ss_msgs[i];
	}

	Overall_Spike_Count = 0;
	Snippet_Message_Number = 0;

}
示例#9
0
void SendRejectedSnippets()
{
	//printf("rs");
	if (Overall_Rejected_Count == 0)
		Rejected_Snippet_Message_Number--;

	for (int i = 0; i<=Rejected_Snippet_Message_Number; i++)
	{
		// Send the message
		//printf("rs");
		msg.Set( MT_REJECTED_SNIPPET, rs_msgs[i], sizeof(*rs_msgs[i]));
		dragonfly.SendMessage( &msg);
		delete rs_msgs[i];
	}

	Overall_Rejected_Count = 0;
	Rejected_Snippet_Message_Number = 0;

}
示例#10
0
void
mexFunction(
	int num_output_args,        // Number of left hand side (output) arguments
	mxArray *output_arg[],      // Array of left hand side arguments
	int num_input_args,         // Number of right hand side (input) arguments
	const mxArray *input_arg[]) // Array of right hand side arguments
{
	int opcode;
    
    MODULE_ID ModuleID, DestModID;
    HOST_ID DestHostID;
    short *HostAddress_raw;
    char HostAddress[MAX_HOST_ADDR_LENGTH];
    int HostAddressLength = 0;
    MSG_TYPE MessageType;

	double timeout;
    int status;
	unsigned int SnoozeTime;
    int TimerID;
    int logger_status;

    void *pData;
    int NumDataBytes;

    const mxArray *Template;
    mxArray *ReturnData;
	
	bool try_again;
	double begin_time, end_time, elapsed_time;

    try {
        if( num_input_args < 1) {
            Error( "MatlabDragonfly takes at least 1 argument!");
        }

        //
        // Get the "opcode" argument to determine what needs to be done
        //
        opcode = (int) mxGetScalar( input_arg[0]);


        switch( opcode) {

        case CONNECT_TO_MMM:
            
            if( num_input_args < 4) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                mexPrintf( "Disconnecting...\n");
                TheModule.DisconnectFromMMM();
                mexPrintf( "Re-connecting...\n");
            }
            ModuleID = (MODULE_ID) mxGetScalar( input_arg[1]);
            HostAddressLength = mxGetNumberOfElements( input_arg[2]);
            logger_status = (int) mxGetScalar( input_arg[3]);
            TheModule.InitVariables( ModuleID, 0);
            try{
                if( HostAddressLength > 0) {
                    // Convert unicode matlab string to regular character string
                    if( HostAddressLength > MAX_HOST_ADDR_LENGTH-1) Error( "Server name exceeds maximum allowed length");
                    HostAddress_raw = (short*) mxGetData( input_arg[2]);
                    int i;
                    for( i = 0; i < HostAddressLength; i++) HostAddress[i] = (char) HostAddress_raw[i];
                    HostAddress[i] = 0; // zero-terminate the string
                    status = TheModule.ConnectToMMM( HostAddress, logger_status);
                } else {
                    status = TheModule.ConnectToMMM( logger_status);
                }
            }catch(MyCException &E){
                MyCString err("Failed to connect to MM:");
                E.AppendTraceToString(err);
                Error(err.GetContent());
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case DISCONNECT_FROM_MMM:

            if( num_input_args < 1) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                status = TheModule.DisconnectFromMMM( );
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case SUBSCRIBE:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                status = TheModule.Subscribe( MessageType);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case UNSUBSCRIBE:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                status = TheModule.Unsubscribe( MessageType);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case PAUSE_SUBSCRIPTION:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                status = TheModule.PauseSubscription( MessageType);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case RESUME_SUBSCRIPTION:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                status = TheModule.ResumeSubscription( MessageType);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case SEND_MESSAGE:

            if( num_input_args < 5) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                pData = SerializeData( input_arg[2], &NumDataBytes);
                M.Set( MessageType, pData, NumDataBytes);
                DestModID = (MODULE_ID) mxGetScalar( input_arg[3]);
                DestHostID = (HOST_ID) mxGetScalar( input_arg[4]);
                status = TheModule.SendMessage( &M, DestModID, DestHostID);
                mxFree( pData);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            output_arg[1] = mxCreateDoubleScalar( M.send_time);
            output_arg[2] = mxCreateDoubleScalar( (double) M.msg_count);
            break;

        case SEND_SIGNAL:

            if( num_input_args < 4) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                MessageType = (MSG_TYPE) mxGetScalar( input_arg[1]);
                DestModID = (MODULE_ID) mxGetScalar( input_arg[2]);
                DestHostID = (HOST_ID) mxGetScalar( input_arg[3]);
				M.Set( MessageType);
                status = TheModule.SendMessage( &M, DestModID, DestHostID);
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            output_arg[1] = mxCreateDoubleScalar( M.send_time);
            output_arg[2] = mxCreateDoubleScalar( (double) M.msg_count);
            break;

        case READ_MESSAGE_HDR:

            if( num_input_args < 3) Error( "incorrect number of arguments");
            if( !TheModule.IsConnected( )) {
                output_arg[0] = EmptyMatrix( );
                break;
            }

            timeout = mxGetScalar( input_arg[2]);

			begin_time = GetAbsTime();
			do {
			  try_again = false;
			  try {
				status = TheModule.ReadMessage( &M, timeout);
			  } catch( UPipeSignalException &e) {
				end_time = GetAbsTime();
				elapsed_time = end_time - begin_time;
				timeout = timeout - elapsed_time;
				if( timeout < 0) timeout = 0;
				//mexPrintf("\nSignal caught and ignored!\n");
				try_again = true;
			  }
			} while( try_again);

            if( status > 0) {
                Template = input_arg[1];
                ReturnData = C2Matlab( Template, &M, sizeof(DF_MSG_HEADER));
                output_arg[0] = ReturnData;
            } else {
                output_arg[0] = EmptyMatrix( );
            }
            break;

        case READ_MESSAGE_DATA:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            Template = input_arg[1];
            ReturnData = C2Matlab( Template, M.GetDataPointer(), M.num_data_bytes);
            output_arg[0] = ReturnData;
            break;

        case SET_TIMER:

            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                SnoozeTime = (unsigned int) mxGetScalar( input_arg[1]);
                TimerID = TheModule.SetTimer( SnoozeTime);
            } else {
                TimerID = -1;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) TimerID);
            break;

        case CANCEL_TIMER:
            if( num_input_args < 2) Error( "incorrect number of arguments");
            if( TheModule.IsConnected( )) {
                TimerID = (unsigned int) mxGetScalar( input_arg[1]);
                status = TheModule.CancelTimer( TimerID);
            } else {
                status = -1;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;

        case SEND_MODULE_READY:
            if( TheModule.IsConnected( )) {
                status = TheModule.SendModuleReady( );
            } else {
                status = 0;
            }
            output_arg[0] = mxCreateDoubleScalar( (double) status);
            break;
            
        case GET_TIME:
            output_arg[0] = mxCreateDoubleScalar( GetAbsTime());
            break;

        case GET_MODULE_ID:
            output_arg[0] = mxCreateDoubleScalar( TheModule.GetModuleID());
            break;
            
        default:
            Error( "Invalid opcode");
        }
    } catch( MyCException &e) {
        MyCString S;
        e.AppendTraceToString( S);
        char *s = S.GetContent( );
        Error( s);
    }
} // mexFunction
示例#11
0
// This program takes 3 commandline arguments:
// - IP of network interface that the NSP is connected to
// - Zero-based numeric ID of the NSP (i.e. 0 for the first box, 1 for the second etc)
//   If you specify a string that is not an integer number then it will the default value 0 will be applied
//   This ID will be used in outgoing packets to identify which NSP the information is coming from
// - IP of the Message Manager
// For example, the following command
// SPM_Cerebus 192.168.137.4 3 192.168.2.74
// will connect to the NSP on the network interface 192.168.137.4, it will label
// spike count messages with the ID 3, and will connect to message manager at 192.168.2.74
// If the arguments are omitted, then default values will be applied
int main( int argc, char *argv[])
{
	try {
		// Process command line arguments
		char *nsp_ip = NULL;
		if( argc > 1) {
			nsp_ip = argv[1];
		}
		int nsp_index = 0;
		if( argc > 2) {
			nsp_index = atoi( argv[2]);
		}
		char *mm_ip;
		char default_mm_ip[] = DEFAULT_MM_IP;
		if( argc > 3) {
			mm_ip = argv[3];
		}
		if( argc > 4) {
			collect_snippets = atoi( argv[4]);
		}
		if( argc > 5) {
			collect_LFP = atoi(argv[5]);
		}

		int stimSyncBit = -1; // negative value means disconnected
		int stimParamBit = -1;
		if( argc > 6)
			acceptAllDigEvts = atoi(argv[6]);
		if (argc > 7)
			stimSyncBit = atoi(argv[4]);

		if (stimSyncBit > -1)
			stimSyncMask = (1 << stimSyncBit);
		if (stimParamBit > -1)
			stimParamMask = (1 << stimParamBit);		

		printf("collect LFP: %d\n", collect_LFP);

		printf("Connecting to Dragonfly: ");
		// Connect to Dragonfly
		MODULE_ID mod_id = MID_SPM_MOD1 + nsp_index;
		dragonfly.InitVariables( mod_id, 0);
		dragonfly.ConnectToMMM( mm_ip);
		dragonfly.SendModuleReady();
		printf(" done\n");

		// get frequency for high performance timer
		QueryPerformanceFrequency(&frequency);
		double d_bufferPeriod = bufferDelay * frequency.QuadPart;
		bufferPeriod.QuadPart = (LONGLONG)d_bufferPeriod;

		// Run in a loop, reading UDP messages from Cerebus, sending out spike counts to Dragonfly
		CerebusClient client;
		int loop_count = 0;
		Overall_Spike_Count = 0;
		Snippet_Message_Number = 0;
		Overall_Rejected_Count = 0;
		Rejected_Snippet_Message_Number = 0;
		Dig_Message_Number = 0;
		bool keep_running = true;
		double timeout = 1.0; // in units of seconds
		bool got_packet = false;
		bool cerebus_connected = false;
		while( keep_running) {

			//
			// Connect to Cerebus port (unless already connected)
			//
			if( !cerebus_connected) {
				cerebus_connected = client.SetupConnection( nsp_ip);
				if( !cerebus_connected) {
					printf( "Failed to connect to Cerebus port, will continue trying...\n");
				}
			}

			//
			// Read packet from Cerebus (time out after 1 second
			// to make sure we don't keep waiting if Cerebus goes down)
			//
			if( cerebus_connected) {
				Packet *pack = client.ReadPacket( timeout);
				if( pack) {
					ProcessPacket( pack, nsp_index);
					delete pack;
				} else {
					printf( "Timed out while waiting for packets from Cerebus\n");
					cerebus_connected = false;
				}
			}

			// check spike Queue and process spikes
			checkSpikeQueue(nsp_index);

			//
			// Pause if cerebus not connected
			// because otherwise this program will busy-loop
			//
			if( !cerebus_connected) Sleep( 1000);
		} // end while (keep running) 

		
	} catch(UPipeException &e){
		MyCString trace;
		e.AppendTraceToString( trace);
		std::cout << "UPipeException occurred: " << trace.GetContent() << std::endl;
	} catch(MyCException &e){
		MyCString trace;
		e.AppendTraceToString( trace);
		std::cout << "MyCException occurred: " << trace.GetContent() << std::endl;
	} catch(std::exception &e){
		std::cout << "Exception occurred: " << e.what() << std::endl;
	} catch(...){
		std::cout << "Unknown exception occurred!" << std::endl;
	}
		
}
示例#12
0
文件: main.cpp 项目: ediril/BCI
void SendData(int message_type, void *data, unsigned data_size)
{
  static CMessage M;
  M.Set(message_type, data, data_size);
  dragonfly.SendMessage(&M);
}