-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtaxi.erl
76 lines (69 loc) · 2.81 KB
/
taxi.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
-module(taxi).
-export([crear_taxi/3, inicio/0]).
-import('matriz', [genera_nodo/1]).
crear_taxi(Tipo, Placas, NombreCentral)->
lista_centrales ! {crear_taxi, {Tipo,Placas,NombreCentral}}.
% taxi
servicio_taxi(Tipo,Placas,PID_Central) ->
process_flag(trap_exit, true),
link(PID_Central),
receive
{PID_Cliente, {_,_}} ->
Espera = wait(),
io:fwrite("~ts El taxi con placas ~s se tardará ~p ms en llegar al cliente con PID ~p ~n", ["◻︎",Placas,Espera, PID_Cliente]),
receive
{PID_Cliente, cancelar} ->
io:fwrite("~ts El taxi con placas ~s fue cancelado por cliente con PID ~p ~n", ["✖︎",Placas,PID_Cliente]),
PID_Central ! {respuesta_taxi, servicio_cancelado},
PID_Central ! {nuevo_taxi, {self(), Tipo, Placas}},
servicio_taxi(Tipo,Placas,PID_Central)
after Espera ->
io:fwrite("~ts El taxi con placas ~s hizo el servicio con exito ~n", ["◼︎",Placas]),
PID_Cliente ! {taxi,llega},
PID_Central ! {respuesta_taxi, servicio_ofrecido}
end;
{'EXIT', PID_Central, _} ->
io:format("~ts La central con PID ~p ya no está funcionando. Taxi con placas ~p va a terminar~n", ["▷",PID_Central, Placas])
end.
lista_centrales(ListaCentrales) ->
receive
{crear_taxi, {Tipo, Placas, NombreCentral}} ->
case buscar(NombreCentral, ListaCentrales) of
indefinido ->
io:fwrite("La central no existe ~n"),
lista_centrales(ListaCentrales);
PID_Central ->
PID_Taxi = spawn(fun() -> servicio_taxi(Tipo, Placas, PID_Central) end),
PID_Central ! {nuevo_taxi, {PID_Taxi, Tipo, Placas}},
lista_centrales(ListaCentrales)
end;
{respuesta_central, NombreCentral, {X,Y}, PID_Central} ->
lista_centrales(ListaCentrales ++ [{NombreCentral, {X,Y}, PID_Central}]);
{listar_servicios, NombreCentral} ->
case buscar(NombreCentral, ListaCentrales) of
indefinido ->
io:fwrite("La central no existe ~n"),
lista_centrales(ListaCentrales);
PID_Central ->
PID_Central ! listar_servicios,
lista_centrales(ListaCentrales)
end;
{listar_taxis, NombreCentral} ->
case buscar(NombreCentral, ListaCentrales) of
indefinido ->
io:fwrite("La central no existe ~n"),
lista_centrales(ListaCentrales);
PID_Central ->
PID_Central ! listar_taxis,
lista_centrales(ListaCentrales)
end
end.
wait() -> rand:uniform(5000).
buscar(Nombre, [{Nombre, _, PID_Central}|_]) ->
PID_Central;
buscar(Quien, [_|T]) ->
buscar(Quien, T);
buscar(_, _) ->
indefinido.
inicio() ->
register(lista_centrales, spawn(fun() -> lista_centrales([]) end)).