Closed RipperDrone closed 6 years ago
What firmware do you have on your RX?
Also, providing information about the versions, and a config diff
, like you were asked to do when opening this pull request, will greatly improve the chances of anything being done about your rant.
No intention to make it understood as a rant / see smilie in title.
I didn't provide all the details since I thought it might be a general issue (also mentioned in some other issue reports before) that the latest lua script still does not cover all the new timings of BFf3.4+ regarding FPORT protocol.
Anyway, here's the details you asked for:
@RipperDrone: For some reason I get a 404 when trying to open your diff. Can you try 3.5.0-RC1? betaflight/betaflight#6397 disables sending of the per-ESC telemetry data, reducing the bandwidth going through telemetry.
Diff link updated. Will test 3.5RC1 next...
mixed results:
Quad1 = OBF4 / HGLRC 20x20 stack: All telemetry fine with BF 3.4 stable Quad2 = DYSF4PRO
Flashed Quad2 back to BF3.4 - again script working but for 2 pages Rates and Motor PWM (no values shown, others are fine)...
Also here, no values on Lua with 3. 5,it was working with 3.3 and 3.4 TOO. RXSR with stock eu firmware and Fortini Is there something I should check on cli parameters?
must have to do with altered tele frames + timings...?
With 3.5.0 RC1 i stopped getting "sensor lost" all the time, but as soon as i switch to the telemetry page with the lua script i get "sensor lost" after a few seconds. I don't get any values on any pages of the lua script either. If i don't switch to the lua script everything is fine and telemetry works perfectly.
Tried 3.3.3 again just to test and it shows values on most of the lua pages( not PWM and VTX). I can change and save values, but if i do it too much it's "sensor lost" again. With 3.3.3 i have to wait for a few minutes for the sensor to come back. Rebooting FC/transmitter does nothing. "sensor lost" seconds after switching on.
I'm starting to suspect that the issue is with the R-XSR as it seems like most people with these issues are using it. Those using other receivers had issues with ESC telemetry enabled. Also @mikeller mentioned in #120 that the R-XSR has a 8051 microcontroller instead of the stm32 that the other frsky receivers are using and suggests that it might not be capable of handling the same number of sensors.
I might get a X4RSB to see if there's any difference.
Using SPRACINGF3 clone, R-XSR f.port 180615 beta firmware(tried all firmwares), Taranis q x7 with opentx 2.2.2 RC5.
R-XSR FPORT was spot on with BF3.4 (had all the probs you described before thqat) on many FCs like OBF4, OBF4SD. On DYSF4PRO, 2 telemetry pages over lua were not displaying values, all the others are ok. So since firmware version 180228, the R-XSR seemed to work almost by 100%. But then, with BF3.5RC1, none of the values / pages was working anymore.
It's true the R-XSR has a different MCU, and @mikeller has done a great job in adjusting frames frequency, timing and so forth. But it still seems there is some timing glitch in BF3.5 now...
@RipperDrone: Unfortunately, given we have got SmartPort and FPort, a number of different RX, all with a number of firmware versions, 'making it work' is more like 'herding cats'...
Can you try the 180615 version for r-XSR (under 'Beta firmware for FPort)?
Yes, I know. Will update the OBF4 where RX is easier to access. On my Airdancer with the DYSF4Pro, I would have to tear a lot of soldering and shrinks apart since the RX is buried deep underneath the center FC section which is tied down / constrained by short ESC cables and shrik wraps around the arms. Extremely painful, trying to avoid this. When on a promising track, I can test with other rigs, though...
It seems that the worst combination right now is the DYSF4PRO / R-XSR FPORT, where I don't get ANY of the lua telemetry pages populated with readout values. This rig has BLHeli32 individual ESCs which issue telemetry data. I have tied those 4 telemetry pins together and attached them to one UART.
Did some testing now, rather more frustrating than enlightening... :-)
Can there be anything around timings which is FC target specific? (since Lua with R-XSR works on many other FCs with BF 3.4). Timings of FC MCU itself which might be taken as a reference for choosing the lua / tele frame timings? Basic cycle setting 8kHz/8kHz on most of my F4 builds, MCU load around 10%... all R-XSR hardware-modded for inversion ('P inverted' pin connected)
to try flashing latest R-XSR FPORT beta firmware w/o rebuilding the whole quad: Is there a way to flash the RX over serial passthrough in the meantime so I could stay wired up as it is?
found something: Lua rate page has been empty in BF3.3 as well under certain circumstances... https://github.com/betaflight/betaflight-tx-lua-scripts/issues/117
@Guidus93 can you share your CLI diff (link to shared cloud doc to save space here would be Golden) and your FC type + wiring, please?
So far, we have at least DYSPROF4, SPRACINGF3 and an unknown FC NOT showing ANY values in lua script fields on Taranis X9D and QX7 (OTX 2.2.2RC5) with BF3.5RC1, however showing values at least in most fields / on most pages (e.g. except 2 pages) in BF3.4 (along with other glitches like sensor lost messages occasionally)...
Very weird. First of all, we need to find the differences btw 3.4 and 3.5RC1 to make BF3.5 work at least as well as BF3.4, then support work to eliminate the sensor lost messages etc.
Could it be PR https://github.com/betaflight/betaflight/pull/6300 causing the difference BF3.4 <-> 3.5 maybe?
Other PR's related to S.Port / telemetry IMHO: #6382, #6397. So we can narrow it down to these 3 PR's?
Changing FPORT_MIN_TELEMETRY_RESPONSE_DELAY_US to 100 in fport.c got rid of the "sensor lost" for me when opening the lua script. Still no values on any pages. Then i increased FPORT_TELEMETRY_MAX_CONSECUTIVE_TELEMETRY_FRAMES to 10 and now i get values on all pages except PWM and VTX(don't know if i'm supposed to have vtx values since i don't have a vtx.). Still a little slow. Takes a few seconds to load pages but i can change values and save them. Just flew 4 packs and did a little pid tuning with no problems other than one quick "sensor lost". Works for my setup but might not for other setups. I can see how getting this to work for every setup is like "herding cats".
Also compiled 3.5.0 with fport.c from 3.3 and that also works(still no PWM and VTX). I think it's because 3.3 didn't have the restriction on consecutive telemetry frames at all.
@klutvott123: FPORT_MIN_TELEMETRY_RESPONSE_DELAY_US
is something that was directly specified by FrSky, so making it shorter will potentially lead to problems with future versions of the RX firmware, since that's the spec they make it for.
FPORT_TELEMETRY_MAX_CONSECUTIVE_TELEMETRY_FRAMES
had to be introduced to prevent buffer overruns on r-XSR. This is superseded by the change introduced in betaflight/betaflight#6098 that allows the RX to signal to the flight controller when it's ready to get another telemetry frame. But this requires RX firmware support. Currently the r-XSR 'Beta firmware for FPort' supports this, and there is XSR firmware in the works for it.
@mikeller Thanks for explaining. I just reflashed my R-XSR with the latest 180615 beta fport firmware just to be sure and now it's working without changing FPORT_MIN_TELEMETRY_RESPONSE_DELAY_US and FPORT_TELEMETRY_MAX_CONSECUTIVE_TELEMETRY_FRAMES. I was sure i was on 180615 but must have had 180228 instead(have been switching between the two to test).
The PWM and VTX pages are still empty. Do you know what might be causing this?
Same issue here on OpenTX 2.2.2 and BF 3.4.1 with F.Port 180228:
Lost telemetry & slow update (though I can't compare, this is my first build...)
@RRAlex Try the 180615 beta firmware. That fixed it for me. Telemetry works and no more "sensor lost".
@klutvott123 Oh, I see, didn't realize there was a beta, will try that and give some feedbacks, thanks!
Same issue here on OpenTX 2.2.2, BF 3.5.0 and X4RSB with F.Port 171114 (last nonEU version). Some "sensor lost", slow update & empty PWM & VTX.
In https://github.com/betaflight/betaflight/blob/master/src/main/interface/msp.c line 1240:
case MSP_ADVANCED_CONFIG: sbufWriteU8(dst, gyroConfig()->gyro_sync_denom); sbufWriteU8(dst, pidConfig()->pid_process_denom); sbufWriteU8(dst, motorConfig()->dev.useUnsyncedPwm); sbufWriteU8(dst, motorConfig()->dev.motorPwmProtocol); sbufWriteU16(dst, motorConfig()->dev.motorPwmRate); sbufWriteU16(dst, motorConfig()->digitalIdleOffsetValue); sbufWriteU8(dst, gyroConfig()->gyro_use_32khz); sbufWriteU8(dst, motorConfig()->dev.motorPwmInversion); sbufWriteU8(dst, gyroConfig()->gyro_to_use); sbufWriteU8(dst, gyroConfig()->gyro_high_fsr); sbufWriteU8(dst, gyroConfig()->gyroMovementCalibrationThreshold); sbufWriteU16(dst, gyroConfig()->gyroCalibrationDuration); sbufWriteU16(dst, gyroConfig()->gyro_offset_yaw); sbufWriteU8(dst, gyroConfig()->checkOverflow);
The bottom 6 lines are new from 3.4. I tried commenting them out just to test and that got the PWM working again. I can't see why it's not working with the above code. The FC just sends all those bytes and the lua script uses the first 9. I tried sending the MSP_ADVANCED_CONFIG command in a terminal to see what exactly comes out but didn't have any luck with that.
@klutvott123 I can confirm, I went further and tried to comment each line one by one and it's the line sbufWriteU16(dst, gyroConfig()->gyroCalibrationDuration);
which cause the issue.
So, I did set gyro_calib_duration = 128
in the CLI and the PWM page was working again !
@atomiix I just set it to 128 too and it's working now. Thanks!
This has to be some kind of bug because i have something like this happening on the PID page too. Some combinations of pid gains just makes the page blank. Right now if i set the pitch I to 60 and roll I to 55 it stops working. Earlier i had a case where setting yaw I to 55 it stopped working. I could set it to 54 or 56 and all other values but not 55.
Same thing also happens when setting the d-term notch filter center frequency to 125 and the cutoff to 75.
@klutvott123 I had exactly the same problem when I was tuning my PIDs, that's what led me to try another value for gyro_calib_duration
It seems that under certain circumstances, F.Port frames are dropping packets.
I got the line elseif bit32.band(mspRemoteSeq + 1, 0x0F) ~= seq then
of the file src/SCRIPTS/BF/MSP/common.lua (line105) being called with the page PWM (which means packet drop).
It occures only on F.Port, I tried back with SBUS/SmartPort and it's working well.
But I'm not competent enough to investigate more on the F.Port protocol 😅
@atomiix: There are a number of places where telemetry frames can be dropped:
@mikeller I just read the f.port protocol documentation and did some experimenting. If i set any value on any lua script page to 125 or 126 it stops working. 126 is the FPORT_FRAME_MARKER 0x7E and 125 is the FPORT_ESCAPE_CHAR 0x7D in https://github.com/betaflight/betaflight/blob/master/src/main/rx/fport.c. This makes me believe the f.port bytestuffing isn't properly implemented somewhere.
https://github.com/betaflight/betaflight/blob/98616d469012e5287f35c9302bbea70d1e8b920d/src/main/telemetry/smartport.c#L274 This looks right to me so i assume the f.port frame is correct when sent to the receiver. Is there a chance that it's not properly "unstuffed" at the receiver side and not getting sent to the transmitter at all when the data contains 125 or 126?
Using betaflight 3.5, R-XSR with 180615 beta f.port firmware.
Did some more testing. I set my PIDs so that the PID page stopped working. I wrote a python script that sends the MSP_PID command to the FC and prints the received data. The combination of pid gains that makes it stop working has a CRC of 125(FPORT_ESCAPE_CHAR 0x7D). Now i really think this is a bytestuffing issue.
Maybe it's in f.port firmware since @atomiix says it's working with sbus/s.port. Can't test it myself since i have only one uart. Just ordered new FC. Will test with sbus/s.port then.
Good find, @klutvott123!
On the flight controller side, FPort uses the same byte stuffing that SmartPort uses: https://github.com/betaflight/betaflight/blob/98616d469012e5287f35c9302bbea70d1e8b920d/src/main/rx/fport.c#L237-L239
But where I can see a potential difference is that, because with FPort, the frame delimiters are used for RC control and telemetry frames on the same connection, any occurrence of a stray delimiter would have way worse consequences than on SmartPort, where the RC control is unaffected.
My suspicion is that the lua API that we are using to inject the MSP data expects the data to be byte stuffed when it is sent, or is simply buggy and does not do the byte stuffing correctly.
@mikeller Some more details which i should have added: When setting a value in the lua script to 125 or 126 and saving, it get's sent correctly to the FC. It's when the script tries to update the page again that it fails and all fields are blank. When i check the configurator i can see the value that i just set in the script. So it's working when sending data from transmitter but not when receiving.
You may be right about the lua API. I just had a quick look at some of the opentx s.port code and it looks like it's unstuffed correctly. Will investigate some more.
Thanks @klutvott123 for looking into this. Shout out if you need help.
+1
@mikeller So i have done some testing and made some observations.
I soldered a UART module directly to the f.port pad on my FC and printed the data while the lua script was sending the pid command 112. I set my yaw I gain to 125 so that the frame had to be bytestuffed. The data for the pids is split up into four frames, is bytestuffed correctly and the CRCs are correct so no problems there. Just had to make sure.
Then i modified the function that processes frsky telemetry data in opentx to check for the byte sequence i'm interested in and print that frame directly to the transmitter lcd, bypassing lua completely. Works fine for the frames that aren't bytestuffed but for the bytestuffed frames i get nothing. This makes me think that the bytestuffed frames aren't received at all.
I had my transmitter turned on for a while and suddenly got a "sensor lost". Looked at the telemetry screen and saw the fuel sensor blinking with the value 124. It was gone until the fuel sensor reached 127. So the sensor got lost when the fuel sensor frames were bytestuffed.
I also think i know why the lua pages are updating so slowly. For uplink data frames the CRC is calculated from all the bytes in the frame. APPID bytes included where the first byte is the frameID that isn't the same everytime. Sometimes the frameID causes the CRC to become 125 or 126 and then the frame has to be bytestuffed. The lua script then has to request the data again and again until none of the data or CRCs of the frames are bytestuffed.
Can also confirm that s.port works correctly.
Wow, @klutvott123 - you have finally found the explanation for what has been plaguing so many users for a long time. Wonderful work, thank you! Now it seems about how to do bytestuffing / destuffing the correct way, without the influence of channel values 125, 126...
Will this have to be done with FrSky devs, or is it something on the BF code side?
@klutvott123 awesome!
@RipperDrone I'm not 100% sure yet. I'll have to do some more investigating.
Just did some testing with https://github.com/betaflight/betaflight/blob/9ed2914489fc12e60bcb1d8af1bdb65677518aa2/src/main/telemetry/smartport.c#L274 where i commented out the if else statement that takes care of bytestuffing on the FC side. Then i added serialWrite(port, c); below so that no bytestuffing is done on the data sent from FC to RX. Still using my pids for testing this and when i set any value to 126 it works. I get the correct sequence of bytes in opentx. The byte that comes after the pid value that is set to 126 is also shown correctly. Still doesn't work with 125.
@mikeller is there a chance that the f.port firmware expects to do the bytestuffing itself? The length of an uplink dataframe is 8 bytes according to the documentation. When bytestuffing is done on the FC side the frame length exceeds those 8 bytes.
@klutvott123: To my understanding of the FPort spec, byte-stuffing should be done by the sender. But this could be a bug, or an inaccuracy of the spec.
In the case of it being a bug, it could also be limited to the firmware for certain RX models only.
I will try to get an answer from FrSky on this.
@mikeller Is there anybody from FrSky active on BF GitHub so we can tie that rep/dev into the coding himself/herself? Reverse engineering the protocol details by @klutvott123 might be a tedious task to do...
Sry for being too unexperienced to really comment in a knowledgeable and helpful way, but what I understood so far is there seems to be a mismatch btw sender and receiver regarding bytestuffing logics. Actual values of 125 (0x7D) seem to be interpreted wrongly as a bytestuffing yes/no flag, so the value itself is not transmitted properly anymore. I skimmed the telemetry.c code for occurrences of the FSS_DLE (=0x7D) flag and found several places where the value itself is still transmitted, but e.g. in this one, it isn't:
Anyway, we desperately need a FrSky dev here to look into the receiver side / their protocol details to resolve it quickly... :-/
Or is it even on the OpenTX side where frames / bytestuffing are getting messed up?
@RipperDrone That code is for receiving s.port/f.port data and it works correctly. In betaflight f.port is implemented as it says it should be in the f.port documentation. The only thing is that in the documentation it says bytestuffing should be done by "sender". Sender could be interpreted both as FC and RX as they are both senders.
Heres some example data from my FC f.port pad:
126 8 1 48 53 0 112 112 0 0 176 126 <-- MSP_PID 112 from lua script
8 129 50 23 15 46 45 25 50 119 <-- First frame sent by FC containing PIDs
126 25 0 228 0 31 248 196 7 12 96 0 3 24 0 0 0 0 0 0 0 0 0 0 0 0 84 66 126
126 8 1 0 0 0 0 0 0 0 246 126
126 25 0 228 0 31 248 196 7 12 96 0 3 24 0 0 0 0 0 0 0 0 0 0 0 0 84 66 126
126 8 1 16 0 0 0 0 0 0 230 126
8 129 50 8 51 27 40 125 93 0 72 <--Second frame sent by FC. 125 is yaw I gain. Here it's bytestuffed as 125 93
Got it. So your concern is we might have a duplicate byte stuffing situation, done both by FC and RX, so frame format is busted since only one stuffed byte is being removed by OpenTX / RC? Exciting...
@RipperDrone Yes, that's what i'm leaning towards right now. With bytestuffing disabled in betaflight and sending frames containing the value 126 it looks like the frame is bytestuffed by the RX since it arrives in opentx but not when sending 125. Maybe some incomplete debug code left behind. I don't know. Won't be pointing fingers just yet. If only i could have a look at frskys f.port code, but i doubt that's ever going to happen.
opentx will just keep unstuffing as long as the defined packet size isn't exceeded. Here's the function that does it in opentx if you want to check it out https://github.com/opentx/opentx/blob/17b4aa24668bc4b223dd0613a48d2cc050e39358/radio/src/telemetry/frsky.cpp#L39 . The data sent to this function is popped straight from the telemetry FIFO.
I think i can confirm that there's bytestuffing going on in frskys f.port firmware. Set my yaw I gain to 126. The databytes sent from FC to RX are:
51 27 40 126
The databytes that comes out in opentx before any processing is:
51 27 40 125 94
This is with the codechanges i described above that disables any bytestuffing of data to be sent in betaflight. Still no idea why it doesn't do it when the frame contains 125.
I love it, feel a work around is around the corner, no pun intended 😁
@klutvott123: I did a couple of tests with r-XSR and XSR, and they both seem to be handling this in the same way, which is weird since they do not share the codebase, making it unlikely to be an unintentional bug.
Can you run the tests above to see what 125 comes out as?
@RipperDrone: Unfortunately most of the FrSky engineers do not speak English, making communicating with them only possible via proxy. But I am working my contacts to try and get them to look into this, and comment on it. Also, there are different teams responsible for the firmwares for XSR, r-XSR, and R9, making this even harder.
All kinds of glitches:
Taranis FW is 2.2.2 RC5, lua scripts running somewhat more stable on BF3.4 than on 3.5... :-/
Issue has been fixed for R-XSR by FrSky firmware update plus commit / PR to BF code, but ist's not yet fixed for other receivers like XSR, R9M...