No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

states.cpp 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include <Arduino.h>
  2. #include "config.h"
  3. #include "config_pins.h"
  4. #include "data.h"
  5. #include "common.h"
  6. #include "lcd.h"
  7. #include "steppers.h"
  8. #include "statemachine.h"
  9. #include "states.h"
  10. // --------------------------------------
  11. StateText sm_ask_homing = StateText();
  12. StateText sm_do_homing = StateText(&sm_ask_homing);
  13. StateMenu sm_menu = StateMenu(&sm_do_homing, false);
  14. StateMenu sm_auto = StateMenu(&sm_menu);
  15. StateDynamicMenu sm_presets = StateDynamicMenu(&sm_auto);
  16. StateText sm_new_preset = StateText(&sm_auto);
  17. StateDynamicMenu sm_mod_preset = StateDynamicMenu(&sm_auto);
  18. StateDynamicMenu sm_del_preset = StateDynamicMenu(&sm_auto);
  19. StateMenu sm_move = StateMenu(&sm_menu);
  20. StateText sm_move_x = StateText(&sm_move);
  21. StateText sm_move_y = StateText(&sm_move);
  22. StateText sm_move_z = StateText(&sm_move);
  23. StateText sm_move_e = StateText(&sm_move);
  24. StateMenu sm_config = StateMenu(&sm_menu);
  25. StateText sm_conf_load = StateText(&sm_config);
  26. StateText sm_conf_save = StateText(&sm_config);
  27. StateValue<float> sm_conf_speed_xy = StateValue<float>(&sm_config, data_options()->speed_x, 1.0, XY_MAX_SPEED);
  28. StateValue<float> sm_conf_speed_z = StateValue<float>(&sm_config, data_options()->speed_z, 1.0, Z_MAX_SPEED);
  29. StateValue<float> sm_conf_speed_e = StateValue<float>(&sm_config, data_options()->speed_e, 1.0, E_MAX_SPEED);
  30. StateValue<float> sm_conf_accel_xy = StateValue<float>(&sm_config, data_options()->accel_x, 1.0, XY_MAX_ACCEL);
  31. StateValue<float> sm_conf_accel_z = StateValue<float>(&sm_config, data_options()->accel_z, 1.0, Z_MAX_ACCEL);
  32. StateValue<float> sm_conf_accel_e = StateValue<float>(&sm_config, data_options()->accel_e, 1.0, E_MAX_ACCEL);
  33. // --------------------------------------
  34. State *current_state = NULL;
  35. String strbuf;
  36. void states_init(void) {
  37. // ----------------------------------
  38. sm_ask_homing.setTitle("Ask for homing");
  39. sm_ask_homing.setHeading("Homing Required!");
  40. sm_ask_homing.setText("Click to home all four axes.");
  41. // ----------------------------------
  42. sm_do_homing.setTitle("Home all axes");
  43. sm_do_homing.setHeading("Homing...");
  44. sm_do_homing.onEnter([]() {
  45. //steppers_start_homing();
  46. });
  47. sm_do_homing.whenIn([](StateMachineInput smi) {
  48. //if (smi.motors_done) {
  49. // if (steppers_homed()) {
  50. async_beep(HOMING_BEEP_TIME, HOMING_BEEP_FREQ);
  51. states_go_to(&sm_menu);
  52. // }
  53. //}
  54. // TODO update text with current axis
  55. });
  56. // ----------------------------------
  57. sm_menu.setTitle("Main Menu");
  58. sm_menu.addChild(&sm_do_homing, 1);
  59. // ----------------------------------
  60. sm_move.setTitle("Move Axis");
  61. sm_move_x.setTitle("X Axis");
  62. sm_move_y.setTitle("Y Axis");
  63. sm_move_z.setTitle("Z Axis");
  64. sm_move_e.setTitle("E Axis");
  65. // ----------------------------------
  66. sm_auto.setTitle("Filling Menu");
  67. sm_presets.setTitle("Use Preset");
  68. sm_presets.dataCount([]() {
  69. return (int)data_preset_count();
  70. });
  71. sm_presets.dataGet([](int i) {
  72. // TODO can not build a name string here
  73. // dynamically. need to have a name stored
  74. // somewhere, in data/eeprom, for each preset
  75. // that we can pass here
  76. return "foo";
  77. });
  78. sm_new_preset.setTitle("Add new Preset");
  79. sm_new_preset.setHeading("Add new Preset");
  80. sm_new_preset.onEnter([]() {
  81. struct data_config_preset preset;
  82. if (!data_preset_add(preset)) {
  83. strbuf = String(data_eeprom_error()) + " Error adding preset!";
  84. sm_new_preset.setText(strbuf.c_str());
  85. } else {
  86. strbuf = "Preset " + String(data_preset_count()) + " has been added!";
  87. sm_new_preset.setText(strbuf.c_str());
  88. }
  89. });
  90. sm_mod_preset.setTitle("Modify Preset");
  91. sm_mod_preset.dataCount([]() {
  92. return (int)data_preset_count();
  93. });
  94. sm_mod_preset.dataGet([](int i) {
  95. // TODO can not build a name string here
  96. // dynamically. need to have a name stored
  97. // somewhere, in data/eeprom, for each preset
  98. // that we can pass here
  99. return "foo";
  100. });
  101. sm_del_preset.setTitle("Delete Preset");
  102. sm_del_preset.dataCount([]() {
  103. return (int)data_preset_count();
  104. });
  105. sm_del_preset.dataGet([](int i) {
  106. // TODO can not build a name string here
  107. // dynamically. need to have a name stored
  108. // somewhere, in data/eeprom, for each preset
  109. // that we can pass here
  110. return "foo";
  111. });
  112. // ----------------------------------
  113. sm_config.setTitle("Configuration");
  114. sm_conf_load.setTitle("Load from EEPROM");
  115. sm_conf_load.setHeading("Load from EEPROM");
  116. sm_conf_load.onEnter([]() {
  117. if (!data_eeprom_read()) {
  118. strbuf = String(data_eeprom_error()) + " Error reading configuration!";
  119. sm_conf_load.setText(strbuf.c_str());
  120. } else {
  121. sm_conf_load.setText("Configuration read successful!");
  122. steppers_set_speed_x(data_options()->speed_x);
  123. steppers_set_accel_x(data_options()->accel_x);
  124. steppers_set_speed_y(data_options()->speed_y);
  125. steppers_set_accel_y(data_options()->accel_y);
  126. steppers_set_speed_z(data_options()->speed_z);
  127. steppers_set_accel_z(data_options()->accel_z);
  128. steppers_set_speed_e(data_options()->speed_e);
  129. steppers_set_accel_e(data_options()->accel_e);
  130. }
  131. });
  132. sm_conf_save.setTitle("Store to EEPROM");
  133. sm_conf_save.setHeading("Store to EEPROM");
  134. sm_conf_save.setText("Configuration written to EEPROM!");
  135. sm_conf_save.onEnter([]() {
  136. data_eeprom_write();
  137. });
  138. sm_conf_speed_xy.setTitle("XY Speed");
  139. sm_conf_speed_xy.onUpdate([](float v) {
  140. steppers_set_speed_x(v);
  141. steppers_set_speed_y(v);
  142. });
  143. sm_conf_speed_z.setTitle("Z Speed");
  144. sm_conf_speed_z.onUpdate([](float v) {
  145. steppers_set_speed_z(v);
  146. });
  147. sm_conf_speed_e.setTitle("E Speed");
  148. sm_conf_speed_e.onUpdate([](float v) {
  149. steppers_set_speed_e(v);
  150. });
  151. sm_conf_accel_xy.setTitle("XY Acceleration");
  152. sm_conf_accel_xy.onUpdate([](float v) {
  153. steppers_set_accel_x(v);
  154. steppers_set_accel_y(v);
  155. });
  156. sm_conf_accel_z.setTitle("Z Acceleration");
  157. sm_conf_accel_z.onUpdate([](float v) {
  158. steppers_set_accel_z(v);
  159. });
  160. sm_conf_accel_e.setTitle("E Acceleration");
  161. sm_conf_accel_e.onUpdate([](float v) {
  162. steppers_set_accel_e(v);
  163. });
  164. // ----------------------------------
  165. states_go_to(&sm_ask_homing);
  166. }
  167. void states_run(StateMachineInput smi) {
  168. if (smi.click) {
  169. async_beep(ENCODER_CLICK_BEEP_TIME, ENCODER_CLICK_BEEP_FREQ);
  170. }
  171. if (smi.kill) {
  172. steppers_kill();
  173. Serial.println("Kill button pressed!");
  174. blocking_beep(KILL_BEEP_TIME, KILL_BEEP_FREQ, KILL_BEEP_REPEAT - 1);
  175. states_go_to(&sm_ask_homing);
  176. return;
  177. }
  178. if (current_state != NULL) {
  179. current_state->inState(smi);
  180. }
  181. }
  182. State *states_get(void) {
  183. return current_state;
  184. }
  185. void states_go_to(State *state) {
  186. current_state = state;
  187. if (current_state != NULL) {
  188. current_state->enterState();
  189. }
  190. }