implemented time.sleep monkey-patch. still need to use await before it so might just recommend use of asyncio.sleep

master
Jake 2025-03-24 11:16:51 +08:00
parent b9bf772aef
commit 2bfdcf1957
2 changed files with 26 additions and 17 deletions

View File

@ -69,7 +69,10 @@
document.getElementById("compile-button").addEventListener("click", () => { document.getElementById("compile-button").addEventListener("click", () => {
const code = document.getElementById("python-code").value; const code = document.getElementById("python-code").value;
consoleElement.innerHTML = ""; // Clear console before running new code 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 // ✅ Update "distance" and "speed" every 2 seconds with random values

View File

@ -1,30 +1,31 @@
importScripts("https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js"); 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() { async function initializePyodide() {
self.pyodide = await loadPyodide({ self.pyodide = await loadPyodide({
indexURL: "https://cdn.jsdelivr.net/pyodide/v0.23.4/full/" 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.pyodide.globals.set("send_to_main", (event, data) => {
self.postMessage({ type: event, data: 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) => { 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 // ✅ Run Python initialization
self.pyodide.runPython(` await self.pyodide.runPythonAsync(`
import sys import sys
import pyodide import pyodide
import asyncio
import time
class RobotModule: class RobotModule:
def get_sensor(self, name): def get_sensor(self, name):
return get_sensor_data(name) # This should now work! return get_sensor_data(name)
robot = RobotModule() robot = RobotModule()
@ -36,21 +37,27 @@ def turn(deg):
class ConsoleOutput: class ConsoleOutput:
def write(self, text): def write(self, text):
if text.strip(): # Avoid empty writes if text.strip():
send_to_main("console", text) # send_to_main is now properly defined send_to_main("console", text)
return None
def flush(self): def flush(self):
pass pass
sys.stdout = ConsoleOutput() sys.stdout = ConsoleOutput()
sys.stderr = ConsoleOutput() sys.stderr = ConsoleOutput()
# Register robot module in sys.modules
sys.modules["robot"] = robot 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(); initializePyodide();
@ -62,12 +69,11 @@ self.onmessage = async (event) => {
} }
if (event.data.type === "sensor_update") { if (event.data.type === "sensor_update") {
// ✅ Update sensorData when receiving a sensor update // ✅ Update sensor data
Object.assign(sensorData, event.data.data); Object.assign(sensorData, event.data.data);
} else { } else if (event.data.type === "execute") {
try { try {
let result = await self.pyodide.runPythonAsync(event.data.code); let result = await self.pyodide.runPythonAsync(event.data.code);
if (result !== undefined && result !== null && result !== "") { if (result !== undefined && result !== null && result !== "") {
self.postMessage({ type: "console", data: result }); self.postMessage({ type: "console", data: result });
} }