ui_pattern.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <stddef.h>
  2. #include "ui.h"
  3. #include <string.h>
  4. #include "adc.h"
  5. #include "button.h"
  6. #include "system.h"
  7. #include "unicore-mx/stm32/gpio.h"
  8. #include "unicore-mx/stm32/rcc.h"
  9. #include "pot.h"
  10. #include "dac.h"
  11. #include "settings.h"
  12. #include "timer.h"
  13. static int sel_pos = 1;
  14. static int sel_track = 0;
  15. static int sel_val = 0;
  16. extern volatile uint32_t jiffies;
  17. void ui_pattern_refresh_action(struct display_menu_entry *e, uint8_t b)
  18. {
  19. int i;
  20. int off;
  21. sel_val = drums_get(sel_track, sel_pos - 1);
  22. led_beat(0);
  23. off = ((sel_pos - 1)/ 8) * 8;
  24. for (i = 0; i < 8; i++) {
  25. if (drums_get(sel_track, (off + i)))
  26. led_on(i+1);
  27. else
  28. led_off(i+1);
  29. }
  30. }
  31. void ui_pattern_update_action(struct display_menu_entry *e, uint8_t b)
  32. {
  33. if (sel_val) {
  34. drums_set(sel_track, sel_pos - 1);
  35. drums_oneshot(sel_track);
  36. } else
  37. drums_clear(sel_track, sel_pos - 1);
  38. }
  39. void ui_pattern_keepalive(void)
  40. {
  41. static uint32_t blink_time = 0;
  42. if (jiffies - blink_time > 20) {
  43. led_toggle(((sel_pos - 1) % 8) + 1);
  44. blink_time = jiffies;
  45. }
  46. }
  47. extern struct display_menu MainMenu;
  48. void ui_pattern_menu_return_to_main(struct display_menu_entry *e, uint8_t b)
  49. {
  50. display_clear(NULL);
  51. clear_input_callback();
  52. clear_keepalive();
  53. led_beat(0);
  54. ui_display_menu(&MainMenu);
  55. }
  56. static void pattern_menu_prepare(struct display_menu *m);
  57. struct display_menu PatternMenu = {
  58. .entry_n = 4,
  59. .render = pattern_menu_prepare,
  60. .entry = {
  61. /* TYPE, label, action, min, max, var, arg */
  62. { ENTRY_TYPE_DEC, "Track: ", ui_pattern_refresh_action, 0, (MAX_TRACKS - 1), 1, &sel_track, NULL },
  63. { ENTRY_TYPE_DEC, "Pos : ", ui_pattern_refresh_action, 1, 8, 1, &sel_pos, NULL },
  64. { ENTRY_TYPE_BOOL, "Value : ", ui_pattern_update_action, 0, 0, 0, &sel_val, NULL },
  65. { ENTRY_TYPE_TEXT, "Back to main", ui_pattern_menu_return_to_main, 0, 0, 0, NULL, NULL },
  66. {0, "", NULL, 0,0,0,NULL,NULL}
  67. }
  68. };
  69. void ui_pattern_input(int press, int hold)
  70. {
  71. if (press == '*' && (ui_get_menu_selection() == 1)) {
  72. sel_val = !sel_val;
  73. ui_pattern_update_action(NULL, 0);
  74. ui_pattern_refresh_action(NULL, 0);
  75. press = 0;
  76. return;
  77. }
  78. ui_button_press(press, hold);
  79. if ((press == '+' || press == '-') && (ui_get_menu_selection() == 0)) {
  80. drums_oneshot(sel_track);
  81. }
  82. }
  83. const char instr_txt[MAX_TRACKS][14] = {
  84. "Kick",
  85. "Snare",
  86. "HitHat",
  87. "Tom1",
  88. "Tom2",
  89. "Clap",
  90. "Cow",
  91. "",
  92. };
  93. static void pattern_menu_prepare(struct display_menu *m)
  94. {
  95. if (m != &PatternMenu)
  96. return;
  97. PatternMenu.entry[1].max = Settings->drums[Settings->current_pattern].len;
  98. sel_val = drums_get(sel_track, sel_pos - 1);
  99. set_keepalive(ui_pattern_keepalive);
  100. set_input_callback(ui_pattern_input);
  101. }