TrafficLightCtrlStatemachine.java 17 KB

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