DirectOutputR1
DirectOutput framework R1 for virtual pinball cabinets.
Go to:
Overview 
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros Pages
Motor.cs
Go to the documentation of this file.
1 using System.Xml.Serialization;
2 using DirectOutput.PinballSupport;
3 
4 namespace DirectOutput.Cab.Toys.Basic
5 {
6 
13  public class Motor : AnalogToy, IToy
14  {
15  private int _MaxRuntimeMs = 300000;
16 
25  public int MaxRunTimeMs
26  {
27  get { return _MaxRuntimeMs; }
28  set { _MaxRuntimeMs = value.Limit(0, int.MaxValue); }
29  }
30 
31 
32  private int _MinPower = 10;
33 
42  public int MinPower
43  {
44  get { return _MinPower; }
45  set { _MinPower = value.Limit(0, 255); }
46  }
47 
48  private int _MaxPower = 255;
49 
57  public int MaxPower
58  {
59  get { return _MaxPower; }
60  set { _MaxPower = value.Limit(0, 255); }
61  }
62 
63 
64  private int _KickstartPower = 128;
65 
76  public int KickstartPower
77  {
78  get { return _KickstartPower; }
79  set { _KickstartPower = value.Limit(0, 255); }
80  }
81 
82  private int _KickstartDurationMs = 100;
83 
92  public int KickstartDurationMs
93  {
94  get { return _KickstartDurationMs; }
95  set { _KickstartDurationMs = value.Limit(0, 5000); }
96  }
97 
98 
99 
104  [XmlIgnoreAttribute]
105  public int Power
106  {
107  get
108  {
109 
110  return (int)((Value - MinPower) * ((double)(MaxPower - MinPower) / 255));
111  }
112  }
113 
114 
115  int MotorPower;
116  bool KickstartActive = false;
122  public void SetPower(int Power)
123  {
124 
125  if (this.Power != Power)
126  {
127 
128  MotorPower = Power;
129 
130  if (!KickstartActive)
131  {
132 
133  if (KickstartPower > 0 && Power<KickstartPower && KickstartDurationMs > 0)
134  {
135  KickstartActive = true;
136  SetValue(KickstartPower);
137  AlarmHandler.RegisterAlarm(KickstartDurationMs, StartMotor);
138  }
139  else
140  {
141 
142  StartMotor();
143  }
144  }
145 
146  }
147  }
148 
149  private void StartMotor()
150  {
151  KickstartActive = false;
152  if (MotorPower == 0)
153  {
154  StopMotor();
155  }
156  else
157  {
158  SetMotorPower(MotorPower);
159  if (MaxRunTimeMs > 0)
160  {
161  AlarmHandler.UnregisterAlarm(StartMotor);
162  AlarmHandler.RegisterAlarm(MaxRunTimeMs, StopMotor);
163  }
164  }
165  }
166 
167  private void SetMotorPower(int Power)
168  {
169  int ScaledPower = (int)(MinPower + (MaxPower - MinPower) / 255 * (double)MotorPower).Limit(MinPower, MaxPower);
170  SetValue(ScaledPower);
171  }
172 
173  private void StopMotor()
174  {
175  KickstartActive = false;
176  SetValue(0);
177  AlarmHandler.UnregisterAlarm(StartMotor);
178  AlarmHandler.UnregisterAlarm(StopMotor);
179  }
180 
181 
182 
183  private AlarmHandler AlarmHandler;
184 
189  public override void Init(Cabinet Cabinet)
190  {
191  AlarmHandler = Cabinet.Pinball.Alarms;
192 
193  base.Init(Cabinet);
194  }
195 
199  public override void Finish()
200  {
201  AlarmHandler.UnregisterAlarm(StartMotor);
202  AlarmHandler.UnregisterAlarm(StopMotor);
203  AlarmHandler = null;
204  base.Finish();
205  }
206 
207  }
208 }