mirror of
https://github.com/xiaopeng12138/MaiDXR.git
synced 2024-11-24 03:50:10 +01:00
128 lines
3.4 KiB
C#
128 lines
3.4 KiB
C#
using UnityEngine;
|
|
using System.IO.Ports;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Threading;
|
|
public class SerialManager : MonoBehaviour
|
|
{
|
|
static SerialPort p1Serial = new SerialPort ("COM5", 9600);
|
|
static SerialPort p2Serial = new SerialPort ("COM6", 9600);
|
|
static byte[] settingPacket = new byte[6] {40, 0, 0, 0, 0, 41};
|
|
static byte[] touchData = new byte[9] {40, 0, 0, 0, 0, 0, 0, 0, 41};
|
|
static byte[] touchData2 = new byte[9] {40, 0, 0, 0, 0, 0, 0, 0, 41};
|
|
public static bool startUp = false; //use ture for default start up state to prevent restart game
|
|
static string recivData;
|
|
private Thread touchThread;
|
|
private Queue touchQueue;
|
|
|
|
void Start()
|
|
{
|
|
try
|
|
{
|
|
Debug.Log("Try start Serial");
|
|
p1Serial.Open();
|
|
p2Serial.Open();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"Failed to Open Serial Ports: {ex}");
|
|
}
|
|
touchQueue = Queue.Synchronized(new Queue());
|
|
touchThread = new Thread(TouchThread);
|
|
InvokeRepeating("PingTouchThread", 0, 1);
|
|
TouchPanelManager.touchDidChange += PingTouchThread;
|
|
touchThread.Start();
|
|
Debug.Log("Serial Started");
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (Input.GetKeyDown(KeyCode.T))
|
|
startUp = !startUp;
|
|
}
|
|
private void PingTouchThread()
|
|
{
|
|
touchQueue.Enqueue(1);
|
|
}
|
|
private void TouchThread()
|
|
{
|
|
while(true)
|
|
{
|
|
if(p1Serial.IsOpen)
|
|
ReadData(p1Serial);
|
|
if(p2Serial.IsOpen)
|
|
ReadData(p2Serial);
|
|
if(touchQueue.Count > 0)
|
|
{
|
|
touchQueue.Dequeue();
|
|
UpdateTouch();
|
|
}
|
|
}
|
|
}
|
|
private void OnDestroy()
|
|
{
|
|
touchThread.Abort();
|
|
p1Serial.Close();
|
|
p2Serial.Close();
|
|
}
|
|
|
|
private void ReadData(SerialPort Serial)
|
|
{
|
|
if (Serial.BytesToRead == 6)
|
|
{
|
|
recivData = Serial.ReadExisting();
|
|
TouchSetUp(Serial, recivData);
|
|
}
|
|
}
|
|
private void TouchSetUp(SerialPort Serial, string data)
|
|
{
|
|
switch (Convert.ToByte(data[3]))
|
|
{
|
|
case 76:
|
|
case 69:
|
|
startUp = false;
|
|
break;
|
|
case 114:
|
|
case 107:
|
|
for (int i=1; i<5; i++)
|
|
settingPacket[i] = Convert.ToByte(data[i]);
|
|
Serial.Write(settingPacket, 0, settingPacket.Length);
|
|
break;
|
|
case 65:
|
|
startUp = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static void SendTouch(SerialPort Serial, byte[] data)
|
|
{
|
|
if (startUp)
|
|
Serial.Write(data, 0, 9);
|
|
}
|
|
public static void UpdateTouch()
|
|
{
|
|
if (!startUp)
|
|
return;
|
|
SendTouch(p1Serial, touchData);
|
|
SendTouch(p2Serial, touchData2);
|
|
}
|
|
|
|
public static void ChangeTouch(bool isP1, int Area, bool State)
|
|
{
|
|
if (isP1)
|
|
ByteArrayExt.SetBit(touchData, Area+8, State);
|
|
else
|
|
ByteArrayExt.SetBit(touchData2, Area+8, State);
|
|
}
|
|
}
|
|
|
|
public static class ByteArrayExt
|
|
{
|
|
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;
|
|
}
|
|
} |