Spaces:
Running
Running
| // examples.js - 5 starter programs for the Examples dropdown. | |
| // | |
| // Each entry exposes a Blockly v12 workspace JSON (the same format as the | |
| // Share modal's export). They load directly into the workspace via | |
| // Blockly.serialization.workspaces.load. | |
| (function () { | |
| const numShadow = (n = 0) => ({ shadow: { type: 'math_number', fields: { NUM: n } } }); | |
| const txtShadow = (t = '') => ({ shadow: { type: 'text', fields: { TEXT: t } } }); | |
| const numBlock = (n) => ({ block: { type: 'math_number', fields: { NUM: n } } }); | |
| // Random integer between FROM and TO. Used by Random Dance. | |
| const rand = (from, to) => ({ | |
| block: { | |
| type: 'math_random_int', | |
| inputs: { | |
| FROM: numShadow(from), | |
| TO: numShadow(to), | |
| }, | |
| }, | |
| }); | |
| window.REACHY_EXAMPLES = [ | |
| // ------------------------------------------------------------- | |
| { | |
| id: 'wave-hello', | |
| name: 'Wave Hello', | |
| description: 'Greet the robot. No API key needed.', | |
| program: { | |
| blocks: { | |
| languageVersion: 0, | |
| blocks: [{ | |
| type: 'reachy_say', x: 80, y: 80, | |
| inputs: { TEXT: txtShadow("Hello! I'm Reachy.") }, | |
| next: { block: { | |
| type: 'reachy_wait_seconds', | |
| inputs: { SECONDS: numShadow(0.5) }, | |
| next: { block: { | |
| type: 'reachy_wave_hello', | |
| next: { block: { | |
| type: 'reachy_say', | |
| inputs: { TEXT: txtShadow('Nice to meet you!') }, | |
| } }, | |
| } }, | |
| } }, | |
| }], | |
| }, | |
| }, | |
| }, | |
| // ------------------------------------------------------------- | |
| { | |
| id: 'joke-teller', | |
| name: 'Joke Teller', | |
| description: 'AI picks a one-liner, robot says it, then waves.', | |
| program: { | |
| blocks: { | |
| languageVersion: 0, | |
| blocks: [{ | |
| type: 'variables_set', x: 80, y: 80, | |
| fields: { VAR: { id: 'v_joke' } }, | |
| inputs: { | |
| VALUE: { block: { | |
| type: 'reachy_ask_ai', | |
| inputs: { PROMPT: txtShadow('Tell me a one-line robot joke.') }, | |
| } }, | |
| }, | |
| next: { block: { | |
| type: 'reachy_say', | |
| inputs: { | |
| TEXT: { block: { type: 'variables_get', fields: { VAR: { id: 'v_joke' } } } }, | |
| }, | |
| next: { block: { type: 'reachy_wave_hello' } }, | |
| } }, | |
| }], | |
| }, | |
| variables: [{ name: 'joke', id: 'v_joke' }], | |
| }, | |
| }, | |
| // ------------------------------------------------------------- | |
| { | |
| id: 'receptionist', | |
| name: 'Receptionist', | |
| description: 'Full voice loop: listen, reply via AI, wave. Forever.', | |
| program: { | |
| blocks: { | |
| languageVersion: 0, | |
| blocks: [{ | |
| type: 'controls_whileUntil', x: 80, y: 80, | |
| fields: { MODE: 'WHILE' }, | |
| inputs: { | |
| BOOL: { block: { type: 'logic_boolean', fields: { BOOL: 'TRUE' } } }, | |
| DO: { block: { | |
| type: 'variables_set', | |
| fields: { VAR: { id: 'v_user_said' } }, | |
| inputs: { VALUE: { block: { type: 'reachy_listen' } } }, | |
| next: { block: { | |
| type: 'reachy_say', | |
| inputs: { | |
| TEXT: { block: { | |
| type: 'reachy_ask_ai_system', | |
| inputs: { | |
| SYSTEM: txtShadow('You are a friendly receptionist. Keep replies under 30 words.'), | |
| USER: { block: { type: 'variables_get', fields: { VAR: { id: 'v_user_said' } } } }, | |
| }, | |
| } }, | |
| }, | |
| next: { block: { type: 'reachy_wave_hello' } }, | |
| } }, | |
| } }, | |
| }, | |
| }], | |
| }, | |
| variables: [{ name: 'user_said', id: 'v_user_said' }], | |
| }, | |
| }, | |
| // ------------------------------------------------------------- | |
| { | |
| id: 'random-dance', | |
| name: 'Random Dance', | |
| description: 'Head + antennas wiggle to random poses. No API key needed.', | |
| program: { | |
| blocks: { | |
| languageVersion: 0, | |
| blocks: [{ | |
| type: 'controls_repeat_ext', x: 80, y: 80, | |
| inputs: { | |
| TIMES: numShadow(8), | |
| DO: { block: { | |
| type: 'reachy_move_head', | |
| inputs: { ROLL: rand(-20, 20), PITCH: rand(-15, 15), YAW: rand(-40, 40) }, | |
| next: { block: { | |
| type: 'reachy_set_antennas', | |
| inputs: { RIGHT: rand(-90, 90), LEFT: rand(-90, 90) }, | |
| next: { block: { | |
| type: 'reachy_wait_seconds', | |
| inputs: { SECONDS: numShadow(0.4) }, | |
| } }, | |
| } }, | |
| } }, | |
| }, | |
| next: { block: { | |
| type: 'reachy_move_head', | |
| inputs: { ROLL: numShadow(0), PITCH: numShadow(0), YAW: numShadow(0) }, | |
| next: { block: { | |
| type: 'reachy_set_antennas', | |
| inputs: { RIGHT: numShadow(0), LEFT: numShadow(0) }, | |
| } }, | |
| } }, | |
| }], | |
| }, | |
| }, | |
| }, | |
| // ------------------------------------------------------------- | |
| { | |
| id: 'voice-mirror', | |
| name: 'Voice Mirror', | |
| description: 'Robot repeats what you say. Tests mic + voice without AI cost.', | |
| program: { | |
| blocks: { | |
| languageVersion: 0, | |
| blocks: [{ | |
| type: 'controls_whileUntil', x: 80, y: 80, | |
| fields: { MODE: 'WHILE' }, | |
| inputs: { | |
| BOOL: { block: { type: 'logic_boolean', fields: { BOOL: 'TRUE' } } }, | |
| DO: { block: { | |
| type: 'variables_set', | |
| fields: { VAR: { id: 'v_heard' } }, | |
| inputs: { VALUE: { block: { type: 'reachy_listen' } } }, | |
| next: { block: { | |
| type: 'reachy_say', | |
| inputs: { | |
| TEXT: { block: { type: 'variables_get', fields: { VAR: { id: 'v_heard' } } } }, | |
| }, | |
| } }, | |
| } }, | |
| }, | |
| }], | |
| }, | |
| variables: [{ name: 'heard', id: 'v_heard' }], | |
| }, | |
| }, | |
| ]; | |
| })(); | |