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)); }
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); } }
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); }
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); }
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)); }