atm_connector.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. Automaton.cpp - Reactive State Machine Framework for Arduino.
  3. Published under the MIT License (MIT), Copyright (c) 2015-2016, J.P. van der Landen
  4. */
  5. #include "Automaton.h"
  6. /*
  7. * The atm_connector class facilitates creating push and pull connections between
  8. * State Machines.
  9. *
  10. *********************************************************************************************
  11. *
  12. * push( v, up, overrideCallback ) - Calls a machine's trigger method or a callback
  13. *
  14. * Will return false if a callback is configured while the overrideCallback arg was specified
  15. */
  16. bool atm_connector::push( int v /* = 0 */, int up /* = 0 */, bool overrideCallback /* = false */ ) {
  17. switch ( mode_flags & B00000111 ) {
  18. case MODE_PUSHCB:
  19. if ( overrideCallback ) {
  20. return false;
  21. } else {
  22. if ( push_callback ) {
  23. ( *push_callback )( callback_idx, v, up );
  24. }
  25. }
  26. return true;
  27. case MODE_MACHINE:
  28. if ( machine != 0 ) {
  29. machine->trigger( event );
  30. }
  31. return true;
  32. }
  33. return true;
  34. }
  35. /*
  36. * pull( v, up, def_value ) - Calls a machine's state method or a callback
  37. *
  38. */
  39. int atm_connector::pull( int v /* = 0 */, int up /* = 0 */, bool def_value /* = false */ ) {
  40. switch ( mode_flags & B00000111 ) {
  41. case MODE_PULLCB:
  42. return ( *pull_callback )( callback_idx );
  43. case MODE_MACHINE:
  44. return machine->state();
  45. }
  46. return def_value;
  47. }
  48. /*
  49. * logOp() Returns the logical operator part of the mode_flags byte
  50. *
  51. */
  52. int8_t atm_connector::logOp( void ) {
  53. return ( mode_flags & B00011000 ) >> 3;
  54. }
  55. /*
  56. * logOp() Returns the relational operator part of the mode_flags byte
  57. *
  58. */
  59. int8_t atm_connector::relOp( void ) {
  60. return ( mode_flags & B11100000 ) >> 5;
  61. }
  62. /*
  63. * set( callback, idx, logOp, relOp ) - Configures a connector object as a push callback
  64. *
  65. */
  66. void atm_connector::set( atm_cb_push_t callback, int idx, int8_t logOp /* = 0 */, int8_t relOp /* = 0 */ ) {
  67. mode_flags = MODE_PUSHCB | ( logOp << 3 ) | ( relOp << 5 );
  68. push_callback = callback;
  69. callback_idx = idx;
  70. }
  71. /*
  72. * set( callback, idx, logOp, relOp ) - Configures a connector object as a pull callback
  73. *
  74. */
  75. void atm_connector::set( atm_cb_pull_t callback, int idx, int8_t logOp /* = 0 */, int8_t relOp /* = 0 */ ) {
  76. mode_flags = MODE_PULLCB | ( logOp << 3 ) | ( relOp << 5 );
  77. pull_callback = callback;
  78. callback_idx = idx;
  79. }
  80. /*
  81. * set( callback, idx, logOp, relOp ) - Configures a connector object as a machine connector (calls trigger)
  82. *
  83. */
  84. void atm_connector::set( Machine* m, int evt, int8_t logOp /* = 0 */, int8_t relOp /* = 0 */ ) {
  85. mode_flags = MODE_MACHINE | ( logOp << 3 ) | ( relOp << 5 );
  86. machine = m;
  87. event = evt;
  88. }
  89. /*
  90. * mode() - Returns the mode part of the mode_flags byte
  91. *
  92. */
  93. int8_t atm_connector::mode( void ) {
  94. return mode_flags & B00000111;
  95. }