Atm_step.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "Atm_step.hpp"
  2. Atm_step& Atm_step::begin( void ) {
  3. // clang-format off
  4. const static state_t state_table[] PROGMEM = {
  5. /* ON_ENTER ON_LOOP ON_EXIT EVT_STEP EVT_BACK EVT_SWEEP EVT_LINEAR ELSE */
  6. /* LINEAR */ -1, -1, -1, S0, R9, SWEEP, LINEAR, -1,
  7. /* S0 */ ENT_S0, -1, -1, S1, R0, SWEEP, LINEAR, -1, // Linear
  8. /* S1 */ ENT_S1, -1, -1, S2, R1, SWEEP, LINEAR, -1,
  9. /* S2 */ ENT_S2, -1, -1, S3, R2, SWEEP, LINEAR, -1,
  10. /* S3 */ ENT_S3, -1, -1, S4, R3, SWEEP, LINEAR, -1,
  11. /* S4 */ ENT_S4, -1, -1, S5, R4, SWEEP, LINEAR, -1,
  12. /* S5 */ ENT_S5, -1, -1, S6, R5, SWEEP, LINEAR, -1,
  13. /* S6 */ ENT_S6, -1, -1, S7, R6, SWEEP, LINEAR, -1,
  14. /* S7 */ ENT_S7, -1, -1, S8, R7, SWEEP, LINEAR, -1,
  15. /* S8 */ ENT_S8, -1, -1, S9, R8, SWEEP, LINEAR, -1,
  16. /* S9 */ ENT_S9, -1, -1, S0, R9, SWEEP, LINEAR, -1,
  17. /* R0 */ ENT_S0, -1, -1, S0, R9, SWEEP, LINEAR, -1, // Linear R
  18. /* R1 */ ENT_S1, -1, -1, S1, R0, SWEEP, LINEAR, -1,
  19. /* R2 */ ENT_S2, -1, -1, S2, R1, SWEEP, LINEAR, -1,
  20. /* R3 */ ENT_S3, -1, -1, S3, R2, SWEEP, LINEAR, -1,
  21. /* R4 */ ENT_S4, -1, -1, S4, R3, SWEEP, LINEAR, -1,
  22. /* R5 */ ENT_S5, -1, -1, S5, R4, SWEEP, LINEAR, -1,
  23. /* R6 */ ENT_S6, -1, -1, S6, R5, SWEEP, LINEAR, -1,
  24. /* R7 */ ENT_S7, -1, -1, S7, R6, SWEEP, LINEAR, -1,
  25. /* R8 */ ENT_S8, -1, -1, S8, R7, SWEEP, LINEAR, -1,
  26. /* R9 */ ENT_S9, -1, -1, S9, R8, SWEEP, LINEAR, -1,
  27. /* SWEEP */ -1, -1, -1, X0, X0, SWEEP, LINEAR, -1,
  28. /* X0 */ ENT_S0, -1, -1, X1, X1, SWEEP, LINEAR, -1, // Sweep
  29. /* X1 */ ENT_S1, -1, -1, X2, X2, SWEEP, LINEAR, -1,
  30. /* X2 */ ENT_S2, -1, -1, X3, X3, SWEEP, LINEAR, -1,
  31. /* X3 */ ENT_S3, -1, -1, X4, X4, SWEEP, LINEAR, -1,
  32. /* X4 */ ENT_S4, -1, -1, X5, X5, SWEEP, LINEAR, -1,
  33. /* X5 */ ENT_S5, -1, -1, X6, X6, SWEEP, LINEAR, -1,
  34. /* X6 */ ENT_S6, -1, -1, X7, X7, SWEEP, LINEAR, -1,
  35. /* X7 */ ENT_S7, -1, -1, X8, X8, SWEEP, LINEAR, -1,
  36. /* X8 */ ENT_S8, -1, -1, X9, X9, SWEEP, LINEAR, -1,
  37. /* X9 */ ENT_S9, -1, -1, XA, XA, SWEEP, LINEAR, -1,
  38. /* XA */ ENT_S8, -1, -1, XB, XB, SWEEP, LINEAR, -1,
  39. /* XB */ ENT_S7, -1, -1, XC, XC, SWEEP, LINEAR, -1,
  40. /* XC */ ENT_S6, -1, -1, XD, XD, SWEEP, LINEAR, -1,
  41. /* XD */ ENT_S5, -1, -1, XE, XE, SWEEP, LINEAR, -1,
  42. /* XE */ ENT_S4, -1, -1, XF, XF, SWEEP, LINEAR, -1,
  43. /* XF */ ENT_S3, -1, -1, XG, XG, SWEEP, LINEAR, -1,
  44. /* XG */ ENT_S2, -1, -1, XH, XH, SWEEP, LINEAR, -1,
  45. /* XH */ ENT_S1, -1, -1, X0, X0, SWEEP, LINEAR, -1,
  46. };
  47. // clang-format on
  48. Machine::begin( state_table, ELSE );
  49. return *this;
  50. }
  51. int Atm_step::event( int id ) {
  52. int on_enter = read_state( state_table + ( current * state_width ) + ATM_ON_ENTER );
  53. switch ( id ) {
  54. case EVT_STEP:
  55. return ( current < R0 || current > R9 ) && ( on_enter > -1 ) && ( connector[on_enter].mode() == 0 );
  56. case EVT_BACK:
  57. return ( current >= R0 && current <= R9 ) && ( on_enter > -1 ) && ( connector[on_enter].mode() == 0 );
  58. }
  59. return 0;
  60. }
  61. void Atm_step::action( int id ) {
  62. if ( id > -1 ) {
  63. if ( connector[id].mode() ) {
  64. connector[id].push( id );
  65. onstep.push( id );
  66. }
  67. }
  68. }
  69. Atm_step& Atm_step::onStep( uint8_t id ) {
  70. connector[id].mode_flags = atm_connector::MODE_NULL;
  71. return *this;
  72. }
  73. Atm_step& Atm_step::onStep( uint8_t id, atm_cb_push_t callback, int idx /* = 0 */ ) {
  74. connector[id].set( callback, idx );
  75. return *this;
  76. }
  77. Atm_step& Atm_step::onStep( uint8_t id, Machine& machine, int event /* = 0 */ ) {
  78. connector[id].set( &machine, event );
  79. return *this;
  80. }
  81. Atm_step& Atm_step::onStep( atm_cb_push_t callback, int idx /* = 0 */ ) {
  82. onstep.set( callback, idx );
  83. return *this;
  84. }
  85. Atm_step& Atm_step::onStep( Machine& machine, int event /* = 0 */ ) {
  86. onstep.set( &machine, event );
  87. return *this;
  88. }
  89. int Atm_step::state( void ) {
  90. int on_enter = read_state( state_table + ( current * state_width ) + ATM_ON_ENTER );
  91. return on_enter;
  92. }
  93. Atm_step& Atm_step::trace( Stream& stream ) {
  94. setTrace( &stream, atm_serial_debug::trace,
  95. "STEP\0EVT_STEP\0EVT_BACK\0EVT_SWEEP\0EVT_LINEAR\0ELSE\0"
  96. "LINEAR\0S0\0S1\0S2\0S3\0S4\0S5\0S6\0S7\0S8\0S9\0R0\0R1\0R2\0R3\0R4\0R5\0R6\0R7\0R8\0R9\0"
  97. "SWEEP\0X0\0X1\0X2\0X3\0X4\0X5\0X6\0X7\0X8\0X9\0XA\0XB\0XC\0XD\0XE\0XF\0XG\0XH" );
  98. return *this;
  99. }