예제 #1
0
		public void AddRequest(Request request)
		{
			lock (locker)
			{
				Requests.Add(request);
			}
		}
예제 #2
0
		public Response AddRequest(int usbRequestNo, List<List<byte>> bytesList, int delay, int timeout, bool isSyncronuos, int countRacall, string name, string deviceName = null)
		{
			Responses = new List<Response>();
			RequestCollection.Clear();
			foreach (var bytes in bytesList)
			{
				if (usbRequestNo != -1)
				{
					if (bytesList.Count > 1)
					{
						usbRequestNo++;
					}
				}
				var request = new Request();
				if (UseId)
				{
					request.Id = usbRequestNo;
					if (usbRequestNo != -1)
					{
						bytes.InsertRange(0, BitConverter.GetBytes(usbRequestNo).Reverse());
					}
				}
				request.Bytes = CreateOutputBytes(bytes);
				RequestCollection.AddRequest(request);
				if (request.Bytes.Count > 64)
				{
					AutoWaitEvent = new AutoResetEvent(false);
					for (int i = 0; i < request.Bytes.Count / 64; i++)
					{
						var bytesToSend = request.Bytes.GetRange(i * 64, 64);
						bytesToSend.Insert(0, 0);
						Send(bytesToSend, name, deviceName, -1);
					}
					AutoWaitEvent.WaitOne(1000);
					RequestCollection.Clear();
					return Responses.FirstOrDefault();
				}
				else
				{
					request.Bytes.Insert(0, 0);
					if (isSyncronuos)
					{
						AutoWaitEvent = new AutoResetEvent(false);
					}
					Send(request.Bytes, name, deviceName, -1);
					if (isSyncronuos)
					{
						AutoWaitEvent.WaitOne(delay);
					}
				}
			}

			if (isSyncronuos)
			{
				foreach (var request in new List<Request>(RequestCollection.Requests))
				{
					if (request != null)
					{
						for (int i = 0; i < countRacall; i++)
						{
							if (IsDisposed)
							{
								RequestCollection.Clear();
								return null;
							}

							if (RequestCollection.Count() == 0)
								break;

							AutoWaitEvent.Reset();

							var result = Send(request.Bytes, name, deviceName, i);
							if (!result)
							{
								RequestCollection.Clear();
								return null;
							}

							if (RequestCollection.Count() == 0)
								break;
							AutoWaitEvent.WaitOne(timeout);

							if (i > 5)
							{
								Trace.WriteLine("CountRacall = " + i + " - " + name);
							}
						}
					}
				}
				RequestCollection.Clear();
				return Responses.FirstOrDefault();
			}
			RequestCollection.Clear();
			return null;
		}
예제 #3
0
		public static void SendAsync(Device device, string name, Request request)
		{
			lock (Locker)
			{
				var usbHid = GetUsbUsbHid(device);
				if (usbHid != null)
				{
					var bytes = request.Bytes.ToList();
					var rootBytes = CreateRootBytes(device, usbHid.UseId);
					bytes.InsertRange(0, rootBytes);
					var requestNo = NextRequestNo;
					if (usbHid.UseId)
					{
						request.Id = requestNo;
					}
					else
					{
						request.Id = 0;
					}
					request.RootBytes = rootBytes;
					usbHid.AddRequest(requestNo, new List<List<byte>> { bytes }, 1000, 1000, false, 15, name, device.DottedPresentationNameAndAddress);
				}
				else
				{
					request.Id = -1;
				}
			}
		}