109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
using System.Collections.Generic;
|
||
|
||
public class ComInput : AbstractInputSource
|
||
{
|
||
private const int PIN_COUNT = 26;
|
||
private const char POSITIVE = '0';
|
||
|
||
private bool[] buttonState = new bool[PIN_COUNT];
|
||
private bool[] buttonDown = new bool[PIN_COUNT];
|
||
private bool[] buttonUp = new bool[PIN_COUNT];
|
||
|
||
private Dictionary<InSignal, int> pinMappings = new Dictionary<InSignal, int>();
|
||
|
||
public override bool Initialize()
|
||
{
|
||
LoadPinMappingConfiguration();
|
||
ComPortController.InputRecieved += UpdateInputState;
|
||
|
||
return true;
|
||
}
|
||
|
||
// Обновляет состояния инпута когда приходит новый ввод с платы. Дергается событием.
|
||
private void UpdateInputState(string input)
|
||
{
|
||
for (int i = 0; i < input.Length; i++)
|
||
{
|
||
// Получаем новое состояние пина
|
||
bool newState = input[i] == POSITIVE;
|
||
|
||
// Состояние пина изменилось => пишем в буферы
|
||
if (newState != buttonState[i])
|
||
{
|
||
if (newState) // Пин был зажат
|
||
{
|
||
buttonDown[i] = true;
|
||
buttonUp[i] = false;
|
||
}
|
||
else // Пин был отжат
|
||
{
|
||
buttonDown[i] = false;
|
||
buttonUp[i] = true;
|
||
}
|
||
}
|
||
|
||
buttonState[i] = newState;
|
||
}
|
||
}
|
||
|
||
public override bool AnyButton()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public override bool GetButton(InSignal button) => buttonState[GetPhysicalPin(button)];
|
||
|
||
public override bool GetButtonDown(InSignal button) => buttonDown[GetPhysicalPin(button)];
|
||
|
||
public override bool GetButtonUp(InSignal button) => buttonUp[GetPhysicalPin(button)];
|
||
|
||
private int GetPhysicalPin(InSignal button)
|
||
{
|
||
if (pinMappings.TryGetValue(button, out int pin))
|
||
return pin;
|
||
|
||
// Возвращаем значение по умолчанию (для обратной совместимости)
|
||
return (int)button;
|
||
}
|
||
|
||
|
||
public override void ResetFrameStates()
|
||
{
|
||
for (int i = 0; i < PIN_COUNT; i++)
|
||
{
|
||
buttonDown[i] = false;
|
||
buttonUp[i] = false;
|
||
}
|
||
}
|
||
|
||
//private bool ConsumeButtonEvent(bool[] buffer, int pinIndex)
|
||
//{
|
||
// bool result = buffer[pinIndex];
|
||
// buffer[pinIndex] = false;
|
||
// return result;
|
||
//}
|
||
|
||
/// <summary>
|
||
/// Загружает конфигурацию маппинга пинов из файла elektro_version.rr
|
||
/// </summary>
|
||
private void LoadPinMappingConfiguration()
|
||
{
|
||
//Это будет для прода
|
||
//pinMappings[InSignal.UpLeft] = 22;
|
||
//pinMappings[InSignal.UpRight] = 23;
|
||
//pinMappings[InSignal.DownLeft] = 24;
|
||
//pinMappings[InSignal.DownRight] = 25;
|
||
|
||
//pinMappings[InSignal.CenterSensor] = 0;
|
||
//pinMappings[InSignal.Service] = 1;
|
||
|
||
//тестовая плата
|
||
pinMappings[InSignal.UpLeft] = 2;
|
||
pinMappings[InSignal.UpRight] = 3;
|
||
pinMappings[InSignal.DownLeft] = 1;
|
||
pinMappings[InSignal.DownRight] = 0;
|
||
|
||
pinMappings[InSignal.CenterSensor] = 4;
|
||
pinMappings[InSignal.Service] = 7;
|
||
}
|
||
} |