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.

data.cpp 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <Arduino.h>
  2. #include <EEPROM.h>
  3. #include "config.h"
  4. #include "config_pins.h"
  5. #include "data.h"
  6. #define EEPROM_SIZE 4096
  7. struct data_config {
  8. uint8_t data_schema_version;
  9. uint8_t preset_count;
  10. uint32_t checksum;
  11. struct data_config_options options;
  12. struct data_config_preset *presets;
  13. };
  14. static struct data_config d;
  15. static unsigned int max_presets(void) {
  16. unsigned int s = EEPROM_SIZE - sizeof(struct data_config) + sizeof(struct data_config_preset *);
  17. return s / sizeof(struct data_config_preset);
  18. }
  19. static uint32_t data_checksum(struct data_config *data) {
  20. uint32_t c = 0;
  21. uint8_t *t = (uint8_t *)data;
  22. for (unsigned int i = 0; i < sizeof(struct data_config); i++) {
  23. c ^= t[i];
  24. }
  25. for (unsigned int i = 0; i < data->preset_count; i++) {
  26. t = (uint8_t *)(&data->presets[i]);
  27. for (unsigned int j = 0; j < sizeof(struct data_config_preset); j++) {
  28. c ^= t[j];
  29. }
  30. }
  31. return c;
  32. }
  33. static bool data_eeprom_read(void) {
  34. struct data_config config;
  35. uint8_t *data = (uint8_t *)&config;
  36. // read meta-data and settings
  37. unsigned int s = sizeof(struct data_config);
  38. for (unsigned int i = 0; i < s; i++) {
  39. data[i] = EEPROM.read(i);
  40. }
  41. if (config.preset_count > 0) {
  42. config.presets = (struct data_config_preset *)malloc(config.preset_count * sizeof(struct data_config_preset));
  43. if (config.presets == NULL) {
  44. Serial.print(F("Alloc "));
  45. return false;
  46. }
  47. if (config.preset_count > max_presets()) {
  48. Serial.print(F("Preset "));
  49. return false;
  50. }
  51. // read presets
  52. for (unsigned int i = 0; i < config.preset_count; i++) {
  53. data = (uint8_t *)(&config.presets[i]);
  54. for (unsigned int j = 0; j < sizeof(struct data_config_preset); j++) {
  55. data[j] = EEPROM.read(s + j);
  56. s += sizeof(struct data_config_preset);
  57. }
  58. }
  59. } else {
  60. config.presets = NULL;
  61. }
  62. // verify checksum
  63. uint32_t checksum = data_checksum(&config);
  64. if (config.checksum == checksum) {
  65. // verify version
  66. if (config.data_schema_version == DATA_SCHEMA_VERSION) {
  67. if (d.presets != NULL) {
  68. free(d.presets);
  69. }
  70. d = config;
  71. return true;
  72. } else {
  73. Serial.print(F("Version "));
  74. return false;
  75. }
  76. } else {
  77. Serial.print(F("Checksum "));
  78. return false;
  79. }
  80. }
  81. void data_eeprom_write(void) {
  82. d.checksum = data_checksum(&d);
  83. // write meta-data and settings
  84. uint8_t *data = (uint8_t *)&d;
  85. unsigned int s = sizeof(struct data_config);
  86. for (unsigned int i = 0; i < s; i++) {
  87. EEPROM.update(i, data[i]);
  88. }
  89. // write presets
  90. for (unsigned int i = 0; i < d.preset_count; i++) {
  91. data = (uint8_t *)(&d.presets[i]);
  92. for (unsigned int j = 0; j < sizeof(struct data_config_preset); j++) {
  93. EEPROM.update(s + j, data[j]);
  94. s += sizeof(struct data_config_preset);
  95. }
  96. }
  97. }
  98. void data_init(void) {
  99. d.data_schema_version = DATA_SCHEMA_VERSION;
  100. d.preset_count = 0;
  101. d.checksum = 0;
  102. d.options.speed_x = XY_MAX_SPEED;
  103. d.options.speed_y = XY_MAX_SPEED;
  104. d.options.speed_z = Z_MAX_SPEED;
  105. d.options.speed_e = E_MAX_SPEED;
  106. d.options.accel_x = XY_MAX_ACCEL;
  107. d.options.accel_y = XY_MAX_ACCEL;
  108. d.options.accel_z = Z_MAX_ACCEL;
  109. d.options.accel_e = E_MAX_ACCEL;
  110. d.presets = NULL;
  111. Serial.print(F("EEPROM read... "));
  112. if (!data_eeprom_read()) {
  113. Serial.println(F("Error"));
  114. } else {
  115. Serial.println(F("Ok"));
  116. }
  117. }
  118. struct data_config_options *data_options(void) {
  119. return &d.options;
  120. }
  121. unsigned int data_preset_count(void) {
  122. return d.preset_count;
  123. }
  124. struct data_config_preset *data_preset(unsigned int i) {
  125. if (i < d.preset_count) {
  126. return &d.presets[i];
  127. }
  128. return NULL;
  129. }
  130. void data_preset_add(struct data_config_preset preset) {
  131. }
  132. void data_preset_remove(unsigned int i) {
  133. }