You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.2 KiB
70 lines
2.2 KiB
#!/usr/bin/env python3
|
|
import json
|
|
import os
|
|
import time
|
|
import subprocess
|
|
from typing import NoReturn
|
|
|
|
from timezonefinder import TimezoneFinder
|
|
|
|
from openpilot.common.params import Params
|
|
from openpilot.system.hardware import AGNOS
|
|
from openpilot.common.swaglog import cloudlog
|
|
from openpilot.system.version import get_version
|
|
|
|
REQUEST_HEADERS = {'User-Agent': "openpilot-" + get_version()}
|
|
|
|
|
|
def set_timezone(valid_timezones, timezone):
|
|
if timezone not in valid_timezones:
|
|
cloudlog.error(f"Timezone not supported {timezone}")
|
|
return
|
|
|
|
cloudlog.info(f"Setting timezone to {timezone}")
|
|
try:
|
|
if AGNOS:
|
|
tzpath = os.path.join("/usr/share/zoneinfo/", timezone)
|
|
subprocess.check_call(f'sudo su -c "ln -snf {tzpath} /data/etc/tmptime && \
|
|
mv /data/etc/tmptime /data/etc/localtime"', shell=True)
|
|
subprocess.check_call(f'sudo su -c "echo \"{timezone}\" > /data/etc/timezone"', shell=True)
|
|
else:
|
|
subprocess.check_call(f'sudo timedatectl set-timezone {timezone}', shell=True)
|
|
except subprocess.CalledProcessError:
|
|
cloudlog.exception(f"Error setting timezone to {timezone}")
|
|
|
|
|
|
def main() -> NoReturn:
|
|
params = Params()
|
|
tf = TimezoneFinder()
|
|
|
|
# Get allowed timezones
|
|
valid_timezones = subprocess.check_output('timedatectl list-timezones', shell=True, encoding='utf8').strip().split('\n')
|
|
|
|
timezone = params.get("Timezone", encoding='utf8')
|
|
if timezone is not None:
|
|
cloudlog.debug("Setting timezone based on param")
|
|
set_timezone(valid_timezones, timezone)
|
|
|
|
while True:
|
|
time.sleep(60)
|
|
|
|
location = params.get("LastGPSPosition", encoding='utf8')
|
|
|
|
# Find timezone by reverse geocoding the last known gps location
|
|
if location is not None:
|
|
cloudlog.debug("Setting timezone based on GPS location")
|
|
try:
|
|
location = json.loads(location)
|
|
except Exception:
|
|
cloudlog.exception("Error parsing location")
|
|
continue
|
|
|
|
timezone = tf.timezone_at(lng=location['longitude'], lat=location['latitude'])
|
|
if timezone is None:
|
|
cloudlog.error(f"No timezone found based on location, {location}")
|
|
continue
|
|
set_timezone(valid_timezones, timezone)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|