Odometria y camino mqtt hecho

parent 4bbcd249
...@@ -20,7 +20,7 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -20,7 +20,7 @@ export class AppComponent implements OnInit, OnDestroy {
private publishInterval: Subscription = new Subscription(); //Variable para publicar datos cada 10 segundos private publishInterval: Subscription = new Subscription(); //Variable para publicar datos cada 10 segundos
//0202000105030705000200041109060110031000000200080101100110000106010701 //0202000105030705000200041109060110031000000200080101100110000106010701
message: string = ''; //Variable para mostrar el mensaje MQTT message: string = '0202000105030705000200041109060110031000000200080101100110000106010701'; //Variable para mostrar el mensaje MQTT
@ViewChild(MapaComponent) mapaComponent!: MapaComponent; @ViewChild(MapaComponent) mapaComponent!: MapaComponent;
@ViewChild(CrearPedidoDialogComponent) pedidodialog!: CrearPedidoDialogComponent; @ViewChild(CrearPedidoDialogComponent) pedidodialog!: CrearPedidoDialogComponent;
...@@ -29,8 +29,7 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -29,8 +29,7 @@ export class AppComponent implements OnInit, OnDestroy {
constructor(public dialog: MatDialog, private mqttService: MqttService, private backendService:BackendService, private pedidoService: ServicioPedidoService) {} constructor(public dialog: MatDialog, private mqttService: MqttService, private backendService:BackendService, private pedidoService: ServicioPedidoService) {}
ngOnInit() { ngOnInit() {
this.subscribeToTopic(); //Nos suscribimos al inicializar la aplicación this.subscribeToTopicMapa(); //Nos suscribimos al inicializar la aplicación
this.startPublishing(); //Publicamos datos cada 10 segundos
this.subscribeToFinaliza(); this.subscribeToFinaliza();
this.subscribeToTopicPosicion(); this.subscribeToTopicPosicion();
...@@ -47,7 +46,7 @@ export class AppComponent implements OnInit, OnDestroy { ...@@ -47,7 +46,7 @@ export class AppComponent implements OnInit, OnDestroy {
* y además se muestra en la consola. * y además se muestra en la consola.
*/ */
subscribeToTopic() { subscribeToTopicMapa() {
console.log('Conectado:'); console.log('Conectado:');
this.subscription = this.mqttService.observe('map').subscribe((data: IMqttMessage) => { this.subscription = this.mqttService.observe('map').subscribe((data: IMqttMessage) => {
...@@ -80,7 +79,7 @@ subscribeToTopicPosicion() { ...@@ -80,7 +79,7 @@ subscribeToTopicPosicion() {
} }
subscribeToFinaliza() { subscribeToFinaliza() {
this.finalizaSubscription = this.mqttService.observe('finalizacion').subscribe({ this.finalizaSubscription = this.mqttService.observe('equipoD/finalizacion').subscribe({
next: (message) => { next: (message) => {
console.log('Robot ha finalizado el pedido:', message.payload.toString()); console.log('Robot ha finalizado el pedido:', message.payload.toString());
this.procesarFinalizacionPedido(); this.procesarFinalizacionPedido();
...@@ -99,15 +98,6 @@ procesarFinalizacionPedido() { ...@@ -99,15 +98,6 @@ procesarFinalizacionPedido() {
* la palabra 'Prueba' seguida de la fecha y hora actual. * la palabra 'Prueba' seguida de la fecha y hora actual.
*/ */
startPublishing() {
this.publishInterval = interval(10000).pipe(
startWith(0), // Inicia la secuencia inmediatamente al suscribirse.
switchMap(() => { // Cambia a un nuevo observable cada 10 segundos.
const message = `Prueba ${new Date().toLocaleString()}`; // Mensaje a publicar.
return this.mqttService.publish('pruebaMQTT', message); // Publica el mensaje en el tópico 'pruebaMQTT'.
})
).subscribe();
}
abrirPopupCrearPedido(): void { abrirPopupCrearPedido(): void {
const dialogRef = this.dialog.open(CrearPedidoDialogComponent, { const dialogRef = this.dialog.open(CrearPedidoDialogComponent, {
width: '1100px', width: '1100px',
...@@ -134,29 +124,47 @@ enviarCaminos(actual: number, paquete: number, destino: number) { ...@@ -134,29 +124,47 @@ enviarCaminos(actual: number, paquete: number, destino: number) {
this.backendService.enviarCaminos(actual, paquete, destino).then(response => { this.backendService.enviarCaminos(actual, paquete, destino).then(response => {
console.log('Caminos recibidos:', response); console.log('Caminos recibidos:', response);
// Transformación del array a string // Actualizar el último ID de destino con el penúltimo número
const caminosString = this.formatearYQuitarUltimo(response); const responseString = typeof response === 'string' ? response : JSON.stringify(response);
console.log('Caminos formateados:', caminosString); const penultimo = parseInt(this.obtenerPenultimosNumeros(responseString));
this.actualizarUltimoIdDestino(penultimo);
//Formateamos el camino y lo enviamos
const mensaje = this.formatearCamino(response);
this.enviarMensajeMQTT(mensaje);
// Envío del mensaje formateado al broker MQTT
this.enviarMensajeMQTT(caminosString);
}).catch(error => { }).catch(error => {
console.error('Error al obtener los caminos:', error); console.error('Error al obtener los caminos:', error);
}); });
} }
/** formatearCamino(response: any): string {
* Convierte un array de arrays de números a un string en el formato "31,26,25;26,21,16,15". // Si la respuesta no es un string, se asume que es un array de arrays y se formatea
* @param caminos Array de arrays de números que representan los caminos. if (typeof response !== 'string') {
*/ return response.map((subarray: number[]) => subarray.join(',')).join(';');
formatearYQuitarUltimo(caminos: number[][]): string { }
let caminosFormateados = caminos.map(camino => { return response;
if (camino.length > 1) camino.pop(); // Quita el último elemento si hay más de uno }
return camino.join(',');
}).join(';'); obtenerPenultimosNumeros(caminosString: string): string {
return caminosFormateados; // Dividir el string original en caminos individuales
const caminos = caminosString.split(';');
// Mapa de cada camino para obtener el penúltimo número
const penultimosNumeros = caminos.map(camino => {
const numeros = camino.split(',');
// Verifica que haya suficientes números para tener un penúltimo
if (numeros.length > 1) {
return numeros[numeros.length - 2]; // Devuelve el penúltimo número
}
return ''; // Si no hay suficiente longitud, devuelve un string vacío
});
// Unir los resultados con ';'
return penultimosNumeros.join(';');
} }
/** /**
* Publica un mensaje en el topic MQTT. * Publica un mensaje en el topic MQTT.
* @param mensaje El mensaje a publicar. * @param mensaje El mensaje a publicar.
...@@ -168,6 +176,4 @@ enviarMensajeMQTT(mensaje: string) { ...@@ -168,6 +176,4 @@ enviarMensajeMQTT(mensaje: string) {
}); });
} }
} }
...@@ -14,7 +14,7 @@ import { HttpClientModule } from '@angular/common/http'; ...@@ -14,7 +14,7 @@ import { HttpClientModule } from '@angular/common/http';
// Configuración de MQTT // Configuración de MQTT
export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = { export const MQTT_SERVICE_OPTIONS: IMqttServiceOptions = {
hostname: '192.168.43.45', //Nombre de host o ip hostname: '192.168.171.45', //Nombre de host o ip
port: 9001, // Puerto de conexión port: 9001, // Puerto de conexión
path: '/mqtt', path: '/mqtt',
protocol: 'ws' // Usar 'wss' para conexiones seguras protocol: 'ws' // Usar 'wss' para conexiones seguras
......
...@@ -10,7 +10,5 @@ ...@@ -10,7 +10,5 @@
<p>Punto de recogida: Casilla ({{ pedido.puntoDeRecogida.row }}, {{ pedido.puntoDeRecogida.col }})</p> <p>Punto de recogida: Casilla ({{ pedido.puntoDeRecogida.row }}, {{ pedido.puntoDeRecogida.col }})</p>
<p>Punto de entrega: Casilla ({{ pedido.puntoDeEntrega.row }}, {{ pedido.puntoDeEntrega.col }})</p> <p>Punto de entrega: Casilla ({{ pedido.puntoDeEntrega.row }}, {{ pedido.puntoDeEntrega.col }})</p>
</div> </div>
<!-- Botón para eliminar el pedido de la cola -->
<button (click)="eliminarPedido(pedido.id)" class="eliminar-pedido-btn">Eliminar</button>
</div> </div>
</div> </div>
...@@ -37,12 +37,9 @@ export class ColaPedidosComponent implements OnInit { ...@@ -37,12 +37,9 @@ export class ColaPedidosComponent implements OnInit {
/** /**
* @brief Elimina un pedido específico de la cola de pedidos. * @brief Elimina un pedido específico de la cola de pedidos.
* *
* Llama al método de eliminarPedido del servicio de pedidos, que filtra y actualiza la lista de pedidos. * Llama al método de eliminarPedido del servicio de pedidos, que filtra y actualiza la lista de pedidos.
* *
* @param id Identificador único del pedido a eliminar. * @param id Identificador único del pedido a eliminar.
*/ */
eliminarPedido(id: string): void { }
this.pedidoService.eliminarPedido(id);
}
}
\ No newline at end of file
...@@ -26,7 +26,7 @@ export class MapaComponent implements OnInit { ...@@ -26,7 +26,7 @@ export class MapaComponent implements OnInit {
// Extiende la definición de cada celda en tu matriz del mapa // Extiende la definición de cada celda en tu matriz del mapa
mapMatrix: {id: string, idUnico: number, robotPresente: boolean}[][] = []; mapMatrix: {id: string, idUnico: number, robotPresente: boolean}[][] = [];
//0202000105030705000200041109060110031000000200080101100110000106010701 //0202000105030705000200041109060110031000000200080101100110000106010701
@Input() mapStr: string = ""; // Cadena de texto que representa las casillas del mapa @Input() mapStr: string = "0202000105030705000200041109060110031000000200080101100110000106010701"; // Cadena de texto que representa las casillas del mapa
rows: number = 7; rows: number = 7;
cols: number = 5; cols: number = 5;
SeleccionadoIdRecogida: string | null = null; SeleccionadoIdRecogida: string | null = null;
......
...@@ -20,7 +20,7 @@ export class ServicioPedidoService { ...@@ -20,7 +20,7 @@ export class ServicioPedidoService {
/** /**
* @brief Agrega un nuevo pedido a la cola y emite el cambio a todos los suscriptores. * @brief Agrega un nuevo pedido a la cola y emite el cambio a todos los suscriptores.
* *
* @param {Pedido} pedido - El nuevo pedido a agregar. * @param {Pedido} pedido - El nuevo pedido a agregar.
*/ */
agregarPedido(pedido: Pedido): void { agregarPedido(pedido: Pedido): void {
...@@ -30,26 +30,9 @@ export class ServicioPedidoService { ...@@ -30,26 +30,9 @@ export class ServicioPedidoService {
this.pedidosSubject.next([...pedidosActuales, nuevoPedido]); this.pedidosSubject.next([...pedidosActuales, nuevoPedido]);
} }
/**
* @brief Elimina un pedido específico de la cola de pedidos.
*
* @param id Identificador del pedido a eliminar.
*
* Este método filtra la cola de pedidos actual para excluir el pedido con el
* identificador proporcionado y luego actualiza la cola de pedidos con los
* elementos restantes.
*/
eliminarPedido(id: string): void {
const pedidosActuales = this.pedidosSubject.value;
const pedidosActualizados = pedidosActuales.filter(pedido => pedido.id !== id);
this.pedidosSubject.next(pedidosActualizados);
this.mostrarNotificacion(`Pedido 1 ha finalizado.`);
}
/** /**
* @brief Obtiene el pedido en curso (el primero en la cola de pedidos). * @brief Obtiene el pedido en curso (el primero en la cola de pedidos).
* *
* @returns {Pedido | null} El pedido en curso o null si no hay ninguno. * @returns {Pedido | null} El pedido en curso o null si no hay ninguno.
* *
obtenerPedidoEnCurso(): Pedido | null { obtenerPedidoEnCurso(): Pedido | null {
...@@ -57,7 +40,7 @@ export class ServicioPedidoService { ...@@ -57,7 +40,7 @@ export class ServicioPedidoService {
return pedidosActuales.length > 0 ? pedidosActuales[0] : null; // Retorna el primer pedido de la cola return pedidosActuales.length > 0 ? pedidosActuales[0] : null; // Retorna el primer pedido de la cola
} }
**/ **/
/** /**
* @brief Finaliza el pedido que está actualmente en curso. * @brief Finaliza el pedido que está actualmente en curso.
* *
...@@ -77,7 +60,7 @@ export class ServicioPedidoService { ...@@ -77,7 +60,7 @@ export class ServicioPedidoService {
} }
} }
} }
private mostrarNotificacion(mensaje: string): void { private mostrarNotificacion(mensaje: string): void {
this.snackBar.open(mensaje, 'OK', { this.snackBar.open(mensaje, 'OK', {
duration: 10000, duration: 10000,
...@@ -85,6 +68,6 @@ export class ServicioPedidoService { ...@@ -85,6 +68,6 @@ export class ServicioPedidoService {
verticalPosition: 'top', verticalPosition: 'top',
}); });
} }
} }

35.8 KB | W: | H:

35.8 KB | W: | H:

src/assets/robot-icon.png.png
src/assets/robot-icon.png
src/assets/robot-icon.png.png
src/assets/robot-icon.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment