[ios] Red for over speed; Speed limit for Carplay #3047
Labels
No labels
Accessibility
Accessibility
Address
Address
Android
Android
Android Auto
Android Auto
Android Automotive (AAOS)
Android Automotive (AAOS)
API
API
AppGallery
AppGallery
AppStore
AppStore
Battery and Performance
Battery and Performance
Blocker
Blocker
Bookmarks and Tracks
Bookmarks and Tracks
Borders
Borders
Bug
Bug
Build
Build
CarPlay
CarPlay
Classificator
Classificator
Community
Community
Core
Core
CrashReports
CrashReports
Cycling
Cycling
Desktop
Desktop
DevEx
DevEx
DevOps
DevOps
dev_sandbox
dev_sandbox
Directions
Directions
Documentation
Documentation
Downloader
Downloader
Drape
Drape
Driving
Driving
Duplicate
Duplicate
Editor
Editor
Elevation
Elevation
Enhancement
Enhancement
Epic
Epic
External Map Datasets
External Map Datasets
F-Droid
F-Droid
Fonts
Fonts
Frequently User Reported
Frequently User Reported
Fund
Fund
Generator
Generator
Good first issue
Good first issue
Google Play
Google Play
GPS
GPS
GSoC
GSoC
iCloud
iCloud
Icons
Icons
iOS
iOS
Legal
Legal
Linux Desktop
Linux Desktop
Linux packaging
Linux packaging
Linux Phone
Linux Phone
Mac OS
Mac OS
Map Data
Map Data
Metro
Metro
Navigation
Navigation
Need Feedback
Need Feedback
Night Mode
Night Mode
NLnet 2024-06-281
NLnet 2024-06-281
No Feature Parity
No Feature Parity
Opening Hours
Opening Hours
Outdoors
Outdoors
POI Info
POI Info
Privacy
Privacy
Public Transport
Public Transport
Raw Idea
Raw Idea
Refactoring
Refactoring
Regional
Regional
Regression
Regression
Releases
Releases
RoboTest
RoboTest
Route Planning
Route Planning
Routing
Routing
Ruler
Ruler
Search
Search
Security
Security
Styles
Styles
Tests
Tests
Track Recording
Track Recording
Translations
Translations
TTS
TTS
UI
UI
UX
UX
Walk Navigation
Walk Navigation
Watches
Watches
Web
Web
Wikipedia
Wikipedia
Windows
Windows
Won't fix
Won't fix
World Map
World Map
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set.
Reference: organicmaps/organicmaps-tmp#3047
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "master"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
iPhone:
CarPlay:
Coding
Continuation of refactoring to unify all speed conversions and related localizations.
Use MeterPerSecond everywhere. Use numeric speed instead of string.
Rename of SpeedLimit to SpeedCamLimit to not confuse with usual limits (not speed cam).
iPhone
Unknown limit

Known limit and no over speed

Known limit and over speed

Unknown speed cam (more exactly - unknown road speed limit) and over speed

Known speed cam (more exactly - known road speed limit) and over speed

CarPlay
Limit unknown

Known limit and no over speed (speed sign is visible)

Known limit and over speed (speed sign is visible; current speed text is red)

Unknown SpeedCam detected (red speed cam icon is visible)

Known SpeedCam detected and no over speed (speed sign icon is visible is switching with speed cam icon; current speed background is green)

Known SpeedCam detected and over speed (speed sign icon is visible is switching with speed cam icon; current speed background is red)

Отредактируй коммит через amend и удали модификации сабмодулей, пожалуйста. Откуда они взялись?
@vng посмотри, пожалуйста, помержим и я потестирую.
@AntonM030481 дай знать, если нужна помощь с гитом, редактированием коммитов и ПРов и выпиливанием сабмодулей. Не нужно закрывать ПРы просто так )
Почему убрано readonly? Это стандартный паттерн в ObjC.
Более того, если вдруг модификация возможна из разных потоков, надо убирать nonatomic.
Форматирование.
@ -163,1 +168,4 @@
speed += " / " + (info.speedLimitMps == 0 ? "∞" : speedLimitMeasure.valueAsString);
}
speedLabel.text = speed
Проверка
s > 0
лишняя, если значение не может быть отрицательным. А если может, то почему?@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Использование класса-враппера только для удобства конвертации не обосновано, слишком много оверхеда. Предлагаю сделать метод в C++, который потом можно будет переиспользовать и в Android, чтобы было единообразно.
В самом крайнем случае, если не получится, просто сделать кусок кода на С++ внутри .mm файла, и пометить комментарием его потом переиспользовать в ядре для Андроида и других платформ.
Форматирование
Отступ не нужен.
const
Лучше всё-таки везде длиннее, но однозначнее, тогда комментарий не нужен.
Почему именно отрицательное значение выбрано, а не ноль, например? Если это особая константа, то лучше её вынести явно.
@biodranik хорошо)
Я просто все заново красиво форс репушил, и PR закрылся в процессе (откатился на самое начало). А кнопку Reopen я не заметил.
@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Да, просто C++ -> ObjC функция для использования в Swift.
На крайний случай valueAsString настолько проста, что достаточно в ObjC иметь простую именованную функцию типа SpeedToString
Это какая-то фишка swift когда speedCamLimitMps сразу и слева и справа от присваивания?
Может тут self. добавить для наглядности?
Я наверное понимаю как это, но вызывает улыбку :)
if speedLimitMps { не одно и то же?
Хм, действительно ли нам нужно показывать это наружу? Почему недостаточно GetLocalizedSpeedUnits() текущей? Иначе зачем клиентскому коду тоже вызывать Settings::Get ...
Мы же тут уже внутри namespace measurement_utils
@ -31,7 +31,8 @@ inline double InchesToMeters(double in) { return in / 39.370; }
inline double NauticalMilesToMeters(double nmi) { return nmi * 1852; }
Мы же тут уже внутри namespace measurement_utils
Мой имхо MetersPerSecond - перебор. С чем это можно перепутать?
Как с чем? Я читаю всегда сначала как miles per second, стандартная аббревиатура MPS.
И многие американцы/англичане тоже могут так читать.
OK
Саша, miles per second? Та на ракете летаешь? Нет такой стандартной аббревиатуры :)
@ -163,1 +168,4 @@
speed += " / " + (info.speedLimitMps == 0 ? "∞" : speedLimitMeasure.valueAsString);
}
speedLabel.text = speed
https://developer.apple.com/documentation/corelocation/cllocation/1423798-speed
A negative value indicates an invalid speed.
OK
OK
OK
OK
Мили - это всегда Mi,
MPH - единственное исключение.
Сейчас speedMetersPerSecond есть только в turns_sound_settings.
У нас в коде такой подход постоянно встречается:
https://stackoverflow.com/questions/29322977/whats-the-difference-between-if-nil-optional-and-if-let-optional
Временная переменная вместо сравнения с nil чтобы потом не делать unwrap из optional.
@ -31,7 +31,8 @@ inline double InchesToMeters(double in) { return in / 39.370; }
inline double NauticalMilesToMeters(double nmi) { return nmi * 1852; }
OK
OK
Conditional unwrapping. Чаще всего используется с тем же именем.
Прояснил в другом месте.
OK
Вопросов нет, если это optional. Вопросы есть, если это обычная переменная )
А, вижу, там optional. Странно конечно, можно было бы сделать оптимальнее.
Вообще, старый swift код был написан до нас, без нашего ревью. Поэтому слепо применять старые практики не стоит. Код должен быть читабельный, простой, не вызывать вопросов, и не иметь ненужного оверхеда в рантайме.
Я не понимаю, зачем отдельно speedcam limit. Когда он отличается от обычного speed limit? Зачем усложнять?
Насчет оверхэда в ссылке выше пишут выше что разницы нет в ассемблере.
Вроде нормальная практика так делать, когда unwrapped значение далее используется кроме как в самом if.
В данном случае - целых 2 раза)
@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Хотелось универсальное решение втч и для расстояния, когда в зависимости от длины используются крупные или мелкие юниты. А для этого логично получать пару размера и юнитов одновременно.
А что именно с классом не нравится? Вызов 3 C++ функций вместо одной?
Где можно почитать про overhead в аналогичных ситуациях?
Кстати, сейчас есть такое, например:
c2c1f979ac/iphone/Maps/UI/PlacePage/Components/ElevationProfile/ElevationProfilePresenter.swift (L243-L244)
В Java сейчас такой подход (но только нужно число, а не строка):
c2c1f979ac/android/jni/com/mapswithme/util/StringUtils.cpp (L57-L60)
А потом сравнивать с этой константой? Насколько это уместно для double?
@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Замерил быстродействие:
Measure.init(asSpeed: v)
vs
Если убрать запрос к platform::GetLocalizedSpeedUnits(units):
результат одинаков
а если его оставить - разница в 20 раз.
Вывод - bottleneck в запросе к локализации строки (что ожидаемо), а не в конструировании объекта.
@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Динамическая аллокация, которой лучше избегать в часто повторяемых операциях. Такой же объект, созданный на стеке, вообще бы не вызывал вопросов.
Вот в т.ч. и из-за подобных велосипедов на изолиниях теперь всегда метры рисуются.
Если пользователь идёт в настройки и меняет юниты (крайне редкая операция), то диалоги пересоздаются. Вывод: строки/юниты можно и нужно инициализировать один раз для сессии диалога, и на ведре, и на айосе.
Т.е. критерий выбора — невалидность определяется как < 0? Тогда всё равно константа делает код нагляднее.
На ноль даблы можно смело сравнивать, если они не модифицируюся и не являются результатом вычисления, а только следствием явного присваивания. У нас включен fast math если что, там вообще многие проверки на даблы убраны.
Форс репуш никак не должен закрывать PR. Это было что-то другое.
@AntonM030481 нужно отредактировать коммит и убрать правки сабмодулей.
Столько спора из-за более понятной строчки ) Или мой вариант менее понятен?
Тогда везде надо исправлять. Необходимо единообразие как раз во избежание недопонимания.
У нас скорость как правило именно в метрах в секунду и почти везде постфикс mps.
Лично у меня такие длинные название переменных m_speedLimitMetersPerSecond вызывают диссонанс.
Убраны правки сабмодулей.
Знать бы еще откуда они берутся...
Я их руками не правлю, и через git их не меняю.
New commits??
git submodule update --init --recursive
Идея была в том, чтобы не вызывать лишний раз
settings::TryGet(settings::kMeasurementUnits, units);
Сейчас между localisation и measurement_utils много ненужных связей.
И по-хорошему это надо переделать.
На этот раз я решил предоставить унифицированный интерфейс для ios (конечный клиент ничего не знает о системе измерений, все локализовано в одном Core классе).
А в следующий раз наберусь сил и доделаю переделки, описанные выше.
@ -175,0 +183,4 @@
speedBackground.backgroundColor = UIColor.clear
}
speedLegendLabel.textColor = speedLabel.textColor
speedWithLegendLabel.textColor = speedLabel.textColor
Я бы предпочел просто использовать статические переменные вместо того чтобы засорять классы ненужными переменными. По тестам быстродействие вполне нормальное (сравнимое со встроенным Measurement).
6d5d5ad891/platform/localization.cpp (L19-L45)
Локальную проблему с сабмодулями решил зайдя в каждый и вручную сделав чекаут на ревизии указанные тут
Вернул readonly в публичном интерфейсе [MWMNavigationDashboardEntity.h]
Вернул передекларирование без readonly в [MWMNavigationDashboardManager+Entity.mm]
для возможности инициализации.
Но этого оказалось недостаточно.
uncaught exception 'NSInvalidArgumentException', reason: '-[MWMNavigationDashboardEntity setIsValid:]: unrecognized selector sent to instance'
при первом же присваивании.Помог возврат к передекларированию без readonly в [MWMNavigationDashboardEntity.mm]. Но почему - непонятно. В этом mm нет присваивания этим полям и все компилируется.
speedCamLimitMps - это лимит именно от камеры.
speedLimitMps - это лимит дороги.
Иногда у камеры проставлено значение, иногда у дороги.
Скорость камеры имеет приоритет.
В общем случае лимит скорость камеры может не совпадать с текущим лимитом дороги,
потому что мы предупреждаем о камере заранее и, возможно, там где будет камера, ограничение дороги будет отличаться от текущего ограничения дороги.
добавил self
добавить self?
Смотри сам, особенно если в swift так принято. Мне нормально по всякому
Я не знаю как принято. Написал свою первую строчку на Swift неделю назад)
Использовать то же самое имя при развертывании - логично.
Нужно ли использовать self - наверное, зависит от контекста.
Не нашел с ходу ничего в coding style, кроме того что сравниваем с nil, если развернутое значение не нужно.
@biodranik как лучше поступить в такой ситуации?
Конечно будет падать, если в публичном интерфейсе read only. А как раньше работало? Раньше публично никто не менял?
В публичном readonly.
В [MWMNavigationDashboardManager+Entity.mm] переопределяется как writable и там же меняется.
Я не понимаю, почему приходится переопределять в [MWMNavigationDashboardEntity.mm], поскольку там не вносятся изменения.
Т.е. вылетает в текущей версии кода в PR?
стало падать после возвращения readonly
добавил комментарии про это.
пока оставлю как есть.
В связи с тем что сейчас CarPlay c iPhone никак не унифицирован, не очень удобно пользоваться константами.
Оставил коменты, потом унифицирую и сделаю константами.
Удалил MWMNavigationDashboardEntity.mm
Почему-то тайм-аут для map_tests.
У меня локально все нормально проходит.
В этом PR я далеко не закончил рефакторингом.
Там еще очень много предстоит, но ИМХО стало лучше, так что предлагаю мержить.
@biodranik Давайте уже помержим