""" Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos """ import json import math import platform from cereal import log from openpilot.common.params import Params from openpilot.iqpilot.mapd.live_map_data.base_map_data import BaseMapData from openpilot.iqpilot.navd.helpers import Coordinate class OsmMapData(BaseMapData): def __init__(self): super().__init__() self.mem_params = Params("/dev/shm/params") if platform.system() != "Darwin" else self.params def update_location(self) -> None: location = self.sm['liveLocationKalman'] self.localizer_valid = (location.status == log.LiveLocationKalman.Status.valid) and location.positionGeodetic.valid if self.localizer_valid: self.last_bearing = math.degrees(location.calibratedOrientationNED.value[2]) self.last_position = Coordinate(location.positionGeodetic.value[0], location.positionGeodetic.value[1]) if self.last_position is None: return params = { "latitude": self.last_position.latitude, "longitude": self.last_position.longitude, } if self.last_bearing is not None: params['bearing'] = self.last_bearing self.mem_params.put("LastGPSPosition", json.dumps(params)) def get_current_speed_limit(self) -> float: return float(self.mem_params.get("MapSpeedLimit") or 0.0) def get_current_road_name(self) -> str: return str(self.mem_params.get("RoadName") or "") def get_next_speed_limit_and_distance(self) -> tuple[float, float]: next_speed_limit_section_str = self.mem_params.get("NextMapSpeedLimit") next_speed_limit_section = next_speed_limit_section_str if next_speed_limit_section_str else {} next_speed_limit = next_speed_limit_section.get('speedlimit', 0.0) next_speed_limit_latitude = next_speed_limit_section.get('latitude') next_speed_limit_longitude = next_speed_limit_section.get('longitude') next_speed_limit_distance = 0.0 if next_speed_limit_latitude and next_speed_limit_longitude: next_speed_limit_coordinates = Coordinate(next_speed_limit_latitude, next_speed_limit_longitude) next_speed_limit_distance = (self.last_position or Coordinate(0, 0)).distance_to(next_speed_limit_coordinates) return next_speed_limit, next_speed_limit_distance