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