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;
}