Windows Mobile 的 PlanetFinder






4.26/5 (8投票s)
Windows Mobile 智能手机的 PlanetFinder 应用程序

Planet Finder 是一个用于构建天空图像的 Java 小程序。该小程序可以显示任何地点、任何日期和时间的天空中行星、恒星、月亮和太阳的位置。它基本上使用开普勒定律来计算恒星和行星的位置。只有月亮使用了更复杂的计算。这意味着生成的天空图的准确性不是完美的,但它仍然有助于识别夜空中的物体。
几年前,我将这个小程序移植到了 诺基亚 Series60 第二版手机。最近我决定将代码移植到 Windows Mobile。尽管我已有 C++ 代码,但我决定使用 .NET Compact Framework 编写应用程序。我使用了 2.0 版的框架,并以智能手机平台为目标。该应用程序可以在 Windows Mobile 5 和 Windows Mobile 6 设备上运行。
在现有功能的基础上,我专门为 Windows Mobile 移植版添加了一些有趣的功能,以增强用户体验
- 能够添加用户自定义的坐标集
- 能够从 GPS 接收器读取位置和时间
- 为夜间观看设置背光开和关
当然,文章末尾还列出了缺少的功能和待办事项。
安装
要安装应用程序,只需解压缩 zip 文件中的内容并将其复制到设备中的一个文件夹。
用户指南
尽管我相信无需阅读任何说明即可运行该应用程序,但我在此列出了一些常见操作。
选择您的位置:首次运行应用程序时,它将从手机读取时区信息并选择您时区中最大的城市。然后,您可以通过“设置”、“位置”菜单项选择一个新城市。只会列出您时区中的城市。或者,您可以使用面板微调您的位置。
配置时间:默认情况下,应用程序会绘制与当前时间(从手机读取)对应的天空图像。天空图像每分钟更新一次。如果您想为未来或过去某个时间构建图像,请取消选中“偏好设置”对话框中的“自动更新”框(从菜单中选择“设置”、“偏好设置”以显示对话框)。然后使用面板选择时间。
时区和夏令时:默认情况下,应用程序从手机读取此信息。如果您喜欢手动设置,请在“时间设置”对话框中取消选中“自动”框。当应用程序推断夏令时生效时(无论是从手机还是手动设置),它将从当前时间中减去一小时。这并非 100% 准确,但对于大多数情况来说已经足够。
添加新位置:当您微调您的位置时,您可能希望将其保存以备将来参考。您可以通过从菜单中选择“设置”、“位置”,然后选择“添加”来完成此操作。您需要为新位置定义名称、经度、纬度和时区。
使用 GPS 接收器:应用程序从 GPS 中间驱动程序读取 GPS 信息。不幸的是,所需的 GPS 控制面板可能并非在所有智能手机上都可用。在这种情况下,您需要做一些额外的工作。我为您提供了一些外部链接(配置您的设备以使用 GPS MSDN 文章和 在 Windows Mobile 5 上设置 GPS 博客条目)以获取信息。要开始使用 GPS 数据,请从菜单中选择“GPS”。将显示一个包含从 GPS 接收器读取的信息的框。一旦 GPS 信号足以提取经度、纬度和时间,该框将消失,并显示您当前位置的天空图像。要停止使用 GPS,请再次从菜单中选择“GPS”。如果 GPS 读取的信息有效,则应用程序将继续使用相同的经度和纬度。然后您可以继续使用这些值创建位置。
背光:该应用程序主要在夜间使用,与通常情况相反,背光可能不受欢迎。原因是,在看到亮光源后,人们很难再观察夜空并定位恒星和行星物体。因此,我认为给予用户禁用背光操作的选项是一个好主意。您可以通过“偏好设置”对话框,勾选“背光关闭”框来完成此操作。请注意,这是一个实验性功能,可能并非在所有手机上都有效。此外,即使应用程序最小化,更改也将应用,但退出应用程序或软重置后将不会保留。
源代码
该应用程序是使用 Visual Studio 2005 和 Windows Mobile 5.0 SDK 开发的。使用了 Windows Mobile 6.0 SDK 中的 GPS 示例。
我真的不能对 PlanetFinder 的引擎说太多,因为我在移植时没有试图完全理解其背后的天文概念。但我已经验证了 Windows Mobile 移植版的结果与原始小程序的结果相匹配。
用户界面部分是一个标准的移动 Windows Form 应用程序。我尝试使用了尽可能多的编程技术(将用户偏好设置持久化到注册表,将位置读取和写入文件,为经度和纬度控件切换到数字输入),以便为应用程序提供更专业的风格。
背光
背光通过调用 DevicePowerNotify
函数来控制。我创建了一个包含一个静态方法的类来启用/禁用背光,代码如下所示。调用 Backlight.Enable(false);
后,即使用户按下某些按键,背光也会保持关闭状态。正如我之前所说,此代码可能无法在所有手机上运行。Windows Mobile 要求背光驱动程序名为“BKL1:”,但是电源状态可能由不同的驱动程序以不同的方式处理,或者驱动程序可能不完全支持此操作。
public class Backlight
{
static public void Enable(bool enable)
{
if (enable)
{
DevicePowerNotify("BKL1:", CEDevicePowerState.D0, 1);
}
else
{
DevicePowerNotify("BKL1:", CEDevicePowerState.D4, 1);
}
}
private enum CEDevicePowerState
{
PwrDeviceUnspecified = -1,
D0 = 0,
D1 = 1,
D2 = 2,
D3 = 3,
D4 = 4,
PwrDeviceMaximum = 5
}
[DllImport("coredll.dll", SetLastError = true)]
extern private static IntPtr DevicePowerNotify(string pvDevice,
CEDevicePowerState DeviceState, UInt32 StateFlags);
}
Symbian 和 Windows Mobile 移植版的比较
在完成 Windows Mobile 和 Symbian Series60 设备的移植后,我想写一些文字来比较我的经验。从应用程序开发者的角度来看,Windows Mobile 环境更容易使用。在使用 Series60 设备时,我必须为应用程序范围之外的事情而努力。我花了大量时间尝试创建对话框和控件、读取和写入资源文件以及启用设备调试。在 Windows Mobile 平台上,我轻松解决了所有这些问题,我可以专注于我的应用程序。这就是为什么我能够在不花费更多时间的情况下提供一个更丰富的移植版。当然,现在 Series60 平台上的事情变得更容易了,但是 Visual Studio 仍然比 Symbian 工具好得多。我甚至不敢将 C# 与典型的 Symbian C++ 进行比较。Symbian 的一个缺点是引入了受限 API,如果需要访问这些 API,开发人员必须购买证书或通过不可靠的开源签名过程。
下面我列出了应用程序可能的一些增强功能。我绝不会考虑为 Series60 设备实现它们——事实上,我甚至不再维护这个移植版了。但是,如果有时间,我可能会为 Windows Mobile 实现它们。
待办事项
该应用程序仍然缺少一些有用的功能。其中最重要的列在此处。
- 本地化。目前用户界面和 PlanetFinder 引擎(行星名称)都没有本地化。
- PlanetFinder 引擎使用 2000 年 1 月 1 日作为计算的参考日期。此日期中物体的位置是硬编码的,并用于未来位置的计算。由于这些计算中只采用了开普勒定律,因此距离此日期越远,不准确性就越大。因此,最好使用一个更近的参考日期。更好的是让应用程序从外部文件加载参考信息。
- 添加最亮的恒星和星座的名称。在天空中识别它们。
- 放大功能
历史
- 2008 年 11 月 27 日:上传到 CodeProject
- 2008 年 12 月 17 日:修改退出代码。添加了在应用程序最小化时停止 GPS 和动画的逻辑。