Back to posts Edit this post
Copy content

13 Oct 08:52

#include "platform.h" #include "xil_printf.h" #include "displayport.h" #include "vtc.h" #include "tpg.h" #include "xparameters.h" #include "./../../../hw/sdt/drivers/myip_v1_0/src/myip.h" #include <stdint.h> #include "xil_types.h" #include "xil_io.h" // Deklaracja funkcji standardowej Xilinxa do odbierania pojedynczego bajtu z UART (blokująca) extern char inbyte(void); // Funkcja konwertująca Hue (0-360) oraz Jasność/Value (0-100%) na format XRGB (0x00RRGGBB) u32 hsv_to_xrgb(u16 hue, u8 value) { if (hue >= 360) hue = hue % 360; if (value > 100) value = 100; u8 max_val = (value * 255) / 100; if (max_val == 0) { return 0x00000000; } u8 r = 0, g = 0, b = 0; u32 sector = hue / 60; u32 remainder = hue % 60; u8 x_val = (max_val * remainder) / 60; u8 inv_x_val = max_val - x_val; switch (sector) { case 0: r = max_val; g = x_val; b = 0; break; case 1: r = inv_x_val; g = max_val; b = 0; break; case 2: r = 0; g = max_val; b = x_val; break; case 3: r = 0; g = inv_x_val; b = max_val; break; case 4: r = x_val; g = 0; b = max_val; break; case 5: r = max_val; g = 0; b = inv_x_val; break; default: r = 0; g = 0; b = 0; break; } return ((u32)0x00 << 24) | ((u32)r << 16) | ((u32)g << 8) | b; } int main() { init_platform(); xil_printf("\n\n\n\n\n--- Sterowanie obrazem przez UART ---\r\n"); xil_printf("Strzalka w BOK: Zmiana koloru (Hue)\r\n"); xil_printf("Strzalka GORA/DOL: Zmiana jasnosci\r\n\n"); // Stan początkowy u16 HUE = 120; // Startowy kolor (Zielony) u8 BRIGHTNESS = 50; // Startowa jasność (50%) // Pierwsza inicjalizacja rejestru IP-Core u32 xrgb = hsv_to_xrgb(HUE, BRIGHTNESS); MYIP_mWriteReg(XPAR_MYIP_0_BASEADDR, MYIP_S00_AXI_SLV_REG0_OFFSET, xrgb); xil_printf("Starting pipeline...\r\n"); displayport_init(); displayport_setup_interrupts(); vtc_init(); tpg_init(); xil_printf("Entire video pipeline activated\r\n"); xil_printf("Aktualne parametry -> Hue: %d deg | Jasnosc: %d%%\r\n", HUE, BRIGHTNESS); // Główna pętla programu - nasłuchiwanie klawiatury while(1) { char c = inbyte(); // Pobierz znak z UART (blokuje pętlę do momentu kliknięcia) // Wykrycie sekwencji ucieczki dla strzałek (zaczyna się od 0x1B) if (c == 0x1B) { c = inbyte(); // Pobierz kolejny znak (powinien być '[', czyli 0x5B) if (c == 0x5B) { c = inbyte(); // Pobierz właściwy kod kierunku u8 changed = 0; switch(c) { case 0x41: // Strzałka w GÓRĘ -> Zwiększ jasność if (BRIGHTNESS < 100) { BRIGHTNESS += 5; if (BRIGHTNESS > 100) BRIGHTNESS = 100; changed = 1; } break; case 0x42: // Strzałka w DÓŁ -> Zmniejsz jasność if (BRIGHTNESS > 0) { if (BRIGHTNESS >= 5) BRIGHTNESS -= 5; else BRIGHTNESS = 0; changed = 1; } break; case 0x43: // Strzałka w PRAWO -> Zmień kolor +5 stopni HUE = (HUE + 5) % 360; changed = 1; break; case 0x44: // Strzałka w LEWO -> Zmień kolor -5 stopni if (HUE >= 5) HUE -= 5; else HUE = 360 - (5 - HUE); changed = 1; break; } // Jeśli nastąpiła zmiana parametrów, zaktualizuj rejestr w FPGA if (changed) { xrgb = hsv_to_xrgb(HUE, BRIGHTNESS); MYIP_mWriteReg(XPAR_MYIP_0_BASEADDR, MYIP_S00_AXI_SLV_REG0_OFFSET, xrgb); // Wyświetlenie aktualnego stanu w terminalu (czyszczenie linii \r) xil_printf("\rHue: %3d deg | Jasnosc: %3d%% (XRGB: 0x%08X) ", HUE, BRIGHTNESS, xrgb); } } } } cleanup_platform(); return 0; }

No files