store_eeprom.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. EEPROM routines to save Sprinter Settings
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include <avr/eeprom.h>
  15. #include <avr/pgmspace.h>
  16. #include <inttypes.h>
  17. #include "Sprinter.h"
  18. #include "store_eeprom.h"
  19. #include "Configuration.h"
  20. #ifdef USE_EEPROM_SETTINGS
  21. //======================================================================================
  22. //========================= Read / Write EEPROM =======================================
  23. template <class T> int EEPROM_writeAnything(int &ee, const T& value)
  24. {
  25. const byte* p = (const byte*)(const void*)&value;
  26. int i;
  27. for (i = 0; i < (int)sizeof(value); i++)
  28. eeprom_write_byte((unsigned char *)ee++, *p++);
  29. return i;
  30. }
  31. template <class T> int EEPROM_readAnything(int &ee, T& value)
  32. {
  33. byte* p = (byte*)(void*)&value;
  34. int i;
  35. for (i = 0; i < (int)sizeof(value); i++)
  36. *p++ = eeprom_read_byte((unsigned char *)ee++);
  37. return i;
  38. }
  39. //======================================================================================
  40. void EEPROM_StoreSettings()
  41. {
  42. unsigned long ul_help = 20000;
  43. unsigned int ui_help = 0;
  44. char ver[4]= "000";
  45. int i=EEPROM_OFFSET;
  46. EEPROM_writeAnything(i,ver); // invalidate data first
  47. EEPROM_writeAnything(i,axis_steps_per_unit);
  48. EEPROM_writeAnything(i,max_feedrate);
  49. EEPROM_writeAnything(i,max_acceleration_units_per_sq_second);
  50. EEPROM_writeAnything(i,move_acceleration);
  51. EEPROM_writeAnything(i,retract_acceleration);
  52. EEPROM_writeAnything(i,minimumfeedrate);
  53. EEPROM_writeAnything(i,mintravelfeedrate);
  54. EEPROM_writeAnything(i,ul_help); //Min Segment Time, not used yet
  55. EEPROM_writeAnything(i,max_xy_jerk);
  56. EEPROM_writeAnything(i,max_z_jerk);
  57. //PID Settings, not used yet --> placeholder
  58. ui_help = 2560;
  59. EEPROM_writeAnything(i,ui_help); //Kp
  60. ui_help = 64;
  61. EEPROM_writeAnything(i,ui_help); //Ki
  62. ui_help = 4096;
  63. EEPROM_writeAnything(i,ui_help); //Kd
  64. char ver2[4]=EEPROM_VERSION;
  65. i=EEPROM_OFFSET;
  66. EEPROM_writeAnything(i,ver2); // validate data
  67. showString(PSTR("Settings Stored\r\n"));
  68. }
  69. void EEPROM_printSettings()
  70. {
  71. // if def=true, the default values will be used
  72. #ifdef PRINT_EEPROM_SETTING
  73. showString(PSTR("Steps per unit:\r\n"));
  74. showString(PSTR(" M92 X"));
  75. Serial.print(axis_steps_per_unit[0]);
  76. showString(PSTR(" Y"));
  77. Serial.print(axis_steps_per_unit[1]);
  78. showString(PSTR(" Z"));
  79. Serial.print(axis_steps_per_unit[2]);
  80. showString(PSTR(" E"));
  81. Serial.println(axis_steps_per_unit[3]);
  82. showString(PSTR("Maximum feedrates (mm/s):\r\n"));
  83. showString(PSTR(" M203 X"));
  84. Serial.print(max_feedrate[0]);
  85. showString(PSTR(" Y"));
  86. Serial.print(max_feedrate[1]);
  87. showString(PSTR(" Z"));
  88. Serial.print(max_feedrate[2]);
  89. showString(PSTR(" E"));
  90. Serial.println(max_feedrate[3]);
  91. showString(PSTR("Maximum Acceleration (mm/s2):\r\n"));
  92. showString(PSTR(" M201 X"));
  93. Serial.print(max_acceleration_units_per_sq_second[0] );
  94. showString(PSTR(" Y"));
  95. Serial.print(max_acceleration_units_per_sq_second[1] );
  96. showString(PSTR(" Z"));
  97. Serial.print(max_acceleration_units_per_sq_second[2] );
  98. showString(PSTR(" E"));
  99. Serial.println(max_acceleration_units_per_sq_second[3]);
  100. showString(PSTR("Acceleration: S=acceleration, T=retract acceleration\r\n"));
  101. showString(PSTR(" M204 S"));
  102. Serial.print(move_acceleration );
  103. showString(PSTR(" T"));
  104. Serial.println(retract_acceleration);
  105. showString(PSTR("Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), X=maximum xY jerk (mm/s), Z=maximum Z jerk (mm/s)\r\n"));
  106. showString(PSTR(" M205 S"));
  107. Serial.print(minimumfeedrate );
  108. showString(PSTR(" T" ));
  109. Serial.print(mintravelfeedrate );
  110. // showString(PSTR(" B"));
  111. // Serial.print(minsegmenttime );
  112. showString(PSTR(" X"));
  113. Serial.print(max_xy_jerk );
  114. showString(PSTR(" Z"));
  115. Serial.println(max_z_jerk);
  116. #ifdef PIDTEMP
  117. /*
  118. showString(PSTR("PID settings:");
  119. showString(PSTR(" M301 P"));
  120. Serial.print(Kp);
  121. showString(PSTR(" I"));
  122. Serial.print(Ki);
  123. SshowString(PSTR(" D"));
  124. Serial.print(Kd);
  125. */
  126. #endif
  127. #endif
  128. }
  129. void EEPROM_RetrieveSettings(bool def, bool printout)
  130. { // if def=true, the default values will be used
  131. int i=EEPROM_OFFSET;
  132. char stored_ver[4];
  133. char ver[4]=EEPROM_VERSION;
  134. unsigned long ul_help = 0;
  135. EEPROM_readAnything(i,stored_ver); //read stored version
  136. if ((!def)&&(strncmp(ver,stored_ver,3)==0))
  137. { // version number match
  138. EEPROM_readAnything(i,axis_steps_per_unit);
  139. EEPROM_readAnything(i,max_feedrate);
  140. EEPROM_readAnything(i,max_acceleration_units_per_sq_second);
  141. EEPROM_readAnything(i,move_acceleration);
  142. EEPROM_readAnything(i,retract_acceleration);
  143. EEPROM_readAnything(i,minimumfeedrate);
  144. EEPROM_readAnything(i,mintravelfeedrate);
  145. EEPROM_readAnything(i,ul_help); //min Segmenttime --> not used yet
  146. EEPROM_readAnything(i,max_xy_jerk);
  147. EEPROM_readAnything(i,max_z_jerk);
  148. unsigned int Kp,Ki,Kd;
  149. EEPROM_readAnything(i,Kp);
  150. EEPROM_readAnything(i,Ki);
  151. EEPROM_readAnything(i,Kd);
  152. showString(PSTR("Stored settings retreived\r\n"));
  153. }
  154. else
  155. {
  156. float tmp1[]=_AXIS_STEP_PER_UNIT;
  157. float tmp2[]=_MAX_FEEDRATE;
  158. long tmp3[]=_MAX_ACCELERATION_UNITS_PER_SQ_SECOND;
  159. for (short i=0;i<4;i++)
  160. {
  161. axis_steps_per_unit[i]=tmp1[i];
  162. max_feedrate[i]=tmp2[i];
  163. max_acceleration_units_per_sq_second[i]=tmp3[i];
  164. }
  165. move_acceleration=_ACCELERATION;
  166. retract_acceleration=_RETRACT_ACCELERATION;
  167. minimumfeedrate=DEFAULT_MINIMUMFEEDRATE;
  168. mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE;
  169. max_xy_jerk=_MAX_XY_JERK;
  170. max_z_jerk=_MAX_Z_JERK;
  171. showString(PSTR("Using Default settings\r\n"));
  172. }
  173. if(printout)
  174. {
  175. EEPROM_printSettings();
  176. }
  177. }
  178. #endif