feat: Add setTurtleState and execOnTurtle functions for REST API integration
This commit is contained in:
@@ -172,7 +172,7 @@ export const useTurtleStore = create((set, get) => ({
|
|||||||
sendCommand: async (turtleId, command, param = null) => {
|
sendCommand: async (turtleId, command, param = null) => {
|
||||||
const { ws } = get();
|
const { ws } = get();
|
||||||
|
|
||||||
console.log(`🎮 Sending command to turtle ${turtleId}: ${command}`, param ? `(param: ${param})` : '');
|
console.log(`🎮 Sending command to turtle ${turtleId}: ${command}`, param ? `(param: ${JSON.stringify(param)})` : '');
|
||||||
|
|
||||||
if (ws && ws.readyState === WebSocket.OPEN) {
|
if (ws && ws.readyState === WebSocket.OPEN) {
|
||||||
ws.send(JSON.stringify({
|
ws.send(JSON.stringify({
|
||||||
@@ -198,6 +198,49 @@ export const useTurtleStore = create((set, get) => ({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Set turtle state machine state via REST API
|
||||||
|
setTurtleState: async (turtleId, stateName, stateData = {}) => {
|
||||||
|
console.log(`🔄 Setting state for turtle ${turtleId}: ${stateName}`, stateData);
|
||||||
|
try {
|
||||||
|
const response = await fetch(`${API_URL}/turtle/${turtleId}/state`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ state: stateName, data: stateData })
|
||||||
|
});
|
||||||
|
const result = await response.json();
|
||||||
|
console.log(' ✅ State set:', result);
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(' ❌ Error setting state:', error);
|
||||||
|
// Fallback: send via WebSocket as a command
|
||||||
|
const { ws } = get();
|
||||||
|
if (ws && ws.readyState === WebSocket.OPEN) {
|
||||||
|
ws.send(JSON.stringify({
|
||||||
|
type: 'command',
|
||||||
|
turtleID: turtleId,
|
||||||
|
command: 'set_state',
|
||||||
|
param: { state: stateName, data: stateData }
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Execute arbitrary Lua code on a turtle
|
||||||
|
execOnTurtle: async (turtleId, code) => {
|
||||||
|
console.log(`💻 Exec on turtle ${turtleId}:`, code);
|
||||||
|
try {
|
||||||
|
const response = await fetch(`${API_URL}/turtle/${turtleId}/exec`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ code })
|
||||||
|
});
|
||||||
|
return await response.json();
|
||||||
|
} catch (error) {
|
||||||
|
console.error(' ❌ Error executing:', error);
|
||||||
|
return { success: false, error: error.message };
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// Helper getters
|
// Helper getters
|
||||||
getTurtleArray: () => {
|
getTurtleArray: () => {
|
||||||
return Object.values(get().turtles);
|
return Object.values(get().turtles);
|
||||||
|
|||||||
Reference in New Issue
Block a user