对象链接与API扩展中的方法

时间:2015-10-04 13:33:03

标签: c# oop mindstorms

因此,我正在寻求根据自己的需要扩展/调整API。我正在谈论Lego Mindstorms C#API。我正在围绕它构建我自己的API(基于适配器模式),因此我可以以更好的OO方式对机器人进行编程。

以下是有关API如何运作的链接:Lego Mindstorms EV3 C# API

但是现在我陷入了一种非常奇怪的方式,C#API处理砖块的命令。

  

绝对不是OO-way ......

示例:要向砖块发送命令,您需要拥有砖块实例才能发送命令。但DirectCommand实例与砖块无关。

await brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50, 5000);

所以我想要做的就是让brick和DirectCommand松散耦合。

以下是另一个例子:执行一批命令。您必须写出所有命令,然后执行某种方法。在当前的API中,无法循环遍历数组并添加堆栈元素,以便稍后执行它们。

brick.BatchCommand.TurnMotorAtSpeedForTime(OutputPort.A, 50, 1000, false);
brick.BatchCommand.TurnMotorAtPowerForTime(OutputPort.C, 50, 1000, false);
brick.BatchCommand.PlayTone(50, 1000, 500);
await brick.BatchCommand.SendCommandAsync();

所以我想做的事情是:

创建一个像PlayTone(..)这样的命令,将它添加到命令的数组列表中,然后遍历它......

List<Command> toBeExecuted = new List<Command>;
toBeExecuted.Add(DirectCommand.PlayTone(50, 1000, 500));
brick.DirectCommand(toBeExecuted[0]);

所以,如果有人可以提供帮助......我会非常高兴的。)

1 个答案:

答案 0 :(得分:1)

不完全是他们的设计目标,但是你可以将它们排列为任务列表,然后传递它吗?

像这样:

static void Main(string[] args)
{
    //---- queue commands into a "batch"
    List<Task> toBeExecuted  = new List<Task>();
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));
    toBeExecuted.Add(Task.Run(() => dothing()));


    //---- elsewhere
    Task.WaitAll(toBeExecuted.ToArray()); //fire off the batch
    await brick.BatchCommand.SendCommandAsync(); //send to brick
}

将dothing()替换为要排队的批处理命令:

.Add(Task.Run(() => brick.BatchCommand...()));