nvm.lua 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. --- 模块功能 :参数管理
  2. -- @module nvm
  3. -- @author 朱天华
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2017.11.9
  7. require"log"
  8. module(...,package.seeall)
  9. package.path = "/?.lua;".."/?.luae;"..package.path
  10. --默认参数配置存储在configname文件中
  11. --实时参数配置存储在paraname文件中
  12. --para:实时参数表
  13. --config:默认参数表
  14. paraname = "/nvm_para.lua"
  15. local para,libdftconfig,configname,econfigname = {}
  16. --- 参数恢复出厂设置
  17. -- @return nil
  18. -- @usage nvm.restore()
  19. function restore()
  20. local fpara,fconfig = io.open(paraname,"wb"),io.open(configname,"rb")
  21. if not fconfig then fconfig = io.open(econfigname,"rb") end
  22. fpara:write(fconfig:read("*a"))
  23. fpara:close()
  24. fconfig:close()
  25. upd(true)
  26. end
  27. --[[
  28. 函数名:serialize
  29. 功能 :根据不同的数据类型,按照不同的格式,写格式化后的数据到文件中
  30. 参数 :
  31. pout:文件句柄
  32. o:数据
  33. 返回值:无
  34. ]]
  35. local function serialize(pout,o)
  36. if type(o) == "number" then
  37. --number类型,直接写原始数据
  38. pout:write(o)
  39. elseif type(o) == "string" then
  40. --string类型,原始数据左右各加上双引号写入
  41. pout:write(string.format("%q", o))
  42. elseif type(o) == "boolean" then
  43. --boolean类型,转化为string写入
  44. pout:write(tostring(o))
  45. elseif type(o) == "table" then
  46. --table类型,加换行,大括号,中括号,双引号写入
  47. pout:write("{\n")
  48. for k,v in pairs(o) do
  49. if type(k) == "number" then
  50. pout:write(" [" .. k .. "] = ")
  51. elseif type(k) == "string" then
  52. pout:write(" [\"" .. k .."\"] = ")
  53. else
  54. error("cannot serialize table key " .. type(o))
  55. end
  56. serialize(pout,v)
  57. pout:write(",\n")
  58. end
  59. pout:write("}\n")
  60. else
  61. error("cannot serialize a " .. type(o))
  62. end
  63. end
  64. --[[
  65. 函数名:upd
  66. 功能 :更新实时参数表
  67. 参数 :
  68. overide:是否用默认参数强制更新实时参数
  69. 返回值:无
  70. ]]
  71. function upd(overide)
  72. for k,v in pairs(libdftconfig) do
  73. if k ~= "_M" and k ~= "_NAME" and k ~= "_PACKAGE" then
  74. if overide or para[k] == nil then
  75. para[k] = v
  76. end
  77. end
  78. end
  79. end
  80. --[[
  81. 函数名:load
  82. 功能 :初始化参数
  83. 参数 :无
  84. 返回值:无
  85. ]]
  86. local function load()
  87. local f = io.open(paraname,"rb")
  88. if not f or f:read("*a") == "" then
  89. if f then f:close() end
  90. restore()
  91. return
  92. end
  93. f:close()
  94. f,para = pcall(require,string.match(paraname,"/(.+)%.lua"))
  95. if not f then
  96. para = {}
  97. restore()
  98. return
  99. end
  100. upd()
  101. end
  102. --[[
  103. 函数名:save
  104. 功能 :保存参数文件
  105. 参数 :
  106. s:是否真正保存,true保存,false或者nil不保存
  107. 返回值:无
  108. ]]
  109. local function save(s)
  110. if not s then return end
  111. local f = {}
  112. f.write = function(self, s) table.insert(self, s) end
  113. f:write("module(...)\n")
  114. for k,v in pairs(para) do
  115. if k ~= "_M" and k ~= "_NAME" and k ~= "_PACKAGE" then
  116. f:write(k .. " = ")
  117. serialize(f,v)
  118. f:write("\n")
  119. end
  120. end
  121. local fpara = io.open(paraname, 'wb')
  122. fpara:write(table.concat(f))
  123. fpara:close()
  124. end
  125. --- 设置某个参数的值
  126. -- @param k ,string类型,参数的名字
  127. -- @param v,可以是任意类型,参数的新值
  128. -- @param r,设置原因,只有传入了非nil的有效参数,并且v值和旧值相比发生了改变,才会产生一个PARA_CHANGED_IND消息
  129. -- @param s,是否立即写入到文件系统中,false不写入,其余的都写入
  130. -- @return bool或者nil,成功返回true,失败返回nil
  131. -- @usage nvm.set("name","Luat"),参数name赋值为Luat,立即写入文件系统
  132. -- @usage nvm.set("age",12,"SVR"),参数age赋值为12,立即写入文件系统,如果旧值不是12,会产生一个PARA_CHANGED_IND消息
  133. -- @usage nvm.set("class","Class2",nil,false),参数class赋值为Class2,不写入文件系统
  134. -- @usage nvm.set("score",{chinese=100,math=99,english=98}),参数score赋值为{chinese=100,math=99,english=98},立即写入文件系统
  135. function set(k,v,r,s)
  136. local bchg = true
  137. if type(v) ~= "table" then
  138. bchg = (para[k] ~= v)
  139. end
  140. log.info("nvm.set",bchg,k,v,r,s)
  141. if bchg then
  142. para[k] = v
  143. save(s or s==nil)
  144. if r then sys.publish("PARA_CHANGED_IND",k,v,r) end
  145. end
  146. return true
  147. end
  148. --- 设置某个参数的值
  149. -- @param k ,string类型,参数的名字
  150. -- @param kk, string类型,参数的值
  151. -- @param v,可以是任意类型,参数的新值
  152. -- @param r,设置原因,只有传入了非nil的有效参数,并且v值和旧值相比发生了改变,才会产生一个PARA_CHANGED_IND消息
  153. -- @param s,是否立即写入到文件系统中,false不写入,其余的都写入
  154. -- @return bool或者nil,成功返回true,失败返回nil
  155. -- @usage nvm.set("name","Luat"),参数name赋值为Luat,立即写入文件系统
  156. -- @usage nvm.set("age",12,"SVR"),参数age赋值为12,立即写入文件系统,如果旧值不是12,会产生一个PARA_CHANGED_IND消息
  157. -- @usage nvm.set("class","Class2",nil,false),参数class赋值为Class2,不写入文件系统
  158. -- @usage nvm.set("score",{chinese=100,math=99,english=98}),参数score赋值为{chinese=100,math=99,english=98},立即写入文件系统
  159. function sett(k,kk,v,r,s)
  160. para[k][kk] = v
  161. save(s or s==nil)
  162. if r then sys.publish("TPARA_CHANGED_IND",k,kk,v,r) end
  163. return true
  164. end
  165. --[[
  166. 函数名:flush
  167. 功能 :把参数从内存写到文件中
  168. 参数 :无
  169. 返回值:无
  170. ]]
  171. function flush()
  172. save(true)
  173. end
  174. --[[
  175. 函数名:get
  176. 功能 :读取参数值
  177. 参数 :
  178. k:参数名
  179. 返回值:参数值
  180. ]]
  181. function get(k)
  182. if type(para[k]) == "table" then
  183. local tmp = {}
  184. for kk,v in pairs(para[k]) do
  185. tmp[kk] = v
  186. end
  187. return tmp
  188. else
  189. return para[k]
  190. end
  191. end
  192. --[[
  193. 函数名:gett
  194. 功能 :读取table类型的参数中的某一项的值
  195. 参数 :
  196. k:table参数名
  197. kk:table参数中的键值
  198. 返回值:参数值
  199. ]]
  200. function gett(k,kk)
  201. return para[k][kk]
  202. end
  203. --[[
  204. 函数名:init
  205. 功能 :初始化参数存储模块
  206. 参数 :
  207. dftcfgfile:默认配置文件
  208. 返回值:无
  209. ]]
  210. function init(dftcfgfile)
  211. local f
  212. f,libdftconfig = pcall(require,string.match(dftcfgfile,"(.+)%.lua"))
  213. configname,econfigname = "/lua/"..dftcfgfile,"/lua/"..dftcfgfile.."e"
  214. --初始化配置文件,从文件中把参数读取到内存中
  215. load()
  216. end