Разработка микропроцессорной системы автоматической переездной сигнализации, страница 8

                 nTestOK[i]++;

             else

               // иначе уменьшаем

               if ( nTestOK[i] > 0 )

                 nTestOK[i]--;

             // Если число совпадений равно нулю

             if ( !nTestOK[i] )

               // сохраняем полученную информацию

               // в структуре.

               CopyAllSensorsInfo(pCurSensorsInfo[i], &init_sens[i]);

             // сохранение текущей структуры сенсоров

             // во флэш-памяти

             WriteFlashSensorsInfo(icFlashStartSegment, i, &init_sens[i]);

             // удаляем полученную информацию

             delete pCurSensorsInfo[i];

             pCurSensorsInfo[i] = 0L;

           }

    }

    while((TestFlashSensorsInfo(&sensors) & 0x0007) != 0x0007);

  }

  // на выходных линиях устанавливаем сигнал 0(закрыто)

  SetOutput(0x0000,2);

  // разрешаем сторожевой таймер

  WDT_enable();

  // инициализируем основные структуры данных

  ClearScheme();

  ClearSkipBuffer();

  //инициализация последовательного порта rs-485

  com_485_install();

      com_485_set_format(16, 0, 1);

      com_485_set_speed((unsigned long)9600);

  // число активных датчиков   

  int nActive = 0;

  // состояние переезда

  int nOutput = 0x0000;

  boolean faza;

  boolean faza1=true;

  // Основной цикл работы

  for(;;)

  {

    nActive = 0;

    nOutput = uicActive;

// функция чтения информации всех датчиков

    register int nSensor = 0;

    // проходим все модули

    // текущий модуль - модуль ввода информации с путевых реле

       nModule == 0;

        // проходим все его биты

unsigned char cValue;

        for(register int nPin = 0; nPin < 2; nPin++)      

        {

           // получаем значение очередной ножки

           Get5052(nModule, nPin, ABit, &cValue);

           // если значение на ножке = 0

           if ( cValue == 0 )

           nSensor++;

        }

             //определение количество включенных светофоров

int work=0;

              // текущий модуль - модуль ввода информации контроля

                 nModule == 1;

              // проходим все его биты

             for(register int nPin = 0; nPin < 8; nPin+2)      

             { // получаем значение очередной ножки

               Get5052(nModule, nPin, ABit, &cValue);

               char f_pin=cValue;

               int s_pin=nPin+1;

               Get5052(nModule, s_pin, ABit, &cValue);

               if (f_pin==1 || cValue==1) work++;

              }

           //чтение информации с последовательного порта от дежурного

               com_rx_string(word);

//проверка занятости переезда или прихода команды закрытия

           if (nSensor>0 || word==0x0000)

           {

//переключение сигналов светофоров

if (work>1)

             {

               ChangeSignal();

               if (faza) SetOutput(0x0005,2);

  else SetOutput(0x000A,2);

    faza=!faza;

}

             //первоначальное включение светофоров и опускание шлагбаумов

else

             {

               faza=true;

    SetOutput(0x000A,2)

    for (int paus=0; paus<20; paus++)

    {

    ChangeSignal();

                 if (faza) SetOutput(0x0035,2); 

  else SetOutput(0x003A,2);

      faza=!faza;

}

    if (faza) SetOutput(0x0005,2); 

  else SetOutput(0x000A,2);

    faza=!faza;

             }

         }

        //выключение светофоров и открытие шлагбаумов

else

{         

             if (work!=0)

               SetOutput(0x003F,2);

            } 

//формирование последовательностей для ссвк

    if (faza1) SetOutput(0x0005,3);

else SetOutput(0x000A,3);

  faza1=!faza1;

//снятие информации с портов ввода и передача ее по rs-485

// текущий модуль - модуль ввода информации контроля

    nModule == 1;

    Get5052(nModule, 0, AWord, &in_word);

    com_tx_string(in_word);

  }

  }

void SetOutput(unsigned int uiOutput, int n)

{

    // текущий модуль - модуль вывода

    nModule = n;

    out_word = uiOutput;

    Set5050(nModule, 0, AWord, &out_word);          

    break;

}

//процедура задержки на 2 секунды

void ChangeSignal();

{

int old_t;

struct dostime_t t;

wdt_enable();

_dos_gettime(&t);

old_t=t.second;

while (1==1)

{

if (t.second-old_t>=2) break;

if (old_t==58 && t.second>=0) break;

if (old_t==59 && t.second>=1) break;

}

}