Add support for building the UIHH format AGPS file after download

daxcore/master
Adam Pigg 2021-05-16 19:03:36 +01:00 zatwierdzone przez argrento
rodzic 3ca5b011d9
commit af561189bd
1 zmienionych plików z 32 dodań i 0 usunięć

Wyświetl plik

@ -26,12 +26,17 @@ import shutil
import urllib import urllib
import uuid import uuid
from typing import Iterator, Tuple from typing import Iterator, Tuple
import zipfile
import zlib
import requests import requests
import errors import errors
import urls import urls
def encode_uint32(value) -> bytes:
return bytes([value & 0xff]) + bytes([(value >> 8) & 0xff]) + bytes([(value >> 16) & 0xff]) + bytes([(value >> 24) & 0xff]);
class HuamiAmazfit: class HuamiAmazfit:
"""Base class for logging in and receiving auth keys and GPS packs""" """Base class for logging in and receiving auth keys and GPS packs"""
def __init__(self, method="amazfit", email=None, password=None): def __init__(self, method="amazfit", email=None, password=None):
@ -241,6 +246,32 @@ class HuamiAmazfit:
with open(agps_file_names[pack_idx], 'wb') as gps_file: with open(agps_file_names[pack_idx], 'wb') as gps_file:
shutil.copyfileobj(request.raw, gps_file) shutil.copyfileobj(request.raw, gps_file)
def build_gps_uihh(self) -> None:
print("Building gps_uihh.bin")
d = {'gps_alm.bin':0x05, 'gln_alm.bin':0x0f, 'lle_bds.lle':0x86, 'lle_gps.lle':0x87, 'lle_glo.lle':0x88, 'lle_gal.lle':0x89, 'lle_qzss.lle':0x8a}
cep_archive = zipfile.ZipFile('cep_7days.zip', 'r')
lle_archive = zipfile.ZipFile('lle_1week.zip', 'r')
f = open('gps_uihh.bin', 'wb')
content = bytes()
filecontent = bytes()
fileheader = bytes()
for key, value in d.items():
if value >= 0x86:
filecontent = lle_archive.read(key)
else:
filecontent = cep_archive.read(key)
fileheader = bytes([1]) + bytes([value]) + encode_uint32(len(filecontent)) + encode_uint32(zlib.crc32(filecontent) & 0xffffffff)
content += fileheader + filecontent
header = b'UIHH' + bytes([0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]) + encode_uint32(zlib.crc32(content) & 0xffffffff) + \
bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + encode_uint32(len(content)) + bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
content = header + content
f.write(content)
f.close()
def logout(self) -> None: def logout(self) -> None:
"""Log out from the current account""" """Log out from the current account"""
logout_url = urls.URLS['logout'] logout_url = urls.URLS['logout']
@ -339,6 +370,7 @@ if __name__ == "__main__":
if args.gps or args.all: if args.gps or args.all:
device.get_gps_data() device.get_gps_data()
device.build_gps_uihh()
if args.firmware: if args.firmware:
footer = "\u2559" + "\u2500" * 12 footer = "\u2559" + "\u2500" * 12