Odometria y camino mqtt hecho

parent 4bbcd249
......@@ -20,7 +20,7 @@ export class AppComponent implements OnInit, OnDestroy {
private publishInterval: Subscription = new Subscription(); //Variable para publicar datos cada 10 segundos
//0202000105030705000200041109060110031000000200080101100110000106010701
message: string = ''; //Variable para mostrar el mensaje MQTT
message: string = '0202000105030705000200041109060110031000000200080101100110000106010701'; //Variable para mostrar el mensaje MQTT
@ViewChild(MapaComponent) mapaComponent!: MapaComponent;
@ViewChild(CrearPedidoDialogComponent) pedidodialog!: CrearPedidoDialogComponent;
......@@ -29,8 +29,7 @@ export class AppComponent implements OnInit, OnDestroy {
constructor(public dialog: MatDialog, private mqttService: MqttService, private backendService:BackendService, private pedidoService: ServicioPedidoService) {}
ngOnInit() {
this.subscribeToTopic(); //Nos suscribimos al inicializar la aplicación
this.startPublishing(); //Publicamos datos cada 10 segundos
this.subscribeToTopicMapa(); //Nos suscribimos al inicializar la aplicación
this.subscribeToFinaliza();
this.subscribeToTopicPosicion();
......@@ -47,7 +46,7 @@ export class AppComponent implements OnInit, OnDestroy {
* y además se muestra en la consola.
*/
subscribeToTopic() {
subscribeToTopicMapa() {
console.log('Conectado:');
this.subscription = this.mqttService.observe('map').subscribe((data: IMqttMessage) => {
......@@ -80,7 +79,7 @@ subscribeToTopicPosicion() {
}
subscribeToFinaliza() {
this.finalizaSubscription = this.mqttService.observe('finalizacion').subscribe({
this.finalizaSubscription = this.mqttService.observe('equipoD/finalizacion').subscribe({
next: (message) => {
console.log('Robot ha finalizado el pedido:', message.payload.toString());
this.procesarFinalizacionPedido();
......@@ -99,15 +98,6 @@ procesarFinalizacionPedido() {
* 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 {
const dialogRef = this.dialog.open(CrearPedidoDialogComponent, {
width: '1100px',
......@@ -134,29 +124,47 @@ enviarCaminos(actual: number, paquete: number, destino: number) {
this.backendService.enviarCaminos(actual, paquete, destino).then(response => {
console.log('Caminos recibidos:', response);
// Transformación del array a string
const caminosString = this.formatearYQuitarUltimo(response);
console.log('Caminos formateados:', caminosString);
// Actualizar el último ID de destino con el penúltimo número
const responseString = typeof response === 'string' ? response : JSON.stringify(response);
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 => {
console.error('Error al obtener los caminos:', error);
});
}
/**
* Convierte un array de arrays de números a un string en el formato "31,26,25;26,21,16,15".
* @param caminos Array de arrays de números que representan los caminos.
*/
formatearYQuitarUltimo(caminos: number[][]): string {
let caminosFormateados = caminos.map(camino => {
if (camino.length > 1) camino.pop(); // Quita el último elemento si hay más de uno
return camino.join(',');
}).join(';');
return caminosFormateados;
formatearCamino(response: any): string {
// Si la respuesta no es un string, se asume que es un array de arrays y se formatea
if (typeof response !== 'string') {
return response.map((subarray: number[]) => subarray.join(',')).join(';');
}
return response;
}
obtenerPenultimosNumeros(caminosString: string): string {
// 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.
* @param mensaje El mensaje a publicar.
......@@ -168,6 +176,4 @@ enviarMensajeMQTT(mensaje: string) {
});
}
}
......@@ -14,7 +14,7 @@ import { HttpClientModule } from '@angular/common/http';
// Configuración de MQTT
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
path: '/mqtt',
protocol: 'ws' // Usar 'wss' para conexiones seguras
......
......@@ -10,7 +10,5 @@
<p>Punto de recogida: Casilla ({{ pedido.puntoDeRecogida.row }}, {{ pedido.puntoDeRecogida.col }})</p>
<p>Punto de entrega: Casilla ({{ pedido.puntoDeEntrega.row }}, {{ pedido.puntoDeEntrega.col }})</p>
</div>
<!-- Botón para eliminar el pedido de la cola -->
<button (click)="eliminarPedido(pedido.id)" class="eliminar-pedido-btn">Eliminar</button>
</div>
</div>
......@@ -37,12 +37,9 @@ export class ColaPedidosComponent implements OnInit {
/**
* @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.
*
*
* @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 {
// Extiende la definición de cada celda en tu matriz del mapa
mapMatrix: {id: string, idUnico: number, robotPresente: boolean}[][] = [];
//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;
cols: number = 5;
SeleccionadoIdRecogida: string | null = null;
......
......@@ -20,7 +20,7 @@ export class ServicioPedidoService {
/**
* @brief Agrega un nuevo pedido a la cola y emite el cambio a todos los suscriptores.
*
*
* @param {Pedido} pedido - El nuevo pedido a agregar.
*/
agregarPedido(pedido: Pedido): void {
......@@ -30,26 +30,9 @@ export class ServicioPedidoService {
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).
*
*
* @returns {Pedido | null} El pedido en curso o null si no hay ninguno.
*
obtenerPedidoEnCurso(): Pedido | null {
......@@ -57,7 +40,7 @@ export class ServicioPedidoService {
return pedidosActuales.length > 0 ? pedidosActuales[0] : null; // Retorna el primer pedido de la cola
}
**/
/**
* @brief Finaliza el pedido que está actualmente en curso.
*
......@@ -77,7 +60,7 @@ export class ServicioPedidoService {
}
}
}
private mostrarNotificacion(mensaje: string): void {
this.snackBar.open(mensaje, 'OK', {
duration: 10000,
......@@ -85,6 +68,6 @@ export class ServicioPedidoService {
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