Skocz do zawartości

ESP32flight - zbuduj radar lotniczy z ekranem dotykowym (bez lutowania, bez łączenia modułów i bez programatora)


Pomocna odpowiedź

Jakiś sukces jest, mam aktualizowanie pozycji samolotów nad moim regionem, ale uparcie patrzą na północ moje samoloty. Próbuję obracać ikony, na razie bez sukcesu. 

@theqkash zdaje się się przygotowałeś ikony dla każdego kierunku… obracanie nie działało?

IMG_5621.JPG

  • Lubię! 1
(edytowany)

SUPLA i FlightRadar na jednym ekranie:)

Supla i Flightradar:)
https://youtu.be/3NXqTwgBUek

Generalnie mam com chciał:)

Jeszcze powalczę z tym obracaniem ikon, lub dodam osobne dla każdego kierunku.

Może też skróty literowe lotnisk zamienię na nazwy miast:)

Edytowano przez SOYER
  • Lubię! 2
(edytowany)

Jak ktoś wie, w jaki sposób obracać image w lvgl 8.3 to proszę o info.

Mam 10 buttonów, wewnątrz każdego image (samolot) 32x32px, true color alpha.

Co 8s odświeżam pozycję buttonów i image wewnątrz, oraz chcę obracać image w.g. zmiennej kurs samolotu. 

Jak aktualizacja pozycji na ekranie działa bdb, tak za chiny ludowe nie mogę obracać ikony samolotu.

plane1-plane10 to buttony, plane1_1 - plane10_1 to images

void updateFlightRadarUI() {
    // Sprawdzamy czy aktywny jest ekran scr10 z EEZ Studio
    if (lv_scr_act() != objects.scr10) return; 

    // Tablica obiektów PRZYCISKÓW z EEZ Studio
    lv_obj_t* planeButtons[MAX_TRACKED_PLANES] = {
        objects.plane1, objects.plane2, objects.plane3, objects.plane4, objects.plane5,
        objects.plane6, objects.plane7, objects.plane8, objects.plane9, objects.plane10
    };

    // Tablica obiektów OBRAZKÓW z EEZ Studio
    lv_obj_t* planeImages[MAX_TRACKED_PLANES] = {
        objects.plane1_1, objects.plane2_1, objects.plane3_1, objects.plane4_1, objects.plane5_1,
        objects.plane6_1, objects.plane7_1, objects.plane8_1, objects.plane9_1, objects.plane10_1
    };

    // Odczyt danych z tablicy globalnej pod osłoną TYLKO JEDNEGO Mutexu
    if (flightDataMutex != NULL && xSemaphoreTake(flightDataMutex, pdMS_TO_TICKS(25)) == pdTRUE) {
        
        for (int m = 0; m < MAX_TRACKED_PLANES; m++) {
            if (planeButtons[m] == NULL) continue;

            if (trackedPlanesList[m].active) {
                float dx_km = (trackedPlanesList[m].lon - HOME_LON) * km_per_deg_lon;
                float dy_km = (trackedPlanesList[m].lat - HOME_LAT) * km_per_deg_lat;
                
                // MAPOWANIE NA PIKSELE: Wyśrodkowanie przycisku samolotu na ekranie
                int targetX = SCREEN_CENTER_X + (int)(dx_km * px_per_km) - 16;
                int targetY = SCREEN_CENTER_Y - (int)(dy_km * px_per_km) - 16; 
                
                // 1. Ustawienie pozycji PRZYCISKU na ekranie radaru
                lv_obj_set_pos(planeButtons[m], targetX, targetY);

                // 2. BEZPOŚREDNIE POBRANIE OBRAZKA Z TABLICY (Zamiast lv_obj_get_child)
                lv_obj_t* planeImage = planeImages[m];

                if (planeImage != NULL) {
                    // Ustawienie punktu obrotu dokładnie na środku ikony 32x32 px
                    lv_img_set_pivot(planeImage, 16, 16);

                    // Przeliczenie kąta dla LVGL v8 (wartość * 10)
                    int lvglAngle = (int)(trackedPlanesList[m].track * 10);
                    
                    // Normalizacja kąta do zakresu 0 - 3600
                    if (lvglAngle < 0) lvglAngle += 3600;
                    lvglAngle = lvglAngle % 3600;

                    // 3. Obracamy tylko wewnętrzny OBRAZEK
                    lv_img_set_angle(planeImage, lvglAngle);
                }

                // Przypisanie ID indeksu dla struktury kliknięć przycisku
                lv_obj_set_user_data(planeButtons[m], (void*)(uintptr_t)m);

                // Pokazanie przycisku wraz z zawartością na ekranie
                lv_obj_clear_flag(planeButtons[m], LV_OBJ_FLAG_HIDDEN);
            } else {
                // Ukrycie całego przycisku, gdy samolot znika z radaru
                lv_obj_add_flag(planeButtons[m], LV_OBJ_FLAG_HIDDEN);
            }
        }
        // Oddanie Mutexu po zakończeniu całej operacji
        xSemaphoreGive(flightDataMutex); 
    }
}

 

Edytowano przez SOYER
2 godziny temu, SOYER napisał:

Jak ktoś wie, w jaki sposób obracać image w lvgl 8.3 to proszę o info.

54 minuty temu, _LM_ napisał:

Zwykle najlepiej obrócić ręcznie w programie do grafiki, bo LVGL potrafi robić problemy z obracaniem obrazków na MCU. Nie pamiętam dokładnie czy wtedy znikały czy zmieniały się w czarną plamę, ale pamiętam, że miałem z tym kiedyś problemy.

  • Lubię! 1

Przy tej ilości flash pomimo że program sporo jednak zajmuje, chyba lepiej wygenerować te kilka (naście) dodatkowych grafik. Z drugiej strony system musi to wyliczyć tylko raz po pobraniu kursu.. Nie wiem trzeba sprawdzić co lepiej działa 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...