Atm_player.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #include "Atm_player.hpp"
  2. /* Add optional parameters for the state machine to begin()
  3. * Add extra initialization code
  4. */
  5. Atm_player& Atm_player::begin( int pin /* = - 1 */ ) {
  6. // clang-format off
  7. const static state_t state_table[] PROGMEM = {
  8. /* ON_ENTER ON_LOOP ON_EXIT EVT_START EVT_STOP EVT_TOGGLE EVT_TIMER EVT_EOPAT EVT_REPEAT ELSE */
  9. /* IDLE */ ENT_IDLE, ATM_SLEEP, -1, START, -1, START, -1, -1, -1, -1,
  10. /* START */ ENT_START, -1, -1, -1, -1, -1, -1, -1, -1, SOUND,
  11. /* SOUND */ ENT_SOUND, -1, -1, -1, IDLE, IDLE, QUIET, -1, -1, -1,
  12. /* QUIET */ ENT_QUIET, -1, -1, -1, IDLE, IDLE, NEXT, -1, -1, -1,
  13. /* NEXT */ ENT_NEXT, -1, -1, -1, IDLE, IDLE, -1, REPEAT, -1, SOUND,
  14. /* REPEAT */ ENT_REPEAT, -1, -1, -1, IDLE, IDLE, -1, -1, FINISH, START,
  15. /* FINISH */ ENT_FINISH, -1, -1, -1, IDLE, -1, -1, -1, IDLE, START,
  16. };
  17. // clang-format on
  18. Machine::begin( state_table, ELSE );
  19. Atm_player::pin = pin;
  20. speed( 100 );
  21. pitch( 100 );
  22. repeat( 1 );
  23. play( 880, 50 );
  24. return *this;
  25. }
  26. /* Add C++ code for each event (input)
  27. * The code must return 1 if the event should be triggered
  28. */
  29. int Atm_player::event( int id ) {
  30. switch ( id ) {
  31. case EVT_START:
  32. return 0;
  33. case EVT_TIMER:
  34. return timer.expired( this );
  35. case EVT_EOPAT:
  36. if ( patternwidth == 32 ) {
  37. return ( step * 3 * sizeof( uint32_t ) ) >= patternsize;
  38. } else {
  39. return ( step * 3 * sizeof( int ) ) >= patternsize;
  40. }
  41. case EVT_REPEAT:
  42. return counter_repeat.expired();
  43. }
  44. return 0;
  45. }
  46. /* Add C++ code for each action
  47. * This generates the 'output' for the state machine
  48. */
  49. void Atm_player::action( int id ) {
  50. switch ( id ) {
  51. case ENT_FINISH:
  52. push( connectors, ON_FINISH, 0, 0, 0 );
  53. return;
  54. case ENT_IDLE:
  55. #ifndef ATM_PLAYER_DISABLE_TONE
  56. if ( pin >= 0 ) noTone( pin ); // Tone takes up 7 bytes extra SRAM
  57. #endif
  58. counter_repeat.set( repeatCount );
  59. return;
  60. case ENT_START:
  61. step = 0;
  62. counter_repeat.decrement();
  63. return;
  64. case ENT_SOUND:
  65. if ( patternwidth == 32 ) {
  66. uint32_t v = pattern32[step * 3] * (uint32_t)pitchFactor;
  67. push( connectors, ON_NOTE, true, v & 0xFFFF, v >> 16 & 0xFFFF );
  68. #ifndef ATM_PLAYER_DISABLE_TONE
  69. if ( pin >= 0 ) tone( pin, pattern32[step * 3] * pitchFactor );
  70. #endif
  71. timer.set( pattern32[step * 3 + 1] * speedFactor );
  72. } else {
  73. push( connectors, ON_NOTE, true, pattern16[step * 3] * pitchFactor, 1 );
  74. #ifndef ATM_PLAYER_DISABLE_TONE
  75. if ( pin >= 0 ) tone( pin, pattern16[step * 3] * pitchFactor );
  76. #endif
  77. timer.set( pattern16[step * 3 + 1] * speedFactor );
  78. }
  79. return;
  80. case ENT_QUIET:
  81. if ( patternwidth == 32 ) {
  82. uint32_t v = pattern32[step * 3] * (uint32_t)pitchFactor;
  83. push( connectors, ON_NOTE, false, v & 0xFFFF, v >> 16 & 0xFFFF );
  84. #ifndef ATM_PLAYER_DISABLE_TONE
  85. if ( pin >= 0 ) noTone( pin );
  86. #endif
  87. timer.set( pattern32[step * 3 + 2] * speedFactor );
  88. } else {
  89. push( connectors, ON_NOTE, false, pattern16[step * 3] * pitchFactor, 0 );
  90. #ifndef ATM_PLAYER_DISABLE_TONE
  91. if ( pin >= 0 ) noTone( pin );
  92. #endif
  93. timer.set( pattern16[step * 3 + 2] * speedFactor );
  94. }
  95. return;
  96. case ENT_NEXT:
  97. step++;
  98. return;
  99. case ENT_REPEAT:
  100. return;
  101. }
  102. }
  103. /* How many times to repeat the pattern
  104. *
  105. */
  106. Atm_player& Atm_player::repeat( uint16_t v /* = -1 */) {
  107. counter_repeat.set( repeatCount = v );
  108. return *this;
  109. }
  110. Atm_player& Atm_player::speed( float v ) {
  111. speedFactor = 100 / v;
  112. return *this;
  113. }
  114. Atm_player& Atm_player::pitch( float v ) {
  115. pitchFactor = v / 100;
  116. return *this;
  117. }
  118. Atm_player& Atm_player::start( void ) {
  119. trigger( EVT_START );
  120. return *this;
  121. }
  122. Atm_player& Atm_player::stop( void ) {
  123. trigger( EVT_STOP );
  124. return *this;
  125. }
  126. Atm_player& Atm_player::toggle( void ) {
  127. trigger( EVT_TOGGLE );
  128. return *this;
  129. }
  130. /* Sets the pattern and pattern length (in bytes)
  131. *
  132. */
  133. Atm_player& Atm_player::play( int* pat, int patsize ) {
  134. patternwidth = 16;
  135. pattern16 = pat;
  136. patternsize = patsize;
  137. counter_repeat.set( repeatCount );
  138. step = 0;
  139. return *this;
  140. }
  141. Atm_player& Atm_player::play( uint32_t* pat, int patsize ) {
  142. patternwidth = 32;
  143. pattern32 = pat;
  144. patternsize = patsize;
  145. counter_repeat.set( repeatCount );
  146. step = 0;
  147. return *this;
  148. }
  149. Atm_player& Atm_player::play( int freq, int period, int pause /* = 0 */ ) {
  150. patternwidth = 16;
  151. stub[0] = freq;
  152. stub[1] = period;
  153. stub[2] = pause;
  154. pattern16 = stub;
  155. patternsize = 3 * sizeof( int );
  156. step = 0;
  157. return *this;
  158. }
  159. /* Optionally override the default trigger() method
  160. * Control what triggers your machine can and cannot process
  161. */
  162. Atm_player& Atm_player::trigger( int event ) {
  163. Machine::trigger( event );
  164. return *this;
  165. }
  166. /* Optionally override the default state() method
  167. * Control what the machine returns when another process requests its state()
  168. */
  169. int Atm_player::state( void ) {
  170. return Machine::state();
  171. }
  172. /* Nothing customizable below this line
  173. ************************************************************************************************
  174. */
  175. /* onFinish() push connector variants ( slots 1, autostore 0, broadcast 0 )
  176. *
  177. * Usage in action() handler: push( connectors, ON_FINISH, 0, v, up)
  178. */
  179. Atm_player& Atm_player::onFinish( Machine& machine, int event ) {
  180. onPush( connectors, ON_FINISH, 0, 1, 1, machine, event );
  181. return *this;
  182. }
  183. Atm_player& Atm_player::onFinish( atm_cb_push_t callback, int idx ) {
  184. onPush( connectors, ON_FINISH, 0, 1, 1, callback, idx );
  185. return *this;
  186. }
  187. /* onNote() push connector variants ( slots 2, autostore 0, broadcast 0 )
  188. *
  189. * Usage in action() handler: push( connectors, ON_NOTE, sub, v, up)
  190. */
  191. Atm_player& Atm_player::onNote( Machine& machine, int event ) {
  192. onPush( connectors, ON_NOTE, 0, 2, 1, machine, event );
  193. return *this;
  194. }
  195. Atm_player& Atm_player::onNote( atm_cb_push_t callback, int idx ) {
  196. onPush( connectors, ON_NOTE, 0, 2, 1, callback, idx );
  197. return *this;
  198. }
  199. Atm_player& Atm_player::onNote( int sub, Machine& machine, int event ) {
  200. onPush( connectors, ON_NOTE, sub, 2, 0, machine, event );
  201. return *this;
  202. }
  203. Atm_player& Atm_player::onNote( int sub, atm_cb_push_t callback, int idx ) {
  204. onPush( connectors, ON_NOTE, sub, 2, 0, callback, idx );
  205. return *this;
  206. }
  207. /* State trace method
  208. * Sets the symbol table and the default logging method for serial monitoring
  209. */
  210. Atm_player& Atm_player::trace( Stream& stream ) {
  211. Machine::setTrace( &stream, atm_serial_debug::trace,
  212. "PLAYER\0EVT_START\0EVT_STOP\0EVT_TOGGLE\0EVT_TIMER\0EVT_EOPAT\0EVT_REPEAT\0ELSE\0IDLE\0START\0SOUND\0QUIET\0NEXT\0REPEAT\0FINISH" );
  213. return *this;
  214. }