Kyle Foley Kyle Foley - 3 months ago 16
jQuery Question

Updating varibles and running functions using setTimeout

I'm trying to send a drone a new set of coordinates every 1/2 of a second. Right now, it's not working the way I planned on it working (aka it's not working at all). I have 90 different Lat, Long, and Alt coordinates all predetermined inside my .js file. They are listed like this-

setTimeout(function () {long_in=-74.61122515230907;lat_in=41.05861743700108;alt_in=10}, 5000);
setTimeout(function () {long_in=-74.61124258212661;lat_in=41.05864962647036;alt_in=10}, 10000);
setTimeout(function () {long_in=-74.61125021662482;lat_in=41.05867214783328;alt_in=10}, 15000);


and so on...

Then they will need to pass thru this function -

if (coordinate == "GPS") {
console.log("GPS go");
lat_out = lat_in;
long_out = long_in;
alt_out = alt_in;
console.log(lat_out, long_out, alt_out)
}


And finally it will send this command to the drone-

var msgdata = {};
msgdata["twist"] = {};
msgdata.twist["twist"] = {};
msgdata.twist.twist["linear"] = {};
msgdata.twist.twist.linear["x"] = lat_out;
msgdata.twist.twist.linear["y"] = long_out;
msgdata.twist.twist.linear["z"] = alt_out;
msgdata.twist.twist["angular"] = {};
msgdata.twist.twist.angular["z"] = 1.00;
msgdata["tolerance"] = 2.00;
msgdata["async"] = true;
msgdata["relative"] = false;
msgdata["yaw_valid"] = true;
msgdata["body_frame"] = false;

$.ajax({
type: "POST",
dataType: "json",
data: JSON.stringify(msgdata),
url: "http://" + ip + "/ros/" + namespace + "/navigation/position_set",
success: function (data) {
console.log(data, "Coordinates sent", lat_out,long_out,alt_out);
}
});


I have defined all of my variables prior to this code globally. All of the commands work perfectly fine, I just can't get them to all refresh every 1/2 of a second. Do I need to have all of these commands inside every
setTimeout
or something? Thanks for the help.

Answer

Yes you need to make the call again and again. You could wrap it in a function and make the call happen again and again from the setTimeout.

I have created a callback chain to guarantee order of execution based on @Liam's recommendation and the comments discussion.

setTimeout(function() {
  long_in = -74.61122515230907;
  lat_in = 41.05861743700108;
  alt_in = 10;
  prepSignal(long_in, lat_in, alt_in, function() {
    setTimeout(function() {
      long_in = -74.61124258212661;
      lat_in = 41.05864962647036;
      alt_in = 10;
      prepSignal(long_in, lat_in, alt_in, function() {
        setTimeout(function() {
          long_in = -74.61125021662482;
          lat_in = 41.05867214783328;
          alt_in = 10;
          prepSignal(long_in, lat_in, alt_in);
        }, 5000);
      });
    }, 5000);
  });
}, 5000);


var coordinate = "GPS";

function prepSignal(long_in, lat_in, alt_in, callback) {
  if (coordinate == "GPS") {
    console.log("GPS go");
    lat_out = lat_in;
    long_out = long_in;
    alt_out = alt_in;
    console.log(lat_out, long_out, alt_out, callback);
    sendSignal(long_in, lat_in, alt_in, callback);

  }

  function sendSignal(long_in, lat_in, alt_in, cb) {
    var msgdata = {};
    msgdata["twist"] = {};
    msgdata.twist["twist"] = {};
    msgdata.twist.twist["linear"] = {};
    msgdata.twist.twist.linear["x"] = lat_out;
    msgdata.twist.twist.linear["y"] = long_out;
    msgdata.twist.twist.linear["z"] = alt_out;
    msgdata.twist.twist["angular"] = {};
    msgdata.twist.twist.angular["z"] = 1.00;
    msgdata["tolerance"] = 2.00;
    msgdata["async"] = true;
    msgdata["relative"] = false;
    msgdata["yaw_valid"] = true;
    msgdata["body_frame"] = false;

    $.ajax({
      type: "POST",
      dataType: "json",
      data: JSON.stringify(msgdata),
      url: "http://" + ip + "/ros/" + namespace + "/navigation/position_set",
      success: function(data) {
        console.log(data, "Coordinates sent", lat_out, long_out, alt_out);
      if(cb && typeof cb == "function") {
          cb();
      }

      }
    });
  }
}