Skip to main content
. 2021 Nov 1;21(21):7276. doi: 10.3390/s21217276
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)
   }