misc.lua 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. --- 模块功能:配置管理-序列号、IMEI、底层软件版本号、时钟、是否校准、飞行模式、查询电池电量等功能
  2. -- @module misc
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.10.20
  7. require "ril"
  8. local req = ril.request
  9. module(..., package.seeall)
  10. --sn:序列号
  11. --imei:IMEI
  12. -- calib 校准标志
  13. local sn, imei, calib, ver, muid
  14. local setSnCbFnc,setImeiCbFnc,setClkCbFnc
  15. local function timeReport()
  16. sys.publish("TIME_CLK_IND")
  17. sys.timerStart(setTimeReport,2000)
  18. end
  19. function setTimeReport()
  20. sys.timerStart(timeReport,(os.time()%60==0) and 50 or (60-os.time()%60)*1000)
  21. end
  22. --[[
  23. 函数名:rsp
  24. 功能 :本功能模块内“通过虚拟串口发送到底层core软件的AT命令”的应答处理
  25. 参数 :
  26. cmd:此应答对应的AT命令
  27. success:AT命令执行结果,true或者false
  28. response:AT命令的应答中的执行结果字符串
  29. intermediate:AT命令的应答中的中间信息
  30. 返回值:无
  31. ]]
  32. local function rsp(cmd, success, response, intermediate)
  33. local prefix = string.match(cmd, "AT(%+%u+)")
  34. --查询序列号
  35. if cmd == "AT+WISN?" then
  36. sn = intermediate
  37. if setSnCbFnc then setSnCbFnc(true) end
  38. sys.publish('SN_READY_IND')
  39. --查询IMEI
  40. elseif cmd == "AT+CGSN" then
  41. imei = intermediate
  42. if setImeiCbFnc then setImeiCbFnc(true) end
  43. sys.publish('IMEI_READY_IND')
  44. elseif cmd == 'AT+VER' then
  45. ver = intermediate
  46. --查询是否校准
  47. elseif cmd == "AT+ATWMFT=99" then
  48. log.info('misc.ATWMFT', intermediate)
  49. if intermediate == "SUCC" then
  50. calib = true
  51. else
  52. calib = false
  53. end
  54. elseif prefix == '+CCLK' then
  55. if success then
  56. sys.publish('TIME_UPDATE_IND')
  57. setTimeReport()
  58. end
  59. if setClkCbFnc then setClkCbFnc(getClock(),success) end
  60. elseif cmd:match("AT%+WISN=") then
  61. if success then
  62. req("AT+WISN?")
  63. else
  64. if setSnCbFnc then setSnCbFnc(false) end
  65. end
  66. elseif cmd:match("AT%+WIMEI=") then
  67. if success then
  68. req("AT+CGSN")
  69. else
  70. if setImeiCbFnc then setImeiCbFnc(false) end
  71. end
  72. elseif cmd:match("AT%+MUID?") then
  73. if intermediate then muid = intermediate:match("+MUID:%s*\"(.+)\"") end
  74. end
  75. end
  76. function getVersion()
  77. return ver
  78. end
  79. --- 设置系统时间
  80. -- @table t,系统时间,格式参考:{year=2017,month=2,day=14,hour=14,min=2,sec=58}
  81. -- @function[opt=nil] cbFnc,设置结果回调函数,回调函数的调用形式为:
  82. -- cnFnc(time,result),result为true表示成功,false或者nil为失败;time表示设置之后的系统时间,table类型,例如{year=2017,month=2,day=14,hour=14,min=19,sec=23}
  83. -- @return nil
  84. -- @usage misc.setClock({year=2017,month=2,day=14,hour=14,min=2,sec=58})
  85. function setClock(t,cbFnc)
  86. if type(t) ~= "table" or (t.year-2000>38) then
  87. if cbFnc then cbFnc(getClock(),false) end
  88. return
  89. end
  90. setClkCbFnc = cbFnc
  91. req(string.format("AT+CCLK=\"%02d/%02d/%02d,%02d:%02d:%02d+32\"", string.sub(t.year, 3, 4), t.month, t.day, t.hour, t.min, t.sec), nil, rsp)
  92. end
  93. --- 获取系统时间
  94. -- @return table time,{year=2017,month=2,day=14,hour=14,min=19,sec=23}
  95. -- @usage time = getClock()
  96. function getClock()
  97. return os.date("*t")
  98. end
  99. --- 获取星期
  100. -- @return number week,1-7分别对应周一到周日
  101. -- @usage week = misc.getWeek()
  102. function getWeek()
  103. local clk = os.date("*t")
  104. return ((clk.wday == 1) and 7 or (clk.wday - 1))
  105. end
  106. --- 获取校准标志
  107. -- @return bool calib, true表示已校准,false或者nil表示未校准
  108. -- @usage calib = misc.getCalib()
  109. function getCalib()
  110. return calib
  111. end
  112. --- 设置SN
  113. -- @string s,新sn的字符串
  114. -- @function[opt=nil] cbFnc,设置结果回调函数,回调函数的调用形式为:
  115. -- cnFnc(result),result为true表示成功,false或者nil为失败
  116. -- @return nil
  117. -- @usage
  118. -- misc.setSn("1234567890")
  119. -- misc.setSn("1234567890",cbFnc)
  120. function setSn(s, cbFnc)
  121. if s ~= sn then
  122. setSnCbFnc = cbFnc
  123. req("AT+WISN=\"" .. s .. "\"")
  124. else
  125. if cbFnc then cbFnc(true) end
  126. end
  127. end
  128. --- 获取模块序列号
  129. -- @return string sn,序列号,如果未获取到返回""
  130. -- 注意:开机lua脚本运行之后,会发送at命令去查询sn,所以需要一定时间才能获取到sn。开机后立即调用此接口,基本上返回""
  131. -- @usage sn = misc.getSn()
  132. function getSn()
  133. return sn or ""
  134. end
  135. --- 设置IMEI
  136. -- @string s,新IMEI字符串
  137. -- @function[opt=nil] cbFnc,设置结果回调函数,回调函数的调用形式为:
  138. -- cnFnc(result),result为true表示成功,false或者nil为失败
  139. -- @return nil
  140. -- @usage misc.setImei(”359759002514931”)
  141. function setImei(s, cbFnc)
  142. if s ~= imei then
  143. setImeiCbFnc = cbFnc
  144. req("AT+WIMEI=\"" .. s .. "\"")
  145. else
  146. if cbFnc then cbFnc(true) end
  147. end
  148. end
  149. --- 获取模块IMEI
  150. -- @return string,IMEI号,如果未获取到返回""
  151. -- 注意:开机lua脚本运行之后,会发送at命令去查询imei,所以需要一定时间才能获取到imei。开机后立即调用此接口,基本上返回""
  152. -- @usage imei = misc.getImei()
  153. function getImei()
  154. return imei or ""
  155. end
  156. --- 获取VBAT的电池电压
  157. -- @return number,电池电压,单位mv
  158. -- @usage vb = getVbatt()
  159. function getVbatt()
  160. local v1, v2, v3, v4, v5 = pmd.param_get()
  161. return v2
  162. end
  163. --- 获取模块MUID
  164. -- @return string,MUID号,如果未获取到返回""
  165. -- 注意:开机lua脚本运行之后,会发送at命令去查询muid,所以需要一定时间才能获取到muid。开机后立即调用此接口,基本上返回""
  166. -- @usage muid = misc.getMuid()
  167. function getMuid()
  168. return muid or ""
  169. end
  170. --- 打开并且配置PWM(支持2路PWM,仅支持输出)
  171. -- 说明:
  172. -- 当id为0时:period 取值在 80-1625 Hz范围内时,level 占空比取值范围为:1-100;
  173. -- period 取值在 1626-65535 Hz范围时,设x=162500/period, y=x * level / 100, x 和 y越是接近正的整数,则输出波形越准确
  174. -- @number id,PWM输出通道,仅支持0和1,0用的是uart2 tx,1用的是uart2 rx
  175. -- @number period,
  176. -- 当id为0时,period表示频率,单位为Hz,取值范围为80-1625,仅支持整数
  177. -- 当id为1时,取值范围为0-7,仅支持整数,表示时钟周期,单位为毫秒,0-7分别对应125、250、500、1000、1500、2000、2500、3000毫秒
  178. -- @number level,
  179. -- 当id为0时,level表示占空比,单位为level%,取值范围为1-100,仅支持整数
  180. -- 当id为1时,取值范围为1-15,仅支持整数,表示一个时钟周期内的高电平时间,单位为毫秒
  181. -- 1-15分别对应15.6、31.2、46.9、62.5、78.1、93.7、110、125、141、156、172、187、203、219、234毫秒
  182. -- @return nil
  183. function openPwm(id, period, level)
  184. assert(type(id) == "number" and type(period) == "number" and type(level) == "number", "openpwm type error")
  185. assert(id == 0 or id == 1, "openpwm id error: " .. id)
  186. local pmin, pmax, lmin, lmax = 80, 1625, 1, 100
  187. if id == 1 then pmin, pmax, lmin, lmax = 0, 7, 1, 15 end
  188. assert(period >= pmin and period <= pmax, "openpwm period error: " .. period)
  189. assert(level >= lmin and level <= lmax, "openpwm level error: " .. level)
  190. req("AT+SPWM=" .. id .. "," .. period .. "," .. level)
  191. end
  192. --- 关闭PWM
  193. -- @number id,PWM输出通道,仅支持0和1,0用的是uart2 tx,1用的是uart2 rx
  194. -- @return nil
  195. function closePwm(id)
  196. assert(id == 0 or id == 1, "closepwm id error: " .. id)
  197. req("AT+SPWM=" .. id .. ",0,0")
  198. end
  199. --注册以下AT命令的应答处理函数
  200. ril.regRsp("+ATWMFT", rsp)
  201. ril.regRsp("+WISN", rsp)
  202. ril.regRsp("+CGSN", rsp)
  203. ril.regRsp("+MUID", rsp)
  204. ril.regRsp("+WIMEI", rsp)
  205. ril.regRsp("+AMFAC", rsp)
  206. ril.regRsp('+VER', rsp, 4, '^[%w_]+$')
  207. req('AT+VER')
  208. --查询是否校准
  209. req("AT+ATWMFT=99")
  210. --查询序列号
  211. req("AT+WISN?")
  212. --查询IMEI
  213. req("AT+CGSN")
  214. req("AT+MUID?")
  215. setTimeReport()