TrafficLightCtrlStatemachine.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632
  1. package traffic.light.trafficlightctrl;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import traffic.light.ITimer;
  5. public class TrafficLightCtrlStatemachine implements ITrafficLightCtrlStatemachine {
  6. protected class SCInterfaceImpl implements SCInterface {
  7. private List<SCInterfaceListener> listeners = new LinkedList<SCInterfaceListener>();
  8. public List<SCInterfaceListener> getListeners() {
  9. return listeners;
  10. }
  11. private boolean police_interrupt;
  12. public void raisePolice_interrupt() {
  13. police_interrupt = true;
  14. }
  15. private boolean displayRed;
  16. public boolean isRaisedDisplayRed() {
  17. return displayRed;
  18. }
  19. protected void raiseDisplayRed() {
  20. displayRed = true;
  21. for (SCInterfaceListener listener : listeners) {
  22. listener.onDisplayRedRaised();
  23. }
  24. }
  25. private boolean displayGreen;
  26. public boolean isRaisedDisplayGreen() {
  27. return displayGreen;
  28. }
  29. protected void raiseDisplayGreen() {
  30. displayGreen = true;
  31. for (SCInterfaceListener listener : listeners) {
  32. listener.onDisplayGreenRaised();
  33. }
  34. }
  35. private boolean displayYellow;
  36. public boolean isRaisedDisplayYellow() {
  37. return displayYellow;
  38. }
  39. protected void raiseDisplayYellow() {
  40. displayYellow = true;
  41. for (SCInterfaceListener listener : listeners) {
  42. listener.onDisplayYellowRaised();
  43. }
  44. }
  45. private boolean displayNone;
  46. public boolean isRaisedDisplayNone() {
  47. return displayNone;
  48. }
  49. protected void raiseDisplayNone() {
  50. displayNone = true;
  51. for (SCInterfaceListener listener : listeners) {
  52. listener.onDisplayNoneRaised();
  53. }
  54. }
  55. protected void clearEvents() {
  56. police_interrupt = false;
  57. }
  58. protected void clearOutEvents() {
  59. displayRed = false;
  60. displayGreen = false;
  61. displayYellow = false;
  62. displayNone = false;
  63. }
  64. }
  65. protected SCInterfaceImpl sCInterface;
  66. private boolean initialized = false;
  67. public enum State {
  68. main_normal,
  69. main_normal_normal_Yellow,
  70. main_normal_normal_Green,
  71. main_normal_normal_Red,
  72. main_interrupted,
  73. main_interrupted_interrupted_Black,
  74. main_interrupted_interrupted_Yellow,
  75. $NullState$
  76. };
  77. private final State[] stateVector = new State[1];
  78. private int nextStateIndex;
  79. private ITimer timer;
  80. private final boolean[] timeEvents = new boolean[5];
  81. public TrafficLightCtrlStatemachine() {
  82. sCInterface = new SCInterfaceImpl();
  83. }
  84. public void init() {
  85. this.initialized = true;
  86. if (timer == null) {
  87. throw new IllegalStateException("timer not set.");
  88. }
  89. for (int i = 0; i < 1; i++) {
  90. stateVector[i] = State.$NullState$;
  91. }
  92. clearEvents();
  93. clearOutEvents();
  94. }
  95. public void enter() {
  96. if (!initialized) {
  97. throw new IllegalStateException(
  98. "The state machine needs to be initialized first by calling the init() function.");
  99. }
  100. if (timer == null) {
  101. throw new IllegalStateException("timer not set.");
  102. }
  103. enterSequence_main_default();
  104. }
  105. public void exit() {
  106. exitSequence_main();
  107. }
  108. /**
  109. * @see IStatemachine#isActive()
  110. */
  111. public boolean isActive() {
  112. return stateVector[0] != State.$NullState$;
  113. }
  114. /**
  115. * Always returns 'false' since this state machine can never become final.
  116. *
  117. * @see IStatemachine#isFinal()
  118. */
  119. public boolean isFinal() {
  120. return false;
  121. }
  122. /**
  123. * This method resets the incoming events (time events included).
  124. */
  125. protected void clearEvents() {
  126. sCInterface.clearEvents();
  127. for (int i=0; i<timeEvents.length; i++) {
  128. timeEvents[i] = false;
  129. }
  130. }
  131. /**
  132. * This method resets the outgoing events.
  133. */
  134. protected void clearOutEvents() {
  135. sCInterface.clearOutEvents();
  136. }
  137. /**
  138. * Returns true if the given state is currently active otherwise false.
  139. */
  140. public boolean isStateActive(State state) {
  141. switch (state) {
  142. case main_normal:
  143. return stateVector[0].ordinal() >= State.
  144. main_normal.ordinal()&& stateVector[0].ordinal() <= State.main_normal_normal_Red.ordinal();
  145. case main_normal_normal_Yellow:
  146. return stateVector[0] == State.main_normal_normal_Yellow;
  147. case main_normal_normal_Green:
  148. return stateVector[0] == State.main_normal_normal_Green;
  149. case main_normal_normal_Red:
  150. return stateVector[0] == State.main_normal_normal_Red;
  151. case main_interrupted:
  152. return stateVector[0].ordinal() >= State.
  153. main_interrupted.ordinal()&& stateVector[0].ordinal() <= State.main_interrupted_interrupted_Yellow.ordinal();
  154. case main_interrupted_interrupted_Black:
  155. return stateVector[0] == State.main_interrupted_interrupted_Black;
  156. case main_interrupted_interrupted_Yellow:
  157. return stateVector[0] == State.main_interrupted_interrupted_Yellow;
  158. default:
  159. return false;
  160. }
  161. }
  162. /**
  163. * Set the {@link ITimer} for the state machine. It must be set
  164. * externally on a timed state machine before a run cycle can be correct
  165. * executed.
  166. *
  167. * @param timer
  168. */
  169. public void setTimer(ITimer timer) {
  170. this.timer = timer;
  171. }
  172. /**
  173. * Returns the currently used timer.
  174. *
  175. * @return {@link ITimer}
  176. */
  177. public ITimer getTimer() {
  178. return timer;
  179. }
  180. public void timeElapsed(int eventID) {
  181. timeEvents[eventID] = true;
  182. }
  183. public SCInterface getSCInterface() {
  184. return sCInterface;
  185. }
  186. public void raisePolice_interrupt() {
  187. sCInterface.raisePolice_interrupt();
  188. }
  189. public boolean isRaisedDisplayRed() {
  190. return sCInterface.isRaisedDisplayRed();
  191. }
  192. public boolean isRaisedDisplayGreen() {
  193. return sCInterface.isRaisedDisplayGreen();
  194. }
  195. public boolean isRaisedDisplayYellow() {
  196. return sCInterface.isRaisedDisplayYellow();
  197. }
  198. public boolean isRaisedDisplayNone() {
  199. return sCInterface.isRaisedDisplayNone();
  200. }
  201. private boolean check_main_normal_tr0_tr0() {
  202. return sCInterface.police_interrupt;
  203. }
  204. private boolean check_main_normal_normal_Yellow_tr0_tr0() {
  205. return timeEvents[0];
  206. }
  207. private boolean check_main_normal_normal_Green_tr0_tr0() {
  208. return timeEvents[1];
  209. }
  210. private boolean check_main_normal_normal_Red_tr0_tr0() {
  211. return timeEvents[2];
  212. }
  213. private boolean check_main_interrupted_tr0_tr0() {
  214. return sCInterface.police_interrupt;
  215. }
  216. private boolean check_main_interrupted_interrupted_Black_tr0_tr0() {
  217. return timeEvents[3];
  218. }
  219. private boolean check_main_interrupted_interrupted_Yellow_tr0_tr0() {
  220. return timeEvents[4];
  221. }
  222. private void effect_main_normal_tr0() {
  223. exitSequence_main_normal();
  224. enterSequence_main_interrupted_default();
  225. }
  226. private void effect_main_normal_normal_Yellow_tr0() {
  227. exitSequence_main_normal_normal_Yellow();
  228. enterSequence_main_normal_normal_Red_default();
  229. }
  230. private void effect_main_normal_normal_Green_tr0() {
  231. exitSequence_main_normal_normal_Green();
  232. enterSequence_main_normal_normal_Yellow_default();
  233. }
  234. private void effect_main_normal_normal_Red_tr0() {
  235. exitSequence_main_normal_normal_Red();
  236. enterSequence_main_normal_normal_Green_default();
  237. }
  238. private void effect_main_interrupted_tr0() {
  239. exitSequence_main_interrupted();
  240. enterSequence_main_normal_default();
  241. }
  242. private void effect_main_interrupted_interrupted_Black_tr0() {
  243. exitSequence_main_interrupted_interrupted_Black();
  244. enterSequence_main_interrupted_interrupted_Yellow_default();
  245. }
  246. private void effect_main_interrupted_interrupted_Yellow_tr0() {
  247. exitSequence_main_interrupted_interrupted_Yellow();
  248. enterSequence_main_interrupted_interrupted_Black_default();
  249. }
  250. /* Entry action for state 'Yellow'. */
  251. private void entryAction_main_normal_normal_Yellow() {
  252. timer.setTimer(this, 0, 5 * 1000, false);
  253. sCInterface.raiseDisplayYellow();
  254. }
  255. /* Entry action for state 'Green'. */
  256. private void entryAction_main_normal_normal_Green() {
  257. timer.setTimer(this, 1, 55 * 1000, false);
  258. sCInterface.raiseDisplayGreen();
  259. }
  260. /* Entry action for state 'Red'. */
  261. private void entryAction_main_normal_normal_Red() {
  262. timer.setTimer(this, 2, 60 * 1000, false);
  263. sCInterface.raiseDisplayRed();
  264. }
  265. /* Entry action for state 'Black'. */
  266. private void entryAction_main_interrupted_interrupted_Black() {
  267. timer.setTimer(this, 3, 1 * 1000, false);
  268. sCInterface.raiseDisplayNone();
  269. }
  270. /* Entry action for state 'Yellow'. */
  271. private void entryAction_main_interrupted_interrupted_Yellow() {
  272. timer.setTimer(this, 4, 1 * 1000, false);
  273. sCInterface.raiseDisplayYellow();
  274. }
  275. /* Exit action for state 'Yellow'. */
  276. private void exitAction_main_normal_normal_Yellow() {
  277. timer.unsetTimer(this, 0);
  278. }
  279. /* Exit action for state 'Green'. */
  280. private void exitAction_main_normal_normal_Green() {
  281. timer.unsetTimer(this, 1);
  282. }
  283. /* Exit action for state 'Red'. */
  284. private void exitAction_main_normal_normal_Red() {
  285. timer.unsetTimer(this, 2);
  286. }
  287. /* Exit action for state 'Black'. */
  288. private void exitAction_main_interrupted_interrupted_Black() {
  289. timer.unsetTimer(this, 3);
  290. }
  291. /* Exit action for state 'Yellow'. */
  292. private void exitAction_main_interrupted_interrupted_Yellow() {
  293. timer.unsetTimer(this, 4);
  294. }
  295. /* 'default' enter sequence for state normal */
  296. private void enterSequence_main_normal_default() {
  297. enterSequence_main_normal_normal_default();
  298. }
  299. /* 'default' enter sequence for state Yellow */
  300. private void enterSequence_main_normal_normal_Yellow_default() {
  301. entryAction_main_normal_normal_Yellow();
  302. nextStateIndex = 0;
  303. stateVector[0] = State.main_normal_normal_Yellow;
  304. }
  305. /* 'default' enter sequence for state Green */
  306. private void enterSequence_main_normal_normal_Green_default() {
  307. entryAction_main_normal_normal_Green();
  308. nextStateIndex = 0;
  309. stateVector[0] = State.main_normal_normal_Green;
  310. }
  311. /* 'default' enter sequence for state Red */
  312. private void enterSequence_main_normal_normal_Red_default() {
  313. entryAction_main_normal_normal_Red();
  314. nextStateIndex = 0;
  315. stateVector[0] = State.main_normal_normal_Red;
  316. }
  317. /* 'default' enter sequence for state interrupted */
  318. private void enterSequence_main_interrupted_default() {
  319. enterSequence_main_interrupted_interrupted_default();
  320. }
  321. /* 'default' enter sequence for state Black */
  322. private void enterSequence_main_interrupted_interrupted_Black_default() {
  323. entryAction_main_interrupted_interrupted_Black();
  324. nextStateIndex = 0;
  325. stateVector[0] = State.main_interrupted_interrupted_Black;
  326. }
  327. /* 'default' enter sequence for state Yellow */
  328. private void enterSequence_main_interrupted_interrupted_Yellow_default() {
  329. entryAction_main_interrupted_interrupted_Yellow();
  330. nextStateIndex = 0;
  331. stateVector[0] = State.main_interrupted_interrupted_Yellow;
  332. }
  333. /* 'default' enter sequence for region main */
  334. private void enterSequence_main_default() {
  335. react_main__entry_Default();
  336. }
  337. /* 'default' enter sequence for region normal */
  338. private void enterSequence_main_normal_normal_default() {
  339. react_main_normal_normal__entry_Default();
  340. }
  341. /* 'default' enter sequence for region interrupted */
  342. private void enterSequence_main_interrupted_interrupted_default() {
  343. react_main_interrupted_interrupted__entry_Default();
  344. }
  345. /* Default exit sequence for state normal */
  346. private void exitSequence_main_normal() {
  347. exitSequence_main_normal_normal();
  348. }
  349. /* Default exit sequence for state Yellow */
  350. private void exitSequence_main_normal_normal_Yellow() {
  351. nextStateIndex = 0;
  352. stateVector[0] = State.$NullState$;
  353. exitAction_main_normal_normal_Yellow();
  354. }
  355. /* Default exit sequence for state Green */
  356. private void exitSequence_main_normal_normal_Green() {
  357. nextStateIndex = 0;
  358. stateVector[0] = State.$NullState$;
  359. exitAction_main_normal_normal_Green();
  360. }
  361. /* Default exit sequence for state Red */
  362. private void exitSequence_main_normal_normal_Red() {
  363. nextStateIndex = 0;
  364. stateVector[0] = State.$NullState$;
  365. exitAction_main_normal_normal_Red();
  366. }
  367. /* Default exit sequence for state interrupted */
  368. private void exitSequence_main_interrupted() {
  369. exitSequence_main_interrupted_interrupted();
  370. }
  371. /* Default exit sequence for state Black */
  372. private void exitSequence_main_interrupted_interrupted_Black() {
  373. nextStateIndex = 0;
  374. stateVector[0] = State.$NullState$;
  375. exitAction_main_interrupted_interrupted_Black();
  376. }
  377. /* Default exit sequence for state Yellow */
  378. private void exitSequence_main_interrupted_interrupted_Yellow() {
  379. nextStateIndex = 0;
  380. stateVector[0] = State.$NullState$;
  381. exitAction_main_interrupted_interrupted_Yellow();
  382. }
  383. /* Default exit sequence for region main */
  384. private void exitSequence_main() {
  385. switch (stateVector[0]) {
  386. case main_normal_normal_Yellow:
  387. exitSequence_main_normal_normal_Yellow();
  388. break;
  389. case main_normal_normal_Green:
  390. exitSequence_main_normal_normal_Green();
  391. break;
  392. case main_normal_normal_Red:
  393. exitSequence_main_normal_normal_Red();
  394. break;
  395. case main_interrupted_interrupted_Black:
  396. exitSequence_main_interrupted_interrupted_Black();
  397. break;
  398. case main_interrupted_interrupted_Yellow:
  399. exitSequence_main_interrupted_interrupted_Yellow();
  400. break;
  401. default:
  402. break;
  403. }
  404. }
  405. /* Default exit sequence for region normal */
  406. private void exitSequence_main_normal_normal() {
  407. switch (stateVector[0]) {
  408. case main_normal_normal_Yellow:
  409. exitSequence_main_normal_normal_Yellow();
  410. break;
  411. case main_normal_normal_Green:
  412. exitSequence_main_normal_normal_Green();
  413. break;
  414. case main_normal_normal_Red:
  415. exitSequence_main_normal_normal_Red();
  416. break;
  417. default:
  418. break;
  419. }
  420. }
  421. /* Default exit sequence for region interrupted */
  422. private void exitSequence_main_interrupted_interrupted() {
  423. switch (stateVector[0]) {
  424. case main_interrupted_interrupted_Black:
  425. exitSequence_main_interrupted_interrupted_Black();
  426. break;
  427. case main_interrupted_interrupted_Yellow:
  428. exitSequence_main_interrupted_interrupted_Yellow();
  429. break;
  430. default:
  431. break;
  432. }
  433. }
  434. /* The reactions of state Yellow. */
  435. private void react_main_normal_normal_Yellow() {
  436. if (check_main_normal_tr0_tr0()) {
  437. effect_main_normal_tr0();
  438. } else {
  439. if (check_main_normal_normal_Yellow_tr0_tr0()) {
  440. effect_main_normal_normal_Yellow_tr0();
  441. }
  442. }
  443. }
  444. /* The reactions of state Green. */
  445. private void react_main_normal_normal_Green() {
  446. if (check_main_normal_tr0_tr0()) {
  447. effect_main_normal_tr0();
  448. } else {
  449. if (check_main_normal_normal_Green_tr0_tr0()) {
  450. effect_main_normal_normal_Green_tr0();
  451. }
  452. }
  453. }
  454. /* The reactions of state Red. */
  455. private void react_main_normal_normal_Red() {
  456. if (check_main_normal_tr0_tr0()) {
  457. effect_main_normal_tr0();
  458. } else {
  459. if (check_main_normal_normal_Red_tr0_tr0()) {
  460. effect_main_normal_normal_Red_tr0();
  461. }
  462. }
  463. }
  464. /* The reactions of state Black. */
  465. private void react_main_interrupted_interrupted_Black() {
  466. if (check_main_interrupted_tr0_tr0()) {
  467. effect_main_interrupted_tr0();
  468. } else {
  469. if (check_main_interrupted_interrupted_Black_tr0_tr0()) {
  470. effect_main_interrupted_interrupted_Black_tr0();
  471. }
  472. }
  473. }
  474. /* The reactions of state Yellow. */
  475. private void react_main_interrupted_interrupted_Yellow() {
  476. if (check_main_interrupted_tr0_tr0()) {
  477. effect_main_interrupted_tr0();
  478. } else {
  479. if (check_main_interrupted_interrupted_Yellow_tr0_tr0()) {
  480. effect_main_interrupted_interrupted_Yellow_tr0();
  481. }
  482. }
  483. }
  484. /* Default react sequence for initial entry */
  485. private void react_main__entry_Default() {
  486. enterSequence_main_normal_default();
  487. }
  488. /* Default react sequence for initial entry */
  489. private void react_main_normal_normal__entry_Default() {
  490. enterSequence_main_normal_normal_Red_default();
  491. }
  492. /* Default react sequence for initial entry */
  493. private void react_main_interrupted_interrupted__entry_Default() {
  494. enterSequence_main_interrupted_interrupted_Yellow_default();
  495. }
  496. public void runCycle() {
  497. if (!initialized)
  498. throw new IllegalStateException(
  499. "The state machine needs to be initialized first by calling the init() function.");
  500. clearOutEvents();
  501. for (nextStateIndex = 0; nextStateIndex < stateVector.length; nextStateIndex++) {
  502. switch (stateVector[nextStateIndex]) {
  503. case main_normal_normal_Yellow:
  504. react_main_normal_normal_Yellow();
  505. break;
  506. case main_normal_normal_Green:
  507. react_main_normal_normal_Green();
  508. break;
  509. case main_normal_normal_Red:
  510. react_main_normal_normal_Red();
  511. break;
  512. case main_interrupted_interrupted_Black:
  513. react_main_interrupted_interrupted_Black();
  514. break;
  515. case main_interrupted_interrupted_Yellow:
  516. react_main_interrupted_interrupted_Yellow();
  517. break;
  518. default:
  519. // $NullState$
  520. }
  521. }
  522. clearEvents();
  523. }
  524. }