calc2.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. /*$file${.::calc2.c} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  2. /*
  3. * Model: calc2.qm
  4. * File: ${.::calc2.c}
  5. *
  6. * This code has been generated by QM 5.2.4 <www.state-machine.com/qm>.
  7. * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
  8. *
  9. * SPDX-License-Identifier: GPL-3.0-or-later
  10. *
  11. * This generated code is open source software: you can redistribute it under
  12. * the terms of the GNU General Public License as published by the Free
  13. * Software Foundation.
  14. *
  15. * This code is distributed in the hope that it will be useful, but WITHOUT
  16. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  17. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  18. * more details.
  19. *
  20. * NOTE:
  21. * Alternatively, this generated code may be distributed under the terms
  22. * of Quantum Leaps commercial licenses, which expressly supersede the GNU
  23. * General Public License and are specifically designed for licensees
  24. * interested in retaining the proprietary status of their code.
  25. *
  26. * Contact information:
  27. * <www.state-machine.com/licensing>
  28. * <info@state-machine.com>
  29. */
  30. /*$endhead${.::calc2.c} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  31. #include "qpc.h" /* QP/C */
  32. #include "bsp.h" /* board support package */
  33. #include "calc2.h" /* application */
  34. Q_DEFINE_THIS_FILE
  35. #define KEY_NULL '\0'
  36. #define KEY_PLUS '+'
  37. #define KEY_MINUS '-'
  38. #define KEY_MULT '*'
  39. #define KEY_DIVIDE '/'
  40. /*$declare${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  41. /*${SMs::Calc} .............................................................*/
  42. typedef struct Calc {
  43. /* protected: */
  44. QHsm super;
  45. /* public: */
  46. /* private: */
  47. double op1;
  48. double op2;
  49. uint8_t oper1;
  50. uint8_t oper2;
  51. } Calc;
  52. /* private: */
  53. /* guard function to evaluate the current expression
  54. * taking into account the precedence of operands.
  55. * return: true if evaluation successfull
  56. * false when error encountered
  57. */
  58. static bool Calc_eval(Calc * const me,
  59. double op,
  60. uint8_t oper);
  61. extern Calc Calc_inst;
  62. /* protected: */
  63. static QState Calc_initial(Calc * const me, void const * const par);
  64. static QState Calc_on(Calc * const me, QEvt const * const e);
  65. /* Error state after evaluation of an expression.
  66. This state can be exited only throgh the inherited C (Clear) event.
  67. */
  68. static QState Calc_error(Calc * const me, QEvt const * const e);
  69. static QState Calc_ready(Calc * const me, QEvt const * const e);
  70. static QState Calc_result(Calc * const me, QEvt const * const e);
  71. static QState Calc_begin(Calc * const me, QEvt const * const e);
  72. static QState Calc_operand(Calc * const me, QEvt const * const e);
  73. static QState Calc_zero1(Calc * const me, QEvt const * const e);
  74. static QState Calc_int1(Calc * const me, QEvt const * const e);
  75. static QState Calc_frac1(Calc * const me, QEvt const * const e);
  76. static QState Calc_negated1(Calc * const me, QEvt const * const e);
  77. static QState Calc_opEntered(Calc * const me, QEvt const * const e);
  78. static QState Calc_final(Calc * const me, QEvt const * const e);
  79. /*$enddecl${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  80. /*$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  81. /* Check for the minimum required QP version */
  82. #if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
  83. #error qpc version 7.0.0 or higher required
  84. #endif
  85. /*$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  86. /*$define${SMs::the_calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  87. /*${SMs::the_calc} .........................................................*/
  88. QHsm * const the_calc = &Calc_inst.super;
  89. /*$enddef${SMs::the_calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  90. /*$define${SMs::Calc_ctor} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  91. /*${SMs::Calc_ctor} ........................................................*/
  92. void Calc_ctor(void) {
  93. Calc *me = &Calc_inst;
  94. QHsm_ctor(&me->super, Q_STATE_CAST(&Calc_initial));
  95. }
  96. /*$enddef${SMs::Calc_ctor} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  97. /*$define${SMs::Calc} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  98. /*${SMs::Calc} .............................................................*/
  99. Calc Calc_inst;
  100. /*${SMs::Calc::eval} .......................................................*/
  101. static bool Calc_eval(Calc * const me,
  102. double op,
  103. uint8_t oper)
  104. {
  105. double result;
  106. if (me->oper1 == KEY_NULL) { /* no op1 yet */
  107. me->op1 = op;
  108. me->oper1 = oper;
  109. result = me->op1;
  110. }
  111. else if ((oper == KEY_NULL) || (oper == KEY_PLUS) || (oper == KEY_MINUS)) {
  112. switch (me->oper2) {
  113. case KEY_MULT: {
  114. me->op2 *= op;
  115. break;
  116. }
  117. case KEY_DIVIDE: {
  118. if ((-1e-30 < op) && (op < 1e-30)) {
  119. BSP_display_error(" Error 0 "); /* divide by zero */
  120. return false;
  121. }
  122. me->op2 /= op;
  123. break;
  124. }
  125. default: { /* no op2 yet */
  126. me->op2 = op;
  127. me->oper2 = oper;
  128. break;
  129. }
  130. }
  131. switch (me->oper1) {
  132. case KEY_PLUS: {
  133. me->op1 += me->op2;
  134. break;
  135. }
  136. case KEY_MINUS: {
  137. me->op1 -= me->op2;
  138. break;
  139. }
  140. case KEY_MULT: {
  141. me->op1 *= me->op2;
  142. break;
  143. }
  144. case KEY_DIVIDE: {
  145. if ((-1e-30 < me->op2) && (me->op2 < 1e-30)) {
  146. BSP_display_error(" Error 0 "); /* divide by zero */
  147. return false;
  148. }
  149. me->op1 /= me->op2;
  150. break;
  151. }
  152. default: {
  153. Q_ERROR();
  154. break;
  155. }
  156. }
  157. me->oper1 = oper;
  158. me->oper2 = KEY_NULL;
  159. result = me->op1;
  160. }
  161. else { /* (oper == KEY_MULT) || (oper == KEY_DIV) */
  162. switch (me->oper2) {
  163. case KEY_MULT: {
  164. me->op2 *= op;
  165. break;
  166. }
  167. case KEY_DIVIDE: {
  168. if ((-1e-30 < op) && (op < 1e-30)) {
  169. BSP_display_error(" Error 0 "); /* divide by zero */
  170. return false;
  171. }
  172. me->op2 /= op;
  173. break;
  174. }
  175. default: { /* oper2 not provided yet */
  176. me->op2 = op;
  177. break;
  178. }
  179. }
  180. me->oper2 = oper;
  181. result = me->op2;
  182. }
  183. if ((result < -99999999.0) || (99999999.0 < result)) {
  184. BSP_display_error(" Error 1 "); /* out of range */
  185. return false;
  186. }
  187. if ((-0.0000001 < result) && (result < 0.0000001)) {
  188. result = 0.0;
  189. }
  190. BSP_display(result);
  191. return true;
  192. }
  193. /*${SMs::Calc::SM} .........................................................*/
  194. static QState Calc_initial(Calc * const me, void const * const par) {
  195. /*${SMs::Calc::SM::initial} */
  196. (void)par; /* unused parameter */
  197. return Q_TRAN(&Calc_on);
  198. }
  199. /*${SMs::Calc::SM::on} .....................................................*/
  200. static QState Calc_on(Calc * const me, QEvt const * const e) {
  201. QState status_;
  202. switch (e->sig) {
  203. /*${SMs::Calc::SM::on} */
  204. case Q_ENTRY_SIG: {
  205. BSP_message("on-ENTRY;");
  206. status_ = Q_HANDLED();
  207. break;
  208. }
  209. /*${SMs::Calc::SM::on} */
  210. case Q_EXIT_SIG: {
  211. BSP_message("on-EXIT;");
  212. status_ = Q_HANDLED();
  213. break;
  214. }
  215. /*${SMs::Calc::SM::on::initial} */
  216. case Q_INIT_SIG: {
  217. BSP_message("on-INIT;");
  218. BSP_clear();
  219. status_ = Q_TRAN(&Calc_ready);
  220. break;
  221. }
  222. /*${SMs::Calc::SM::on::C} */
  223. case C_SIG: {
  224. status_ = Q_TRAN(&Calc_on);
  225. break;
  226. }
  227. /*${SMs::Calc::SM::on::OFF} */
  228. case OFF_SIG: {
  229. status_ = Q_TRAN(&Calc_final);
  230. break;
  231. }
  232. default: {
  233. status_ = Q_SUPER(&QHsm_top);
  234. break;
  235. }
  236. }
  237. return status_;
  238. }
  239. /*${SMs::Calc::SM::on::error} ..............................................*/
  240. static QState Calc_error(Calc * const me, QEvt const * const e) {
  241. QState status_;
  242. switch (e->sig) {
  243. /*${SMs::Calc::SM::on::error} */
  244. case Q_ENTRY_SIG: {
  245. BSP_message("error-ENTRY;");
  246. status_ = Q_HANDLED();
  247. break;
  248. }
  249. /*${SMs::Calc::SM::on::error} */
  250. case Q_EXIT_SIG: {
  251. BSP_message("error-EXIT;");
  252. status_ = Q_HANDLED();
  253. break;
  254. }
  255. default: {
  256. status_ = Q_SUPER(&Calc_on);
  257. break;
  258. }
  259. }
  260. return status_;
  261. }
  262. /*${SMs::Calc::SM::on::ready} ..............................................*/
  263. static QState Calc_ready(Calc * const me, QEvt const * const e) {
  264. QState status_;
  265. switch (e->sig) {
  266. /*${SMs::Calc::SM::on::ready} */
  267. case Q_ENTRY_SIG: {
  268. BSP_message("ready-ENTRY;");
  269. me->oper1 = KEY_NULL;
  270. me->oper2 = KEY_NULL;
  271. status_ = Q_HANDLED();
  272. break;
  273. }
  274. /*${SMs::Calc::SM::on::ready} */
  275. case Q_EXIT_SIG: {
  276. BSP_message("ready-EXIT;");
  277. status_ = Q_HANDLED();
  278. break;
  279. }
  280. /*${SMs::Calc::SM::on::ready::initial} */
  281. case Q_INIT_SIG: {
  282. BSP_message("ready-INIT;");
  283. status_ = Q_TRAN(&Calc_begin);
  284. break;
  285. }
  286. /*${SMs::Calc::SM::on::ready::DIGIT_0} */
  287. case DIGIT_0_SIG: {
  288. BSP_clear();
  289. status_ = Q_TRAN(&Calc_zero1);
  290. break;
  291. }
  292. /*${SMs::Calc::SM::on::ready::DIGIT_1_9} */
  293. case DIGIT_1_9_SIG: {
  294. BSP_clear();
  295. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  296. status_ = Q_TRAN(&Calc_int1);
  297. break;
  298. }
  299. /*${SMs::Calc::SM::on::ready::POINT} */
  300. case POINT_SIG: {
  301. BSP_clear();
  302. BSP_insert((int)'0');
  303. BSP_insert((int)'.');
  304. status_ = Q_TRAN(&Calc_frac1);
  305. break;
  306. }
  307. /*${SMs::Calc::SM::on::ready::OPER} */
  308. case OPER_SIG: {
  309. me->op1 = BSP_get_value();
  310. me->oper1 = Q_EVT_CAST(CalcEvt)->key_code;
  311. status_ = Q_TRAN(&Calc_opEntered);
  312. break;
  313. }
  314. default: {
  315. status_ = Q_SUPER(&Calc_on);
  316. break;
  317. }
  318. }
  319. return status_;
  320. }
  321. /*${SMs::Calc::SM::on::ready::result} ......................................*/
  322. static QState Calc_result(Calc * const me, QEvt const * const e) {
  323. QState status_;
  324. switch (e->sig) {
  325. /*${SMs::Calc::SM::on::ready::result} */
  326. case Q_ENTRY_SIG: {
  327. BSP_message("result-ENTRY;");
  328. status_ = Q_HANDLED();
  329. break;
  330. }
  331. /*${SMs::Calc::SM::on::ready::result} */
  332. case Q_EXIT_SIG: {
  333. BSP_message("result-EXIT;");
  334. status_ = Q_HANDLED();
  335. break;
  336. }
  337. default: {
  338. status_ = Q_SUPER(&Calc_ready);
  339. break;
  340. }
  341. }
  342. return status_;
  343. }
  344. /*${SMs::Calc::SM::on::ready::begin} .......................................*/
  345. static QState Calc_begin(Calc * const me, QEvt const * const e) {
  346. QState status_;
  347. switch (e->sig) {
  348. /*${SMs::Calc::SM::on::ready::begin} */
  349. case Q_ENTRY_SIG: {
  350. BSP_message("begin-ENTRY;");
  351. status_ = Q_HANDLED();
  352. break;
  353. }
  354. /*${SMs::Calc::SM::on::ready::begin} */
  355. case Q_EXIT_SIG: {
  356. BSP_message("begin-EXIT;");
  357. status_ = Q_HANDLED();
  358. break;
  359. }
  360. /*${SMs::Calc::SM::on::ready::begin::OPER} */
  361. case OPER_SIG: {
  362. /*${SMs::Calc::SM::on::ready::begin::OPER::[e->key=='-']} */
  363. if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) {
  364. status_ = Q_TRAN(&Calc_negated1);
  365. }
  366. /*${SMs::Calc::SM::on::ready::begin::OPER::[else]} */
  367. else {
  368. status_ = Q_HANDLED();
  369. }
  370. break;
  371. }
  372. default: {
  373. status_ = Q_SUPER(&Calc_ready);
  374. break;
  375. }
  376. }
  377. return status_;
  378. }
  379. /*${SMs::Calc::SM::on::operand} ............................................*/
  380. static QState Calc_operand(Calc * const me, QEvt const * const e) {
  381. QState status_;
  382. switch (e->sig) {
  383. /*${SMs::Calc::SM::on::operand} */
  384. case Q_ENTRY_SIG: {
  385. BSP_message("operand1-ENTRY;");
  386. status_ = Q_HANDLED();
  387. break;
  388. }
  389. /*${SMs::Calc::SM::on::operand} */
  390. case Q_EXIT_SIG: {
  391. BSP_message("operand1-EXIT;");
  392. status_ = Q_HANDLED();
  393. break;
  394. }
  395. /*${SMs::Calc::SM::on::operand::CE} */
  396. case CE_SIG: {
  397. BSP_clear();
  398. status_ = Q_TRAN(&Calc_ready);
  399. break;
  400. }
  401. /*${SMs::Calc::SM::on::operand::EQUALS} */
  402. case EQUALS_SIG: {
  403. /*${SMs::Calc::SM::on::operand::EQUALS::[Calc_eval(me,BSP_get_value(),KE~} */
  404. if (Calc_eval(me, BSP_get_value(), KEY_NULL)) {
  405. status_ = Q_TRAN(&Calc_result);
  406. }
  407. /*${SMs::Calc::SM::on::operand::EQUALS::[else]} */
  408. else {
  409. status_ = Q_TRAN(&Calc_error);
  410. }
  411. break;
  412. }
  413. /*${SMs::Calc::SM::on::operand::OPER} */
  414. case OPER_SIG: {
  415. /*${SMs::Calc::SM::on::operand::OPER::[Calc_eval(me,BSP_get_value(),Q_~} */
  416. if (Calc_eval(me, BSP_get_value(), Q_EVT_CAST(CalcEvt)->key_code)) {
  417. status_ = Q_TRAN(&Calc_opEntered);
  418. }
  419. /*${SMs::Calc::SM::on::operand::OPER::[else]} */
  420. else {
  421. status_ = Q_TRAN(&Calc_error);
  422. }
  423. break;
  424. }
  425. default: {
  426. status_ = Q_SUPER(&Calc_on);
  427. break;
  428. }
  429. }
  430. return status_;
  431. }
  432. /*${SMs::Calc::SM::on::operand::zero1} .....................................*/
  433. static QState Calc_zero1(Calc * const me, QEvt const * const e) {
  434. QState status_;
  435. switch (e->sig) {
  436. /*${SMs::Calc::SM::on::operand::zero1} */
  437. case Q_ENTRY_SIG: {
  438. BSP_message("zero1-ENTRY;");
  439. status_ = Q_HANDLED();
  440. break;
  441. }
  442. /*${SMs::Calc::SM::on::operand::zero1} */
  443. case Q_EXIT_SIG: {
  444. BSP_message("zero1-EXIT;");
  445. status_ = Q_HANDLED();
  446. break;
  447. }
  448. /*${SMs::Calc::SM::on::operand::zero1::DIGIT_0} */
  449. case DIGIT_0_SIG: {
  450. ;
  451. status_ = Q_HANDLED();
  452. break;
  453. }
  454. /*${SMs::Calc::SM::on::operand::zero1::DIGIT_1_9} */
  455. case DIGIT_1_9_SIG: {
  456. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  457. status_ = Q_TRAN(&Calc_int1);
  458. break;
  459. }
  460. /*${SMs::Calc::SM::on::operand::zero1::POINT} */
  461. case POINT_SIG: {
  462. BSP_insert((int)'0');
  463. BSP_insert((int)'.');
  464. status_ = Q_TRAN(&Calc_frac1);
  465. break;
  466. }
  467. default: {
  468. status_ = Q_SUPER(&Calc_operand);
  469. break;
  470. }
  471. }
  472. return status_;
  473. }
  474. /*${SMs::Calc::SM::on::operand::int1} ......................................*/
  475. static QState Calc_int1(Calc * const me, QEvt const * const e) {
  476. QState status_;
  477. switch (e->sig) {
  478. /*${SMs::Calc::SM::on::operand::int1} */
  479. case Q_ENTRY_SIG: {
  480. BSP_message("int1-ENTRY;");
  481. status_ = Q_HANDLED();
  482. break;
  483. }
  484. /*${SMs::Calc::SM::on::operand::int1} */
  485. case Q_EXIT_SIG: {
  486. BSP_message("int1-EXIT;");
  487. status_ = Q_HANDLED();
  488. break;
  489. }
  490. /*${SMs::Calc::SM::on::operand::int1::POINT} */
  491. case POINT_SIG: {
  492. BSP_insert((int)'.');
  493. status_ = Q_TRAN(&Calc_frac1);
  494. break;
  495. }
  496. /*${SMs::Calc::SM::on::operand::int1::DIGIT_0, DIGIT_1_9} */
  497. case DIGIT_0_SIG: /* intentionally fall through */
  498. case DIGIT_1_9_SIG: {
  499. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  500. status_ = Q_HANDLED();
  501. break;
  502. }
  503. default: {
  504. status_ = Q_SUPER(&Calc_operand);
  505. break;
  506. }
  507. }
  508. return status_;
  509. }
  510. /*${SMs::Calc::SM::on::operand::frac1} .....................................*/
  511. static QState Calc_frac1(Calc * const me, QEvt const * const e) {
  512. QState status_;
  513. switch (e->sig) {
  514. /*${SMs::Calc::SM::on::operand::frac1} */
  515. case Q_ENTRY_SIG: {
  516. BSP_message("frac1-ENTRY;");
  517. status_ = Q_HANDLED();
  518. break;
  519. }
  520. /*${SMs::Calc::SM::on::operand::frac1} */
  521. case Q_EXIT_SIG: {
  522. BSP_message("frac1-EXIT;");
  523. status_ = Q_HANDLED();
  524. break;
  525. }
  526. /*${SMs::Calc::SM::on::operand::frac1::POINT} */
  527. case POINT_SIG: {
  528. ;
  529. status_ = Q_HANDLED();
  530. break;
  531. }
  532. /*${SMs::Calc::SM::on::operand::frac1::DIGIT_0, DIGIT_1_9} */
  533. case DIGIT_0_SIG: /* intentionally fall through */
  534. case DIGIT_1_9_SIG: {
  535. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  536. status_ = Q_HANDLED();
  537. break;
  538. }
  539. default: {
  540. status_ = Q_SUPER(&Calc_operand);
  541. break;
  542. }
  543. }
  544. return status_;
  545. }
  546. /*${SMs::Calc::SM::on::operand::negated1} ..................................*/
  547. static QState Calc_negated1(Calc * const me, QEvt const * const e) {
  548. QState status_;
  549. switch (e->sig) {
  550. /*${SMs::Calc::SM::on::operand::negated1} */
  551. case Q_ENTRY_SIG: {
  552. BSP_message("negated1-ENTRY;");
  553. BSP_negate();
  554. status_ = Q_HANDLED();
  555. break;
  556. }
  557. /*${SMs::Calc::SM::on::operand::negated1} */
  558. case Q_EXIT_SIG: {
  559. BSP_message("negated1-EXIT;");
  560. status_ = Q_HANDLED();
  561. break;
  562. }
  563. /*${SMs::Calc::SM::on::operand::negated1::DIGIT_0} */
  564. case DIGIT_0_SIG: {
  565. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  566. status_ = Q_TRAN(&Calc_zero1);
  567. break;
  568. }
  569. /*${SMs::Calc::SM::on::operand::negated1::DIGIT_1_9} */
  570. case DIGIT_1_9_SIG: {
  571. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  572. status_ = Q_TRAN(&Calc_int1);
  573. break;
  574. }
  575. /*${SMs::Calc::SM::on::operand::negated1::POINT} */
  576. case POINT_SIG: {
  577. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  578. status_ = Q_TRAN(&Calc_frac1);
  579. break;
  580. }
  581. /*${SMs::Calc::SM::on::operand::negated1::OPER} */
  582. case OPER_SIG: {
  583. /*${SMs::Calc::SM::on::operand::negated1::OPER::[e->key=='-']} */
  584. if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) {
  585. ;
  586. status_ = Q_HANDLED();
  587. }
  588. /*${SMs::Calc::SM::on::operand::negated1::OPER::[else]} */
  589. else {
  590. status_ = Q_HANDLED();
  591. }
  592. break;
  593. }
  594. default: {
  595. status_ = Q_SUPER(&Calc_operand);
  596. break;
  597. }
  598. }
  599. return status_;
  600. }
  601. /*${SMs::Calc::SM::on::opEntered} ..........................................*/
  602. static QState Calc_opEntered(Calc * const me, QEvt const * const e) {
  603. QState status_;
  604. switch (e->sig) {
  605. /*${SMs::Calc::SM::on::opEntered} */
  606. case Q_ENTRY_SIG: {
  607. BSP_message("opEntered-ENTRY;");
  608. status_ = Q_HANDLED();
  609. break;
  610. }
  611. /*${SMs::Calc::SM::on::opEntered} */
  612. case Q_EXIT_SIG: {
  613. BSP_message("opEntered-EXIT;");
  614. status_ = Q_HANDLED();
  615. break;
  616. }
  617. /*${SMs::Calc::SM::on::opEntered::DIGIT_0} */
  618. case DIGIT_0_SIG: {
  619. BSP_clear();
  620. status_ = Q_TRAN(&Calc_zero1);
  621. break;
  622. }
  623. /*${SMs::Calc::SM::on::opEntered::DIGIT_1_9} */
  624. case DIGIT_1_9_SIG: {
  625. BSP_clear();
  626. BSP_insert(Q_EVT_CAST(CalcEvt)->key_code);
  627. status_ = Q_TRAN(&Calc_int1);
  628. break;
  629. }
  630. /*${SMs::Calc::SM::on::opEntered::POINT} */
  631. case POINT_SIG: {
  632. BSP_clear();
  633. BSP_insert((int)'0');
  634. BSP_insert((int)'.');
  635. status_ = Q_TRAN(&Calc_frac1);
  636. break;
  637. }
  638. /*${SMs::Calc::SM::on::opEntered::OPER} */
  639. case OPER_SIG: {
  640. /*${SMs::Calc::SM::on::opEntered::OPER::[e->key=='-']} */
  641. if (Q_EVT_CAST(CalcEvt)->key_code == KEY_MINUS) {
  642. status_ = Q_TRAN(&Calc_negated1);
  643. }
  644. /*${SMs::Calc::SM::on::opEntered::OPER::[else]} */
  645. else {
  646. status_ = Q_HANDLED();
  647. }
  648. break;
  649. }
  650. default: {
  651. status_ = Q_SUPER(&Calc_on);
  652. break;
  653. }
  654. }
  655. return status_;
  656. }
  657. /*${SMs::Calc::SM::final} ..................................................*/
  658. static QState Calc_final(Calc * const me, QEvt const * const e) {
  659. QState status_;
  660. switch (e->sig) {
  661. /*${SMs::Calc::SM::final} */
  662. case Q_ENTRY_SIG: {
  663. BSP_message("final-ENTRY;");
  664. BSP_exit();
  665. status_ = Q_HANDLED();
  666. break;
  667. }
  668. default: {
  669. status_ = Q_SUPER(&QHsm_top);
  670. break;
  671. }
  672. }
  673. return status_;
  674. }
  675. /*$enddef${SMs::Calc} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/