airgps.lua 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. local airgps = {}
  2. local gps_state = "未定位"
  3. local gps_is_run = false
  4. local lat = ""
  5. local lng = ""
  6. local total_sats = 0
  7. local total_sats_use = 0
  8. local speed = 0
  9. local degrees = ""
  10. local snr = ""
  11. local snr1 = ""
  12. local location = ""
  13. local move = "静止"
  14. local time = ""
  15. local function setup_gps()
  16. gps_is_run = true
  17. gps_state = "定位中"
  18. local gnss = require("agps_icoe")
  19. log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
  20. pm.power(pm.GPS, true)
  21. gnss.setup({
  22. uart_id=2,
  23. uart_forward = uart.VUART_0, -- 转发到虚拟串口,方便对接GnssToolKit3
  24. debug=true,
  25. sys=1
  26. })
  27. gnss.start() --初始化gnss
  28. gnss.agps() --使用agps辅助定位
  29. --循环打印解析后的数据,可以根据需要打开对应注释
  30. end
  31. local function gps_state_get()
  32. local gsv = libgnss.getGsv()
  33. -- log.info("nmea", "gsv", json.encode(libgnss.getGsv()))
  34. if gsv and gsv.total_sats then
  35. total_sats = gsv.total_sats
  36. end
  37. local tmp = {}
  38. snr = ""
  39. snr1 = ""
  40. if gsv.total_sats > 0 then
  41. for i = 1, gsv.total_sats do
  42. if gsv.sats[i].snr and gsv.sats[i].snr ~= 0 then
  43. table.insert(tmp, gsv.sats[i].snr)
  44. end
  45. end
  46. total_sats_use = #tmp
  47. table.sort(tmp, function(a, b)
  48. return a > b
  49. end)
  50. if #tmp > 16 then
  51. for i = 1 , 16 do
  52. snr = snr .. tmp[i] .. ","
  53. end
  54. for i = 17 , #tmp do
  55. snr1 = snr1 .. tmp[i] .. ","
  56. end
  57. else
  58. for i = 1 , #tmp do
  59. snr = snr .. tmp[i] .. ","
  60. end
  61. end
  62. -- log.info("gps_state_get",#tmp,snr,snr1 )
  63. end
  64. local vtg = libgnss.getVtg()
  65. if vtg and gsv.speed_kph then
  66. speed = gsv.speed_kph
  67. end
  68. if vtg and gsv.true_track_degrees then
  69. degrees = gsv.true_track_degrees
  70. end
  71. if vtg and gsv.speed_kph then
  72. speed = gsv.speed_kph
  73. end
  74. if gps_state == "定位成功" then
  75. rmc = libgnss.getRmc(2)
  76. log.info("nmea", "rmc", json.encode(libgnss.getRmc(2)))
  77. lat = rmc.lat
  78. lng = rmc.lng
  79. variation = rmc.variation
  80. time = rmc.year .. "年" .. rmc.month .. "月" .. rmc.day .. "日" .. (rmc.hour + 8) .. "时" .. rmc.min .. "分" .. rmc.sec .. "秒"
  81. -- speed = libgnss.getIntLocation(2)
  82. end
  83. end
  84. -- 订阅GNSS状态编码
  85. sys.subscribe("GNSS_STATE", function(event, ticks)
  86. -- event取值有
  87. -- FIXED 定位成功
  88. -- LOSE 定位丢失
  89. -- ticks是事件发生的时间,一般可以忽略
  90. log.info("gnss", "state", event, ticks)
  91. if event == "FIXED" then
  92. local locStr = libgnss.locStr()
  93. log.info("gnss", "locStr", locStr)
  94. gps_state = "定位成功"
  95. -- if locStr then
  96. -- -- 存入文件,方便下次AGNSS快速定位
  97. -- io.writeFile("/gnssloc", locStr)
  98. -- end
  99. elseif event == "LOSE" then
  100. gps_state = "定位失败"
  101. elseif event == "AGPS_DOWNLOADED" then
  102. gps_state = "定位中:辅助定位数据下载完成"
  103. elseif event == "AGPS_LBS_LOC_ERR" then
  104. gps_state = "定位中:辅助定位坐标位置获取失败"
  105. elseif event == "AGPS_WIRTE_OK" then
  106. gps_state = "定位中:辅助定位写入完成,正在搜星"
  107. end
  108. end)
  109. function airgps.run() -- TTS 播放主程序
  110. log.info("airgps.run")
  111. run_state = 1
  112. lcd.setFont(lcd.font_opposansm12_chinese) -- 具体取值可参考api文档的常量表
  113. while true do
  114. sys.wait(1000)
  115. lcd.clear(_G.bkcolor)
  116. -- log.info("scell", json.encode(mobile.scell()))
  117. gps_state_get()
  118. -- log.info("airgps.run 11 ")
  119. lcd.drawStr(0,80,"GPS 状态:" .. gps_state)
  120. lcd.drawStr(0,110,"经度:" .. lng .. " 纬度:".. lat .. " (WGS-84坐标系)" )
  121. lcd.drawStr(0,140,"可见卫星数:" .. total_sats .. " ,可用卫星数:" .. total_sats_use)
  122. lcd.drawStr(0,160,"信噪比:" .. snr)
  123. lcd.drawStr(0,180,snr1)
  124. lcd.drawStr(0,200,"速度:" .. speed .. "千米/小时")
  125. lcd.drawStr(0,230,"方向:" .. degrees)
  126. lcd.drawStr(0,260,"位置:" .. location)
  127. lcd.drawStr(0,290,"高精度时间:" .. time)
  128. lcd.drawStr(0,320,"运动状态:" .. move)
  129. lcd.showImage(20,360,"/luadb/back.jpg")
  130. if gps_is_run then
  131. lcd.showImage(130,370,"/luadb/stop_gps.jpg")
  132. else
  133. lcd.showImage(130,370,"/luadb/start_gps.jpg")
  134. end
  135. lcd.showImage(0,448,"/luadb/Lbottom.jpg")
  136. lcd.flush()
  137. if run_state == 0 then -- 等待结束
  138. return true
  139. end
  140. end
  141. end
  142. local function stop_gps()
  143. gnss.stop()
  144. end
  145. function airgps.tp_handal(x,y,event) -- 判断是否需要停止播放
  146. if x > 20 and x < 100 and y > 360 and y < 440 then
  147. run_state = 0
  148. elseif x > 130 and x < 241 and y > 370 and y < 417 then
  149. if gps_is_run then
  150. sys.taskInit(stop_gps, "stop_gps")
  151. else
  152. sys.taskInit(setup_gps, "setup_gps")
  153. end
  154. end
  155. end
  156. return airgps