// Sends a rotate command to the robot and returns right away
 // The robot will go forward until it hits a dead end or until
 // it's crossed intersectionGoal intersections. This async call
 // will allow the thread to filter for intersection detected messages.
 // intersectionGoal = 0 for unlimited
 private void goStraightAsync(int intersectionGoal)
 {
     byte[] filterHead = { 0xEE };
     StringBuilder buf = new StringBuilder();
     buf.Append("PID_LINE ");
     buf.Append(intersectionGoal + " ");
     buf.Append(straightPowerHigh + " ");
     buf.Append(straightPowerLow + " ");
     buf.Append(straightLowPowerZone + " ");
     buf.Append(straightKP + " ");
     buf.Append(straightKI + " ");
     buf.Append(straightKD + " ");
     buf.Append(dampingFactor + " ");
     buf.Append(iSectDetectDelay);
     RobotCommand c = new RobotCommand(buf.ToString());
     PacketFilter filter = new PacketFilter(link, filterHead, c.Sequence);
     filter.init();
     link.sendCommand(c);
     this.lastPacketFilter = filter;
 }