nbus_memory.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * nbus_memory.c
  3. *
  4. * Created on: Nov 4, 2023
  5. * Author: juraj
  6. */
  7. #include "nbus_memory.h"
  8. nBus_MemoryDriver *memoryImplementation;
  9. nBus_memoryInterface_t memory_itnerface = {
  10. nbus_store_param, nbus_read_param, nbus_is_param_active,
  11. nbus_read_header_data, nbus_memory_id, nbus_get_capacity};
  12. nBus_memoryHeader_t memoryHeader;
  13. nBus_memoryInterface_t *getnbusMemoryInterface(void) {
  14. return &memory_itnerface;
  15. }
  16. void nbus_memory_init(nBus_MemoryDriver *driver) {
  17. memoryImplementation = driver;
  18. for (uint32_t i = 0; i < 64; i++) {
  19. memoryHeader.params_map[i].param0 = PARAMETER_UNSET;
  20. memoryHeader.params_map[i].param1 = PARAMETER_UNSET;
  21. memoryHeader.params_map[i].param2 = PARAMETER_UNSET;
  22. memoryHeader.params_map[i].param3 = PARAMETER_UNSET;
  23. }
  24. }
  25. nBus_memoryState_t nbus_store_param(uint8_t sensor_index, uint8_t param_name,
  26. uint32_t param_value) {
  27. if (param_name >= 16) {
  28. return MEMORY_STORE_FAIL;
  29. }
  30. uint16_t addr = GET_PARAM_ADDRESS(sensor_index, param_name);
  31. if (addr > memoryImplementation->get_capacity()) {
  32. return MEMORY_STORE_FAIL;
  33. }
  34. /*
  35. * Write information abou validity of parameter for sensor 'sensor_index'. 0 -
  36. * parameter not set, 0xAA - parameter is setted
  37. */
  38. uint8_t address_offset = getParameterHeaderOffset(sensor_index, param_name);
  39. switch (param_name % 4) {
  40. case 0:
  41. memoryHeader.params_map[address_offset].param0 = PARAMETER_VALID;
  42. break;
  43. case 1:
  44. memoryHeader.params_map[address_offset].param1 = PARAMETER_VALID;
  45. break;
  46. case 2:
  47. memoryHeader.params_map[address_offset].param2 = PARAMETER_VALID;
  48. break;
  49. case 3:
  50. memoryHeader.params_map[address_offset].param3 = PARAMETER_VALID;
  51. break;
  52. }
  53. memoryImplementation->write_byte(
  54. *(uint8_t *)(&memoryHeader.params_map[address_offset]), sensor_index);
  55. return memoryImplementation->write_word(param_value, addr) == 0
  56. ? MEMORY_STORE_OK
  57. : MEMORY_STORE_FAIL;
  58. }
  59. uint32_t nbus_read_param(uint8_t sensor_index, uint8_t param_name) {
  60. if (param_name >= 16) {
  61. return ERROR_VALUE_I32;
  62. }
  63. uint16_t addr = GET_PARAM_ADDRESS(sensor_index, param_name);
  64. if (addr > memoryImplementation->get_capacity()) {
  65. return ERROR_VALUE_I32;
  66. }
  67. return memoryImplementation->read_word(addr);
  68. }
  69. void nbus_read_header_data(void) {
  70. uint8_t data;
  71. for (uint32_t adr = 0; adr < 63; adr += 4) {
  72. data = memoryImplementation->read_byte(adr);
  73. memoryHeader.params_map[adr + 0] = *(nBus_MemorySensorParam_t *)(&data);
  74. data = memoryImplementation->read_byte(adr + 1);
  75. memoryHeader.params_map[adr + 1] = *(nBus_MemorySensorParam_t *)(&data);
  76. data = memoryImplementation->read_byte(adr + 2);
  77. memoryHeader.params_map[adr + 2] = *(nBus_MemorySensorParam_t *)(&data);
  78. data = memoryImplementation->read_byte(adr + 3);
  79. memoryHeader.params_map[adr + 3] = *(nBus_MemorySensorParam_t *)(&data);
  80. }
  81. }
  82. uint8_t nbus_memory_id(uint8_t *data) {
  83. return memoryImplementation->read_id(data);
  84. }
  85. uint32_t nbus_get_capacity(void) {
  86. return memoryImplementation->get_capacity();
  87. }
  88. uint8_t nbus_is_param_active(uint8_t sensor_index, uint8_t param_name) {
  89. uint8_t address_offset = getParameterHeaderOffset(sensor_index, param_name);
  90. uint8_t is_active;
  91. switch (param_name % 4) {
  92. case 0:
  93. is_active = memoryHeader.params_map[address_offset].param0;
  94. break;
  95. case 1:
  96. is_active = memoryHeader.params_map[address_offset].param1;
  97. break;
  98. case 2:
  99. is_active = memoryHeader.params_map[address_offset].param2;
  100. break;
  101. case 3:
  102. is_active = memoryHeader.params_map[address_offset].param3;
  103. break;
  104. default:
  105. is_active = 0;
  106. }
  107. return is_active;
  108. }
  109. // TODO pouzit upravenu funkciu z drivera: DS28EC20_writeMem
  110. void memory_params_format(void) {
  111. for (uint32_t adr = 0; adr < 64; adr += 4) {
  112. memoryImplementation->write_word(0x0, adr);
  113. }
  114. }
  115. uint8_t getParameterHeaderOffset(uint8_t sensor_index, uint8_t param_name) {
  116. return (sensor_index - 1) * 4 + param_name / 4;
  117. }