OpenCPN-low-energy/diagram-approach

跳转到:导航搜索

一种图解方法

图解是真正可视化程序运行时发生情况的最佳方式。

我们需要查看哪些文件

我们已经建立了一个与我们感兴趣的内容相关的文件的列表。该列表首先通过查找我们绝对不需要的文件(例如选项窗口)来建立。然后,我们将列表缩小到我们可以修改的类和功能(我们不能修改碰撞系统,因为这显然太危险了)。为了更具体,我们只保留了带有计时器的文件,因为我们寻找的是每 X 秒发生的动作。最终,文件列表是:

  • chart1.cpp
  • chcanv.cpp
  • ais.cpp (在当前版本中:AIS_Decoder.cpp)

主窗口如何刷新?

我们成功找到了在文件 chart1.cpp 中刷新主窗口的代码片段。刷新操作每 5 秒执行一次。动作不是位于循环中,而是由计时器事件 FrameTimer1 触发。当计时器发出 timerEvent 时执行的动作是:如果需要,重新加载图块(如果船只已超出当前图块) 在图表上打印船只 在图表上打印 AIS 获取的船只 查找可能的锚泊警报 更新各种导航指示器的看门狗 每 30 分钟将位置记录在 opencpn.log 文件中

OnFrameTimer1 函数的详细图解

函数流程图

AIS 完成了什么?

与主窗口刷新操作一样,AIS 数据获取依赖于一个计时器 (TimerAIS),该计时器每 995 毫秒触发 AIS_Decoder::OnTimerAIS() 函数。此方法执行的动作主要涉及获取 AIS 数据和删除旧的 AIS 目标。碰撞检测系统也在此方法中实现。碰撞被定义为船只过于靠近您的船只位置。如果可能发生碰撞,则会弹出一个碰撞警报窗口并播放声音(这是一个选项)。

OnTimerAIS 函数的详细图解

函数流程图

初始化过程中完成了什么?

程序从 Chart1.cpp 中的 OnInit() 函数开始,该函数由 wxWidgets 需要。此函数在大致五个步骤中进行初始化:

  • 准备配置
  • 准备 UI
  • 加载数据
  • 启动计时器
  • 显示 UI

计时器处理图表刷新,以及在航行模式下处理图表旋转。潮汐和水流不是通过主图表刷新计时器来刷新,而是有自己的计时器。

初始化流程图

旋转、潮汐和水流计时器

这些计时器执行简单的操作:旋转计时器计算角度并刷新,而水流和潮汐计时器要求更新其数据设置一个布尔值。

旋转流程图 潮汐和水流流程图