Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////////////////////////////////////////////////
- // Uwaga! Przed kompilacją programu dopasować dołączany plik #inlude "Schemat?.h" //
- ////////////////////////////////////////////////////////////////////////////////////
- struct Pas
- {
- int alt1;
- int alt2;
- bit swiatlo;
- bit poz1;
- bit last_poz1;
- bit poz2;
- int prio;
- long czas;
- };
- struct PasOut
- {
- bit poz;
- bit last_poz;
- };
- struct Suma
- {
- int in;
- int out;
- };
- struct Zad
- {
- int stan;
- int tim;
- int inne;
- };
- Zad zmienFaze = {1,0,0};
- Zad brakAut = {1,0,0};
- Zad aktPrio = {1,0,0};
- Zad nocny = {1,0,0};
- Zad wybierzTryb = {1,0,0};
- Zad wyswietlacz = {1,0,0};
- Zad pAuto = {1,0,0};
- Zad sWlacz = {1,0,0};
- Suma suma;
- Pas pas[8] = {{2,5},{1,6},{4,7},{3,8},{1,6},{2,5},{3,8},{4,7}};
- PasOut pasOut[4];
- int max, iMax, iMax2;
- int tryb;
- int cosCzeka;
- int skrzPuste;
- int wlacz;
- int pAutoTim[4]={35,35,35,35};
- int nextStan=1;
- void Out();
- void Max();
- int MaxPrio();
- int OblicziMax();
- int OblicziMax2();
- long MaxCzas();
- void Wlacz();
- ////////////////////////////////////////////////////////////////////////////////////
- void Wyswietlacz()
- {
- Zad zad = wyswietlacz;
- switch(zad.stan)
- {
- case 1:
- sprintf(buf,"dz, st=%d ",(int)zmienFaze.stan);
- sprintf(buf2,"max prio=%d ",(int)MaxPrio());
- if(tryb==2) zad.stan = 3;
- if(tryb==3) zad.stan = 5;
- if(tryb==4) zad.stan = 6;
- if(aK5) zad.stan = 2; break;
- case 2:
- sprintf(buf,"prio %d %d %d %d ",(int)pas[1].prio, (int)pas[2].prio, (int)pas[3].prio, (int)pas[4].prio);
- sprintf(buf2,"dzie %d %d %d %d ",(int)pas[0].prio, (int)pas[7].prio, (int)pas[6].prio, (int)pas[5].prio);
- if(tryb==2) zad.stan = 3;
- if(tryb==3) zad.stan = 5;
- if(tryb==4) zad.stan = 6;
- if(!aK5) zad.stan = 1; break;
- case 3:
- sprintf(buf,"n, st=%d ",(int)nocny.stan);
- sprintf(buf2,"max czas=%d ",(int)MaxCzas()/10);
- if(tryb==1) zad.stan = 1;
- if(tryb==3) zad.stan = 5;
- if(tryb==4) zad.stan = 6;
- if(aK5) zad.stan = 4; break;
- case 4:
- sprintf(buf,"czasy: %d %d %d %d ",(int)pas[1].czas/10, (int)pas[2].czas/10, (int)pas[3].czas/10, (int)pas[4].czas/10);
- sprintf(buf2,"nocny, %d %d %d %d ",(int)pas[0].czas/10, (int)pas[7].czas/10, (int)pas[6].czas/10, (int)pas[5].czas/10);
- if(tryb==1) zad.stan = 1;
- if(tryb==3) zad.stan = 5;
- if(tryb==4) zad.stan = 6;
- if(!aK5) zad.stan = 3; break;
- case 5:
- sprintf(buf,"tryb pol auto ");
- sprintf(buf2,"%d %d %d %d ",pAutoTim[0],pAutoTim[1],pAutoTim[2],pAutoTim[3]);
- if(tryb==1) zad.stan = 1;
- else if(tryb==2) zad.stan = 3; break;
- case 6:
- sprintf(buf,"tryb reczny ");
- sprintf(buf2," ");
- if(tryb==1) zad.stan = 1;
- else if(tryb==2) zad.stan = 3; break;
- }
- wyswietlacz = zad;
- LCD_xy(1,1); LCD_puts(buf);
- LCD_xy(1,2); LCD_puts(buf2);
- }
- void WybierzTryb()
- {
- Zad zad = wybierzTryb;
- switch(zad.stan)
- {
- case 1: //dzien
- if(MaxPrio() < 15 && skrzPuste && zmienFaze.stan==1) {zad.stan = 2; tryb=2;}
- if(aK8 && skrzPuste && zmienFaze.stan==1) {zad.stan = 3; tryb=3;}
- if(aK7 && zmienFaze.stan==1) {zad.stan = 4; tryb=4;} break;
- case 2: //noc
- if(MaxCzas()/10 > 20 && skrzPuste && nocny.stan==1) {zad.stan = 1; tryb=1;}
- if(aK8 && skrzPuste && nocny.stan==1) {zad.stan = 3; tryb=3;}
- if(aK7 && nocny.stan==1) {zad.stan = 4; tryb=4;} break;
- case 3: //polautomat
- if(!aK8 && MaxCzas()/10 > 20 && skrzPuste && pAuto.stan==1) {zad.stan = 1; tryb=1;}
- else if (!aK8 && MaxPrio() < 15 && skrzPuste && pAuto.stan==1) {zad.stan = 2; tryb=2;} break;
- case 4: //reczny
- if(!aK7 && MaxCzas()/10 > 20 && skrzPuste && !aK1 && !aK2 && !aK3 && !aK4) {zad.stan = 1; tryb=1;}
- else if (!aK7 && MaxPrio() < 15 && skrzPuste && !aK1 && !aK2 && !aK3 && !aK4) {zad.stan = 2; tryb=2;} break;
- }
- wybierzTryb = zad;
- }
- void PAuto()
- {
- Zad zad = pAuto;
- int i;
- switch(zad.stan)
- {
- case 1:
- if(skrzPuste && !aK6 && aK8) {zad.stan=2; iMax=nextStan*2-2; iMax2=nextStan*2-1;
- wlacz=1; nextStan+=0; zad.tim=10;} break;
- case 2:
- if(!zad.tim) {zad.stan=3; iMax=nextStan*2-2; iMax2=nextStan*2-1;
- wlacz=1; nextStan+=0; zad.tim=pAutoTim[nextStan-1];} break;
- case 3:
- if(aK6) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
- pAutoTim[nextStan-1]+=0; nextStan=(nextStan%4)+1;}
- if(!zad.tim) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
- pAutoTim[nextStan-1]+=25; nextStan=(nextStan%4)+1;}
- if(brakAut.inne) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
- pAutoTim[nextStan-1]-=25; nextStan=(nextStan%4)+1;} break;
- }
- if(zad.tim)--zad.tim;
- for(i=0;i<4;i++)
- {
- if(pAutoTim[i]<20)pAutoTim[i]=20;
- if(pAutoTim[i]>120)pAutoTim[i]=120;
- }
- pAuto = zad;
- }
- void Nocny()
- {
- Zad zad = nocny;
- switch(zad.stan)
- {
- case 1: //oczekiwanie na włączenie
- if(skrzPuste && (pas[0].poz1 || pas[4].poz1)) {zad.stan = 2; iMax = 0; iMax2 = 4; wlacz = 1; zad.tim = 10;}
- else if(skrzPuste && (pas[1].poz1 || pas[5].poz1)) {zad.stan = 3; iMax = 1; iMax2 = 5; wlacz = 1; zad.tim = 10;}
- else if(skrzPuste && (pas[2].poz1 || pas[6].poz1)) {zad.stan = 4; iMax = 2; iMax2 = 6; wlacz = 1; zad.tim = 10;}
- else if(skrzPuste && (pas[3].poz1 || pas[7].poz1)) {zad.stan = 5; iMax = 3; iMax2 = 7; wlacz = 1; zad.tim = 10;}break;
- case 2: //poz pros
- if(!zad.tim && brakAut.inne && cosCzeka) {zad.stan=1; wlacz = 0;} break;
- case 3: //poz lewo
- if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
- case 4: //pion prosto
- if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
- case 5: //pion lewo
- if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
- }
- if(zad.tim)--zad.tim;
- nocny = zad;
- }
- void Dzienny()
- {
- Zad zad = zmienFaze;
- switch(zad.stan)
- {
- case 1: //oczekiwanie na włączenie
- if(skrzPuste)
- {
- zad.stan = 2;
- zad.tim = 30;
- iMax = OblicziMax();
- iMax2 = OblicziMax2();
- wlacz = 1;
- pas[iMax].prio = pas[iMax].prio;
- pas[iMax2].prio = pas[iMax2].prio;
- }
- break;
- case 2: //włączenie dokł 3s
- if(!zad.tim)
- {
- zad.stan = 3;
- zad.tim = 50;
- iMax = iMax;
- iMax2 = iMax2;
- wlacz = 1;
- pas[iMax].prio = pas[iMax].prio;
- pas[iMax2].prio = pas[iMax2].prio;
- }
- break;
- case 3: //oczekiwanie na brak aut;
- if(brakAut.inne)
- {
- zad.stan = 1;
- iMax = iMax;
- iMax2 = iMax2;
- wlacz = 0;
- pas[iMax].prio = 0;
- pas[iMax2].prio = 0;
- }
- if(!zad.tim)
- {
- zad.stan = 1;
- iMax = iMax;
- iMax2 = iMax2;
- wlacz = 0;
- pas[iMax].prio = 10;
- pas[iMax2].prio = 10;
- }
- break;
- }
- if(zad.tim)--zad.tim;
- zmienFaze = zad;
- }
- void AktPrio()
- {
- int i;
- Zad zad = aktPrio;
- switch(zad.stan){
- case 1:
- if(!zad.tim){
- for(i=0; i<8; i++)
- pas[i].prio += (pas[i].poz1 + pas[i].poz2 * 2);
- zad.tim = 10;
- zad.stan = 1;
- }
- break;
- }
- if(zad.tim)--zad.tim;
- aktPrio = zad;
- }
- void BrakAut(int max, int max2)
- {
- Zad zad = brakAut;
- switch(zad.stan){
- case 1: //jest auto
- zad.inne = 0;
- if (!pas[max].poz1 && !pas[max2].poz1)
- {
- zad.stan = 2;
- zad.tim = 20;
- }
- break;
- case 2:
- zad.inne = 0;
- if(pas[max].poz1 || pas[max2].poz1) zad.stan = 1;
- else if(!zad.tim) zad.stan = 3;
- break;
- case 3: //brak auta
- zad.inne = 1;
- if(pas[max].poz1 || pas[max2].poz1) zad.stan = 1;
- break;
- }
- if(zad.tim)--zad.tim;
- brakAut = zad;
- }
- int CosCzeka()
- {
- int i;
- for(i=0;i<8;i++){
- if(pas[i].poz1) return 1;
- }
- return 0;
- }
- int Puste()
- {
- return suma.in == suma.out;
- }
- void Sumuj()
- {
- int i;
- for(i=0; i<8; i++)
- {
- suma.in+=pas[i].last_poz1 && !pas[i].poz1;
- }
- for(i=0; i<4; i++)
- {
- suma.out+=!pasOut[i].last_poz && pasOut[i].poz;
- }
- }
- void LiczCzas()
- {
- int i;
- for(i=0; i<8; i++){
- if(pas[i].poz1) pas[i].czas++;
- else pas[i].czas = 0;
- }
- }
- void Wlacz()
- {
- Zad zad = sWlacz;
- switch(zad.stan)
- {
- case 1:
- int i;
- for(i=0;i<8;i++)
- {
- pas[i].swiatlo = 0;
- }
- if(wlacz) zad.stan=2; break;
- case 2:
- pas[iMax].swiatlo = 1;
- pas[iMax2].swiatlo = 1;
- if(!wlacz) zad.stan=1; break;
- }
- sWlacz=zad;
- }
- long MaxCzas()
- {
- int i, Max=0;
- for(i = 0; i<8; i++)
- {
- if(pas[i].czas > Max)
- {
- Max = pas[i].czas;
- }
- }
- return Max;
- }
- int MaxPrio()
- {
- int i, Max=0;
- for(i = 0; i<8; i++)
- {
- if(pas[i].prio > Max)
- {
- Max = pas[i].prio;
- }
- }
- return Max;
- }
- int OblicziMax()
- {
- int i, imax = 0;
- for(i = 0; i<8; i++)
- {
- if(pas[i].prio > max)
- {
- max = pas[i].prio;
- imax = i;
- }
- }
- max = 0;
- return imax;
- }
- int OblicziMax2()
- {
- if(pas[pas[iMax].alt1-1].prio > pas[pas[iMax].alt2-1].prio)
- return pas[iMax].alt1-1;
- else
- return pas[iMax].alt2-1;
- }
- void Reczny()
- {
- pas[0].swiatlo = pas[4].swiatlo = aK1 ? 1 : 0;
- pas[1].swiatlo = pas[5].swiatlo = aK2 ? 1 : 0;
- pas[2].swiatlo = pas[6].swiatlo = aK3 ? 1 : 0;
- pas[3].swiatlo = pas[7].swiatlo = aK4 ? 1 : 0;
- }
- void In()
- {
- pas[0].poz1 = X1;
- pas[1].poz1 = X2;
- pas[2].poz1 = X3;
- pas[3].poz1 = X4;
- pas[4].poz1 = X5;
- pas[5].poz1 = X6;
- pas[6].poz1 = X7;
- pas[7].poz1 = X8;
- pas[0].poz2 = X13;
- pas[1].poz2 = X15;
- pas[4].poz2 = X14;
- pas[5].poz2 = X16;
- pasOut[0].poz = X9;
- pasOut[1].poz = X10;
- pasOut[2].poz = X11;
- pasOut[3].poz = X12;
- }
- void Out()
- {
- Z1 = pas[0].swiatlo;
- Z2 = pas[1].swiatlo;
- Z3 = pas[2].swiatlo;
- Z4 = pas[3].swiatlo;
- Z5 = pas[4].swiatlo;
- Z6 = pas[5].swiatlo;
- Z7 = pas[6].swiatlo;
- Z8 = pas[7].swiatlo;
- int i;
- for(i=0; i<8; i++)
- {
- pas[i].last_poz1 = pas[i].poz1;
- }
- for(i=0; i<4; i++)
- {
- pasOut[i].last_poz = pasOut[i].poz;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement