Esempio n. 1
0
        public async Task <bool> RequestInvoke(
            ushort endpointID,
            CancellationToken parentCancellationToken = default(CancellationToken),
            Policy requestPolicy = null)
        {
            var policyToUse = requestPolicy ?? StandardTimeoutWaitAndRetryPolicy.Value;

            return(await policyToUse.ExecuteAsync(async cancellationToken =>
            {
                var taskCompletionSource = new TaskCompletionSource <bool>();

                WireBuffer requestBuffer = null;
                requestBuffer = new WireBuffer(0);

                var request = new Request(
                    sequenceNumber: sequenceCounter.NextValue(),
                    endpointID: endpointID,
                    expectedResponseSize: 0,
                    requestACK: true,
                    populateBody: () => requestBuffer,
                    responseCallback: res =>
                {
                    taskCompletionSource.SetResult(true);
                },
                    signature: SchemaChecksum ?? Config.USB_PROTOCOL_VERSION,
                    cancellationToken: cancellationToken
                    );

                SendRequest(request);

                return await taskCompletionSource.Task.ConfigureAwait(false);
            }, parentCancellationToken).ConfigureAwait(false));
        }
Esempio n. 2
0
        public Request(
            ushort sequenceNumber,
            ushort endpointID,
            ushort expectedResponseSize,
            bool requestACK,
            Func <WireBuffer> populateBody,
            Action <Response> responseCallback,
            ushort signature,
            CancellationToken cancellationToken)
        {
            // NOTE: Regarding the 0x80 value, see https://github.com/madcowswe/ODrive/blob/eb07260c3ea57e74c59432fd036b275b608d85d0/Firmware/fibre/python/fibre/protocol.py#L276
            SequenceNumber        = sequenceNumber;
            EncodedSequenceNumber = (ushort)(sequenceNumber | 0x80);
            EndpointID            = endpointID;
            EncodedEndpointID     = (ushort)(requestACK ? endpointID | 0x8000 : endpointID);
            ExpectedResponseSize  = expectedResponseSize;
            RequestACK            = requestACK;
            Body              = populateBody.Invoke();
            ResponseCallback  = responseCallback;
            Signature         = signature;
            CancellationToken = cancellationToken;

            if (Body == null)
            {
                Body = new WireBuffer(0);
            }
        }
Esempio n. 3
0
        public Response(byte[] packetBytes, int packetLength)
        {
            Length = packetLength;

            var responseBuffer = new WireBuffer(packetBytes, Length);

            EncodedSequenceNumber = responseBuffer.Read <ushort>();
            SequenceNumber        = (ushort)(EncodedSequenceNumber & 0x7fff);

            Body = new WireBuffer(responseBuffer.ReadArray <byte>((byte)(Length - 2)), Length - 2);
        }
Esempio n. 4
0
        public byte[] ToByteArray()
        {
            var outputBuffer = new WireBuffer(Body.Data.Length + 8);

            // For general protocol doc this is written against, see https://github.com/madcowswe/ODrive/blob/1294ddff1dd0619e9f098ce12ca0936670a5b405/docs/protocol.md
            // Bytes 0, 1 Sequence number, MSB = 0
            // Bytes 2, 3 Endpoint ID
            // Bytes 4, 5 Expected response size
            // Bytes 6 to N-3 Payload
            // Bytes N-2, N-1 signature, depends on endpoint

            outputBuffer
            .Write(EncodedSequenceNumber)
            .Write(EncodedEndpointID)
            .Write(ExpectedResponseSize)
            .Write(Body.Data)
            .Write(Signature);

            return(outputBuffer.Data);
        }
Esempio n. 5
0
        public async Task <byte[]> RequestBufferSegment(
            uint payloadOffset = 0,
            CancellationToken parentCancellationToken = default(CancellationToken),
            Policy requestPolicy = null)
        {
            var policyToUse = requestPolicy ?? StandardTimeoutWaitAndRetryPolicy.Value;

            return(await policyToUse.ExecuteAsync(async cancellationToken =>
            {
                var taskCompletionSource = new TaskCompletionSource <byte[]>();

                byte[] cumulativeResponse = new byte[0];

                var request = new Request(
                    sequenceNumber: sequenceCounter.NextValue(),
                    endpointID: 0,
                    expectedResponseSize: 32,
                    requestACK: true,
                    populateBody: () =>
                {
                    var wireBuffer = new WireBuffer(4);
                    wireBuffer.Write(payloadOffset);
                    return wireBuffer;
                },
                    responseCallback: res =>
                {
                    var responseBytes = res.Body.Data;
                    taskCompletionSource.SetResult(responseBytes);
                },
                    signature: Config.USB_PROTOCOL_VERSION,
                    cancellationToken: cancellationToken
                    );

                SendRequest(request);

                return await taskCompletionSource.Task.ConfigureAwait(false);
            }, parentCancellationToken).ConfigureAwait(false));
        }