Need some help with servo code

trying to get this code to work... everything works exept the servo movement.
if i put start degree 45 target degree 90 in the web ui the servo should move back and forth between those degrees, but it moves in this pattern 90(startup possition) 45-90-0-90 but i want it to move
90(startup possition)45-90-45-90 and so on i would also be able to make servo move 90-45-90-45 what am i missing

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Servo.h>
#include <EEPROM.h>

const char* ssid = "ssid";
const char* password = "password";
ESP8266WebServer server(80);
Servo servo;

int startDegree = 0;
int targetDegree = 0;
int speed = 100;
bool movingForward = true;
bool moving = false;
int servoMinDegree = 0;
int servoMaxDegree = 180;
bool isCentered = false;

String message = "";

void setup(void) {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  if (MDNS.begin("Warriflow")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", HTTP_GET, handleRoot);
  server.on("/moveServo", HTTP_GET, handleMoveServo);
  server.on("/centerServo", HTTP_GET, centerServo);
  server.begin();
  Serial.println("HTTP server started");

  servo.attach(D1, 500, 3900);
  servo.write(startDegree);
  delay(1000);
}

void loop(void) {
  if (!isCentered && moving) {
    if (movingForward) {
      startDegree++;
      if (startDegree >= targetDegree) {
        if (targetDegree == servoMinDegree) {
          targetDegree = servoMaxDegree;
        } else {
          movingForward = false;
        }
      }
    } else {
      startDegree--;
      if (startDegree <= 0) {
        if (targetDegree == servoMaxDegree) {
          targetDegree = servoMinDegree;
        } else {
          movingForward = true;
        }
      }
    }
    servo.write(startDegree);
    delay(speed);
  }

  server.handleClient();
  if (!MDNS.update()) {
    Serial.println("MDNS update failed");
  }
}

void handleRoot() {
  String message = "";
  message += "<html><head>";
  message += "<meta charset='UTF-8'>";
  message += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  message += "<title>Warriflow v1.1</title>";
  message += "<style>";
  message += "body {";
  message += "  font-family: Arial, sans-serif;";
  message += "  background-color: #f2f2f2;";
  message += "  text-align: center;";
  message += "}";
  message += ".container {";
  message += "  max-width: 400px;";
  message += "  margin: 0 auto;";
  message += "  padding: 20px;";
  message += "  background-color: #fff;";
  message += "  border-radius: 10px;";
  message += "  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);";
  message += "}";
  message += "h1 {";
  message += "  color: #008CBA;";
  message += "}";
  message += ".button {";
  message += "  background-color: #008CBA;";
  message += "  color: white;";
  message += "  border: none;";
  message += "  border-radius: 5px;";
  message += "  padding: 10px 20px;";
  message += "  font-size: 16px;";
  message += "  cursor: pointer;";
  message += "  margin-top: 10px;";
  message += "}";
  message += ".input-field {";
  message += "  display: block;";
  message += "  width: 100%;";
  message += "  margin-top: 10px;";
  message += "  padding: 5px;";
  message += "  border: 1px solid #ccc;";
  message += "  border-radius: 5px;";
  message += "}";
  message += "#message {";
  message += "  color: #008CBA;";
  message += "  font-weight: bold;";
  message += "  margin-top: 10px;";
  message += "  display: none;"; // Dölj meddelandet som standard
  message += "}";
  message += "</style>";
  message += "</head><body>";
  message += "<div class='container'>";
  message += "<h1>Warriflow v1.1</h1>";
  message += "<p id='message'></p>";
  message += "<form id='servoForm'>";
  message += "<label for='startDegree'>Start Degree:</label>";
  message += "<input type='number' id='startDegree' name='startDegree' value='" + String(startDegree) + "' class='input-field'><br>";
  message += "<label for='targetDegree'>Target Degree:</label>";
  message += "<input type='number' id='targetDegree' name='targetDegree' value='" + String(targetDegree) + "' class='input-field'><br>";
  message += "<label for='speed'>Speed:</label>";
  message += "<input type='number' id='speed' name='speed' value='" + String(speed) + "' class='input-field'><br>";
  message += "<input type='button' class='button' value='Enter' onclick='moveServo()'>";
  message += "</form>";
  message += "<button class='button' onclick='centerServo()'>Center Servo</button>";
  message += "</div>";
  message += "<script>";
  message += "function showMessage(messageText) {";
  message += "  var messageElement = document.getElementById('message');";
  message += "  messageElement.textContent = messageText;";
  message += "  messageElement.style.display = 'block';";
  message += "  setTimeout(function() { clearMessage(); }, 10000);"; // Visa meddelandet i 10 sekunder
  message += "}";
  message += "function clearMessage() {";
  message += "  var messageElement = document.getElementById('message');";
  message += "  messageElement.textContent = '';";
  message += "  messageElement.style.display = 'none';";
  message += "}";
  message += "function centerServo() {";
  message += "  var xhr = new XMLHttpRequest();";
  message += "  xhr.onreadystatechange = function() {";
  message += "    if (xhr.readyState === 4 && xhr.status === 200) {";
  message += "      showMessage(xhr.responseText);";
  message += "    }";
  message += "  };";
  message += "  xhr.open('GET', '/centerServo', true);";
  message += "  xhr.send();";
  message += "  return false;";
  message += "}";
  message += "function moveServo() {";
  message += "  var xhr = new XMLHttpRequest();";
  message += "  xhr.onreadystatechange = function() {";
  message += "    if (xhr.readyState === 4 && xhr.status === 200) {";
  message += "      showMessage(xhr.responseText);";
  message += "    }";
  message += "  };";
  message += "  var form = document.getElementById('servoForm');";
  message += "  var formData = new FormData(form);";
  message += "  xhr.open('GET', '/moveServo?' + new URLSearchParams(formData).toString(), true);";
  message += "  xhr.send();";
  message += "  return false;";
  message += "}";
  message += "</script>";
  message += "</body></html>";
  server.send(200, "text/html", message);
}

void handleMoveServo() {
  String startDegreeStr = server.arg("startDegree");
  String targetDegreeStr = server.arg("targetDegree");
  String speedStr = server.arg("speed");
  startDegree = startDegreeStr.toInt();
  targetDegree = targetDegreeStr.toInt();
  speed = speedStr.toInt();
  movingForward = true;
  moving = true;
  isCentered = false;
  message = "Servo is now moving ...";
  server.send(200, "text/html", message);
}

void centerServo() {
  startDegree = 90;
  servo.write(startDegree);
  isCentered = true;
  message = "Motor can be removed or mouted to bracket ...";
  server.send(200, "text/html", message);
}
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <Servo.h>
#include <EEPROM.h>

const char* ssid = "ssid";
const char* password = "password";
ESP8266WebServer server(80);
Servo servo;

int startDegree = 0;
int targetDegree = 0;
int speed = 100;
bool movingForward = true;
bool moving = false;
int servoMinDegree = 0;
int servoMaxDegree = 180;
bool isCentered = false;

void setup(void) {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  if (MDNS.begin("Warriflow")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", HTTP_GET, handleRoot);
  server.on("/moveServo", HTTP_GET, handleMoveServo);
  server.on("/centerServo", HTTP_GET, centerServo);
  server.begin();
  Serial.println("HTTP server started");

  servo.attach(D1, 500, 3900);
  servo.write(startDegree);
  delay(1000);
}

void loop(void) {
  static int currentPos = startDegree;
  if (moving) {
    if (movingForward) {
      if (currentPos == targetDegree) movingForward = false;
      else currentPos++;
    }
    else {
      if (currentPos == startDegree) movingForward = true;
      else currentPos--;
    }
    servo.write(currentPos);
    delay(speed);
  }

  server.handleClient();
  if (!MDNS.update()) {
    Serial.println("MDNS update failed");
  }
}

void handleRoot() {
  String message = "";
  message += "<html><head>";
  message += "<meta charset='UTF-8'>";
  message += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  message += "<title>Warriflow v1.1</title>";
  message += "<style>";
  message += "body {";
  message += "  font-family: Arial, sans-serif;";
  message += "  background-color: #f2f2f2;";
  message += "  text-align: center;";
  message += "}";
  message += ".container {";
  message += "  max-width: 400px;";
  message += "  margin: 0 auto;";
  message += "  padding: 20px;";
  message += "  background-color: #fff;";
  message += "  border-radius: 10px;";
  message += "  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);";
  message += "}";
  message += "h1 {";
  message += "  color: #008CBA;";
  message += "}";
  message += ".button {";
  message += "  background-color: #008CBA;";
  message += "  color: white;";
  message += "  border: none;";
  message += "  border-radius: 5px;";
  message += "  padding: 10px 20px;";
  message += "  font-size: 16px;";
  message += "  cursor: pointer;";
  message += "  margin-top: 10px;";
  message += "}";
  message += ".input-field {";
  message += "  display: block;";
  message += "  width: 100%;";
  message += "  margin-top: 10px;";
  message += "  padding: 5px;";
  message += "  border: 1px solid #ccc;";
  message += "  border-radius: 5px;";
  message += "}";
  message += "#message {";
  message += "  color: #008CBA;";
  message += "  font-weight: bold;";
  message += "  margin-top: 10px;";
  message += "  display: none;"; // Dölj meddelandet som standard
  message += "}";
  message += "</style>";
  message += "</head><body>";
  message += "<div class='container'>";
  message += "<h1>Warriflow v1.1</h1>";
  message += "<p id='message'></p>";
  message += "<form id='servoForm'>";
  message += "<label for='startDegree'>Start Degree:</label>";
  message += "<input type='number' id='startDegree' name='startDegree' value='" + String(startDegree) + "' class='input-field'><br>";
  message += "<label for='targetDegree'>Target Degree:</label>";
  message += "<input type='number' id='targetDegree' name='targetDegree' value='" + String(targetDegree) + "' class='input-field'><br>";
  message += "<label for='speed'>Speed:</label>";
  message += "<input type='number' id='speed' name='speed' value='" + String(speed) + "' class='input-field'><br>";
  message += "<input type='button' class='button' value='Enter' onclick='moveServo()'>";
  message += "</form>";
  message += "<button class='button' onclick='centerServo()'>Center Servo</button>";
  message += "</div>";
  message += "<script>";
  message += "function showMessage(messageText) {";
  message += "  var messageElement = document.getElementById('message');";
  message += "  messageElement.textContent = messageText;";
  message += "  messageElement.style.display = 'block';";
  message += "  setTimeout(function() { clearMessage(); }, 10000);"; // Visa meddelandet i 10 sekunder
  message += "}";
  message += "function clearMessage() {";
  message += "  var messageElement = document.getElementById('message');";
  message += "  messageElement.textContent = '';";
  message += "  messageElement.style.display = 'none';";
  message += "}";
  message += "function centerServo() {";
  message += "  var xhr = new XMLHttpRequest();";
  message += "  xhr.onreadystatechange = function() {";
  message += "    if (xhr.readyState === 4 && xhr.status === 200) {";
  message += "      showMessage(xhr.responseText);";
  message += "    }";
  message += "  };";
  message += "  xhr.open('GET', '/centerServo', true);";
  message += "  xhr.send();";
  message += "  return false;";
  message += "}";
  message += "function moveServo() {";
  message += "  var xhr = new XMLHttpRequest();";
  message += "  xhr.onreadystatechange = function() {";
  message += "    if (xhr.readyState === 4 && xhr.status === 200) {";
  message += "      showMessage(xhr.responseText);";
  message += "    }";
  message += "  };";
  message += "  var form = document.getElementById('servoForm');";
  message += "  var formData = new FormData(form);";
  message += "  xhr.open('GET', '/moveServo?' + new URLSearchParams(formData).toString(), true);";
  message += "  xhr.send();";
  message += "  return false;";
  message += "}";
  message += "</script>";
  message += "</body></html>";
  server.send(200, "text/html", message);
}

void handleMoveServo() {
  String startDegreeStr = server.arg("startDegree");
  String targetDegreeStr = server.arg("targetDegree");
  String speedStr = server.arg("speed");
  startDegree = startDegreeStr.toInt();
  targetDegree = targetDegreeStr.toInt();
  if (startDegree > targetDegree) {
    int x = startDegree;
    startDegree = targetDegree;
    targetDegree = x;
  }
  startDegree = max(servoMinDegree, startDegree);
  targetDegree = min(servoMaxDegree, targetDegree);
  speed = min(int(speedStr.toInt()), 499);
  movingForward = true;
  moving = true;
  isCentered = false;
  String message = "Servo is now moving ...";
  server.send(200, "text/html", message);
}

void centerServo() {
  startDegree = 90;
  servo.write(startDegree);
  isCentered = true;
  moving = false;
  String message = "Motor can be removed or mouted to bracket ...";
  server.send(200, "text/html", message);
}

500 and especially 3900 are very extreme values (3900 is limited to 3000 by the lib ). Are you sure your servo can handle these values?
Be aware, the values of 0 and 180 degree are changed to µs pulse values, and this is also influenced by the values you give here ( 0 degree=500µs pulse, 180 degree = 3900 µs pulse).
The real degree is also highly dependent of the servo. Which servo are you using?

Hello Krheigh

I´ve a simple question for better understanding of the purpose of sketch.
Does the servo shall have a positioning plan depending on the time:

45->90->0->90 or 45->90->45->90 degree

controlled via a variable?

Have a nice day and enjoy coding in C++.