From 0868ca0b41767de90d9618acb185a3892654d0f2 Mon Sep 17 00:00:00 2001 From: Jimmy Lim Date: Fri, 17 Sep 2021 10:43:06 -0400 Subject: [PATCH] get packages packages --- Assets/Packages.meta | 8 + Assets/Packages/JoyconLib_plugins.meta | 8 + Assets/Packages/JoyconLib_plugins/mac.meta | 9 + .../JoyconLib_plugins/mac/hidapi.bundle.meta | 68 ++ .../mac/hidapi.bundle/Contents.meta | 9 + .../mac/hidapi.bundle/Contents/Info.plist | 42 ++ .../hidapi.bundle/Contents/Info.plist.meta | 8 + .../mac/hidapi.bundle/Contents/MacOS.meta | 9 + .../mac/hidapi.bundle/Contents/MacOS/hidapi | Bin 0 -> 17660 bytes .../hidapi.bundle/Contents/MacOS/hidapi.meta | 8 + Assets/Packages/JoyconLib_plugins/win32.meta | 9 + .../JoyconLib_plugins/win32/hidapi.dll | Bin 0 -> 12288 bytes .../JoyconLib_plugins/win32/hidapi.dll.meta | 80 +++ Assets/Packages/JoyconLib_plugins/win64.meta | 9 + .../JoyconLib_plugins/win64/hidapi.dll | Bin 0 -> 15872 bytes .../JoyconLib_plugins/win64/hidapi.dll.meta | 80 +++ Assets/Packages/JoyconLib_scripts.meta | 8 + Assets/Packages/JoyconLib_scripts/HIDapi.cs | 77 ++ .../Packages/JoyconLib_scripts/HIDapi.cs.meta | 12 + Assets/Packages/JoyconLib_scripts/Joycon.cs | 659 ++++++++++++++++++ .../Packages/JoyconLib_scripts/Joycon.cs.meta | 12 + .../JoyconLib_scripts/JoyconManager.cs | 103 +++ .../JoyconLib_scripts/JoyconManager.cs.meta | 12 + 23 files changed, 1230 insertions(+) create mode 100644 Assets/Packages.meta create mode 100644 Assets/Packages/JoyconLib_plugins.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS.meta create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi create mode 100644 Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi.meta create mode 100644 Assets/Packages/JoyconLib_plugins/win32.meta create mode 100644 Assets/Packages/JoyconLib_plugins/win32/hidapi.dll create mode 100644 Assets/Packages/JoyconLib_plugins/win32/hidapi.dll.meta create mode 100644 Assets/Packages/JoyconLib_plugins/win64.meta create mode 100644 Assets/Packages/JoyconLib_plugins/win64/hidapi.dll create mode 100644 Assets/Packages/JoyconLib_plugins/win64/hidapi.dll.meta create mode 100644 Assets/Packages/JoyconLib_scripts.meta create mode 100644 Assets/Packages/JoyconLib_scripts/HIDapi.cs create mode 100644 Assets/Packages/JoyconLib_scripts/HIDapi.cs.meta create mode 100644 Assets/Packages/JoyconLib_scripts/Joycon.cs create mode 100644 Assets/Packages/JoyconLib_scripts/Joycon.cs.meta create mode 100644 Assets/Packages/JoyconLib_scripts/JoyconManager.cs create mode 100644 Assets/Packages/JoyconLib_scripts/JoyconManager.cs.meta diff --git a/Assets/Packages.meta b/Assets/Packages.meta new file mode 100644 index 0000000..ad993ff --- /dev/null +++ b/Assets/Packages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 977c5076cce48c44d8c96b2910de7b90 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins.meta b/Assets/Packages/JoyconLib_plugins.meta new file mode 100644 index 0000000..680f4ea --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d4993fbb6035f5f429e2a832337013cf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac.meta b/Assets/Packages/JoyconLib_plugins/mac.meta new file mode 100644 index 0000000..5d11c21 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 15f0825d2ef934df2922bed07a85c87d +folderAsset: yes +timeCreated: 1428351278 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle.meta b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle.meta new file mode 100644 index 0000000..fbd2c5e --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: f735e311710bf4dff9c88fc40dde6fc8 +folderAsset: yes +timeCreated: 1440740276 +licenseType: Free +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Android: + enabled: 0 + settings: + CPU: AnyCPU + Any: + enabled: 1 + settings: {} + Editor: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: OSX + Linux: + enabled: 0 + settings: + CPU: x86 + Linux64: + enabled: 0 + settings: + CPU: x86_64 + LinuxUniversal: + enabled: 0 + settings: + CPU: None + OSXIntel: + enabled: 1 + settings: + CPU: AnyCPU + OSXIntel64: + enabled: 1 + settings: + CPU: AnyCPU + OSXUniversal: + enabled: 1 + settings: + CPU: AnyCPU + SamsungTV: + enabled: 0 + settings: + STV_MODEL: STANDARD_13 + Win: + enabled: 0 + settings: + CPU: AnyCPU + Win64: + enabled: 0 + settings: + CPU: AnyCPU + iOS: + enabled: 0 + settings: + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents.meta b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents.meta new file mode 100644 index 0000000..64a8127 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 82e3be018a2c848249d81909ca06aecb +folderAsset: yes +timeCreated: 1440740276 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist new file mode 100644 index 0000000..faea747 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist @@ -0,0 +1,42 @@ + + + + + BuildMachineOSBuild + 14F27 + CFBundleDevelopmentRegion + en + CFBundleExecutable + hidapi + CFBundleIdentifier + com.signal11.hidapi + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + hidapi + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 6E35b + DTPlatformVersion + GM + DTSDKBuild + 14D125 + DTSDKName + macosx10.10 + DTXcode + 0640 + DTXcodeBuild + 6E35b + NSHumanReadableCopyright + Copyright © 2015 signal11. All rights reserved. + + diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist.meta b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist.meta new file mode 100644 index 0000000..c56cd35 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/Info.plist.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f5358b3db23a49fbba414e2930f127e +timeCreated: 1440740277 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS.meta b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS.meta new file mode 100644 index 0000000..38a3eea --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bf449f9900e31488980ab02b943a91e4 +folderAsset: yes +timeCreated: 1440740277 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi new file mode 100644 index 0000000000000000000000000000000000000000..9f6ab9f26d2792aad1c0b0b53301b7a736e37bf1 GIT binary patch literal 17660 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 literal 0 HcmV?d00001 diff --git a/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi.meta b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi.meta new file mode 100644 index 0000000..58465e7 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/mac/hidapi.bundle/Contents/MacOS/hidapi.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 175018180ed414521b0d47d393f347df +timeCreated: 1440740277 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/win32.meta b/Assets/Packages/JoyconLib_plugins/win32.meta new file mode 100644 index 0000000..f61fe57 --- /dev/null +++ b/Assets/Packages/JoyconLib_plugins/win32.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 343916bd94f865c4588899b9beb2ed4b +folderAsset: yes +timeCreated: 1428204712 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_plugins/win32/hidapi.dll b/Assets/Packages/JoyconLib_plugins/win32/hidapi.dll new file mode 100644 index 0000000000000000000000000000000000000000..7f9a6dc8f67d67de8086e3a3a1a33a5dda7c4c00 GIT binary patch literal 12288 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 max) return max; + return x; + } + public byte[] GetData() + { + + byte[] rumble_data = new byte[8]; + l_f = clamp(l_f, 40.875885f, 626.286133f); + amp = clamp(amp, 0.0f, 1.0f); + h_f = clamp(h_f, 81.75177f, 1252.572266f); + UInt16 hf = (UInt16)((Mathf.Round(32f * Mathf.Log(h_f * 0.1f, 2)) - 0x60) * 4); + byte lf = (byte)(Mathf.Round(32f * Mathf.Log(l_f * 0.1f, 2)) - 0x40); + byte hf_amp; + if (amp == 0) hf_amp = 0; + else if (amp < 0.117) hf_amp = (byte)(((Mathf.Log(amp * 1000, 2) * 32) - 0x60) / (5 - Mathf.Pow(amp, 2)) - 1); + else if (amp < 0.23) hf_amp = (byte)(((Mathf.Log(amp * 1000, 2) * 32) - 0x60) - 0x5c); + else hf_amp = (byte)((((Mathf.Log(amp * 1000, 2) * 32) - 0x60) * 2) - 0xf6); + + UInt16 lf_amp = (UInt16)(Mathf.Round(hf_amp) * .5); + byte parity = (byte)(lf_amp % 2); + if (parity > 0) + { + --lf_amp; + } + + lf_amp = (UInt16)(lf_amp >> 1); + lf_amp += 0x40; + if (parity > 0) lf_amp |= 0x8000; + rumble_data = new byte[8]; + rumble_data[0] = (byte)(hf & 0xff); + rumble_data[1] = (byte)((hf >> 8) & 0xff); + rumble_data[2] = lf; + rumble_data[1] += hf_amp; + rumble_data[2] += (byte)((lf_amp >> 8) & 0xff); + rumble_data[3] += (byte)(lf_amp & 0xff); + for (int i = 0; i < 4; ++i) + { + rumble_data[4 + i] = rumble_data[i]; + } + //Debug.Log(string.Format("Encoded hex freq: {0:X2}", encoded_hex_freq)); + //Debug.Log(string.Format("lf_amp: {0:X4}", lf_amp)); + //Debug.Log(string.Format("hf_amp: {0:X2}", hf_amp)); + //Debug.Log(string.Format("l_f: {0:F}", l_f)); + //Debug.Log(string.Format("hf: {0:X4}", hf)); + //Debug.Log(string.Format("lf: {0:X2}", lf)); + return rumble_data; + } + } + private Queue reports = new Queue(); + private Rumble rumble_obj; + + private byte global_count = 0; + private string debug_str; + + public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left) + { + handle = handle_; + imu_enabled = imu; + do_localize = localize; + rumble_obj = new Rumble(160, 320, 0); + filterweight = alpha; + isLeft = left; + } + public void DebugPrint(String s, DebugType d) + { + if (debug_type == DebugType.NONE) return; + if (d == DebugType.ALL || d == debug_type || debug_type == DebugType.ALL) + { + Debug.Log(s); + } + } + public bool GetButtonDown(Button b) + { + bool value = buttons_down[(int) b]; + buttons_down[(int) b] = false; + return value; + } + public bool GetButton(Button b) + { + return buttons[(int)b]; + } + public bool GetButtonUp(Button b) + { + return buttons_up[(int)b]; + } + public float[] GetStick() + { + return stick; + } + public Vector3 GetGyro() + { + return gyr_g; + } + public Vector3 GetAccel() + { + return acc_g; + } + public Quaternion GetVector() + { + Vector3 v1 = new Vector3(j_b.x, -k_b.x, i_b.x); + Vector3 v2 = new Vector3(j_b.z, -k_b.z, i_b.z); + if (v2 != Vector3.zero){ + return Quaternion.LookRotation(v1, v2); + }else{ + return Quaternion.identity; + } + } + public int Attach(byte leds_ = 0x0) + { + state = state_.ATTACHED; + byte[] a = { 0x0 }; + // Input report mode + Subcommand(0x3, new byte[] { 0x3f }, 1, false); + a[0] = 0x1; + dump_calibration_data(); + // Connect + a[0] = 0x01; + Subcommand(0x1, a, 1); + a[0] = 0x02; + Subcommand(0x1, a, 1); + a[0] = 0x03; + Subcommand(0x1, a, 1); + a[0] = leds_; + Subcommand(0x30, a, 1); + Subcommand(0x40, new byte[] { (imu_enabled ? (byte)0x1 : (byte)0x0) }, 1, true); + Subcommand(0x3, new byte[] { 0x30 }, 1, true); + Subcommand(0x48, new byte[] { 0x1 }, 1, true); + DebugPrint("Done with init.", DebugType.COMMS); + return 0; + } + public void SetFilterCoeff(float a) + { + filterweight = a; + } + public void Detach() + { + stop_polling = true; + PrintArray(max, format: "Max {0:S}", d: DebugType.IMU); + PrintArray(sum, format: "Sum {0:S}", d: DebugType.IMU); + if (state > state_.NO_JOYCONS) + { + Subcommand(0x30, new byte[] { 0x0 }, 1); + Subcommand(0x40, new byte[] { 0x0 }, 1); + Subcommand(0x48, new byte[] { 0x0 }, 1); + Subcommand(0x3, new byte[] { 0x3f }, 1); + } + if (state > state_.DROPPED) + { + HIDapi.hid_close(handle); + } + state = state_.NOT_ATTACHED; + } + private byte ts_en; + private byte ts_de; + private System.DateTime ts_prev; + private int ReceiveRaw() + { + if (handle == IntPtr.Zero) return -2; + HIDapi.hid_set_nonblocking(handle, 0); + byte[] raw_buf = new byte[report_len]; + int ret = HIDapi.hid_read(handle, raw_buf, new UIntPtr(report_len)); + if (ret > 0) + { + lock (reports) + { + reports.Enqueue(new Report(raw_buf, System.DateTime.Now)); + } + if (ts_en == raw_buf[1]) + { + DebugPrint(string.Format("Duplicate timestamp enqueued. TS: {0:X2}", ts_en), DebugType.THREADING); + } + ts_en = raw_buf[1]; + DebugPrint(string.Format("Enqueue. Bytes read: {0:D}. Timestamp: {1:X2}", ret, raw_buf[1]), DebugType.THREADING); + } + return ret; + } + private Thread PollThreadObj; + private void Poll() + { + int attempts = 0; + while (!stop_polling & state > state_.NO_JOYCONS) + { + SendRumble(rumble_obj.GetData()); + int a = ReceiveRaw(); + a = ReceiveRaw(); + if (a > 0) + { + state = state_.IMU_DATA_OK; + attempts = 0; + } + else if (attempts > 1000) + { + state = state_.DROPPED; + DebugPrint("Connection lost. Is the Joy-Con connected?", DebugType.ALL); + break; + } + else + { + DebugPrint("Pause 5ms", DebugType.THREADING); + Thread.Sleep((Int32)5); + } + ++attempts; + } + DebugPrint("End poll loop.", DebugType.THREADING); + } + float[] max = { 0, 0, 0 }; + float[] sum = { 0, 0, 0 }; + public void Update() + { + if (state > state_.NO_JOYCONS) + { + byte[] report_buf = new byte[report_len]; + while (reports.Count > 0) + { + Report rep; + lock (reports) + { + rep = reports.Dequeue(); + rep.CopyBuffer(report_buf); + } + if (imu_enabled) + { + if (do_localize) + { + ProcessIMU(report_buf); + } + else + { + ExtractIMUValues(report_buf, 0); + } + } + if (ts_de == report_buf[1]) + { + DebugPrint(string.Format("Duplicate timestamp dequeued. TS: {0:X2}", ts_de), DebugType.THREADING); + } + ts_de = report_buf[1]; + //DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:s}. Lag between packets (expect 15ms): {4:s}", + // reports.Count, report_buf[0], report_buf[1], System.DateTime.Now.Subtract(rep.GetTime()), rep.GetTime().Subtract(ts_prev)), DebugType.THREADING); + ts_prev = rep.GetTime(); + } + ProcessButtonsAndStick(report_buf); + if (rumble_obj.timed_rumble) { + if (rumble_obj.t < 0) { + rumble_obj.set_vals (160, 320, 0, 0); + } else { + rumble_obj.t -= Time.deltaTime; + } + } + } + } + private int ProcessButtonsAndStick(byte[] report_buf) + { + if (report_buf[0] == 0x00) return -1; + + stick_raw[0] = report_buf[6 + (isLeft ? 0 : 3)]; + stick_raw[1] = report_buf[7 + (isLeft ? 0 : 3)]; + stick_raw[2] = report_buf[8 + (isLeft ? 0 : 3)]; + + stick_precal[0] = (UInt16)(stick_raw[0] | ((stick_raw[1] & 0xf) << 8)); + stick_precal[1] = (UInt16)((stick_raw[1] >> 4) | (stick_raw[2] << 4)); + stick = CenterSticks(stick_precal); + lock (buttons) + { + lock (down_) + { + for (int i = 0; i < buttons.Length; ++i) + { + down_[i] = buttons[i]; + } + } + buttons[(int)Button.DPAD_DOWN] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x01 : 0x04)) != 0; + buttons[(int)Button.DPAD_RIGHT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x04 : 0x08)) != 0; + buttons[(int)Button.DPAD_UP] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x02 : 0x02)) != 0; + buttons[(int)Button.DPAD_LEFT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x08 : 0x01)) != 0; + buttons[(int)Button.HOME] = ((report_buf[4] & 0x10) != 0); + buttons[(int)Button.MINUS] = ((report_buf[4] & 0x01) != 0); + buttons[(int)Button.PLUS] = ((report_buf[4] & 0x02) != 0); + buttons[(int)Button.STICK] = ((report_buf[4] & (isLeft ? 0x08 : 0x04)) != 0); + buttons[(int)Button.SHOULDER_1] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x40) != 0; + buttons[(int)Button.SHOULDER_2] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x80) != 0; + buttons[(int)Button.SR] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x10) != 0; + buttons[(int)Button.SL] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x20) != 0; + lock (buttons_up) + { + lock (buttons_down) + { + for (int i = 0; i < buttons.Length; ++i) + { + buttons_up[i] = (down_[i] & !buttons[i]); + buttons_down[i] = (!down_[i] & buttons[i]); + } + } + } + } + return 0; + } + private void ExtractIMUValues(byte[] report_buf, int n = 0) + { + gyr_r[0] = (Int16)(report_buf[19 + n * 12] | ((report_buf[20 + n * 12] << 8) & 0xff00)); + gyr_r[1] = (Int16)(report_buf[21 + n * 12] | ((report_buf[22 + n * 12] << 8) & 0xff00)); + gyr_r[2] = (Int16)(report_buf[23 + n * 12] | ((report_buf[24 + n * 12] << 8) & 0xff00)); + acc_r[0] = (Int16)(report_buf[13 + n * 12] | ((report_buf[14 + n * 12] << 8) & 0xff00)); + acc_r[1] = (Int16)(report_buf[15 + n * 12] | ((report_buf[16 + n * 12] << 8) & 0xff00)); + acc_r[2] = (Int16)(report_buf[17 + n * 12] | ((report_buf[18 + n * 12] << 8) & 0xff00)); + for (int i = 0; i < 3; ++i) + { + acc_g[i] = acc_r[i] * 0.00025f; + gyr_g[i] = (gyr_r[i] - gyr_neutral[i]) * 0.00122187695f; + if (Math.Abs(acc_g[i]) > Math.Abs(max[i])) + max[i] = acc_g[i]; + } + } + + private float err; + public Vector3 i_b, j_b, k_b, k_acc; + private Vector3 d_theta; + private Vector3 i_b_; + private Vector3 w_a, w_g; + private Quaternion vec; + + private int ProcessIMU(byte[] report_buf) + { + + // Direction Cosine Matrix method + // http://www.starlino.com/dcm_tutorial.html + + if (!imu_enabled | state < state_.IMU_DATA_OK) + return -1; + + if (report_buf[0] != 0x30) return -1; // no gyro data + + // read raw IMU values + int dt = (report_buf[1] - timestamp); + if (report_buf[1] < timestamp) dt += 0x100; + + for (int n = 0; n < 3; ++n) + { + ExtractIMUValues(report_buf, n); + + float dt_sec = 0.005f * dt; + sum[0] += gyr_g.x * dt_sec; + sum[1] += gyr_g.y * dt_sec; + sum[2] += gyr_g.z * dt_sec; + + if (isLeft) + { + gyr_g.y *= -1; + gyr_g.z *= -1; + acc_g.y *= -1; + acc_g.z *= -1; + } + + if (first_imu_packet) + { + i_b = new Vector3(1, 0, 0); + j_b = new Vector3(0, 1, 0); + k_b = new Vector3(0, 0, 1); + first_imu_packet = false; + } + else + { + k_acc = -Vector3.Normalize(acc_g); + w_a = Vector3.Cross(k_b, k_acc); + w_g = -gyr_g * dt_sec; + d_theta = (filterweight * w_a + w_g) / (1f + filterweight); + k_b += Vector3.Cross(d_theta, k_b); + i_b += Vector3.Cross(d_theta, i_b); + j_b += Vector3.Cross(d_theta, j_b); + //Correction, ensure new axes are orthogonal + err = Vector3.Dot(i_b, j_b) * 0.5f; + i_b_ = Vector3.Normalize(i_b - err * j_b); + j_b = Vector3.Normalize(j_b - err * i_b); + i_b = i_b_; + k_b = Vector3.Cross(i_b, j_b); + } + dt = 1; + } + timestamp = report_buf[1] + 2; + return 0; + } + public void Begin() + { + if (PollThreadObj == null) + { + PollThreadObj = new Thread(new ThreadStart(Poll)); + PollThreadObj.Start(); + } + } + public void Recenter() + { + first_imu_packet = true; + } + private float[] CenterSticks(UInt16[] vals) + { + + float[] s = { 0, 0 }; + for (uint i = 0; i < 2; ++i) + { + float diff = vals[i] - stick_cal[2 + i]; + if (Math.Abs(diff) < deadzone) vals[i] = 0; + else if (diff > 0) // if axis is above center + { + s[i] = diff / stick_cal[i]; + } + else + { + s[i] = diff / stick_cal[4 + i]; + } + } + return s; + } + public void SetRumble(float low_freq, float high_freq, float amp, int time = 0) + { + if (state <= Joycon.state_.ATTACHED) return; + if (rumble_obj.timed_rumble == false || rumble_obj.t < 0) + { + rumble_obj = new Rumble(low_freq, high_freq, amp, time); + } + } + private void SendRumble(byte[] buf) + { + byte[] buf_ = new byte[report_len]; + buf_[0] = 0x10; + buf_[1] = global_count; + if (global_count == 0xf) global_count = 0; + else ++global_count; + Array.Copy(buf, 0, buf_, 2, 8); + PrintArray(buf_, DebugType.RUMBLE, format: "Rumble data sent: {0:S}"); + HIDapi.hid_write(handle, buf_, new UIntPtr(report_len)); + } + private byte[] Subcommand(byte sc, byte[] buf, uint len, bool print = true) + { + byte[] buf_ = new byte[report_len]; + byte[] response = new byte[report_len]; + Array.Copy(default_buf, 0, buf_, 2, 8); + Array.Copy(buf, 0, buf_, 11, len); + buf_[10] = sc; + buf_[1] = global_count; + buf_[0] = 0x1; + if (global_count == 0xf) global_count = 0; + else ++global_count; + if (print) { PrintArray(buf_, DebugType.COMMS, len, 11, "Subcommand 0x" + string.Format("{0:X2}", sc) + " sent. Data: 0x{0:S}"); }; + HIDapi.hid_write(handle, buf_, new UIntPtr(len + 11)); + int res = HIDapi.hid_read_timeout(handle, response, new UIntPtr(report_len), 50); + if (res < 1) DebugPrint("No response.", DebugType.COMMS); + else if (print) { PrintArray(response, DebugType.COMMS, report_len - 1, 1, "Response ID 0x" + string.Format("{0:X2}", response[0]) + ". Data: 0x{0:S}"); } + return response; + } + private void dump_calibration_data() + { + byte[] buf_ = ReadSPI(0x80, (isLeft ? (byte)0x12 : (byte)0x1d), 9); // get user calibration data if possible + bool found = false; + for (int i = 0; i < 9; ++i) + { + if (buf_[i] != 0xff) + { + Debug.Log("Using user stick calibration data."); + found = true; + break; + } + } + if (!found) + { + Debug.Log("Using factory stick calibration data."); + buf_ = ReadSPI(0x60, (isLeft ? (byte)0x3d : (byte)0x46), 9); // get user calibration data if possible + } + stick_cal[isLeft ? 0 : 2] = (UInt16)((buf_[1] << 8) & 0xF00 | buf_[0]); // X Axis Max above center + stick_cal[isLeft ? 1 : 3] = (UInt16)((buf_[2] << 4) | (buf_[1] >> 4)); // Y Axis Max above center + stick_cal[isLeft ? 2 : 4] = (UInt16)((buf_[4] << 8) & 0xF00 | buf_[3]); // X Axis Center + stick_cal[isLeft ? 3 : 5] = (UInt16)((buf_[5] << 4) | (buf_[4] >> 4)); // Y Axis Center + stick_cal[isLeft ? 4 : 0] = (UInt16)((buf_[7] << 8) & 0xF00 | buf_[6]); // X Axis Min below center + stick_cal[isLeft ? 5 : 1] = (UInt16)((buf_[8] << 4) | (buf_[7] >> 4)); // Y Axis Min below center + + PrintArray(stick_cal, len: 6, start: 0, format: "Stick calibration data: {0:S}"); + + buf_ = ReadSPI(0x60, (isLeft ? (byte)0x86 : (byte)0x98), 16); + deadzone = (UInt16)((buf_[4] << 8) & 0xF00 | buf_[3]); + + buf_ = ReadSPI(0x80, 0x34, 10); + gyr_neutral[0] = (Int16)(buf_[0] | ((buf_[1] << 8) & 0xff00)); + gyr_neutral[1] = (Int16)(buf_[2] | ((buf_[3] << 8) & 0xff00)); + gyr_neutral[2] = (Int16)(buf_[4] | ((buf_[5] << 8) & 0xff00)); + PrintArray(gyr_neutral, len: 3, d: DebugType.IMU, format: "User gyro neutral position: {0:S}"); + + // This is an extremely messy way of checking to see whether there is user stick calibration data present, but I've seen conflicting user calibration data on blank Joy-Cons. Worth another look eventually. + if (gyr_neutral[0] + gyr_neutral[1] + gyr_neutral[2] == -3 || Math.Abs(gyr_neutral[0]) > 100 || Math.Abs(gyr_neutral[1]) > 100 || Math.Abs(gyr_neutral[2]) > 100) + { + buf_ = ReadSPI(0x60, 0x29, 10); + gyr_neutral[0] = (Int16)(buf_[3] | ((buf_[4] << 8) & 0xff00)); + gyr_neutral[1] = (Int16)(buf_[5] | ((buf_[6] << 8) & 0xff00)); + gyr_neutral[2] = (Int16)(buf_[7] | ((buf_[8] << 8) & 0xff00)); + PrintArray(gyr_neutral, len: 3, d: DebugType.IMU, format: "Factory gyro neutral position: {0:S}"); + } + } + private byte[] ReadSPI(byte addr1, byte addr2, uint len, bool print = false) + { + byte[] buf = { addr2, addr1, 0x00, 0x00, (byte)len }; + byte[] read_buf = new byte[len]; + byte[] buf_ = new byte[len + 20]; + + for (int i = 0; i < 100; ++i) + { + buf_ = Subcommand(0x10, buf, 5, false); + if (buf_[15] == addr2 && buf_[16] == addr1) + { + break; + } + } + Array.Copy(buf_, 20, read_buf, 0, len); + if (print) PrintArray(read_buf, DebugType.COMMS, len); + return read_buf; + } + private void PrintArray(T[] arr, DebugType d = DebugType.NONE, uint len = 0, uint start = 0, string format = "{0:S}") + { + if (d != debug_type && debug_type != DebugType.ALL) return; + if (len == 0) len = (uint)arr.Length; + string tostr = ""; + for (int i = 0; i < len; ++i) + { + tostr += string.Format((arr[0] is byte) ? "{0:X2} " : ((arr[0] is float) ? "{0:F} " : "{0:D} "), arr[i + start]); + } + DebugPrint(string.Format(format, tostr), d); + } +} diff --git a/Assets/Packages/JoyconLib_scripts/Joycon.cs.meta b/Assets/Packages/JoyconLib_scripts/Joycon.cs.meta new file mode 100644 index 0000000..ba50184 --- /dev/null +++ b/Assets/Packages/JoyconLib_scripts/Joycon.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7b0782e2174ef6146920e09c324cf2d1 +timeCreated: 1506536874 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/JoyconLib_scripts/JoyconManager.cs b/Assets/Packages/JoyconLib_scripts/JoyconManager.cs new file mode 100644 index 0000000..b5bbefc --- /dev/null +++ b/Assets/Packages/JoyconLib_scripts/JoyconManager.cs @@ -0,0 +1,103 @@ +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; +using System; + +public class JoyconManager: MonoBehaviour +{ + + // Settings accessible via Unity + public bool EnableIMU = true; + public bool EnableLocalize = true; + + // Different operating systems either do or don't like the trailing zero + // ReSharper disable InconsistentNaming + private const ushort vendor_id = 0x57e; + private const ushort vendor_id_ = 0x057e; + private const ushort product_l = 0x2006; + private const ushort product_r = 0x2007; + + public List ConnectedJoycons; // Array of all connected Joy-Cons + private static JoyconManager _instance; + + public static JoyconManager Instance => _instance; + + private void Awake() + { + if (_instance != null) Destroy(gameObject); + _instance = this; + + ConnectedJoycons = new List(); + bool isLeft = false; + HIDapi.hid_init(); + + IntPtr ptr = HIDapi.hid_enumerate(vendor_id, 0x0); + IntPtr topPtr = ptr; + + if (ptr == IntPtr.Zero) + { + ptr = HIDapi.hid_enumerate(vendor_id_, 0x0); + if (ptr == IntPtr.Zero) + { + HIDapi.hid_free_enumeration(ptr); + Debug.Log ("No Joy-Cons found!"); + } + } + hid_device_info enumerate; + while (ptr != IntPtr.Zero) { + enumerate = (hid_device_info)Marshal.PtrToStructure (ptr, typeof(hid_device_info)); + + Debug.Log (enumerate.product_id); + if (enumerate.product_id == product_l || enumerate.product_id == product_r) { + if (enumerate.product_id == product_l) { + isLeft = true; + Debug.Log ("Left Joy-Con connected."); + } else if (enumerate.product_id == product_r) { + isLeft = false; + Debug.Log ("Right Joy-Con connected."); + } else { + Debug.Log ("Non Joy-Con input device skipped."); + } + IntPtr handle = HIDapi.hid_open_path (enumerate.path); + HIDapi.hid_set_nonblocking (handle, 1); + ConnectedJoycons.Add (new Joycon (handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft)); + } + ptr = enumerate.next; + } + HIDapi.hid_free_enumeration (topPtr); + } + + private void Start() + { + for (int i = 0; i < ConnectedJoycons.Count; ++i) + { + Debug.Log (i); + Joycon jc = ConnectedJoycons [i]; + byte LEDs = 0x0; + LEDs |= (byte)(0x1 << i); + jc.Attach (LEDs); + jc.Begin (); + } + } + + private void Update() + { + foreach (Joycon joycon in ConnectedJoycons) + { + joycon.Update(); + } + } + + private void OnApplicationQuit() + { + foreach (Joycon joycon in ConnectedJoycons) + { + joycon.Detach (); + } + } + + public Joycon GetJoycon(int index) + { + return ConnectedJoycons[index]; + } +} diff --git a/Assets/Packages/JoyconLib_scripts/JoyconManager.cs.meta b/Assets/Packages/JoyconLib_scripts/JoyconManager.cs.meta new file mode 100644 index 0000000..1c3b23e --- /dev/null +++ b/Assets/Packages/JoyconLib_scripts/JoyconManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 405bad29b2b998c408059182c189d9e9 +timeCreated: 1506535713 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: