Skip to content

Commit cc6264e

Browse files
committed
Allow several buttons associated to a single command
1 parent 384e194 commit cc6264e

File tree

2 files changed

+62
-19
lines changed

2 files changed

+62
-19
lines changed

Source/RunActivity/Viewer3D/UserInputExternal.cs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,67 @@ namespace Orts.Viewer3D
3030
public class ExternalDeviceState
3131
{
3232
public Dictionary<(CabViewControlType,int), ExternalDeviceCabControl> CabControls;
33-
public Dictionary<UserCommand, ExternalDeviceButton> Commands;
33+
public Dictionary<UserCommand, List<ExternalDeviceButton>> Commands;
3434
public ExternalDeviceState()
3535
{
36-
Commands = new Dictionary<UserCommand, ExternalDeviceButton>();
36+
Commands = new Dictionary<UserCommand, List<ExternalDeviceButton>>();
3737
CabControls = new Dictionary<(CabViewControlType,int), ExternalDeviceCabControl>();
3838
}
3939

4040
public virtual void Handled()
4141
{
42-
foreach (var button in Commands.Values)
42+
foreach (var buttonList in Commands.Values)
4343
{
44-
button.Changed = false;
44+
foreach (var button in buttonList)
45+
{
46+
button.Changed = false;
47+
}
4548
}
4649
foreach (var control in CabControls.Values)
4750
{
4851
control.Changed = false;
4952
}
5053
}
54+
public void RegisterCommand(UserCommand command, ExternalDeviceButton button)
55+
{
56+
if (!Commands.ContainsKey(command)) Commands[command] = new List<ExternalDeviceButton>();
57+
Commands[command].Add(button);
58+
}
5159

5260
public bool IsPressed(UserCommand command)
5361
{
54-
return Commands.TryGetValue(command, out var button) && button.IsPressed;
62+
if (Commands.TryGetValue(command, out var buttons))
63+
{
64+
foreach (var button in buttons)
65+
{
66+
if (button.IsPressed) return true;
67+
}
68+
}
69+
return false;
5570
}
5671

5772
public bool IsReleased(UserCommand command)
5873
{
59-
return Commands.TryGetValue(command, out var button) && button.IsReleased;
74+
if (Commands.TryGetValue(command, out var buttons))
75+
{
76+
foreach (var button in buttons)
77+
{
78+
if (button.IsReleased) return true;
79+
}
80+
}
81+
return false;
6082
}
6183

6284
public bool IsDown(UserCommand command)
6385
{
64-
return Commands.TryGetValue(command, out var button) && button.IsDown;
86+
if (Commands.TryGetValue(command, out var buttons))
87+
{
88+
foreach (var button in buttons)
89+
{
90+
if (button.IsDown) return true;
91+
}
92+
}
93+
return false;
6594
}
6695
}
6796
public class ExternalDeviceButton

Source/RunActivity/Viewer3D/UserInputRailDriver.cs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public class RailDriverState : ExternalDeviceState
4848
public ExternalDeviceCabControl TrainBrake = new ExternalDeviceCabControl(); // 0 (release) to 100 (CS), does not include emergency
4949
public ExternalDeviceCabControl EngineBrake = new ExternalDeviceCabControl(); // 0 to 100
5050
public ExternalDeviceCabControl Lights = new ExternalDeviceCabControl(); // lights rotary, 1 off, 2 dim, 3 full
51-
51+
ExternalDeviceButton BailOff;
52+
ExternalDeviceButton Wiper;
5253
public RailDriverState(Game game)
5354
{
5455
try
@@ -119,8 +120,16 @@ public RailDriverState(Game game)
119120

120121
for (int i=0; i<settings.UserCommands.Length; i++)
121122
{
122-
byte command = settings.UserCommands[i];
123-
if (command >= 0 && command != byte.MaxValue) Commands.Add((UserCommand)i, new RailDriverButton(command));
123+
var userCommand = (UserCommand)i;
124+
byte button = settings.UserCommands[i];
125+
if (button >= 0 && button != byte.MaxValue)
126+
{
127+
RegisterCommand(userCommand, new RailDriverButton(button));
128+
if (userCommand == UserCommand.ControlHorn || userCommand == UserCommand.ControlEmergencyPushButton)
129+
{
130+
RegisterCommand(userCommand, new RailDriverButton((byte)(button+1)));
131+
}
132+
}
124133
}
125134
}
126135
}
@@ -130,8 +139,10 @@ public RailDriverState(Game game)
130139
Trace.WriteLine(error);
131140
}
132141

133-
Commands[UserCommand.ControlBailOff] = new ExternalDeviceButton();
134-
Commands[UserCommand.ControlWiper] = new ExternalDeviceButton();
142+
BailOff = new ExternalDeviceButton();
143+
Wiper = new ExternalDeviceButton();
144+
RegisterCommand(UserCommand.ControlBailOff, BailOff);
145+
RegisterCommand(UserCommand.ControlWiper, Wiper);
135146

136147
CabControls[(new CabViewControlType(CABViewControlTypes.DIRECTION), -1)] = Direction;
137148
CabControls[(new CabViewControlType(CABViewControlTypes.THROTTLE), -1)] = Throttle;
@@ -159,13 +170,16 @@ public void Update()
159170
float a = EngineBrake.Value;
160171
float calOff = (1 - a) * bailoffDisengaged.Item1 + a * bailoffDisengaged.Item2;
161172
float calOn = (1 - a) * bailoffEngaged.Item1 + a * bailoffEngaged.Item2;
162-
Commands[UserCommand.ControlBailOff].IsDown = Percentage(readBuffer[5], calOff, calOn) > 50;
163-
Commands[UserCommand.ControlWiper].IsDown = (int)(.01 * Percentage(readBuffer[6], wipers) + 2.5) != 1;
173+
BailOff.IsDown = Percentage(readBuffer[5], calOff, calOn) > 50;
174+
Wiper.IsDown = (int)(.01 * Percentage(readBuffer[6], wipers) + 2.5) != 1;
164175
Lights.Value = (int)(.01 * Percentage(readBuffer[7], headlight) + 2.5);
165176

166-
foreach (var button in Commands.Values)
177+
foreach (var buttonList in Commands.Values)
167178
{
168-
if (button is RailDriverButton rd) rd.Update(readBuffer);
179+
foreach (var button in buttonList)
180+
{
181+
if (button is RailDriverButton rd) rd.Update(readBuffer);
182+
}
169183
}
170184
}
171185
}
@@ -275,10 +289,10 @@ public class RailDriverButton : ExternalDeviceButton
275289
{
276290
int Index;
277291
byte Mask;
278-
public RailDriverButton(byte command)
292+
public RailDriverButton(byte button)
279293
{
280-
Index = 8 + command / 8;
281-
Mask = (byte)(1 << (command % 8));
294+
Index = 8 + button / 8;
295+
Mask = (byte)(1 << (button % 8));
282296
}
283297
public void Update(byte[] data)
284298
{

0 commit comments

Comments
 (0)