Skip to content
This repository was archived by the owner on Sep 16, 2024. It is now read-only.

Commit 6d1f26c

Browse files
authored
Pybytes 1.3.0 (#372)
Pybytes scripts REL 1.3.0 modpycom: New sigfox_info() API
1 parent 3138a13 commit 6d1f26c

10 files changed

+642
-222
lines changed

.gitignore

+8-15
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
1-
# Compiled Sources
2-
###################
3-
*.o
4-
*.a
5-
*.elf
6-
*.bin
7-
*.map
8-
*.hex
9-
*.dis
10-
*.exe
11-
121
# Packages
132
############
143

@@ -20,10 +9,13 @@
209
######################
2110
*.swp
2211

23-
# Build directory
12+
# Build directories
2413
######################
25-
build/
26-
build-*/
14+
esp32/build/*
15+
esp32/build-PYBYTES/*
16+
mpy-cross/build/*
17+
# This map file is generated here instead of the build folder...
18+
mpy-cross/*.map
2719

2820
# Test failure outputs
2921
######################
@@ -50,8 +42,9 @@ secure_boot_signing_key.pem
5042
signature_verification_key.bin
5143
secure-bootloader-key.bin
5244
flash_encryption_key.bin
53-
45+
5446
.DS_Store
5547
org.eclipse.cdt.ui.prefs
5648
org.eclipse.cdt.core.prefs
5749
language.settings.xml
50+
.idea

esp32/frozen/LTE/sqnsupgrade.py

+22-15
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ def return_code(self, rsp, debug=False):
129129

130130

131131
def wait_for_modem(self, send=True, expected=b'OK', echo_char=None):
132+
self.__serial.read()
132133
rsp = b''
133134
start = time.time()
134135
while True:
@@ -339,13 +340,14 @@ def __get_wait_msg(self, load_fff=True):
339340

340341

341342

342-
def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_ffh=False, mirror=False, switch_ffh=False, bootrom=False, rgbled=0x050505, debug=False, pkgdebug=False, atneg=True, max_try=10, direct=True, atneg_only=False, info_only=False, expected_smod=None, verbose=False, load_fff=False, mtools=False, fc=False):
343+
def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_ffh=False, mirror=False, switch_ffh=False, bootrom=False, rgbled=0x050505, debug=False, pkgdebug=False, atneg=True, max_try=10, direct=True, atneg_only=False, info_only=False, expected_smod=None, verbose=False, load_fff=False, mtools=False, fc=False, force_fff=False):
343344
self.__wait_msg = False
344345
mirror = True if atneg_only else mirror
345346
recover = True if atneg_only else load_ffh
346347
resume = True if mirror or recover or atneg_only or info_only else resume
347348
verbose = True if debug else verbose
348349
load_fff = False if bootrom and switch_ffh else load_fff
350+
load_fff = True if force_fff else load_fff
349351
target_baudrate = baudrate
350352
baudrate = self.__modem_speed if self.__speed_detected else baudrate
351353
if debug: print('mirror? {} recover? {} resume? {} direct? {} atneg_only? {} bootrom? {} load_fff? {}'.format(mirror, recover, resume, direct, atneg_only, bootrom, load_fff))
@@ -410,9 +412,9 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
410412
reconnect_uart()
411413
return False
412414
if blobsize > 4194304:
413-
if load_fff:
415+
if load_fff and not force_fff:
414416
print("Firmware file is too big to load via FFF method. Using ON_THE_FLY")
415-
load_fff = False
417+
load_fff = False
416418
blob = open(file_path, "rb")
417419

418420
if not load_ffh:
@@ -550,7 +552,8 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
550552
raise OSError("Invalid answer '%s' from the device" % response)
551553
try:
552554
blob.close()
553-
except:
555+
except Exception as ex:
556+
if debug: print('Exception: {}'.format(ex))
554557
pass
555558

556559
self.__serial.read()
@@ -595,7 +598,8 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
595598
if start == True:
596599
try:
597600
blob.close()
598-
except:
601+
except Exception as ex:
602+
if debug: print('Exception: {}'.format(ex))
599603
pass
600604
self.__serial.read()
601605
if switch_ffh:
@@ -612,15 +616,18 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
612616
else:
613617
try:
614618
blob.close()
615-
except:
619+
except Exception as ex:
620+
if debug: print('Exception: {}'.format(ex))
616621
pass
617622
print('Code download failed[1], aborting!')
618623
return False
619624
except Exception as ex:
620625
try:
621626
blob.close()
622-
except:
627+
except Exception as ex:
628+
if debug: print('Exception: {}'.format(ex))
623629
pass
630+
624631
print('Exception: {}'.format(ex))
625632
print('Code download failed [2], aborting!')
626633
abort = True
@@ -870,7 +877,7 @@ def success_message(self, port=None, verbose=False, debug=False):
870877
print("Here is the current firmware version:\n")
871878
self.show_info(port=port, verbose=verbose, debug=debug)
872879

873-
def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False, debug=False, pkgdebug=False, verbose=False, load_fff=True, load_only=False, mtools=False):
880+
def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False, debug=False, pkgdebug=False, verbose=False, load_fff=True, load_only=False, mtools=False, force_fff=False):
874881
success = True
875882
if not retry and mfile is not None:
876883
if resume or self.__check_br(br_only=True, verbose=verbose, debug=debug):
@@ -895,7 +902,7 @@ def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False,
895902
print('Unable to upgrade bootrom.')
896903
if debug: print('Success2? {}'.format(success))
897904
if success:
898-
if self.__run(file_path=ffile, resume=True if mfile is not None else resume, baudrate=baudrate, direct=False, debug=debug, pkgdebug=pkgdebug, verbose=verbose, load_fff=False if mfile else load_fff, mtools=mtools):
905+
if self.__run(file_path=ffile, resume=True if mfile is not None else resume, baudrate=baudrate, direct=False, debug=debug, pkgdebug=pkgdebug, verbose=verbose, load_fff=False if mfile else load_fff, mtools=mtools, force_fff=force_fff):
899906
if self.__check_br(verbose=verbose, debug=debug):
900907
success = self.__run(bootrom=True, debug=debug, direct=False, pkgdebug=pkgdebug, verbose=verbose, load_fff=True)
901908
self.success_message(verbose=verbose, debug=debug)
@@ -942,13 +949,13 @@ def upgrade_uart(self, ffh_mode=False, mfile=None, retry=False, resume=False, co
942949
def show_info(self, port=None, debug=False, verbose=False, fc=False):
943950
self.__run(port=port, debug=debug, info_only=True, verbose=verbose, fc=fc)
944951

945-
def upgrade_ext(self, port, ffile, mfile, resume=False, debug=False, pkgdebug=False, verbose=False, load_fff=True, fc=False):
952+
def upgrade_ext(self, port, ffile, mfile, resume=False, debug=False, pkgdebug=False, verbose=False, load_fff=True, fc=False, force_fff=False):
946953
success = True
947954
if mfile is not None:
948955
success = False
949956
success = self.__run(file_path=mfile, load_ffh=True, port=port, debug=debug, pkgdebug=pkgdebug, verbose=verbose, fc=fc)
950957
if success:
951-
if self.__run(file_path=ffile, resume=True if mfile is not None else resume, direct=False, port=port, debug=debug, pkgdebug=pkgdebug, verbose=verbose, load_fff=load_fff, fc=fc):
958+
if self.__run(file_path=ffile, resume=True if mfile is not None else resume, direct=False, port=port, debug=debug, pkgdebug=pkgdebug, verbose=verbose, load_fff=load_fff, fc=fc, force_fff=force_fff):
952959
self.success_message(port=port, verbose=verbose, debug=debug)
953960
else:
954961
print('Unable to load updater from {}'.format(mfile))
@@ -984,7 +991,7 @@ def load(mfile, baudrate=921600, verbose=False, debug=False, hangup=False):
984991
print('Modem must be in recovery mode!')
985992
reconnect_uart()
986993

987-
def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff=True, hangup=True):
994+
def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff=True, hangup=True, force_fff=False):
988995
print_welcome()
989996
retry = False
990997
resume = False
@@ -1008,7 +1015,7 @@ def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff
10081015
mtools = True
10091016
elif state == -1:
10101017
detect_error()
1011-
success = sqnup.upgrade(ffile=ffile, mfile=mfile, baudrate=baudrate, retry=retry, resume=resume, debug=debug, pkgdebug=False, verbose=verbose, load_fff=load_fff, mtools=mtools)
1018+
success = sqnup.upgrade(ffile=ffile, mfile=mfile, baudrate=baudrate, retry=retry, resume=resume, debug=debug, pkgdebug=False, verbose=verbose, load_fff=load_fff, mtools=mtools, force_fff=force_fff)
10121019
reconnect_uart()
10131020
return success
10141021

@@ -1072,11 +1079,11 @@ def state(verbose=False, debug=False, retry=5, hangup=False):
10721079
return sqnup.detect_modem_state(debug=debug, hangup=hangup, retry=retry)
10731080

10741081
else:
1075-
def run(port, ffile, mfile=None, resume=False, debug=False, verbose=False, load_fff=True, fc=False):
1082+
def run(port, ffile, mfile=None, resume=False, debug=False, verbose=False, load_fff=True, fc=False, force_fff=False):
10761083
print_welcome()
10771084
sqnup = sqnsupgrade()
10781085
if sqnup.check_files(ffile, mfile, debug):
1079-
sqnup.upgrade_ext(port=port, ffile=ffile, mfile=mfile, resume=resume, debug=debug, pkgdebug=False, verbose=verbose, load_fff=load_fff)
1086+
sqnup.upgrade_ext(port=port, ffile=ffile, mfile=mfile, resume=resume, debug=debug, pkgdebug=False, verbose=verbose, load_fff=load_fff, force_fff=force_fff)
10801087

10811088
def version(port, verbose=False, debug=False, fc=False):
10821089
sqnup = sqnsupgrade()

esp32/frozen/Pybytes/_OTA.py

+102-40
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@
55
see the Pycom Licence v1.0 document supplied with this file, or
66
available at https://www.pycom.io/opensource/licensing
77
'''
8+
try:
9+
from pybytes_debug import print_debug
10+
except:
11+
from _pybytes_debug import print_debug
12+
13+
try:
14+
from pybytes_constants import constants
15+
except:
16+
from _pybytes_constants import constants
17+
18+
try:
19+
import urequest
20+
except:
21+
import _urequest as urequest
822

923
import network
1024
import socket
@@ -18,11 +32,6 @@
1832
import os
1933
from binascii import hexlify
2034

21-
try:
22-
from pybytes_debug import print_debug
23-
except:
24-
from _pybytes_debug import print_debug
25-
2635
# Try to get version number
2736
# try:
2837
# from OTA_VERSION import VERSION
@@ -40,6 +49,9 @@ def connect(self):
4049
def get_data(self, req, dest_path=None, hash=False):
4150
raise NotImplementedError()
4251

52+
def update_device_network_config(self, fcota, config):
53+
raise NotImplementedError()
54+
4355
# OTA methods
4456

4557
def get_current_version(self):
@@ -56,9 +68,9 @@ def get_update_manifest(self):
5668
gc.collect()
5769
return manifest
5870

59-
def update(self):
71+
def update(self, customManifest=None):
6072
try:
61-
manifest = self.get_update_manifest()
73+
manifest = self.get_update_manifest() if not customManifest else customManifest
6274
except Exception as e:
6375
print('Error reading the manifest, aborting: {}'.format(e))
6476
return 0
@@ -68,36 +80,38 @@ def update(self):
6880
return 1
6981

7082
# Download new files and verify hashes
71-
for f in manifest['new'] + manifest['update']:
72-
# Upto 5 retries
73-
for _ in range(5):
74-
try:
75-
self.get_file(f)
76-
break
77-
except Exception as e:
78-
print(e)
79-
msg = "Error downloading `{}` retrying..."
80-
print(msg.format(f['URL']))
81-
return 0
82-
else:
83-
raise Exception("Failed to download `{}`".format(f['URL']))
84-
85-
# Backup old files
86-
# only once all files have been successfully downloaded
87-
for f in manifest['update']:
88-
self.backup_file(f)
89-
90-
# Rename new files to proper name
91-
for f in manifest['new'] + manifest['update']:
92-
new_path = "{}.new".format(f['dst_path'])
93-
dest_path = "{}".format(f['dst_path'])
94-
95-
os.rename(new_path, dest_path)
96-
97-
# `Delete` files no longer required
98-
# This actually makes a backup of the files incase we need to roll back
99-
for f in manifest['delete']:
100-
self.delete_file(f)
83+
if "new" in manifest and "update" in manifest:
84+
for f in manifest['new'] + manifest['update']:
85+
# Upto 5 retries
86+
for _ in range(5):
87+
try:
88+
self.get_file(f)
89+
break
90+
except Exception as e:
91+
print(e)
92+
msg = "Error downloading `{}` retrying..."
93+
print(msg.format(f['URL']))
94+
return 0
95+
else:
96+
raise Exception("Failed to download `{}`".format(f['URL']))
97+
98+
# Backup old files
99+
# only once all files have been successfully downloaded
100+
for f in manifest['update']:
101+
self.backup_file(f)
102+
103+
# Rename new files to proper name
104+
for f in manifest['new'] + manifest['update']:
105+
new_path = "{}.new".format(f['dst_path'])
106+
dest_path = "{}".format(f['dst_path'])
107+
108+
os.rename(new_path, dest_path)
109+
110+
if "delete" in manifest:
111+
# `Delete` files no longer required
112+
# This actually makes a backup of the files incase we need to roll back
113+
for f in manifest['delete']:
114+
self.delete_file(f)
101115

102116
# Flash firmware
103117
if "firmware" in manifest:
@@ -162,9 +176,12 @@ def delete_file(self, f):
162176
os.rename(dest_path, bak_path)
163177

164178
def write_firmware(self, f):
165-
hash = self.get_data(f['URL'].split("/", 3)[-1],
166-
hash=True,
167-
firmware=True)
179+
# hash =
180+
self.get_data(
181+
f['URL'].split("/", 3)[-1],
182+
hash=True,
183+
firmware=True
184+
)
168185
# TODO: Add verification when released in future firmware
169186

170187

@@ -258,6 +275,7 @@ def get_data(self, req, dest_path=None, hash=False, firmware=False):
258275
if fp is not None:
259276
fp.close()
260277
if firmware:
278+
print_debug(6, 'ota_finish')
261279
pycom.ota_finish()
262280

263281
except Exception as e:
@@ -277,3 +295,47 @@ def get_data(self, req, dest_path=None, hash=False, firmware=False):
277295
return bytes(content)
278296
elif hash:
279297
return hash_val
298+
299+
def update_device_network_config(self, fcota, config):
300+
targetURL = '{}://{}/device/networks/{}'.format(
301+
constants.__DEFAULT_PYCONFIG_PROTOCOL, constants.__DEFAULT_PYCONFIG_DOMAIN, config['device_id']
302+
)
303+
print_debug(6, "request device update URL: {}".format(targetURL))
304+
try:
305+
pybytes_activation = urequest.get(targetURL, headers={'content-type': 'application/json'})
306+
responseDetails = pybytes_activation.json()
307+
pybytes_activation.close()
308+
print_debug(6, "Response Details: {}".format(responseDetails))
309+
self.update_network_config(responseDetails, fcota, config)
310+
machine.reset()
311+
except Exception as ex:
312+
print_debug(1, "error while calling {}!: {}".format(targetURL, ex))
313+
314+
def update_network_config(self, letResp, fcota, config):
315+
try:
316+
if 'networkConfig' in letResp:
317+
netConf = letResp['networkConfig']
318+
config['network_preferences'] = netConf['networkPreferences']
319+
if 'wifi' in netConf:
320+
config['wifi'] = netConf['wifi']
321+
elif 'wifi' in config:
322+
del config['wifi']
323+
324+
if 'lte' in netConf:
325+
config['lte'] = netConf['lte']
326+
elif 'lte' in config:
327+
del config['lte']
328+
329+
if 'lora' in netConf:
330+
config['lora'] = {
331+
'otaa': netConf['lora']['otaa'],
332+
'abp': netConf['lora']['abp']
333+
}
334+
elif 'lora' in config:
335+
del config['lora']
336+
337+
json_string = ujson.dumps(config)
338+
print_debug(1, "update_network_config : {}".format(json_string))
339+
fcota.update_file_content('/flash/pybytes_config.json', json_string)
340+
except Exception as e:
341+
print_debug(1, "error while updating network config pybytes_config.json! {}".format(e))

0 commit comments

Comments
 (0)