public void SendOpenTrackData(OpenTrackData data) { List <Tuple <EndPoint, uint> > clients = new List <Tuple <EndPoint, uint> >(); lock (_client_endpoint_to_client_data) { List <EndPoint> clients_to_remove = new List <EndPoint>(); foreach (var pair in _client_endpoint_to_client_data) { if ((DateTime.UtcNow - pair.Value.last_access_time).TotalSeconds > 5) { clients_to_remove.Add(pair.Key); } else { clients.Add(new Tuple <EndPoint, uint>(pair.Key, pair.Value.last_packet_count++)); } } foreach (var client in clients_to_remove) { _client_endpoint_to_client_data.Remove(client); } } foreach (var client in clients) { SendPadDataResponse(client.Item1, client.Item2, data); } }
private void ReceiveOpenTrackPacket(OpenTrackData data) { if (_dsu_server == null) { Console.WriteLine($"OpenTrack debugging...Position: [{data.x}, {data.y}, {data.z}], Rotation: [{data.yaw}°, {data.pitch}°, {data.roll}°]"); } else { _dsu_server.SendOpenTrackData(data); } }
private void SendPadDataResponse(EndPoint client_endpoint, uint packet_number, OpenTrackData data) { ushort message_size = (ushort)(OutputControllerInformation.size + OutputControllerData.size); byte[] output = new byte[Header.size + message_size]; Header header = new Header(); header.identifier = "DSUS"; header.protocol_version = max_protocol_version_supported; header.packet_size = (ushort)(message_size + 4); // Message type is not part of the header header.client_id = _server_id; header.message_type = (uint)MessageType.PadDataResponse; WriteHeader(ref output, header); uint index = Header.size; OutputControllerInformation controller_information = new OutputControllerInformation(); controller_information.slot = 0; controller_information.slot_state = 2; controller_information.device_model = 2; controller_information.connection_type = 0; controller_information.mac_address = new byte[6]; controller_information.battery_status = 0; WriteControllerInformation(ref output, controller_information, index); index += OutputControllerInformation.size; OutputControllerData controller_data = new OutputControllerData(); controller_data.controller_connected = 1; controller_data.packet_number = packet_number; controller_data.button_data = 0; controller_data.more_button_data = 0; controller_data.share_button = 0; controller_data.ps_button = 0; controller_data.left_stick_x = 128; controller_data.left_stick_y = 128; controller_data.right_stick_x = 128; controller_data.right_stick_y = 128; controller_data.d_pad_left = 0; controller_data.d_pad_down = 0; controller_data.d_pad_right = 0; controller_data.d_pad_up = 0; controller_data.analog_y = 0; controller_data.analog_b = 0; controller_data.analog_a = 0; controller_data.analog_x = 0; controller_data.analog_r1 = 0; controller_data.analog_l1 = 0; controller_data.analog_r2 = 0; controller_data.analog_l2 = 0; controller_data.first_touch = new OutputControllerTouchData(); controller_data.first_touch.is_touch_active = 0; controller_data.first_touch.touch_id = 0; controller_data.first_touch.x_pos = 0; controller_data.first_touch.y_pos = 0; controller_data.second_touch = new OutputControllerTouchData(); controller_data.second_touch.is_touch_active = 0; controller_data.second_touch.touch_id = 0; controller_data.second_touch.x_pos = 0; controller_data.second_touch.y_pos = 0; DateTimeOffset date_time_offset = DateTime.UtcNow; controller_data.motion_timestamp = date_time_offset.ToUnixTimeMilliseconds() * 1000; controller_data.accelerometer_x = (float)data.x; controller_data.accelerometer_y = (float)data.y; controller_data.accelerometer_z = (float)data.z; controller_data.gyro_pitch = (float)data.pitch; controller_data.gyro_yaw = (float)data.yaw; controller_data.gyro_roll = (float)data.roll; WriteControllerData(ref output, controller_data, index); WriteCrc(ref output); try { _socket.SendTo(output, client_endpoint); } catch (SocketException) { } }