Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Alejandro Martínez Muñoz
/
ProyectoRobotAmbientales
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
d55a88a1
authored
May 09, 2024
by
Fátima Sanz Baena
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Odometria y camino mqtt hecho
parent
4bbcd249
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
47 additions
and
64 deletions
src/app/app.component.ts
src/app/app.module.ts
src/app/cola-pedidos/cola-pedidos.component.html
src/app/cola-pedidos/cola-pedidos.component.ts
src/app/mapa/mapa.component.ts
src/app/servicio-pedido.service.ts
src/assets/robot-icon.png.png → src/assets/robot-icon.png
src/app/app.component.ts
View file @
d55a88a1
...
...
@@ -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
()
{
subscribeToTopic
Mapa
()
{
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) {
});
}
}
src/app/app.module.ts
View file @
d55a88a1
...
...
@@ -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
...
...
src/app/cola-pedidos/cola-pedidos.component.html
View file @
d55a88a1
...
...
@@ -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>
src/app/cola-pedidos/cola-pedidos.component.ts
View file @
d55a88a1
...
...
@@ -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
}
src/app/mapa/mapa.component.ts
View file @
d55a88a1
...
...
@@ -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
;
...
...
src/app/servicio-pedido.service.ts
View file @
d55a88a1
...
...
@@ -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'
,
});
}
}
}
src/assets/robot-icon.png
.png
→
src/assets/robot-icon.png
View file @
d55a88a1
35.8 KB
|
W:
|
H:
35.8 KB
|
W:
|
H:
2-up
Swipe
Onion skin
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment