Skip to content

Commit 17a31ba

Browse files
committed
Awaiting PortFeedback for all motor and RGB commands
sharpbrick#21
1 parent 72f9353 commit 17a31ba

File tree

7 files changed

+64
-28
lines changed

7 files changed

+64
-28
lines changed

examples/SharpBrick.PoweredUp.Examples/ExampleMotorControl.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ public static async Task ExecuteAsync(PoweredUpHost host, IServiceProvider servi
2424

2525
await motor.StartSpeedAsync(100, 90, SpeedProfiles.None);
2626
await Task.Delay(2000);
27-
await motor.StartSpeedAsync(127, 90, SpeedProfiles.None);
2827
await motor.StartSpeedAsync(-100, 90, SpeedProfiles.None);
2928
await Task.Delay(2000);
3029
await motor.StartSpeedAsync(0, 90, SpeedProfiles.None);

examples/SharpBrick.PoweredUp.Examples/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ static async Task Main(string[] args)
1212
var (host, serviceProvider, selectedHub) = Example.ExampleHubDiscover.CreateHostAndDiscover(enableTrace);
1313

1414
//await Example.ExampleColors.ExecuteAsync(host, serviceProvider, selectedHub);
15-
//await Example.ExampleMotorControl.ExecuteAsynchost, serviceProvider, selectedHub
15+
//await Example.ExampleMotorControl.ExecuteAsync(host, serviceProvider, selectedHub);
1616
//await Example.ExampleMotorInputAbsolutePosition.ExecuteAsync(host, serviceProvider, selectedHub);
1717
//await Example.ExampleMotorVirtualPort.ExecuteAsync(host, serviceProvider, selectedHub);
1818
//await Example.ExampleHubActions.ExecuteAsync(host, serviceProvider, selectedHub);

src/SharpBrick.PoweredUp/Devices/AbsoluteMotor.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ protected AbsoluteMotor(IPoweredUpProtocol protocol, byte hubId, byte portId)
3333
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
3434
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
3535
/// <returns></returns>
36-
public async Task GotoAbsolutePositionAsync(int absolutePosition, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
36+
public async Task<PortFeedback> GotoAbsolutePositionAsync(int absolutePosition, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
3737
{
3838
AssertValidSpeed(speed, nameof(speed));
3939
AssertValidMaxPower(maxPower, nameof(maxPower));
4040
AssertIsConnected();
4141

42-
await _protocol.SendMessageAsync(new PortOutputCommandGotoAbsolutePositionMessage()
42+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandGotoAbsolutePositionMessage()
4343
{
4444
HubId = _hubId,
4545
PortId = _portId,
@@ -51,6 +51,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandGotoAbsolutePositionMessag
5151
EndState = endState,
5252
Profile = profile,
5353
});
54+
55+
return response;
5456
}
5557

5658
/// <summary>
@@ -63,14 +65,14 @@ await _protocol.SendMessageAsync(new PortOutputCommandGotoAbsolutePositionMessag
6365
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
6466
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
6567
/// <returns></returns>
66-
public async Task GotoAbsolutePositionAsync(int absolutePosition1, int absolutePosition2, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
68+
public async Task<PortFeedback> GotoAbsolutePositionAsync(int absolutePosition1, int absolutePosition2, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
6769
{
6870
AssertValidSpeed(speed, nameof(speed));
6971
AssertValidMaxPower(maxPower, nameof(maxPower));
7072
AssertIsConnected();
7173
AssertIsVirtualPort();
7274

73-
await _protocol.SendMessageAsync(new PortOutputCommandGotoAbsolutePosition2Message()
75+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandGotoAbsolutePosition2Message()
7476
{
7577
HubId = _hubId,
7678
PortId = _portId,
@@ -83,6 +85,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandGotoAbsolutePosition2Messa
8385
EndState = endState,
8486
Profile = profile,
8587
});
88+
89+
return response;
8690
}
8791
}
8892
}

src/SharpBrick.PoweredUp/Devices/BasicMotor.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,21 @@ public BasicMotor(IPoweredUpProtocol protocol, byte hubId, byte portId)
3333
/// - Stop Motor (breaking): 127
3434
/// </param>
3535
/// <returns>An awaitable Task.</returns>
36-
public async Task StartPowerAsync(sbyte power)
36+
public async Task<PortFeedback> StartPowerAsync(sbyte power)
3737
{
3838
AssertValidPower(power, nameof(power));
3939
AssertIsConnected();
4040

41-
await _protocol.SendMessageAsync(new PortOutputCommandStartPowerMessage()
41+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartPowerMessage()
4242
{
4343
HubId = _hubId,
4444
PortId = _portId,
4545
StartupInformation = PortOutputCommandStartupInformation.ExecuteImmediately,
4646
CompletionInformation = PortOutputCommandCompletionInformation.CommandFeedback,
4747
Power = power,
4848
});
49+
50+
return response;
4951
}
5052

5153
/// <summary>
@@ -76,14 +78,14 @@ public Task StopByFloatAsync()
7678
/// - Stop Motor (breaking): 127
7779
/// </param>
7880
/// <returns></returns>
79-
public async Task StartPowerAsync(sbyte powerOnMotor1, sbyte powerOnMotor2)
81+
public async Task<PortFeedback> StartPowerAsync(sbyte powerOnMotor1, sbyte powerOnMotor2)
8082
{
8183
AssertValidPower(powerOnMotor1, nameof(powerOnMotor1));
8284
AssertValidPower(powerOnMotor2, nameof(powerOnMotor2));
8385
AssertIsConnected();
8486
AssertIsVirtualPort();
8587

86-
await _protocol.SendMessageAsync(new PortOutputCommandStartPower2Message()
88+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartPower2Message()
8789
{
8890
HubId = _hubId,
8991
PortId = _portId,
@@ -92,6 +94,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartPower2Message()
9294
Power1 = powerOnMotor1,
9395
Power2 = powerOnMotor2,
9496
});
97+
98+
return response;
9599
}
96100

97101
protected void AssertValidPower(sbyte power, string argumentName)

src/SharpBrick.PoweredUp/Devices/RgbLight.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetRgbColorNoMessage()
3030
ColorNo = color,
3131
});
3232
}
33-
public async Task SetRgbColorsAsync(byte red, byte green, byte blue)
33+
public async Task<PortFeedback> SetRgbColorsAsync(byte red, byte green, byte blue)
3434
{
3535
AssertIsConnected();
3636

@@ -42,7 +42,8 @@ await _protocol.SendMessageAsync(new PortInputFormatSetupSingleMessage()
4242
DeltaInterval = 10000,
4343
NotificationEnabled = false,
4444
});
45-
await _protocol.SendMessageAsync(new PortOutputCommandSetRgbColorNo2Message()
45+
46+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandSetRgbColorNo2Message()
4647
{
4748
HubId = _hubId,
4849
PortId = _portId,
@@ -52,6 +53,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetRgbColorNo2Message()
5253
GreenColor = green,
5354
BlueColor = blue,
5455
});
56+
57+
return response;
5558
}
5659

5760
public IEnumerable<byte[]> GetStaticPortInfoMessages(Version softwareVersion, Version hardwareVersion)

src/SharpBrick.PoweredUp/Devices/TachoMotor.cs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ protected TachoMotor(IPoweredUpProtocol protocol, byte hubId, byte portId)
4343
/// </param>
4444
/// <param name="profileNumber">Specify the acceleration profile used. Defaults to standard AccelerationProfile.</param>
4545
/// <returns></returns>
46-
public async Task SetAccelerationTimeAsync(ushort timeInMs, SpeedProfiles profileNumber = SpeedProfiles.AccelerationProfile)
46+
public async Task<PortFeedback> SetAccelerationTimeAsync(ushort timeInMs, SpeedProfiles profileNumber = SpeedProfiles.AccelerationProfile)
4747
{
4848
if (timeInMs < 0 || timeInMs > 10_000)
4949
{
5050
throw new ArgumentOutOfRangeException(nameof(timeInMs));
5151
}
5252
AssertIsConnected();
5353

54-
await _protocol.SendMessageAsync(new PortOutputCommandSetAccTimeMessage()
54+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandSetAccTimeMessage()
5555
{
5656
HubId = _hubId,
5757
PortId = _portId,
@@ -60,6 +60,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetAccTimeMessage()
6060
Time = timeInMs,
6161
Profile = profileNumber,
6262
});
63+
64+
return response;
6365
}
6466

6567
/// <summary>
@@ -73,15 +75,15 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetAccTimeMessage()
7375
/// </param>
7476
/// <param name="profileNumber">Specify the deceleration profile used. Defaults to standard DecelerationProfile.</param>
7577
/// <returns></returns>
76-
public async Task SetDecelerationTimeAsync(ushort timeInMs, SpeedProfiles profileNumber = SpeedProfiles.DecelerationProfile)
78+
public async Task<PortFeedback> SetDecelerationTimeAsync(ushort timeInMs, SpeedProfiles profileNumber = SpeedProfiles.DecelerationProfile)
7779
{
7880
if (timeInMs < 0 || timeInMs > 10_000)
7981
{
8082
throw new ArgumentOutOfRangeException(nameof(timeInMs));
8183
}
8284
AssertIsConnected();
8385

84-
await _protocol.SendMessageAsync(new PortOutputCommandSetDecTimeMessage()
86+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandSetDecTimeMessage()
8587
{
8688
HubId = _hubId,
8789
PortId = _portId,
@@ -90,6 +92,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetDecTimeMessage()
9092
Time = timeInMs,
9193
Profile = profileNumber,
9294
});
95+
96+
return response;
9397
}
9498

9599
/// <summary>
@@ -102,13 +106,13 @@ await _protocol.SendMessageAsync(new PortOutputCommandSetDecTimeMessage()
102106
/// <param name="maxPower">Maximum Power level used.</param>
103107
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
104108
/// <returns></returns>
105-
public async Task StartSpeedAsync(sbyte speed, byte maxPower, SpeedProfiles profile)
109+
public async Task<PortFeedback> StartSpeedAsync(sbyte speed, byte maxPower, SpeedProfiles profile)
106110
{
107111
AssertValidSpeed(speed, nameof(speed));
108112
AssertValidMaxPower(maxPower, nameof(maxPower));
109113
AssertIsConnected();
110114

111-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedMessage()
115+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeedMessage()
112116
{
113117
HubId = _hubId,
114118
PortId = _portId,
@@ -118,6 +122,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedMessage()
118122
MaxPower = maxPower,
119123
Profile = profile,
120124
});
125+
126+
return response;
121127
}
122128

123129
/// <summary>
@@ -134,15 +140,15 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedMessage()
134140
/// <param name="maxPower">Maximum Power level used.</param>
135141
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
136142
/// <returns></returns>
137-
public async Task StartSpeedAsync(sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpeedProfiles profile)
143+
public async Task<PortFeedback> StartSpeedAsync(sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpeedProfiles profile)
138144
{
139145
AssertValidSpeed(speedOnMotor1, nameof(speedOnMotor1));
140146
AssertValidSpeed(speedOnMotor2, nameof(speedOnMotor2));
141147
AssertValidMaxPower(maxPower, nameof(maxPower));
142148
AssertIsConnected();
143149
AssertIsVirtualPort();
144150

145-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeed2Message()
151+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeed2Message()
146152
{
147153
HubId = _hubId,
148154
PortId = _portId,
@@ -153,6 +159,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeed2Message()
153159
MaxPower = maxPower,
154160
Profile = profile,
155161
});
162+
163+
return response;
156164
}
157165

158166
/// <summary>
@@ -167,13 +175,13 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeed2Message()
167175
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
168176
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
169177
/// <returns></returns>
170-
public async Task StartSpeedForTimeAsync(ushort timeInMs, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
178+
public async Task<PortFeedback> StartSpeedForTimeAsync(ushort timeInMs, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
171179
{
172180
AssertValidSpeed(speed, nameof(speed));
173181
AssertValidMaxPower(maxPower, nameof(maxPower));
174182
AssertIsConnected();
175183

176-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTimeMessage()
184+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeedForTimeMessage()
177185
{
178186
HubId = _hubId,
179187
PortId = _portId,
@@ -185,6 +193,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTimeMessage()
185193
EndState = endState,
186194
Profile = profile,
187195
});
196+
197+
return response;
188198
}
189199

190200
/// <summary>
@@ -203,15 +213,15 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTimeMessage()
203213
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
204214
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
205215
/// <returns></returns>
206-
public async Task StartSpeedForTimeAsync(ushort timeInMs, sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
216+
public async Task<PortFeedback> StartSpeedForTimeAsync(ushort timeInMs, sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
207217
{
208218
AssertValidSpeed(speedOnMotor1, nameof(speedOnMotor1));
209219
AssertValidSpeed(speedOnMotor2, nameof(speedOnMotor2));
210220
AssertValidMaxPower(maxPower, nameof(maxPower));
211221
AssertIsConnected();
212222
AssertIsVirtualPort();
213223

214-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTime2Message()
224+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeedForTime2Message()
215225
{
216226
HubId = _hubId,
217227
PortId = _portId,
@@ -224,6 +234,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTime2Message(
224234
EndState = endState,
225235
Profile = profile,
226236
});
237+
238+
return response;
227239
}
228240

229241
/// <summary>
@@ -235,14 +247,14 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForTime2Message(
235247
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
236248
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
237249
/// <returns></returns>
238-
public async Task StartSpeedForDegreesAsync(uint degrees, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
250+
public async Task<PortFeedback> StartSpeedForDegreesAsync(uint degrees, sbyte speed, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
239251
{
240252
AssertValidDegrees(degrees, nameof(degrees));
241253
AssertValidSpeed(speed, nameof(speed));
242254
AssertValidMaxPower(maxPower, nameof(maxPower));
243255
AssertIsConnected();
244256

245-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForDegreesMessage()
257+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeedForDegreesMessage()
246258
{
247259
HubId = _hubId,
248260
PortId = _portId,
@@ -254,6 +266,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForDegreesMessag
254266
EndState = endState,
255267
Profile = profile,
256268
});
269+
270+
return response;
257271
}
258272

259273
/// <summary>
@@ -266,7 +280,7 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForDegreesMessag
266280
/// <param name="endState">After time has expired, either Float, Hold or Brake.</param>
267281
/// <param name="profile">The speed profiles used (as flags) for acceleration and deceleration</param>
268282
/// <returns></returns>
269-
public async Task StartSpeedForDegreesAsync(uint degrees, sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
283+
public async Task<PortFeedback> StartSpeedForDegreesAsync(uint degrees, sbyte speedOnMotor1, sbyte speedOnMotor2, byte maxPower, SpecialSpeed endState, SpeedProfiles profile)
270284
{
271285
AssertValidDegrees(degrees, nameof(degrees));
272286
AssertValidSpeed(speedOnMotor1, nameof(speedOnMotor1));
@@ -275,7 +289,7 @@ public async Task StartSpeedForDegreesAsync(uint degrees, sbyte speedOnMotor1, s
275289
AssertIsConnected();
276290
AssertIsVirtualPort();
277291

278-
await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForDegrees2Message()
292+
var response = await _protocol.SendPortOutputCommandAsync(new PortOutputCommandStartSpeedForDegrees2Message()
279293
{
280294
HubId = _hubId,
281295
PortId = _portId,
@@ -288,6 +302,8 @@ await _protocol.SendMessageAsync(new PortOutputCommandStartSpeedForDegrees2Messa
288302
EndState = endState,
289303
Profile = profile,
290304
});
305+
306+
return response;
291307
}
292308

293309
protected void AssertValidSpeed(sbyte speed, string argumentName)

src/SharpBrick.PoweredUp/Protocol/IPoweredUpProtocolExtensions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using System.Reactive.Linq;
34
using System.Threading.Tasks;
45
using SharpBrick.PoweredUp.Protocol.Messages;
@@ -21,5 +22,14 @@ public static async Task<TResultMessage> SendMessageReceiveResultAsync<TResultMe
2122

2223
return result;
2324
}
25+
26+
public static async Task<PortFeedback> SendPortOutputCommandAsync(this IPoweredUpProtocol self, PortOutputCommandMessage message)
27+
{
28+
var portId = message.PortId;
29+
30+
var response = await self.SendMessageReceiveResultAsync<PortOutputCommandFeedbackMessage>(message, msg => msg.Feedbacks.Any(f => f.PortId == portId));
31+
32+
return response.Feedbacks.FirstOrDefault(f => f.PortId == portId).Feedback;
33+
}
2434
}
2535
}

0 commit comments

Comments
 (0)