2011-12-13 8 views
-1

Этот псевдокод предназначен для приемника, который пытается получить доступ к беспроводной среде при отправке и приеме данных с датчиков.Псевдокод для доступа к беспроводной среде в машину конечного состояния

  1. установить pc = 0.01
  2. послать избирательный пакет
  3. Если датчик не реагирует на пакет опроса, установить pc = min (pc + 0.01, 1.0)
  4. Если пакет данных успешно получен от одного из датчиков, сохранить pc по текущей стоимости
  5. Если есть столкновение между двумя или более датчиками, как указано поврежденным пакетом данных, установите pc = pc/2
  6. Повторите шаг 2

Я прочел ссылку How to read a FSM diagram, и это действительно помогло мне в части датчика. Но я все еще запутался в попытке конвертировать вышеуказанный псевдокод в FSM.

Может ли кто-нибудь предложить ссылку или книгу, которая дает четкое объяснение о преобразовании псевдокода в FSM?

+0

Название отстой, но оно лучше, чем вы изначально. Пожалуйста, улучшите его; Я не знаю много о сети, поэтому я оставлю это вам. –

ответ

0

Я не уверен, что вы действительно ищете здесь; кодирование это просто было бы довольно прямолинейно, и эта проблема не выглядит так, как она заслуживает мне full-blown FSM table-driven approach.

Вот некоторые C-как псевдо-код:

double pc = 0.01; 
int sensorsfd; 

void loop(void) { 
    for (;;) { 
     fd_set readfds, writefds, exceptfds; 
     FD_ZERO(&readfds); 
     FD_ZERO(&writefds); 
     FD_ZERO(&exceptfds); 
     FD_SET(sensorsfd, &readfds); 

     struct timeval tv; 
     tv.tv_sec = 0; 
     tv.tv_usec = 1; /* 0.001 seconds */ 

     int r; 

     send_polling_packet(); 

     r = select(sensorsfd+1, &readfds, &writefds, &exceptfds, &tv); 

     if (r == -1 && errno == EINTR) { 
      continue; 
     } else if (r == -1) { 
      perror("select() failed"); 
      exit(1); 
     } else if (r == 0) { 
     /* timeout expired */ 
      pc = min (pc + 0.01, 1.0); 
     } else if (r == 1) { 
     /* sensorsfd won't block when reading it */ 
      packet_t p = read_packet(sensorsfd); 
     /* should also handle _no packet_ if the sensors 
      socket returns EOF */ 
      if (packet_corrupted(p)) { 
       pc /= 2; 
      } else { 
       handle_packet(p); 
      } 
     } else { 
      /* error in program logic */ 
     } 
    } 
} 

Псевдо-код в том смысле, что я просто написал это, и нет никакого механизма, чтобы проверить его. Если ваша программа будет намного сложнее, чем вы, то, возможно, хотите инкапсулировать всю установку select(2) в свою собственную функцию, а , возможно, все детали обработки пакета из гнезда датчика.