13 Oct 08:45
#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"
// Funkcja pomocnicza zwracająca maksimum z trzech wartości
u8 max(u8 a, u8 b, u8 c) {
u8 m = a;
if (b > m) m = b;
if (c > m) m = c;
return m;
}
// Funkcja pomocnicza zwracająca minimum z trzech wartości
u8 min(u8 a, u8 b, u8 c) {
u8 m = a;
if (b < m) m = b;
if (c < m) m = c;
return m;
}
// Funkcja konwertująca RGB na Hue (0 - 360 stopni)
u16 rgb_to_hue(u8 r, u8 g, u8 b) {
u8 c_max = max(r, g, b);
u8 c_min = min(r, g, b);
u8 delta = c_max - c_min;
int16_t hue = 0;
// Jeśli max i min są równe, kolor jest achromatyczny (szary/biały/czarny) -> Hue = 0
if (delta == 0) {
return 0;
}
// Obliczanie Hue w zależności od tego, która składowa jest największa
if (c_max == r) {
hue = ((int32_t)(g - b) * 60) / delta;
} else if (c_max == g) {
hue = (((int32_t)(b - r) * 60) / delta) + 120;
} else if (c_max == b) {
hue = (((int32_t)(r - g) * 60) / delta) + 240;
}
// Zapewnienie, że wynik jest w zakresie 0 - 359 stopni
if (hue < 0) {
hue += 360;
}
return (u16)hue;
}
int main() {
init_platform();
xil_printf("\n\n\n\n\n");
// Definicja koloru wejściowego RGB
u8 R = 0x00;
u8 G = 0xBF;
u8 B = 0x8F;
// Konwersja na Hue (wartość od 0 do 360)
u16 hue_val = rgb_to_hue(R, G, B);
xil_printf("Wyliczony Hue: %d stopni\r\n", hue_val);
// Tworzenie ramki danych do rejestru
// Jeśli Twój adres w IP oczekuje wartości Hue zamiast XRGB,
// możesz podstawić: u32 xrgb = hue_val;
u32 xrgb = 0x00<<24 | R<<16 | G<<8 | B; //00RGB
MYIP_mWriteReg(XPAR_MYIP_0_BASEADDR, MYIP_S00_AXI_SLV_REG0_OFFSET, xrgb);
xil_printf("Starting...\r\n");
displayport_init();
displayport_setup_interrupts();
vtc_init();
tpg_init();
xil_printf("Entire video pipeline activated\r\n");
cleanup_platform();
return 0;
}