autoGPS.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. --- 模块功能:GPIO功能测试.
  2. --- 如需切换外接GPS模块种类请执行重启
  3. -- @author openLuat
  4. -- @module gpio.testGpioSingle
  5. -- @license MIT
  6. -- @copyright openLuat
  7. -- @release 2018.03.27
  8. module(...,package.seeall)
  9. --记录gps型号和串口波特率
  10. local GPS_KIND_INFO_FILE = "/GPSKINDINFO.txt"
  11. --写实际接的串口号
  12. --Air820模块内部,gps芯片使用的是串口1
  13. local UART_ID = 1
  14. --串口接收数据缓冲区
  15. local rdBuf = ""
  16. --gps芯片型号
  17. local gpsKind=""
  18. --自适应的gps、agps功能库
  19. local gpsLib,agpsLib="",""
  20. --自适应串口波特率
  21. --默认从115200开始轮询
  22. local uartBaudrate=115200
  23. --其他串口参数
  24. local uartDatabits,uartParity,uartStopbits = 8,uart.PAR_NONE,uart.STOP_1
  25. function writeCmd(cmd,isFull)
  26. local tmp = cmd
  27. if not isFull then
  28. tmp = 0
  29. for i=2,cmd:len()-1 do
  30. tmp = bit.bxor(tmp,cmd:byte(i))
  31. end
  32. tmp = cmd..(string.format("%02X",tmp)):upper().."\r\n"
  33. end
  34. uart.write(UART_ID,tmp)
  35. log.info("autoGPS.writeCmd",tmp)
  36. end
  37. --解析GPS种类
  38. local function parse(data)
  39. if not data then return end
  40. local tInfo =
  41. {
  42. {keyWord="UC6228",kind="510U"},
  43. {keyWord="UC6226",kind="530H"},
  44. {keyWord="GOKE",kind="530"},
  45. {keyWord="URANUS5",kind="530Z"},
  46. {keyWord="ANTENNA",kind="530Z"},
  47. }
  48. for i=1,#tInfo do
  49. if data:match(tInfo[i].keyWord) then
  50. gpsKind=tInfo[i].kind
  51. log.info("autoGPS.parse",gpsKind)
  52. uart.close(UART_ID)
  53. sys.publish("GPS_KIND",gpsKind)
  54. return true,""
  55. end
  56. end
  57. return false,data
  58. end
  59. --缓冲拼接
  60. local function proc(data)
  61. if not data or string.len(data) == 0 then return end
  62. --追加到缓冲区
  63. rdBuf = rdBuf..data
  64. local result,unproc
  65. unproc = rdBuf
  66. --根据帧结构循环解析未处理过的数据
  67. while true do
  68. result,unproc = parse(unproc)
  69. if not unproc or unproc == "" or not result then
  70. break
  71. end
  72. end
  73. rdBuf = unproc or ""
  74. end
  75. --读出
  76. local function read()
  77. local data = ""
  78. while true do
  79. data = uart.read(UART_ID,"*l")
  80. if not data or string.len(data) == 0 then break end
  81. --打开下面的打印会耗时
  82. --log.info("testUart.read bin",data)
  83. proc(data)
  84. end
  85. end
  86. --串口发送成功回调
  87. local function writeOk()
  88. log.info("autoGPS.writeOk")
  89. end
  90. --写判断查询版本号命令
  91. local function writeKindCmd()
  92. if string.len(gpsKind)==0 then
  93. writeCmd("$PDTINFO\r\n",true) --510U
  94. writeCmd("$PDTINFO\r\n",true) --530H
  95. writeCmd("$PGKC462*") --530
  96. writeCmd("$PCAS06,0*") --530Z
  97. end
  98. end
  99. --波特率自动切换
  100. local function uartBaudrateTest()
  101. if string.len(gpsKind)==0 then
  102. uartBaudrate = uartBaudrate==115200 and 9600 or 115200
  103. uart.close(UART_ID)
  104. rdBuf = ""
  105. uart.setup(UART_ID,uartBaudrate,uartDatabits,uartParity,uartStopbits)
  106. log.info("autoGPS.uartBaudrateTest",uartBaudrate)
  107. end
  108. end
  109. local function init()
  110. --开始初始化
  111. if string.find(rtos.get_version(),"RDA8910") then
  112. pmd.ldoset(15,pmd.LDO_VIBR)
  113. else
  114. pmd.ldoset(7,pmd.LDO_VCAM)
  115. end
  116. rtos.sys32k_clk_out(1)
  117. --初始化完毕,开始注册回调打开串口
  118. uart.on(UART_ID,"sent",writeOk)
  119. uart.on(UART_ID,"receive",read)
  120. uart.setup(UART_ID,uartBaudrate,uartDatabits,uartParity,uartStopbits)
  121. end
  122. --解析关键字加载对应库
  123. local function loadLib(keyword)
  124. if keyword=="530" then
  125. gpsLib = require"gps"
  126. agpsLib = require"agps"
  127. elseif keyword=="530Z" then
  128. gpsLib = require"gpsZkw"
  129. agpsLib = require"agpsZkw"
  130. elseif keyword=="510U" then
  131. gpsLib = require"gpsHxxt"
  132. agpsLib = require"agpsHxxt"
  133. elseif keyword=="530H" then
  134. gpsLib = require"gpsHxxt"
  135. agpsLib = require"agpsHxxt"
  136. end
  137. if type(gpsLib)=="table" and type(gpsLib.init)=="fucntion" then
  138. gpsLib.init()
  139. end
  140. if type(agpsLib)=="table" and type(agpsLib.init)=="fucntion" then
  141. agpsLib.init()
  142. end
  143. end
  144. local function autoClose()
  145. uart.close(UART_ID)
  146. if string.find(rtos.get_version(),"RDA8910") then
  147. pmd.ldoset(0,pmd.LDO_VIBR)
  148. else
  149. pmd.ldoset(0,pmd.LDO_VCAM)
  150. end
  151. rtos.sys32k_clk_out(0)
  152. end
  153. local function selfAdapt()
  154. if io.exists(GPS_KIND_INFO_FILE) then
  155. local gpsKindInfo = io.readFile(GPS_KIND_INFO_FILE)
  156. log.info("autoGPS.task","gps kind info",gpsKindInfo)
  157. if string.find(gpsKindInfo,"530Z") then
  158. gpsKind="530Z"
  159. elseif string.find(gpsKindInfo,"510U") then
  160. gpsKind="510U"
  161. elseif string.find(gpsKindInfo,"530H") then
  162. gpsKind="530H"
  163. else
  164. gpsKind="530"
  165. end
  166. if string.find(gpsKindInfo,"9600") then
  167. uartBaudrate=9600
  168. elseif string.find(gpsKindInfo,"115200") then
  169. uartBaudrate=115200
  170. else
  171. log.warn("autoGPS.task","invalid uartBaudrate")
  172. end
  173. loadLib(gpsKind)
  174. sys.publish("AUTOGPS_READY",gpsLib,agpsLib,gpsKind,uartBaudrate)
  175. else
  176. rdBuf = ""
  177. init()
  178. while true do
  179. writeKindCmd()
  180. local result,data=sys.waitUntil("GPS_KIND",2000)
  181. if result then
  182. autoClose()
  183. loadLib(data)
  184. io.writeFile(GPS_KIND_INFO_FILE,gpsKind..tostring(uartBaudrate))
  185. sys.publish("AUTOGPS_READY",gpsLib,agpsLib,gpsKind,uartBaudrate)
  186. rdBuf=nil
  187. break
  188. else
  189. uartBaudrateTest()
  190. end
  191. sys.wait(100)
  192. end
  193. end
  194. end
  195. local coSelfAdapt = sys.taskInit(selfAdapt)
  196. --gps工作异常通知
  197. sys.subscribe("GPS_WORK_ABNORMAL_IND",function()
  198. log.info("autoGPS.GPS_WORK_ABNORMAL_IND",not coSelfAdapt or coroutine.status(coSelfAdapt)=="dead")
  199. if not coSelfAdapt or coroutine.status(coSelfAdapt)=="dead" then
  200. os.remove(GPS_KIND_INFO_FILE)
  201. if type(gpsLib)=="table" and type(gpsLib.unInit)=="function" then
  202. gpsLib.unInit()
  203. end
  204. if type(agpsLib)=="table" and type(agpsLib.unInit)=="function" then
  205. agpsLib.unInit()
  206. end
  207. gpsKind,gpsLib,agpsLib="","",""
  208. coSelfAdapt = sys.taskInit(selfAdapt)
  209. end
  210. end)