Commit f04d2c0f authored by Léo-Paul Géneau's avatar Léo-Paul Géneau 👾

erp5_officejs_drone_simulator: refactor x-y-z / lat-lon-alt method/properies to be consistent

parent 3dd0da8e
...@@ -199,9 +199,9 @@ var DroneLogAPI = /** @class */ (function () { ...@@ -199,9 +199,9 @@ var DroneLogAPI = /** @class */ (function () {
DroneLogAPI.prototype.getCurrentPosition = function (x, y, z) { DroneLogAPI.prototype.getCurrentPosition = function (x, y, z) {
return { return {
x: x, latitude: x,
y: y, longitude: y,
z: z altitude: z
}; };
}; };
DroneLogAPI.prototype.getFlightParameters = function () { DroneLogAPI.prototype.getFlightParameters = function () {
......
...@@ -246,7 +246,7 @@ ...@@ -246,7 +246,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1010.13501.40623.51950</string> </value> <value> <string>1011.48679.53693.47701</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -266,7 +266,7 @@ ...@@ -266,7 +266,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1691588429.76</float> <float>1697030760.48</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -142,11 +142,11 @@ var FixedWingDroneAPI = /** @class */ (function () { ...@@ -142,11 +142,11 @@ var FixedWingDroneAPI = /** @class */ (function () {
}*/ }*/
if (drone_position) { if (drone_position) {
drone_info = { drone_info = {
'altitudeRel' : drone_position.z, 'altitudeRel' : drone_position.altitude,
'altitudeAbs' : _this._mapManager.getMapInfo().start_AMSL + 'altitudeAbs' : _this._mapManager.getMapInfo().start_AMSL +
drone_position.z, drone_position.altitude,
'latitude' : drone_position.x, 'latitude' : drone_position.latitude,
'longitude' : drone_position.y, 'longitude' : drone_position.longitude,
'yaw': drone.getYaw(), 'yaw': drone.getYaw(),
'speed': drone.getAirSpeed(), 'speed': drone.getAirSpeed(),
'climbRate': drone.getClimbRate() 'climbRate': drone.getClimbRate()
...@@ -188,10 +188,10 @@ var FixedWingDroneAPI = /** @class */ (function () { ...@@ -188,10 +188,10 @@ var FixedWingDroneAPI = /** @class */ (function () {
drone._targetCoordinates.z drone._targetCoordinates.z
), ),
bearing = this._computeBearing( bearing = this._computeBearing(
currentGeoCoordinates.x, currentGeoCoordinates.latitude,
currentGeoCoordinates.y, currentGeoCoordinates.longitude,
targetCoordinates.x, targetCoordinates.latitude,
targetCoordinates.y targetCoordinates.longitude
), ),
currentCosLat, currentCosLat,
currentLatRad, currentLatRad,
...@@ -228,10 +228,10 @@ var FixedWingDroneAPI = /** @class */ (function () { ...@@ -228,10 +228,10 @@ var FixedWingDroneAPI = /** @class */ (function () {
} }
newYawRad = this._toRad(newYaw); newYawRad = this._toRad(newYaw);
currentLatRad = this._toRad(currentGeoCoordinates.x); currentLatRad = this._toRad(currentGeoCoordinates.latitude);
currentCosLat = Math.cos(currentLatRad); currentCosLat = Math.cos(currentLatRad);
currentSinLat = Math.sin(currentLatRad); currentSinLat = Math.sin(currentLatRad);
currentLonRad = this._toRad(currentGeoCoordinates.y); currentLonRad = this._toRad(currentGeoCoordinates.longitude);
verticalSpeed = this._getVerticalSpeed(drone); verticalSpeed = this._getVerticalSpeed(drone);
groundSpeed = Math.sqrt( groundSpeed = Math.sqrt(
...@@ -502,11 +502,11 @@ var FixedWingDroneAPI = /** @class */ (function () { ...@@ -502,11 +502,11 @@ var FixedWingDroneAPI = /** @class */ (function () {
}; };
FixedWingDroneAPI.prototype.triggerParachute = function (drone) { FixedWingDroneAPI.prototype.triggerParachute = function (drone) {
var drone_pos = drone.getCurrentPosition(); var drone_pos = drone.getCurrentPosition();
drone.setTargetCoordinates(drone_pos.x, drone_pos.y, 5); drone.setTargetCoordinates(drone_pos.latitude, drone_pos.longitude, 5);
}; };
FixedWingDroneAPI.prototype.landed = function (drone) { FixedWingDroneAPI.prototype.landed = function (drone) {
var drone_pos = drone.getCurrentPosition(); var drone_pos = drone.getCurrentPosition();
return Math.floor(drone_pos.z) < 10; return Math.floor(drone_pos.altitude) < 10;
}; };
FixedWingDroneAPI.prototype.exit = function () { FixedWingDroneAPI.prototype.exit = function () {
return; return;
......
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1010.43751.23980.5597</string> </value> <value> <string>1011.48679.53693.47701</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1692888030.77</float> <float>1697030763.04</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -135,16 +135,18 @@ var DroneManager = /** @class */ (function () { ...@@ -135,16 +135,18 @@ var DroneManager = /** @class */ (function () {
/** /**
* Set a target point to move * Set a target point to move
*/ */
DroneManager.prototype.setTargetCoordinates = function (x, y, z) { DroneManager.prototype.setTargetCoordinates =
this._internal_setTargetCoordinates(x, y, z); function (latitude, longitude, altitude) {
this._internal_setTargetCoordinates(latitude, longitude, altitude);
}; };
DroneManager.prototype._internal_setTargetCoordinates = DroneManager.prototype._internal_setTargetCoordinates =
function (x, y, z, radius) { function (latitude, longitude, altitude, radius) {
if (!this._canPlay) { if (!this._canPlay) {
return; return;
} }
//convert real geo-coordinates to virtual x-y coordinates //convert real geo-coordinates to virtual x-y coordinates
this._targetCoordinates = this._API.processCoordinates(x, y, z); this._targetCoordinates =
this._API.processCoordinates(latitude, longitude, altitude);
return this._API.internal_setTargetCoordinates( return this._API.internal_setTargetCoordinates(
this, this,
this._targetCoordinates, this._targetCoordinates,
...@@ -296,8 +298,14 @@ var DroneManager = /** @class */ (function () { ...@@ -296,8 +298,14 @@ var DroneManager = /** @class */ (function () {
/** /**
* Make the drone loiter (circle with a set radius) * Make the drone loiter (circle with a set radius)
*/ */
DroneManager.prototype.loiter = function (x, y, z, radius) { DroneManager.prototype.loiter =
this._internal_setTargetCoordinates(x, y, z, radius); function (latitude, longitude, altitude, radius) {
this._internal_setTargetCoordinates(
latitude,
longitude,
altitude,
radius
);
}; };
DroneManager.prototype.getFlightParameters = function () { DroneManager.prototype.getFlightParameters = function () {
if (this._API.getFlightParameters) { if (this._API.getFlightParameters) {
...@@ -436,7 +444,7 @@ var MapManager = /** @class */ (function () { ...@@ -436,7 +444,7 @@ var MapManager = /** @class */ (function () {
this.map_info.initial_position = this.convertToLocalCoordinates( this.map_info.initial_position = this.convertToLocalCoordinates(
initial_position.latitude, initial_position.latitude,
initial_position.longitude, initial_position.longitude,
initial_position.z initial_position.altitude
); );
}; };
MapManager.prototype.getMapInfo = function () { MapManager.prototype.getMapInfo = function () {
...@@ -485,9 +493,9 @@ var MapManager = /** @class */ (function () { ...@@ -485,9 +493,9 @@ var MapManager = /** @class */ (function () {
this.map_info.min_y; this.map_info.min_y;
lat = 90 - lat / (this.map_info.map_size / 180.0); lat = 90 - lat / (this.map_info.map_size / 180.0);
return { return {
x: lat, latitude: lat,
y: lon, longitude: lon,
z: z altitude: z
}; };
}; };
return MapManager; return MapManager;
...@@ -666,7 +674,7 @@ var GameManager = /** @class */ (function () { ...@@ -666,7 +674,7 @@ var GameManager = /** @class */ (function () {
queue.push(function () { queue.push(function () {
drone._tick += 1; drone._tick += 1;
if (drone._API.isCollidable && drone.can_play) { if (drone._API.isCollidable && drone.can_play) {
if (drone.getCurrentPosition().z <= 0) { if (drone.getCurrentPosition().altitude <= 0) {
drone._internal_crash(new Error('Drone ' + drone.id + drone._internal_crash(new Error('Drone ' + drone.id +
' touched the floor.')); ' touched the floor.'));
} else { } else {
...@@ -718,8 +726,9 @@ var GameManager = /** @class */ (function () { ...@@ -718,8 +726,9 @@ var GameManager = /** @class */ (function () {
drone_position.z drone_position.z
); );
game_manager._flight_log[index].push([ game_manager._flight_log[index].push([
game_manager._game_duration, geo_coordinates.x, game_manager._game_duration, geo_coordinates.latitude,
geo_coordinates.y, map_info.start_AMSL + drone_position.z, geo_coordinates.longitude,
map_info.start_AMSL + drone_position.z,
drone_position.z, drone.getYaw(), drone.getGroundSpeed(), drone_position.z, drone.getYaw(), drone.getGroundSpeed(),
drone.getClimbRate() drone.getClimbRate()
]); ]);
...@@ -1013,6 +1022,7 @@ var GameManager = /** @class */ (function () { ...@@ -1013,6 +1022,7 @@ var GameManager = /** @class */ (function () {
try { try {
eval(code_eval); eval(code_eval);
} catch (error) { } catch (error) {
console.error(error);
eval(base); eval(base);
} }
/*jslint evil: false*/ /*jslint evil: false*/
......
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1010.42341.16308.11025</string> </value> <value> <string>1011.48744.22696.33177</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -260,7 +260,7 @@ ...@@ -260,7 +260,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1692802878.6</float> <float>1697032866.09</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
(function (window, RSVP, rJS, domsugar, document, Blob) { /*jslint indent: 2, maxlen: 100*/
/*global window, rJS, domsugar, document*/
(function (window, rJS, domsugar, document) {
"use strict"; "use strict";
var SIMULATION_SPEED = 200, var SIMULATION_SPEED = 200,
...@@ -40,7 +42,7 @@ ...@@ -40,7 +42,7 @@
}) })
.declareMethod('render', function render() { .declareMethod('render', function render() {
var gadget = this, query; var gadget = this;
return gadget.getDeclaredGadget('form_view') return gadget.getDeclaredGadget('form_view')
.push(function (form_gadget) { .push(function (form_gadget) {
return form_gadget.render({ return form_gadget.render({
...@@ -90,7 +92,7 @@ ...@@ -90,7 +92,7 @@
group_list: [[ group_list: [[
"left", "left",
[["my_log_1"], ["my_simulation_speed"]] [["my_log_1"], ["my_simulation_speed"]]
],[ ], [
"right", "right",
[["my_log_2"]] [["my_log_2"]]
]] ]]
...@@ -106,7 +108,9 @@ ...@@ -106,7 +108,9 @@
}) })
.declareJob('runGame', function runGame(options) { .declareJob('runGame', function runGame(options) {
var gadget = this, simulator, log_1_entry_list, log_2_entry_list; var gadget = this, dist, fragment = gadget.element.querySelector('.simulator_div'),
game_parameters_json, log_1_entry_list, log_2_entry_list, map_info,
span = document.querySelector('#distance');
function latLonDistance(c1, c2) { function latLonDistance(c1, c2) {
var R = 6371e3, var R = 6371e3,
q1 = c1[0] * Math.PI / 180, q1 = c1[0] * Math.PI / 180,
...@@ -123,21 +127,18 @@ ...@@ -123,21 +127,18 @@
var i, line_list = log.split('\n'), log_entry_list = [], log_entry, var i, line_list = log.split('\n'), log_entry_list = [], log_entry,
log_header_found; log_header_found;
for (i = 0; i < line_list.length; i += 1) { for (i = 0; i < line_list.length; i += 1) {
if (!log_header_found && !line_list[i].includes("timestamp (ms);")) { if (log_header_found || line_list[i].includes("timestamp (ms);")) {
continue;
} else {
log_header_found = true; log_header_found = true;
} if (line_list[i].indexOf("AMSL") < 0 &&
if (line_list[i].indexOf("AMSL") >= 0 || line_list[i].includes(";")) {
!line_list[i].includes(";")) {
continue;
}
log_entry = line_list[i].trim(); log_entry = line_list[i].trim();
if (log_entry) { if (log_entry) {
log_entry = log_entry.split(';'); log_entry = log_entry.split(';');
log_entry_list.push(log_entry); log_entry_list.push(log_entry);
} }
} }
}
}
return log_entry_list; return log_entry_list;
} }
function averageLogDistance(a, b, z) { function averageLogDistance(a, b, z) {
...@@ -146,15 +147,15 @@ ...@@ -146,15 +147,15 @@
Math.pow(p1[1] - p2[1], 2) + Math.pow(p1[1] - p2[1], 2) +
Math.pow(p1[2] - p2[2], 2)); Math.pow(p1[2] - p2[2], 2));
} }
var i, sum = 0, point_a, point_b, penalization = 0, length; var d, i, sum = 0, point_a, point_b, penalization = 0, length;
for (i = 0; i < a.length; i++) { for (i = 0; i < a.length; i += 1) {
if (b[i]) { if (b[i]) {
point_a = [a[i][1], a[i][1]]; point_a = [a[i][1], a[i][1]];
point_b = [b[i][1], b[i][1]]; point_b = [b[i][1], b[i][1]];
if (z) { if (z) {
sum += distance3D(point_a, point_b); sum += distance3D(point_a, point_b);
} else { } else {
var d = latLonDistance(point_a, point_b); d = latLonDistance(point_a, point_b);
sum += d; sum += d;
} }
} }
...@@ -168,14 +169,12 @@ ...@@ -168,14 +169,12 @@
} }
log_1_entry_list = getLogEntries(options.log_1); log_1_entry_list = getLogEntries(options.log_1);
log_2_entry_list = getLogEntries(options.log_2); log_2_entry_list = getLogEntries(options.log_2);
var span = document.querySelector('#distance'),
dist = averageLogDistance(log_1_entry_list, log_2_entry_list, false); dist = averageLogDistance(log_1_entry_list, log_2_entry_list, false);
if (isNaN(dist)) { if (isNaN(dist)) {
return gadget.notifySubmitted({message: 'Invalid log content', status: 'error'}); return gadget.notifySubmitted({message: 'Invalid log content', status: 'error'});
} }
span.textContent = 'Average flights distance: ' + span.textContent = 'Average flights distance: ' +
Math.round(dist * 100) / 100; Math.round(dist * 100) / 100;
var fragment = gadget.element.querySelector('.simulator_div');
fragment = domsugar(gadget.element.querySelector('.simulator_div'), fragment = domsugar(gadget.element.querySelector('.simulator_div'),
[domsugar('div')]).firstElementChild; [domsugar('div')]).firstElementChild;
DRONE_LIST[0].log_content = options.log_1; DRONE_LIST[0].log_content = options.log_1;
...@@ -184,11 +183,19 @@ ...@@ -184,11 +183,19 @@
var all = list_1.concat(list_2), i, var all = list_1.concat(list_2), i,
min_lat = 999, min_lon = 999, min_lat = 999, min_lon = 999,
max_lat = 0, max_lon = 0; max_lat = 0, max_lon = 0;
for (i = 0; i < all.length; i+=1) { for (i = 0; i < all.length; i += 1) {
if (all[i][1] < min_lat) min_lat = all[i][1]; if (all[i][1] < min_lat) {
if (all[i][1] > max_lat) max_lat = all[i][1]; min_lat = all[i][1];
if (all[i][2] < min_lon) min_lon = all[i][2]; }
if (all[i][2] > max_lon) max_lon = all[i][2]; if (all[i][1] > max_lat) {
max_lat = all[i][1];
}
if (all[i][2] < min_lon) {
min_lon = all[i][2];
}
if (all[i][2] > max_lon) {
max_lon = all[i][2];
}
} }
return { return {
"min_lat": min_lat, "min_lat": min_lat,
...@@ -198,10 +205,10 @@ ...@@ -198,10 +205,10 @@
"start_AMSL": all[0][3] - all[0][4], "start_AMSL": all[0][3] - all[0][4],
"init_pos_lat": all[0][1], "init_pos_lat": all[0][1],
"init_pos_lon": all[0][2], "init_pos_lon": all[0][2],
"init_pos_z": all[0][4] "init_pos_alt": all[0][4]
}; };
} }
var map_info = generateMapInfo(log_1_entry_list, log_2_entry_list); map_info = generateMapInfo(log_1_entry_list, log_2_entry_list);
options.min_lat = map_info.min_lat; options.min_lat = map_info.min_lat;
options.max_lat = map_info.max_lat; options.max_lat = map_info.max_lat;
options.min_lon = map_info.min_lon; options.min_lon = map_info.min_lon;
...@@ -210,8 +217,8 @@ ...@@ -210,8 +217,8 @@
options.start_AMSL = map_info.start_AMSL; options.start_AMSL = map_info.start_AMSL;
options.init_pos_lon = map_info.init_pos_lon; options.init_pos_lon = map_info.init_pos_lon;
options.init_pos_lat = map_info.init_pos_lat; options.init_pos_lat = map_info.init_pos_lat;
options.init_pos_z = map_info.init_pos_z; options.init_pos_alt = map_info.init_pos_alt;
var game_parameters_json = { game_parameters_json = {
"drone": { "drone": {
"maxAcceleration": 1, "maxAcceleration": 1,
"maxSpeed": 1 "maxSpeed": 1
...@@ -233,7 +240,7 @@ ...@@ -233,7 +240,7 @@
"initialPosition": { "initialPosition": {
"longitude": parseFloat(options.init_pos_lon), "longitude": parseFloat(options.init_pos_lon),
"latitude": parseFloat(options.init_pos_lat), "latitude": parseFloat(options.init_pos_lat),
"z": parseFloat(options.init_pos_z) "altitude": parseFloat(options.init_pos_alt)
}, },
"draw_flight_path": DRAW, "draw_flight_path": DRAW,
"log_drone_flight": LOG, "log_drone_flight": LOG,
...@@ -288,4 +295,4 @@ ...@@ -288,4 +295,4 @@
}); });
}); });
}(window, RSVP, rJS, domsugar, document, Blob)); }(window, rJS, domsugar, document));
\ No newline at end of file \ No newline at end of file
...@@ -232,7 +232,7 @@ ...@@ -232,7 +232,7 @@
</item> </item>
<item> <item>
<key> <string>actor</string> </key> <key> <string>actor</string> </key>
<value> <string>zope</string> </value> <value> <unicode>zope</unicode> </value>
</item> </item>
<item> <item>
<key> <string>comment</string> </key> <key> <string>comment</string> </key>
...@@ -246,7 +246,7 @@ ...@@ -246,7 +246,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1006.43898.62059.64102</string> </value> <value> <string>1011.48769.44767.36898</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -266,7 +266,7 @@ ...@@ -266,7 +266,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1677600140.0</float> <float>1697034365.81</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
INITIAL_POSITION = { INITIAL_POSITION = {
"latitude": 45.6412, "latitude": 45.6412,
"longitude": 14.2658, "longitude": 14.2658,
"z": 15 "altitude": 15
}, },
NUMBER_OF_DRONES = 2, NUMBER_OF_DRONES = 2,
// Non-inputs parameters // Non-inputs parameters
...@@ -108,8 +108,8 @@ ...@@ -108,8 +108,8 @@
' if (me.next_checkpoint < CHECKPOINT_LIST.length) {\n' + ' if (me.next_checkpoint < CHECKPOINT_LIST.length) {\n' +
' me.current_position = me.getCurrentPosition();\n' + ' me.current_position = me.getCurrentPosition();\n' +
' me.distance = distance(\n' + ' me.distance = distance(\n' +
' me.current_position.x,\n' + ' me.current_position.latitude,\n' +
' me.current_position.y,\n' + ' me.current_position.longitude,\n' +
' CHECKPOINT_LIST[me.next_checkpoint].latitude,\n' + ' CHECKPOINT_LIST[me.next_checkpoint].latitude,\n' +
' CHECKPOINT_LIST[me.next_checkpoint].longitude\n' + ' CHECKPOINT_LIST[me.next_checkpoint].longitude\n' +
' );\n' + ' );\n' +
...@@ -387,14 +387,14 @@ ...@@ -387,14 +387,14 @@
"hidden": 0, "hidden": 0,
"type": "FloatField" "type": "FloatField"
}, },
"my_init_pos_z": { "my_init_pos_alt": {
"description": "", "description": "",
"title": "Initial drone position Z", "title": "Initial drone altitude",
"default": INITIAL_POSITION.z, "default": INITIAL_POSITION.altitude,
"css_class": "", "css_class": "",
"required": 1, "required": 1,
"editable": 1, "editable": 1,
"key": "init_pos_z", "key": "init_pos_alt",
"hidden": 0, "hidden": 0,
"type": "FloatField" "type": "FloatField"
}, },
...@@ -434,7 +434,7 @@ ...@@ -434,7 +434,7 @@
[["my_simulation_speed"], ["my_simulation_time"], ["my_number_of_drones"], [["my_simulation_speed"], ["my_simulation_time"], ["my_number_of_drones"],
["my_minimum_latitud"], ["my_maximum_latitud"], ["my_minimum_latitud"], ["my_maximum_latitud"],
["my_minimum_longitud"], ["my_maximum_longitud"], ["my_minimum_longitud"], ["my_maximum_longitud"],
["my_init_pos_lat"], ["my_init_pos_lon"], ["my_init_pos_z"], ["my_init_pos_lat"], ["my_init_pos_lon"], ["my_init_pos_alt"],
["my_map_height"]] ["my_map_height"]]
], [ ], [
"right", "right",
...@@ -498,7 +498,7 @@ ...@@ -498,7 +498,7 @@
"initialPosition": { "initialPosition": {
"longitude": parseFloat(options.init_pos_lon), "longitude": parseFloat(options.init_pos_lon),
"latitude": parseFloat(options.init_pos_lat), "latitude": parseFloat(options.init_pos_lat),
"z": parseFloat(options.init_pos_z) "altitude": parseFloat(options.init_pos_alt)
}, },
"draw_flight_path": DRAW, "draw_flight_path": DRAW,
"temp_flight_path": true, "temp_flight_path": true,
......
...@@ -246,7 +246,7 @@ ...@@ -246,7 +246,7 @@
</item> </item>
<item> <item>
<key> <string>serial</string> </key> <key> <string>serial</string> </key>
<value> <string>1009.59163.16294.47701</string> </value> <value> <string>1011.48716.48246.13943</string> </value>
</item> </item>
<item> <item>
<key> <string>state</string> </key> <key> <string>state</string> </key>
...@@ -266,7 +266,7 @@ ...@@ -266,7 +266,7 @@
</tuple> </tuple>
<state> <state>
<tuple> <tuple>
<float>1690477710.21</float> <float>1697031250.03</float>
<string>UTC</string> <string>UTC</string>
</tuple> </tuple>
</state> </state>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment