GithubHelp home page GithubHelp logo

fpv-wtf / msp-osd Goto Github PK

View Code? Open in Web Editor NEW
212.0 22.0 30.0 17.48 MB

MSP DisplayPort OSD

License: GNU General Public License v3.0

C 94.16% Shell 0.09% Makefile 0.15% C++ 5.59%
ardupilot arduplane betaflight displayport dji fpv inav msp osd

msp-osd's Introduction

MSP-OSD - Full OSD / Displayport OSD

This package gives you support for full flight controller driven OSD in line with those on analog + other HD systems.

Technically - it takes MSP DisplayPort (so-called "canvas" although this is a misnomer as there is another Betaflight "canvas" mode for Pixel OSDs) messages through UDP and renders them to a framebuffer overlaid under the DJI dji_glasses menu system.

A custom font.bin package may be placed on the root of the goggles SD card, at which point it will override the font in /blackbox/font.bin.

SFML (PC/Mac development) and DJI Goggles viewports are available, as well as a mux for the Air Unit / Vista, which creates a pty and provides filtered MSP access, and reroutes DisplayPort messages to UDP.

Setup and Installation

Easy Installation

  • Install WTFOS from https://fpv.wtf. WTFOS must be installed on both the goggles and each AU/Vista.
  • Install the msp-osd package on each device using WTFOS.
  • Reboot.

Flight Controller Setup

  • Ensure that the correct UART is set to use MSP
  • Enable MSP DisplayPort

Betaflight - Since 4.4

Betaflight 4.4 has added native support for OSD in HD aspect ratio.

Configure With Preset

There is a preset available: "OSD for Fpv.wtf, DJI O3, Avatar HD", once applied you can then skip ahead to configuring in the OSD tab.

Configure Manually

Or to configure manually, first enter the following commands in the CLI tab:

set osd_displayport_device = MSP
set vcd_video_system = HD
save

And then in the Ports tab, select the peripheral "VTX (MSP + DisplayPort)" for the UART your Vista/Air unit is connected to.

Ports Tab Setting

Afterwards, you can configure the OSD elements as normal in the OSD tab.

Troubleshooting wrong grid size in BF 4.4 Configurator

It is recommended to enable compressed transmission with BF 4.4; it will soon become the default. It removes/avoids ordering issues between FC/AU/Goggles bootup - the AU has to tell the FC the grid size it supports.

If you don't want to / can't do this - try rebooting your goggles, then reboot your AU.

Betaflight - 4.3 or Before

We have a configurator preset available - "FPV.WTF MSP-OSD", just be sure to pick the UART your Vista/Air unit is connected to.

Or to configure manually

On Betaflight, this is done using the following commands in the CLI tab:

set osd_displayport_device = MSP
set displayport_msp_serial = <ConfiguratorUART - 1>
set vcd_video_system = PAL
save

Eg.: If the Betaflight Configurator says your DJI VTx is attached to UART2, the value for <ConfiguratorUART - 1> is 1 - so you would use set displayport_msp_serial = 1. Test if the value is correct by typing save and after the reboot get displayport_msp_serial This command should return the value you set it to. If it returns -1 (and that was not the value you set) then the value was not correct.

For Betaflight - ensure you set the Video Format to PAL or Auto in the OSD tab - otherwise you don't get access to the whole OSD area. Note that currently BF Configurator hides these options once you switch to MSP for OSD; the last command above should have done this for you.

Softserial

We don't recommend connecting via soft serial; results have been poor - it gives slow/laggy/inconsistent behaviour. But some users have reported it being usable, so if for whatever reason this is your only option, read on.

If you have connected the Vista/Airunit to a softserial port run the serial command to list serial ports Use the value after serial with set displayport_msp_serial but do not subtract 1 from the value. E.g.:

# serial
serial 20 1 115200 57600 0 115200
serial 0 64 115200 57600 0 115200
serial 1 0 115200 57600 0 115200
serial 30 1 115200 57600 0 115200
# set displayport_msp_serial = 30

FakeHD

Betaflight's (before 4.4) OSD supports a 30 * 16 Grid, which looks large/blocky when displayed in the DJI Goggles.

For versions of Betaflight before 4.4 (or other FC firmwares without HD support), as a workaround, we have a mode called "FakeHD". It chops up the OSD into sections and positions them evenly around an HD grid (with gaps between) - the way this is done is configurable, explained below. This then allows the use of smaller fonts - so it looks nicer/more in keeping with the built in Goggles OSD (but you still only have 30 columns / 16 rows to configure.... and you have the gaps to contend with).

A diagram to help...

Before (in Configurator) After (in Goggles)
FakeHD Before FakeHD After
To configure/enable:

Visit https://fpv.wtf/package/fpv-wtf/msp-osd with your goggles connected, and check "Fake HD"

Optionally, place custom fonts in the root of your sd card, using the names font_bf_hd.png

Configuration of the grid is also possible; see below.

No air unit/vista config is required.

Menu Switching - Getting rid of gaps when displaying Menu / Post Flight Stats + displaying centered:

In order to have menus (accessible in Betaflight using stick commands) and post-flight stats appear in the center of the screen while using FakeHD, rather than having gaps + looking broken, you should set up menu switching.

FakeHD can use the presence/absence of a character in the OSD as a switch to indicate when you are in regular OSD mode or in the menu/stats and switch to centering temporarily when needed.

By default, the Throttle Position icon is used (character 4) - but you can set any character you want. It needs to be something that doesn't flash or change in the regular OSD, and ideally (but not essential) something that is never in the menu/post flight stats. The icons next to various elements are obvious choices here. You can set this using the fakehd_menu_switch configuration parameter.

Betaflight has a list here: https://github.com/betaflight/betaflight/blob/master/docs/osd.md

If you want to use FakeHD with some other Flight Controller, you will need to find an appropriate icon. (Let us know - we can include the information here).

Finally, if you don't have anything in your OSD that works for menu switching, you can hide the menu switching character and the subsequent 5 characters, allowing you to add the Throttle Position element but not have to see it on screen. This is enabled by setting fakehd_hide_menu_switch to true.

Notes:

  • Because of this switching feature, if you change to a different quad or OSD config (specifically the switch element is in a different place), FakeHD will center - you will need to reboot your Goggles to get it to recognise the switch element in a different location.

  • Also because of this switching, if you are editing OSD in the configurator with the goggles on to preview and you move the switching element around, it will cause the gaps to be disabled and everything to center. The new location of the switching element will be found next time you reboot the goggles and it'll work as normal.

I don't want gaps at all...

Set config fakehd_lock_center to true and the center locking used for the menu / post flight stats will be enabled permanently (ie: you fly with it as well) - basically it places your 30 x 16 SD grid into the middle of an HD grid, there's never any gaps - see diagram below + compare to diagrams above.

After/Centered (in Goggles) fakehd_lock_center
After / Centered
Customising the default FakeHD grid.

By default, FakeHD positions your SD grid into the HD grid as per the before/after diagram above.

If this doesn't work for you for whatever reason, some customisation is available. It's necessarily a little complicated.

Each row can be set to one of:

Code Description
L Left aligned, the SD row occupies cell 1-30, no gaps
C Center aligned, the SD row occupies cell 16-45, no gaps
R Right aligned, , the SD row occupies cell 31-60, no gaps
W Split A - Row is split in 3, the FakeHD default, filling cells 1-10, 26-35, 51-60
T Split B - Row is split in 2, touching the sides - filling cells 1-15 + 46-60
F Split C - Row is split in 2 and away from the sides - filling cells 11-25 + 36-50
D DJI Special - Row is centered but pushed a little left; used to posiution the bottom row between the existing DJI OSD elements

Columns

And then the columns as a whole can be set to one of:

Code Description
T Top aligned, OSD occupies rows 1-16
M Center aligned, OSD occupies cells 4-19, no gaps
B Bottom aligned, , the OSD occupies rows 7-22
S Split - FakeHD default - split in 3, OSD occupies rows 1 - 5, 9 - 13, 17-22

Using the default row config; here's what they all look like:

T M B S
T M B S
To configure rows

Rows config accepts a 16 character long string; each character configuring it's corresponding row. The default FakeHD config would be set like this:

fakehd_rows = WWWWWWCCWWWWWWWD

The characters are case sensitive, but the configurator will reject invalid characters.

To configure columns

Columns accepts a single character configuring how the whole grid is aligned. The default would be set like this:

fakehd_columns = S

The characters are case sensitive, but the configurator will reject invalid characters.

INAV

Select "HDZero VTx" or "MSP Display Port" (on newer INAV versions) as the Peripheral. Next, select "HD" in the OSD tab if you'd like to use the HD Canvas.

If the iNav OSD appears garbled at first, try entering the iNav menus using the RC sticks, and then exiting the menus. This will force INAV to switch into HD mode a second time.

It is recommended to enable compressed transmission with INAV to avoid issues with the display corrupting - the artifical horizon is the most common element to show this.

Ardupilot

Please install an Ardupilot Custom or Nightly build from after 8/29/2022 for full functionality. There was one critical bug fix for MSP telemetry not passing through a DisplayPort serial port. Additionally, there were several feature additions including HD support after the last 4.2 release.

Settings:

SERIALx_PROTOCOL = 42
OSD_TYPE = 5

If you wish to use a Betaflight font instead of an Ardupilot font, you can also set ``MSP_OPTIONS = 4` to allow the use of a Betaflight font.

More info: https://ardupilot.org/plane/docs/common-msp-osd-overview-4.2.html#dji-goggles-with-wtf-osd-firmware

KISS Ultra

Select MSP on serial and select DJI WTF as canvas dialect. That's it.

QUICKSILVER

Configure the UART under Digital VTX - see https://docs.bosshobby.com/Configuring-Quicksilver/#setup

Fonts

We bundle in default fonts for Betaflight, Ardupilot, INAV, Quicksilver, and KISS ULTRA (font is SNEAKYFPV's Europa - thanks to SNEAKYFPV for allowing us to use these - https://sites.google.com/view/sneaky-fpv/home). Since 0.12 we use a PNG font format, the same as Walksnail. Default fonts can be viewed here. You may also upload your own fonts to the SD card.

  • Download a font package. See below for known community fonts.
  • Rename the files for your desired font to font_<fc variant>.png - see table below for examples or take a look at the fonts directory for a template for how the file names should look. (If your FC firmware is not listed below, use the generic filenames)
  • Place these two PNG files on the root of your Goggles SD card.
  • Reboot.

FC Specific Font File Names

Flight controller SD HD
Betaflight font_btfl.png font_btfl_hd.png
INAV font_inav.png font_inav_hd.png
Ardupilot font_ardu.png font_ardu_hd.png
KISS Ultra font_ultr.png font_ulta_hd.png
QUICKSILVER font_quic.png font_quic_hd.png
Generic/Fallback font.png font_hd.png

Airside VTx (AU/Vista) which have a very old version of msp-osd on, as well as flight controllers which do not respond to the Variant request, like old Ardupilot versions, will fall back to the Generic/Fallback font.

You can also add fonts for firmwares not in this list; using the generic filename, or put the MSP identifier in (lower case it) the filename - font_<fc_variant>.png / font_<fc_variant>_hd.png

Suggested Third Party Fonts

Modify / Move original DJI OSD elements

You can now modify the elements present in the original DJI OSD. These include for example : transmission speed, latency, channel used, googles battery, sd card icon and default timer.

Elements position, visibility, font and icons can be modified by editing the internal googles files. This is possible by connecting to the googles using ADB. You can even preview changes using a Python script!

This is not a trivial thing for everyone to do, the full tutorial can be found here.

Compressed Transmission

As of 0.7.0, a new option, compress_osd, has been added to the air side process.

If this is set to "true", then the entire character buffer will be sent using LZ4 compression at the rate defined in osd_update_rate_hz, instead of sending raw MSP messages over the air.

When enabled, this should fix INAV delta update related issues as well as provide better link stability.

To enable:

Visit https://fpv.wtf/package/fpv-wtf/msp-osd with your Air Unit / Vista plugged in to edit package options.

This option is enabled by default as of 0.10.0, however, if you upgraded from an older version, your configuration will need to be updated using the configurator.

If you continue to have issues with especially INAV character corruption, it is likely your serial link is saturated. Check that the "Custom OSD" option in your DJI goggles menus is set to disabled , and also try out the cache_serial option.

Configuration options

Configuration options can be set using the WTFOS Configurator.

Visit https://fpv.wtf/package/fpv-wtf/msp-osd with your Goggles or Air Unit plugged in to edit options.

Current available options (Goggles):

Option Description Type Default
show_waiting enables or disables WAITING FOR OSD message true/false true
show_au_data enables AU data (temp/voltage) overlay on the right true/false false
rec_enabled enable OSD recording to .msp files alongside video true/false true
rec_pb_enabled enable OSD playback if .msp file is stored alongside video true/false true
hide_diagnostics hide the diagnostic information in the bottom right true/false false
fakehd_enable enables FakeHD; the other FakeHD options don't do anything if this is disabled. FakeHD is force disabled if the Flight Controller supports proper HD / RealHD true/false false
fakehd_lock_center Lock FakeHD in centered mode all the time; no gaps/spreading out even when you are flying. true/false false
fakehd_menu_switch FakeHD will use this character as the menu switch to detect when you are in menus/postflight and triggger centering. integer/number 4 (Betaflight Throttle)
fakehd_hide_menu_switch FakeHD will hide the menu switch set above; and the next 5 characters true / false false
fakehd_columns FakeHD column alignment config Single character, one of T M B S S
fakehd_rows FakeHD row alignment config, each character configures the alignment for one row 16 characters, each one of L C R W T F D WWWWWWCCWWWWWWWD

Current available options (Air Unit/Vista):

Option Description Type Default
compress_osd Enable sending full frames of compressed data. Disable to send raw MSP data Read more true/false true
osd_update_rate_hz Configure the update rate in hz for the OSD when using compressed transmission integer 10
disable_betaflight_hd Disable HD Mode, which is otherwise set by default in Betaflight 4.4 true/false false
fast_serial Change serial baud rate to 230400 baud, which can improve OSD performance in some situations - FC UART config must be changed to match. true/false false
cache_serial Cache unimportant MSP messages for seldom-used features (like PID tuning in the DJI Goggles Settings Menu) to reduce serial pressure true/false false

FAQ / Suggestions

How do I create a new font (for INAV, Ardupilot, etc.)?

Use mcm2img , specifically Knifa's branch to allow you to draw using a PNG template.

https://github.com/Knifa/mcm2img/tree/templates

Why is everything so big / can I make the text smaller (betaflight)?

For Betaflight prior to 4.4, look into FakeHD. For Betaflight after 4.4, you should see "HD" fonts by default. Make sure your VTx (AU/Vista) is powered up and visit the Betaflight Configurator to move OSD items to the edge of the screen.

How can I get my INAV/ArduPilot/Kiss Ultra OSD closer to the edge of the screen / Why is FakeHD closer to the edges?

  • The goggles need 60 characters to go edge to edge - so the 50 in the hd grid doesn't quite fill it
  • So, depending on the Flight Controller's setup, the RealHD grid is displayed centered in the goggles - gaps on both edges.
  • FakeHD had no compatibility constraints like this so we were able to use the full width of the screens.
  • Consequently, FakeHD can get nearer the edges.
  • Currently no solution to get RealHD closer to the edges.

What is RealHD

Sometimes we refer to the proper MSP OSD HD grid supported by ArduPilot / Kiss Ultra / INAV / Betaflight (from 4.4) + others as RealHD, to distinguish from FakeHD.

Compiling (development and debugging)

To build for DJI, install the Android NDK and add the NDK toolchain to your PATH, then use ndk-build to build the targets.

To build for UNIXes, install CSFML and run:

make -f Makefile.unix

Provided targets and tools are:

  • msp_displayport_mux - takes MSP DisplayPort messages, bundles each frame (all DisplayPort messages between Draw commands) into a single UDP Datagram, and then blasts it over UDP. Also creates a PTY that passes through all other MSP messages, for dji_hdvt_uav to connect to.
  • libdisplayport_osd_shim.so - Patches the dji_glasses process to listen for these MSP DisplayPort messages over UDP, and blits them to a DJI framebuffer screen using the DJI framebuffer HAL libduml_hal access library, and a converted Betaflight font stored in font.bin.
  • osd_sfml - The same thing as osd_dji, but for a desktop PC using SFML and bold.png.

Additional debugging can be enabled using -DDEBUG as a CFLAG.

Custom Build Installation (Goggles)

There's a slightly different process for V1 vs V2 Goggles, they renamed some bits between the two.

FPV Goggles V1

ndk-build
adb shell setprop dji.dji_glasses_service 0
adb push libs/armeabi-v7a/libdisplayport_osd_shim.so /tmp
adb shell LD_PRELOAD=/tmp/libdisplayport_osd_shim.so dji_glasses_original -g

FPV Goggles V2

ndk-build
adb shell setprop dji.glasses_wm150_service 0
adb push libs/armeabi-v7a/libdisplayport_osd_shim.so /tmp
adb shell LD_PRELOAD=/tmp/libdisplayport_osd_shim.so dji_gls_wm150_original -g

Air Unit / Air Unit Lite (Vista)

ndk-build
adb push msp_displayport_mux /blackbox
adb shell setprop dji.hdvt_uav_service 0
adb shell mv /dev/ttyS1 /dev/ttyS1_moved
adb shell nohup /blackbox/msp_displayport_mux 192.168.41.2 /dev/ttyS1_moved /dev/ttyS1 &
adb shell setprop dji.hdvt_uav_service 1

This tells the displayport mux to send data from /dev/ttyS1_moved to 192.168.41.2 (goggles) and to create a fake serial port at /dev/ttyS1 with the displayport messages filtered out.

Optionally, you can add -f, like nohup /blackbox/msp_displayport_mux -f 192.168.41.2 /dev/ttyS1_moved /dev/ttyS1 to put the serial port in a faster 230400 baud mode, and set the MSP serial port in your flight controller to 230400 to try to improve the framerate.

You can also omit setprop dji.hdvt_uav_service 1 , which will improve your OSD framerate at the expense of disabling all Air Unit / Vista side coordination functionality (AU recording, channel changes, some RC features, etc.).

Enjoy.

Additional Reading / Learning

https://github.com/fpv-wtf/margerine/wiki

Shoutouts / Thank You

msp-osd's People

Contributors

benlumley avatar bri3d avatar chakflying avatar d3vl-jack avatar dzikuvx avatar evilm1 avatar fedorcomander avatar j005u avatar kickfliph avatar kissultra avatar knifa avatar martinwa avatar mavenius avatar rochford77 avatar shellixyz avatar stylesuxx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

msp-osd's Issues

Characters getting clipped

When enabling the virtual horizon bar, I can see the top/bottom few pixels of a few (or in some cases all) the characters that make up the bar getting clipped for some reason.

AU/Vista input voltage in OSD without fc

Issue added to Margerine issues however was indicated that it would likely not be implemented at root tool level but maybe be taken up in an OSD mod. Bri3d feel free to kill this if this is not something your project would consider.

As a user of the DJI FPV without a flight controller the display of the AU/Vista input voltage would be beneficial for use with the DJI FPV system.

The simple usecase is as follows:

Pilot installs AU/Vista unit in an airframe with direct flight battery connection according to hardware limitations.
Pilot powers on in AU/Vista and FPV goggles entering flight playback OSD.
According to value read and position values the flight battery is painted to the OSD.
The following comes from @funnel on fpv.wtf Discord:

it's possible this is where the voltage value is in on the AU. not 100% sure, need to do more tests to confirm
cat /sys/devices/platform/soc/f0a00000.apb/f0a71000.omc/voltage4

https://discordapp.com/channels/849931046883819550/950499167237718136/960576273841786910

multiplied by ~0.01584

yes it is. I went through 13-16.8V with a psu and that's where you can read it. The average factor on my old big AU is 0.015833
I don't have a Vista to test

osd问题

osd的话用开源的osd还是闭源的就行,开源的话建议用什么刷,闭源的可以刷嘛,像红切糕

Automatic Recording

Since you are already implementing DVR, I would really love to see an automatic recording feature. I would assume there is an event once the goggle receives a signal from the air unit and when the signal is lost.

Those events could be used to automatically start and stop recording. I am not sure if you want to keep the recording functionality in this repo, but I thought I'll write down my idea so that it does not get lost.

From what I understand it should also be possible to extend the Menus, since it's "just" XML for this to be a setting which the user can enable themselves.

msp-osd looses fonts on reboot when using fakehd or fakehd settings not saving....

Got a strange issue, with msp-osd when using fakehd.

This problem happens with all fonts, so I put the fonts onto my googles and named them correctly, the fonts don't show and the regular font displays as normal. If I then go to the cli and type package-config set msp-osd fakehd_enable true and press Enter, then package-config apply msp-osd and hit enter again, pigeon says it's saved the settings and reboots msp-osd - the fonts then show correctly, they look fab.

Then if I power cycle my googles, it's back to square one, the font used is the original font that shows when you don't have any fonts on the sd card, if you then goto the cli and type package-config set msp-osd fakehd_enable true and apply msp-osd the font starts working fine again, until the next power cycle.

Sorry the pic is out of focus, but this is cold boot font:
IMG_0303

and this one is the nice font shown after sending the enabling fakehd command and saving.
IMG_0302

My setup is latest build, betaflight 431.

Is this a bug?

fakehd_lock_center

package-config set msp-osd fakehd_lock_center true

does not work

All the same, gaps in the OSD, but I don't need them

Problem with operation on DJI V2 Goggles

Rooted the goggles, using the WTF config, installed the WTF-OS, added the msp-osd.....getting the waiting for OSD message in goggles...

was successfully using ArduPilot to display custom OSD data using the SERIALx_PROTOCOL 33 before....switched to 42, OSD_TYPE=5, and options for using Betaflight default font....

nothing....no display....turn off msp-osd via STARTUP screen and config, revert to SERIALx_PROTOCOL = 33 and OSD_TYPE=3 (MSP) and osd displays again, with the normal custom osd limitations....

any suggestions as to what to try? or how to debug...

ready to use binaries?

I have massive problems setting up the build enviroment and cant get it to work :(
Is it possible to upload a release or maybe someone can build it with a backup of my system/lib ?

i would really appreciate

Save framebuffer to file.

Hi! Very cool project, thanks to everyone who contributed!

I have an idea, what if we take the data that comes into the framebuffer and save it ?
This will allow us to have video with OSD data.

example save framebufer to file
ffmpeg -f fbdev -framerate 25 -i /dev/fb0 output.avi

I see package ffmpeg utility in Package Manager

I see double (OSD items).

I've used DJI's BetaFlight OSD support - now installed msp-osd.
When I configure any item that is supported by both OSD's, like satcount, altitude, RSSI - then I see those elements both in the blocky Betaflight OSD design - and DJI design , with an offset.

How can I make only one of those display the items that are supported by both?

I've read README.md and "Additional Reading / Learning" - finding nothing on the topic.

HD OSD on non Inav FC?

I noticed a recent commit with INAV HD OSD. How does that work in general and how can this be enabled in BetaFlight and ArduPilot?

Thanks and great work!

No OSD in Inav

Hello everybody. i have a problem with the OSD in Inav. I turned OFF MSP and selected HDZero VTX as a peripheral but on Goggles I still see the OSD WAITING message. what i'm doing wrong? DJI Goggles V2 and DJI Air Unit. Thank you very much for your help

Root and msp-osd installed both on goggles and Air Unit.

Automatic BF setup

It would be awesome if the air side mux could set up MSP OSD for you automatically in BF.

I guess some probing to find the correct MSP uart might be involved.

Goggles display waiting for osd

Goggles v1 and original air unit were updated to 606 firmware, rooted, wtfos installed, msp package installed on both but I don't have any betaflight elements. In the lower right there's text saying waiting for OSD. If I turn on custom OSD I get some of the items that I selected but it's the same dji info as before rooting and setting up msp in cli.

OSD low update rate or frozen

I'm seeing an issue where the OSD is not updating anymore or very slow. This occurs about every flight.

What I observed:

  • OSD elements frozen(few seconds or as long as a few minutes), eventually recovers
  • OSD elements updating really fast after being frozen for a short while
  • Might be triggered by a bad signal, need to do more tests to confirm that.

System info:
iNav 5
Goggles V2
MSP-OSD 0.5.1
boost-bitrate
50mbit mode

Let me know if any other information is needed, I would also be able to run a debug build if required.

Random relocation of OSD elements

When using the msp-osd, sometimes some of the OSD elements blink on the screen on top of other existing elements, for example:

Let's say on my OSD I have:

  • Remaining battery (top)
  • Craft name (left)
  • Link Quality (left)

Sometimes the "Remaning battery" element for a short time is displayed on top of the "Link Quality" or the "Craft Name", then it goes back to its set position.

Holding back is always osdwarrning

olding back is always osdwarrning,
I used the ps command to show that the /opt/bin/osd_dji service was not executed. I manually started the service, and then pressed back and kept showing osdwarrning

Autostart after reboot

It is a bit unclear if I need to hook the Air Unit/Goggles to the PC and start the process every time after the installation.

If I reboot the Air Unit/Goggles, do I need to manually start the process every time?
Is it possible to register it as a service on the devices and switch between the regular UI and the MSP DisplayPort by just using the Back button after reboot?

Thanks,
Keep up the great work!

Vista goes into Low Power Mode as soon as MSP-OSD is enabled.

Got a funny problem with my setup, so whenever I switch on the MSP-OSD in the Configurator on my Vista, it instantly (or within a few seconds) goes into low power mode. even thought Auto Temperature Control is set to OFF in the Googles menu. This also happens upon power up, within a few seconds of everything syncing up, the vista goes into LPM regardless of setting. This is a brand new Vista on 0606 and I had the same problem on the older, beaten to within an inch of it's life only transmitting at 5Mb/s unit it replaced.

Arming the quad allows it to go to full power and recording starts fine, but at our club we do a lot of crashing so don't want the Vista unit going into low power mode when disarming (this does happen) because then often we cannot turtle or get out of the trees, some of us also like to start recording before arming to sync up separate audio recordings.

Strangely, if I go into my googles menu and change Auto Temperature Control to ON, then turn it back to OFF again, the vista unit then respects this setting and will happily sit there until you get the Overheating please land message you usually get if you let them overheat.

I asked on the FPV.WTF discord and they said to ask here, is this a feature and if it is, can it be disabled, or are my crappy old v1 googles (that are stuck on 0600 firmware because every time I try to upgrade DJI Assistant says no firmware is available) causing the issue, if so do you recommend trying to upgrade them to 0606 or is this a known issue and I just need to toggle the Auto Temperature Control setting everytime I fly?

Also, any chance of getting the vista's mw output onto that list that has the temperature and voltage in on the osd? We're a bunch of idiots at our club and will often take off in 25mw mode and the first anybody knows that they're not in 700mw power is when you're power looping a big tree and loose video on the other side of it LOL.

Any help or pointers much appreciated, thanks.

Support for Emuflight

Hola~ developers, your work is brilliant but i noticed i was unable to use this feature on my Emuflight drones
I wonder is it possible to support Emuflight osd(If that's not a lot of work)?

Font dual use for inav and bf

When I choose a font it is not working for bf and inav. Only one is working.
Please do 2 seperate folders on the goggle for inav and bf.

when msp_displayport_mux started, channel number not updated when channel was change by user

when msp_displayport_mux started at airunit, channel number not updated when channel was change by user

  1. setup auto start msp_displayport_mux at Airunit
    adb shell echo "'sleep 15' >> /system/bin/dji_setup_uart.sh"
    adb shell echo "'./blackbox/start_msp.sh &' >> /system/bin/dji_setup_uart.sh"

start_msp.sh :
setprop dji.hdvt_uav_service 0
mv /dev/ttyS1 /dev/ttyS1_moved
nohup /blackbox/msp_displayport_mux 192.168.41.2 /dev/ttyS1_moved /dev/ttyS1 &

  1. setup auto start osd_dji at Goggles
    adb shell echo "'sleep 15' >> /system/bin/dji_setup_uart.sh"
    adb shell echo "'./blackbox/start_osd.sh &' >> /system/bin/dji_setup_uart.sh"

start_osd.sh :
nohup /blackbox/osd_dji &

  1. power up both devices, msp_displayport_mux and osd_dji started
    before hold the BACK button for 5 seconds to start MSP OSD, use DJI gui or press button to change channel, it should be changed to new channel, but the gui still showing existing channel number, need to reboot both device and "new" channel number is updated

if msp_displayport_mux at Airunit is not started(auto or manual), channel number will update at goggles GUI

startup script:
https://github.com/singlag/msp-osd/tree/main/msp_osd_installer

Temp AU on Google not showen

I take the new Update 0.6.5 on the Google and to the Vista.
Now i can t see the Temperatur from the AirUnit in the osd.
In configurator cli is Status au data true.
At Firmware 0.6.3 its have work.

fakehd_hide_menu_switch do not work

Hallo, I aktivate:

package-config set msp-osd fakehd_hide_menu_switch true
package-config set msp-osd fakehd_menu_switch 4
package-config apply msp-osd

In Betaflight I aktivate:
Unbenannt

But If I disarm, the overview from betaflight is not fit to the middle. It's stretched like my fakehd fields. Also a friend of my hase same problem. What are we doing wrong?
I have msp-osd current version installed. (V0.7.2)

Known issue: iNav display artifacts when packets are lost

The issue with iNav is basically this: it sends delta updates instead of element updates or full-screen updates.

Betaflight and Ardupilot send a Clear command, a series of Draw commands (usually, but not always, one for each element), and then a Draw Screen command.

iNav never sends a Clear command - it basically sends scanlines line-by-line (twice per line actually, because of multi-page fonts) with only changed characters from the previous frame. If a character is deleted, it replaces it with 0x20 (space).

This seems smart on the surface, because of course most of the OSD is actually static and it massively reduces the number of bytes sent.

The problem is, it only ever sends "I-frames" so to speak (delta updates), never P frames (full screen frames). So if even a single intermediate frame is lost, that frame's updates break the OSD forever. That's what's happening here. I was going crazy because it's flawless in my bench testing since my implementation is "correct."

But, once you go out in the field, you lose a packet here and there. With Ardu and BF, this doesn't matter at all, because the next packet redraws the whole screen anyway. With iNav, this is fatal for the AHI, because now some 0x20s were missed and some characters from the AHI are stuck on the screen forever unless it is cleared again.

What I will have to do to fix this is have the DisplayPort mux on the AU side reconstruct the character buffer for the screen layout, and then either send full frames again or make my own delta update system which periodically sends full-frame updates and/or has checksums and a retransmit capability.

Any chance the "Waiting for OSD..." message could be removed?

Any chance the "Waiting for OSD..." message could be removed for those of us that like the option of using the old DJI Custom OSD for FC's such as Ardupilot, but want this option for BF builds? What would be really slick is if the message went away when Custom OSD is turned on.

F722 betaflight 4.3.1 - SERIAL CPU headache

I've activated MSP OSD, on STM32F722 FC, everything is working, but in flight - I got some prephireal devices dissapear - for example GPS, it's just disappeared and not seen in configurator. 1st I think GPS was damaged, but when I did some investigation at home - F722 CPU is heating like hell... And as you can see on screenshot - with "tasks" command - it got 3887% CPU usage for SERIAL.... it seems there is a bug somewhere in code..

Screenshot 2022-08-26 at 20 26 28

Msp-osd in Inav

In the ports tab you have to select hdzero, does the msp also need to be switched on?

somehow i can’t seem to switch msp and hdzero on together.

I have the osd working/running but the elements are wrong/messed up. Some are ok bu tmost are not.
and yes i tried going in the menu with stick command and back.

fakehd with configfile

Hallo I checkt out today to use a config file for fakehd on sd card:

fakehd.c Code:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> // for access
#include <fcntl.h>
#include <sys\stat.h>

#include "json/osd_config.h"

#define FAKEHD_ENABLE_KEY "fakehd_enable"
#define FAKEHD_LOCK_CENTER_KEY "fakehd_lock_center"
#define FAKEHD_HIDE_THROTTLE_KEY "fakehd_hide_throttle_element" // for compat
#define FAKEHD_MENU_SWITCH_KEY "fakehd_menu_switch"
#define FAKEHD_HIDE_MENU_SWITCH_KEY "fakehd_hide_menu_switch" // for compat
#define FAKEHD_LAYOUT_DEBUG_KEY "fakehd_layout_debug"
#define FAKEHD_COLUMNS_KEY "fakehd_columns"
#define FAKEHD_ROWS_KEY "fakehd_rows"
#define FAKEHD_TEST_KEY "fakehd_TEST"

#define SDCARD_FAKEHD_PATH "/storage/sdcard0/fakehd_style.txt"

#define INPUT_ROWS 16
#define INPUT_COLS 30

int fakehd_enabled = 0;
static int fakehd_hide_menu_switch = 0;
static int fakehd_lock_center = 0;
static int fakehd_layout_debug = 0;
static int fakehd_menu_switch_char = 4; // betaflight throttle icon
static int fakehd_trigger_x = 99;
static int fakehd_trigger_y = 99;
static char fakehd_columns = 'S';
static char fakehd_rows[INPUT_COLS] = "WWWWWWCCWWWWWWWD";

int fakehd_test[60][22] = {
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0},
    {1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,1,1,1,1,1,0}
    };


#ifdef DEBUG
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, fmt, ##args)
#else
#define DEBUG_PRINT(fmt, args...)
#endif

void load_fakehd_config()
{
    DEBUG_PRINT("checking for fakehd enabled\n");
    if (get_boolean_config_value(FAKEHD_ENABLE_KEY))
    {
        DEBUG_PRINT("fakehd enabled\n");
        fakehd_enabled = 1;
    }
    else
    {
        DEBUG_PRINT("fakehd disabled\n");
    }

    DEBUG_PRINT("checking for fakehd layout debug\n");
    if (get_boolean_config_value(FAKEHD_LAYOUT_DEBUG_KEY))
    {
        DEBUG_PRINT("fakehd layout debug\n");
        fakehd_layout_debug = 1;
    }
    else
    {
        DEBUG_PRINT("fakehd layout debug off\n");
    }

    DEBUG_PRINT("checking for fakehd hide throttle \n");
    if (get_boolean_config_value(FAKEHD_HIDE_MENU_SWITCH_KEY))
    {
        DEBUG_PRINT("fakehd hide throttle\n");
        fakehd_hide_menu_switch = 1;
    }
    else
    {
        DEBUG_PRINT("fakehd no hide throttle\n");
    }
    DEBUG_PRINT("checking for fakehd lock center \n");
    if (get_boolean_config_value(FAKEHD_LOCK_CENTER_KEY))
    {
        DEBUG_PRINT("fakehd lock center\n");
        fakehd_lock_center = 1;
    }
    else
    {
        DEBUG_PRINT("fakehd no lock center\n");
    }

    int trigger = get_integer_config_value(FAKEHD_MENU_SWITCH_KEY);
    if (trigger)
    {
        DEBUG_PRINT("fakehd found custom trigger\n");
        fakehd_menu_switch_char = trigger;
    }
    // trigger
    // rows
    const char * rows = get_string_config_value(FAKEHD_ROWS_KEY);
    if (rows) {
        DEBUG_PRINT("fakehd found custom row conf\n");
        memcpy(fakehd_rows, rows, INPUT_COLS);
    }

    const char * cols = get_string_config_value(FAKEHD_COLUMNS_KEY);
    if (cols)
    {
        DEBUG_PRINT("fakehd found col conf\n");
        fakehd_columns = cols[0];
    }

    int result = access(SDCARD_FAKEHD_PATH, F_OK); 
    if (result == 0) {
        DEBUG_PRINT("fakehd found custom test\n");
        //printf("file gefunden:\n");
        FILE *myFile;

        myFile = fopen(SDCARD_FAKEHD_PATH, "r");
        for (int j = 0; j < 22; j++){
            for (int i = 0; i < 60; i++){
                fscanf(myFile, "%d ", &fakehd_test[i][j]);
                //printf("%d", fakehd_test[i][j]);
            }
            //printf("\n");
        }
        fclose(myFile);
    
    } /*else {
        printf("\n\n\n\nDEFAULT FAKEHD STYLE USED\n\n\n\n\n");
    }*/
    
    DEBUG_PRINT("fakehd finished config init\n");
}

// when possible, this should be called on reconnect. it will do what's needed to put fakehd back
// into fresh booted state
void fakehd_reset() {
    // clear saved centering trigger position
    int fakehd_trigger_x = 99;
    int fakehd_trigger_y = 99;
}

void fakehd_map_sd_character_map_to_hd(uint16_t sd_character_map[60][22], uint16_t hd_character_map[60][22])
{

    int x = 0;
    int y = 0;
    //printf("Start");
    for (int a = 0; a < 22; a++){
        for (int b = 0; b < 60; b++){ 
            if (fakehd_test[b][a] != 0){
                //printf("|1|");
                //printf("|%d %d|", x, y);
                hd_character_map[b][a] = sd_character_map[x-1][y-1];
                //x bzw. y hochzahlen wenn ein Wert gefunden wurde
                if(x < INPUT_COLS){
                    x++;
                }else{
                    x=1;
                    y++;
                }
            }else{
                //printf("|0|");
                //printf("|0 0|");
            }
        }
        //printf("\n");
    }
}

An textfile which looks like this: (fakehd_style.txt)

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

And an Excel file where you can generate this output for the fakehd_style.txt:

What do you think about doing it like this then it´s posible to generate a webpage where everybody can generate this text file and store it to the sd card and have an individual way how to position 30 field per row.
I realy can´t get you switch posiblility again working so I let it away ;-). Did not realy get how it works.

Small Howto improvement?

I just rooted my goggle and installed MSP-OSD, works great! Thank you so much :)

There was only one part i would maybe change in the howto:
"If the Betaflight Configurator says your DJI VTx is attached to UART2, the value for <ConfiguratorUART - 1> is 1 - so you would use set displayport_msp_serial = 1."

I think something like that would be more easy to understand:
If the Betaflight Configurator says your DJI VTx is attached to UART2, you need to substract 1 for the UART mapping, as betaflight configurator shows UARTs different, so you would use set displayport_msp_serial = 1.

Maybe its just me, so if i am talkin BS just mark it as solved :D

Incorrect display for some OSD elements

With ArduPilot v4.2.3 I see a weird behavior for some OSD elements.

A few examples:

  • Sidebars don't seem to work at all
  • Altitude displays weird stuff. Depending on the font I have saved on the SD card it either displays a plain digit or a digit followed by LQ symbol.

Add canvas mode support to support pixel based rendering instead of character based rendering.

From BF discord:

belrik: Would you be open to helping FPV.WTF create a canvas-mode renderer for vector-based OSD? That would increase the number of users able to use canvas-mode.

hydra: i fully agree that it would, and if you can do per-pixel drawing on the goggles frame buffer then yes, do it.
hydra: I personally do not have the available time to embark on such a project.
hydra: I would suggest the implementation just uses the existing FC code for the FrSky UART Canvas Mode driver, and then there's nothing else to do on the FC side of things. Then on the goggle side of things just start with the clear screen, and displaywrite implementations of which you already have existing code in the form of the MSP implementation, but obviously ditching the grid and use the pixel-based offsets instead.
hydra: obviously you need the uart protocol code too. but it doesn't seem like that big of a job to get uart protocol, basic fc/osd detection/capabilities handshake and then screen clear + font rendering going.
hydra: at least, for someone already familiar with the DJI goggle programming environment and system libraries/api that is, which also isn't me

Donation Link

Hey, I would like to throw some money at you for your effort, what is the best way to do so?

Youtube Video

Hallo, is there maybe a youtube video availible where it´s possible to see whats happening and how to do the things only for installing this and how it looks like (not how to root the DIJ Goggles)

Proposal: Increase OSD resolution

Currently the OSD is too low resolution which looks unpleasent and is also a waste of screen realestate.

Proposed way to increase the resolution:

  1. Reduce the FONT_WIDTH (36) FONT_HEIGHT (54) parameters by a given factor (ex by 2) to 18 and 27 respectively.
  2. Instead of using OSD character X and Y coordinates as real coordinates for OSD characters use them as indexes where the real coordinate is the X,Y multiplied by the factor we set in step 1.

If we use a factor of 2 this would effectively quadruple the resolution and also double the horizontal text realestate.
Where the text would have overlapped in the past it wont because for every character space on the line we will have 2 character space on our end to fit twice as much text per line.

Vertically the same number of lines will remain as we dont have the option to overflow the lines as we have with text.

Caveat: in the Flight Controlled OSD tab when configuring the OSD element position it will be a bit weird as seamingly overlapping elements might not overlap in our display in the goggles, but that is a small price to pay for this improvement. I think DJI originally implemented something similar (if not the same).

missing a FAQ section - makes me ask here.

Last I heard, this great hack required a manual start on every boot.
-Is a persistent mode possible now? / soon?
-what's the last/best safe version one can upgrade DJI goggles/Caddx Vista to ? - I don't dare go beyond 1.00.0606
-are there any adverse effects of this hack?

Thank you - keep up the great job.

"Waiting for OSD" Message

Hey guys,
I got on UART 1 my VTX so which "displayport_msp_serial" should I set then?
I set displayport_msp_serial = 5 and still get the message "OSD WAITING"

Goggles stuck on wait for data if Air Unit/Vista is turned on before Goggles enter MSP mode

The order in which we start the msp-ods and goggles seems to affect first usage.

If we do plug the battery on quad and power on Air Unit/Vista, then enter the msp-osd mode, the goggles get stuck waiting for data, then it is required to turn off Air Unit/Vista and turn on again to get it working.

Not clear yet if this is an issue on the goggles side or the air unit/vista.

Seeing both new BF OSD and old DJI OSD

On some craft (Ardupilot fixed wing for example) I prefer the old Custom DJI OSD (mostly cause its small text out of the way) and on some craft (my racing quad) I prefer the BF OSD. However, with Custom OSD turned on in the Goggles, I see some old elements along with the new elements in my BF drone. Any way for the Goggles to know the new OSD is being sent and NOT show the old elements - even with Custom OSD turned on? Such a bother to keep flipping the setting. Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.