zos.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #!/usr/bin/python3
  2. # -*- coding: UTF-8 -*-
  3. import os
  4. import sys
  5. import platform
  6. import multiprocessing
  7. import serial
  8. import time
  9. import traceback
  10. from tools.Download import build
  11. def usage():
  12. print('''
  13. ZeusOS版本SDK的编译命令如下:
  14. python zos.py [action]
  15. <-menu> 功能描述: 开启图形化代码裁剪功能
  16. <-dl> 功能描述: 往UE下载程序
  17. 参数: <PortNo.>: 串口号(例如com4)
  18. <-s> 功能描述: 拆分文件
  19. 示例1, 开启图形化代码裁剪功能
  20. python zos.py -menu
  21. 示例2, 下载固件到模组
  22. python zos.py -dl com3
  23. 示例3, 拆分固件
  24. python zos.py -s
  25. ''')
  26. def enter_download_mode(com):
  27. print(com)
  28. dev = serial.Serial(com, 9600,timeout=1, parity=serial.PARITY_NONE, stopbits=1)
  29. if dev.isOpen(): # 判断串口是否打开
  30. print("open success")
  31. else :
  32. dev.open()
  33. dev.write('AT\r\n'.encode("utf8"))
  34. data = dev.read(50)
  35. time.sleep(1)
  36. dev.write('AT\r\n'.encode("utf8"))
  37. data = dev.read(50)
  38. if ( "OK" in str(data)):
  39. print("当前是AT固件\r\n")
  40. dev.write('AT+NV=SET,STANDBY,0\r\n'.encode("utf8"))
  41. time.sleep(2)
  42. dev.write('AT+NV=SET,WDT,0\r\n'.encode("utf8"))
  43. time.sleep(2)
  44. dev.write('AT+FORCEDL\r\n'.encode("utf8"))
  45. time.sleep(2)
  46. data = dev.read(4)
  47. print(data)
  48. else :
  49. dev.baudrate = 115200
  50. dev.write('AT\r\n'.encode("utf8"))
  51. data = dev.read(50)
  52. dev.write('enter_download_mode\r\n'.encode("utf8"))
  53. data = dev.read(50)
  54. if ( "OK" in str(data)):
  55. print("当前已经进入二次开发模式,即将下载固件\r\n")
  56. else :
  57. print("设备连接失败\r\n")
  58. dev.close()
  59. time.sleep(3)
  60. def run_menuconfig():
  61. """运行菜单配置并捕获可能的异常"""
  62. try:
  63. menu_cmd = "python ./../../tools/config/menuconfig.py"
  64. os_ver = platform.system()
  65. if os_ver == "Windows":
  66. # Windows下直接运行,不使用start命令,以便捕获输出
  67. result = os.system(menu_cmd)
  68. if result != 0:
  69. raise Exception(f"菜单配置命令返回非零状态: {result}")
  70. else:
  71. # Linux/Mac使用subprocess代替os.system以便获取输出
  72. import subprocess
  73. result = subprocess.run(menu_cmd, shell=True, capture_output=True, text=True)
  74. if result.returncode != 0:
  75. print("标准输出:", result.stdout)
  76. print("错误输出:", result.stderr)
  77. raise Exception(f"菜单配置命令失败,返回代码: {result.returncode}")
  78. except Exception as e:
  79. print(f"\n执行菜单配置时发生错误: {str(e)}")
  80. traceback.print_exc() # 打印完整的错误堆栈
  81. input("\n按回车键退出...") # 确保用户能看到错误信息
  82. def main():
  83. argc = 1
  84. test_list = ['-menu','-b','-c','-m','-mdl','-dl','-s','-h']
  85. os_ver = platform.system()
  86. while len(sys.argv) > argc:
  87. if sys.argv[argc] == "-menu":
  88. print("Zeusos menuconfig 配置已开启")
  89. if os_ver == "Windows":
  90. print("如果在windows下看不到图形化配置界面,请使用调用以下命令安装python包:")
  91. print("pip install windows-curses ")
  92. # 使用新的函数运行菜单配置并处理错误
  93. run_menuconfig()
  94. elif sys.argv[argc] == '-m':
  95. if len(sys.argv) > argc+1:
  96. if sys.argv[argc+1] in test_list:
  97. passward = ''
  98. else :
  99. passward = sys.argv[argc+1]
  100. argc +=1
  101. else :
  102. passward = ''
  103. print(passward)
  104. build.do_pack(passward)
  105. print('\r\n固件合并完成,现在可以执行以下命令进行下载固件了.')
  106. print('\r\n当前程序为AT固件或者shell命令可以正常运行,请使用 python zos.py -dl com3 进行下载')
  107. print('\r\n如果程序处于死机状态请按住boot按键后再上电,然后使用 python zos.py -mdl com3 进行下载')
  108. elif sys.argv[argc] == '-mdl':
  109. cmd_list = []
  110. if len(sys.argv) > argc+1:
  111. if sys.argv[argc+1] in test_list:
  112. print("执行下载命令,需要输入串口信息。")
  113. print("例如:python zos.py -dl com3")
  114. return
  115. else :
  116. cmd_list.append(sys.argv[argc+1])
  117. if len(sys.argv) > argc+2:
  118. if sys.argv[argc+2] not in test_list:
  119. cmd_list.append(sys.argv[argc+2])
  120. build.do_download(cmd_list)
  121. argc +=1
  122. else :
  123. print("执行下载命令,需要输入串口信息。")
  124. print("例如:python zos.py -dl com3")
  125. return
  126. elif sys.argv[argc] == '-dl':
  127. cmd_list = []
  128. if len(sys.argv) > argc+1:
  129. if sys.argv[argc+1] in test_list:
  130. print("执行下载命令,需要输入串口信息。")
  131. print("例如:python zos.py -dl com3")
  132. return
  133. else :
  134. cmd_list.append(sys.argv[argc+1])
  135. if len(sys.argv) > argc+2:
  136. if sys.argv[argc+2] not in test_list:
  137. cmd_list.append(sys.argv[argc+2])
  138. enter_download_mode(cmd_list[0])
  139. build.do_download(cmd_list)
  140. argc +=1
  141. else :
  142. print("执行下载命令,需要输入串口信息。")
  143. print("例如:python zos.py -dl com3")
  144. return
  145. elif sys.argv[argc] == '-s':
  146. if len(sys.argv) > argc+1:
  147. if sys.argv[argc+1] in test_list:
  148. passward = ''
  149. else :
  150. passward = sys.argv[argc+1]
  151. argc +=1
  152. else :
  153. passward = ''
  154. print(passward)
  155. build.do_unpack(passward)
  156. print('\r\n固件拆分完成')
  157. elif sys.argv[argc] == '-h':
  158. usage()
  159. else :
  160. usage()
  161. argc += 1
  162. print("***********************************************************************")
  163. # 仅在非菜单命令下显示此消息
  164. if "-menu" not in sys.argv:
  165. print("操作已完成,再见")
  166. if len(sys.argv) == 1 :
  167. usage()
  168. else :
  169. main()