#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
// TFT pinnen aanpassen aan jouw setup
#define TFT_CS     10
#define TFT_RST    8
#define TFT_DC     9
#define SWRalarm   A3         // SWR >3  alarm output
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
int fwdPin = A0;
int refPin = A1;
int peakFwd = 0;
int peakRef = 0;
void setup() {
  tft.initR(INITR_BLACKTAB);
  tft.setRotation(1);
  tft.fillScreen(ST77XX_BLACK);
  tft.setTextSize(1);
  tft.setTextColor(ST77XX_WHITE);
  pinMode            (SWRalarm, OUTPUT);
  digitalWrite       (SWRalarm, LOW); // standaard uit
}
uint16_t getGradientColor(int percent) {
  // Groen naar rood
  uint8_t r = (percent * 255) / 100;
  uint8_t g = 255 - (percent * 255 / 100);
  return tft.color565(r, g, 0);
}
void drawProgressBar(int x, int y, int w, int h, int percent) {
  tft.drawRect(x, y, w, h, ST77XX_WHITE);
  int fill = (percent * (w - 2)) / 100;
  for (int i = 0; i < fill; i++) {
    int p = (i * 100) / (w - 2);
    uint16_t color = getGradientColor(p);
    tft.drawFastVLine(x + 1 + i, y + 1, h - 2, color);
  }
  tft.fillRect(x + 1 + fill, y + 1, (w - 2) - fill, h - 2, ST77XX_BLACK);
}
void drawSWRScale() {
  float swrValues[] = {1.0, 2.0, 3.0, 5.0, 7.0, 10.0};
  int numValues = sizeof(swrValues) / sizeof(swrValues[0]);
  int barStartX = 10;
  int barEndX = 150;
  int barY = 96; // onderkant van de VU-meter
  int labelY = barY + 10;
  float logMin = log10(1.0);
  float logMax = log10(10.0);
  for (int i = 0; i < numValues; i++) {
    float swr = swrValues[i];
    float logSWR = log10(swr);
    float ratio = (logSWR - logMin) / (logMax - logMin);
    int x = barStartX + ratio * (barEndX - barStartX);
    // Teken streepje
    tft.drawFastVLine(x, barY - 2, 4, ST77XX_WHITE);
    // Teken label
    tft.setCursor(x - 2, labelY-4);
    tft.setTextColor(ST77XX_WHITE);
    tft.setTextSize(0);
    tft.print(swr, 0);
  }
}
void loop() {
  int fwdRaw = analogRead(fwdPin);
  int refRaw = analogRead(refPin);
  int fwdLevel = map(fwdRaw, 0, 1023, 0, 100);
  int refLevel = map(refRaw, 0, 1023, 0, 100);
  int forwardRaw = analogRead(fwdPin);    // A0
  int reflectedRaw = analogRead(refPin);  // A1
  // Vermogen schatten (optioneel lineariseren of kalibreren)
  float forward = (float)forwardRaw;
  float reflected = (float)reflectedRaw;
  // Power-berekening
  float forwardVoltage = forwardRaw * ((1000.0/1023) / 5.0); // lineair: 5V = 1000W
  float forwardPower = (forwardVoltage * forwardVoltage) / 50.0;   // bij 50 ohm belasting
  // SWR-berekening
  float swr;
  if (forward > reflected) {
    swr = (forward + reflected) / (forward - reflected);
  } else {
    swr = 99.9; // Onrealistische waarde, geeft aan dat iets mis is
  }
  if (swr > 3.0) {
    digitalWrite(SWRalarm, HIGH); // waarschuwing aan
  } else {
    digitalWrite(SWRalarm, LOW);  // waarschuwing uit
  }
  // Beperk SWR tot max 10 voor display
  if (swr > 10.0) swr = 10.0;
  int swrPercent = (int)(log10(swr) * 100.0 / log10(10.0)); // 0–100%
  // Piekdetectie
  if (fwdLevel > peakFwd) peakFwd = fwdLevel;
  else peakFwd--;
  if (refLevel > peakRef) peakRef = refLevel;
  else peakRef--;
  // Teken VU-balken
  drawProgressBar(10, 15, 150, 15, fwdLevel);
  drawProgressBar(10, 35, 150, 15, refLevel);
  drawProgressBar(10, 80, 150, 15, swrPercent);
  // Teken piek
  int peakXfwd = 10 + (peakFwd * 150 / 100);
  int peakXrev = 10 + (peakRef * 150 / 100);
  tft.drawLine(peakXfwd, 15, peakXfwd, 29, ST77XX_WHITE);
  tft.drawLine(peakXrev, 35, peakXrev, 49, ST77XX_WHITE);
  drawSWRScale();
  // Geef Power op scherm weer
  tft.setCursor(10, 54);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(2);
  tft.print("PWR: ");
  tft.fillRect(58, 54, 112, 15, ST77XX_BLACK); // wissen
  tft.print(forwardPower, 0);
  // Geef SWR op scherm weer
  tft.setCursor(10, 112);
  tft.setTextColor(ST77XX_WHITE);
  tft.setTextSize(2);
  tft.print("SWR: ");
  tft.fillRect(58, 112, 112, 15, ST77XX_BLACK); // wissen
  tft.print(swr, 2);
  // Labels
  tft.setTextSize(1);
  //tft.setCursor(130, 15);
  //tft.print("Fwd");
  //tft.setCursor(130, 35);
  //tft.print("Ref");
  tft.setTextSize(0);
  tft.setCursor(10, 100);
  //int swrPercent = (int)(log10(swr) * 100.0 / log10(10.0)); // 0–100%
  //tft.print("1 2 3 4 5 6 7 8 9 10");
  delay(50);
}