﻿//The following code can be used to receive pose data from udp_emitter.py and use it to track an object in unity

using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class udp_tracked_object : MonoBehaviour {
    Thread receiveThread;
    UdpClient client;
    private Double[] float_array;
    private int port = 8051;

    // Use this for initialization
    void Start () {
        float_array = new Double[7];
        receiveThread = new Thread(new ThreadStart(ReceiveData));
        receiveThread.IsBackground = true;
        receiveThread.Start();
    }
	
	// Update is called once per frame
	void Update () {
        transform.position = new Vector3((float) float_array[0], (float)float_array[1], (float)float_array[2]);
        transform.rotation = new Quaternion((float)float_array[3], (float)float_array[4], (float)float_array[5], (float)float_array[6]);
	}

    void OnApplicationQuit()
    {
        if (receiveThread != null)
            receiveThread.Abort();
        client.Close();
    }

    // receive thread
    private void ReceiveData()
    {
        port = 8051;
        client = new UdpClient(port);
        print("Starting Server");
        while (true)
        {
            try
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = client.Receive(ref anyIP);
                for (int i = 0; i < data.Length; i++)
                    float_array[i] = BitConverter.ToDouble(data, i * 8);
            }
            catch (Exception err)
            {
                print(err.ToString());
            }
        }
    }

}
