写WPS思路

  1. 如果用户的高度设置为绝对高度,给予提示
    默认为相对高度 altmode.Relative

  2. 检查命令表格中的数据是否合法

利用的是double.TryParse(将String类型转换为等效双精度浮点数,一个指示转换是否成功的返回值)

  1. 警告AltWarn默认为0

指令是否包含Unknown,是continue,不是继续执行

  1. 将表格的第一列转换为cmd,利用Enum.parse(枚举类型,包含要转换的字符串,是否区分大小写)

如果cmd < mavcmd.last && 飞行高度的值小于警戒高度,并且cmd类型不是起飞、降落、返回出发点模式,就提示用户,这个高度小于警戒高度,需要改。我想应该是有一个最低的境界高度,如果低于这个高度,会有碰撞的危险

  1. 现在开始搞一个进度条,saveWPS

  2. saveWPS做什么呢?首先用个Try异常处理语句,包含代码。。。

  3. 检查端口是否正常链接;设置give-Comporttrue,防止其他代码对端口进行读写吧;接下来设置LocationWP-Home,这是一个自定义的类,包含了经纬度、高度、还有命令那些信息,这里对home有个异常处理,判断填入的经纬度信息是否是合法的。

  4. //这里出现了一个WPS,起这么个乱七八糟的名字我也是醉了。其实就是一个字典,键是一个int类型,值是Mission_item.检查表格中的数据,看看能不能只发送变化的部分。怎么检查呢

    {
    对WPF.Values进行遍历
    {
        if( a == -1)
        {
            a++;
            continue; //跳过Home
        }
        mission_item temp= DataViewToLocationWP //听名字也知道这是干啥的。就是将表格中的命令转换为Mission_item
        if(所有的数据都相等,比较的是循环的item和temp项)
        {
        }
        else
        {
            不匹配呢,加入到WPFUPload,其实也是一个字典,用来存储新的变化的部分
        }
    a++;
    } 
}
```
  1. 更新进度条,提示SetTotalWPS,发送航点,发送的是Mission_Count,返回的是Mission_result,对结果值进行判断,处理

  2. 更新进度条状态,变为SetHomeSetWp(home,0,Mav_mavFrame_global,0)

  3. 判断返回值是不是Accepted,接收了吗?

  4. 定义默认的Frame,默认就是mavFrame.Global.Relative.ALT

    if(不是最后一个命令或Do_setHome)
    {

       var mode = 现在选择的模式
       if(terriain)
           frame = Global_terriain_act;
       if(absolute)
           frame = Global;
       else
           frame = relative_alt

    }

  5. 尝试发送,MissionItem,对missionResult进行判断。处理

a++;

  1. 全部都发完了,发送一个ACK包,

  2. 设置半径啥的,全部完成之后,ok,显式Down


这都是些啥


读WPS思路

  1. 首先判断命令表格中的行数是否 > 0;如果是,代表你可能现在已经规划了一个任务,提示你现有操作将会清除你已经存在的任务,是否继续

  2. new一个进度条,显示getwps

  3. getwps做什么呢?这里面做了两件事,1、取得所有航点数量,2、然后循环所有航电添加到表格中

怎么实现的呢?

      List<Locationwp> cmds = new List<Locationwp>(); //
        try
        {
            MAVLinkInterface port = MainV2.comPort;

            if (!port.BaseStream.IsOpen)
            {
                throw new Exception("Please Connect First!");
            }

            MainV2.comPort.giveComport = true;

            param = port.MAV.param;

            ((ProgressReporterDialogue)sender).UpdateProgressAndStatus(0, "Getting WP count");
            //getWPCount返回航点的数量
            int cmdcount = port.getWPCount();

            //循环所有点,发送Request命令,调用getWP(a)返回对应的Item,Cmd.Add命令把Item加入到集合
            for (ushort a = 0; a < cmdcount; a++)
            {
                if (((ProgressReporterDialogue)sender).doWorkArgs.CancelRequested)
                {
                    ((ProgressReporterDialogue)sender).doWorkArgs.CancelAcknowledged = true;
                    throw new Exception("Cancel Requested");
                }

                log.Info("Getting WP" + a);
                ((ProgressReporterDialogue)sender).UpdateProgressAndStatus(a * 100 / cmdcount, "Getting WP " + a);
                //发送MissionRequest命令,取得MissionItem包
                cmds.Add(port.getWP(a));
            }
            //都搞完了,然后发一个ACK确认
            port.setWPACK();

            ((ProgressReporterDialogue)sender).UpdateProgressAndStatus(100, "Done");

            log.Info("Done");
        }
        catch { throw; }
        //这里把所有的item添加到屏幕上,包括地图中和表格中
        WPtoScreen(cmds);
    1. WPtoScreen做什么呢
      这里面调用了三个方法: 1、 processToScreen(cmds);2、getRallyPointsToolStripMenuItem_Click(null, null);3.、 writeKML();

    2. processToscreen(cmds)做什么?
      判断现有表格是否有数据,有的话先进行清理工作。判断cmd.count == 0,是的话return

          //把Home从Cmd中减去,Commdands就是表格,现在是-1
          int i = Commands.Rows.Count - 1;
          foreach (Locationwp temp in cmds)
          {
              i++;
              //Console.WriteLine("FP processToScreen " + i);
              if (temp.id == 0 && i != 0) // 0 and not home
                  break;
              if (temp.id == 255 && i != 0) // bad record - never loaded any WP's - but have started the board up.
                  break;
              //现有表格行数不够了
              if (i + 1 >= Commands.Rows.Count)
              {
                  selectedrow = Commands.Rows.Add();
              }
              //if (i == 0 && temp.alt == 0) // skip 0 home
              //  continue;
              DataGridViewTextBoxCell cell; 
              DataGridViewComboBoxCell cellcmd; //命令,是下拉框,可选择的
              cellcmd = Commands.Rows[i].Cells[Command.Index] as DataGridViewComboBoxCell;
              cellcmd.Value = "UNKNOWN";
              cellcmd.Tag = temp.id;
      
              foreach (object value in Enum.GetValues(typeof(MAVLink.MAV_CMD)))
              {
                  if ((int)value == temp.id)
                  {
                      //命令是missionitem中的命令,先把第一列都搞好了
                      cellcmd.Value = value.ToString();
                      break;
                  }
              }
      
              // from ap_common.h,对altmode进行设置,不大懂
              if (temp.id < (byte)MAVLink.MAV_CMD.LAST || temp.id == (byte)MAVLink.MAV_CMD.DO_SET_HOME)
              {
                  // check ralatice and terrain flags
                  if ((temp.options & 0x9) == 0 && i != 0)
                  {
                      CMB_altmode.SelectedValue = (int)altmode.Absolute;
                  }// check terrain flag
                  else if ((temp.options & 0x8) != 0 && i != 0)
                  {
                      CMB_altmode.SelectedValue = (int)altmode.Terrain;
                  }// check relative flag
                  else if ((temp.options & 0x1) != 0 && i != 0)
                  {
                      CMB_altmode.SelectedValue = (int)altmode.Relative;
                  }
              }
              //对高度进行赋值 。。 
              cell = Commands.Rows[i].Cells[Alt.Index] as DataGridViewTextBoxCell;
              cell.Value = Math.Round((temp.alt * CurrentState.multiplierdist), 0);
              。。。省略其他的
              //这个过会讲
              setWPParams();
          //设置Home相关比较简单,设置完成后还要把home在表格中移除
          try
          {
      
              DataGridViewTextBoxCell cellhome;
              cellhome = Commands.Rows[0].Cells[Lat.Index] as DataGridViewTextBoxCell;
              if (cellhome.Value != null)
              {
                  if (cellhome.Value.ToString() != TXT_homelat.Text && cellhome.Value.ToString() != "0")
                  {
                      DialogResult dr = CustomMessageBox.Show("Reset Home to loaded coords", "Reset Home Coords", MessageBoxButtons.YesNo);
      
                      if (dr == DialogResult.Yes)
                      {
                          TXT_homelat.Text = (double.Parse(cellhome.Value.ToString())).ToString();
                          cellhome = Commands.Rows[0].Cells[Lon.Index] as DataGridViewTextBoxCell;
                          TXT_homelng.Text = (double.Parse(cellhome.Value.ToString())).ToString();
                          cellhome = Commands.Rows[0].Cells[Alt.Index] as DataGridViewTextBoxCell;
                          TXT_homealt.Text = (double.Parse(cellhome.Value.ToString()) * CurrentState.multiplierdist).ToString();
                      }
                  }
              }
          }
      
    1. setWPParam就是设置一些半径啥的参数。对我现在来说没大有用。

    以上就是读的步骤