@@ -224,7 +224,7 @@ static bool osdDisplayHasCanvas;
224
224
225
225
#define AH_MAX_PITCH_DEFAULT 20 // Specify default maximum AHI pitch value displayed (degrees)
226
226
227
- PG_REGISTER_WITH_RESET_TEMPLATE (osdConfig_t , osdConfig , PG_OSD_CONFIG , 11 );
227
+ PG_REGISTER_WITH_RESET_TEMPLATE (osdConfig_t , osdConfig , PG_OSD_CONFIG , 12 );
228
228
PG_REGISTER_WITH_RESET_FN (osdLayoutsConfig_t , osdLayoutsConfig , PG_OSD_LAYOUTS_CONFIG , 1 );
229
229
230
230
void osdStartedSaveProcess (void ) {
@@ -2513,6 +2513,121 @@ static bool osdDrawSingleElement(uint8_t item)
2513
2513
}
2514
2514
#endif
2515
2515
2516
+ case OSD_FORMATION_FLIGHT :
2517
+ {
2518
+ static uint8_t currentPeerIndex = 0 ;
2519
+ static timeMs_t lastPeerSwitch ;
2520
+
2521
+ if ((STATE (GPS_FIX ) && isImuHeadingValid ())) {
2522
+ if ((radar_pois [currentPeerIndex ].gps .lat == 0 || radar_pois [currentPeerIndex ].gps .lon == 0 || radar_pois [currentPeerIndex ].state >= 2 ) || (millis () > (osdConfig ()-> radar_peers_display_time * 1000 ) + lastPeerSwitch )) {
2523
+ lastPeerSwitch = millis ();
2524
+
2525
+ for (uint8_t i = 1 ; i < RADAR_MAX_POIS - 1 ; i ++ ) {
2526
+ uint8_t nextPeerIndex = (currentPeerIndex + i ) % (RADAR_MAX_POIS - 1 );
2527
+ if (radar_pois [nextPeerIndex ].gps .lat != 0 && radar_pois [nextPeerIndex ].gps .lon != 0 && radar_pois [nextPeerIndex ].state < 2 ) {
2528
+ currentPeerIndex = nextPeerIndex ;
2529
+ break ;
2530
+ }
2531
+ }
2532
+ }
2533
+
2534
+ radar_pois_t * currentPeer = & (radar_pois [currentPeerIndex ]);
2535
+ if (currentPeer -> gps .lat != 0 && currentPeer -> gps .lon != 0 && currentPeer -> state < 2 ) {
2536
+ fpVector3_t poi ;
2537
+ geoConvertGeodeticToLocal (& poi , & posControl .gpsOrigin , & currentPeer -> gps , GEO_ALT_RELATIVE );
2538
+
2539
+ currentPeer -> distance = calculateDistanceToDestination (& poi ) / 100 ; // In m
2540
+ currentPeer -> altitude = (int16_t )((currentPeer -> gps .alt - osdGetAltitudeMsl ()) / 100 );
2541
+ currentPeer -> direction = (int16_t )(calculateBearingToDestination (& poi ) / 100 ); // In °
2542
+
2543
+ int16_t panServoDirOffset = 0 ;
2544
+ if (osdConfig ()-> pan_servo_pwm2centideg != 0 ){
2545
+ panServoDirOffset = osdGetPanServoOffset ();
2546
+ }
2547
+
2548
+ //line 1
2549
+ //[peer heading][peer ID][LQ][direction to peer]
2550
+
2551
+ //[peer heading]
2552
+ int relativePeerHeading = osdGetHeadingAngle (currentPeer -> heading - (int )DECIDEGREES_TO_DEGREES (osdGetHeading ()));
2553
+ displayWriteChar (osdDisplayPort , elemPosX , elemPosY , SYM_DECORATION + ((relativePeerHeading + 22 ) / 45 ) % 8 );
2554
+
2555
+ //[peer ID]
2556
+ displayWriteChar (osdDisplayPort , elemPosX + 1 , elemPosY , 65 + currentPeerIndex );
2557
+
2558
+ //[LQ]
2559
+ displayWriteChar (osdDisplayPort , elemPosX + 2 , elemPosY , SYM_HUD_SIGNAL_0 + currentPeer -> lq );
2560
+
2561
+ //[direction to peer]
2562
+ int directionToPeerError = wrap_180 (osdGetHeadingAngle (currentPeer -> direction ) + panServoDirOffset - (int )DECIDEGREES_TO_DEGREES (osdGetHeading ()));
2563
+ uint16_t iconIndexOffset = constrain (((directionToPeerError + 180 ) / 30 ), 0 , 12 );
2564
+ if (iconIndexOffset == 12 ) {
2565
+ iconIndexOffset = 0 ; // Directly behind
2566
+ }
2567
+ displayWriteChar (osdDisplayPort , elemPosX + 3 , elemPosY , SYM_HUD_CARDINAL + iconIndexOffset );
2568
+
2569
+
2570
+ //line 2
2571
+ switch ((osd_unit_e )osdConfig ()-> units ) {
2572
+ case OSD_UNIT_UK :
2573
+ FALLTHROUGH ;
2574
+ case OSD_UNIT_IMPERIAL :
2575
+ osdFormatCentiNumber (buff , CENTIMETERS_TO_CENTIFEET (currentPeer -> distance * 100 ), FEET_PER_MILE , 0 , 4 , 4 , false);
2576
+ break ;
2577
+ case OSD_UNIT_GA :
2578
+ osdFormatCentiNumber (buff , CENTIMETERS_TO_CENTIFEET (currentPeer -> distance * 100 ), (uint32_t )FEET_PER_NAUTICALMILE , 0 , 4 , 4 , false);
2579
+ break ;
2580
+ default :
2581
+ FALLTHROUGH ;
2582
+ case OSD_UNIT_METRIC_MPH :
2583
+ FALLTHROUGH ;
2584
+ case OSD_UNIT_METRIC :
2585
+ osdFormatCentiNumber (buff , currentPeer -> distance * 100 , METERS_PER_KILOMETER , 0 , 4 , 4 , false);
2586
+ break ;
2587
+ }
2588
+ displayWrite (osdDisplayPort , elemPosX , elemPosY + 1 , buff );
2589
+
2590
+
2591
+ //line 3
2592
+ displayWriteChar (osdDisplayPort , elemPosX , elemPosY + 2 , (currentPeer -> altitude >= 0 ) ? SYM_AH_DECORATION_UP : SYM_AH_DECORATION_DOWN );
2593
+
2594
+ int altc = currentPeer -> altitude ;
2595
+ switch ((osd_unit_e )osdConfig ()-> units ) {
2596
+ case OSD_UNIT_UK :
2597
+ FALLTHROUGH ;
2598
+ case OSD_UNIT_GA :
2599
+ FALLTHROUGH ;
2600
+ case OSD_UNIT_IMPERIAL :
2601
+ // Convert to feet
2602
+ altc = CENTIMETERS_TO_FEET (altc * 100 );
2603
+ break ;
2604
+ default :
2605
+ FALLTHROUGH ;
2606
+ case OSD_UNIT_METRIC_MPH :
2607
+ FALLTHROUGH ;
2608
+ case OSD_UNIT_METRIC :
2609
+ // Already in metres
2610
+ break ;
2611
+ }
2612
+
2613
+ altc = ABS (constrain (altc , -999 , 999 ));
2614
+ tfp_sprintf (buff , "%3d" , altc );
2615
+ displayWrite (osdDisplayPort , elemPosX + 1 , elemPosY + 2 , buff );
2616
+
2617
+ return true;
2618
+ }
2619
+ }
2620
+
2621
+ //clear screen
2622
+ for (uint8_t i = 0 ; i < 4 ; i ++ ){
2623
+ displayWriteChar (osdDisplayPort , elemPosX + i , elemPosY , SYM_BLANK );
2624
+ displayWriteChar (osdDisplayPort , elemPosX + i , elemPosY + 1 , SYM_BLANK );
2625
+ displayWriteChar (osdDisplayPort , elemPosX + i , elemPosY + 2 , SYM_BLANK );
2626
+ }
2627
+
2628
+ return true;
2629
+ }
2630
+
2516
2631
case OSD_CROSSHAIRS : // Hud is a sub-element of the crosshair
2517
2632
2518
2633
osdCrosshairPosition (& elemPosX , & elemPosY );
@@ -3930,7 +4045,9 @@ PG_RESET_TEMPLATE(osdConfig_t, osdConfig,
3930
4045
3931
4046
.stats_energy_unit = SETTING_OSD_STATS_ENERGY_UNIT_DEFAULT ,
3932
4047
.stats_page_auto_swap_time = SETTING_OSD_STATS_PAGE_AUTO_SWAP_TIME_DEFAULT ,
3933
- .stats_show_metric_efficiency = SETTING_OSD_STATS_SHOW_METRIC_EFFICIENCY_DEFAULT
4048
+ .stats_show_metric_efficiency = SETTING_OSD_STATS_SHOW_METRIC_EFFICIENCY_DEFAULT ,
4049
+
4050
+ .radar_peers_display_time = SETTING_OSD_RADAR_PEERS_DISPLAY_TIME_DEFAULT
3934
4051
);
3935
4052
3936
4053
void pgResetFn_osdLayoutsConfig (osdLayoutsConfig_t * osdLayoutsConfig )
0 commit comments