private bool ConnectTo(EndPoint endpoint) { m_ConnectionStage = CONNECTION_STAGE.CS_CONNECTING; try { m_Socket.Connect(endpoint); if (m_Socket.Connected) { m_ConnectionStage = CONNECTION_STAGE.CS_CONNECTED; if (ConnectionStateChanged != null) { ConnectionStateChanged.Invoke(this, (int)GARANT_EEG_DEVICE_CONNECTION_STATE.DCS_NO_ERROR); } StartRecv(); } else { m_ConnectionStage = CONNECTION_STAGE.CS_CONNECTION_ERROR; if (ConnectionStateChanged != null) { ConnectionStateChanged.Invoke(this, (int)GARANT_EEG_DEVICE_CONNECTION_STATE.DCS_HOST_NOT_REACHED); } } } catch (SocketException e) { m_ConnectionStage = CONNECTION_STAGE.CS_CONNECTION_ERROR; if (ConnectionStateChanged != null) { ConnectionStateChanged.Invoke(this, (int)GARANT_EEG_DEVICE_CONNECTION_STATE.DCS_HOST_NOT_REACHED); } return(false); } return(m_ConnectionStage == CONNECTION_STAGE.CS_CONNECTED); }
/** * @brief Stop Остановить работу с устройством */ public void Stop() { if (!m_Started) { return; } StopRecord(); m_Started = false; m_TranslationPaused = false; m_Socket.Shutdown(SocketShutdown.Both); m_ConnectionStage = CONNECTION_STAGE.CS_NONE; m_HeaderData = null; m_PrevData = null; m_RecvBuffer = null; m_PacketBuffer = null; m_FileWriteBuffer = null; m_Socket = null; }
/** * @brief Start Функция старта работы с устройством * @param waitForConnection Ожидать ли подключения или подключиться к оборудованию в асинхронном режиме * @param rate Частота работы устройства (250/500/1000) * @param host IP-адрес для подключения * @param port Порт для подключения * @return true если подключено (или подключение началось, для асинхронного режима) */ public bool Start(bool waitForConnection = true, int rate = 500, string host = "192.168.127.125", int port = 12345) { if (m_Started || m_ConnectionStage == CONNECTION_STAGE.CS_CONNECTED) { return(true); } else if (m_ConnectionStage == CONNECTION_STAGE.CS_CONNECTING) { return(false); } IPAddress address = ResolveIP(host); if (address == null) { return(false); } m_ConnectionStage = CONNECTION_STAGE.CS_NONE; m_Started = false; m_Recording = false; m_RecordPaused = false; m_TranslationPaused = false; m_Rate = rate; switch (m_Rate) { case 250: { DATA_SIZE = 765; break; } case 500: { DATA_SIZE = 1365; break; } case 1000: { DATA_SIZE = 2565; break; } default: break; } WRITE_FILE_BUFFER_SIZE = DATA_SIZE * 10 * 30; //10 - count of records per second, 30 seconds record m_Host = host; m_Port = port; m_NTPMessage = ""; m_SendBuffer = ""; m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { ReceiveBufferSize = BUFF_SIZE, SendBufferSize = BUFF_SIZE }; m_Socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 1); m_HeaderData = new List <byte>(); m_PrevData = new List <byte>(); m_RecvBuffer = new byte[BUFF_SIZE]; m_PacketBuffer = new List <byte>(); m_FileWriteBuffer = new List <byte>(); m_Socket.ReceiveTimeout = -1; m_Socket.SendTimeout = -1; IPEndPoint endpoint = new IPEndPoint(address, port); if (waitForConnection) { m_Started = ConnectTo(endpoint); if (m_Started) { SendPacket(string.Format("start -protect eeg.rate {0}\r\n", m_Rate)); } } else { Task.Run(() => { m_Started = ConnectTo(endpoint); if (m_Started) { SendPacket(string.Format("start -protect eeg.rate {0}\r\n", m_Rate)); } }); } while (waitForConnection && m_ConnectionStage < CONNECTION_STAGE.CS_CONNECTED) { Thread.Sleep(1); } if (waitForConnection) { return(m_ConnectionStage == CONNECTION_STAGE.CS_CONNECTED); } return(true); }