mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-18 22:05:17 +03:00
Added frame re-assembly to LUA script
This commit is contained in:
parent
e37594981f
commit
160bfaf907
1 changed files with 115 additions and 7 deletions
|
@ -17,18 +17,21 @@ REPLY_FRAME_ID = 0x32
|
||||||
-- Sequence number for next MSP/SPORT packet
|
-- Sequence number for next MSP/SPORT packet
|
||||||
sportMspSeq = 0
|
sportMspSeq = 0
|
||||||
|
|
||||||
|
mspRxBuf = {}
|
||||||
|
mspRxIdx = 1
|
||||||
|
mspRxCRC = 0
|
||||||
|
mspStarted = false
|
||||||
|
|
||||||
-- Stats
|
-- Stats
|
||||||
requestsSent = 0
|
requestsSent = 0
|
||||||
repliesReceived = 0
|
repliesReceived = 0
|
||||||
|
|
||||||
lastReqTS = 0
|
mspReceivedReply_cnt = 0
|
||||||
|
mspReceivedReply_cnt1 = 0
|
||||||
|
mspReceivedReply_cnt2 = 0
|
||||||
|
mspReceivedReply_cnt3 = 0
|
||||||
|
|
||||||
local function pollReply()
|
lastReqTS = 0
|
||||||
local sensorId, frameId, dataId, value = sportTelemetryPop()
|
|
||||||
if sensorId == REMOTE_SENSOR_ID and frameId == REPLY_FRAME_ID then
|
|
||||||
repliesReceived = repliesReceived + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function mspSendRequest(cmd)
|
local function mspSendRequest(cmd)
|
||||||
|
|
||||||
|
@ -48,6 +51,95 @@ local function mspSendRequest(cmd)
|
||||||
return sportTelemetryPush(LOCAL_SENSOR_ID, REQUEST_FRAME_ID, dataId, value)
|
return sportTelemetryPush(LOCAL_SENSOR_ID, REQUEST_FRAME_ID, dataId, value)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function mspReceivedReply(payload)
|
||||||
|
|
||||||
|
-- TODO: MSP checksum checking
|
||||||
|
|
||||||
|
mspReceivedReply_cnt = mspReceivedReply_cnt + 1
|
||||||
|
|
||||||
|
local idx = 1
|
||||||
|
local head = payload[idx]
|
||||||
|
local err_flag = (bit32.band(head,0x20) ~= 0)
|
||||||
|
idx = idx + 1
|
||||||
|
|
||||||
|
if err_flag then
|
||||||
|
-- error flag set
|
||||||
|
mspStarted = false
|
||||||
|
|
||||||
|
mspReceivedReply_cnt1 = mspReceivedReply_cnt1 + 1
|
||||||
|
|
||||||
|
-- return error
|
||||||
|
-- CRC checking missing
|
||||||
|
|
||||||
|
--return bit32.band(payload[idx],0xFF)
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local start = (bit32.band(head,0x10) ~= 0)
|
||||||
|
local seq = bit32.band(head,0x0F)
|
||||||
|
|
||||||
|
if start then
|
||||||
|
-- start flag set
|
||||||
|
mspRxIdx = 1
|
||||||
|
mspRxBuf = {}
|
||||||
|
|
||||||
|
mspRxSize = payload[idx]
|
||||||
|
mspRxCRC = mspRxSize
|
||||||
|
idx = idx + 1
|
||||||
|
mspStarted = true
|
||||||
|
|
||||||
|
mspReceivedReply_cnt2 = mspReceivedReply_cnt2 + 1
|
||||||
|
|
||||||
|
elseif not mspStarted then
|
||||||
|
mspReceivedReply_cnt3 = mspReceivedReply_cnt3 + 1
|
||||||
|
return nil
|
||||||
|
-- TODO: add sequence number checking
|
||||||
|
-- elseif ...
|
||||||
|
end
|
||||||
|
|
||||||
|
while (idx <= 6) and (mspRxIdx <= mspRxSize) do
|
||||||
|
mspRxBuf[mspRxIdx] = payload[idx]
|
||||||
|
mspRxCRC = bit32.bxor(mspRxCRC,payload[idx])
|
||||||
|
mspRxIdx = mspRxIdx + 1
|
||||||
|
idx = idx + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if idx > 6 then
|
||||||
|
lastRxSeq = seq
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- check CRC
|
||||||
|
if mspRxCRC ~= payload[idx] then
|
||||||
|
mspStarted = false
|
||||||
|
end
|
||||||
|
|
||||||
|
repliesReceived = repliesReceived + 1
|
||||||
|
mspStarted = false
|
||||||
|
return mspRxBuf
|
||||||
|
end
|
||||||
|
|
||||||
|
local function pollReply()
|
||||||
|
local sensorId, frameId, dataId, value = sportTelemetryPop()
|
||||||
|
if sensorId == REMOTE_SENSOR_ID and frameId == REPLY_FRAME_ID then
|
||||||
|
|
||||||
|
local payload = {}
|
||||||
|
payload[1] = bit32.band(dataId,0xFF)
|
||||||
|
dataId = bit32.rshift(dataId,8)
|
||||||
|
payload[2] = bit32.band(dataId,0xFF)
|
||||||
|
|
||||||
|
payload[3] = bit32.band(value,0xFF)
|
||||||
|
value = bit32.rshift(value,8)
|
||||||
|
payload[4] = bit32.band(value,0xFF)
|
||||||
|
value = bit32.rshift(value,8)
|
||||||
|
payload[5] = bit32.band(value,0xFF)
|
||||||
|
value = bit32.rshift(value,8)
|
||||||
|
payload[6] = bit32.band(value,0xFF)
|
||||||
|
|
||||||
|
return mspReceivedReply(payload)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function run(event)
|
local function run(event)
|
||||||
|
|
||||||
local now = getTime()
|
local now = getTime()
|
||||||
|
@ -55,6 +147,10 @@ local function run(event)
|
||||||
if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
|
if event == EVT_MINUS_FIRST or event == EVT_ROT_LEFT or event == EVT_MINUS_REPT then
|
||||||
requestsSent = 0
|
requestsSent = 0
|
||||||
repliesReceived = 0
|
repliesReceived = 0
|
||||||
|
mspReceivedReply_cnt = 0
|
||||||
|
mspReceivedReply_cnt1 = 0
|
||||||
|
mspReceivedReply_cnt2 = 0
|
||||||
|
mspReceivedReply_cnt3 = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
lcd.clear()
|
lcd.clear()
|
||||||
|
@ -65,6 +161,18 @@ local function run(event)
|
||||||
lcd.drawText(1,21,"Replies:",0)
|
lcd.drawText(1,21,"Replies:",0)
|
||||||
lcd.drawNumber(60,21,repliesReceived)
|
lcd.drawNumber(60,21,repliesReceived)
|
||||||
|
|
||||||
|
lcd.drawText(1,31,"cnt:",0)
|
||||||
|
lcd.drawNumber(30,31,mspReceivedReply_cnt)
|
||||||
|
|
||||||
|
lcd.drawText(1,41,"cnt1:",0)
|
||||||
|
lcd.drawNumber(30,41,mspReceivedReply_cnt1)
|
||||||
|
|
||||||
|
lcd.drawText(71,31,"cnt2:",0)
|
||||||
|
lcd.drawNumber(100,31,mspReceivedReply_cnt2)
|
||||||
|
|
||||||
|
lcd.drawText(71,41,"cnt3:",0)
|
||||||
|
lcd.drawNumber(100,41,mspReceivedReply_cnt3)
|
||||||
|
|
||||||
-- last request is at least 2s old
|
-- last request is at least 2s old
|
||||||
if lastReqTS + 200 <= now then
|
if lastReqTS + 200 <= now then
|
||||||
mspSendRequest(117) -- MSP_PIDNAMES
|
mspSendRequest(117) -- MSP_PIDNAMES
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue