alarm.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*$file${.::alarm.c} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  2. /*
  3. * Model: comp.qm
  4. * File: ${.::alarm.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${.::alarm.c} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  31. #include "qpc.h"
  32. #include "bsp.h"
  33. #include "alarm.h"
  34. #include "clock.h"
  35. //Q_DEFINE_THIS_FILE
  36. /* Alarm component --------------------*/
  37. /*$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  38. /* Check for the minimum required QP version */
  39. #if (QP_VERSION < 700U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
  40. #error qpc version 7.0.0 or higher required
  41. #endif
  42. /*$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  43. /*$define${Components::Alarm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  44. /*${Components::Alarm} .....................................................*/
  45. /*${Components::Alarm::ctor} ...............................................*/
  46. void Alarm_ctor(Alarm * const me) {
  47. QHsm_ctor(&me->super, Q_STATE_CAST(&Alarm_initial));
  48. }
  49. /*${Components::Alarm::SM} .................................................*/
  50. QState Alarm_initial(Alarm * const me, void const * const par) {
  51. /*${Components::Alarm::SM::initial} */
  52. me->alarm_time = 12U*60U;
  53. (void)par; /* unused parameter */
  54. return Q_TRAN(&Alarm_off);
  55. }
  56. /*${Components::Alarm::SM::off} ............................................*/
  57. QState Alarm_off(Alarm * const me, QEvt const * const e) {
  58. QState status_;
  59. switch (e->sig) {
  60. /*${Components::Alarm::SM::off} */
  61. case Q_ENTRY_SIG: {
  62. /* while in the off state, the alarm is kept in decimal format */
  63. me->alarm_time = (me->alarm_time/60)*100 + me->alarm_time%60;
  64. BSP_showTime24H("*** Alarm OFF ", me->alarm_time, 100U);
  65. status_ = Q_HANDLED();
  66. break;
  67. }
  68. /*${Components::Alarm::SM::off} */
  69. case Q_EXIT_SIG: {
  70. /* upon exit, the alarm is converted to binary format */
  71. me->alarm_time = (me->alarm_time/100U)*60U + me->alarm_time%100U;
  72. status_ = Q_HANDLED();
  73. break;
  74. }
  75. /*${Components::Alarm::SM::off::ALARM_ON} */
  76. case ALARM_ON_SIG: {
  77. /*${Components::Alarm::SM::off::ALARM_ON::[alarminrange?]} */
  78. if ((me->alarm_time / 100U < 24U)
  79. && (me->alarm_time % 100U < 60U))
  80. {
  81. status_ = Q_TRAN(&Alarm_on);
  82. }
  83. /*${Components::Alarm::SM::off::ALARM_ON::[else]} */
  84. else {
  85. me->alarm_time = 0U;
  86. BSP_showTime24H("*** Alarm reset", me->alarm_time, 100U);
  87. status_ = Q_HANDLED();
  88. }
  89. break;
  90. }
  91. /*${Components::Alarm::SM::off::ALARM_SET} */
  92. case ALARM_SET_SIG: {
  93. /* while setting, the alarm is kept in decimal format */
  94. me->alarm_time = (10U * me->alarm_time
  95. + ((SetEvt const *)e)->digit) % 10000U;
  96. BSP_showTime24H("*** Alarm reset ", me->alarm_time, 100U);
  97. status_ = Q_HANDLED();
  98. break;
  99. }
  100. default: {
  101. status_ = Q_SUPER(&QHsm_top);
  102. break;
  103. }
  104. }
  105. return status_;
  106. }
  107. /*${Components::Alarm::SM::on} .............................................*/
  108. QState Alarm_on(Alarm * const me, QEvt const * const e) {
  109. QState status_;
  110. switch (e->sig) {
  111. /*${Components::Alarm::SM::on} */
  112. case Q_ENTRY_SIG: {
  113. BSP_showTime24H("*** Alarm ON ", me->alarm_time, 60U);
  114. status_ = Q_HANDLED();
  115. break;
  116. }
  117. /*${Components::Alarm::SM::on::ALARM_OFF} */
  118. case ALARM_OFF_SIG: {
  119. status_ = Q_TRAN(&Alarm_off);
  120. break;
  121. }
  122. /*${Components::Alarm::SM::on::ALARM_SET} */
  123. case ALARM_SET_SIG: {
  124. BSP_showMsg("*** Cannot set Alarm when it is ON");
  125. status_ = Q_HANDLED();
  126. break;
  127. }
  128. /*${Components::Alarm::SM::on::TIME} */
  129. case TIME_SIG: {
  130. /*${Components::Alarm::SM::on::TIME::[Q_EVT_CAST(TimeEvt)->current_ti~} */
  131. if (Q_EVT_CAST(TimeEvt)->current_time == me->alarm_time) {
  132. BSP_showMsg("ALARM!!!");
  133. /* asynchronously post the event to the container AO */
  134. QACTIVE_POST(APP_alarmClock, Q_NEW(QEvt, ALARM_SIG), me);
  135. status_ = Q_HANDLED();
  136. }
  137. else {
  138. status_ = Q_UNHANDLED();
  139. }
  140. break;
  141. }
  142. default: {
  143. status_ = Q_SUPER(&QHsm_top);
  144. break;
  145. }
  146. }
  147. return status_;
  148. }
  149. /*$enddef${Components::Alarm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/