WIP
DirectOutput framework for virtual pinball cabinets WIP
Go to:
Overview 
GenericCom.cs
Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.IO.Ports;
6 using Ciloci.Flee;
7 using System.Text.RegularExpressions;
8 
9 namespace DirectOutput.Cab.Out.ComPort
10 {
11  //public class GenericCom : OutputControllerFlexCompleteBase
12  //{
13 
14  // /// <summary>
15  // /// Gets or sets the COM port for the controller.
16  // /// </summary>
17  // /// <value>
18  // /// The COM port for the controller.
19  // /// </value>
20  // public string ComPort { get; set; }
21 
22 
23  // private int _BaudRate = 115200;
24 
25  // /// <summary>
26  // /// Gets or sets the baudrate for the com port.
27  // /// </summary>
28  // /// <value>
29  // /// The baudrate.
30  // /// </value>
31  // public int Baudrate
32  // {
33  // get { return _BaudRate; }
34  // set { _BaudRate = value; }
35  // }
36 
37 
38  // private Parity _Parity = Parity.None;
39 
40  // /// <summary>
41  // /// Gets or sets the parity for the com port.
42  // /// </summary>
43  // /// <value>
44  // /// The parity.
45  // /// </value>
46  // public Parity Parity
47  // {
48  // get { return _Parity; }
49  // set { _Parity = value; }
50  // }
51 
52  // private int _DataBits = 0;
53 
54  // /// <summary>
55  // /// Gets or sets the data bits for the com port.
56  // /// </summary>
57  // /// <value>
58  // /// The data bits.
59  // /// </value>
60  // public int DataBits
61  // {
62  // get { return _DataBits; }
63  // set { _DataBits = value; }
64  // }
65 
66  // private StopBits _StopBits = StopBits.One;
67 
68  // /// <summary>
69  // /// Gets or sets the stop bits for the com port.
70  // /// </summary>
71  // /// <value>
72  // /// The stop bits.
73  // /// </value>
74  // public StopBits StopBits
75  // {
76  // get { return _StopBits; }
77  // set { _StopBits = value; }
78  // }
79 
80 
81  // /// <summary>
82  // /// Gets or sets the open connection expression.
83  // /// The result of this expression is sent to the com port after the connection to the port has been established.
84  // /// </summary>
85  // /// <value>
86  // /// The open connection expression.
87  // /// </value>
88  // public string OpenConnectionExpression { get; set; }
89 
90  // /// <summary>
91  // /// Gets or sets the close connection expression.
92  // /// </summary>
93  // /// <value>
94  // /// The close connection expression.
95  // /// </value>
96  // public string CloseConnectionExpression { get; set; }
97 
98  // public string UpdateStartExpression { get; set; }
99 
100  // public string UpdateEndExpression { get; set; }
101 
102  // public string UpdateOutputExpression { get; set; }
103 
104  // private GenericComExpression OpenConnection = null;
105  // private GenericComExpression CloseConnection = null;
106  // private GenericComExpression UpdateStart = null;
107  // private GenericComExpression UpdateEnd = null;
108  // private GenericComExpression UpdateOutput = null;
109 
110 
111  // private SerialPort Port = null;
112  // private object PortLocker = new object();
113 
114  // ExpressionContext Context = null;
115 
116 
117 
118  // /// <summary>
119  // /// Initializes the output controller and starts the updater thread.
120  // /// </summary>
121  // /// <param name="Cabinet">The cabinet object which is using the output controller instance.</param>
122  // public override void Init(Cabinet Cabinet)
123  // {
124  // base.Init(Cabinet);
125 
126  // SetExpressionContext();
127 
128 
129  // if (!OpenConnectionExpression.IsNullOrWhiteSpace())
130  // {
131  // OpenConnection = ParseExpression(Context, OpenConnectionExpression);
132  // }
133  // if (!CloseConnectionExpression.IsNullOrWhiteSpace())
134  // {
135  // CloseConnection = ParseExpression(Context, CloseConnectionExpression);
136  // }
137  // if (!UpdateStartExpression.IsNullOrWhiteSpace())
138  // {
139  // UpdateStart = ParseExpression(Context, UpdateStartExpression);
140  // }
141  // if (!UpdateEndExpression.IsNullOrWhiteSpace())
142  // {
143  // UpdateEnd = ParseExpression(Context, UpdateEndExpression);
144  // }
145  // if (!UpdateOutputExpression.IsNullOrWhiteSpace())
146  // {
147  // UpdateOutput = ParseExpression(Context, UpdateOutputExpression);
148  // }
149 
150 
151 
152  // }
153 
154  // /// <summary>
155  // /// Finishes the output controller and stops the updater thread.
156  // /// </summary>
157  // public override void Finish()
158  // {
159  // OpenConnection = null;
160  // CloseConnection = null;
161  // UpdateStart = null;
162  // CloseConnection = null;
163  // UpdateEnd = null;
164  // UpdateOutput = null;
165  // Context = null;
166  // base.Finish();
167  // }
168 
169 
170 
171  // protected override bool VerifySettings()
172  // {
173  // if (ComPort.IsNullOrWhiteSpace())
174  // {
175  // Log.Warning("ComPort is not set for {0} {1}.".Build(this.GetType().Name, Name));
176  // return false;
177  // }
178 
179  // if (!SerialPort.GetPortNames().Any(x => x.Equals(ComPort, StringComparison.InvariantCultureIgnoreCase)))
180  // {
181  // Log.Warning("ComPort {2} is defined for {0} {1}, but does not exist.".Build(this.GetType().Name, Name, ComPort));
182  // return false;
183  // };
184 
185  // if (OpenConnectionExpression.IsNullOrWhiteSpace() && CloseConnectionExpression.IsNullOrWhiteSpace() && UpdateStartExpression.IsNullOrWhiteSpace() && UpdateEndExpression.IsNullOrWhiteSpace() && UpdateOutputExpression.IsNullOrWhiteSpace())
186  // {
187  // Log.Warning("No communication data is defined for {0} {1} on port {2}.".Build(this.GetType().Name, Name, ComPort));
188  // return false;
189  // }
190 
191 
192  // return true;
193  // }
194 
195 
196  // private void SetExpressionContext()
197  // {
198  // Context = new ExpressionContext();
199  // Context.Options.ParseCulture = System.Globalization.CultureInfo.InvariantCulture;
200  // Context.Imports.AddType(typeof(Math));
201 
202  // for (int i = 1; i <= NumberOfOutputs; i++)
203  // {
204  // Context.Variables["V" + i] = 0;
205  // }
206  // Context.Variables["CV"] = 0;
207  // Context.Variables["CN"] = 0;
208 
209 
210  // }
211 
212  // private void UpdateExpressionContextValues(byte[] Values)
213  // {
214  // for (int i = 1; i <= NumberOfOutputs; i++)
215  // {
216  // Context.Variables["V" + i] = Values[i];
217  // }
218  // }
219 
220  // private void UpdateExpressionContextCurrent(byte[] Values, int Number)
221  // {
222  // if (Number > 0)
223  // {
224  // Context.Variables["CV"] = Values[Number - 1];
225  // Context.Variables["CN"] = Number;
226  // }
227  // else
228  // {
229  // Context.Variables["CV"] = 0;
230  // Context.Variables["CN"] = 0;
231  // }
232  // }
233 
234 
235  // private byte[] Evaluate(GenericComExpression Exp)
236  // {
237  // string D = Exp.Expression;
238  // foreach (KeyValuePair<string, IGenericExpression<byte>> KV in Exp.ByteExpressions)
239  // {
240  // D = D.Replace(KV.Key, ((char)KV.Value.Evaluate()).ToString());
241  // }
242  // foreach (KeyValuePair<string, IGenericExpression<string>> KV in Exp.StringExpressions)
243  // {
244  // D = D.Replace(KV.Key, KV.Value.Evaluate());
245  // }
246  // return D.GetBytes();
247  // }
248 
249 
250 
251  // private GenericComExpression ParseExpression(ExpressionContext Context, string Expression)
252  // {
253 
254  // string ExpressionPrepared = Expression;
255 
256 
257  // Dictionary<string, IGenericExpression<byte>> ByteExpressions = new Dictionary<string, IGenericExpression<byte>>();
258  // Dictionary<string, IGenericExpression<string>> StringExpressions = new Dictionary<string, IGenericExpression<string>>();
259 
260  // Regex Regex = new Regex("{.*?}");
261  // MatchCollection Matches = Regex.Matches(ExpressionPrepared);
262  // foreach (Match Match in Matches)
263  // {
264 
265  // if (Match.Value.StartsWith("#"))
266  // {
267  // //need to return a byte expression
268  // string[] MatchParts = Match.Value.Substring(1).Split(',').Select(MP => MP.Trim()).ToArray();
269  // if (MatchParts.All(MV => MV.IsInteger() || (MV.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase) && MV.Substring(2).IsHexString())))
270  // {
271  // List<char> R = new List<char>();
272  // foreach (string S in Match.Value.Substring(1).Split(','))
273  // {
274  // int V;
275  // if (S.IsInteger())
276  // {
277  // V = S.ToInteger();
278  // }
279  // else if (S.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase) && S.Substring(2).IsHexString())
280  // {
281  // V = Match.Value.Substring(3).HexToInt();
282  // }
283  // else
284  // {
285  // throw new Exception("Cant parse part {0} of {" + Match.Value + "}. Value must be in the range of 0 to 255 resp 0x0 to 0xff.".Build(S));
286  // }
287  // if (!V.IsBetween(0, 255))
288  // {
289  // throw new Exception("Cant parse part {0} of {" + Match.Value + "}. Value must be in the range of 0 to 255 resp 0x0 to 0xff.".Build(S));
290  // }
291  // R.Add((char)V);
292  // }
293  // ExpressionPrepared = ExpressionPrepared.Replace("{" + Match.Value + "}", new string(R.ToArray()));
294  // }
295  // else
296  // {
297  // IGenericExpression<byte> EB = null;
298  // try
299  // {
300  // EB = Context.CompileGeneric<byte>(Match.Value.Substring(1));
301 
302  // }
303  // catch (Exception Ex)
304  // {
305 
306  // throw new Exception("{" + Match.Value + "} is not a valid byte expression.", Ex);
307  // }
308  // ByteExpressions.Add("{" + Match.Value + "}", EB);
309  // }
310  // }
311  // else
312  // {
313  // IGenericExpression<string> ES = null;
314 
315  // try
316  // {
317  // ES = Context.CompileGeneric<string>(Match.Value);
318 
319  // }
320  // catch (Exception E)
321  // {
322 
323  // throw new Exception("{" + Match.Value + "} is not a valid string expression.", E);
324  // }
325  // StringExpressions.Add("{" + Match.Value + "}", ES);
326  // }
327  // }
328 
329  // return new GenericComExpression() { ByteExpressions = ByteExpressions, StringExpressions = StringExpressions, Expression = ExpressionPrepared };
330  // }
331 
332  // private class GenericComExpression
333  // {
334  // public Dictionary<string, IGenericExpression<byte>> ByteExpressions = new Dictionary<string, IGenericExpression<byte>>();
335  // public Dictionary<string, IGenericExpression<string>> StringExpressions = new Dictionary<string, IGenericExpression<string>>();
336 
337  // public string Expression = null;
338 
339  // }
340 
341 
342  // byte[] OldValues = null;
343  // protected override void UpdateOutputs(byte[] OutputValues)
344  // {
345  // if (Port != null)
346  // {
347  // lock (PortLocker)
348  // {
349  // byte[] Data = null;
350  // UpdateExpressionContextValues(OutputValues);
351  // if (UpdateStart != null)
352  // {
353 
354 
355  // try
356  // {
357  // Data = Evaluate(UpdateStart);
358  // }
359  // catch (Exception E)
360  // {
361  // throw new Exception("Could not evaluate the UpdateStartExpression {0} for {1} {2}.".Build(OpenConnectionExpression, this.GetType().Name, Name), E);
362  // }
363  // SendData(Data);
364  // }
365 
366 
367  // if (UpdateOutput != null)
368  // {
369  // for (int i = 1; i <= NumberOfOutputs; i++)
370  // {
371  // UpdateExpressionContextCurrent(OutputValues, i);
372  // try
373  // {
374  // Data = Evaluate(UpdateOutput);
375  // }
376  // catch (Exception E)
377  // {
378  // throw new Exception("Could not evaluate the UpdateOutputExpression {0} for {1} {2}.".Build(UpdateOutputExpression, this.GetType().Name, Name), E);
379  // }
380  // SendData(Data);
381  // }
382  // UpdateExpressionContextCurrent(OutputValues, -1);
383  // }
384 
385 
386  // if (UpdateEnd != null)
387  // {
388  // Data = null;
389 
390  // try
391  // {
392  // Data = Evaluate(UpdateEnd);
393  // }
394  // catch (Exception E)
395  // {
396  // throw new Exception("Could not evaluate the UpdateEndExpression {0} for {1} {2}.".Build(OpenConnectionExpression, this.GetType().Name, Name), E);
397  // }
398  // SendData(Data);
399  // }
400 
401  // }
402  // }
403  // else
404  // {
405  // throw new Exception("Port {0} for {1} {2} is not initialized.".Build(ComPort, this.GetType().Name, Name));
406  // }
407  // }
408 
409 
410 
411 
412 
413  // protected override void ConnectToController()
414  // {
415  // lock (PortLocker)
416  // {
417  // try
418  // {
419  // if (Port != null)
420  // {
421  // DisconnectFromController();
422  // }
423 
424  // OldValues = null;
425 
426  // Port = new SerialPort(ComPort, Baudrate, Parity, DataBits, StopBits);
427  // Port.Open();
428  // }
429  // catch (Exception E)
430  // {
431  // string Msg = "A exception occured while opening comport {2} for {0} {1}.".Build(this.GetType().Name, Name, ComPort);
432  // Log.Exception(Msg, E);
433  // throw new Exception(Msg, E);
434  // }
435 
436  // if (OpenConnection != null)
437  // {
438  // byte[] Data = null;
439  // UpdateExpressionContextValues(new byte[NumberOfOutputs]);
440  // try
441  // {
442  // Data = Evaluate(OpenConnection);
443  // }
444  // catch (Exception E)
445  // {
446  // Log.Exception("Could not evaluate the OpenConnectionExpression {0} for {1} {2}.".Build(OpenConnectionExpression, this.GetType().Name, Name), E);
447  // }
448  // SendData(Data);
449  // }
450  // }
451  // }
452 
453  // protected override void DisconnectFromController()
454  // {
455  // lock (PortLocker)
456  // {
457  // if (Port != null)
458  // {
459  // byte[] Data = null;
460  // UpdateExpressionContextValues(new byte[NumberOfOutputs]);
461  // try
462  // {
463  // Data = Evaluate(CloseConnection);
464  // }
465  // catch (Exception E)
466  // {
467  // Log.Exception("Could not evaluate the CloseConnectionExpression {0} for {1} {2}.".Build(CloseConnectionExpression, this.GetType().Name, Name), E);
468  // }
469 
470  // try
471  // {
472  // SendData(Data);
473 
474  // }
475  // catch (Exception E)
476  // {
477  // Log.Exception(E.Message, E);
478  // }
479  // Port.Close();
480  // Port = null;
481  // OldValues = null;
482  // }
483 
484  // }
485  // }
486 
487  // private void SendData(byte[] Data)
488  // {
489  // lock (PortLocker)
490  // {
491  // try
492  // {
493  // Port.Write(Data, 0, Data.Length);
494  // }
495  // catch (Exception E)
496  // {
497  // throw new Exception("Could not send data to com port {0} for {1} {2}.".Build(ComPort, this.GetType().Name, Name), E);
498  // }
499  // }
500  // }
501 
502  //}
503 }