private void _messageStream_OnMessageReceived(MessageReader reader) { STCHeader header = (STCHeader)reader.ReadShort(); switch (header) { case STCHeader.RESPONSE_COLOR_FRAME: ResponseColorFrame(reader); break; case STCHeader.RESPONSE_DEPTH_FRAME: ResponseDepthFrame(reader); break; case STCHeader.RESPONSE_BODY_FRAME: ResponseBodyFrame(reader); break; case STCHeader.SEND_ALL_SENSOR_INFO: ReceiveAllSensorInfo(reader); break; case STCHeader.SEND_NEW_SENSOR_INFO: ReceiveNewSensorInfo(reader); break; case STCHeader.SEND_CHANGED_SENSOR_INFO: ReceiveChangedSensorInfo(reader); break; case STCHeader.SEND_TRIGGER_EVENT_DATA: ReceiveTriggerEvent(reader); break; } }
private void _lifeStream_OnMessageReceived(MessageReader reader) { STCHeader header = (STCHeader)reader.ReadShort(); switch (header) { case STCHeader.REQUEST_PLATFORM_TYPE: _sessionId = reader.ReadInt(); MessageWriter message = new MessageWriter(CTSHeader.HELLO_ACK); message.WriteInt(0); _lifeStream.Send(message); break; case STCHeader.REQUEST_PIPE_CONNECTION: string pipeName = reader.ReadString(); _messageStream = new IPCStream(pipeName); _messageStream.OnMessageReceived += _messageStream_OnMessageReceived; _messageStream.OnClientDisconnected += _messageStream_OnClientDisconnected; _messageStream.Send(new MessageWriter(CTSHeader.READY_CONNECTION_ACK)); if (OnLoad != null) { OnLoad.Invoke(); } break; } }
//TCP void lifeStream_OnMessageReceived(MessageReader reader) { //서버로부터 받는 헤더를 읽습니다. STCHeader header = (STCHeader)reader.ReadShort(); switch (header) { case STCHeader.REQUEST_DEVICE_KIND_TCP: sessionId = reader.ReadInt(); //서버로 Device ID를 보냅니다. MessageWriter message = new MessageWriter(CTSHeader.SEND_DEVICE_KIND_TCP); message.WriteInt(0); lifeStream.Send(message); break; case STCHeader.SEND_PIPE_CONNECT_TCP: try { //IPC 파이프의 이름을 받아옵니다. string pipeName = reader.ReadString(); pipeClient_stc = new NamedPipeClient_In(pipeName + "_stc", this); //Server to Client 파이프를 만듬 pipeClient_cts = new NamedPipeClient_Out(pipeName + "_cts", this); //Client to Server 파이프를 만듬 //메세지를 보내고 받기 위한 스트림을 생성. pipeStream_Get = new IPCStream_In(pipeClient_stc, this); pipeStream_Send = new IPCStream_Out(pipeClient_cts, this); //IPC 메세지를 받았을 때 이벤트 등록 pipeStream_Get.OnMessageReceived += pipeStream_Get_OnMessageReceived; pipeClient_stc.Start(); //데이터 받기 시작 pipeClient_cts.Start(); //데이터 보내기 시작 //파이프 연결 성공했다고 보냄 pipeStream_Send.Send(new MessageWriter(CTSHeader.SEND_PIPE_CONNECT_COMPLETE)); //연결되었다고 해줌. isConnected = true; } catch (Exception e) { Console.WriteLine(e.Message); } break; } }
public MessageWriter(STCHeader pHeader) { _buffer = new MemoryStream(0); _binWriter = new BinaryWriter(_buffer, Encoding.Default); WriteShort((short)pHeader); }
//IPC void pipeStream_Get_OnMessageReceived(MessageReader reader) { int sensorID; bool isCreated; string mappedName; NuiSensor sensor = null; STCHeader header = (STCHeader)reader.ReadShort(); switch (header) { #region Channel Making case STCHeader.SEND_COLORFRAME_SM_NAME: sensorID = reader.ReadInt(); isCreated = reader.ReadBool(); if (connectedSensors.ContainsKey(sensorID) == false) { return; } sensor = connectedSensors[sensorID]; if (!isCreated) //생성실패 { sensor.OpenColorFrameCallback(false, null); return; } mappedName = reader.ReadString(); //[수정요망] 맨 뒤쪽 channel 지금은 4로 강제해놓음. sensor.OpenColorFrameCallback(true, new ColorChannel(mappedName, sensor)); break; case STCHeader.SEND_DEPTHFRAME_SM_NAME: sensorID = reader.ReadInt(); isCreated = reader.ReadBool(); if (connectedSensors.ContainsKey(sensorID) == false) { return; } sensor = connectedSensors[sensorID]; if (!isCreated) //생성실패 { sensor.OpenDepthFrameCallback(false, null); return; } mappedName = reader.ReadString(); sensor.OpenDepthFrameCallback(true, new DepthChannel(mappedName, sensor)); break; case STCHeader.SEND_BODY_SM_NAME: sensorID = reader.ReadInt(); isCreated = reader.ReadBool(); if (connectedSensors.ContainsKey(sensorID) == false) { return; } sensor = connectedSensors[sensorID]; if (!isCreated) //생성실패 { sensor.OpenColorFrameCallback(false, null); return; } mappedName = reader.ReadString(); sensor.OpenBodyFrameCallback(true, new BodyChannel(mappedName, sensor)); break; #endregion #region Sensor Datas //모든 센서 정보 보냄(처음에) case STCHeader.SEND_ALL_SENSOR_INFO: int sensorCount = reader.ReadInt(); for (int i = 0; i < sensorCount; i++) { sensor = MakeSensor(reader); } break; //새로 연결된 센서 정보 보냄 case STCHeader.SEND_NEW_SENSOR_INFO: sensor = MakeSensor(reader); break; //state가 바뀐 센서 정보 보냄(여기서 삭제도 함. case STCHeader.SEND_SENSOR_STATE: int id = reader.ReadInt(); SensorState state = (SensorState)reader.ReadInt(); if (connectedSensors.ContainsKey(id)) { sensor = connectedSensors[id]; sensor.state = state; if (state == SensorState.UNKNOWN) { sensor.DisconnectedCallback(); connectedSensors.Remove(id); if (OnSensorDisconnected != null) { Queue_Event(OnSensorDisconnected, sensor); } } } break; case STCHeader.SEND_TRIGGER_EVENT_DATA: ReceiveTriggerEvent(reader); break; #endregion } }