sega 0eeedea7b3 Рефакторинг системы ввода
- Убраны лишние классы
- Наведен порядок в ComInput и прилежащих классах
2026-06-15 13:02:20 +03:00

111 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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';
}
}