Advertisement
Guest User

Untitled

a guest
May 27th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.53 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////////
  2. // Uwaga! Przed kompilacją programu dopasować dołączany plik #inlude "Schemat?.h" //
  3. ////////////////////////////////////////////////////////////////////////////////////
  4.  
  5. struct Pas
  6. {
  7. int alt1;
  8. int alt2;
  9. bit swiatlo;
  10. bit poz1;
  11. bit last_poz1;
  12. bit poz2;
  13. int prio;
  14. long czas;
  15. };
  16.  
  17. struct PasOut
  18. {
  19. bit poz;
  20. bit last_poz;
  21. };
  22.  
  23. struct Suma
  24. {
  25. int in;
  26. int out;
  27. };
  28.  
  29. struct Zad
  30. {
  31. int stan;
  32. int tim;
  33. int inne;
  34. };
  35.  
  36. Zad zmienFaze = {1,0,0};
  37. Zad brakAut = {1,0,0};
  38. Zad aktPrio = {1,0,0};
  39. Zad nocny = {1,0,0};
  40. Zad wybierzTryb = {1,0,0};
  41. Zad wyswietlacz = {1,0,0};
  42. Zad pAuto = {1,0,0};
  43. Zad sWlacz = {1,0,0};
  44. Suma suma;
  45. Pas pas[8] = {{2,5},{1,6},{4,7},{3,8},{1,6},{2,5},{3,8},{4,7}};
  46. PasOut pasOut[4];
  47.  
  48. int max, iMax, iMax2;
  49. int tryb;
  50. int cosCzeka;
  51. int skrzPuste;
  52. int wlacz;
  53. int pAutoTim[4]={35,35,35,35};
  54. int nextStan=1;
  55.  
  56. void Out();
  57. void Max();
  58. int MaxPrio();
  59. int OblicziMax();
  60. int OblicziMax2();
  61. long MaxCzas();
  62. void Wlacz();
  63.  
  64. ////////////////////////////////////////////////////////////////////////////////////
  65.  
  66. void Wyswietlacz()
  67. {
  68. Zad zad = wyswietlacz;
  69.  
  70. switch(zad.stan)
  71. {
  72. case 1:
  73. sprintf(buf,"dz, st=%d ",(int)zmienFaze.stan);
  74. sprintf(buf2,"max prio=%d ",(int)MaxPrio());
  75. if(tryb==2) zad.stan = 3;
  76. if(tryb==3) zad.stan = 5;
  77. if(tryb==4) zad.stan = 6;
  78. if(aK5) zad.stan = 2; break;
  79. case 2:
  80. sprintf(buf,"prio %d %d %d %d ",(int)pas[1].prio, (int)pas[2].prio, (int)pas[3].prio, (int)pas[4].prio);
  81. sprintf(buf2,"dzie %d %d %d %d ",(int)pas[0].prio, (int)pas[7].prio, (int)pas[6].prio, (int)pas[5].prio);
  82. if(tryb==2) zad.stan = 3;
  83. if(tryb==3) zad.stan = 5;
  84. if(tryb==4) zad.stan = 6;
  85. if(!aK5) zad.stan = 1; break;
  86. case 3:
  87. sprintf(buf,"n, st=%d ",(int)nocny.stan);
  88. sprintf(buf2,"max czas=%d ",(int)MaxCzas()/10);
  89. if(tryb==1) zad.stan = 1;
  90. if(tryb==3) zad.stan = 5;
  91. if(tryb==4) zad.stan = 6;
  92. if(aK5) zad.stan = 4; break;
  93. case 4:
  94. 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);
  95. 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);
  96. if(tryb==1) zad.stan = 1;
  97. if(tryb==3) zad.stan = 5;
  98. if(tryb==4) zad.stan = 6;
  99. if(!aK5) zad.stan = 3; break;
  100. case 5:
  101. sprintf(buf,"tryb pol auto ");
  102. sprintf(buf2,"%d %d %d %d ",pAutoTim[0],pAutoTim[1],pAutoTim[2],pAutoTim[3]);
  103. if(tryb==1) zad.stan = 1;
  104. else if(tryb==2) zad.stan = 3; break;
  105. case 6:
  106. sprintf(buf,"tryb reczny ");
  107. sprintf(buf2," ");
  108. if(tryb==1) zad.stan = 1;
  109. else if(tryb==2) zad.stan = 3; break;
  110. }
  111. wyswietlacz = zad;
  112. LCD_xy(1,1); LCD_puts(buf);
  113. LCD_xy(1,2); LCD_puts(buf2);
  114. }
  115.  
  116. void WybierzTryb()
  117. {
  118. Zad zad = wybierzTryb;
  119.  
  120. switch(zad.stan)
  121. {
  122. case 1: //dzien
  123. if(MaxPrio() < 15 && skrzPuste && zmienFaze.stan==1) {zad.stan = 2; tryb=2;}
  124. if(aK8 && skrzPuste && zmienFaze.stan==1) {zad.stan = 3; tryb=3;}
  125. if(aK7 && zmienFaze.stan==1) {zad.stan = 4; tryb=4;} break;
  126. case 2: //noc
  127. if(MaxCzas()/10 > 20 && skrzPuste && nocny.stan==1) {zad.stan = 1; tryb=1;}
  128. if(aK8 && skrzPuste && nocny.stan==1) {zad.stan = 3; tryb=3;}
  129. if(aK7 && nocny.stan==1) {zad.stan = 4; tryb=4;} break;
  130. case 3: //polautomat
  131. if(!aK8 && MaxCzas()/10 > 20 && skrzPuste && pAuto.stan==1) {zad.stan = 1; tryb=1;}
  132. else if (!aK8 && MaxPrio() < 15 && skrzPuste && pAuto.stan==1) {zad.stan = 2; tryb=2;} break;
  133. case 4: //reczny
  134. if(!aK7 && MaxCzas()/10 > 20 && skrzPuste && !aK1 && !aK2 && !aK3 && !aK4) {zad.stan = 1; tryb=1;}
  135. else if (!aK7 && MaxPrio() < 15 && skrzPuste && !aK1 && !aK2 && !aK3 && !aK4) {zad.stan = 2; tryb=2;} break;
  136. }
  137. wybierzTryb = zad;
  138. }
  139.  
  140. void PAuto()
  141. {
  142. Zad zad = pAuto;
  143. int i;
  144.  
  145. switch(zad.stan)
  146. {
  147. case 1:
  148. if(skrzPuste && !aK6 && aK8) {zad.stan=2; iMax=nextStan*2-2; iMax2=nextStan*2-1;
  149. wlacz=1; nextStan+=0; zad.tim=10;} break;
  150. case 2:
  151. if(!zad.tim) {zad.stan=3; iMax=nextStan*2-2; iMax2=nextStan*2-1;
  152. wlacz=1; nextStan+=0; zad.tim=pAutoTim[nextStan-1];} break;
  153. case 3:
  154. if(aK6) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
  155. pAutoTim[nextStan-1]+=0; nextStan=(nextStan%4)+1;}
  156. if(!zad.tim) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
  157. pAutoTim[nextStan-1]+=25; nextStan=(nextStan%4)+1;}
  158. if(brakAut.inne) {zad.stan=1; iMax=iMax; iMax2=iMax2; wlacz=0;
  159. pAutoTim[nextStan-1]-=25; nextStan=(nextStan%4)+1;} break;
  160. }
  161. if(zad.tim)--zad.tim;
  162. for(i=0;i<4;i++)
  163. {
  164. if(pAutoTim[i]<20)pAutoTim[i]=20;
  165. if(pAutoTim[i]>120)pAutoTim[i]=120;
  166. }
  167. pAuto = zad;
  168. }
  169.  
  170. void Nocny()
  171. {
  172. Zad zad = nocny;
  173.  
  174. switch(zad.stan)
  175. {
  176. case 1: //oczekiwanie na włączenie
  177. if(skrzPuste && (pas[0].poz1 || pas[4].poz1)) {zad.stan = 2; iMax = 0; iMax2 = 4; wlacz = 1; zad.tim = 10;}
  178. else if(skrzPuste && (pas[1].poz1 || pas[5].poz1)) {zad.stan = 3; iMax = 1; iMax2 = 5; wlacz = 1; zad.tim = 10;}
  179. else if(skrzPuste && (pas[2].poz1 || pas[6].poz1)) {zad.stan = 4; iMax = 2; iMax2 = 6; wlacz = 1; zad.tim = 10;}
  180. else if(skrzPuste && (pas[3].poz1 || pas[7].poz1)) {zad.stan = 5; iMax = 3; iMax2 = 7; wlacz = 1; zad.tim = 10;}break;
  181. case 2: //poz pros
  182. if(!zad.tim && brakAut.inne && cosCzeka) {zad.stan=1; wlacz = 0;} break;
  183. case 3: //poz lewo
  184. if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
  185. case 4: //pion prosto
  186. if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
  187. case 5: //pion lewo
  188. if(!zad.tim && brakAut.inne) {zad.stan=1; wlacz = 0;} break;
  189. }
  190. if(zad.tim)--zad.tim;
  191. nocny = zad;
  192. }
  193.  
  194. void Dzienny()
  195. {
  196. Zad zad = zmienFaze;
  197. switch(zad.stan)
  198. {
  199. case 1: //oczekiwanie na włączenie
  200. if(skrzPuste)
  201. {
  202. zad.stan = 2;
  203. zad.tim = 30;
  204. iMax = OblicziMax();
  205. iMax2 = OblicziMax2();
  206. wlacz = 1;
  207. pas[iMax].prio = pas[iMax].prio;
  208. pas[iMax2].prio = pas[iMax2].prio;
  209. }
  210. break;
  211. case 2: //włączenie dokł 3s
  212. if(!zad.tim)
  213. {
  214. zad.stan = 3;
  215. zad.tim = 50;
  216. iMax = iMax;
  217. iMax2 = iMax2;
  218. wlacz = 1;
  219. pas[iMax].prio = pas[iMax].prio;
  220. pas[iMax2].prio = pas[iMax2].prio;
  221. }
  222. break;
  223. case 3: //oczekiwanie na brak aut;
  224. if(brakAut.inne)
  225. {
  226. zad.stan = 1;
  227. iMax = iMax;
  228. iMax2 = iMax2;
  229. wlacz = 0;
  230. pas[iMax].prio = 0;
  231. pas[iMax2].prio = 0;
  232. }
  233.  
  234. if(!zad.tim)
  235. {
  236. zad.stan = 1;
  237. iMax = iMax;
  238. iMax2 = iMax2;
  239. wlacz = 0;
  240. pas[iMax].prio = 10;
  241. pas[iMax2].prio = 10;
  242. }
  243. break;
  244. }
  245. if(zad.tim)--zad.tim;
  246. zmienFaze = zad;
  247. }
  248.  
  249. void AktPrio()
  250. {
  251. int i;
  252. Zad zad = aktPrio;
  253. switch(zad.stan){
  254. case 1:
  255. if(!zad.tim){
  256. for(i=0; i<8; i++)
  257. pas[i].prio += (pas[i].poz1 + pas[i].poz2 * 2);
  258.  
  259. zad.tim = 10;
  260. zad.stan = 1;
  261. }
  262. break;
  263. }
  264. if(zad.tim)--zad.tim;
  265. aktPrio = zad;
  266. }
  267.  
  268. void BrakAut(int max, int max2)
  269. {
  270. Zad zad = brakAut;
  271. switch(zad.stan){
  272. case 1: //jest auto
  273. zad.inne = 0;
  274. if (!pas[max].poz1 && !pas[max2].poz1)
  275. {
  276. zad.stan = 2;
  277. zad.tim = 20;
  278. }
  279. break;
  280. case 2:
  281. zad.inne = 0;
  282. if(pas[max].poz1 || pas[max2].poz1) zad.stan = 1;
  283. else if(!zad.tim) zad.stan = 3;
  284. break;
  285. case 3: //brak auta
  286. zad.inne = 1;
  287. if(pas[max].poz1 || pas[max2].poz1) zad.stan = 1;
  288. break;
  289. }
  290. if(zad.tim)--zad.tim;
  291. brakAut = zad;
  292. }
  293.  
  294. int CosCzeka()
  295. {
  296. int i;
  297. for(i=0;i<8;i++){
  298. if(pas[i].poz1) return 1;
  299. }
  300. return 0;
  301. }
  302.  
  303. int Puste()
  304. {
  305. return suma.in == suma.out;
  306. }
  307.  
  308. void Sumuj()
  309. {
  310. int i;
  311. for(i=0; i<8; i++)
  312. {
  313. suma.in+=pas[i].last_poz1 && !pas[i].poz1;
  314. }
  315.  
  316. for(i=0; i<4; i++)
  317. {
  318. suma.out+=!pasOut[i].last_poz && pasOut[i].poz;
  319. }
  320. }
  321.  
  322. void LiczCzas()
  323. {
  324. int i;
  325. for(i=0; i<8; i++){
  326. if(pas[i].poz1) pas[i].czas++;
  327. else pas[i].czas = 0;
  328. }
  329. }
  330.  
  331. void Wlacz()
  332. {
  333. Zad zad = sWlacz;
  334.  
  335. switch(zad.stan)
  336. {
  337. case 1:
  338. int i;
  339. for(i=0;i<8;i++)
  340. {
  341. pas[i].swiatlo = 0;
  342. }
  343. if(wlacz) zad.stan=2; break;
  344. case 2:
  345. pas[iMax].swiatlo = 1;
  346. pas[iMax2].swiatlo = 1;
  347. if(!wlacz) zad.stan=1; break;
  348. }
  349. sWlacz=zad;
  350. }
  351.  
  352. long MaxCzas()
  353. {
  354. int i, Max=0;
  355. for(i = 0; i<8; i++)
  356. {
  357. if(pas[i].czas > Max)
  358. {
  359. Max = pas[i].czas;
  360. }
  361. }
  362. return Max;
  363. }
  364.  
  365. int MaxPrio()
  366. {
  367. int i, Max=0;
  368. for(i = 0; i<8; i++)
  369. {
  370. if(pas[i].prio > Max)
  371. {
  372. Max = pas[i].prio;
  373. }
  374. }
  375. return Max;
  376. }
  377.  
  378. int OblicziMax()
  379. {
  380. int i, imax = 0;
  381. for(i = 0; i<8; i++)
  382. {
  383. if(pas[i].prio > max)
  384. {
  385. max = pas[i].prio;
  386. imax = i;
  387. }
  388. }
  389. max = 0;
  390. return imax;
  391. }
  392.  
  393. int OblicziMax2()
  394. {
  395. if(pas[pas[iMax].alt1-1].prio > pas[pas[iMax].alt2-1].prio)
  396. return pas[iMax].alt1-1;
  397. else
  398. return pas[iMax].alt2-1;
  399. }
  400.  
  401. void Reczny()
  402. {
  403. pas[0].swiatlo = pas[4].swiatlo = aK1 ? 1 : 0;
  404. pas[1].swiatlo = pas[5].swiatlo = aK2 ? 1 : 0;
  405. pas[2].swiatlo = pas[6].swiatlo = aK3 ? 1 : 0;
  406. pas[3].swiatlo = pas[7].swiatlo = aK4 ? 1 : 0;
  407. }
  408.  
  409. void In()
  410. {
  411. pas[0].poz1 = X1;
  412. pas[1].poz1 = X2;
  413. pas[2].poz1 = X3;
  414. pas[3].poz1 = X4;
  415. pas[4].poz1 = X5;
  416. pas[5].poz1 = X6;
  417. pas[6].poz1 = X7;
  418. pas[7].poz1 = X8;
  419. pas[0].poz2 = X13;
  420. pas[1].poz2 = X15;
  421. pas[4].poz2 = X14;
  422. pas[5].poz2 = X16;
  423.  
  424. pasOut[0].poz = X9;
  425. pasOut[1].poz = X10;
  426. pasOut[2].poz = X11;
  427. pasOut[3].poz = X12;
  428. }
  429.  
  430. void Out()
  431. {
  432. Z1 = pas[0].swiatlo;
  433. Z2 = pas[1].swiatlo;
  434. Z3 = pas[2].swiatlo;
  435. Z4 = pas[3].swiatlo;
  436. Z5 = pas[4].swiatlo;
  437. Z6 = pas[5].swiatlo;
  438. Z7 = pas[6].swiatlo;
  439. Z8 = pas[7].swiatlo;
  440.  
  441. int i;
  442. for(i=0; i<8; i++)
  443. {
  444. pas[i].last_poz1 = pas[i].poz1;
  445. }
  446. for(i=0; i<4; i++)
  447. {
  448. pasOut[i].last_poz = pasOut[i].poz;
  449. }
  450. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement