DirectOuput Framework R2
DirectOutput framework R2 for virtual pinball cabinets
Go to:
Overview 
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Events Macros Pages
WS2811StripControllerApi.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 System.Threading;
7 using DirectOutput.Cab.Out.FTDIChip;
8 
9 namespace DirectOutput.Cab.Out.AdressableLedStrip
10 {
12  {
13  const string ControllerNameBase = "WS2811 Strip Controller ";
14 
15 
16  public void ClearData()
17  {
18  lock (FT245RLocker)
19  {
20  if (FT245R != null)
21  {
22  try
23  {
24  uint Dummy = 0;
25  FT245R.Write(new byte[] { (byte)'C' }, 1, ref Dummy);
26  }
27  catch { Close(); }
28  }
29  }
30  }
31 
32  public void DisplayData(int Length)
33  {
34  lock (FT245RLocker)
35  {
36  if (FT245R != null)
37  {
38  try
39  {
40  uint Dummy = 0;
41  FT245R.Write(new byte[] { (byte)'O', (byte)(Length / 256), (byte)(Length & 255) }, 3, ref Dummy);
42  }
43  catch { Close(); }
44  }
45  }
46  }
47 
48  public void SetAndDisplayData(byte[] Data)
49  {
50  lock (FT245RLocker)
51  {
52  SetData(Data);
53  DisplayData(Data.Length);
54  }
55  }
56 
57 
58  public void SetData(byte[] Data)
59  {
60  byte[] Header = { (byte)'R', (byte)(Data.Length / 256), (byte)(Data.Length & 255) };
61  lock (FT245RLocker)
62  {
63  if (FT245R != null)
64  {
65  try
66  {
67  uint Dummy = 0;
68  FT245R.Write(Header, 3, ref Dummy);
69  FT245R.Write(Data, Data.Length, ref Dummy);
70  if (Dummy != Data.Length)
71  {
72  Console.WriteLine("Stop");
73 
74  }
75  }
76  catch { Close(); }
77  }
78  }
79  }
80 
82 
83  public WS2811StripControllerApi(int ControllerNumber)
84  {
85  Open(ControllerNumber);
86 
87  }
88 
89  private int _ControllerNumber;
90 
91  public int ControllerNumber
92  {
93  get { return _ControllerNumber; }
94  private set { _ControllerNumber = value; }
95  }
96 
97 
98  public bool DeviceIsPresent
99  {
100  get
101  {
102  uint Dummy = 0;
103  return FT245R != null && FT245R.GetRxBytesAvailable(ref Dummy) == FTDI.FT_STATUS.FT_OK;
104  }
105  }
106 
107 
108 
109 
110  FTDI FT245R;
111  private object FT245RLocker = new object();
112 
113  public void Open(int ControllerNumber)
114  {
115  lock (FT245RLocker)
116  {
117  Close();
118 
119  bool OK = false;
120 
121  this.ControllerNumber = ControllerNumber;
122 
123  FT245R = new FTDI();
124  FTDI.FT_STATUS FTStatus;
125 
126 
127  //Get number of devices
128  uint DeviceCnt = 0;
129  FTStatus = FT245R.GetNumberOfDevices(ref DeviceCnt);
130 
131  if (FTStatus == FTDI.FT_STATUS.FT_OK && DeviceCnt > 0)
132  {
133  FTDI.FT_DEVICE_INFO_NODE[] Devices = new FTDI.FT_DEVICE_INFO_NODE[DeviceCnt];
134 
135  for (uint i = 0; i < DeviceCnt; i++)
136  {
137  FTStatus = FT245R.OpenByIndex(i);
138  Log.Write("Open {0}: Result: {1}".Build(i, FTStatus.ToString()));
139  if (FT245R.IsOpen)
140  {
141  string D = "";
142  FT245R.GetDescription(out D);
143  Log.Write("Desc: {0}".Build(D));
144  try
145  {
146  FTStatus = FT245R.Close();
147  Log.Write("Close {i}: Result: {1}".Build(i, FTStatus.ToString()));
148  } catch {}
149  }
150 
151  }
152  Log.Write("All listed");
153 
154  FTStatus = FT245R.GetDeviceList(Devices);
155  if (FTStatus == FTDI.FT_STATUS.FT_OK)
156  {
157  foreach (FTDI.FT_DEVICE_INFO_NODE DI in Devices)
158  {
159  Log.Write("Found {0}".Build(DI.Description));
160  }
161  foreach (FTDI.FT_DEVICE_INFO_NODE DI in Devices)
162  {
163  if (DI != null && DI.Type == FTDI.FT_DEVICE.FT_DEVICE_232R)
164  {
165  if (DI.Description == ControllerNameBase + ControllerNumber)
166  {
167 
168  FT245R.CharReceived += new EventHandler<EventArgs>(FT245R_CharReceived);
169 
170  FTStatus = FT245R.OpenByLocation(DI.LocId);
171  if (FTStatus == FTDI.FT_STATUS.FT_OK)
172  {
173  FTStatus = FT245R.Purge(FTDI.FT_PURGE.FT_PURGE_RX + FTDI.FT_PURGE.FT_PURGE_TX);
174  if (FTStatus == FTDI.FT_STATUS.FT_OK)
175  {
176  OK = true;
177  break;
178  }
179  else
180  {
181  Log.Exception("Purge failed for WS2811StripController {0} Error: {1}".Build(ControllerNumber, FTStatus.ToString()));
182  }
183  }
184  else
185  {
186  Log.Exception("Open failed for WS2811StripController {0}. Error: {1}".Build(ControllerNumber, FTStatus.ToString()));
187  }
188  }
189  }
190  }
191  }
192  else
193  {
194 
195  Log.Exception("Could not fetch devicelist for WS2811StripControllers. Error: {0}".Build(FTStatus.ToString()));
196  }
197  }
198 
199 
200  if (!OK)
201  {
202  Close();
203  }
204  }
205  }
206 
207  void FT245R_CharReceived(object sender, EventArgs e)
208  {
209  uint CharsToRead = 0;
210 
211  FT245R.GetRxBytesAvailable(ref CharsToRead);
212 
213  if (CharsToRead > 0)
214  {
215  uint BytesRead = 0;
216  byte[] Response = new Byte[CharsToRead];
217  FT245R.Read(Response, CharsToRead, ref BytesRead);
218 
219  bool OK = true;
220  for (int i = 0; i < BytesRead; i++)
221  {
222  if (Response[i] == 0x4e)
223  {
224  OK = false;
225  break;
226  }
227  }
228  if (!OK)
229  {
230  lock (FT245RLocker)
231  {
232  uint Dummy = 0;
233  for (int i = 0; i < 2000; i++)
234  {
235  FT245R.Write(new byte[10], 10, ref Dummy);
236  CharsToRead = 0;
237  FT245R.GetRxBytesAvailable(ref CharsToRead);
238  if (CharsToRead > 0)
239  {
240  Thread.Sleep(100);
241  CharsToRead = 0;
242  FT245R.GetRxBytesAvailable(ref CharsToRead);
243  Response = new Byte[CharsToRead];
244  BytesRead = 0;
245  FT245R.Read(Response, CharsToRead, ref BytesRead);
246  break;
247  }
248 
249 
250  }
251  }
252 
253 
254  }
255  }
256  }
257 
258 
259  public void Close()
260  {
261  lock (FT245RLocker)
262  {
263  if (FT245R != null)
264  {
265  if (FT245R.IsOpen)
266  {
267  FT245R.Close();
268  FT245R.CharReceived -= new EventHandler<EventArgs>(FT245R_CharReceived);
269  }
270  FT245R = null;
271  }
272  }
273  }
274 
275 
276 
277  public static List<int> GetAvailableControllerNumbers()
278  {
279  List<int> L = new List<int>();
280 
281  FTDI FTD2xxWrapper = new FTDI();
282  FTDI.FT_STATUS FTStatus;
283 
284  //Get number of devices
285  uint DeviceCnt = 0;
286  FTStatus = FTD2xxWrapper.GetNumberOfDevices(ref DeviceCnt);
287 
288  if (FTStatus == FTDI.FT_STATUS.FT_OK && DeviceCnt > 0)
289  {
290  FTDI.FT_DEVICE_INFO_NODE[] Devices = new FTDI.FT_DEVICE_INFO_NODE[DeviceCnt];
291 
292  FTStatus = FTD2xxWrapper.GetDeviceList(Devices);
293  if (FTStatus == FTDI.FT_STATUS.FT_OK)
294  {
295  foreach (FTDI.FT_DEVICE_INFO_NODE DI in Devices)
296  {
297  if (DI != null && DI.Type == FTDI.FT_DEVICE.FT_DEVICE_232R)
298  {
299  int ControllerNr = 0;
300  if (DI.Description.StartsWith(ControllerNameBase) && int.TryParse(DI.Description.Substring(ControllerNameBase.Length), out ControllerNr))
301  {
302  if (ControllerNr > 0)
303  {
304  L.Add(ControllerNr);
305 
306  }
307  }
308  }
309  }
310  }
311  }
312  return L;
313  }
314 
315 
316 
317  }
318 }