No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

224 líneas
9.6 KiB

  1. #include "plc_device.h"
  2. #include "plsr_persistence.h"
  3. #include <inttypes.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. static unsigned int TestCount;
  7. #define TEST_CHECK(condition) \
  8. do \
  9. { \
  10. TestCount++; \
  11. if (!(condition)) \
  12. { \
  13. (void)fprintf(stderr, "FAIL line %d: %s\n", __LINE__, #condition); \
  14. exit(EXIT_FAILURE); \
  15. } \
  16. } while (0)
  17. static void TestAddressMap(void)
  18. {
  19. uint16_t eventAddress;
  20. TEST_CHECK(PlsrAxisAddressMap[0].hsdRuntimeBase == 0U);
  21. TEST_CHECK(PlsrAxisAddressMap[3].hsdRuntimeBase == 12U);
  22. TEST_CHECK(PlsrAxisAddressMap[0].smPulseActiveAddress == 1000U);
  23. TEST_CHECK(PlsrAxisAddressMap[3].smDirectionAddress == 1061U);
  24. TEST_CHECK(PlsrAxisAddressMap[2].sdRuntimeBase == 1040U);
  25. TEST_CHECK(PlsrAxisAddressMap[3].eventBase == 6300U);
  26. TEST_CHECK(PlcDeviceGetEventAddress(0U, 1U, &eventAddress) == PLC_DEVICE_OK);
  27. TEST_CHECK(eventAddress == 6000U);
  28. TEST_CHECK(PlcDeviceGetEventAddress(3U, 100U, &eventAddress) == PLC_DEVICE_OK);
  29. TEST_CHECK(eventAddress == 6399U);
  30. TEST_CHECK(PlcDeviceGetEventAddress(4U, 1U, &eventAddress)
  31. == PLC_DEVICE_INVALID_ARGUMENT);
  32. TEST_CHECK(PlcDeviceGetEventAddress(0U, 0U, &eventAddress)
  33. == PLC_DEVICE_INVALID_ARGUMENT);
  34. }
  35. static void TestHsdAndPersistence(void)
  36. {
  37. int32_t value32;
  38. int64_t value64;
  39. const int64_t firstPair = INT64_C(0x1234567887654321);
  40. const int64_t secondPair = -INT64_C(0x102030405060708);
  41. PlsrPersistenceTestResetStorage();
  42. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  43. TEST_CHECK(PlcDeviceGetLastHsdLoadResult() == PLSR_PERSISTENCE_DEFAULTED);
  44. TEST_CHECK(PlcDeviceIsHsdDirty() != 0U);
  45. TEST_CHECK(PlcDeviceWriteHsdConfig(460U, 11) == PLC_DEVICE_OK);
  46. TEST_CHECK(PlcDeviceWriteHsdConfig(539U, -22) == PLC_DEVICE_OK);
  47. TEST_CHECK(PlcDeviceWriteHsdConfig(0U, 1) == PLC_DEVICE_READ_ONLY);
  48. TEST_CHECK(PlcDeviceWriteHsdConfig(459U, 1) == PLC_DEVICE_INVALID_ADDRESS);
  49. TEST_CHECK(PlcDeviceReadHsd(460U, &value32) == PLC_DEVICE_OK);
  50. TEST_CHECK(value32 == 11);
  51. TEST_CHECK(PlcDeviceReadHsd(539U, &value32) == PLC_DEVICE_OK);
  52. TEST_CHECK(value32 == -22);
  53. TEST_CHECK(PlcDeviceReadHsd(540U, &value32) == PLC_DEVICE_INVALID_ADDRESS);
  54. TEST_CHECK(PlcDevicePublishHsdPair(0U, firstPair) == PLC_DEVICE_OK);
  55. TEST_CHECK(PlcDeviceReadHsdPair(0U, &value64) == PLC_DEVICE_OK);
  56. TEST_CHECK(value64 == firstPair);
  57. TEST_CHECK(PlcDeviceReadHsdPair(1U, &value64) == PLC_DEVICE_INVALID_ADDRESS);
  58. TEST_CHECK(PlcDeviceCheckpointHsd() == PLC_DEVICE_OK);
  59. TEST_CHECK(PlcDeviceIsHsdDirty() == 0U);
  60. TEST_CHECK(PlcDeviceWriteHsdConfig(460U, 22) == PLC_DEVICE_OK);
  61. TEST_CHECK(PlcDevicePublishHsdPair(0U, secondPair) == PLC_DEVICE_OK);
  62. TEST_CHECK(PlcDeviceCheckpointHsd() == PLC_DEVICE_OK);
  63. PlsrPersistenceTestCorruptNewestHsd();
  64. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  65. TEST_CHECK(PlcDeviceGetLastHsdLoadResult() == PLSR_PERSISTENCE_OK);
  66. TEST_CHECK(PlcDeviceReadHsd(460U, &value32) == PLC_DEVICE_OK);
  67. TEST_CHECK(value32 == 11);
  68. TEST_CHECK(PlcDeviceReadHsdPair(0U, &value64) == PLC_DEVICE_OK);
  69. TEST_CHECK(value64 == firstPair);
  70. }
  71. static void TestSfd(void)
  72. {
  73. int32_t value;
  74. PlsrPersistenceTestResetStorage();
  75. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  76. TEST_CHECK(PlcDeviceGetLastSfdLoadResult()
  77. == PLSR_PERSISTENCE_DEFAULTED);
  78. TEST_CHECK(PlcDeviceIsSfdDirty() != 0U);
  79. TEST_CHECK(PlcDeviceReadSfd(907U, &value) == PLC_DEVICE_OK);
  80. TEST_CHECK(value == 10);
  81. TEST_CHECK(PlcDeviceReadSfd(927U, &value) == PLC_DEVICE_OK);
  82. TEST_CHECK(value == 20);
  83. TEST_CHECK(PlcDeviceReadSfd(943U, &value) == PLC_DEVICE_OK);
  84. TEST_CHECK(value == 0x0201);
  85. TEST_CHECK(PlcDeviceReadSfd(956U, &value) == PLC_DEVICE_OK);
  86. TEST_CHECK(value == 0x86A0);
  87. TEST_CHECK(PlcDeviceReadSfd(957U, &value) == PLC_DEVICE_OK);
  88. TEST_CHECK(value == 1);
  89. TEST_CHECK(PlcDeviceReadSfd(1297U, &value) == PLC_DEVICE_OK);
  90. TEST_CHECK(value == 10);
  91. TEST_CHECK(PlsrPersistenceLoadSfd(NULL)
  92. == PLSR_PERSISTENCE_INVALID_ARGUMENT);
  93. TEST_CHECK(PlsrPersistenceSaveSfd(NULL)
  94. == PLSR_PERSISTENCE_INVALID_ARGUMENT);
  95. TEST_CHECK(PlcDeviceWriteSfd(900U, 123) == PLC_DEVICE_OK);
  96. TEST_CHECK(PlcDeviceWriteSfd(1419U, -456) == PLC_DEVICE_OK);
  97. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  98. TEST_CHECK(value == 123);
  99. TEST_CHECK(PlcDeviceReadSfd(1419U, &value) == PLC_DEVICE_OK);
  100. TEST_CHECK(value == -456);
  101. TEST_CHECK(PlcDeviceReadSfd(899U, &value) == PLC_DEVICE_INVALID_ADDRESS);
  102. TEST_CHECK(PlcDeviceReadSfd(1420U, &value) == PLC_DEVICE_INVALID_ADDRESS);
  103. TEST_CHECK(PlcDeviceIsSfdDirty() != 0U);
  104. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_OK);
  105. TEST_CHECK(PlcDeviceIsSfdDirty() == 0U);
  106. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  107. TEST_CHECK(PlcDeviceGetLastSfdLoadResult() == PLSR_PERSISTENCE_OK);
  108. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  109. TEST_CHECK(value == 123);
  110. TEST_CHECK(PlcDeviceReadSfd(1419U, &value) == PLC_DEVICE_OK);
  111. TEST_CHECK(value == -456);
  112. TEST_CHECK(PlcDeviceWriteSfd(900U, 789) == PLC_DEVICE_OK);
  113. TEST_CHECK(PlcDeviceWriteSfd(1419U, -987) == PLC_DEVICE_OK);
  114. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_OK);
  115. PlsrPersistenceTestCorruptNewestSfd();
  116. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  117. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  118. TEST_CHECK(value == 123);
  119. TEST_CHECK(PlcDeviceReadSfd(1419U, &value) == PLC_DEVICE_OK);
  120. TEST_CHECK(value == -456);
  121. TEST_CHECK(PlcDeviceWriteSfd(900U, 1001) == PLC_DEVICE_OK);
  122. PlsrPersistenceTestSetSfdFault(PLSR_TEST_SFD_FAULT_ERASE);
  123. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_PERSISTENCE_ERROR);
  124. TEST_CHECK(PlcDeviceIsSfdDirty() != 0U);
  125. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  126. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  127. TEST_CHECK(value == 123);
  128. TEST_CHECK(PlcDeviceWriteSfd(900U, 1002) == PLC_DEVICE_OK);
  129. PlsrPersistenceTestSetSfdFault(PLSR_TEST_SFD_FAULT_PROGRAM);
  130. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_PERSISTENCE_ERROR);
  131. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  132. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  133. TEST_CHECK(value == 123);
  134. TEST_CHECK(PlcDeviceWriteSfd(900U, 1003) == PLC_DEVICE_OK);
  135. PlsrPersistenceTestSetSfdFault(PLSR_TEST_SFD_FAULT_VERIFY);
  136. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_PERSISTENCE_ERROR);
  137. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  138. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  139. TEST_CHECK(value == 123);
  140. TEST_CHECK(PlcDeviceWriteSfd(900U, 1004) == PLC_DEVICE_OK);
  141. PlsrPersistenceTestSetSfdFault(PLSR_TEST_SFD_FAULT_BEFORE_COMMIT);
  142. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_PERSISTENCE_ERROR);
  143. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  144. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  145. TEST_CHECK(value == 123);
  146. TEST_CHECK(PlcDevicePublishSm(0U, 1U, 0U) == PLC_DEVICE_OK);
  147. TEST_CHECK(PlcDeviceWriteSfd(900U, 2000) == PLC_DEVICE_OK);
  148. TEST_CHECK(PlcDeviceSaveSfd() == PLC_DEVICE_BUSY);
  149. TEST_CHECK(PlcDeviceLoadSfd() == PLC_DEVICE_BUSY);
  150. TEST_CHECK(PlcDeviceResetSfdDefaults() == PLC_DEVICE_BUSY);
  151. TEST_CHECK(PlcDevicePublishSm(0U, 0U, 0U) == PLC_DEVICE_OK);
  152. TEST_CHECK(PlcDeviceResetSfdDefaults() == PLC_DEVICE_OK);
  153. TEST_CHECK(PlcDeviceIsSfdDirty() != 0U);
  154. TEST_CHECK(PlcDeviceReadSfd(900U, &value) == PLC_DEVICE_OK);
  155. TEST_CHECK(value == 0);
  156. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  157. TEST_CHECK(PlcDeviceGetLastSfdLoadResult()
  158. == PLSR_PERSISTENCE_DEFAULTED);
  159. TEST_CHECK(PlcDeviceReadSfd(1419U, &value) == PLC_DEVICE_OK);
  160. TEST_CHECK(value == 0);
  161. TEST_CHECK(PlcDeviceReadSfd(1333U, &value) == PLC_DEVICE_OK);
  162. TEST_CHECK(value == 0x0201);
  163. }
  164. static void TestSmAndSd(void)
  165. {
  166. uint8_t state;
  167. int32_t value;
  168. TEST_CHECK(PlcDevicePublishSm(2U, 1U, 0U) == PLC_DEVICE_OK);
  169. TEST_CHECK(PlcDeviceReadSm(1040U, &state) == PLC_DEVICE_OK);
  170. TEST_CHECK(state == 1U);
  171. TEST_CHECK(PlcDeviceReadSm(1041U, &state) == PLC_DEVICE_OK);
  172. TEST_CHECK(state == 0U);
  173. TEST_CHECK(PlcDeviceWriteSm(1040U, 0U) == PLC_DEVICE_READ_ONLY);
  174. TEST_CHECK(PlcDeviceReadSm(1042U, &state) == PLC_DEVICE_INVALID_ADDRESS);
  175. TEST_CHECK(PlcDevicePublishSd(3U, 11U, -12345) == PLC_DEVICE_OK);
  176. TEST_CHECK(PlcDeviceReadSd(1071U, &value) == PLC_DEVICE_OK);
  177. TEST_CHECK(value == -12345);
  178. TEST_CHECK(PlcDeviceWriteSd(1071U, 0) == PLC_DEVICE_READ_ONLY);
  179. TEST_CHECK(PlcDeviceReadSd(1012U, &value) == PLC_DEVICE_INVALID_ADDRESS);
  180. TEST_CHECK(PlcDevicePublishSd(4U, 0U, 0) == PLC_DEVICE_INVALID_ARGUMENT);
  181. TEST_CHECK(PlcDeviceInit() == PLC_DEVICE_OK);
  182. TEST_CHECK(PlcDeviceReadSm(1040U, &state) == PLC_DEVICE_OK);
  183. TEST_CHECK(state == 0U);
  184. TEST_CHECK(PlcDeviceReadSd(1071U, &value) == PLC_DEVICE_OK);
  185. TEST_CHECK(value == 0);
  186. }
  187. int main(void)
  188. {
  189. TestAddressMap();
  190. TestHsdAndPersistence();
  191. TestSfd();
  192. TestSmAndSd();
  193. (void)printf("PASS: %u checks\n", TestCount);
  194. return EXIT_SUCCESS;
  195. }