autoGPS.lua 6.9 KB

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