Apk compilation
This commit is contained in:
101
backend/src/controllers/text-command.controller.ts
Normal file
101
backend/src/controllers/text-command.controller.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
import { Router } from 'express';
|
||||
import { raspiService } from '../services/raspi.service.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
const commandMap = [
|
||||
// Catalan forward
|
||||
{ words: ['endavant', 'avança'], action: 'forward' },
|
||||
// Catalan backward
|
||||
{ words: ['atras', 'enrere', 'atras'], action: 'backward' },
|
||||
// Catalan left
|
||||
{ words: ['esquerra', 'esquerre', 'stoppa'], action: 'left' },
|
||||
// Catalan right
|
||||
{ words: ['dreta', 'destre'], action: 'right' },
|
||||
// Stop
|
||||
{ words: ['atura', 'atura', 'pare', 'stop', 'parada', 'aturar'], action: 'stop' },
|
||||
// Pick up / grab
|
||||
{ words: ['recull', 'pega', 'pilla', 'agafa'], action: 'pick' },
|
||||
// Eject / throw
|
||||
{ words: ['llança', 'tira', 'expulsa', ' llença'], action: 'eject' },
|
||||
|
||||
// Spanish forward
|
||||
{ words: ['adelante'], action: 'forward' },
|
||||
// Spanish backward
|
||||
{ words: ['atras', 'atrás', 'reversa', 'al tras'], action: 'backward' },
|
||||
// Spanish left
|
||||
{ words: ['izquierda', 'izq'], action: 'left' },
|
||||
// Spanish right
|
||||
{ words: ['derecha', 'der'], action: 'right' },
|
||||
// Spanish stop
|
||||
{ words: ['para', 'stop', 'pare', 'deten', 'frena', 'alto'], action: 'stop' },
|
||||
];
|
||||
|
||||
function resolveCommand(text: string) {
|
||||
const lower = text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
||||
for (const entry of commandMap) {
|
||||
for (const word of entry.words) {
|
||||
const normalizedWord = word.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
|
||||
if (lower.includes(normalizedWord)) {
|
||||
return entry.action;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
router.post('/text', async (req, res) => {
|
||||
const { text } = req.body;
|
||||
if (!text || typeof text !== 'string') {
|
||||
return res.status(400).json({ error: 'Text is required' });
|
||||
}
|
||||
|
||||
const action = resolveCommand(text);
|
||||
if (!action) {
|
||||
return res.json({ recognized: text.trim(), action: null, message: 'No motor command matched. Use: endavant, atras, esquerra, dreta, atura, recull, llança' });
|
||||
}
|
||||
|
||||
try {
|
||||
switch (action) {
|
||||
case 'forward': {
|
||||
const result = await raspiService.motorStepForward();
|
||||
return res.json({ recognized: text.trim(), action: 'forward', result });
|
||||
}
|
||||
case 'backward': {
|
||||
const result = await raspiService.motorStepBackward();
|
||||
return res.json({ recognized: text.trim(), action: 'backward', result });
|
||||
}
|
||||
case 'left': {
|
||||
await raspiService.motorStepForward();
|
||||
await new Promise(r => setTimeout(r, 600));
|
||||
await raspiService.motorStop();
|
||||
return res.json({ recognized: text.trim(), action: 'turn-left', result: { status: 'turned left' } });
|
||||
}
|
||||
case 'right': {
|
||||
await raspiService.motorStepBackward();
|
||||
await new Promise(r => setTimeout(r, 600));
|
||||
await raspiService.motorStop();
|
||||
return res.json({ recognized: text.trim(), action: 'turn-right', result: { status: 'turned right' } });
|
||||
}
|
||||
case 'stop': {
|
||||
const result = await raspiService.motorStop();
|
||||
return res.json({ recognized: text.trim(), action: 'stop', result });
|
||||
}
|
||||
case 'pick': {
|
||||
return res.json({ recognized: text.trim(), action: 'pick', message: 'Pick command received' });
|
||||
}
|
||||
case 'eject': {
|
||||
return res.json({ recognized: text.trim(), action: 'eject', message: 'Eject command received' });
|
||||
}
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
const message = err instanceof Error ? err.message : 'Unknown error';
|
||||
return res.status(500).json({
|
||||
recognized: text.trim(),
|
||||
action,
|
||||
error: `Command execution failed: ${message}`,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
@@ -3,12 +3,14 @@ import motorController from '../controllers/motor.controller.js';
|
||||
import audioController from '../controllers/audio.controller.js';
|
||||
import commandController from '../controllers/command.controller.js';
|
||||
import settingsController from '../controllers/settings.controller.js';
|
||||
import textCommandController from '../controllers/text-command.controller.js';
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.use('/motor', motorController);
|
||||
router.use('/audio', audioController);
|
||||
router.use('/commands', commandController);
|
||||
router.use('/commands/text', textCommandController);
|
||||
router.use('/settings', settingsController);
|
||||
|
||||
export default router;
|
||||
|
||||
Reference in New Issue
Block a user