You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
374 lines
13 KiB
374 lines
13 KiB
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine; |
|
using UDESDK; |
|
using UnityEngine.UI; |
|
using System.Linq; |
|
using System; |
|
using System.Reflection; |
|
|
|
public class Sample : MonoBehaviour |
|
{ |
|
public static UDE_SDK _SDK = new(); |
|
|
|
public GameObject BlePerfab; |
|
public GameObject Content; |
|
public List<GameObject> DevicePool = new(); |
|
|
|
public Text LogTxt; |
|
public GameObject[] Panels; |
|
|
|
private Action<string, bool> DeviceListener; |
|
|
|
[Header("Finger Joints")] |
|
[Space] |
|
public HandDriver[] handDrivers; |
|
private Transform[] LeftHands; |
|
private Transform[] RightHands; |
|
|
|
public Image[] JoysticksBtn; |
|
private GameObject[] Joysticks; |
|
public Image[] Trackpad; |
|
public Image[] ButtonA; |
|
public Image[] ButtonB; |
|
public Image[] TriggerBtn; |
|
public Image[] GripBtn; |
|
|
|
public Button[] AutoCalibration; |
|
private float time = 0; |
|
|
|
private static string[] TwoDeviceName = new string[2] { "", ""}; |
|
private Color[] ActiveColor = new Color[2] { new(0.4622f, 0.4622f, 0.4622f), new(0.2467f, 0.3565f, 0.6792f) }; |
|
|
|
private UDE_SDK.FingerJointType[] JointOrder = |
|
{ |
|
UDE_SDK.FingerJointType.Thumb1, UDE_SDK.FingerJointType.Thumb2, UDE_SDK.FingerJointType.Thumb3, |
|
UDE_SDK.FingerJointType.Index1, UDE_SDK.FingerJointType.Index2, UDE_SDK.FingerJointType.Index3, |
|
UDE_SDK.FingerJointType.Middle1, UDE_SDK.FingerJointType.Middle2, UDE_SDK.FingerJointType.Middle3, |
|
UDE_SDK.FingerJointType.Ring1, UDE_SDK.FingerJointType.Ring2, UDE_SDK.FingerJointType.Ring3, |
|
UDE_SDK.FingerJointType.Pinky1, UDE_SDK.FingerJointType.Pinky2, UDE_SDK.FingerJointType.Pinky3 |
|
}; |
|
private Dictionary<int, string> TypeToName = new() |
|
{ |
|
{ -1, "A Finish"}, |
|
{ -2, "B Finish"}, |
|
{ 0, "Not Start"}, |
|
{ 1, "A start"}, |
|
{ 2, "B Start"}, |
|
{ 3, "C Start"}, |
|
{ 4, "Completed"} |
|
}; |
|
private Dictionary<UDE_SDK.FingerJointType, Quaternion> LeftHandDefault = new(); |
|
private Dictionary<UDE_SDK.FingerJointType, Quaternion> RightHandDefault = new(); |
|
|
|
// Start is called before the first frame update |
|
void Start() |
|
{ |
|
_SDK.UDE_BleInit(); |
|
_SDK.UDE_BleStartSearching(); |
|
LeftHands = new Transform[15] |
|
{ |
|
handDrivers[0].Thumb1, |
|
handDrivers[0].Thumb2, |
|
handDrivers[0].Thumb3, |
|
handDrivers[0].Index1, |
|
handDrivers[0].Index2, |
|
handDrivers[0].Index3, |
|
handDrivers[0].Middle1, |
|
handDrivers[0].Middle2, |
|
handDrivers[0].Middle3, |
|
handDrivers[0].Ring1, |
|
handDrivers[0].Ring2, |
|
handDrivers[0].Ring3, |
|
handDrivers[0].Pinky1, |
|
handDrivers[0].Pinky2, |
|
handDrivers[0].Pinky3 |
|
}; |
|
|
|
RightHands = new Transform[15] |
|
{ |
|
handDrivers[1].Thumb1, |
|
handDrivers[1].Thumb2, |
|
handDrivers[1].Thumb3, |
|
handDrivers[1].Index1, |
|
handDrivers[1].Index2, |
|
handDrivers[1].Index3, |
|
handDrivers[1].Middle1, |
|
handDrivers[1].Middle2, |
|
handDrivers[1].Middle3, |
|
handDrivers[1].Ring1, |
|
handDrivers[1].Ring2, |
|
handDrivers[1].Ring3, |
|
handDrivers[1].Pinky1, |
|
handDrivers[1].Pinky2, |
|
handDrivers[1].Pinky3 |
|
}; |
|
|
|
for (int i = 0; i < JointOrder.Length; ++i) |
|
{ |
|
LeftHandDefault.Add(JointOrder[i], LeftHands[i].localRotation); |
|
RightHandDefault.Add(JointOrder[i], RightHands[i].localRotation); |
|
} |
|
DeviceListener += DeviceConnectListen; |
|
Joysticks = new GameObject[2] { JoysticksBtn[0].transform.GetChild(0).gameObject, JoysticksBtn[1].transform.GetChild(0).gameObject }; |
|
AutoCalibration[0].onClick.AddListener(() => { StartCoroutine(nameof(CalibrationClockLeft)); }); |
|
AutoCalibration[1].onClick.AddListener(() => { StartCoroutine(nameof(CalibrationClockRight)); }); |
|
Application.targetFrameRate = 100; |
|
} |
|
bool test = false; |
|
public void RefreshList() |
|
{ |
|
var list = _SDK.UDE_GetBleDeviceList(); |
|
if (test) |
|
{ |
|
for(int i = 0;i<list.Count; ++i) |
|
{ |
|
if (DevicePool.Find(gameobj => gameobj.name == list[i]) != null) |
|
{ |
|
continue; |
|
} |
|
if (string.IsNullOrEmpty(list[i])) |
|
{ |
|
return; |
|
} |
|
if (i >= DevicePool.Count) |
|
{ |
|
return; |
|
} |
|
GameObject go = DevicePool[i]; |
|
go.SetActive(true); |
|
go.name = list[i]; |
|
var bleDevice = go.AddComponent<BleDevice>(); |
|
bleDevice.CreateBleDevice(go, list[i], "", DeviceListener); |
|
} |
|
} |
|
else |
|
{ |
|
foreach (var DeviceName in list) |
|
{ |
|
if (DevicePool.Find(gameobj => gameobj.name == DeviceName) != null) |
|
{ |
|
continue; |
|
} |
|
GameObject go = Instantiate(BlePerfab); |
|
go.name = DeviceName; |
|
var bleDevice = go.AddComponent<BleDevice>(); |
|
go.transform.parent = Content.transform; |
|
bleDevice.CreateBleDevice(go, DeviceName, "", DeviceListener); |
|
DevicePool.Add(go); |
|
} |
|
} |
|
|
|
} |
|
bool CalibReady = true; |
|
// Update is called once per frame |
|
void Update() |
|
{ |
|
if(Input.GetKeyDown(KeyCode.F1)) |
|
{ |
|
if (DevicePool.Find(gameobj => gameobj.name == "DeviceName") == null) |
|
{ |
|
GameObject go = Instantiate(BlePerfab); |
|
go.name = "DeviceName"; |
|
var bleDevice = go.AddComponent<BleDevice>(); |
|
go.transform.parent = Content.transform; |
|
bleDevice.CreateBleDevice(go, "DeviceName", "", DeviceListener); |
|
DevicePool.Add(go); |
|
} |
|
} |
|
|
|
LogTxt.text = ""; |
|
foreach (GameObject go in DevicePool) |
|
{ |
|
if(!go.GetComponent<BleDevice>().IsConnected) |
|
{ |
|
continue; |
|
} |
|
string DeviceName = go.name; |
|
if (go.name[^1] == 'L') |
|
{ |
|
TwoDeviceName[0] = go.name; |
|
} |
|
else if (go.name[^1] == 'R') |
|
{ |
|
TwoDeviceName[1] = go.name; |
|
} |
|
_SDK.UDE_RunningDataUpdate(DeviceName); |
|
string msg = " " + string.Join(", ", _SDK.UDE_GetRawAngleData(DeviceName, true).ToArray()); |
|
string msg2 = " " + string.Join(", ", _SDK.UDE_GetRawAngleData(DeviceName).ToArray()); |
|
|
|
LogTxt.text += DeviceName + " [" + TypeToName[(int)_SDK.UDE_GetCalibrationType(DeviceName)] + "] \nRaw Data:" + msg + "\n" + "Angle:" + msg2 + "\n"; |
|
|
|
var DataDict = _SDK.UDE_GetFingerRotations(DeviceName); |
|
if(DataDict == null) |
|
{ |
|
continue; |
|
} |
|
|
|
int index = 0; |
|
foreach(var joint in JointOrder) |
|
{ |
|
if (go.name[^1] == 'L') |
|
{ |
|
LeftHands[index].localRotation = LeftHandDefault[joint]; |
|
LeftHands[index++].Rotate(DataDict[joint]); |
|
} |
|
else if (go.name[^1] == 'R') |
|
{ |
|
RightHands[index].localRotation = RightHandDefault[joint]; |
|
RightHands[index++].Rotate(DataDict[joint]); |
|
} |
|
} |
|
|
|
var ExtraDeviceData = _SDK.UDE_GetInputDeviceData(DeviceName); |
|
index = 0; |
|
if(go.name[^1] == 'R') |
|
{ |
|
index = 1; |
|
} |
|
float joy_x = ExtraDeviceData.joyX; |
|
float joy_y = ExtraDeviceData.joyY; |
|
Joysticks[index].GetComponentInChildren<Text>().text = Math.Round(joy_x, 2) + ", " + Math.Round(joy_y, 2); |
|
Debug.Log($"Joy{index} {joy_x} {joy_y}"); |
|
if (Math.Pow(joy_x, 2) + Math.Pow(joy_y, 2) <= 1) |
|
{ |
|
Joysticks[index].transform.localPosition = new Vector3(64 * joy_x, 64 * joy_y, 0); |
|
} |
|
else |
|
{ |
|
var k = joy_y / joy_x; |
|
var Fix_x = joy_x > 0 ? Math.Sqrt(1 / (1 + Math.Pow(k, 2))) : -Math.Sqrt(1 / (1 + Math.Pow(k, 2))); |
|
var Fix_y = k * Fix_x; |
|
Joysticks[index].transform.localPosition = new Vector3(64 * (float)Fix_x, 64 * (float)Fix_y, 0); |
|
} |
|
JoysticksBtn[index].color = ExtraDeviceData.joyButton ? ActiveColor[1] : ActiveColor[0]; |
|
Trackpad[index].color = ExtraDeviceData.trackpad_touch ? ActiveColor[1] : ActiveColor[0]; |
|
ButtonA[index].color = ExtraDeviceData.aButton ? ActiveColor[1] : ActiveColor[0]; |
|
ButtonB[index].color = ExtraDeviceData.bButton ? ActiveColor[1] : ActiveColor[0]; |
|
TriggerBtn[index].color = ExtraDeviceData.trgButton ? ActiveColor[1] : ActiveColor[0]; |
|
GripBtn[index].color = ExtraDeviceData.grab ? ActiveColor[1] : ActiveColor[0]; |
|
} |
|
} |
|
|
|
public void DeviceConnectListen(string DeviceName, bool state) |
|
{ |
|
string msg = state ? "in connecting" : "disconnected"; |
|
Debug.Log(DeviceName + " is " + msg); |
|
foreach (GameObject go in DevicePool) |
|
{ |
|
if (go.name == DeviceName) |
|
{ |
|
go.GetComponent<BleDevice>().IsConnected = state; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
public void VibrationButtonL(int placeindex) |
|
{ |
|
_SDK.UDE_ControlVibration(TwoDeviceName[0], placeindex, 20, 5); |
|
} |
|
|
|
public void VibrationButtonR(int placeindex) |
|
{ |
|
_SDK.UDE_ControlVibration(TwoDeviceName[1], placeindex, 20, 5); |
|
} |
|
|
|
public void JoystickCenterCalib(int index) |
|
{ |
|
_SDK.UDE_JoystickCenterCalibration(TwoDeviceName[index]); |
|
} |
|
|
|
public void JoystickRangeCalibStart(int index) |
|
{ |
|
_SDK.UDE_JoystickRangeCalibration(TwoDeviceName[index], true); |
|
} |
|
|
|
public void JoystickRangeCalibStop(int index) |
|
{ |
|
_SDK.UDE_JoystickRangeCalibration(TwoDeviceName[index], false); |
|
} |
|
|
|
public void ChangePage() |
|
{ |
|
if (Panels[0].activeSelf) |
|
{ |
|
Panels[0].SetActive(false); |
|
Panels[1].SetActive(true); |
|
} |
|
else |
|
{ |
|
Panels[0].SetActive(true); |
|
Panels[1].SetActive(false); |
|
} |
|
} |
|
|
|
private void OnApplicationQuit() |
|
{ |
|
_SDK.UDE_BleStopSearching(); |
|
} |
|
|
|
private IEnumerator CalibrationClockLeft() |
|
{ |
|
if(time % 3 == 0) |
|
{ |
|
switch (time) |
|
{ |
|
case 0: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Fist, true); |
|
Debug.Log($"{TwoDeviceName[0]} {TwoDeviceName[1]} a start"); |
|
break; |
|
case 3: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Fist, false); |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Adduct, true); |
|
Debug.Log("a fin, b start"); |
|
break; |
|
case 6: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Adduct, false); |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Stretch, true); |
|
Debug.Log("b fin, c start"); |
|
break; |
|
case 9: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[0], UDE_SDK.CalibrationType.Stretch, false); |
|
Debug.Log("all finished"); |
|
time = 0; |
|
yield break; |
|
} |
|
} |
|
yield return new WaitForSeconds(1); |
|
time++; |
|
yield return CalibrationClockLeft(); |
|
} |
|
|
|
private IEnumerator CalibrationClockRight() |
|
{ |
|
if (time % 3 == 0) |
|
{ |
|
switch (time) |
|
{ |
|
case 0: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Fist, true); |
|
Debug.Log($"{TwoDeviceName[0]} {TwoDeviceName[1]} a start"); |
|
break; |
|
case 3: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Fist, false); |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Adduct, true); |
|
Debug.Log("a fin, b start"); |
|
break; |
|
case 6: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Adduct, false); |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Stretch, true); |
|
Debug.Log("b fin, c start"); |
|
break; |
|
case 9: |
|
_SDK.UDE_CalibrationMotionController(TwoDeviceName[1], UDE_SDK.CalibrationType.Stretch, false); |
|
Debug.Log("all finished"); |
|
time = 0; |
|
yield break; |
|
} |
|
} |
|
yield return new WaitForSeconds(1); |
|
time++; |
|
yield return CalibrationClockRight(); |
|
} |
|
}
|
|
|