工程提交

This commit is contained in:
2026-03-31 15:46:04 +08:00
parent 75f512a5b4
commit da4e944bca
2841 changed files with 4822938 additions and 1 deletions

184
4G/code/lib/patch.lua Normal file
View File

@@ -0,0 +1,184 @@
--- 模块功能Lua补丁
-- @module patch
-- @author openLuat
-- @license MIT
-- @copyright openLuat
-- @release 2017.10.21
require"pm"
module(..., package.seeall)
--[[
模块名称Lua自带接口补丁
模块功能补丁某些Lua自带的接口规避调用异常时死机
模块最后修改时间2017.02.14
]]
--保存Lua自带的os.time接口
local oldostime = os.time
--[[
函数名safeostime
功能 封装自定义的os.time接口
参数
t日期表如果没有传入使用系统当前时间
返回值t时间距离1970年1月1日0时0分0秒所经过的秒数
]]
function safeostime(t)
return oldostime(t) or 0
end
--Lua自带的os.time接口指向自定义的safeostime接口
os.time = safeostime
--保存Lua自带的os.date接口
local oldosdate = os.date
--[[
函数名safeosdate
功能 封装自定义的os.date接口
参数
s输出格式
t距离1970年1月1日0时0分0秒所经过的秒数
返回值参考Lua自带的os.date接口说明
]]
function safeosdate(s, t)
if s == "*t" then
return oldosdate(s, t) or {year = 2012,
month = 12,
day = 11,
hour = 10,
min = 9,
sec = 0}
else
return oldosdate(s, t)
end
end
--Lua自带的os.date接口指向自定义的safeosdate接口
os.date = safeosdate
-- 对coroutine.resume加一个修饰器用于捕获协程错误
local rawcoresume = coroutine.resume
coroutine.resume = function(...)
local arg = { ... }
function wrapper(co,...)
local arg = { ... }
if not arg[1] then
local traceBack = debug.traceback(co) or "empty"
traceBack = (traceBack and traceBack~="") and ((arg[2] or "").."\r\n"..traceBack) or (arg[2] or "")
log.error("coroutine.resume",traceBack)
if errDump and type(errDump.appendErr)=="function" then
errDump.appendErr(traceBack)
end
if _G.COROUTINE_ERROR_RESTART then rtos.restart() end
end
return unpack(arg)
end
return wrapper(arg[1],rawcoresume(...))
end
os.clockms = function() return rtos.tick()/16 end
--保存Lua自带的json.decode接口
if json and json.decode then oldjsondecode = json.decode end
--- 封装自定义的json.decode接口
-- @string s json格式的字符串
-- @return table,第一个返回值为解析json字符串后的table
-- @return boole,第二个返回值为解析结果(true表示成功false失败)
-- @return string,第三个返回值可选只有第二个返回值为false时才有意义表示出错信息
local function safeJsonDecode(s)
local result, info = pcall(oldjsondecode, s)
if result then
return info, true
else
return {}, false, info
end
end
--Lua自带的json.decode接口指向自定义的safeJsonDecode接口
if json and json.decode then json.decode = safeJsonDecode end
local oldUartWrite = uart.write
uart.write = function(...)
pm.wake("lib.patch.uart.write")
local result = oldUartWrite(...)
pm.sleep("lib.patch.uart.write")
return result
end
if i2c and i2c.write then
local oldI2cWrite = i2c.write
i2c.write = function(...)
pm.wake("lib.patch.i2c.write")
local result = oldI2cWrite(...)
pm.sleep("lib.patch.i2c.write")
return result
end
end
if i2c and i2c.send then
local oldI2cSend = i2c.send
i2c.send = function(...)
pm.wake("lib.patch.i2c.send")
local result = oldI2cSend(...)
pm.sleep("lib.patch.i2c.send")
return result
end
end
if spi and spi.send then
oldSpiSend = spi.send
spi.send = function(...)
pm.wake("lib.patch.spi.send")
local result = oldSpiSend(...)
pm.sleep("lib.patch.spi.send")
return result
end
end
if spi and spi.send_recv then
oldSpiSendRecv = spi.send_recv
spi.send_recv = function(...)
pm.wake("lib.patch.spi.send_recv")
local result = oldSpiSendRecv(...)
pm.sleep("lib.patch.spi.send_recv")
return result
end
end
if disp and disp.sleep then
oldDispSleep = disp.sleep
disp.sleep = function(...)
pm.wake("lib.patch.disp.sleep")
oldDispSleep(...)
pm.sleep("lib.patch.disp.sleep")
end
end
if io and io.mount then
oldIoMount = io.mount
io.mount = function (...)
pm.wake("lib.patch.io.mount")
local result = oldIoMount(...)
pm.sleep("lib.patch.io.mount")
return result
end
end
local pmdInited
if pmd and pmd.init then
oldPmdInit = pmd.init
pmd.init = function (...)
if not pmdInited then pmdInited = true end
local result = oldPmdInit(...)
return result
end
end
pmd.libScriptInit = function()
if not pmdInited then pmd.init({}) end
end