11#!/usr/bin/env python
2- VERSION = "1.2.2 "
2+ VERSION = "1.2.3 "
33
44# Copyright (c) 2019, Pycom Limited.
55#
1717import sqnstp as stp
1818
1919release = None
20+
2021try :
2122 sysname = os .uname ().sysname
2223 if 'FiPy' in sysname or 'GPy' in sysname :
@@ -50,6 +51,8 @@ def __init__(self):
5051 self .__resp_921600 = False
5152 self .__serial = None
5253 self .__kill_ppp_ok = False
54+ self .__modem_speed = None
55+ self .__speed_detected = False
5356
5457 if 'GPy' in self .__sysname :
5558 self .__pins = ('P5' , 'P98' , 'P7' , 'P99' )
@@ -86,7 +89,8 @@ def read_rsp(self, size=None, timeout=-1):
8689 else :
8790 return b''
8891
89- def print_pretty_response (self , rsp , flush = False ):
92+ def print_pretty_response (self , rsp , flush = False , prefix = None ):
93+ if prefix is not None : self .special_print (prefix , flush = flush , end = ' ' )
9094 lines = rsp .decode ('ascii' ).split ('\r \n ' )
9195 for line in lines :
9296 if 'OK' not in line and line != '' :
@@ -222,17 +226,20 @@ def __hangup_modem(self, delay, debug):
222226 return False
223227
224228
225- def detect_modem_state (self , retry = 3 , initial_delay = 1000 , debug = False ):
229+ def detect_modem_state (self , retry = 5 , initial_delay = 1000 , hangup = True , debug = False ):
226230 count = 0
227231 self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 1 )
232+ self .__modem_speed = 921600
228233 self .__serial .read ()
229234 while count < retry :
230235 count += 1
231236 delay = initial_delay * count
232237 if debug : print ("The current delay is {}" .format (delay ))
233238 self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 10 )
239+ self .__modem_speed = 921600
234240 #if True:
235- if self .__hangup_modem (initial_delay , debug ):
241+ if hangup and self .__hangup_modem (initial_delay , debug ):
242+ self .__speed_detected = True
236243 self .__serial .write (b"AT+SMOD?\r \n " )
237244 time .sleep_ms (delay )
238245 resp = self .__serial .read ()
@@ -242,6 +249,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
242249 except :
243250 pass
244251 else :
252+ self .__modem_speed = 921600
245253 self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 1 )
246254 self .__serial .read ()
247255 self .__serial .write (b"AT\r \n " )
@@ -250,6 +258,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
250258 self .__check_resp (resp )
251259 if debug : print ('Response (AT #3) {}' .format (resp ))
252260 if resp is not None and b'OK' in resp :
261+ self .__speed_detected = True
253262 self .__serial .write (b"AT+SMOD?\r \n " )
254263 time .sleep_ms (delay )
255264 resp = self .__serial .read ()
@@ -264,6 +273,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
264273 self .__check_resp (resp )
265274 if debug : print ('Response (AT #4) {}' .format (resp ))
266275 if resp is not None and b'OK' in resp :
276+ self .__speed_detected = True
267277 self .__serial .write (b"AT+SMOD?\r \n " )
268278 time .sleep_ms (delay )
269279 resp = self .__serial .read ()
@@ -274,12 +284,14 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
274284 pass
275285 else :
276286 if not self .__resp_921600 :
287+ self .__modem_speed = 115200
277288 self .__serial = UART (1 , baudrate = 115200 , pins = self .__pins , timeout_chars = 10 )
278289 self .__serial .write (b"AT\r \n " )
279290 time .sleep_ms (delay )
280291 resp = self .__serial .read ()
281292 if debug : print ('Response (AT #1 @ 115200) {}' .format (resp ))
282293 if resp is not None and b'OK' in resp :
294+ self .__speed_detected = True
283295 self .__serial .write (b"AT+SMOD?\r \n " )
284296 time .sleep_ms (delay )
285297 resp = self .__serial .read ()
@@ -293,6 +305,7 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
293305 resp = self .__serial .read ()
294306 if debug : print ('Response (AT #2 @ 115200) {}' .format (resp ))
295307 if resp is not None and b'OK' in resp :
308+ self .__speed_detected = True
296309 self .__serial .write (b"AT+SMOD?\r \n " )
297310 time .sleep_ms (delay )
298311 resp = self .__serial .read ()
@@ -303,6 +316,14 @@ def detect_modem_state(self, retry=3, initial_delay=1000, debug=False):
303316 pass
304317 return None
305318
319+ def get_imei (self ):
320+ self .__serial = UART (1 , baudrate = 921600 , pins = self .__pins , timeout_chars = 10 )
321+ self .__serial .write (b"AT+CGSN\r \n " )
322+ time .sleep (.5 )
323+ imei_val = self .read_rsp (2000 )
324+ return self .return_pretty_response (imei_val )
325+
326+
306327 def __get_power_warning (self ):
307328 return "<<<=== DO NOT DISCONNECT POWER ===>>>"
308329
@@ -317,21 +338,22 @@ def __get_wait_msg(self, load_fff=True):
317338
318339
319340
320- 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 , version_only = False , expected_smod = None , verbose = False , load_fff = False ):
341+ 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 ):
321342 self .__wait_msg = False
322343 mirror = True if atneg_only else mirror
323344 recover = True if atneg_only else load_ffh
324- resume = True if mirror or recover or atneg_only or version_only else resume
345+ resume = True if mirror or recover or atneg_only or info_only else resume
325346 verbose = True if debug else verbose
326347 load_fff = False if bootrom and switch_ffh else load_fff
348+ baudrate = self .__modem_speed if self .__speed_detected else baudrate
327349 if debug : print ('mirror? {} recover? {} resume? {} direct? {} atneg_only? {} bootrom? {} load_fff? {}' .format (mirror , recover , resume , direct , atneg_only , bootrom , load_fff ))
328350 abort = True
329351 external = False
330352 self .__serial = None
331353
332354 if 'FiPy' in self .__sysname or 'GPy' in self .__sysname :
333355
334- self .__serial = UART (1 , baudrate = 115200 if recover else baudrate , pins = self .__pins , timeout_chars = 100 )
356+ self .__serial = UART (1 , baudrate = 115200 if recover and not self . __speed_detected else baudrate , pins = self .__pins , timeout_chars = 100 )
335357 self .__serial .read ()
336358 else :
337359 if port is None :
@@ -340,15 +362,18 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
340362 external = True
341363 br = 115200 if recover and not direct else baudrate
342364 if debug : print ('Setting baudrate to {}' .format (br ))
343- self .__serial = serial .Serial (port , br , bytesize = serial .EIGHTBITS , timeout = 1 if version_only else 0.1 )
365+ self .__serial = serial .Serial (port , br , bytesize = serial .EIGHTBITS , timeout = 1 if info_only else 0.1 )
344366 self .__serial .reset_input_buffer ()
345367 self .__serial .reset_output_buffer ()
346368
347- if version_only :
369+ if info_only :
348370 self .__serial .read ()
349371 self .__serial .write (b'AT\r \n ' )
350372 self .__serial .write (b'AT\r \n ' )
351373 self .__serial .read ()
374+ self .__serial .write (b"AT+CGSN\r \n " )
375+ time .sleep (.5 )
376+ shimei = self .read_rsp (2000 )
352377 if verbose :
353378 self .__serial .write (b"AT!=\" showver\" \r \n " )
354379 else :
@@ -357,6 +382,8 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
357382 shver = self .read_rsp (2000 )
358383 if shver is not None :
359384 self .print_pretty_response (shver )
385+ if shimei is not None :
386+ self .print_pretty_response (shimei , prefix = '\n IMEI:' )
360387 return True
361388
362389 if debug : print ('Initial prepartion complete...' )
@@ -391,9 +418,17 @@ def __run(self, file_path=None, baudrate=921600, port=None, resume=False, load_f
391418
392419 if not resume :
393420
421+ # bind to AT channel
422+ self .__serial .write (b"AT+BIND=AT\r \n " )
423+ time .sleep (.5 )
424+ response = self .read_rsp (size = 100 )
425+ if debug : print ("AT+BIND=AT returned {}" .format (response ))
426+
394427 # disable echo
395428 self .__serial .write (b"ATE0\r \n " )
396- response = self .read_rsp (size = 6 )
429+ time .sleep (.5 )
430+ response = self .read_rsp (size = 100 )
431+ if debug : print ("ATE0 returned {}" .format (response ))
397432
398433 self .__serial .read (100 )
399434 if debug : print ('Entering upgrade mode...' )
@@ -673,22 +708,22 @@ def __check_br(self, br_only=False, verbose=False, debug=False):
673708
674709 def wakeup_modem (self , baudrate , port , max_try , delay , debug , msg = 'Attempting AT wakeup...' ):
675710 if 'FiPy' in self .__sysname or 'GPy' in self .__sysname :
676- self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 1 )
711+ self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 10 )
677712 MAX_TRY = max_try
678713 count = 0
679714 if msg is not None :
680715 print (msg )
681716 self .__serial .read ()
682717 self .__serial .write (b"AT\r \n " )
683- response = self .read_rsp (size = 6 )
718+ response = self .read_rsp (size = 25 )
684719 if debug : print ('{}' .format (response ))
685720 while (not b'OK' in response ) and (count < MAX_TRY ):
686721 count = count + 1
687722 if debug : print ('count={}' .format (count ))
688723 time .sleep (delay )
689724 self .__serial .read ()
690725 self .__serial .write (b"AT\r \n " )
691- response = self .read_rsp (size = 6 )
726+ response = self .read_rsp (size = 25 )
692727 if debug : print ('{}' .format (response ))
693728 if 'FiPy' in sysname or 'GPy' in sysname :
694729 self .__serial = UART (1 , baudrate = baudrate , pins = self .__pins , timeout_chars = 100 )
@@ -699,15 +734,15 @@ def at_negotiation(self, baudrate, port, max_try, mirror, atneg_only, debug):
699734 count = 0
700735 print ('Attempting AT auto-negotiation...' )
701736 self .__serial .write (b"AT\r \n " )
702- response = self .read_rsp (size = 6 )
737+ response = self .read_rsp (size = 20 )
703738 if debug : print ('{}' .format (response ))
704739 while (not b'OK' in response ) and (count < MAX_TRY ):
705740 count = count + 1
706741 if debug : print ('count={}' .format (count ))
707742 time .sleep (1 )
708743 self .__serial .read ()
709744 self .__serial .write (b"AT\r \n " )
710- response = self .read_rsp (size = 6 )
745+ response = self .read_rsp (size = 20 )
711746 if debug : print ('{}' .format (response ))
712747 if b'OK' in response :
713748 self .__serial .read ()
@@ -757,9 +792,9 @@ def uart_mirror(self, color):
757792 def success_message (self , port = None , verbose = False , debug = False ):
758793 print ("Your modem has been successfully updated." )
759794 print ("Here is the current firmware version:\n " )
760- self .show_version (port = port , verbose = verbose , debug = debug )
795+ self .show_info (port = port , verbose = verbose , debug = debug )
761796
762- def upgrade (self , ffile , mfile = None , baudrate = 921600 , retry = False , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True ):
797+ def upgrade (self , ffile , mfile = None , baudrate = 921600 , retry = False , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True , load_only = False ):
763798 success = True
764799 if not retry and mfile is not None :
765800 if resume or self .__check_br (br_only = True , verbose = verbose , debug = debug ):
@@ -776,6 +811,8 @@ def upgrade(self, ffile, mfile=None, baudrate=921600, retry=False, resume=False,
776811 success = False
777812 success = self .__run (file_path = mfile , load_ffh = True , direct = False , baudrate = baudrate , debug = debug , pkgdebug = pkgdebug , verbose = verbose )
778813 time .sleep (1 )
814+ if load_only :
815+ return True
779816 else :
780817 success = True
781818 else :
@@ -818,8 +855,8 @@ def upgrade_uart(self, ffh_mode=False, mfile=None, retry=False, resume=False, co
818855 else :
819856 print ('Unable to upgrade bootrom.' )
820857
821- def show_version (self , port = None , debug = False , verbose = False ):
822- self .__run (port = port , debug = debug , version_only = True , verbose = verbose )
858+ def show_info (self , port = None , debug = False , verbose = False ):
859+ self .__run (port = port , debug = debug , info_only = True , verbose = verbose )
823860
824861 def upgrade_ext (self , port , ffile , mfile , resume = False , debug = False , pkgdebug = False , verbose = False , load_fff = True ):
825862 success = True
@@ -847,13 +884,29 @@ def print_welcome():
847884
848885if 'FiPy' in sysname or 'GPy' in sysname :
849886
850- def run (ffile , mfile = None , baudrate = 921600 , verbose = False , debug = False , load_fff = True ):
887+ def load (mfile , baudrate = 921600 , verbose = False , debug = False , hangup = False ):
888+ print_welcome ()
889+ sqnup = sqnsupgrade ()
890+ if sqnup .check_files (mfile , None , debug ):
891+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
892+ if debug : print ('Modem state: {}' .format (state ))
893+ if state is None :
894+ detect_error ()
895+ elif state == 0 :
896+ sqnup .upgrade (ffile = None , mfile = mfile , baudrate = baudrate , retry = True , resume = False , debug = debug , pkgdebug = False , verbose = verbose , load_fff = False , load_only = True )
897+ elif state == - 1 :
898+ detect_error ()
899+ else :
900+ print ('Modem must be in recovery mode!' )
901+ reconnect_uart ()
902+
903+ def run (ffile , mfile = None , baudrate = 921600 , verbose = False , debug = False , load_fff = True , hangup = True ):
851904 print_welcome ()
852905 retry = False
853906 resume = False
854907 sqnup = sqnsupgrade ()
855908 if sqnup .check_files (ffile , mfile , debug ):
856- state = sqnup .detect_modem_state (debug = debug )
909+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
857910 if debug : print ('Modem state: {}' .format (state ))
858911 if state is None :
859912 detect_error ()
@@ -863,19 +916,24 @@ def run(ffile, mfile=None, baudrate=921600, verbose=False, debug=False, load_fff
863916 print ('Your modem is in recovery mode. Please specify updater.elf file' )
864917 reconnect_uart ()
865918 sys .exit (1 )
866- elif state == 4 :
919+ elif state == 4 or state == 1 :
867920 resume = True
868921 elif state == - 1 :
869922 detect_error ()
870923 sqnup .upgrade (ffile = ffile , mfile = mfile , baudrate = baudrate , retry = retry , resume = resume , debug = debug , pkgdebug = False , verbose = verbose , load_fff = load_fff )
871924 reconnect_uart ()
872925
873- def uart (ffh_mode = False , mfile = None , color = 0x050505 , verbose = False , debug = False ):
926+ def uart (ffh_mode = False , mfile = None , color = 0x050505 , verbose = False , debug = False , hangup = True ):
874927 print_welcome ()
875928 retry = False
876929 resume = False
930+ import pycom
931+ state = None
877932 sqnup = sqnsupgrade ()
878- state = sqnup .detect_modem_state (debug = debug )
933+ if verbose : print ('Trying to detect modem state...' )
934+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
935+ if debug : print ('Modem state: {}' .format (state ))
936+
879937 if state is None :
880938 detect_error ()
881939 elif state == 0 :
@@ -888,22 +946,19 @@ def uart(ffh_mode=False, mfile=None, color=0x050505, verbose=False, debug=False)
888946 detect_error ()
889947 sqnup .upgrade_uart (ffh_mode , mfile , retry , resume , color , debug , False , verbose )
890948
891- def info (verbose = False , debug = False , retry = 5 ):
949+ def info (verbose = False , debug = False , hangup = True ):
892950 print_welcome ()
893951 import pycom
894- count = 0
952+ state = None
895953 sqnup = sqnsupgrade ()
896- while count < retry :
897- count += 1
898- if verbose : print ('Trying to detect modem state [{}/{}]' .format (count , retry ))
899- state = sqnup .detect_modem_state (debug = debug )
900- if debug : print ('State: {} at count: {}' .format (state , count ))
901- if state is not None : break
954+ if verbose : print ('Trying to detect modem state...' )
955+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup )
956+ if debug : print ('Modem state: {}' .format (state ))
902957
903958 if state is not None :
904959 if state == 2 :
905960 print ('Your modem is in application mode. Here is the current version:' )
906- sqnup .show_version (verbose = verbose , debug = debug )
961+ sqnup .show_info (verbose = verbose , debug = debug )
907962 elif state == 1 :
908963 print ('Your modem is in mTools mode.' )
909964 elif state == 0 :
@@ -918,6 +973,15 @@ def info(verbose=False, debug=False, retry=5):
918973 print ('Cannot determine modem state!' )
919974 reconnect_uart ()
920975
976+ def imei (verbose = False , debug = False , retry = 5 , hangup = False ):
977+ sqnup = sqnsupgrade ()
978+ state = sqnup .detect_modem_state (debug = debug , hangup = hangup , retry = retry )
979+ return sqnup .get_imei () if state == 2 else None
980+
981+ def state (verbose = False , debug = False , retry = 5 , hangup = False ):
982+ sqnup = sqnsupgrade ()
983+ return sqnup .detect_modem_state (debug = debug , hangup = hangup , retry = retry )
984+
921985else :
922986 def run (port , ffile , mfile = None , resume = False , debug = False , verbose = False , load_fff = True ):
923987 print_welcome ()
@@ -927,4 +991,4 @@ def run(port, ffile, mfile=None, resume=False, debug=False, verbose=False, load_
927991
928992 def version (port , verbose = False , debug = False ):
929993 sqnup = sqnsupgrade ()
930- sqnup .show_version (port = port , debug = debug , verbose = verbose )
994+ sqnup .show_info (port = port , debug = debug , verbose = verbose )
0 commit comments