

Red de Petri para el problema del Lector-Escritor sin preferencia:

Red de Petri para el problema del Lector-Escritor con preferencia de escritura:


Como entidades podemos identificar a las mesas, mozos, cocina y depósito. La idea es que los mozos puedan atender mesas, notificar pedidos a la cocina, llevar pedidos a las mesas y cobrar a las mismas. Por otro lado los clientes deben poder hacer pedidos y la cuenta a los mozos. Por parte de la cocina, la misma debe ser capaz atender pedidos que traigan los mozos y buscar ingredientes al depósito. Por otro lado el depósito recibirá mensajes para ingresar al mismo.
/* Actores */
struct Mesa {
id: usize,
mozo_a_cargo: Recipient<Result>
}
struct Mozo {
id: usize,
pedidos_mesas: HashMap<usize, Pedido>,
cocina: Recipient<Result>
}
struct Cocina {
pedidos_mesas: HashMap<usize, Pedido>,
}
struct Deposito {
cocina: Recipient<Result>
}
/* Mensajes */
struct Pedido {
id_mesa: usize,
platos: HashMap<i32, i32>, // Este es un diccionario cuya clave es el ID del plato y su valor la cantidad solicitada del mismo.
mesa_solicitante: Recipient<Result>
}
struct SolicitudCuenta {
id_mesa: usize,
mesa_solicitante: Recipient<Result>
}
struct SolicitudIngredientes {
id_mesa: usize
}
struct RespuestaIngredientes {
id_mesa: usize
}
struct Cuenta {
monto: f64
}
/* Handles */
impl Handler<Pedido> for Mozo {
type Result = ();
fn handle(&mut self, msg: Pedido, _ctx: &mut Context<Self>) -> Self::Result {
let p_id_mesa = msg.0;
let p_platos = msg.1;
let p_mesa_solicitante = msg.2;
println!("[MOZO {}] Tengo el pedido de la mesa {}, se lo paso a cocina.", self.id, id_mesa);
pedidos_mesas[p_id_mesa] = p_platos;
cocina.try_send(Pedido {id: p_id_mesa, platos: p_platos, mesa_solicitante: p_mesa_solicitante} );
}
}
impl Handler<Pedido> for Cocina{
type Result = ();
fn handle(&mut self, msg: Pedido, _ctx: &mut Context<Self>) -> Self::Result {
let p_id_mesa = msg.0;
let p_platos = msg.1;
let p_mesa_solicitante = msg.2;
println!("[COCINA {}] Vamos a preparar el pedido de la mesa {}, busquemos los ingredientes en el depósito.", id_mesa);
pedidos_mesas[p_id_mesa] = p_platos;
deposito.try_send(SolicitudIngredientes { id_mesa: p_id_mesa, mesa_solicitante} );
}
}
impl Handler<SolicitudCuenta> for Mozo {
type Result = ();
fn handle(&mut self, msg: SolicitudCuenta, _ctx: &mut Context<Self>) -> Self::Result {
let p_id_mesa = msg.0;
let p_mesa_solicitante = msg.1;
println!("[MOZO {}] Me piden la cuenta de la mesa {}, voy a buscar el ticket.", self.id, id_mesa);
let monto_total = 0.00;
let pedido = pedidos_mesas[p_id_mesa];
for (plato, cantidad) in pedido.platos {
monto_total += precios[plato] * cantidad;
}
pedidos_mesas[p_id_mesa] = null;
p_mesa_solicitante.try_send(Cuenta {monto: monto_total} );
}
}
impl Handler<Cuenta> for Mesa {
type Result = ();
fn handle(&mut self, msg: Cuenta, _ctx: &mut Context<Self>) -> Self::Result {
println!("[MESA {}] Acá tiene los ${}, nos vemos !.", self.id, msg.0);
}
}

