Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
引言
天气服务在InfiniTime 1.8中发布,虽然它已经被多个伴侣应用(如ITD、Amazfish、Gadgetbridge等)集成,但我们直到InfiniTime 1.13才开始使用它,当时我们在PTS表盘上实现了天气显示。
不幸的是,没过多久我们就收到了关于https://github.com/InfiniTimeOrg/InfiniTime/issues/1786、https://github.com/InfiniTimeOrg/InfiniTime/issues/1788和崩溃的报告。
多位贡献者分析了这些问题并尝试修复它们(https://github.com/InfiniTimeOrg/InfiniTime/pull/1904、https://github.com/InfiniTimeOrg/InfiniTime/pull/1890、https://github.com/InfiniTimeOrg/InfiniTime/pull/1882、https://github.com/InfiniTimeOrg/InfiniTime/pull/1879、https://github.com/InfiniTimeOrg/InfiniTime/pull/1860和https://github.com/InfiniTimeOrg/InfiniTime/pull/1822),但不幸的是,我们未能找到满意的解决方案。
因此,我决定仔细研究这些错误报告,以试图理解发生了什么。我写下了我的观察结果https://github.com/InfiniTimeOrg/InfiniTime/pull/1822#issuecomment-1712842416。以下是总结:
天气服务的内存使用几乎是无限的:只有当旧事件过期时才会被擦除。如果在先前的数据仍然有效时伴侣应用发送新数据,内存使用量会增加。API没有提供任何方式让伴侣应用帮助管理内存使用(它们不知道哪些事件已经由这个或其他伴侣应用发送)。由于同一类型的多个事件可以存储在时间线中,InfiniTime不知道哪个值必须显示为“当前温度”等。时间线实现允许许多高级用例,但在我看来,太复杂以至于无法支持我们目前实现的简单用例(在表盘上显示当前天气)。
像其他几位贡献者一样,我与已经参与天气功能开发的开发者交谈,做了很多测试和实验,尝试找到改进当前实现的解决方案,但最终,我没能找到一个满意的解决方案来使天气功能可靠、稳定且易于维护。
我最终得出的结论是,当前的实现和API不符合我们的需求,我们需要从头开始设计这个功能。这不是一个容易的决定:我知道许多人花费了大量的宝贵时间来开发当前的实现并将其集成到伴侣应用中。从头开始似乎是时间和精力的巨大浪费,但……我找不到其他解决方案。
为了设计这个新的天气功能的实现,我首先列出了我们要支持的用例:显示当前天气(温度和天气状况,如晴天、雨天、多云等)和未来几天的预报。
然后我与几位伴侣应用开发者(如来自Amazfish的Adam和Josef,来自ITD的Elara)讨论,以便设计一个BLE API,允许伴侣应用提供InfiniTime所需的数据。Josef甚至在Amazfish中提供了一个实现新天气协议的分支,以便我可以在InfiniTime中实现和测试它。
最后,我在InfiniTime中实现了这个API,并确保数据在PTS中正确显示。
BLE API
BLE API的文档在doc/SimpleWeatherService.md中。它是一个非常简单的服务,提供一个单一的特性。伴侣应用使用此特性写入当前天气信息和未来5天的天气预报。由于API使用消息类型字段和版本字段,如果将来需要向天气信息添加更多数据或实现新的用例,可以扩展它。
在InfiniTime中的实现和集成
API在InfiniTime中的实现(在src/components/ble/SimpleWeatherService.h和src/components/ble/SimpleWeatherService.cpp)首先解析并验证来自BLE特性的数据,然后存储这些数据。然而,它不存储数据的多个版本:新数据总是覆盖旧数据。SimpleWeatherService将这些数据作为std::optional字段公开。std::optional是C++17的一个工具,用于管理一个可能存在也可能不存在的值。这在表达是否接收到天气数据以及数据是否仍然有效时非常有用。
我在PTS中集成了SimpleWeatherService,以提供与之前相同的功能。