fpv-wtf / msp-osd Goto Github PK
View Code? Open in Web Editor NEWMSP DisplayPort OSD
License: GNU General Public License v3.0
MSP DisplayPort OSD
License: GNU General Public License v3.0
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.
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.
can add different fonts colour and support for inav ?
such as "inav radar"
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:
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.
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.
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"
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)?
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..
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
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.
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.
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!
Is it possible to show the VTX link strength when using MSP OSD mode?
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
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!
The update rate seems to be pretty good for a 2-3 seconds after which it slows down significantly.
Why?
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.
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.
when msp_displayport_mux started at airunit, channel number not updated when channel was change by user
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 &
start_osd.sh :
nohup /blackbox/osd_dji &
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
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.
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...
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.
I'm seeing an issue where the OSD is not updating anymore or very slow. This occurs about every flight.
What I observed:
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.
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
the subject says it all, it would be very nice to be able to check out the fonts side-by-side. (some screenshots)
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.
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
osd的话用开源的osd还是闭源的就行,开源的话建议用什么刷,闭源的可以刷嘛,像红切糕
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.
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.
Hey, I would like to throw some money at you for your effort, what is the best way to do so?
Hello, with the last updets i noticed that some OSD elements are missing. For example the satellite count is missing.
Can anyone help me?
Thank you
here you can find some photos of the problem
https://postimg.cc/PLxcHzmp
https://postimg.cc/PvmVy6kc
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.
Currently the OSD is too low resolution which looks unpleasent and is also a waste of screen realestate.
Proposed way to increase the resolution:
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).
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)
During the flight, the OSD is displayed normally.
After flight, the Betaflight flight stats OSD is not fully visible, but only 3 or 4 lines are visible.
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!
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.
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
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
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)
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.
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
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:
and this one is the nice font shown after sending the enabling fakehd command and saving.
My setup is latest build, betaflight 431.
Is this a bug?
有人有我这个情况没,root后双端也安装完wtf跟msposd了,按back五秒,进不去msposd
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 theclear screen
, anddisplaywrite
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
No more displayport_msp_serial
command; it's in the configurator as a peripheral now; (part of the function param of the serial config)
With ArduPilot v4.2.3 I see a weird behavior for some OSD elements.
A few examples:
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.