Commit 7f92886e authored by Roque's avatar Roque

erp5_drone_simulator: get rid of rescue swarm dependency

parent 32942581
......@@ -11,7 +11,95 @@ var runGame, updateGame, eventGame, game_manager_instance;
"use strict";
console.log('game logic');
runGame = function (canvas, script, game_parameters_json, log) {
runGame = function (canvas, script, log) {
var game_parameters_json = {
"distances": {
"communication": 99999,
"control": 1500,
"information": 5
},
"drone": {
"maxAcceleration": 1,
"maxSpeed": 16.666667,
"collisionSector": 0.25,
"broadcastingTime": 1000,
"viewAngle": 60
},
"meteo": 0.5,
"derive": {
"speed": 0.1,
"direction": {
"x": 1,
"y": 0.5
}
},
"gameTime": 1800,
"goalDiameter": 7,
"goalPositionLeftTeam": {
"x": 0,
"y": 0,
"z": 0.6
},
"goalPositionRightTeam": {
"x": 0,
"y": 0,
"z": 0.6
},
"latency": {
"information": 0,
"communication": 0
},
"mapSize": {
"depth": 1000,
"height": 100,
"width": 1000
},
"obstacles": [],
"initialHumanAreaPosition": {
"x": -400,
"y": 400,
"z": 0
},
"randomSpawn": {
"leftTeam": {
"position": {
"x": 0,
"y": 0,
"z": 20
},
"dispertion": {
"x": 8,
"y": 8,
"z": 6
},
"types": [
"DroneAaileFixeAPI",
"DroneLogAPI",
"DroneAPI"
]
},
"rightTeam": {
"position": {
"x": -400,
"y": 400,
"z": 0
},
"dispertion": {
"x": 100,
"y": 100,
"z": 0.1
}
}
},
"teamSize": 2,
"dronesPosition": {
"x": 0,
"y": 0,
"z": 20
},
"droneList": ["DroneAaileFixeAPI", "DroneLogAPI"]
};
function processLog(game_parameters_json, log) {
var MAP_SIZE = 1000,
......@@ -196,9 +284,6 @@ var runGame, updateGame, eventGame, game_manager_instance;
};
game_parameters_json.drone.maxSpeed = (flight_dist / flight_time) * SPEED_FACTOR;
game_parameters_json.flight_path_point_list = path_point_list;
/*game_parameters_json.randomSpawn.leftTeam.position.x = start_position[0];
game_parameters_json.randomSpawn.leftTeam.position.y = start_position[1];
game_parameters_json.randomSpawn.leftTeam.position.z = start_position[2];*/
game_parameters_json.dronesPosition.x = start_position[0];
game_parameters_json.dronesPosition.y = start_position[1];
game_parameters_json.dronesPosition.z = start_position[2];
......@@ -214,7 +299,9 @@ var runGame, updateGame, eventGame, game_manager_instance;
game_parameters_json.randomSpawn.rightTeam.position.y = destination[1];
return game_parameters_json;
}
game_parameters_json = processLog(game_parameters_json, log);
if (!game_manager_instance) {
game_manager_instance = new GameManager(canvas, script,
game_parameters_json, 5);
......
......@@ -244,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>1003.17407.48631.50875</string> </value>
<value> <string>1003.18677.8071.57617</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -262,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1664386550.2</float>
<float>1664462737.31</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -148,7 +148,6 @@
width: options.width,
height: options.height,
script: options.script,
game_parameters_json: options.game_parameters_json,
log: options.log
}, [options.canvas]);
break;
......@@ -273,6 +272,7 @@
/////////////////////////////////////////////////////////////////
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("jio_get", "jio_get")
.declareAcquiredMethod("jio_allDocs", "jio_allDocs")
.declareMethod('render', function renderHeader() {
var gadget = this,
......@@ -290,21 +290,19 @@
offscreen = canvas.transferControlToOffscreen();
//TODO this should be in game logic BUT gadget can't be accessed from WW
var script_content, game_parameters_json, log_content;
var script_content, log_content;
return new RSVP.Queue()
.push(function () {
return gadget.jio_get("rescue_swarm_script_module/" + "web_worker");
var query = '(portal_type:"Web Script") AND (reference:"loiter_flight_script")';
return gadget.jio_allDocs({query: query, select_list: ["text_content"]});
})
.push(function (script) {
script_content = script.text_content;
return gadget.jio_get("rescue_swarm_map_module/" + "compare_map");
.push(function (result) {
script_content = result.data.rows[0].value.text_content;
var query = '(portal_type:"Web Manifest") AND (reference:"loiter_flight_log")';
return gadget.jio_allDocs({query: query, select_list: ["text_content"]});
})
.push(function (parameters_doc) {
game_parameters_json = JSON.parse(parameters_doc.text_content);
return gadget.jio_get("rescue_swarm_script_module/" + "log_loiter");
})
.push(function (log) {
log_content = log.text_content;
.push(function (result) {
log_content = result.data.rows[0].value.text_content;
gadget.runGame({
logic_url: parameter_gamelogic,
......@@ -313,7 +311,6 @@
width: canvas.width,
height: canvas.height,
script: script_content,
game_parameters_json: game_parameters_json,
log: log_content
});
......
......@@ -244,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>1003.15820.63775.27392</string> </value>
<value> <string>1003.18672.40791.39372</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -262,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1664374475.4</float>
<float>1664462734.74</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -35,8 +35,7 @@ function mainToWorker(evt) {
return new RSVP.Queue()
.push(function () {
postMessage({'type': 'started'});
return runGame(offscreen_canvas, evt.data.script,
evt.data.game_parameters_json, evt.data.log);
return runGame(offscreen_canvas, evt.data.script, evt.data.log);
})
.push(function (result) {
return postMessage({'type': 'finished', 'result': result});
......
......@@ -244,7 +244,7 @@
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>1003.16068.56422.56064</string> </value>
<value> <string>1003.18677.12846.47872</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -262,7 +262,7 @@
</tuple>
<state>
<tuple>
<float>1664386491.83</float>
<float>1664462736.14</float>
<string>UTC</string>
</tuple>
</state>
......
......@@ -2,7 +2,7 @@
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Rescue Swarm Script" module="erp5.portal_type"/>
<global name="Web Manifest" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
......@@ -62,23 +62,24 @@
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>log_loiter</string> </value>
<value> <string>loiter_flight_log</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Loiter flight log. Corresponds to the flight for the script https://lab.nexedi.com/lpgeneau/flight-scripts/blob/update_loop/demo.js\n
\n
"demo flight" (where the drone is the leader so the code referring to the follower is not executed) using an API similar to the one used in the simulator.\n
The SR is at https://lab.nexedi.com/lpgeneau/slapos/tree/update_loop/software/js-drone (especially the modified worker.js).</string> </value>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>log_loiter</string> </value>
<value> <string>loiter_flight_log</string> </value>
</item>
<item>
<key> <string>language</string> </key>
......@@ -88,7 +89,13 @@ The SR is at https://lab.nexedi.com/lpgeneau/slapos/tree/update_loop/software/js
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Rescue Swarm Script</string> </value>
<value> <string>Web Manifest</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
......@@ -530,7 +537,13 @@ Taking off...\n
</item>
<item>
<key> <string>title</string> </key>
<value> <string>log_loiter</string> </value>
<value> <string>Loiter flight log</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>workflow_history</string> </key>
......@@ -563,6 +576,12 @@ Taking off...\n
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>processing_status_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
......@@ -608,7 +627,7 @@ Taking off...\n
</tuple>
<state>
<tuple>
<float>1660134705.82</float>
<float>1664461702.56</float>
<string>UTC</string>
</tuple>
</state>
......@@ -657,7 +676,7 @@ Taking off...\n
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>1002.23821.16502.25531</string> </value>
<value> <string>1003.18664.31618.1314</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -675,7 +694,70 @@ Taking off...\n
</tuple>
<state>
<tuple>
<float>1660839203.68</float>
<float>1664461961.24</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_processing_state</string> </key>
<value> <string>empty</string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1664461675.47</float>
<string>UTC</string>
</tuple>
</state>
......
const ALTITUDE_DIFF = 30,
FLIGH_ALTITUDE = 100,
PARACHUTE_ALTITUDE = 35,
EPSILON = 105,
EPSILON_YAW = 6,
EPSILON_ALTITUDE = 5,
TARGET_YAW = 0,
checkpoint_list = [
{
"latitude": 45.64492790560583,
"longitude": 14.25334942966329,
"altitude": 585.1806861589965
},
{
"latitude": 45.64316335436476,
"longitude": 14.26332880184475,
"altitude": 589.8802607573035
},
{
"latitude": 45.64911917196595,
"longitude": 14.26214792790128,
"altitude": 608.6648153348965
},
{
"latitude": 45.64122685351364,
"longitude": 14.26590493128597,
"altitude": 606.1448368129072
},
{
"latitude": 45.64543355564817,
"longitude": 14.27242391207985,
"altitude": 630.0829598206344
},
{
"latitude": 45.6372792927328,
"longitude": 14.27533492411138,
"altitude": 616.1839898415284
},
{
"latitude": 45.64061299543953,
"longitude": 14.26161958465814,
"altitude": 598.0603137354178
},
{
"latitude": 45.64032340702919,
"longitude": 14.2682896662383,
"altitude": 607.1243119862851
}
],
landing_point = [
{
"latitude": 45.6398451,
"longitude": 14.2699217
}
],
LEADER_ID = 0,
IS_LEADER = me.id === LEADER_ID;
function altitudeReached(altitude, target_altitude) {
//console.log(`[DEMO] Waiting for altitude... (${altitude} , ${target_altitude})`);
return Math.abs(altitude - target_altitude) < EPSILON_ALTITUDE;
}
function distance(lat1, lon1, lat2, lon2) {
const R = 6371e3, // meters
la1 = lat1 * Math.PI/180, // la, lo in radians
la2 = lat2 * Math.PI/180,
lo1 = lon1 * Math.PI/180,
lo2 = lon2 * Math.PI/180;
//haversine formula
const sin_lat = Math.sin((la2 - la1)/2),
sin_lon = Math.sin((lo2 - lo1)/2),
h = sin_lat*sin_lat + Math.cos(la1)*Math.cos(la2)*sin_lon*sin_lon;
return 2*R*Math.asin(Math.sqrt(h));
}
function exit_on_fail(ret, msg) {
if (ret) {
console.log(msg);
me.exit(1);
}
}
function mustWait(timestamp) {
if(me.timestamp === 0) {
me.timestamp = timestamp;
}
return timestamp - me.timestamp < me.must_wait;
}
me.onStart = function() {
console.log("[WEB SCRIPT] WEB WORKER DRONE START!");
/*console.log("distance from 1st point at start:", distance(me.getCurrentPosition().x, me.getCurrentPosition().y,
checkpoint_list[0].latitude,
checkpoint_list[0].longitude));*/
me.direction_set = false;
me.init_alt_reached = false;
me.landing = false;
me.landing_alt_reached = false;
me.must_wait = 3000;
me.next_checkpoint = 0;
me.parachute_triggered = false;
me.start_altitude = me.getInitialAltitude() + FLIGH_ALTITUDE;
me.timestamp = 0;
if (!IS_LEADER) {
me.follow_leader = true;
me.leader_init_alt_reached = false;
me.start_altitude += ALTITUDE_DIFF;
me.must_wait = 0;
}
exit_on_fail(
me.setAltitude(me.start_altitude + 1, true),
"Failed to set start altitude");
};
me.onUpdate = function(timestamp) {
if (!me.init_alt_reached) {
me.init_alt_reached = altitudeReached(me.getAltitudeAbs(), me.start_altitude);
return;
}
if (me.must_wait > 0) {
if (!mustWait(timestamp)) {
me.must_wait = 0;
me.timestamp = 0;
}
return;
}
if (!IS_LEADER && me.follow_leader) {
if (me.drone_dict[LEADER_ID].altitudeAbs === 0) {
return console.log("[DEMO] Waiting for leader to send its altitude");
}
if (!me.leader_init_alt_reached) {
me.leader_init_alt_reached = me.drone_dict[LEADER_ID].altitudeAbs >= me.start_altitude - ALTITUDE_DIFF;
return console.log(`[DEMO] Waiting for leader to reach altitude ${me.start_altitude - ALTITUDE_DIFF} (currently ${me.drone_dict[LEADER_ID].altitudeAbs})`);
}
if (me.drone_dict[LEADER_ID].altitudeRel > PARACHUTE_ALTITUDE) {
exit_on_fail(
me.setTargetCoordinates(
me.drone_dict[LEADER_ID].latitude,
me.drone_dict[LEADER_ID].longitude,
me.drone_dict[LEADER_ID].altitudeAbs + ALTITUDE_DIFF,
30.001
),
"Failed to follow leader");
} else {
me.follow_leader = false;
me.next_checkpoint = me.drone_dict[LEADER_ID].lastCheckpoint + 1;
console.log("[DEMO] Stop following...\n");
}
return;
}
if (!me.direction_set) {
if (me.next_checkpoint < checkpoint_list.length) {
var current_position = me.getCurrentPosition();
var dist = distance(current_position.x, current_position.y,
checkpoint_list[me.next_checkpoint].latitude,
checkpoint_list[me.next_checkpoint].longitude);
/*console.log("---------------------------------------------");
console.log("[SCRIPT] current_position:", current_position);
console.log("[SCRIPT] next_checkpoint:", checkpoint_list[me.next_checkpoint]);
console.log("[SCRIPT] distance:", dist);*/
exit_on_fail(
me.setTargetCoordinates(
checkpoint_list[me.next_checkpoint].latitude,
checkpoint_list[me.next_checkpoint].longitude,
checkpoint_list[me.next_checkpoint].altitude + FLIGH_ALTITUDE,
100
),
"Failed to set checkpoint coordinates");
//console.log(`[DEMO] Going to Checkpoint ${me.next_checkpoint}\n`)
} else {
console.log("[DEMO] Setting landing coordinates...\n");
me.landing_altitude = me.getAltitudeAbs() - me.getCurrentPosition().z + PARACHUTE_ALTITUDE;
exit_on_fail(
/*me.setTargetCoordinates(
checkpoint_list[checkpoint_list.length - 1].latitude,
checkpoint_list[checkpoint_list.length - 1].longitude,
me.landing_altitude,
100
),*/
me.setAltitude(me.landing_altitude, true),
"Failed to set landing coordinates");
}
me.direction_set = true;
return;
}
if (me.next_checkpoint < checkpoint_list.length) {
me.current_position = me.getCurrentPosition();
me.distance = distance(me.current_position.x, me.current_position.y,
checkpoint_list[me.next_checkpoint].latitude,
checkpoint_list[me.next_checkpoint].longitude);
if (me.distance > EPSILON) {
//console.log(`Waiting for drone to get to destination (${me.distance} m)`);
} else {
/*console.log(`[DEMO] Reached Checkpoint ${me.next_checkpoint}\n`);
console.log("[SCRIPT] current_position:", me.current_position);*/
var loiter_center = checkpoint_list[me.next_checkpoint];
/*console.log("[SCRIPT] next_checkpoint:", checkpoint_list[me.next_checkpoint]);
console.log("[SCRIPT] drone-checkpoint distance:", me.distance);*/
me.next_checkpoint += 1;
me.sendMsg(JSON.stringify({ next_checkpoint: me.next_checkpoint }));
me.direction_set = false;
me.must_wait = 30000;
me.loiter();
}
return;
}
if (!me.landing_alt_reached) {
me.landing_alt_reached = altitudeReached(me.getAltitudeAbs(), me.landing_altitude);
return;
}
if (!me.landing) {
me.current_position = me.getCurrentPosition();
me.distance = distance(me.current_position.x, me.current_position.y,
landing_point.latitude, landing_point.longitude);
if (me.distance > 20) {
//console.log(`[DEMO] Waiting to reach landing point (current distance is ${me.distance})`);
} else {
console.log("[DEMO] Landing...\n");
me.landing = true;
}
return;
}
if (!me.parachute_triggered) {
if (Math.abs(me.getYaw() - TARGET_YAW) < EPSILON_YAW) {
console.log("[DEMO] Deploying parachute...");
exit_on_fail(me.doParachute(2), "Failed to deploy parachute");
me.parachute_triggered = true;
} else {
return console.log(`[DEMO] Waiting for yaw...`);
}
}
if (me.landed()) {
console.log("calling me.exit(0) when me.landed");
me.exit(0);
}
};
me.onGetMsg = function(msg) {
me.msgDict = JSON.parse(msg);
if (me.follow_leader && me.msgDict.hasOwnProperty("next_checkpoint")) {
me.next_checkpoint = me.msgDict.next_checkpoint;
}
};
......@@ -2,7 +2,7 @@
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Rescue Swarm Map" module="erp5.portal_type"/>
<global name="Web Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
......@@ -61,19 +61,31 @@
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>medium_map</string> </value>
<value> <string>loiter_flight_script</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string>Map based on medium size map, use to compare simulated and real drone flights.\n
It has 2 drones: one for that simulates the real flight from a script (DroneAaileFixeAPI - id:0) and one that moves according to the log values (DroneLogAPI id:1)\n
Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log drone flight will be drawn on the map.</string> </value>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>compare_map</string> </value>
<value> <string>loiter_flight_script</string> </value>
</item>
<item>
<key> <string>language</string> </key>
......@@ -83,96 +95,23 @@ Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log dro
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Rescue Swarm Map</string> </value>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string>{\n
"distances": {\n
"communication": 99999,\n
"control": 1500,\n
"information": 5\n
},\n
"drone": {\n
"maxAcceleration": 1,\n
"maxSpeed": 16.666667,\n
"collisionSector": 0.25,\n
"broadcastingTime": 1000,\n
"viewAngle": 60\n
},\n
"meteo": 0.5,\n
"derive": {\n
"speed": 0.1,\n
"direction": {\n
"x": 1,\n
"y": 0.5\n
}\n
},\n
"gameTime": 1800,\n
"goalDiameter": 7,\n
"goalPositionLeftTeam": {\n
"x": 0,\n
"y": 0,\n
"z": 0.6\n
},\n
"goalPositionRightTeam": {\n
"x": 0,\n
"y": 0,\n
"z": 0.6\n
},\n
"latency": {\n
"information": 0,\n
"communication": 0\n
},\n
"mapSize": {\n
"depth": 1000,\n
"height": 100,\n
"width": 1000\n
},\n
"obstacles": [],\n
"spawnPositions": [],\n
"initialHumanAreaPosition": {\n
"x": -400,\n
"y": 400,\n
"z": 0\n
},\n
"randomSpawn": {\n
"leftTeam": {\n
"position": {\n
"x": 0,\n
"y": 0,\n
"z": 20\n
},\n
"dispertion": {\n
"x": 8,\n
"y": 8,\n
"z": 6\n
},\n
"types": [\n
"DroneAaileFixeAPI",\n
"DroneLogAPI",\n
"DroneAPI"\n
]\n
},\n
"rightTeam": {\n
"position": {\n
"x": -400,\n
"y": 400,\n
"z": 0\n
},\n
"dispertion": {\n
"x": 100,\n
"y": 100,\n
"z": 0.1\n
}\n
}\n
},\n
"teamSize": 2\n
}</string> </value>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Compare map</string> </value>
<value> <string>Loiter flight script</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>workflow_history</string> </key>
......@@ -205,6 +144,12 @@ Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log dro
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>processing_status_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
......@@ -250,7 +195,7 @@ Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log dro
</tuple>
<state>
<tuple>
<float>1657219036.22</float>
<float>1664459507.81</float>
<string>UTC</string>
</tuple>
</state>
......@@ -299,7 +244,7 @@ Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log dro
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>1002.12601.25029.46114</string> </value>
<value> <string>1003.18623.52236.6348</string> </value>
</item>
<item>
<key> <string>state</string> </key>
......@@ -317,7 +262,70 @@ Being run on (WIP) web_page_module/test_drone_simulator_gadget page, the log dro
</tuple>
<state>
<tuple>
<float>1660228730.09</float>
<float>1664460051.36</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.Workflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_log</string> </key>
<value>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_processing_state</string> </key>
<value> <string>empty</string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>0.0.0.0</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1664387279.94</float>
<string>UTC</string>
</tuple>
</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