111 lines
3.2 KiB
C#
111 lines
3.2 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
|
||
public class ComInput
|
||
{
|
||
private int pinCount;
|
||
private char pressedValue = '0';
|
||
|
||
private bool[] buttonState;
|
||
private bool[] buttonDown;
|
||
private bool[] buttonUp;
|
||
|
||
private static string configPath = "Configs/ComInput.json";
|
||
|
||
private Dictionary<InSignal, int> pinMappings = new();
|
||
private bool initialized = false;
|
||
|
||
public void Initialize()
|
||
{
|
||
var config = LoadConfig();
|
||
AssignPinMappingsFromConfig(config);
|
||
ComPortController.InputRecieved += UpdateInputState;
|
||
|
||
initialized = true;
|
||
}
|
||
|
||
//Ожидается строка с бинарным представлением цифровых входов
|
||
private void UpdateInputState(string input)
|
||
{
|
||
for (int i = 0; i < input.Length; i++)
|
||
{
|
||
bool buttonPressed = input[i] == pressedValue;
|
||
buttonState[i] = buttonPressed;
|
||
if (buttonPressed == buttonState[i]) return;
|
||
|
||
buttonDown[i] = buttonPressed;
|
||
buttonUp[i] = !buttonPressed;
|
||
}
|
||
}
|
||
|
||
public bool GetButton(InSignal signal) => CheckSignalState(buttonState, signal);
|
||
public bool GetButtonDown(InSignal signal) => CheckSignalState(buttonDown, signal);
|
||
public bool GetButtonUp(InSignal signal) => CheckSignalState(buttonUp, signal);
|
||
|
||
private int GetPhysicalPin(InSignal signal)
|
||
{
|
||
if (pinMappings.TryGetValue(signal, out int pin))
|
||
return pin;
|
||
|
||
return (int)signal;
|
||
}
|
||
|
||
public void ResetFrameStates()
|
||
{
|
||
for (int i = 0; i < pinCount; i++)
|
||
{
|
||
buttonDown[i] = false;
|
||
buttonUp[i] = false;
|
||
}
|
||
}
|
||
|
||
private bool CheckSignalState(bool[] statesArray, InSignal signal)
|
||
{
|
||
if (!initialized) return false;
|
||
return statesArray[GetPhysicalPin(signal)];
|
||
}
|
||
|
||
private ComInputConfig LoadConfig()
|
||
{
|
||
ComInputConfig config = FileUtil.LoadJson<ComInputConfig>(configPath, FileUtil.AppDirectory.Streaming).Data;
|
||
if (config == null)
|
||
{
|
||
config = new ComInputConfig();
|
||
FileUtil.SaveJson(configPath, FileUtil.AppDirectory.Streaming, config);
|
||
}
|
||
return config;
|
||
}
|
||
|
||
private void AssignPinMappingsFromConfig(ComInputConfig config)
|
||
{
|
||
pinMappings[InSignal.UpLeft] = config.UpLeft;
|
||
pinMappings[InSignal.UpRight] = config.UpRight;
|
||
pinMappings[InSignal.DownLeft] = config.DownLeft;
|
||
pinMappings[InSignal.DownRight] = config.DownRight;
|
||
|
||
pinMappings[InSignal.CenterSensor] = config.CenterSensor;
|
||
pinMappings[InSignal.Service] = config.Service;
|
||
|
||
pinCount = config.PinCount;
|
||
pressedValue = config.PositiveChar;
|
||
|
||
buttonState = new bool[pinCount];
|
||
buttonUp = new bool[pinCount];
|
||
buttonDown = new bool[pinCount];
|
||
}
|
||
|
||
[Serializable]
|
||
public class ComInputConfig
|
||
{
|
||
public int DownLeft = 2;
|
||
public int DownRight = 1;
|
||
public int UpLeft = 3;
|
||
public int UpRight = 0;
|
||
|
||
public int CenterSensor = 25;
|
||
public int Service = 4;
|
||
|
||
public int PinCount = 26;
|
||
public char PositiveChar = '0';
|
||
}
|
||
} |