예제 #1
0
        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);
     }
 }
예제 #3
0
        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)
            {
            }
        }