il2cpp transition (this commit is still in mono)
fix ipc touch not working under il2cpp; fix bat wont start under il2cpp;
This commit is contained in:
parent
92ef73ee3a
commit
d23ae3be82
@ -105,9 +105,9 @@ Material:
|
|||||||
m_Ints: []
|
m_Ints: []
|
||||||
m_Floats:
|
m_Floats:
|
||||||
- _AlphaClip: 0
|
- _AlphaClip: 0
|
||||||
- _Alpha_Brightness: 0.5
|
- _Alpha_Brightness: 0.7
|
||||||
- _Alpha_Contrast: 0.55
|
- _Alpha_Contrast: 1
|
||||||
- _Alpha_Multiplier: 2.68
|
- _Alpha_Multiplier: 2
|
||||||
- _Blend: 0
|
- _Blend: 0
|
||||||
- _BumpScale: 1
|
- _BumpScale: 1
|
||||||
- _ClearCoatMask: 0
|
- _ClearCoatMask: 0
|
||||||
@ -121,7 +121,7 @@ Material:
|
|||||||
- _Fresnel: 1.24
|
- _Fresnel: 1.24
|
||||||
- _Fresnel_1: 5
|
- _Fresnel_1: 5
|
||||||
- _Fresnel_Power: 1
|
- _Fresnel_Power: 1
|
||||||
- _Fresnel_Radius: 0.5
|
- _Fresnel_Radius: 0.65
|
||||||
- _Fresnel_Size: -5
|
- _Fresnel_Size: -5
|
||||||
- _Fresnel_Strength: 1
|
- _Fresnel_Strength: 1
|
||||||
- _GlossMapScale: 0
|
- _GlossMapScale: 0
|
||||||
|
@ -102,7 +102,7 @@ Material:
|
|||||||
- _DetailAlbedoMapScale: 1
|
- _DetailAlbedoMapScale: 1
|
||||||
- _DetailNormalMapScale: 1
|
- _DetailNormalMapScale: 1
|
||||||
- _DstBlend: 0
|
- _DstBlend: 0
|
||||||
- _EmissionStrength: 1.35
|
- _EmissionStrength: 1.25
|
||||||
- _EnvironmentReflections: 1
|
- _EnvironmentReflections: 1
|
||||||
- _GlossMapScale: 1
|
- _GlossMapScale: 1
|
||||||
- _Glossiness: 0
|
- _Glossiness: 0
|
||||||
|
@ -684,7 +684,7 @@ Transform:
|
|||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 13
|
m_RootOrder: 14
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!65 &89868841
|
--- !u!65 &89868841
|
||||||
BoxCollider:
|
BoxCollider:
|
||||||
@ -3775,7 +3775,7 @@ Transform:
|
|||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 16
|
m_RootOrder: 17
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!65 &487003802
|
--- !u!65 &487003802
|
||||||
BoxCollider:
|
BoxCollider:
|
||||||
@ -6479,13 +6479,13 @@ Transform:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 728980769}
|
m_GameObject: {fileID: 728980769}
|
||||||
m_LocalRotation: {x: -0, y: 1, z: -0, w: 0}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 0.0421, y: 1.0341, z: -0.055}
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1}
|
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 12
|
m_RootOrder: 13
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!65 &732294716
|
--- !u!65 &732294716
|
||||||
BoxCollider:
|
BoxCollider:
|
||||||
@ -7744,7 +7744,7 @@ Transform:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 910165456}
|
m_GameObject: {fileID: 910165456}
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 1.6783333, y: 1.6758862, z: 2.988133}
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
@ -11397,6 +11397,50 @@ MeshCollider:
|
|||||||
m_Convex: 0
|
m_Convex: 0
|
||||||
m_CookingOptions: 30
|
m_CookingOptions: 30
|
||||||
m_Mesh: {fileID: -4216441611952776256, guid: cf8684b3c4f47b94aa7cb23ce498caf3, type: 3}
|
m_Mesh: {fileID: -4216441611952776256, guid: cf8684b3c4f47b94aa7cb23ce498caf3, type: 3}
|
||||||
|
--- !u!1 &1213404430
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1213404432}
|
||||||
|
- component: {fileID: 1213404431}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: SerialManager
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &1213404431
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1213404430}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 11a72a89f00d44f45a354a22a3e862d5, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
--- !u!4 &1213404432
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1213404430}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_RootOrder: 11
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!114 &1216452012
|
--- !u!114 &1216452012
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -12493,14 +12537,14 @@ Transform:
|
|||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1251312950}
|
m_GameObject: {fileID: 1251312950}
|
||||||
m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: 0, y: 0.95, z: -0.524}
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 0.15, y: 0, z: 0.005}
|
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 11
|
m_RootOrder: 12
|
||||||
m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1257458054 stripped
|
--- !u!1 &1257458054 stripped
|
||||||
GameObject:
|
GameObject:
|
||||||
m_CorrespondingSourceObject: {fileID: -9179824638859959421, guid: cf8684b3c4f47b94aa7cb23ce498caf3,
|
m_CorrespondingSourceObject: {fileID: -9179824638859959421, guid: cf8684b3c4f47b94aa7cb23ce498caf3,
|
||||||
@ -12963,7 +13007,7 @@ PrefabInstance:
|
|||||||
- target: {fileID: 288245633637051364, guid: 0ff442244da79eb4b80cbf1df4230a0f,
|
- target: {fileID: 288245633637051364, guid: 0ff442244da79eb4b80cbf1df4230a0f,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_Value
|
propertyPath: m_Value
|
||||||
value: 1.3
|
value: 1.2
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 288245633637051364, guid: 0ff442244da79eb4b80cbf1df4230a0f,
|
- target: {fileID: 288245633637051364, guid: 0ff442244da79eb4b80cbf1df4230a0f,
|
||||||
type: 3}
|
type: 3}
|
||||||
@ -43387,7 +43431,7 @@ Transform:
|
|||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 14
|
m_RootOrder: 15
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!114 &1972244961
|
--- !u!114 &1972244961
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
@ -44031,7 +44075,7 @@ Transform:
|
|||||||
- {fileID: 986642662}
|
- {fileID: 986642662}
|
||||||
- {fileID: 1414750230}
|
- {fileID: 1414750230}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_RootOrder: 15
|
m_RootOrder: 16
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1981983055 stripped
|
--- !u!1 &1981983055 stripped
|
||||||
GameObject:
|
GameObject:
|
||||||
|
@ -28,7 +28,7 @@ public class Config
|
|||||||
public bool TouchAirWall = false;
|
public bool TouchAirWall = false;
|
||||||
public bool UseIPCLighting = true;
|
public bool UseIPCLighting = true;
|
||||||
public bool UseIPCTouch = true;
|
public bool UseIPCTouch = true;
|
||||||
public float LightStrength = 1.35f;
|
public float LightStrength = 1.25f;
|
||||||
public int TestKeyBind = 40;
|
public int TestKeyBind = 40;
|
||||||
public int ServiceKeyBind = 41;
|
public int ServiceKeyBind = 41;
|
||||||
public int CoinKeyBind = 31;
|
public int CoinKeyBind = 31;
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
"references": [
|
"references": [
|
||||||
"GUID:56dd35f9b6f21364494ed8365264cbf6",
|
"GUID:56dd35f9b6f21364494ed8365264cbf6",
|
||||||
"GUID:6055be8ebefd69e48b49212b09b47b2f",
|
"GUID:6055be8ebefd69e48b49212b09b47b2f",
|
||||||
"GUID:2dcfcfc00d4ac7749bb60698b85f1dc2",
|
|
||||||
"GUID:fe685ec1767f73d42b749ea8045bfe43",
|
"GUID:fe685ec1767f73d42b749ea8045bfe43",
|
||||||
"GUID:75469ad4d38634e559750d17036d5f7c",
|
"GUID:75469ad4d38634e559750d17036d5f7c",
|
||||||
"GUID:e9ef0e10f8c2b264e9705f57f028b9e8"
|
"GUID:e9ef0e10f8c2b264e9705f57f028b9e8"
|
||||||
|
@ -3,12 +3,15 @@ using System.Collections.Generic;
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using Lavender.Systems;
|
||||||
|
|
||||||
public class StartBatchManager : MonoBehaviour
|
public class StartBatchManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
ConfigManager.EnsureInitialization();
|
ConfigManager.EnsureInitialization();
|
||||||
Process.Start(Path.GetFullPath(ConfigManager.config.batFileLocation));
|
if (ConfigManager.config.batFileLocation != "")
|
||||||
|
StartExternalProcess.Start(ConfigManager.config.batFileLocation);
|
||||||
|
//Process.Start(Path.GetFullPath(ConfigManager.config.batFileLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
156
Assets/Script/Essential/StartExternalProcess.cs
Normal file
156
Assets/Script/Essential/StartExternalProcess.cs
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
|
||||||
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
// ReSharper disable FieldCanBeMadeReadOnly.Local
|
||||||
|
// ReSharper disable InconsistentNaming
|
||||||
|
// ReSharper disable UnusedMember.Local
|
||||||
|
// ReSharper disable MemberCanBePrivate.Local
|
||||||
|
|
||||||
|
namespace Lavender.Systems
|
||||||
|
{
|
||||||
|
public static class StartExternalProcess
|
||||||
|
{
|
||||||
|
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
private static extern bool CreateProcessW(
|
||||||
|
string lpApplicationName,
|
||||||
|
[In] string lpCommandLine,
|
||||||
|
IntPtr procSecAttrs,
|
||||||
|
IntPtr threadSecAttrs,
|
||||||
|
bool bInheritHandles,
|
||||||
|
ProcessCreationFlags dwCreationFlags,
|
||||||
|
IntPtr lpEnvironment,
|
||||||
|
string lpCurrentDirectory,
|
||||||
|
ref STARTUPINFO lpStartupInfo,
|
||||||
|
ref PROCESS_INFORMATION lpProcessInformation
|
||||||
|
);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
private static extern bool CloseHandle(IntPtr hObject);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
private static extern bool TerminateProcess(IntPtr processHandle, uint exitCode);
|
||||||
|
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
|
private static extern IntPtr OpenProcess(ProcessAccessRights access, bool inherit, uint processId);
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
private enum ProcessAccessRights : uint
|
||||||
|
{
|
||||||
|
PROCESS_CREATE_PROCESS = 0x0080, // Required to create a process.
|
||||||
|
PROCESS_CREATE_THREAD = 0x0002, // Required to create a thread.
|
||||||
|
PROCESS_DUP_HANDLE = 0x0040, // Required to duplicate a handle using DuplicateHandle.
|
||||||
|
PROCESS_QUERY_INFORMATION = 0x0400, // Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
|
||||||
|
PROCESS_QUERY_LIMITED_INFORMATION = 0x1000, // Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION. Windows Server 2003 and Windows XP/2000: This access right is not supported.
|
||||||
|
PROCESS_SET_INFORMATION = 0x0200, // Required to set certain information about a process, such as its priority class (see SetPriorityClass).
|
||||||
|
PROCESS_SET_QUOTA = 0x0100, // Required to set memory limits using SetProcessWorkingSetSize.
|
||||||
|
PROCESS_SUSPEND_RESUME = 0x0800, // Required to suspend or resume a process.
|
||||||
|
PROCESS_TERMINATE = 0x0001, // Required to terminate a process using TerminateProcess.
|
||||||
|
PROCESS_VM_OPERATION = 0x0008, // Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
|
||||||
|
PROCESS_VM_READ = 0x0010, // Required to read memory in a process using ReadProcessMemory.
|
||||||
|
PROCESS_VM_WRITE = 0x0020, // Required to write to memory in a process using WriteProcessMemory.
|
||||||
|
DELETE = 0x00010000, // Required to delete the object.
|
||||||
|
READ_CONTROL = 0x00020000, // Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right.
|
||||||
|
SYNCHRONIZE = 0x00100000, // The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.
|
||||||
|
WRITE_DAC = 0x00040000, // Required to modify the DACL in the security descriptor for the object.
|
||||||
|
WRITE_OWNER = 0x00080000, // Required to change the owner in the security descriptor for the object.
|
||||||
|
STANDARD_RIGHTS_REQUIRED = 0x000f0000,
|
||||||
|
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF // All possible access rights for a process object.
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
private struct PROCESS_INFORMATION
|
||||||
|
{
|
||||||
|
internal IntPtr hProcess;
|
||||||
|
internal IntPtr hThread;
|
||||||
|
internal uint dwProcessId;
|
||||||
|
internal uint dwThreadId;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
private struct STARTUPINFO
|
||||||
|
{
|
||||||
|
internal uint cb;
|
||||||
|
internal IntPtr lpReserved;
|
||||||
|
internal IntPtr lpDesktop;
|
||||||
|
internal IntPtr lpTitle;
|
||||||
|
internal uint dwX;
|
||||||
|
internal uint dwY;
|
||||||
|
internal uint dwXSize;
|
||||||
|
internal uint dwYSize;
|
||||||
|
internal uint dwXCountChars;
|
||||||
|
internal uint dwYCountChars;
|
||||||
|
internal uint dwFillAttribute;
|
||||||
|
internal uint dwFlags;
|
||||||
|
internal ushort wShowWindow;
|
||||||
|
internal ushort cbReserved2;
|
||||||
|
internal IntPtr lpReserved2;
|
||||||
|
internal IntPtr hStdInput;
|
||||||
|
internal IntPtr hStdOutput;
|
||||||
|
internal IntPtr hStdError;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
private enum ProcessCreationFlags : uint
|
||||||
|
{
|
||||||
|
NONE = 0,
|
||||||
|
CREATE_BREAKAWAY_FROM_JOB = 0x01000000,
|
||||||
|
CREATE_DEFAULT_ERROR_MODE = 0x04000000,
|
||||||
|
CREATE_NEW_CONSOLE = 0x00000010,
|
||||||
|
CREATE_NEW_PROCESS_GROUP = 0x00000200,
|
||||||
|
CREATE_NO_WINDOW = 0x08000000,
|
||||||
|
CREATE_PROTECTED_PROCESS = 0x00040000,
|
||||||
|
CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000,
|
||||||
|
CREATE_SECURE_PROCESS = 0x00400000,
|
||||||
|
CREATE_SEPARATE_WOW_VDM = 0x00000800,
|
||||||
|
CREATE_SHARED_WOW_VDM = 0x00001000,
|
||||||
|
CREATE_SUSPENDED = 0x00000004,
|
||||||
|
CREATE_UNICODE_ENVIRONMENT = 0x00000400,
|
||||||
|
DEBUG_ONLY_THIS_PROCESS = 0x00000002,
|
||||||
|
DEBUG_PROCESS = 0x00000001,
|
||||||
|
DETACHED_PROCESS = 0x00000008,
|
||||||
|
EXTENDED_STARTUPINFO_PRESENT = 0x00080000,
|
||||||
|
INHERIT_PARENT_AFFINITY = 0x00010000
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint Start(string path, string dir = null, bool hidden = false)
|
||||||
|
{
|
||||||
|
ProcessCreationFlags flags = hidden ? ProcessCreationFlags.CREATE_NO_WINDOW : ProcessCreationFlags.NONE;
|
||||||
|
STARTUPINFO startupinfo = new STARTUPINFO
|
||||||
|
{
|
||||||
|
cb = (uint)Marshal.SizeOf<STARTUPINFO>()
|
||||||
|
};
|
||||||
|
PROCESS_INFORMATION processinfo = new PROCESS_INFORMATION();
|
||||||
|
if (!CreateProcessW(null, path, IntPtr.Zero, IntPtr.Zero, false, flags, IntPtr.Zero, dir, ref startupinfo, ref processinfo))
|
||||||
|
{
|
||||||
|
throw new Win32Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
return processinfo.dwProcessId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int KillProcess(uint pid)
|
||||||
|
{
|
||||||
|
IntPtr handle = OpenProcess(ProcessAccessRights.PROCESS_ALL_ACCESS, false, pid);
|
||||||
|
|
||||||
|
if (handle == IntPtr.Zero)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!TerminateProcess(handle, 0))
|
||||||
|
{
|
||||||
|
throw new Win32Exception();
|
||||||
|
}
|
||||||
|
if (!CloseHandle(handle))
|
||||||
|
{
|
||||||
|
throw new Win32Exception();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
11
Assets/Script/Essential/StartExternalProcess.cs.meta
Normal file
11
Assets/Script/Essential/StartExternalProcess.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 25465c8bb0d210e40869f0e309b12fde
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -9,6 +9,7 @@ public class IPCManager : MonoBehaviour
|
|||||||
public static MemoryMappedFile sharedBuffer;
|
public static MemoryMappedFile sharedBuffer;
|
||||||
public static MemoryMappedViewAccessor sharedBufferAccessor;
|
public static MemoryMappedViewAccessor sharedBufferAccessor;
|
||||||
public static bool isInitialized = false;
|
public static bool isInitialized = false;
|
||||||
|
public static bool[] TouchData = new bool[240];
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
@ -83,18 +84,21 @@ public class IPCManager : MonoBehaviour
|
|||||||
Debug.Log("IPC Disposed");
|
Debug.Log("IPC Disposed");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetTouchData(bool[] bytes)
|
private static void SetTouchData(bool[] datas)
|
||||||
{
|
{
|
||||||
EnsureInitialization();
|
EnsureInitialization();
|
||||||
IPCManager.sharedBufferAccessor.WriteArray<bool>(4, bytes, 0, 240);
|
IPCManager.sharedBufferAccessor.WriteArray<bool>(4, datas, 0, 240);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetTouch(int index, bool value)
|
public static void SetTouch(int Area, bool State)
|
||||||
{
|
{
|
||||||
EnsureInitialization();
|
Area -= 1; //0-239
|
||||||
if (value)
|
|
||||||
IPCManager.sharedBufferAccessor.Write(4 + index, 1);
|
if (Area < 120) //right side
|
||||||
else
|
TouchData[Area + 120] = State;
|
||||||
IPCManager.sharedBufferAccessor.Write(4 + index, 0);
|
else if (Area >= 120) //left side
|
||||||
|
TouchData[Area - 120] = State;
|
||||||
|
|
||||||
|
SetTouchData(TouchData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,6 @@ public class LightManager : MonoBehaviour
|
|||||||
}
|
}
|
||||||
private void CheckIPCState(byte[] data)
|
private void CheckIPCState(byte[] data)
|
||||||
{
|
{
|
||||||
Debug.Log(data[3]);
|
|
||||||
if (data[3] == 0)
|
if (data[3] == 0)
|
||||||
isIPCIdle = true;
|
isIPCIdle = true;
|
||||||
else
|
else
|
||||||
|
@ -9,7 +9,6 @@ public class ColliderToTouch : MonoBehaviour
|
|||||||
{
|
{
|
||||||
public LightManager LightManager;
|
public LightManager LightManager;
|
||||||
private int _insideColliderCount = 0;
|
private int _insideColliderCount = 0;
|
||||||
public static event Action touchDidChange;
|
|
||||||
private int Area;
|
private int Area;
|
||||||
private void Start()
|
private void Start()
|
||||||
{
|
{
|
||||||
@ -19,7 +18,6 @@ public class ColliderToTouch : MonoBehaviour
|
|||||||
{
|
{
|
||||||
_insideColliderCount += 1;
|
_insideColliderCount += 1;
|
||||||
TouchManager.SetTouch(Area, true);
|
TouchManager.SetTouch(Area, true);
|
||||||
touchDidChange?.Invoke();
|
|
||||||
LightManager.UpdateFadeLight(Area, true);
|
LightManager.UpdateFadeLight(Area, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,7 +28,6 @@ public class ColliderToTouch : MonoBehaviour
|
|||||||
if (_insideColliderCount == 0)
|
if (_insideColliderCount == 0)
|
||||||
{
|
{
|
||||||
TouchManager.SetTouch(Area, false);
|
TouchManager.SetTouch(Area, false);
|
||||||
touchDidChange?.Invoke();
|
|
||||||
LightManager.UpdateFadeLight(Area, false);
|
LightManager.UpdateFadeLight(Area, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
279
Assets/Script/TouchManager/SerialManager.cs
Normal file
279
Assets/Script/TouchManager/SerialManager.cs
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO.Ports;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
public class SerialManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
const byte CMD_GET_SYNC_BOARD_VER = 0xa0;
|
||||||
|
const byte CMD_NEXT_READ = 0x72;
|
||||||
|
const byte CMD_GET_UNIT_BOARD_VER = 0xa8;
|
||||||
|
const byte CMD_MYSTERY1 = 0xa2;
|
||||||
|
const byte CMD_MYSTERY2 = 0x94;
|
||||||
|
const byte CMD_START_AUTO_SCAN = 0xc9;
|
||||||
|
const byte CMD_BEGIN_WRITE = 0x77;
|
||||||
|
const byte CMD_NEXT_WRITE = 0x20;
|
||||||
|
|
||||||
|
private Thread _touchThread;
|
||||||
|
private Queue _touchQueue;
|
||||||
|
|
||||||
|
static SerialPort ComL = new SerialPort ("COM5", 115200);
|
||||||
|
static SerialPort ComR = new SerialPort ("COM6", 115200);
|
||||||
|
|
||||||
|
byte inByte;
|
||||||
|
string SYNC_BOARD_VER = "190523";
|
||||||
|
string UNIT_BOARD_VER = "190514";
|
||||||
|
string read1 = " 0 0 1 2 3 4 5 15 15 15 15 15 15 11 11 11";
|
||||||
|
string read2 = " 11 11 11 128 103 103 115 138 127 103 105 111 126 113 95 100";
|
||||||
|
string read3 = " 101 115 98 86 76 67 68 48 117 0 82 154 0 6 35 4";
|
||||||
|
|
||||||
|
byte[] SettingData_160 = new byte[8] {160, 49, 57, 48, 53, 50, 51, 44};
|
||||||
|
byte[] SettingData_162 = new byte[3] {162, 63, 29};
|
||||||
|
byte[] SettingData_148 = new byte[3] {148, 0, 20};
|
||||||
|
byte[] SettingData_201 = new byte[3] {201, 0, 73};
|
||||||
|
static byte[] TouchPackL = new byte[36];
|
||||||
|
static byte[] TouchPackR = new byte[36];
|
||||||
|
bool StartUp = false;
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
//if game is not running using mono, destroy this object
|
||||||
|
if (Type.GetType("Mono.Runtime") == null)
|
||||||
|
{
|
||||||
|
Destroy(this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ComL.Open();
|
||||||
|
ComR.Open();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Failed to Open Serial Ports: {ex}");
|
||||||
|
Destroy(this);
|
||||||
|
}
|
||||||
|
Debug.Log("Touch Serial Initializing..");
|
||||||
|
//Send touch update periodically to keep "read" alive
|
||||||
|
_touchQueue = Queue.Synchronized(new Queue());
|
||||||
|
_touchThread = new Thread(TouchThreadLoop);
|
||||||
|
InvokeRepeating("PingTouchThread", 0, 1);
|
||||||
|
//Send touch updates whenever actual state changes to achieve desired update frequency without overloading
|
||||||
|
TouchManager.touchDidChange += PingTouchThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PingTouchThread()
|
||||||
|
{
|
||||||
|
_touchQueue.Enqueue(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TouchThreadLoop()
|
||||||
|
{
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
if(_touchQueue.Count > 0)
|
||||||
|
{
|
||||||
|
_touchQueue.Dequeue();
|
||||||
|
SendTouchState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
ComL.Close();
|
||||||
|
ComR.Close();
|
||||||
|
}
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
if(ComL.IsOpen)
|
||||||
|
ReadHead(ComL, 0);
|
||||||
|
if (ComR.IsOpen)
|
||||||
|
ReadHead(ComR, 1);
|
||||||
|
//following are touch test code
|
||||||
|
//if (Input.GetKeyDown(KeyCode.M))
|
||||||
|
//StartCoroutine(TouchTest(true));
|
||||||
|
//if (Input.GetKeyDown(KeyCode.M) && StartUp)
|
||||||
|
//SendTouchState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendTouchState()
|
||||||
|
{
|
||||||
|
if(StartUp)
|
||||||
|
{
|
||||||
|
//Debug.Log("Sending Touch State");
|
||||||
|
// Debug.Log("Sending Left");
|
||||||
|
SendTouch(ComL, TouchPackL);
|
||||||
|
// Debug.Log("Sending Right");
|
||||||
|
SendTouch(ComR, TouchPackR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator TouchTest(bool State) //this is a touch test code
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 240; i++)
|
||||||
|
{
|
||||||
|
SetTouch(i, true);
|
||||||
|
Debug.Log(i);
|
||||||
|
yield return new WaitForSeconds(0.05f);
|
||||||
|
SetTouch(i, false);
|
||||||
|
yield return new WaitForSeconds(0.05f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReadHead(SerialPort Serial, int side) //Read head byte
|
||||||
|
{
|
||||||
|
if(Serial.BytesToRead > 0)
|
||||||
|
{
|
||||||
|
inByte = Convert.ToByte(Serial.ReadByte());
|
||||||
|
var data = Serial.ReadExisting();
|
||||||
|
SendResp(Serial, side, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void SendResp(SerialPort Serial, int side, string data)
|
||||||
|
{
|
||||||
|
switch(inByte)
|
||||||
|
{
|
||||||
|
case CMD_GET_SYNC_BOARD_VER:
|
||||||
|
//Response: cmd byte + sync board ver + checksum
|
||||||
|
StartUp = false;
|
||||||
|
List<byte> syncbytes = new List<byte>();
|
||||||
|
syncbytes.Add(inByte);
|
||||||
|
syncbytes.AddRange(ByteHelper.ConvertStringToByteArray(SYNC_BOARD_VER));
|
||||||
|
byte syncCheckSum = (byte)44;
|
||||||
|
syncbytes.Add(syncCheckSum);
|
||||||
|
Serial.Write(syncbytes.ToArray(), 0, syncbytes.Count);
|
||||||
|
//Debug.Log($"GET SYNC BOARD VER {side}");
|
||||||
|
break;
|
||||||
|
case CMD_NEXT_READ:
|
||||||
|
//Response: corresponding read bytes + checksum
|
||||||
|
StartUp = false;
|
||||||
|
//Debug.Log($"Side {side} NEXT READ {Convert.ToByte(data[2])}");
|
||||||
|
switch (Convert.ToByte(data[2]))
|
||||||
|
{
|
||||||
|
case 0x30:
|
||||||
|
var bytes = ByteHelper.ConvertStringToByteArray(read1);
|
||||||
|
bytes.Add(ByteHelper.CalCheckSum(bytes.ToArray(), bytes.Count));
|
||||||
|
//Debug.Log("Read 1");
|
||||||
|
Serial.Write(bytes.ToArray(), 0, bytes.Count);
|
||||||
|
break;
|
||||||
|
case 0x31:
|
||||||
|
var bytes2 = ByteHelper.ConvertStringToByteArray(read2);
|
||||||
|
bytes2.Add(ByteHelper.CalCheckSum(bytes2.ToArray(), bytes2.Count));
|
||||||
|
//Debug.Log("Read 2");
|
||||||
|
Serial.Write(bytes2.ToArray(), 0, bytes2.Count);
|
||||||
|
break;
|
||||||
|
case 0x33:
|
||||||
|
var bytes3 = ByteHelper.ConvertStringToByteArray(read3);
|
||||||
|
bytes3.Add(ByteHelper.CalCheckSum(bytes3.ToArray(), bytes3.Count));
|
||||||
|
//Debug.Log("Read 3");
|
||||||
|
Serial.Write(bytes3.ToArray(), 0, bytes3.Count);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//Debug.Log("Extra Read");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CMD_GET_UNIT_BOARD_VER:
|
||||||
|
//Response: cmd byte + sync board ver bytes + 'L'/'R' based on side + unit board ver bytes x6 + checksum
|
||||||
|
StartUp = false;
|
||||||
|
List<byte> unitBytes = new List<byte>();
|
||||||
|
byte sideByte = (side == 0 ? Convert.ToByte('R') : Convert.ToByte('L'));
|
||||||
|
byte unitCheckSum = (side == 0 ? (byte)118 : (byte)104);
|
||||||
|
unitBytes.Add(inByte);
|
||||||
|
unitBytes.AddRange(ByteHelper.ConvertStringToByteArray(SYNC_BOARD_VER));
|
||||||
|
unitBytes.Add(sideByte);
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
unitBytes.AddRange(ByteHelper.ConvertStringToByteArray(UNIT_BOARD_VER));
|
||||||
|
unitBytes.Add(unitCheckSum);
|
||||||
|
Serial.Write(unitBytes.ToArray(), 0, unitBytes.Count);
|
||||||
|
//Debug.Log($"GET UNIT BOARD VER {side}");
|
||||||
|
break;
|
||||||
|
case CMD_MYSTERY1:
|
||||||
|
StartUp = false;
|
||||||
|
Serial.Write(SettingData_162, 0, 3);
|
||||||
|
//Debug.Log($"MYSTERY 1 SIDE {side}");
|
||||||
|
break;
|
||||||
|
case CMD_MYSTERY2:
|
||||||
|
StartUp = false;
|
||||||
|
Serial.Write(SettingData_148, 0, 3);
|
||||||
|
//Debug.Log($"MYSTERY 2 SIDE {side}");
|
||||||
|
break;
|
||||||
|
case CMD_START_AUTO_SCAN:
|
||||||
|
Serial.Write(SettingData_201.ToArray(), 0, 3);
|
||||||
|
//Debug.Log($"START AUTO SCAN SIDE {side}");
|
||||||
|
StartUp = true;
|
||||||
|
if (!_touchThread.IsAlive)
|
||||||
|
_touchThread.Start();
|
||||||
|
break;
|
||||||
|
case CMD_BEGIN_WRITE:
|
||||||
|
// Debug.Log($"Begin Write For Side {side}");
|
||||||
|
break;
|
||||||
|
case CMD_NEXT_WRITE:
|
||||||
|
// Debug.Log($"Continue Write For Side {side}");
|
||||||
|
break;
|
||||||
|
case 154:
|
||||||
|
StartUp = false;
|
||||||
|
//Debug.Log("BAD");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] GetTouchPack(byte[] Pack) //convert touch to right format for game
|
||||||
|
{
|
||||||
|
Pack[0] = 129;
|
||||||
|
Pack[34] = Pack[34]++;
|
||||||
|
Pack[35] = 128;
|
||||||
|
Pack[35] = ByteHelper.CalCheckSum(Pack, 36);
|
||||||
|
if (Pack[34] > 127)
|
||||||
|
Pack[34] = 0;
|
||||||
|
return Pack;
|
||||||
|
}
|
||||||
|
void SendTouch(SerialPort Serial, byte[] Pack) //Send touch data to serial
|
||||||
|
{
|
||||||
|
if (StartUp)
|
||||||
|
Serial.Write(GetTouchPack(Pack), 0, 36);
|
||||||
|
}
|
||||||
|
public static void SetTouch(int Area, bool State) //set touch data 1-240
|
||||||
|
{
|
||||||
|
Area -= 1; //0-239
|
||||||
|
if (Area < 120) //right side
|
||||||
|
{
|
||||||
|
Area += Area / 5 * 3 + 7;
|
||||||
|
ByteHelper.SetBit(TouchPackR, Area, State);
|
||||||
|
}
|
||||||
|
else if (Area >= 120) //left side
|
||||||
|
{
|
||||||
|
Area -= 120;
|
||||||
|
Area += Area / 5 * 3 + 7;
|
||||||
|
ByteHelper.SetBit(TouchPackL, Area, State);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ByteHelper
|
||||||
|
{
|
||||||
|
public static byte[] SetBit(this byte[] self, int index, bool value)
|
||||||
|
{
|
||||||
|
var bitArray = new BitArray(self);
|
||||||
|
bitArray.Set(index, value);
|
||||||
|
bitArray.CopyTo(self, 0);
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
public static byte CalCheckSum(byte[] _PacketData,int PacketLength)
|
||||||
|
{
|
||||||
|
Byte _CheckSumByte = 0x00;
|
||||||
|
for (int i = 0; i < PacketLength; i++)
|
||||||
|
_CheckSumByte ^= _PacketData[i];
|
||||||
|
return _CheckSumByte;
|
||||||
|
}
|
||||||
|
public static List<byte> ConvertStringToByteArray(string data)
|
||||||
|
{
|
||||||
|
List<byte> tempList = new List<byte>(100);
|
||||||
|
for(int i = 0; i < data.Length; i++)
|
||||||
|
tempList.Add(Convert.ToByte(data[i]));
|
||||||
|
return tempList;
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Script/TouchManager/SerialManager.cs.meta
Normal file
11
Assets/Script/TouchManager/SerialManager.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 11a72a89f00d44f45a354a22a3e862d5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -8,36 +8,7 @@ using UnityEngine;
|
|||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
public class TouchManager : MonoBehaviour
|
public class TouchManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
const byte CMD_GET_SYNC_BOARD_VER = 0xa0;
|
public static event Action touchDidChange;
|
||||||
const byte CMD_NEXT_READ = 0x72;
|
|
||||||
const byte CMD_GET_UNIT_BOARD_VER = 0xa8;
|
|
||||||
const byte CMD_MYSTERY1 = 0xa2;
|
|
||||||
const byte CMD_MYSTERY2 = 0x94;
|
|
||||||
const byte CMD_START_AUTO_SCAN = 0xc9;
|
|
||||||
const byte CMD_BEGIN_WRITE = 0x77;
|
|
||||||
const byte CMD_NEXT_WRITE = 0x20;
|
|
||||||
|
|
||||||
private Thread _touchThread;
|
|
||||||
private Queue _touchQueue;
|
|
||||||
|
|
||||||
static SerialPort ComL = new SerialPort ("COM5", 115200);
|
|
||||||
static SerialPort ComR = new SerialPort ("COM6", 115200);
|
|
||||||
|
|
||||||
byte inByte;
|
|
||||||
string SYNC_BOARD_VER = "190523";
|
|
||||||
string UNIT_BOARD_VER = "190514";
|
|
||||||
string read1 = " 0 0 1 2 3 4 5 15 15 15 15 15 15 11 11 11";
|
|
||||||
string read2 = " 11 11 11 128 103 103 115 138 127 103 105 111 126 113 95 100";
|
|
||||||
string read3 = " 101 115 98 86 76 67 68 48 117 0 82 154 0 6 35 4";
|
|
||||||
|
|
||||||
byte[] SettingData_160 = new byte[8] {160, 49, 57, 48, 53, 50, 51, 44};
|
|
||||||
byte[] SettingData_162 = new byte[3] {162, 63, 29};
|
|
||||||
byte[] SettingData_148 = new byte[3] {148, 0, 20};
|
|
||||||
byte[] SettingData_201 = new byte[3] {201, 0, 73};
|
|
||||||
static byte[] TouchPackL = new byte[36];
|
|
||||||
static byte[] TouchPackR = new byte[36];
|
|
||||||
static bool[] TouchPackAll = new bool[240];
|
|
||||||
bool StartUp = false;
|
|
||||||
static bool useIPCTouch = true;
|
static bool useIPCTouch = true;
|
||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
@ -47,69 +18,6 @@ public class TouchManager : MonoBehaviour
|
|||||||
useIPCTouch = value;
|
useIPCTouch = value;
|
||||||
});
|
});
|
||||||
toggle.onValueChanged.Invoke(useIPCTouch);
|
toggle.onValueChanged.Invoke(useIPCTouch);
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ComL.Open();
|
|
||||||
ComR.Open();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Failed to Open Serial Ports: {ex}");
|
|
||||||
}
|
|
||||||
Debug.Log("Touch Serial Initializing..");
|
|
||||||
//Send touch update periodically to keep "read" alive
|
|
||||||
_touchQueue = Queue.Synchronized(new Queue());
|
|
||||||
_touchThread = new Thread(TouchThreadLoop);
|
|
||||||
InvokeRepeating("PingTouchThread", 0, 1);
|
|
||||||
//Send touch updates whenever actual state changes to achieve desired update frequency without overloading
|
|
||||||
ColliderToTouch.touchDidChange += PingTouchThread;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PingTouchThread()
|
|
||||||
{
|
|
||||||
_touchQueue.Enqueue(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void TouchThreadLoop()
|
|
||||||
{
|
|
||||||
while(true)
|
|
||||||
{
|
|
||||||
if(_touchQueue.Count > 0)
|
|
||||||
{
|
|
||||||
_touchQueue.Dequeue();
|
|
||||||
SendTouchState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void OnDestroy()
|
|
||||||
{
|
|
||||||
ComL.Close();
|
|
||||||
ComR.Close();
|
|
||||||
}
|
|
||||||
void Update()
|
|
||||||
{
|
|
||||||
if(ComL.IsOpen)
|
|
||||||
ReadHead(ComL, 0);
|
|
||||||
if (ComR.IsOpen)
|
|
||||||
ReadHead(ComR, 1);
|
|
||||||
//following are touch test code
|
|
||||||
//if (Input.GetKeyDown(KeyCode.M))
|
|
||||||
//StartCoroutine(TouchTest(true));
|
|
||||||
//if (Input.GetKeyDown(KeyCode.M) && StartUp)
|
|
||||||
//SendTouchState();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SendTouchState()
|
|
||||||
{
|
|
||||||
if(StartUp)
|
|
||||||
{
|
|
||||||
//Debug.Log("Sending Touch State");
|
|
||||||
// Debug.Log("Sending Left");
|
|
||||||
SendTouch(ComL, TouchPackL);
|
|
||||||
// Debug.Log("Sending Right");
|
|
||||||
SendTouch(ComR, TouchPackR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerator TouchTest(bool State) //this is a touch test code
|
IEnumerator TouchTest(bool State) //this is a touch test code
|
||||||
@ -123,164 +31,13 @@ public class TouchManager : MonoBehaviour
|
|||||||
yield return new WaitForSeconds(0.05f);
|
yield return new WaitForSeconds(0.05f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadHead(SerialPort Serial, int side) //Read head byte
|
|
||||||
{
|
|
||||||
if(Serial.BytesToRead > 0)
|
|
||||||
{
|
|
||||||
inByte = Convert.ToByte(Serial.ReadByte());
|
|
||||||
var data = Serial.ReadExisting();
|
|
||||||
SendResp(Serial, side, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void SendResp(SerialPort Serial, int side, string data)
|
|
||||||
{
|
|
||||||
switch(inByte)
|
|
||||||
{
|
|
||||||
case CMD_GET_SYNC_BOARD_VER:
|
|
||||||
//Response: cmd byte + sync board ver + checksum
|
|
||||||
StartUp = false;
|
|
||||||
List<byte> syncbytes = new List<byte>();
|
|
||||||
syncbytes.Add(inByte);
|
|
||||||
syncbytes.AddRange(ByteHelper.ConvertStringToByteArray(SYNC_BOARD_VER));
|
|
||||||
byte syncCheckSum = (byte)44;
|
|
||||||
syncbytes.Add(syncCheckSum);
|
|
||||||
Serial.Write(syncbytes.ToArray(), 0, syncbytes.Count);
|
|
||||||
//Debug.Log($"GET SYNC BOARD VER {side}");
|
|
||||||
break;
|
|
||||||
case CMD_NEXT_READ:
|
|
||||||
//Response: corresponding read bytes + checksum
|
|
||||||
StartUp = false;
|
|
||||||
//Debug.Log($"Side {side} NEXT READ {Convert.ToByte(data[2])}");
|
|
||||||
switch (Convert.ToByte(data[2]))
|
|
||||||
{
|
|
||||||
case 0x30:
|
|
||||||
var bytes = ByteHelper.ConvertStringToByteArray(read1);
|
|
||||||
bytes.Add(ByteHelper.CalCheckSum(bytes.ToArray(), bytes.Count));
|
|
||||||
//Debug.Log("Read 1");
|
|
||||||
Serial.Write(bytes.ToArray(), 0, bytes.Count);
|
|
||||||
break;
|
|
||||||
case 0x31:
|
|
||||||
var bytes2 = ByteHelper.ConvertStringToByteArray(read2);
|
|
||||||
bytes2.Add(ByteHelper.CalCheckSum(bytes2.ToArray(), bytes2.Count));
|
|
||||||
//Debug.Log("Read 2");
|
|
||||||
Serial.Write(bytes2.ToArray(), 0, bytes2.Count);
|
|
||||||
break;
|
|
||||||
case 0x33:
|
|
||||||
var bytes3 = ByteHelper.ConvertStringToByteArray(read3);
|
|
||||||
bytes3.Add(ByteHelper.CalCheckSum(bytes3.ToArray(), bytes3.Count));
|
|
||||||
//Debug.Log("Read 3");
|
|
||||||
Serial.Write(bytes3.ToArray(), 0, bytes3.Count);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//Debug.Log("Extra Read");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CMD_GET_UNIT_BOARD_VER:
|
|
||||||
//Response: cmd byte + sync board ver bytes + 'L'/'R' based on side + unit board ver bytes x6 + checksum
|
|
||||||
StartUp = false;
|
|
||||||
List<byte> unitBytes = new List<byte>();
|
|
||||||
byte sideByte = (side == 0 ? Convert.ToByte('R') : Convert.ToByte('L'));
|
|
||||||
byte unitCheckSum = (side == 0 ? (byte)118 : (byte)104);
|
|
||||||
unitBytes.Add(inByte);
|
|
||||||
unitBytes.AddRange(ByteHelper.ConvertStringToByteArray(SYNC_BOARD_VER));
|
|
||||||
unitBytes.Add(sideByte);
|
|
||||||
for (int i = 0; i < 6; i++)
|
|
||||||
unitBytes.AddRange(ByteHelper.ConvertStringToByteArray(UNIT_BOARD_VER));
|
|
||||||
unitBytes.Add(unitCheckSum);
|
|
||||||
Serial.Write(unitBytes.ToArray(), 0, unitBytes.Count);
|
|
||||||
//Debug.Log($"GET UNIT BOARD VER {side}");
|
|
||||||
break;
|
|
||||||
case CMD_MYSTERY1:
|
|
||||||
StartUp = false;
|
|
||||||
Serial.Write(SettingData_162, 0, 3);
|
|
||||||
//Debug.Log($"MYSTERY 1 SIDE {side}");
|
|
||||||
break;
|
|
||||||
case CMD_MYSTERY2:
|
|
||||||
StartUp = false;
|
|
||||||
Serial.Write(SettingData_148, 0, 3);
|
|
||||||
//Debug.Log($"MYSTERY 2 SIDE {side}");
|
|
||||||
break;
|
|
||||||
case CMD_START_AUTO_SCAN:
|
|
||||||
Serial.Write(SettingData_201.ToArray(), 0, 3);
|
|
||||||
//Debug.Log($"START AUTO SCAN SIDE {side}");
|
|
||||||
StartUp = true;
|
|
||||||
if (!_touchThread.IsAlive)
|
|
||||||
_touchThread.Start();
|
|
||||||
break;
|
|
||||||
case CMD_BEGIN_WRITE:
|
|
||||||
// Debug.Log($"Begin Write For Side {side}");
|
|
||||||
break;
|
|
||||||
case CMD_NEXT_WRITE:
|
|
||||||
// Debug.Log($"Continue Write For Side {side}");
|
|
||||||
break;
|
|
||||||
case 154:
|
|
||||||
StartUp = false;
|
|
||||||
//Debug.Log("BAD");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] GetTouchPack(byte[] Pack) //convert touch to right format for game
|
|
||||||
{
|
|
||||||
Pack[0] = 129;
|
|
||||||
Pack[34] = Pack[34]++;
|
|
||||||
Pack[35] = 128;
|
|
||||||
Pack[35] = ByteHelper.CalCheckSum(Pack, 36);
|
|
||||||
if (Pack[34] > 127)
|
|
||||||
Pack[34] = 0;
|
|
||||||
return Pack;
|
|
||||||
}
|
|
||||||
void SendTouch(SerialPort Serial, byte[] Pack) //Send touch data to serial
|
|
||||||
{
|
|
||||||
if (StartUp)
|
|
||||||
Serial.Write(GetTouchPack(Pack), 0, 36);
|
|
||||||
}
|
|
||||||
public static void SetTouch(int Area, bool State) //set touch data 1-240
|
public static void SetTouch(int Area, bool State) //set touch data 1-240
|
||||||
{
|
{
|
||||||
Area -= 1; //0-239
|
|
||||||
if (Area < 120) //right side
|
|
||||||
{
|
|
||||||
TouchPackAll[Area + 120] = State; //save R touch for IPC
|
|
||||||
|
|
||||||
Area += Area / 5 * 3 + 7;
|
|
||||||
ByteHelper.SetBit(TouchPackR, Area, State);
|
|
||||||
}
|
|
||||||
else if (Area >= 120) //left side
|
|
||||||
{
|
|
||||||
TouchPackAll[Area - 120] = State; //save L touch for IPC
|
|
||||||
|
|
||||||
Area -= 120;
|
|
||||||
Area += Area / 5 * 3 + 7;
|
|
||||||
ByteHelper.SetBit(TouchPackL, Area, State);
|
|
||||||
}
|
|
||||||
if (useIPCTouch)
|
if (useIPCTouch)
|
||||||
IPCManager.SetTouchData(TouchPackAll); //send touch data to IPC
|
IPCManager.SetTouch(Area, State); //send touch data to IPC
|
||||||
|
else
|
||||||
|
SerialManager.SetTouch(Area, State); //send touch data to Serial
|
||||||
|
|
||||||
|
touchDidChange?.Invoke();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ByteHelper
|
|
||||||
{
|
|
||||||
public static byte[] SetBit(this byte[] self, int index, bool value)
|
|
||||||
{
|
|
||||||
var bitArray = new BitArray(self);
|
|
||||||
bitArray.Set(index, value);
|
|
||||||
bitArray.CopyTo(self, 0);
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
public static byte CalCheckSum(byte[] _PacketData,int PacketLength)
|
|
||||||
{
|
|
||||||
Byte _CheckSumByte = 0x00;
|
|
||||||
for (int i = 0; i < PacketLength; i++)
|
|
||||||
_CheckSumByte ^= _PacketData[i];
|
|
||||||
return _CheckSumByte;
|
|
||||||
}
|
|
||||||
public static List<byte> ConvertStringToByteArray(string data)
|
|
||||||
{
|
|
||||||
List<byte> tempList = new List<byte>(100);
|
|
||||||
for(int i = 0; i < data.Length; i++)
|
|
||||||
tempList.Add(Convert.ToByte(data[i]));
|
|
||||||
return tempList;
|
|
||||||
}
|
|
||||||
}
|
|
@ -34,8 +34,9 @@
|
|||||||
|
|
||||||
## Repositories used
|
## Repositories used
|
||||||
- [Brokenithm-iOS](https://github.com/esterTion/Brokenithm-iOS)
|
- [Brokenithm-iOS](https://github.com/esterTion/Brokenithm-iOS)
|
||||||
- [uWindowCapture](https://github.com/hecomi/uWindowCapture)
|
- [IL2cppStartProcess](https://github.com/josh4364/IL2cppStartProcess)
|
||||||
- [MaiDXR](https://github.com/xiaopeng12138/MaiDXR)
|
- [MaiDXR](https://github.com/xiaopeng12138/MaiDXR)
|
||||||
|
- [uWindowCapture](https://github.com/hecomi/uWindowCapture)
|
||||||
|
|
||||||
## Disclaimers
|
## Disclaimers
|
||||||
- This project is not-for-profit and some resources came from the Internet!
|
- This project is not-for-profit and some resources came from the Internet!
|
||||||
@ -68,6 +69,7 @@
|
|||||||
A ``config.json`` file is automatically created in WACVR's root directory on startup.
|
A ``config.json`` file is automatically created in WACVR's root directory on startup.
|
||||||
|
|
||||||
- You can change this file via the in-game config panel. Please take a step back: the controller pointer will automatically be disabled when the controller is too close to the cabinet.
|
- You can change this file via the in-game config panel. Please take a step back: the controller pointer will automatically be disabled when the controller is too close to the cabinet.
|
||||||
|
- You can change ``batFileLocation`` in ``config.json`` to the location of your start.bat file. The start.bat will automatically run when you start WACVR.
|
||||||
- Some options in ``config.json`` are only the index of the dropdown in the panel.
|
- Some options in ``config.json`` are only the index of the dropdown in the panel.
|
||||||
- You can use the pointer to point the 3rd-person camera and move it to the position you want it to be.
|
- You can use the pointer to point the 3rd-person camera and move it to the position you want it to be.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user