| Algorithm 1 Fog model coded in Promela |
|
#define N 2
#define INF 99 mtype = MSG chan fromSensor[N*N] = [1] of mtype,byte,byte chan toActuator[N*N] = [1] of mtype,byte,byte chan Fog2Edge[N*N] = [1] of mtype,byte,byte chan Edge2Fog[N*N] = [1] of mtype,byte,byte chan Fog2Cloud[N] = [1] of mtype,byte,byte chan Cloud2Fog[N] = [1] of mtype,byte,byte proctype Devices (byte id) { byte x,y,n=0; do :: n<1 -> fromSensor[id] ! MSG(id,INF); n++ :: toActuator[id] ? MSG(x,y) od } proctype Edge (byte id) { byte x,y; do :: if :: fromSensor[id] ? MSG(x,y) -> if :: toActuator[id] ! MSG(x,id) :: Edge2Fog[id] ! MSG(x,y) fi :: Fog2Edge[id] ? MSG(x,y)->toActuator[id] ! MSG(x,y) fi od } proctype Fog (byte id) { byte x,y; do :: Edge2Fog[id*2] ? MSG(x,y) -> if :: Fog2Edge[id*2+1] ! MSG(x,id*2+1) :: Fog2Cloud[id] ! MSG(x,y) fi :: Edge2Fog[id*2+1] ? MSG(x,y) -> if :: Fog2Edge[id*2] ! MSG(x,id*2) :: Fog2Cloud[id] ! MSG(x,y) fi :: Cloud2Fog[id] ? MSG(x,y) -> Fog2Edge[y] ! MSG(x,y) od } proctype Cloud (byte id) { byte x,y; do ::Fog2Cloud[0] ? MSG(x,y) -> select(y:N..N+1) -> Cloud2Fog[1] ! MSG(x,y) ::Fog2Cloud[1] ? MSG(x,y) -> select(y:0..1)-> Cloud2Fog[0] ! MSG(x,y) od } init { byte i; for (i : 0..(N*N-1)) run Devices (i) run Edge(i) for (i : 0..(N-1)) run Fog (i) run Cloud(0) } |