コード例 #1
0
        internal BufferedPipeThread(WinUSBDevice dev, byte pipeId, int bufferCount, int bufferSize)
        {
            Device       = dev;
            DevicePipeId = pipeId;
            int maxTransferSize = (int)dev.GetPipePolicy(pipeId, WinUsbPipePolicy.MAXIMUM_TRANSFER_SIZE);

            if (bufferSize > maxTransferSize)
            {
                bufferSize = maxTransferSize;
            }

            Buffers    = new QueuedBuffer[bufferCount];
            ReadEvents = new ManualResetEvent[bufferCount + 1];
            for (int i = 0; i < bufferCount; i++)
            {
                Buffers[i]    = new QueuedBuffer(bufferSize);
                ReadEvents[i] = Buffers[i].Overlapped.WaitEvent;
            }
            StopEvent = new ManualResetEvent(false);
            ReadEvents[bufferCount] = StopEvent;

            PipeThread = new Thread(ThreadFunc);
            PipeThread.IsBackground = true;

            foreach (QueuedBuffer qb in Buffers)
            {
                Device.BeginReadPipe(pipeId, qb);
            }
            PipeThread.Start();
        }
コード例 #2
0
        public BufferedPipeThread(WinUSBDevice dev, byte pipeId, int bufferCount, int bufferSize)
        {
            int maxTransferSize = (int)dev.GetPipePolicy(pipeId, WinUsbPipePolicy.MAXIMUM_TRANSFER_SIZE);

            if (bufferSize > maxTransferSize)
            {
                bufferSize = maxTransferSize;
            }

            BufferLock      = new object();
            PendingBuffers  = new Queue <QueuedBuffer>(bufferCount);
            ReceivedBuffers = new Queue <QueuedBuffer>(bufferCount);
            RequeuePending  = new Queue <QueuedBuffer>(bufferCount);
            BufferList      = new QueuedBuffer[bufferCount];
            for (int i = 0; i < bufferCount; i++)
            {
                BufferList[i] = new QueuedBuffer(bufferSize);
            }

            Device                    = dev;
            DevicePipeId              = pipeId;
            QueuedLength              = 0;
            ReceivedData              = new Queue <byte[]>();
            ReceiveTick               = new ManualResetEvent(false);
            PipeThread                = new Thread(ThreadFunc);
            PipeThread.IsBackground   = true;
            WorkerThread              = new Thread(WorkerThreadFunc);
            WorkerThread.IsBackground = true;
            ThreadNewData             = new AutoResetEvent(false);


            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.PIPE_TRANSFER_TIMEOUT, 1000);

            // Start reading on all the buffers.
            foreach (QueuedBuffer qb in BufferList)
            {
                dev.BeginReadPipe(pipeId, qb);
                PendingBuffers.Enqueue(qb);
            }

            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.RAW_IO, 1);

            PipeThread.Start();
            WorkerThread.Start();
        }
コード例 #3
0
ファイル: WinUSBDevice.cs プロジェクト: nymda/SeekSharp
        public BufferedPipeThread(WinUSBDevice dev, byte pipeId, int bufferCount, int multiPacketCount)
        {
            int maxTransferSize = (int)dev.GetPipePolicy(pipeId, WinUsbPipePolicy.MAXIMUM_TRANSFER_SIZE);

            int pipeSize   = 512; // Todo: query pipe transfer size for 1:1 mapping to packets.
            int bufferSize = pipeSize * multiPacketCount;

            if (bufferSize > maxTransferSize)
            {
                bufferSize = maxTransferSize;
            }

            PendingBuffers = new Queue <QueuedBuffer>(bufferCount);
            BufferList     = new QueuedBuffer[bufferCount];
            for (int i = 0; i < bufferCount; i++)
            {
                BufferList[i] = new QueuedBuffer(bufferSize);
            }

            EventConcurrency        = new Semaphore(3, 3);
            Device                  = dev;
            DevicePipeId            = pipeId;
            QueuedLength            = 0;
            ReceivedData            = new Queue <byte[]>();
            ReceiveTick             = new ManualResetEvent(false);
            PipeThread              = new Thread(ThreadFunc);
            PipeThread.IsBackground = true;

            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.PIPE_TRANSFER_TIMEOUT, 1000);

            // Start reading on all the buffers.
            foreach (QueuedBuffer qb in BufferList)
            {
                dev.BeginReadPipe(pipeId, qb);
                PendingBuffers.Enqueue(qb);
            }

            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.RAW_IO, 1);

            PipeThread.Start();
        }
コード例 #4
0
ファイル: WinUSBDevice.cs プロジェクト: apextw/winusbdotnet
        public BufferedPipeThread(WinUSBDevice dev, byte pipeId, int bufferCount, int bufferSize)
        {


            int maxTransferSize = (int)dev.GetPipePolicy(pipeId, WinUsbPipePolicy.MAXIMUM_TRANSFER_SIZE);

            if (bufferSize > maxTransferSize) { bufferSize = maxTransferSize; }

            BufferLock = new object();
            PendingBuffers = new Queue<QueuedBuffer>(bufferCount);
            ReceivedBuffers = new Queue<QueuedBuffer>(bufferCount);
            RequeuePending = new Queue<QueuedBuffer>(bufferCount);
            BufferList = new QueuedBuffer[bufferCount];
            for (int i = 0; i < bufferCount;i++)
            {
                BufferList[i] = new QueuedBuffer(bufferSize);
            }

            Device = dev;
            DevicePipeId = pipeId;
            QueuedLength = 0;
            ReceivedData = new Queue<byte[]>();
            ReceiveTick = new ManualResetEvent(false);
            PipeThread = new Thread(ThreadFunc);
            PipeThread.IsBackground = true;
            WorkerThread = new Thread(WorkerThreadFunc);
            WorkerThread.IsBackground = true;
            ThreadNewData = new AutoResetEvent(false);


            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.PIPE_TRANSFER_TIMEOUT, 1000);

            // Start reading on all the buffers.
            foreach(QueuedBuffer qb in BufferList)
            {
                dev.BeginReadPipe(pipeId, qb);
                PendingBuffers.Enqueue(qb);
            }

            //dev.SetPipePolicy(pipeId, WinUsbPipePolicy.RAW_IO, 1);

            PipeThread.Start();
            WorkerThread.Start();
        }