implemented time.sleep monkey-patch. still need to use await before it so might just recommend use of asyncio.sleep
parent
b9bf772aef
commit
2bfdcf1957
|
|
@ -69,7 +69,10 @@
|
|||
document.getElementById("compile-button").addEventListener("click", () => {
|
||||
const code = document.getElementById("python-code").value;
|
||||
consoleElement.innerHTML = ""; // Clear console before running new code
|
||||
pyodideWorker.postMessage({ code });
|
||||
pyodideWorker.postMessage({
|
||||
type: "execute",
|
||||
code: code
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ Update "distance" and "speed" every 2 seconds with random values
|
||||
|
|
|
|||
|
|
@ -1,30 +1,31 @@
|
|||
importScripts("https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js");
|
||||
|
||||
let sensorData = {}; // ✅ Declare sensorData globally
|
||||
let sensorData = {}; // ✅ Store sensor values
|
||||
|
||||
async function initializePyodide() {
|
||||
self.pyodide = await loadPyodide({
|
||||
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.23.4/full/"
|
||||
});
|
||||
|
||||
// ✅ Explicitly define send_to_main before running Python
|
||||
self.pyodide.globals.set("send_to_main", (event, data) => {
|
||||
self.postMessage({ type: event, data: data });
|
||||
});
|
||||
|
||||
// ✅ Now set get_sensor_data AFTER Pyodide is initialized
|
||||
// ✅ Expose sensor data to Python
|
||||
self.pyodide.globals.set("get_sensor_data", (name) => {
|
||||
return sensorData[name] ?? null; // Return sensor value or null if not set
|
||||
return sensorData[name] ?? null;
|
||||
});
|
||||
|
||||
// ✅ Define the robot module in Python
|
||||
self.pyodide.runPython(`
|
||||
// ✅ Run Python initialization
|
||||
await self.pyodide.runPythonAsync(`
|
||||
import sys
|
||||
import pyodide
|
||||
import asyncio
|
||||
import time
|
||||
|
||||
class RobotModule:
|
||||
def get_sensor(self, name):
|
||||
return get_sensor_data(name) # ✅ This should now work!
|
||||
return get_sensor_data(name)
|
||||
|
||||
robot = RobotModule()
|
||||
|
||||
|
|
@ -36,21 +37,27 @@ def turn(deg):
|
|||
|
||||
class ConsoleOutput:
|
||||
def write(self, text):
|
||||
if text.strip(): # Avoid empty writes
|
||||
send_to_main("console", text) # ✅ send_to_main is now properly defined
|
||||
return None
|
||||
if text.strip():
|
||||
send_to_main("console", text)
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
sys.stdout = ConsoleOutput()
|
||||
sys.stderr = ConsoleOutput()
|
||||
|
||||
# ✅ Register robot module in sys.modules
|
||||
sys.modules["robot"] = robot
|
||||
|
||||
# ✅ Override time.sleep() with an async version
|
||||
_original_sleep = time.sleep # Backup original sleep
|
||||
|
||||
async def async_sleep(seconds):
|
||||
await asyncio.sleep(seconds) # ✅ Allows JavaScript to process events while sleeping
|
||||
|
||||
|
||||
time.sleep = async_sleep # ✅ Monkey-patch time.sleep()
|
||||
`);
|
||||
|
||||
self.postMessage({ type: "ready" }); // Notify main thread that Pyodide is ready
|
||||
self.postMessage({ type: "ready" }); // ✅ Notify main thread that Pyodide is ready
|
||||
}
|
||||
|
||||
initializePyodide();
|
||||
|
|
@ -62,12 +69,11 @@ self.onmessage = async (event) => {
|
|||
}
|
||||
|
||||
if (event.data.type === "sensor_update") {
|
||||
// ✅ Update sensorData when receiving a sensor update
|
||||
// ✅ Update sensor data
|
||||
Object.assign(sensorData, event.data.data);
|
||||
} else {
|
||||
} else if (event.data.type === "execute") {
|
||||
try {
|
||||
let result = await self.pyodide.runPythonAsync(event.data.code);
|
||||
|
||||
if (result !== undefined && result !== null && result !== "") {
|
||||
self.postMessage({ type: "console", data: result });
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue