Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

3612 строки
126 KiB

  1. #include "plsr.h"
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #define PLSR_WAIT_TIME (0U)
  5. #define PLSR_WAIT_SIGNAL (1U)
  6. #define PLSR_ACT_TIME (2U)
  7. #define PLSR_EXT_SIGNAL (3U)
  8. #define PLSR_EXT_OR_COMPLETE (4U)
  9. #define PLSR_SEND_COMPLETE (0U)
  10. #define PLSR_SEND_SUBSEQUENT (1U)
  11. #define PLSR_POSITION_RELATIVE (0U)
  12. #define PLSR_POSITION_ABSOLUTE (1U)
  13. #define PLSR_COMMAND_START (0x0001U)
  14. #define PLSR_COMMAND_STOP (0x0002U)
  15. #define PLSR_COMMAND_CLEAR (0x0004U)
  16. #define PLSR_ERROR_TIMER (4U)
  17. #define PLSR_ERROR_COUNT (5U)
  18. #define PLSR_OUTPUT_MODE_PULSE_DIR (0U)
  19. #define PLSR_OUTPUT_MODE_AB (1U)
  20. #define PLSR_DIAG_FLAGS_ADDRESS (0x2100U)
  21. #define PLSR_DIAG_REASON_ADDRESS (0x2101U)
  22. #define PLSR_DIAG_SEGMENT_ADDRESS (0x2102U)
  23. #define PLSR_DIAG_MODE_DIRECTION_ADDRESS (0x2103U)
  24. #define PLSR_DIAG_EXPECTED_COUNT_ADDRESS (0x2104U)
  25. #define PLSR_DIAG_OBSERVED_COUNT_ADDRESS (0x2106U)
  26. #define PLSR_DIAG_COUNT_ERROR_ADDRESS (0x2108U)
  27. #define PLSR_DIAG_REQUESTED_FREQUENCY_ADDRESS (0x210AU)
  28. #define PLSR_DIAG_EXPECTED_TIMER_ADDRESS (0x210CU)
  29. #define PLSR_DIAG_ACTIVE_TIMER_ADDRESS (0x210EU)
  30. #define PLSR_DIAG_REQUEST_ERROR_ADDRESS (0x2110U)
  31. #define PLSR_DIAG_SAMPLE_COUNT_ADDRESS (0x2112U)
  32. #define PLSR_DIAG_MISMATCH_COUNT_ADDRESS (0x2114U)
  33. #define PLSR_DIAG_MAX_ERROR_ADDRESS (0x2116U)
  34. #define PLSR_DIAG_FIRST_MISMATCH_ADDRESS (0x2118U)
  35. #define PLSR_DIAG_MONITORING_ACTIVE (0x0001U)
  36. #define PLSR_DIAG_COUNT_CHECKED (0x0002U)
  37. #define PLSR_DIAG_COUNT_PASS (0x0004U)
  38. #define PLSR_DIAG_FREQUENCY_CHECKED (0x0008U)
  39. #define PLSR_DIAG_FREQUENCY_PASS (0x0010U)
  40. #define PLSR_DIAG_CURVE_CHECKED (0x0020U)
  41. #define PLSR_DIAG_CURVE_PASS (0x0040U)
  42. #define PLSR_DIAG_FAULT_LATCHED (0x0080U)
  43. #define PLSR_DIAG_REASON_NONE (0U)
  44. #define PLSR_DIAG_REASON_COUNT (1U)
  45. #define PLSR_DIAG_REASON_FREQUENCY (2U)
  46. #define PLSR_DIAG_REASON_CURVE (3U)
  47. void PlsrTestSetDiagnosticCurveCounts(uint32_t sampleCount,
  48. uint32_t mismatchCount);
  49. uint8_t PlsrTestFlashNeedsStartupRecovery(
  50. uint8_t haveValidRecord,
  51. uint8_t sectorAHasProgrammedSlot,
  52. uint32_t sectorAFirstErasedAddress,
  53. uint8_t sectorBHasProgrammedSlot,
  54. uint32_t sectorBFirstErasedAddress);
  55. static const char *CurrentTest;
  56. static unsigned int AssertionCount;
  57. static unsigned int FailureCount;
  58. static void ExpectUnsigned(unsigned long expected,
  59. unsigned long actual,
  60. const char *expression,
  61. int line)
  62. {
  63. AssertionCount++;
  64. if (expected != actual)
  65. {
  66. FailureCount++;
  67. (void)printf("FAIL %s:%d: %s expected %lu, got %lu\n",
  68. CurrentTest, line, expression, expected, actual);
  69. }
  70. }
  71. static void ExpectSigned(long expected,
  72. long actual,
  73. const char *expression,
  74. int line)
  75. {
  76. AssertionCount++;
  77. if (expected != actual)
  78. {
  79. FailureCount++;
  80. (void)printf("FAIL %s:%d: %s expected %ld, got %ld\n",
  81. CurrentTest, line, expression, expected, actual);
  82. }
  83. }
  84. static void ExpectTrue(int condition, const char *expression, int line)
  85. {
  86. AssertionCount++;
  87. if (!condition)
  88. {
  89. FailureCount++;
  90. (void)printf("FAIL %s:%d: expected true: %s\n",
  91. CurrentTest, line, expression);
  92. }
  93. }
  94. #define EXPECT_U(expected, actual) \
  95. ExpectUnsigned((unsigned long)(expected), \
  96. (unsigned long)(actual), #actual, __LINE__)
  97. #define EXPECT_I(expected, actual) \
  98. ExpectSigned((long)(expected), (long)(actual), #actual, __LINE__)
  99. #define EXPECT_TRUE(expression) ExpectTrue((expression), #expression, __LINE__)
  100. static uint16_t LowWord(uint32_t value)
  101. {
  102. return (uint16_t)(value & 0xFFFFUL);
  103. }
  104. static uint16_t HighWord(uint32_t value)
  105. {
  106. return (uint16_t)(value >> 16U);
  107. }
  108. static void TestU64ByU32Division(void)
  109. {
  110. static const uint64_t dividends[] =
  111. {
  112. 0ULL, 1ULL, 0xFFFFFFFFULL, 0x100000000ULL,
  113. 0x100000001ULL, 0xFFFFFFFFFFFFFFFFULL,
  114. 0x8000000000000000ULL, 0x7FFFFFFFFFFFFFFFULL
  115. };
  116. static const uint32_t divisors[] =
  117. {
  118. 1UL, 2UL, 3UL, 0xFFFFUL, 0x10000UL, 100000UL,
  119. 0x7FFFFFFFUL, 0x80000000UL, 0xFFFFFFFFUL
  120. };
  121. uint32_t state = 0xA5C39E17UL;
  122. uint64_t dividend;
  123. uint64_t quotient;
  124. uint32_t divisor;
  125. uint32_t remainder;
  126. uint32_t dividendIndex;
  127. uint32_t divisorIndex;
  128. uint32_t iteration;
  129. for (dividendIndex = 0U;
  130. dividendIndex < (uint32_t)(sizeof(dividends) / sizeof(dividends[0]));
  131. dividendIndex++)
  132. {
  133. for (divisorIndex = 0U;
  134. divisorIndex < (uint32_t)(sizeof(divisors) / sizeof(divisors[0]));
  135. divisorIndex++)
  136. {
  137. dividend = dividends[dividendIndex];
  138. divisor = divisors[divisorIndex];
  139. quotient = PlsrTestDivideU64ByU32(dividend, divisor, &remainder);
  140. EXPECT_TRUE(quotient == dividend / divisor);
  141. EXPECT_U((uint32_t)(dividend % divisor), remainder);
  142. }
  143. }
  144. for (iteration = 0U; iteration < 250000UL; iteration++)
  145. {
  146. state = state * 1664525UL + 1013904223UL;
  147. dividend = (uint64_t)state << 32U;
  148. state = state * 1664525UL + 1013904223UL;
  149. dividend |= state;
  150. state = state * 1664525UL + 1013904223UL;
  151. divisor = state | 1UL;
  152. quotient = PlsrTestDivideU64ByU32(dividend, divisor, &remainder);
  153. EXPECT_TRUE(quotient == dividend / divisor);
  154. EXPECT_U((uint32_t)(dividend % divisor), remainder);
  155. }
  156. }
  157. static uint64_t PulsePeriodNs(uint32_t frequencyHz)
  158. {
  159. return (1000000000ULL + frequencyHz / 2UL) / frequencyHz;
  160. }
  161. static uint64_t UnsignedDifference64(uint64_t first, uint64_t second)
  162. {
  163. return (first > second) ? (first - second) : (second - first);
  164. }
  165. static uint32_t IntegerSquareRoot64(uint64_t value)
  166. {
  167. uint64_t bit = (uint64_t)1U << 62U;
  168. uint64_t root = 0ULL;
  169. while (bit > value)
  170. {
  171. bit >>= 2U;
  172. }
  173. while (bit != 0ULL)
  174. {
  175. if (value >= root + bit)
  176. {
  177. value -= root + bit;
  178. root = (root >> 1U) + bit;
  179. }
  180. else
  181. {
  182. root >>= 1U;
  183. }
  184. bit >>= 2U;
  185. }
  186. return (uint32_t)root;
  187. }
  188. static PLSR_MB_RESULT WriteWord(uint16_t address, uint16_t value)
  189. {
  190. return PlsrModbusWriteHolding(address, 1U, &value);
  191. }
  192. static PLSR_MB_RESULT WriteU32(uint16_t address, uint32_t value)
  193. {
  194. uint16_t words[2];
  195. words[0] = LowWord(value);
  196. words[1] = HighWord(value);
  197. return PlsrModbusWriteHolding(address, 2U, words);
  198. }
  199. static PLSR_MB_RESULT WriteI32(uint16_t address, int32_t value)
  200. {
  201. return WriteU32(address, (uint32_t)value);
  202. }
  203. static uint16_t ReadWord(uint16_t address)
  204. {
  205. uint16_t value = 0xDEADU;
  206. PLSR_MB_RESULT result = PlsrModbusReadHolding(address, 1U, &value);
  207. EXPECT_U(PLSR_MB_OK, result);
  208. return value;
  209. }
  210. static uint32_t ReadU32(uint16_t address)
  211. {
  212. uint16_t words[2] = {0xDEADU, 0xBEEFU};
  213. PLSR_MB_RESULT result = PlsrModbusReadHolding(address, 2U, words);
  214. EXPECT_U(PLSR_MB_OK, result);
  215. return (uint32_t)words[0] | ((uint32_t)words[1] << 16U);
  216. }
  217. static int32_t ReadI32(uint16_t address)
  218. {
  219. return (int32_t)ReadU32(address);
  220. }
  221. static int32_t ReadPosition(void)
  222. {
  223. return (int32_t)ReadU32(PLSR_STATUS_FIRST_ADDRESS);
  224. }
  225. static uint32_t ReadFrequency(void)
  226. {
  227. return ReadU32((uint16_t)(PLSR_STATUS_FIRST_ADDRESS + 2U));
  228. }
  229. static uint16_t ReadStatus(void)
  230. {
  231. return ReadWord((uint16_t)(PLSR_STATUS_FIRST_ADDRESS + 4U));
  232. }
  233. static uint16_t ReadCurrentSegment(void)
  234. {
  235. return ReadWord((uint16_t)(PLSR_STATUS_FIRST_ADDRESS + 5U));
  236. }
  237. static uint16_t ReadError(void)
  238. {
  239. return ReadWord((uint16_t)(PLSR_STATUS_FIRST_ADDRESS + 6U));
  240. }
  241. static PLSR_MB_RESULT QueueCommand(uint16_t command)
  242. {
  243. return PlsrModbusWriteHolding(PLSR_CONTROL_ADDRESS, 1U, &command);
  244. }
  245. static PLSR_MB_RESULT SendCommand(uint16_t command)
  246. {
  247. PLSR_MB_RESULT result = QueueCommand(command);
  248. if (result == PLSR_MB_OK)
  249. {
  250. PlsrPoll1ms();
  251. }
  252. return result;
  253. }
  254. static void ResetCore(void)
  255. {
  256. PlsrTestClearPersistentStorage();
  257. EXPECT_U(1U, PlsrInit());
  258. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  259. }
  260. static void ConfigureCommon(uint16_t curveMode,
  261. uint16_t positionMode,
  262. uint16_t segmentCount,
  263. uint16_t sendMode,
  264. uint32_t defaultSpeedHz,
  265. uint32_t startSpeedHz,
  266. uint32_t stopSpeedHz,
  267. uint16_t accelerationTimeMs,
  268. uint16_t decelerationTimeMs)
  269. {
  270. uint16_t words[0x14U];
  271. PLSR_MB_RESULT result;
  272. result = PlsrModbusReadHolding(0x1000U, 0x14U, words);
  273. EXPECT_U(PLSR_MB_OK, result);
  274. words[0x04U] = sendMode;
  275. words[0x05U] = 0U;
  276. words[0x07U] = curveMode;
  277. words[0x08U] = positionMode;
  278. words[0x09U] = segmentCount;
  279. words[0x0AU] = 1U;
  280. words[0x0BU] = LowWord(defaultSpeedHz);
  281. words[0x0CU] = HighWord(defaultSpeedHz);
  282. words[0x0DU] = LowWord(startSpeedHz);
  283. words[0x0EU] = HighWord(startSpeedHz);
  284. words[0x0FU] = 0U;
  285. words[0x10U] = LowWord(stopSpeedHz);
  286. words[0x11U] = HighWord(stopSpeedHz);
  287. words[0x12U] = accelerationTimeMs;
  288. words[0x13U] = decelerationTimeMs;
  289. result = PlsrModbusWriteHolding(0x1000U, 0x14U, words);
  290. EXPECT_U(PLSR_MB_OK, result);
  291. }
  292. static PLSR_MB_RESULT SetSegment(uint8_t segmentNumber,
  293. uint32_t frequencyHz,
  294. int32_t pulses,
  295. uint16_t waitType,
  296. uint16_t waitTimeMs,
  297. uint16_t actTimeMs,
  298. uint16_t jumpSegment)
  299. {
  300. uint16_t words[8];
  301. uint16_t address = (uint16_t)(0x1100U
  302. + ((uint16_t)segmentNumber - 1U) * 0x10U);
  303. words[0] = LowWord(frequencyHz);
  304. words[1] = HighWord(frequencyHz);
  305. words[2] = LowWord((uint32_t)pulses);
  306. words[3] = HighWord((uint32_t)pulses);
  307. words[4] = waitType;
  308. words[5] = waitTimeMs;
  309. words[6] = actTimeMs;
  310. words[7] = jumpSegment;
  311. return PlsrModbusWriteHolding(address, 8U, words);
  312. }
  313. static void StopAndSettle(void)
  314. {
  315. unsigned int pulse;
  316. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  317. for (pulse = 0U; (pulse < 4U) && (PlsrTestPulseIsActive() != 0U);
  318. pulse++)
  319. {
  320. PlsrTestEmitPulses(1UL);
  321. }
  322. PlsrPoll1ms();
  323. EXPECT_U(0U, PlsrTestPulseIsActive());
  324. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  325. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  326. }
  327. static void TestProtocolBoundaries(void)
  328. {
  329. uint16_t value = 0U;
  330. uint16_t values[2];
  331. uint16_t before;
  332. ResetCore();
  333. EXPECT_U(PLSR_MB_NOT_HANDLED,
  334. PlsrModbusReadHolding(0x0FFEU, 1U, &value));
  335. EXPECT_U(PLSR_MB_NOT_HANDLED,
  336. PlsrModbusReadHolding(0x1198U, 1U, &value));
  337. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  338. PlsrModbusReadHolding(0x11FFU, 2U, values));
  339. EXPECT_U(PLSR_MB_NOT_HANDLED,
  340. PlsrModbusReadHolding(0x1201U, 1U, &value));
  341. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  342. PlsrModbusReadHolding(0x0FFFU, 2U, values));
  343. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  344. PlsrModbusReadHolding(0x1197U, 2U, values));
  345. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  346. PlsrModbusReadHolding(0x2006U, 2U, values));
  347. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  348. PlsrModbusReadHolding(0x2119U, 2U, values));
  349. EXPECT_U(PLSR_MB_NOT_HANDLED,
  350. PlsrModbusReadHolding(0x211AU, 1U, &value));
  351. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  352. PlsrModbusReadHolding(0xFFFFU, 2U, values));
  353. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  354. PlsrModbusReadHolding(0x1000U, 0U, &value));
  355. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  356. PlsrModbusReadHolding(0x1000U, 1U, NULL));
  357. EXPECT_U(0U, ReadWord(0x100FU));
  358. EXPECT_U(PLSR_MB_OK, WriteWord(0x100FU, 0U));
  359. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, WriteWord(0x100FU, 1U));
  360. EXPECT_U(0U, ReadWord(0x1108U));
  361. EXPECT_U(PLSR_MB_OK, WriteWord(0x1108U, 0U));
  362. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, WriteWord(0x1108U, 1U));
  363. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS, WriteWord(0x100BU, 2000U));
  364. EXPECT_U(PLSR_MB_OK, WriteU32(0x100BU, 2000UL));
  365. EXPECT_U(2000UL, ReadU32(0x100BU));
  366. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, WriteU32(0x100BU, 100001UL));
  367. EXPECT_U(2000UL, ReadU32(0x100BU));
  368. before = ReadWord(0x1013U);
  369. values[0] = 77U;
  370. values[1] = 1U;
  371. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  372. PlsrModbusWriteHolding(0x1013U, 2U, values));
  373. EXPECT_U(before, ReadWord(0x1013U));
  374. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  375. PlsrModbusWriteHolding(0x2000U, 1U, &value));
  376. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  377. PlsrModbusWriteHolding(PLSR_DIAGNOSTIC_FIRST_ADDRESS,
  378. 1U, &value));
  379. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  380. PlsrModbusWriteHolding(0x3000U, 2U, values));
  381. value = 3U;
  382. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  383. PlsrModbusWriteHolding(0x3000U, 1U, &value));
  384. value = 0U;
  385. EXPECT_U(PLSR_MB_OK,
  386. PlsrModbusWriteHolding(0x3000U, 1U, &value));
  387. EXPECT_U(0U, ReadWord(0x3000U));
  388. EXPECT_U(PLSR_MB_OK, WriteWord(0x1197U, 0U));
  389. EXPECT_U(0U, ReadWord(0x1197U));
  390. EXPECT_U(PLSR_MB_NOT_HANDLED, WriteWord(0x1198U, 0U));
  391. EXPECT_U(PLSR_OUTPUT_MODE_PULSE_DIR,
  392. ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  393. EXPECT_U(PLSR_MB_OK,
  394. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  395. EXPECT_U(PLSR_OUTPUT_MODE_AB, ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  396. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  397. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, 2U));
  398. EXPECT_U(PLSR_OUTPUT_MODE_AB, ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  399. EXPECT_U(0U, ReadWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS));
  400. EXPECT_U(PLSR_MB_OK, WriteWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS, 0U));
  401. EXPECT_U(PLSR_MB_OK, WriteWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS, 1U));
  402. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  403. WriteWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS, 2U));
  404. EXPECT_U(PLSR_MB_ILLEGAL_ADDRESS,
  405. PlsrModbusWriteHolding(PLSR_DIAGNOSTIC_CONTROL_ADDRESS,
  406. 2U, values));
  407. EXPECT_U(0U, ReadWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS));
  408. }
  409. static void ConfigureAbMotion(uint16_t pulseOutput,
  410. int32_t pulses,
  411. uint32_t frequencyHz,
  412. uint32_t startStopFrequencyHz,
  413. uint16_t accelerationTimeMs,
  414. uint16_t decelerationTimeMs)
  415. {
  416. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  417. frequencyHz, startStopFrequencyHz,
  418. startStopFrequencyHz, accelerationTimeMs,
  419. decelerationTimeMs);
  420. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, pulseOutput));
  421. EXPECT_U(PLSR_MB_OK,
  422. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  423. EXPECT_U(PLSR_MB_OK,
  424. SetSegment(1U, frequencyHz, pulses, PLSR_EXT_OR_COMPLETE,
  425. 0U, 0U, 0U));
  426. }
  427. static void ExpectDiagnosticCleared(void)
  428. {
  429. uint16_t words[0x1AU];
  430. uint16_t index;
  431. EXPECT_U(PLSR_MB_OK,
  432. PlsrModbusReadHolding(PLSR_DIAGNOSTIC_FIRST_ADDRESS,
  433. 0x1AU, words));
  434. for (index = 0U; index < 0x18U; index++)
  435. {
  436. EXPECT_U(0U, words[index]);
  437. }
  438. EXPECT_U(0xFFFFU, words[0x18U]);
  439. EXPECT_U(0xFFFFU, words[0x19U]);
  440. }
  441. static void ClearDiagnostic(void)
  442. {
  443. EXPECT_U(PLSR_MB_OK,
  444. WriteWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS, 1U));
  445. ExpectDiagnosticCleared();
  446. }
  447. static void ExpectDiagnosticInterrupted(uint32_t expectedCycles,
  448. uint32_t observedCycles)
  449. {
  450. uint16_t flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  451. EXPECT_U(0U, flags & PLSR_DIAG_MONITORING_ACTIVE);
  452. EXPECT_U(0U, flags & (PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS));
  453. EXPECT_U(0U, flags & PLSR_DIAG_FAULT_LATCHED);
  454. EXPECT_U(PLSR_DIAG_REASON_NONE, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  455. EXPECT_U(expectedCycles, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  456. EXPECT_U(observedCycles, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  457. EXPECT_I(0L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  458. }
  459. static void TestAbOutputPairsAndPhaseSequence(void)
  460. {
  461. static const uint8_t positivePhases[4] = {2U, 3U, 1U, 0U};
  462. static const uint8_t negativePhases[4] = {1U, 3U, 2U, 0U};
  463. uint32_t transitionsBefore;
  464. uint16_t quarter;
  465. ResetCore();
  466. ConfigureAbMotion(0U, 2L, 1000UL, 1000UL, 0U, 0U);
  467. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 3U));
  468. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 250U));
  469. EXPECT_U(PLSR_MB_OK, WriteWord(0x1006U, 1U));
  470. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  471. EXPECT_U(1U, PlsrTestPulseIsActive());
  472. EXPECT_U(0U, PlsrTestAbPhase());
  473. EXPECT_U(0U, PlsrTestAbTransitionCount());
  474. EXPECT_U(1U, ReadCurrentSegment());
  475. EXPECT_U(0x0101U, ReadWord(PLSR_DIAG_MODE_DIRECTION_ADDRESS));
  476. for (quarter = 0U; quarter < 4U; quarter++)
  477. {
  478. PlsrTestEmitAbQuarters(1UL);
  479. EXPECT_U(positivePhases[quarter], PlsrTestAbPhase());
  480. EXPECT_U((uint32_t)quarter + 1UL,
  481. PlsrTestAbTransitionCount());
  482. EXPECT_I((quarter == 3U) ? 1L : 0L, ReadPosition());
  483. }
  484. EXPECT_U(1U, PlsrTestPulseIsActive());
  485. transitionsBefore = PlsrTestAbTransitionCount();
  486. PlsrTestEmitPulses(1UL);
  487. EXPECT_U(transitionsBefore + 4UL, PlsrTestAbTransitionCount());
  488. EXPECT_U(0U, PlsrTestAbPhase());
  489. EXPECT_U(0U, PlsrTestPulseIsActive());
  490. PlsrPoll1ms();
  491. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  492. EXPECT_I(2L, ReadPosition());
  493. ResetCore();
  494. ConfigureAbMotion(2U, -1L, 2000UL, 2000UL, 0U, 0U);
  495. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 0U));
  496. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 250U));
  497. EXPECT_U(PLSR_MB_OK, WriteWord(0x1006U, 1U));
  498. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  499. EXPECT_U(1U, PlsrTestPulseIsActive());
  500. EXPECT_U(0U, PlsrTestAbPhase());
  501. EXPECT_U(0x0001U, ReadWord(PLSR_DIAG_MODE_DIRECTION_ADDRESS));
  502. for (quarter = 0U; quarter < 4U; quarter++)
  503. {
  504. PlsrTestEmitAbQuarters(1UL);
  505. EXPECT_U(negativePhases[quarter], PlsrTestAbPhase());
  506. EXPECT_I((quarter == 3U) ? -1L : 0L, ReadPosition());
  507. }
  508. EXPECT_U(0U, PlsrTestPulseIsActive());
  509. EXPECT_U(0U, PlsrTestAbPhase());
  510. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  511. PlsrPoll1ms();
  512. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  513. EXPECT_I(-1L, ReadPosition());
  514. }
  515. static void TestAbSinglePulseMaximumFrequencyMatrix(void)
  516. {
  517. static const uint16_t outputs[2] = {0U, 2U};
  518. static const int32_t directions[2] = {1L, -1L};
  519. uint32_t transitionsBefore;
  520. uint16_t outputIndex;
  521. uint16_t directionIndex;
  522. for (outputIndex = 0U; outputIndex < 2U; outputIndex++)
  523. {
  524. for (directionIndex = 0U; directionIndex < 2U; directionIndex++)
  525. {
  526. ResetCore();
  527. ConfigureAbMotion(outputs[outputIndex], directions[directionIndex],
  528. 100000UL, 100000UL, 0U, 0U);
  529. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  530. EXPECT_U(1U, PlsrTestPulseIsActive());
  531. EXPECT_U(0U, PlsrTestAbPhase());
  532. EXPECT_U(0UL, PlsrTestAbTransitionCount());
  533. PlsrTestEmitAbQuarters(4UL);
  534. EXPECT_U(0U, PlsrTestAbPhase());
  535. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  536. EXPECT_U(0U, PlsrTestPulseIsActive());
  537. EXPECT_I(directions[directionIndex], ReadPosition());
  538. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  539. transitionsBefore = PlsrTestAbTransitionCount();
  540. PlsrTestEmitAbQuarters(8UL);
  541. EXPECT_U(transitionsBefore, PlsrTestAbTransitionCount());
  542. EXPECT_I(directions[directionIndex], ReadPosition());
  543. PlsrPoll1ms();
  544. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  545. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  546. EXPECT_U(1UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  547. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  548. EXPECT_U(0U, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  549. }
  550. }
  551. }
  552. static void TestAbFastGateCleanupIsDeferredToPoll(void)
  553. {
  554. ResetCore();
  555. ConfigureAbMotion(0U, 1L, 100000UL, 100000UL, 0U, 0U);
  556. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  557. EXPECT_U(0UL, PlsrTestAbCleanupCount());
  558. PlsrTestEmitAbQuarters(4UL);
  559. EXPECT_U(0U, PlsrTestPulseIsActive());
  560. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  561. EXPECT_U(0UL, PlsrTestAbCleanupCount());
  562. EXPECT_I(1L, ReadPosition());
  563. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  564. PlsrPoll1ms();
  565. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  566. EXPECT_U(1UL, PlsrTestAbCleanupCount());
  567. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  568. }
  569. static void TestAbFinalArmJobTailChainsOnce(void)
  570. {
  571. static const uint16_t outputs[2] = {0U, 2U};
  572. static const int32_t displacements[2] = {2L, -2L};
  573. uint16_t index;
  574. for (index = 0U; index < 2U; index++)
  575. {
  576. ResetCore();
  577. ConfigureAbMotion(outputs[index], displacements[index],
  578. 100000UL, 100000UL, 0U, 0U);
  579. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  580. PlsrTestEmitAbQuarters(4UL);
  581. EXPECT_U(1U, PlsrTestPulseIsActive());
  582. EXPECT_U(0U, PlsrTestAbPhase());
  583. EXPECT_U(0UL, PlsrTestAbFastGateCount());
  584. EXPECT_I((displacements[index] > 0L) ? 1L : -1L,
  585. ReadPosition());
  586. PlsrTestEmitAbQuarters(4UL);
  587. EXPECT_U(0U, PlsrTestPulseIsActive());
  588. EXPECT_U(0U, PlsrTestAbPhase());
  589. EXPECT_U(8UL, PlsrTestAbTransitionCount());
  590. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  591. EXPECT_I(displacements[index], ReadPosition());
  592. PlsrTestServiceFinalArmJob();
  593. EXPECT_I(displacements[index], ReadPosition());
  594. PlsrPoll1ms();
  595. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  596. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  597. EXPECT_U(2UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  598. EXPECT_U(2UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  599. }
  600. }
  601. static void TestAbFinalBoundaryBeforeArmJobIsNoOp(void)
  602. {
  603. ResetCore();
  604. ConfigureAbMotion(0U, 2L, 100000UL, 100000UL, 0U, 0U);
  605. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  606. PlsrTestDeferFinalArmJob(1U);
  607. PlsrTestEmitAbQuarters(4UL);
  608. EXPECT_U(1U, PlsrTestPulseIsActive());
  609. EXPECT_I(1L, ReadPosition());
  610. PlsrTestEmitAbQuarters(4UL);
  611. EXPECT_U(0U, PlsrTestPulseIsActive());
  612. EXPECT_U(0U, PlsrTestAbPhase());
  613. EXPECT_U(8UL, PlsrTestAbTransitionCount());
  614. EXPECT_I(2L, ReadPosition());
  615. PlsrTestServiceFinalArmJob();
  616. PlsrTestDeferFinalArmJob(0U);
  617. EXPECT_U(0U, PlsrTestPulseIsActive());
  618. EXPECT_I(2L, ReadPosition());
  619. PlsrPoll1ms();
  620. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  621. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  622. EXPECT_U(2UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  623. }
  624. static void TestAbFinalArmJobFailureDoesNotCountFinalPulse(void)
  625. {
  626. ResetCore();
  627. ConfigureAbMotion(2U, -2L, 100000UL, 100000UL, 0U, 0U);
  628. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  629. PlsrTestDeferFinalArmJob(1U);
  630. PlsrTestEmitAbQuarters(4UL);
  631. EXPECT_U(1U, PlsrTestPulseIsActive());
  632. EXPECT_I(-1L, ReadPosition());
  633. PlsrTestFailNextStopRequest();
  634. PlsrTestServiceFinalArmJob();
  635. EXPECT_U(0U, PlsrTestPulseIsActive());
  636. EXPECT_U(0U, PlsrTestAbPhase());
  637. EXPECT_I(-1L, ReadPosition());
  638. PlsrTestEmitAbQuarters(8UL);
  639. EXPECT_I(-1L, ReadPosition());
  640. PlsrTestDeferFinalArmJob(0U);
  641. PlsrPoll1ms();
  642. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  643. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  644. EXPECT_I(-1L, ReadPosition());
  645. ExpectDiagnosticInterrupted(2UL, 1UL);
  646. }
  647. static void TestAbStopMailboxAtPendingBoundary(void)
  648. {
  649. ResetCore();
  650. ConfigureAbMotion(0U, 1L, 100000UL, 100000UL, 0U, 0U);
  651. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  652. PlsrTestEmitAbQuarters(4UL);
  653. EXPECT_U(0U, PlsrTestPulseIsActive());
  654. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  655. EXPECT_U(0UL, PlsrTestAbCleanupCount());
  656. EXPECT_I(1L, ReadPosition());
  657. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  658. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_START));
  659. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_CLEAR));
  660. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_STOP));
  661. PlsrPoll1ms();
  662. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  663. EXPECT_U(0UL, PlsrTestAbCleanupCount());
  664. EXPECT_I(1L, ReadPosition());
  665. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  666. PlsrPoll1ms();
  667. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  668. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  669. EXPECT_U(0U, ReadCurrentSegment());
  670. EXPECT_U(1UL, PlsrTestAbCleanupCount());
  671. EXPECT_I(1L, ReadPosition());
  672. EXPECT_U(1UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  673. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  674. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  675. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  676. EXPECT_I(0L, ReadPosition());
  677. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  678. EXPECT_U(1U, PlsrTestPulseIsActive());
  679. PlsrTestEmitAbQuarters(4UL);
  680. PlsrPoll1ms();
  681. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  682. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  683. EXPECT_U(2UL, PlsrTestAbCleanupCount());
  684. EXPECT_I(1L, ReadPosition());
  685. EXPECT_U(1UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  686. }
  687. static void TestAbActAndExtCutsFinishAtZero(void)
  688. {
  689. uint32_t transitionsBefore;
  690. ResetCore();
  691. ConfigureAbMotion(0U, 100L, 1000UL, 1000UL, 0U, 0U);
  692. EXPECT_U(PLSR_MB_OK,
  693. SetSegment(1U, 1000UL, 100L, PLSR_ACT_TIME,
  694. 0U, 1U, 0U));
  695. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  696. PlsrTestEmitAbQuarters(2UL);
  697. EXPECT_U(3U, PlsrTestAbPhase());
  698. PlsrPoll1ms();
  699. PlsrTestEmitAbQuarters(2UL);
  700. EXPECT_U(0U, PlsrTestAbPhase());
  701. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  702. EXPECT_U(0U, PlsrTestPulseIsActive());
  703. EXPECT_I(1L, ReadPosition());
  704. transitionsBefore = PlsrTestAbTransitionCount();
  705. PlsrTestEmitAbQuarters(4UL);
  706. EXPECT_U(transitionsBefore, PlsrTestAbTransitionCount());
  707. PlsrPoll1ms();
  708. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  709. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  710. & PLSR_DIAG_FAULT_LATCHED);
  711. ExpectDiagnosticInterrupted(100UL, 1UL);
  712. ResetCore();
  713. ConfigureAbMotion(2U, -100L, 1000UL, 1000UL, 0U, 0U);
  714. PlsrTestSetInput(0U, 0U);
  715. EXPECT_U(PLSR_MB_OK,
  716. SetSegment(1U, 1000UL, -100L, PLSR_EXT_SIGNAL,
  717. 0U, 0U, 0U));
  718. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  719. PlsrTestEmitAbQuarters(3UL);
  720. EXPECT_U(2U, PlsrTestAbPhase());
  721. PlsrTestSetInput(0U, 1U);
  722. PlsrPoll1ms();
  723. PlsrTestEmitAbQuarters(1UL);
  724. EXPECT_U(0U, PlsrTestAbPhase());
  725. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  726. EXPECT_U(0U, PlsrTestPulseIsActive());
  727. EXPECT_I(-1L, ReadPosition());
  728. PlsrPoll1ms();
  729. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  730. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  731. & PLSR_DIAG_FAULT_LATCHED);
  732. ExpectDiagnosticInterrupted(100UL, 1UL);
  733. }
  734. static void TestAbSubsequentSinglePulsesStayContinuous(void)
  735. {
  736. ResetCore();
  737. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  738. PLSR_SEND_SUBSEQUENT, 100000UL, 100000UL, 100000UL,
  739. 0U, 0U);
  740. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 0U));
  741. EXPECT_U(PLSR_MB_OK,
  742. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  743. EXPECT_U(PLSR_MB_OK,
  744. SetSegment(1U, 100000UL, 1L, PLSR_EXT_OR_COMPLETE,
  745. 0U, 0U, 0U));
  746. EXPECT_U(PLSR_MB_OK,
  747. SetSegment(2U, 100000UL, 1L, PLSR_EXT_OR_COMPLETE,
  748. 0U, 0U, 0U));
  749. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  750. PlsrTestEmitAbQuarters(4UL);
  751. EXPECT_U(1U, PlsrTestPulseIsActive());
  752. EXPECT_U(2U, ReadCurrentSegment());
  753. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  754. EXPECT_U(0UL, PlsrTestAbFastGateCount());
  755. EXPECT_I(1L, ReadPosition());
  756. PlsrTestEmitAbQuarters(4UL);
  757. EXPECT_U(0U, PlsrTestPulseIsActive());
  758. EXPECT_U(0U, PlsrTestAbPhase());
  759. EXPECT_U(8UL, PlsrTestAbTransitionCount());
  760. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  761. EXPECT_I(2L, ReadPosition());
  762. PlsrPoll1ms();
  763. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  764. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  765. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  766. & PLSR_DIAG_FAULT_LATCHED);
  767. }
  768. static void TestAbArmedFrequencyWriteDoesNotReopenOutput(void)
  769. {
  770. ResetCore();
  771. ConfigureAbMotion(0U, 1L, 1000UL, 1000UL, 0U, 0U);
  772. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  773. PlsrTestEmitAbQuarters(1UL);
  774. EXPECT_U(2U, PlsrTestAbPhase());
  775. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  776. PlsrPoll1ms();
  777. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  778. EXPECT_U(1000UL, PlsrTestQueuedFrequency());
  779. PlsrTestEmitAbQuarters(3UL);
  780. EXPECT_U(0U, PlsrTestPulseIsActive());
  781. EXPECT_U(0U, PlsrTestAbPhase());
  782. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  783. EXPECT_I(1L, ReadPosition());
  784. PlsrPoll1ms();
  785. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  786. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  787. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  788. & PLSR_DIAG_FAULT_LATCHED);
  789. }
  790. static void TestAbStopRequestForcedFault(void)
  791. {
  792. ResetCore();
  793. ConfigureAbMotion(0U, 1L, 1000UL, 1000UL, 0U, 0U);
  794. PlsrTestFailNextStopRequest();
  795. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  796. EXPECT_U(0U, PlsrTestPulseIsActive());
  797. EXPECT_I(0L, ReadPosition());
  798. PlsrPoll1ms();
  799. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  800. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  801. EXPECT_I(0L, ReadPosition());
  802. ExpectDiagnosticInterrupted(1UL, 0UL);
  803. ResetCore();
  804. ConfigureAbMotion(2U, -100L, 1000UL, 1000UL, 0U, 0U);
  805. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  806. PlsrTestEmitAbQuarters(2UL);
  807. PlsrTestFailNextStopRequest();
  808. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  809. EXPECT_U(0U, PlsrTestPulseIsActive());
  810. EXPECT_I(0L, ReadPosition());
  811. PlsrPoll1ms();
  812. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  813. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  814. EXPECT_I(0L, ReadPosition());
  815. ExpectDiagnosticInterrupted(100UL, 0UL);
  816. }
  817. static void TestAbStopAfterFinalBoundaryIsArmed(void)
  818. {
  819. ResetCore();
  820. ConfigureAbMotion(0U, 1L, 1000UL, 1000UL, 0U, 0U);
  821. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  822. PlsrTestEmitAbQuarters(1UL);
  823. EXPECT_U(2U, PlsrTestAbPhase());
  824. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  825. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  826. EXPECT_U(1U, PlsrTestPulseIsActive());
  827. PlsrTestEmitAbQuarters(3UL);
  828. EXPECT_U(0U, PlsrTestPulseIsActive());
  829. EXPECT_U(0U, PlsrTestAbPhase());
  830. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  831. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  832. EXPECT_I(1L, ReadPosition());
  833. PlsrPoll1ms();
  834. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  835. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  836. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  837. & PLSR_DIAG_FAULT_LATCHED);
  838. }
  839. static void TestAbStopArmConsumesLatchedFinalQuarterOnce(void)
  840. {
  841. ResetCore();
  842. ConfigureAbMotion(0U, 100L, 1000UL, 1000UL, 0U, 0U);
  843. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  844. PlsrTestEmitAbQuarters(3UL);
  845. EXPECT_U(1U, PlsrTestAbPhase());
  846. EXPECT_U(3UL, PlsrTestAbTransitionCount());
  847. EXPECT_I(0L, ReadPosition());
  848. PlsrTestLatchAbFinalQuarterOnNextStopArm();
  849. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  850. EXPECT_U(0U, PlsrTestPulseIsActive());
  851. EXPECT_U(0U, PlsrTestAbPhase());
  852. EXPECT_U(4UL, PlsrTestAbTransitionCount());
  853. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  854. EXPECT_I(1L, ReadPosition());
  855. PlsrPoll1ms();
  856. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  857. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  858. EXPECT_U(0U, ReadWord(PLSR_DIAG_FLAGS_ADDRESS)
  859. & PLSR_DIAG_FAULT_LATCHED);
  860. }
  861. static void TestAbRejectsUnpairedOutputs(void)
  862. {
  863. ResetCore();
  864. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 1U));
  865. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  866. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  867. EXPECT_U(PLSR_OUTPUT_MODE_PULSE_DIR,
  868. ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  869. EXPECT_U(1U, ReadWord(0x1000U));
  870. ResetCore();
  871. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 3U));
  872. EXPECT_U(PLSR_MB_ILLEGAL_VALUE,
  873. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  874. EXPECT_U(PLSR_OUTPUT_MODE_PULSE_DIR,
  875. ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  876. ResetCore();
  877. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 2U));
  878. EXPECT_U(PLSR_MB_OK,
  879. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  880. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, WriteWord(0x1000U, 1U));
  881. EXPECT_U(2U, ReadWord(0x1000U));
  882. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, WriteWord(0x1000U, 3U));
  883. EXPECT_U(2U, ReadWord(0x1000U));
  884. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 0U));
  885. EXPECT_U(0U, ReadWord(0x1000U));
  886. }
  887. static void TestAbStopAtCompleteCycleBoundary(void)
  888. {
  889. ResetCore();
  890. ConfigureAbMotion(0U, 100L, 1000UL, 1000UL, 0U, 0U);
  891. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  892. PlsrTestEmitAbQuarters(1UL);
  893. EXPECT_U(2U, PlsrTestAbPhase());
  894. EXPECT_U(1U, PlsrTestAbTransitionCount());
  895. EXPECT_I(0L, ReadPosition());
  896. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  897. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  898. EXPECT_U(1U, PlsrTestPulseIsActive());
  899. EXPECT_U(0UL, PlsrTestAbFastGateCount());
  900. PlsrTestEmitAbQuarters(2UL);
  901. EXPECT_U(1U, PlsrTestAbPhase());
  902. EXPECT_U(1U, PlsrTestPulseIsActive());
  903. EXPECT_I(0L, ReadPosition());
  904. PlsrTestEmitAbQuarters(1UL);
  905. EXPECT_U(0U, PlsrTestAbPhase());
  906. EXPECT_U(4U, PlsrTestAbTransitionCount());
  907. EXPECT_U(0U, PlsrTestPulseIsActive());
  908. EXPECT_I(1L, ReadPosition());
  909. EXPECT_U(1UL, PlsrTestAbFastGateCount());
  910. PlsrPoll1ms();
  911. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  912. }
  913. static void TestAbDynamicFrequencyChangesOnlyAtZeroPhase(void)
  914. {
  915. uint32_t previousFrequency;
  916. uint32_t currentFrequency;
  917. uint16_t quarter;
  918. uint8_t frequencyChanged = 0U;
  919. ResetCore();
  920. ConfigureAbMotion(0U, 20L, 1000UL, 1000UL, 0U, 0U);
  921. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  922. PlsrTestEmitAbQuarters(1UL);
  923. EXPECT_U(2U, PlsrTestAbPhase());
  924. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  925. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  926. PlsrPoll1ms();
  927. previousFrequency = PlsrTestOutputFrequency();
  928. EXPECT_U(1000UL, previousFrequency);
  929. for (quarter = 0U; quarter < 12U; quarter++)
  930. {
  931. PlsrTestEmitAbQuarters(1UL);
  932. currentFrequency = PlsrTestOutputFrequency();
  933. if (currentFrequency != previousFrequency)
  934. {
  935. EXPECT_U(0U, PlsrTestAbPhase());
  936. EXPECT_U(0U, PlsrTestAbTransitionCount() & 3UL);
  937. EXPECT_U(1000UL, previousFrequency);
  938. EXPECT_U(2000UL, currentFrequency);
  939. frequencyChanged = 1U;
  940. break;
  941. }
  942. EXPECT_U(1000UL, currentFrequency);
  943. previousFrequency = currentFrequency;
  944. }
  945. EXPECT_U(1U, frequencyChanged);
  946. EXPECT_U(1U, PlsrTestPulseIsActive());
  947. StopAndSettle();
  948. }
  949. static void TestAbStaleFrequencyCommitAfterNaturalCompletion(void)
  950. {
  951. uint16_t flags;
  952. ResetCore();
  953. ConfigureAbMotion(0U, 2L, 1000UL, 1000UL, 0U, 0U);
  954. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  955. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  956. PlsrPoll1ms();
  957. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  958. EXPECT_U(1000UL, PlsrTestQueuedFrequency());
  959. PlsrTestCompleteAbCycleOnNextQueueCommit();
  960. PlsrTestEmitAbQuarters(4UL);
  961. EXPECT_U(0U, PlsrTestPulseIsActive());
  962. EXPECT_U(0U, PlsrTestAbPhase());
  963. EXPECT_U(8UL, PlsrTestAbTransitionCount());
  964. EXPECT_I(2L, ReadPosition());
  965. PlsrPoll1ms();
  966. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  967. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  968. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  969. EXPECT_U(PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS,
  970. flags & (PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS));
  971. EXPECT_U(0U, flags & PLSR_DIAG_FAULT_LATCHED);
  972. EXPECT_U(2UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  973. EXPECT_U(2UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  974. EXPECT_I(0L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  975. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_REQUESTED_FREQUENCY_ADDRESS));
  976. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_EXPECTED_TIMER_ADDRESS));
  977. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_ACTIVE_TIMER_ADDRESS));
  978. }
  979. static void TestAbDirectionReversalRestartsFromZeroPhase(void)
  980. {
  981. ResetCore();
  982. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  983. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 1000UL,
  984. 0U, 0U);
  985. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 0U));
  986. EXPECT_U(PLSR_MB_OK,
  987. WriteWord(PLSR_OUTPUT_MODE_ADDRESS, PLSR_OUTPUT_MODE_AB));
  988. EXPECT_U(PLSR_MB_OK,
  989. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  990. 0U, 0U, 0U));
  991. EXPECT_U(PLSR_MB_OK,
  992. SetSegment(2U, 1000UL, -1L, PLSR_EXT_OR_COMPLETE,
  993. 0U, 0U, 0U));
  994. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  995. PlsrTestEmitAbQuarters(4UL);
  996. EXPECT_U(0U, PlsrTestAbPhase());
  997. EXPECT_U(4U, PlsrTestAbTransitionCount());
  998. EXPECT_U(0U, PlsrTestPulseIsActive());
  999. EXPECT_U(1U, ReadCurrentSegment());
  1000. EXPECT_I(1L, ReadPosition());
  1001. PlsrPoll1ms();
  1002. EXPECT_U(2U, ReadCurrentSegment());
  1003. EXPECT_U(1U, PlsrTestPulseIsActive());
  1004. EXPECT_U(0U, PlsrTestAbPhase());
  1005. EXPECT_U(0x0001U, ReadWord(PLSR_DIAG_MODE_DIRECTION_ADDRESS));
  1006. PlsrTestEmitAbQuarters(1UL);
  1007. EXPECT_U(1U, PlsrTestAbPhase());
  1008. EXPECT_U(5U, PlsrTestAbTransitionCount());
  1009. EXPECT_I(1L, ReadPosition());
  1010. PlsrTestEmitAbQuarters(3UL);
  1011. EXPECT_U(0U, PlsrTestAbPhase());
  1012. EXPECT_U(8U, PlsrTestAbTransitionCount());
  1013. EXPECT_U(0U, PlsrTestPulseIsActive());
  1014. EXPECT_I(0L, ReadPosition());
  1015. PlsrPoll1ms();
  1016. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1017. }
  1018. static void TestAbModePersistence(void)
  1019. {
  1020. ResetCore();
  1021. ConfigureAbMotion(2U, 4L, 2345UL, 2345UL, 0U, 0U);
  1022. EXPECT_U(1U, PlsrInit());
  1023. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  1024. EXPECT_U(2U, ReadWord(0x1000U));
  1025. EXPECT_U(PLSR_OUTPUT_MODE_AB, ReadWord(PLSR_OUTPUT_MODE_ADDRESS));
  1026. EXPECT_U(2345UL, ReadU32(0x1100U));
  1027. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1028. PlsrTestEmitPulses(4UL);
  1029. PlsrPoll1ms();
  1030. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1031. EXPECT_I(4L, ReadPosition());
  1032. }
  1033. static void TestDiagnosticPass(void)
  1034. {
  1035. uint16_t flags;
  1036. ResetCore();
  1037. ClearDiagnostic();
  1038. ConfigureAbMotion(0U, 8L, 1000UL, 1000UL, 0U, 0U);
  1039. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1040. EXPECT_U(PLSR_MB_DEVICE_BUSY,
  1041. WriteWord(PLSR_OUTPUT_MODE_ADDRESS,
  1042. PLSR_OUTPUT_MODE_PULSE_DIR));
  1043. EXPECT_U(PLSR_MB_DEVICE_BUSY,
  1044. WriteWord(PLSR_DIAGNOSTIC_CONTROL_ADDRESS, 1U));
  1045. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1046. EXPECT_TRUE((flags & PLSR_DIAG_MONITORING_ACTIVE) != 0U);
  1047. EXPECT_U(1U, ReadWord(PLSR_DIAG_SEGMENT_ADDRESS));
  1048. EXPECT_U(0x0101U, ReadWord(PLSR_DIAG_MODE_DIRECTION_ADDRESS));
  1049. EXPECT_U(8UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  1050. EXPECT_U(0UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  1051. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_REQUESTED_FREQUENCY_ADDRESS));
  1052. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_EXPECTED_TIMER_ADDRESS));
  1053. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_ACTIVE_TIMER_ADDRESS));
  1054. EXPECT_I(0L, ReadI32(PLSR_DIAG_REQUEST_ERROR_ADDRESS));
  1055. PlsrTestEmitPulses(8UL);
  1056. PlsrPoll1ms();
  1057. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1058. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1059. EXPECT_U(0U, flags & PLSR_DIAG_MONITORING_ACTIVE);
  1060. EXPECT_U(PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS,
  1061. flags & (PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS));
  1062. EXPECT_U(PLSR_DIAG_FREQUENCY_CHECKED | PLSR_DIAG_FREQUENCY_PASS,
  1063. flags & (PLSR_DIAG_FREQUENCY_CHECKED
  1064. | PLSR_DIAG_FREQUENCY_PASS));
  1065. EXPECT_U(PLSR_DIAG_CURVE_CHECKED | PLSR_DIAG_CURVE_PASS,
  1066. flags & (PLSR_DIAG_CURVE_CHECKED | PLSR_DIAG_CURVE_PASS));
  1067. EXPECT_U(0U, flags & PLSR_DIAG_FAULT_LATCHED);
  1068. EXPECT_U(PLSR_DIAG_REASON_NONE, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1069. EXPECT_U(8UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  1070. EXPECT_U(8UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  1071. EXPECT_I(0L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  1072. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_REQUESTED_FREQUENCY_ADDRESS));
  1073. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_EXPECTED_TIMER_ADDRESS));
  1074. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_ACTIVE_TIMER_ADDRESS));
  1075. EXPECT_I(0L, ReadI32(PLSR_DIAG_REQUEST_ERROR_ADDRESS));
  1076. EXPECT_TRUE(ReadU32(PLSR_DIAG_SAMPLE_COUNT_ADDRESS) > 0UL);
  1077. EXPECT_U(0UL, ReadU32(PLSR_DIAG_MISMATCH_COUNT_ADDRESS));
  1078. EXPECT_U(0UL, ReadU32(PLSR_DIAG_MAX_ERROR_ADDRESS));
  1079. EXPECT_U(0xFFFFFFFFUL,
  1080. ReadU32(PLSR_DIAG_FIRST_MISMATCH_ADDRESS));
  1081. }
  1082. static void TestDiagnosticCountFaultAndClear(void)
  1083. {
  1084. uint16_t flags;
  1085. ResetCore();
  1086. ConfigureAbMotion(0U, 4L, 1000UL, 1000UL, 0U, 0U);
  1087. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1088. PlsrTestInjectCountOffset(1L);
  1089. PlsrTestEmitPulses(4UL);
  1090. PlsrPoll1ms();
  1091. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1092. EXPECT_U(PLSR_DIAG_COUNT_CHECKED,
  1093. flags & PLSR_DIAG_COUNT_CHECKED);
  1094. EXPECT_U(0U, flags & PLSR_DIAG_COUNT_PASS);
  1095. EXPECT_U(PLSR_DIAG_FAULT_LATCHED,
  1096. flags & PLSR_DIAG_FAULT_LATCHED);
  1097. EXPECT_U(PLSR_DIAG_REASON_COUNT, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1098. EXPECT_U(4UL, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  1099. EXPECT_U(5UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  1100. EXPECT_I(1L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  1101. ClearDiagnostic();
  1102. }
  1103. static void TestDiagnosticFrequencyFaultAndClear(void)
  1104. {
  1105. uint16_t flags;
  1106. ResetCore();
  1107. ConfigureAbMotion(0U, 8L, 1000UL, 1000UL, 0U, 0U);
  1108. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1109. PlsrTestInjectActiveFrequencyOffset(25L);
  1110. PlsrTestEmitPulses(8UL);
  1111. PlsrPoll1ms();
  1112. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1113. EXPECT_U(PLSR_DIAG_FREQUENCY_CHECKED,
  1114. flags & PLSR_DIAG_FREQUENCY_CHECKED);
  1115. EXPECT_U(0U, flags & PLSR_DIAG_FREQUENCY_PASS);
  1116. EXPECT_U(PLSR_DIAG_FAULT_LATCHED,
  1117. flags & PLSR_DIAG_FAULT_LATCHED);
  1118. EXPECT_U(PLSR_DIAG_REASON_FREQUENCY,
  1119. ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1120. EXPECT_U(1000UL, ReadU32(PLSR_DIAG_EXPECTED_TIMER_ADDRESS));
  1121. EXPECT_U(1025UL, ReadU32(PLSR_DIAG_ACTIVE_TIMER_ADDRESS));
  1122. EXPECT_TRUE(ReadU32(PLSR_DIAG_MISMATCH_COUNT_ADDRESS) > 0UL);
  1123. EXPECT_U(25UL, ReadU32(PLSR_DIAG_MAX_ERROR_ADDRESS));
  1124. EXPECT_TRUE(ReadU32(PLSR_DIAG_FIRST_MISMATCH_ADDRESS)
  1125. != 0xFFFFFFFFUL);
  1126. ClearDiagnostic();
  1127. }
  1128. static void TestDiagnosticCurveFaultAndClear(void)
  1129. {
  1130. uint16_t flags;
  1131. ResetCore();
  1132. ConfigureAbMotion(0U, 50L, 1000UL, 100UL, 1000U, 1000U);
  1133. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1134. PlsrTestInjectCurveMismatch();
  1135. PlsrTestEmitPulses(50UL);
  1136. PlsrPoll1ms();
  1137. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1138. EXPECT_U(PLSR_DIAG_CURVE_CHECKED,
  1139. flags & PLSR_DIAG_CURVE_CHECKED);
  1140. EXPECT_U(0U, flags & PLSR_DIAG_CURVE_PASS);
  1141. EXPECT_U(PLSR_DIAG_FAULT_LATCHED,
  1142. flags & PLSR_DIAG_FAULT_LATCHED);
  1143. EXPECT_U(PLSR_DIAG_REASON_CURVE,
  1144. ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1145. EXPECT_TRUE(ReadU32(PLSR_DIAG_MISMATCH_COUNT_ADDRESS) > 0UL);
  1146. EXPECT_TRUE(ReadU32(PLSR_DIAG_FIRST_MISMATCH_ADDRESS)
  1147. != 0xFFFFFFFFUL);
  1148. ClearDiagnostic();
  1149. }
  1150. static void TestDiagnosticInterruptedSegments(void)
  1151. {
  1152. ResetCore();
  1153. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1154. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1155. EXPECT_U(PLSR_MB_OK,
  1156. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  1157. 0U, 0U, 0U));
  1158. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1159. PlsrTestEmitPulses(2UL);
  1160. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  1161. PlsrTestEmitPulses(1UL);
  1162. PlsrPoll1ms();
  1163. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1164. ExpectDiagnosticInterrupted(100UL, 3UL);
  1165. ResetCore();
  1166. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1167. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1168. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 10U));
  1169. EXPECT_U(PLSR_MB_OK,
  1170. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  1171. 0U, 0U, 0U));
  1172. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1173. EXPECT_U(0U, PlsrTestPulseIsActive());
  1174. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  1175. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1176. ExpectDiagnosticInterrupted(100UL, 0UL);
  1177. ResetCore();
  1178. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1179. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1180. EXPECT_U(PLSR_MB_OK,
  1181. SetSegment(1U, 1000UL, 100L, PLSR_ACT_TIME,
  1182. 0U, 1U, 0U));
  1183. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1184. PlsrTestEmitPulses(3UL);
  1185. PlsrPoll1ms();
  1186. PlsrTestEmitPulses(1UL);
  1187. PlsrPoll1ms();
  1188. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1189. ExpectDiagnosticInterrupted(100UL, 4UL);
  1190. ResetCore();
  1191. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1192. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1193. PlsrTestSetInput(0U, 0U);
  1194. EXPECT_U(PLSR_MB_OK,
  1195. SetSegment(1U, 1000UL, 100L, PLSR_EXT_SIGNAL,
  1196. 0U, 0U, 0U));
  1197. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1198. PlsrTestEmitPulses(2UL);
  1199. PlsrTestSetInput(0U, 1U);
  1200. PlsrPoll1ms();
  1201. PlsrTestEmitPulses(1UL);
  1202. PlsrPoll1ms();
  1203. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1204. ExpectDiagnosticInterrupted(100UL, 3UL);
  1205. }
  1206. static void TestDiagnosticFaultLatchNeedsExplicitClear(void)
  1207. {
  1208. uint16_t flags;
  1209. ResetCore();
  1210. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1211. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1212. EXPECT_U(PLSR_MB_OK,
  1213. SetSegment(1U, 1000UL, 4L, PLSR_EXT_OR_COMPLETE,
  1214. 0U, 0U, 0U));
  1215. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1216. PlsrTestInjectCountOffset(1L);
  1217. PlsrTestEmitPulses(4UL);
  1218. PlsrPoll1ms();
  1219. EXPECT_U(PLSR_DIAG_REASON_COUNT, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1220. PlsrTestInjectCountOffset(0L);
  1221. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  1222. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1223. EXPECT_U(PLSR_DIAG_FAULT_LATCHED, flags & PLSR_DIAG_FAULT_LATCHED);
  1224. EXPECT_U(0U, flags & PLSR_DIAG_COUNT_PASS);
  1225. EXPECT_U(PLSR_DIAG_REASON_COUNT, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1226. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1227. PlsrTestEmitPulses(4UL);
  1228. PlsrPoll1ms();
  1229. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1230. EXPECT_U(PLSR_DIAG_COUNT_CHECKED, flags & PLSR_DIAG_COUNT_CHECKED);
  1231. EXPECT_U(0U, flags & PLSR_DIAG_COUNT_PASS);
  1232. EXPECT_U(PLSR_DIAG_FAULT_LATCHED, flags & PLSR_DIAG_FAULT_LATCHED);
  1233. EXPECT_U(PLSR_DIAG_REASON_COUNT, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1234. EXPECT_U(4UL, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  1235. EXPECT_I(0L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  1236. ClearDiagnostic();
  1237. }
  1238. static void TestDiagnosticFrequencyPassStaysFailed(void)
  1239. {
  1240. uint16_t flags;
  1241. ResetCore();
  1242. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1243. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1244. EXPECT_U(PLSR_MB_OK,
  1245. SetSegment(1U, 1000UL, 4L, PLSR_EXT_OR_COMPLETE,
  1246. 0U, 0U, 0U));
  1247. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1248. PlsrTestInjectActiveFrequencyOffset(25L);
  1249. PlsrTestEmitPulses(4UL);
  1250. PlsrPoll1ms();
  1251. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1252. EXPECT_U(0U, flags & PLSR_DIAG_FREQUENCY_PASS);
  1253. EXPECT_U(PLSR_DIAG_REASON_FREQUENCY,
  1254. ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1255. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1256. PlsrTestEmitPulses(4UL);
  1257. PlsrPoll1ms();
  1258. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  1259. EXPECT_U(PLSR_DIAG_FREQUENCY_CHECKED,
  1260. flags & PLSR_DIAG_FREQUENCY_CHECKED);
  1261. EXPECT_U(0U, flags & PLSR_DIAG_FREQUENCY_PASS);
  1262. EXPECT_U(PLSR_DIAG_FAULT_LATCHED, flags & PLSR_DIAG_FAULT_LATCHED);
  1263. EXPECT_U(PLSR_DIAG_REASON_FREQUENCY,
  1264. ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1265. ClearDiagnostic();
  1266. }
  1267. static void TestDiagnosticCurveCountersSaturate(void)
  1268. {
  1269. ResetCore();
  1270. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1271. 1000UL, 1000UL, 1000UL, 0U, 0U);
  1272. EXPECT_U(PLSR_MB_OK,
  1273. SetSegment(1U, 1000UL, 2L, PLSR_EXT_OR_COMPLETE,
  1274. 0U, 0U, 0U));
  1275. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1276. PlsrTestSetDiagnosticCurveCounts(0xFFFFFFFFUL, 0xFFFFFFFFUL);
  1277. PlsrTestInjectCurveMismatch();
  1278. PlsrTestEmitPulses(2UL);
  1279. PlsrPoll1ms();
  1280. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1281. EXPECT_U(0xFFFFFFFFUL, ReadU32(PLSR_DIAG_SAMPLE_COUNT_ADDRESS));
  1282. EXPECT_U(0xFFFFFFFFUL, ReadU32(PLSR_DIAG_MISMATCH_COUNT_ADDRESS));
  1283. EXPECT_U(PLSR_DIAG_REASON_CURVE, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  1284. }
  1285. static void TestWaitZeroUsesOneMillisecond(void)
  1286. {
  1287. ResetCore();
  1288. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U, PLSR_SEND_COMPLETE,
  1289. 1000UL, 1000UL, 100UL, 0U, 0U);
  1290. EXPECT_U(PLSR_MB_OK,
  1291. SetSegment(1U, 1000UL, 1L, PLSR_WAIT_TIME, 0U, 0U, 0U));
  1292. EXPECT_U(PLSR_MB_OK,
  1293. SetSegment(2U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1294. 0U, 0U, 0U));
  1295. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1296. PlsrTestEmitPulses(1UL);
  1297. PlsrPoll1ms();
  1298. EXPECT_U(PLSR_STATUS_WAITING, ReadStatus());
  1299. EXPECT_U(1U, ReadCurrentSegment());
  1300. EXPECT_U(0U, PlsrTestPulseIsActive());
  1301. PlsrPoll1ms();
  1302. EXPECT_U(2U, ReadCurrentSegment());
  1303. EXPECT_U(1U, PlsrTestPulseIsActive());
  1304. PlsrTestEmitPulses(1UL);
  1305. PlsrPoll1ms();
  1306. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1307. EXPECT_I(2L, ReadPosition());
  1308. }
  1309. static void TestActZeroSkipsWithoutPulse(void)
  1310. {
  1311. ResetCore();
  1312. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U, PLSR_SEND_COMPLETE,
  1313. 1000UL, 1000UL, 100UL, 0U, 0U);
  1314. EXPECT_U(PLSR_MB_OK,
  1315. SetSegment(1U, 1000UL, 100L, PLSR_ACT_TIME, 0U, 0U, 0U));
  1316. EXPECT_U(PLSR_MB_OK,
  1317. SetSegment(2U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1318. 0U, 0U, 0U));
  1319. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1320. EXPECT_U(0U, PlsrTestPulseIsActive());
  1321. EXPECT_U(1U, ReadCurrentSegment());
  1322. EXPECT_I(0L, ReadPosition());
  1323. PlsrPoll1ms();
  1324. EXPECT_U(2U, ReadCurrentSegment());
  1325. EXPECT_U(1U, PlsrTestPulseIsActive());
  1326. EXPECT_I(0L, ReadPosition());
  1327. PlsrTestEmitPulses(1UL);
  1328. PlsrPoll1ms();
  1329. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1330. EXPECT_I(1L, ReadPosition());
  1331. }
  1332. static void TestRelativeAndAbsoluteZeroDisplacement(void)
  1333. {
  1334. ResetCore();
  1335. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1336. 1000UL, 1000UL, 100UL, 0U, 0U);
  1337. EXPECT_U(PLSR_MB_OK,
  1338. SetSegment(1U, 1000UL, 0L, PLSR_EXT_OR_COMPLETE,
  1339. 0U, 0U, 0U));
  1340. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1341. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  1342. EXPECT_U(0U, PlsrTestPulseIsActive());
  1343. PlsrPoll1ms();
  1344. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1345. EXPECT_I(0L, ReadPosition());
  1346. EXPECT_U(PLSR_MB_OK,
  1347. SetSegment(1U, 1000UL, 5L, PLSR_EXT_OR_COMPLETE,
  1348. 0U, 0U, 0U));
  1349. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1350. PlsrTestEmitPulses(5UL);
  1351. PlsrPoll1ms();
  1352. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1353. EXPECT_I(5L, ReadPosition());
  1354. EXPECT_U(PLSR_MB_OK, WriteWord(0x1008U, PLSR_POSITION_ABSOLUTE));
  1355. EXPECT_U(PLSR_MB_OK,
  1356. SetSegment(1U, 1000UL, 5L, PLSR_EXT_OR_COMPLETE,
  1357. 0U, 0U, 0U));
  1358. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1359. EXPECT_U(0U, PlsrTestPulseIsActive());
  1360. PlsrPoll1ms();
  1361. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1362. EXPECT_I(5L, ReadPosition());
  1363. }
  1364. static void ConfigureTenSegmentMove(const uint8_t *jumpSegments)
  1365. {
  1366. uint16_t segment;
  1367. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 10U,
  1368. PLSR_SEND_COMPLETE, 1000UL, 1000UL, 1000UL,
  1369. 0U, 0U);
  1370. for (segment = 1U; segment <= 10U; segment++)
  1371. {
  1372. EXPECT_U(PLSR_MB_OK,
  1373. SetSegment((uint8_t)segment, 1000UL,
  1374. (int32_t)segment, PLSR_EXT_OR_COMPLETE,
  1375. 0U, 0U,
  1376. (jumpSegments != NULL)
  1377. ? jumpSegments[segment - 1U] : 0U));
  1378. }
  1379. }
  1380. static void TestAllTenSegmentsRunInSequence(void)
  1381. {
  1382. int32_t expectedPosition = 0L;
  1383. uint16_t segment;
  1384. ResetCore();
  1385. ConfigureTenSegmentMove(NULL);
  1386. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1387. for (segment = 1U; segment <= 10U; segment++)
  1388. {
  1389. EXPECT_U(segment, ReadCurrentSegment());
  1390. EXPECT_U(1U, PlsrTestPulseIsActive());
  1391. PlsrTestEmitPulses((uint32_t)segment);
  1392. expectedPosition += (int32_t)segment;
  1393. EXPECT_I(expectedPosition, ReadPosition());
  1394. PlsrPoll1ms();
  1395. if (segment < 10U)
  1396. {
  1397. EXPECT_U(segment + 1U, ReadCurrentSegment());
  1398. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  1399. }
  1400. }
  1401. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1402. EXPECT_U(0U, ReadCurrentSegment());
  1403. EXPECT_U(0U, PlsrTestPulseIsActive());
  1404. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  1405. EXPECT_I(55L, ReadPosition());
  1406. }
  1407. static void TestAllTenSegmentsRunThroughJumpChain(void)
  1408. {
  1409. static const uint8_t jumps[10] =
  1410. {
  1411. 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 2U, 0U
  1412. };
  1413. static const uint8_t order[10] =
  1414. {
  1415. 1U, 3U, 5U, 7U, 9U, 2U, 4U, 6U, 8U, 10U
  1416. };
  1417. int32_t expectedPosition = 0L;
  1418. uint16_t index;
  1419. ResetCore();
  1420. ConfigureTenSegmentMove(jumps);
  1421. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1422. for (index = 0U; index < 10U; index++)
  1423. {
  1424. uint8_t segment = order[index];
  1425. EXPECT_U(segment, ReadCurrentSegment());
  1426. EXPECT_U(1U, PlsrTestPulseIsActive());
  1427. PlsrTestEmitPulses((uint32_t)segment);
  1428. expectedPosition += (int32_t)segment;
  1429. EXPECT_I(expectedPosition, ReadPosition());
  1430. PlsrPoll1ms();
  1431. if (index + 1U < 10U)
  1432. {
  1433. EXPECT_U(order[index + 1U], ReadCurrentSegment());
  1434. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  1435. }
  1436. }
  1437. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1438. EXPECT_U(0U, ReadCurrentSegment());
  1439. EXPECT_U(0U, PlsrTestPulseIsActive());
  1440. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  1441. EXPECT_I(55L, ReadPosition());
  1442. }
  1443. static void TestStartSegmentTenRunsNormally(void)
  1444. {
  1445. ResetCore();
  1446. ConfigureTenSegmentMove(NULL);
  1447. EXPECT_U(PLSR_MB_OK, WriteWord(0x100AU, 10U));
  1448. EXPECT_U(10U, ReadWord(0x100AU));
  1449. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1450. EXPECT_U(10U, ReadCurrentSegment());
  1451. EXPECT_U(1U, PlsrTestPulseIsActive());
  1452. PlsrTestEmitPulses(10UL);
  1453. EXPECT_I(10L, ReadPosition());
  1454. EXPECT_U(0U, PlsrTestPulseIsActive());
  1455. PlsrPoll1ms();
  1456. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1457. EXPECT_U(0U, ReadCurrentSegment());
  1458. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  1459. EXPECT_I(10L, ReadPosition());
  1460. }
  1461. static void TestSelfJumpCanStop(void)
  1462. {
  1463. unsigned int loop;
  1464. ResetCore();
  1465. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1466. 1000UL, 1000UL, 100UL, 0U, 0U);
  1467. EXPECT_U(PLSR_MB_OK,
  1468. SetSegment(1U, 1000UL, 2L, PLSR_EXT_OR_COMPLETE,
  1469. 0U, 0U, 1U));
  1470. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1471. for (loop = 0U; loop < 3U; loop++)
  1472. {
  1473. PlsrTestEmitPulses(2UL);
  1474. PlsrPoll1ms();
  1475. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  1476. EXPECT_U(1U, ReadCurrentSegment());
  1477. EXPECT_U(1U, PlsrTestPulseIsActive());
  1478. }
  1479. StopAndSettle();
  1480. }
  1481. static void TestStopDeceleratesBeforeCut(void)
  1482. {
  1483. unsigned int tick;
  1484. uint32_t middleFrequency;
  1485. ResetCore();
  1486. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1487. 1000UL, 1000UL, 100UL, 0U, 1000U);
  1488. EXPECT_U(PLSR_MB_OK,
  1489. SetSegment(1U, 1000UL, 10000L, PLSR_EXT_OR_COMPLETE,
  1490. 0U, 0U, 0U));
  1491. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1492. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  1493. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  1494. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  1495. EXPECT_U(1U, PlsrTestPulseIsActive());
  1496. for (tick = 0U; tick < 450U; tick++)
  1497. {
  1498. PlsrPoll1ms();
  1499. PlsrTestEmitPulses(1UL);
  1500. }
  1501. middleFrequency = PlsrTestOutputFrequency();
  1502. EXPECT_TRUE((middleFrequency > 100UL) && (middleFrequency < 1000UL));
  1503. EXPECT_U(1U, PlsrTestPulseIsActive());
  1504. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_STOP));
  1505. for (tick = 450U; tick < 900U; tick++)
  1506. {
  1507. PlsrPoll1ms();
  1508. PlsrTestEmitPulses(1UL);
  1509. }
  1510. EXPECT_TRUE(PlsrTestOutputFrequency() > 100UL);
  1511. EXPECT_TRUE(PlsrTestOutputFrequency() <= 103UL);
  1512. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  1513. EXPECT_U(1U, PlsrTestPulseIsActive());
  1514. PlsrTestEmitPulses(1UL);
  1515. EXPECT_U(100UL, PlsrTestOutputFrequency());
  1516. EXPECT_U(1U, PlsrTestPulseIsActive());
  1517. PlsrTestEmitPulses(1UL);
  1518. EXPECT_U(0U, PlsrTestPulseIsActive());
  1519. PlsrPoll1ms();
  1520. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1521. EXPECT_I(902L, ReadPosition());
  1522. }
  1523. static void TestStopAtPendingBoundary(void)
  1524. {
  1525. ResetCore();
  1526. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1527. 1000UL, 1000UL, 100UL, 0U, 0U);
  1528. EXPECT_U(PLSR_MB_OK,
  1529. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1530. 0U, 0U, 0U));
  1531. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1532. PlsrTestEmitPulses(1UL);
  1533. EXPECT_U(0U, PlsrTestPulseIsActive());
  1534. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  1535. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  1536. PlsrPoll1ms();
  1537. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1538. EXPECT_U(0U, ReadCurrentSegment());
  1539. EXPECT_I(1L, ReadPosition());
  1540. PlsrPoll1ms();
  1541. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1542. EXPECT_U(0U, PlsrTestPulseIsActive());
  1543. }
  1544. static void TestOneMillisecondDirectionDelay(void)
  1545. {
  1546. ResetCore();
  1547. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1548. 1000UL, 1000UL, 100UL, 0U, 0U);
  1549. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 1U));
  1550. EXPECT_U(PLSR_MB_OK,
  1551. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  1552. 0U, 0U, 0U));
  1553. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1554. EXPECT_U(0U, PlsrTestPulseIsActive());
  1555. PlsrPoll1ms();
  1556. EXPECT_U(1U, PlsrTestPulseIsActive());
  1557. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  1558. StopAndSettle();
  1559. }
  1560. static void ExpectDirectionPinLevels(uint8_t selectedOutput,
  1561. uint8_t selectedPinLevel)
  1562. {
  1563. uint8_t output;
  1564. for (output = 0U; output < 4U; output++)
  1565. {
  1566. EXPECT_U((output == selectedOutput) ? selectedPinLevel : 1U,
  1567. PlsrTestDirectionPinLevel(output));
  1568. }
  1569. }
  1570. static void TestDirectionOutputPolarityMatrix(void)
  1571. {
  1572. uint8_t directionOutput;
  1573. uint8_t negativeLogic;
  1574. uint8_t positive;
  1575. for (directionOutput = 0U; directionOutput < 4U; directionOutput++)
  1576. {
  1577. for (negativeLogic = 0U; negativeLogic < 2U; negativeLogic++)
  1578. {
  1579. for (positive = 0U; positive < 2U; positive++)
  1580. {
  1581. uint8_t logicalLevel = positive ^ negativeLogic;
  1582. uint8_t pinLevel = logicalLevel ^ 1U;
  1583. uint8_t output;
  1584. ResetCore();
  1585. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U,
  1586. PLSR_SEND_COMPLETE, 1000UL, 1000UL,
  1587. 1000UL, 0U, 0U);
  1588. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, directionOutput));
  1589. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 2U));
  1590. EXPECT_U(PLSR_MB_OK, WriteWord(0x1006U, negativeLogic));
  1591. EXPECT_U(PLSR_MB_OK,
  1592. SetSegment(1U, 1000UL,
  1593. (positive != 0U) ? 1L : -1L,
  1594. PLSR_EXT_OR_COMPLETE, 0U, 0U, 0U));
  1595. EXPECT_U(directionOutput, ReadWord(0x1001U));
  1596. EXPECT_U(negativeLogic, ReadWord(0x1006U));
  1597. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1598. EXPECT_U(logicalLevel, PlsrTestDirectionLevel());
  1599. ExpectDirectionPinLevels(directionOutput, pinLevel);
  1600. EXPECT_U(0U, PlsrTestPulseIsActive());
  1601. for (output = 0U; output < 4U; output++)
  1602. {
  1603. EXPECT_U(1UL, PlsrTestDirectionWriteCount(output));
  1604. EXPECT_U(((output == directionOutput)
  1605. && (pinLevel == 0U)) ? 1UL : 0UL,
  1606. PlsrTestDirectionTransitionCount(output));
  1607. }
  1608. PlsrPoll1ms();
  1609. EXPECT_U(0U, PlsrTestPulseIsActive());
  1610. PlsrPoll1ms();
  1611. EXPECT_U(1U, PlsrTestPulseIsActive());
  1612. PlsrTestEmitPulses(1UL);
  1613. PlsrPoll1ms();
  1614. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1615. EXPECT_I((positive != 0U) ? 1L : -1L, ReadPosition());
  1616. }
  1617. }
  1618. }
  1619. }
  1620. static void TestDirectionSameAndReverseSegments(void)
  1621. {
  1622. uint8_t output;
  1623. ResetCore();
  1624. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 3U,
  1625. PLSR_SEND_COMPLETE, 1000UL, 1000UL, 1000UL,
  1626. 0U, 0U);
  1627. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 2U));
  1628. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 2U));
  1629. EXPECT_U(PLSR_MB_OK, WriteWord(0x1006U, 0U));
  1630. EXPECT_U(PLSR_MB_OK,
  1631. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1632. 0U, 0U, 0U));
  1633. EXPECT_U(PLSR_MB_OK,
  1634. SetSegment(2U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1635. 0U, 0U, 0U));
  1636. EXPECT_U(PLSR_MB_OK,
  1637. SetSegment(3U, 1000UL, -1L, PLSR_EXT_OR_COMPLETE,
  1638. 0U, 0U, 0U));
  1639. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1640. EXPECT_U(1U, PlsrTestDirectionLevel());
  1641. ExpectDirectionPinLevels(2U, 0U);
  1642. EXPECT_U(0U, PlsrTestPulseIsActive());
  1643. PlsrPoll1ms();
  1644. EXPECT_U(0U, PlsrTestPulseIsActive());
  1645. PlsrPoll1ms();
  1646. EXPECT_U(1U, PlsrTestPulseIsActive());
  1647. PlsrTestEmitPulses(1UL);
  1648. PlsrPoll1ms();
  1649. EXPECT_U(2U, ReadCurrentSegment());
  1650. EXPECT_U(1U, PlsrTestPulseIsActive());
  1651. ExpectDirectionPinLevels(2U, 0U);
  1652. EXPECT_U(1UL, PlsrTestDirectionTransitionCount(2U));
  1653. PlsrTestEmitPulses(1UL);
  1654. PlsrPoll1ms();
  1655. EXPECT_U(3U, ReadCurrentSegment());
  1656. EXPECT_U(0U, PlsrTestDirectionLevel());
  1657. ExpectDirectionPinLevels(2U, 1U);
  1658. EXPECT_U(0U, PlsrTestPulseIsActive());
  1659. EXPECT_U(2UL, PlsrTestDirectionTransitionCount(2U));
  1660. for (output = 0U; output < 4U; output++)
  1661. {
  1662. EXPECT_U(3UL, PlsrTestDirectionWriteCount(output));
  1663. if (output != 2U)
  1664. {
  1665. EXPECT_U(0UL, PlsrTestDirectionTransitionCount(output));
  1666. }
  1667. }
  1668. PlsrPoll1ms();
  1669. EXPECT_U(0U, PlsrTestPulseIsActive());
  1670. PlsrPoll1ms();
  1671. EXPECT_U(1U, PlsrTestPulseIsActive());
  1672. PlsrTestEmitPulses(1UL);
  1673. PlsrPoll1ms();
  1674. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1675. EXPECT_I(1L, ReadPosition());
  1676. }
  1677. static void TestDirectionOutputCanChangeBetweenCommands(void)
  1678. {
  1679. uint8_t output;
  1680. ResetCore();
  1681. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U,
  1682. PLSR_SEND_COMPLETE, 1000UL, 1000UL, 1000UL,
  1683. 0U, 0U);
  1684. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 0U));
  1685. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 1U));
  1686. EXPECT_U(PLSR_MB_OK,
  1687. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1688. 0U, 0U, 0U));
  1689. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1690. ExpectDirectionPinLevels(0U, 0U);
  1691. EXPECT_U(0U, PlsrTestPulseIsActive());
  1692. PlsrPoll1ms();
  1693. EXPECT_U(1U, PlsrTestPulseIsActive());
  1694. PlsrTestEmitPulses(1UL);
  1695. PlsrPoll1ms();
  1696. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1697. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 3U));
  1698. EXPECT_U(3U, ReadWord(0x1001U));
  1699. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1700. ExpectDirectionPinLevels(3U, 0U);
  1701. EXPECT_U(0U, PlsrTestPulseIsActive());
  1702. EXPECT_U(2UL, PlsrTestDirectionTransitionCount(0U));
  1703. EXPECT_U(1UL, PlsrTestDirectionTransitionCount(3U));
  1704. for (output = 0U; output < 4U; output++)
  1705. {
  1706. EXPECT_U(2UL, PlsrTestDirectionWriteCount(output));
  1707. }
  1708. PlsrPoll1ms();
  1709. EXPECT_U(1U, PlsrTestPulseIsActive());
  1710. PlsrTestEmitPulses(1UL);
  1711. PlsrPoll1ms();
  1712. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1713. EXPECT_I(2L, ReadPosition());
  1714. }
  1715. static void TestExtEdgeAtNaturalBoundary(void)
  1716. {
  1717. ResetCore();
  1718. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1719. 1000UL, 1000UL, 100UL, 0U, 0U);
  1720. PlsrTestSetInput(0U, 0U);
  1721. EXPECT_U(PLSR_MB_OK,
  1722. SetSegment(1U, 1000UL, 1L, PLSR_EXT_SIGNAL,
  1723. 0U, 0U, 0U));
  1724. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1725. PlsrTestEmitPulseOnCriticalEntry();
  1726. PlsrTestSetInput(0U, 1U);
  1727. PlsrPoll1ms();
  1728. EXPECT_U(0U, PlsrTestPulseIsActive());
  1729. PlsrPoll1ms();
  1730. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1731. EXPECT_U(0U, ReadCurrentSegment());
  1732. EXPECT_I(1L, ReadPosition());
  1733. }
  1734. static void ConfigureExtBoundaryCarryRace(void)
  1735. {
  1736. ResetCore();
  1737. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  1738. PLSR_SEND_SUBSEQUENT, 2000UL, 500UL, 1000UL,
  1739. 0U, 1000U);
  1740. PlsrTestSetInput(0U, 0U);
  1741. EXPECT_U(PLSR_MB_OK,
  1742. SetSegment(1U, 2000UL, 1L, PLSR_EXT_SIGNAL,
  1743. 0U, 0U, 0U));
  1744. EXPECT_U(PLSR_MB_OK,
  1745. SetSegment(2U, 1000UL, 70000L, PLSR_EXT_OR_COMPLETE,
  1746. 0U, 0U, 0U));
  1747. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1748. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  1749. PlsrTestSetInput(0U, 1U);
  1750. }
  1751. static void ExpectExtBoundaryCarry(void)
  1752. {
  1753. EXPECT_U(0U, PlsrTestPulseIsActive());
  1754. EXPECT_U(1U, ReadCurrentSegment());
  1755. PlsrPoll1ms();
  1756. EXPECT_U(1U, PlsrTestPulseIsActive());
  1757. EXPECT_U(2U, ReadCurrentSegment());
  1758. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  1759. EXPECT_I(1L, ReadPosition());
  1760. }
  1761. static void TestExtCutAndNaturalBoundaryInterleavings(void)
  1762. {
  1763. ConfigureExtBoundaryCarryRace();
  1764. PlsrTestEmitPulseAfterCriticalEntries(3U);
  1765. PlsrPoll1ms();
  1766. ExpectExtBoundaryCarry();
  1767. ConfigureExtBoundaryCarryRace();
  1768. PlsrPoll1ms();
  1769. EXPECT_U(1U, PlsrTestPulseIsActive());
  1770. PlsrTestEmitPulses(1UL);
  1771. ExpectExtBoundaryCarry();
  1772. }
  1773. static void TestExtEdgeDuringDirectionDelay(void)
  1774. {
  1775. ResetCore();
  1776. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1777. 1000UL, 1000UL, 100UL, 0U, 0U);
  1778. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 2U));
  1779. PlsrTestSetInput(0U, 0U);
  1780. EXPECT_U(PLSR_MB_OK,
  1781. SetSegment(1U, 1000UL, 1L, PLSR_EXT_SIGNAL,
  1782. 0U, 0U, 0U));
  1783. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1784. PlsrTestSetInput(0U, 1U);
  1785. PlsrPoll1ms();
  1786. EXPECT_U(0U, PlsrTestPulseIsActive());
  1787. PlsrPoll1ms();
  1788. EXPECT_U(1U, PlsrTestPulseIsActive());
  1789. PlsrTestEmitPulses(1UL);
  1790. PlsrPoll1ms();
  1791. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1792. EXPECT_I(1L, ReadPosition());
  1793. }
  1794. static void TestStoppedTaskClearsPendingExtEdge(void)
  1795. {
  1796. ResetCore();
  1797. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  1798. 1000UL, 1000UL, 100UL, 0U, 0U);
  1799. EXPECT_U(PLSR_MB_OK, WriteWord(0x1005U, 2U));
  1800. PlsrTestSetInput(0U, 0U);
  1801. EXPECT_U(PLSR_MB_OK,
  1802. SetSegment(1U, 1000UL, 100L, PLSR_EXT_SIGNAL,
  1803. 0U, 0U, 0U));
  1804. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1805. EXPECT_U(0U, PlsrTestPulseIsActive());
  1806. PlsrTestSetInput(0U, 1U);
  1807. PlsrPoll1ms();
  1808. EXPECT_U(0U, PlsrTestPulseIsActive());
  1809. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  1810. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  1811. PlsrTestSetInput(0U, 0U);
  1812. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1813. EXPECT_U(0U, PlsrTestPulseIsActive());
  1814. PlsrPoll1ms();
  1815. EXPECT_U(0U, PlsrTestPulseIsActive());
  1816. PlsrPoll1ms();
  1817. EXPECT_U(1U, PlsrTestPulseIsActive());
  1818. PlsrPoll1ms();
  1819. EXPECT_U(1U, PlsrTestPulseIsActive());
  1820. EXPECT_I(0L, ReadPosition());
  1821. StopAndSettle();
  1822. }
  1823. static void TestExtEdgeDoesNotCutSeamlessNextSegment(void)
  1824. {
  1825. ResetCore();
  1826. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  1827. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL, 0U, 0U);
  1828. PlsrTestSetInput(0U, 0U);
  1829. EXPECT_U(PLSR_MB_OK,
  1830. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1831. 0U, 0U, 0U));
  1832. EXPECT_U(PLSR_MB_OK,
  1833. SetSegment(2U, 2000UL, 4L, PLSR_EXT_OR_COMPLETE,
  1834. 0U, 0U, 0U));
  1835. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1836. PlsrTestSetInput(0U, 1U);
  1837. PlsrTestEmitPulseAfterCriticalEntries(3U);
  1838. PlsrPoll1ms();
  1839. EXPECT_U(1U, PlsrTestPulseIsActive());
  1840. EXPECT_U(2U, ReadCurrentSegment());
  1841. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  1842. EXPECT_I(1L, ReadPosition());
  1843. PlsrTestEmitPulses(4UL);
  1844. PlsrPoll1ms();
  1845. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1846. EXPECT_I(5L, ReadPosition());
  1847. }
  1848. static void TestOldRampDoesNotRetargetSeamlessNextSegment(void)
  1849. {
  1850. ResetCore();
  1851. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  1852. PLSR_SEND_SUBSEQUENT, 2000UL, 1000UL, 100UL, 100U, 0U);
  1853. PlsrTestSetInput(0U, 0U);
  1854. EXPECT_U(PLSR_MB_OK,
  1855. SetSegment(1U, 2000UL, 1L, PLSR_EXT_OR_COMPLETE,
  1856. 0U, 0U, 0U));
  1857. EXPECT_U(PLSR_MB_OK,
  1858. SetSegment(2U, 3000UL, 4L, PLSR_EXT_OR_COMPLETE,
  1859. 0U, 0U, 0U));
  1860. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1861. PlsrTestEmitPulseAfterCriticalEntries(3U);
  1862. PlsrPoll1ms();
  1863. EXPECT_U(1U, PlsrTestPulseIsActive());
  1864. EXPECT_U(2U, ReadCurrentSegment());
  1865. EXPECT_U(3000UL, PlsrTestOutputFrequency());
  1866. EXPECT_I(1L, ReadPosition());
  1867. PlsrTestEmitPulses(4UL);
  1868. PlsrPoll1ms();
  1869. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1870. EXPECT_I(5L, ReadPosition());
  1871. }
  1872. static void TestShortProfileBoundaryMatrix(void)
  1873. {
  1874. static const uint16_t pulseCounts[] =
  1875. {
  1876. 1U, 2U, 10U, 99U, 100U, 101U, 258U
  1877. };
  1878. uint32_t samples[3][258];
  1879. uint64_t previousDurationNs[3] = {0ULL, 0ULL, 0ULL};
  1880. uint64_t durationNs[3];
  1881. unsigned int countIndex;
  1882. uint16_t curveMode;
  1883. unsigned int pulse;
  1884. unsigned int firstPeak;
  1885. unsigned int lastPeak;
  1886. uint32_t peakFrequencyHz;
  1887. uint32_t expectedPeakHz;
  1888. uint64_t expectedDurationNs;
  1889. uint64_t toleranceNs;
  1890. uint8_t linearDiffersFromSmooth;
  1891. uint8_t smoothDiffersFromSine;
  1892. uint8_t anyLinearDiffersFromSmooth = 0U;
  1893. uint8_t anySmoothDiffersFromSine = 0U;
  1894. for (countIndex = 0U;
  1895. countIndex < sizeof(pulseCounts) / sizeof(pulseCounts[0]);
  1896. countIndex++)
  1897. {
  1898. for (curveMode = 0U; curveMode <= 2U; curveMode++)
  1899. {
  1900. ResetCore();
  1901. ConfigureCommon(curveMode, PLSR_POSITION_RELATIVE, 1U,
  1902. PLSR_SEND_COMPLETE, 1000UL, 100UL, 100UL,
  1903. 1000U, 1000U);
  1904. EXPECT_U(PLSR_MB_OK,
  1905. SetSegment(1U, 1000UL, pulseCounts[countIndex],
  1906. PLSR_EXT_OR_COMPLETE, 0U, 0U, 0U));
  1907. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  1908. EXPECT_U(1U, PlsrTestPulseIsActive());
  1909. durationNs[curveMode] = 0ULL;
  1910. for (pulse = 0U; pulse < pulseCounts[countIndex]; pulse++)
  1911. {
  1912. samples[curveMode][pulse] = PlsrTestOutputFrequency();
  1913. EXPECT_TRUE(samples[curveMode][pulse] >= 100UL);
  1914. EXPECT_TRUE(samples[curveMode][pulse] <= 1000UL);
  1915. durationNs[curveMode] +=
  1916. PulsePeriodNs(samples[curveMode][pulse]);
  1917. PlsrTestEmitPulses(1UL);
  1918. if (((pulse + 1U) % 100U) == 0U)
  1919. {
  1920. PlsrPoll1ms();
  1921. }
  1922. if ((pulse + 1U) < pulseCounts[countIndex])
  1923. {
  1924. EXPECT_U(1U, PlsrTestPulseIsActive());
  1925. }
  1926. }
  1927. peakFrequencyHz = samples[curveMode][0];
  1928. firstPeak = 0U;
  1929. lastPeak = 0U;
  1930. for (pulse = 1U; pulse < pulseCounts[countIndex]; pulse++)
  1931. {
  1932. if (samples[curveMode][pulse] > peakFrequencyHz)
  1933. {
  1934. peakFrequencyHz = samples[curveMode][pulse];
  1935. firstPeak = pulse;
  1936. lastPeak = pulse;
  1937. }
  1938. else if (samples[curveMode][pulse] == peakFrequencyHz)
  1939. {
  1940. lastPeak = pulse;
  1941. }
  1942. }
  1943. for (pulse = 1U; pulse <= firstPeak; pulse++)
  1944. {
  1945. EXPECT_TRUE(samples[curveMode][pulse]
  1946. >= samples[curveMode][pulse - 1U]);
  1947. }
  1948. for (pulse = firstPeak + 1U; pulse <= lastPeak; pulse++)
  1949. {
  1950. EXPECT_U(peakFrequencyHz, samples[curveMode][pulse]);
  1951. }
  1952. for (pulse = lastPeak + 1U;
  1953. pulse < pulseCounts[countIndex]; pulse++)
  1954. {
  1955. EXPECT_TRUE(samples[curveMode][pulse]
  1956. <= samples[curveMode][pulse - 1U]);
  1957. }
  1958. EXPECT_TRUE((samples[curveMode][0]
  1959. > samples[curveMode][pulseCounts[countIndex] - 1U]
  1960. ? samples[curveMode][0]
  1961. - samples[curveMode][pulseCounts[countIndex] - 1U]
  1962. : samples[curveMode][pulseCounts[countIndex] - 1U]
  1963. - samples[curveMode][0]) <= 2UL);
  1964. EXPECT_U(0U, PlsrTestPulseIsActive());
  1965. PlsrPoll1ms();
  1966. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  1967. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  1968. EXPECT_I((long)pulseCounts[countIndex], ReadPosition());
  1969. EXPECT_TRUE(durationNs[curveMode]
  1970. > previousDurationNs[curveMode]);
  1971. previousDurationNs[curveMode] = durationNs[curveMode];
  1972. expectedPeakHz = IntegerSquareRoot64(
  1973. 10000ULL + (uint64_t)pulseCounts[countIndex] * 1000ULL);
  1974. expectedDurationNs =
  1975. (uint64_t)2U * (expectedPeakHz - 100UL) * 1000000ULL;
  1976. toleranceNs = expectedDurationNs / 8ULL + 2000000ULL;
  1977. EXPECT_TRUE(UnsignedDifference64(durationNs[curveMode],
  1978. expectedDurationNs)
  1979. <= toleranceNs);
  1980. }
  1981. toleranceNs = durationNs[0] / 50ULL + 1000000ULL;
  1982. EXPECT_TRUE(UnsignedDifference64(durationNs[0], durationNs[1])
  1983. <= toleranceNs);
  1984. EXPECT_TRUE(UnsignedDifference64(durationNs[1], durationNs[2])
  1985. <= toleranceNs);
  1986. if (pulseCounts[countIndex] >= 10U)
  1987. {
  1988. linearDiffersFromSmooth = 0U;
  1989. smoothDiffersFromSine = 0U;
  1990. for (pulse = 0U; pulse < pulseCounts[countIndex]; pulse++)
  1991. {
  1992. if (samples[0][pulse] != samples[1][pulse])
  1993. {
  1994. linearDiffersFromSmooth = 1U;
  1995. }
  1996. if (samples[1][pulse] != samples[2][pulse])
  1997. {
  1998. smoothDiffersFromSine = 1U;
  1999. }
  2000. }
  2001. EXPECT_U(1U, linearDiffersFromSmooth);
  2002. if (linearDiffersFromSmooth != 0U)
  2003. {
  2004. anyLinearDiffersFromSmooth = 1U;
  2005. }
  2006. if (smoothDiffersFromSine != 0U)
  2007. {
  2008. anySmoothDiffersFromSine = 1U;
  2009. }
  2010. }
  2011. }
  2012. EXPECT_U(1U, anyLinearDiffersFromSmooth);
  2013. EXPECT_U(1U, anySmoothDiffersFromSine);
  2014. }
  2015. static void TestShortProfile258IsFullyPrecomputed(void)
  2016. {
  2017. uint16_t curveMode;
  2018. for (curveMode = 0U; curveMode <= 2U; curveMode++)
  2019. {
  2020. ResetCore();
  2021. ConfigureCommon(curveMode, PLSR_POSITION_RELATIVE, 1U,
  2022. PLSR_SEND_COMPLETE, 100000UL, 1000UL, 1000UL,
  2023. 100U, 100U);
  2024. EXPECT_U(PLSR_MB_OK,
  2025. SetSegment(1U, 100000UL, 258L,
  2026. PLSR_EXT_OR_COMPLETE, 0U, 0U, 0U));
  2027. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2028. EXPECT_U(256U, PlsrTestProfileQueueCount());
  2029. EXPECT_U(0UL, PlsrTestProfileQueueReadIndex());
  2030. EXPECT_U(256UL, PlsrTestProfileQueueWriteIndex());
  2031. EXPECT_U(258U, PlsrTestProfileProducerNextPeriod());
  2032. PlsrTestEmitPulses(258UL);
  2033. EXPECT_U(0U, PlsrTestPulseIsActive());
  2034. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2035. EXPECT_U(256UL, PlsrTestProfileQueueReadIndex());
  2036. EXPECT_U(256UL, PlsrTestProfileQueueWriteIndex());
  2037. EXPECT_I(258L, ReadPosition());
  2038. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2039. PlsrPoll1ms();
  2040. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2041. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2042. }
  2043. }
  2044. static void TestShortFinalDeceleratesWithoutPoll(void)
  2045. {
  2046. uint16_t curveMode;
  2047. unsigned int pulse;
  2048. uint32_t previousFrequencyHz;
  2049. uint32_t currentFrequencyHz;
  2050. uint64_t durationNs;
  2051. for (curveMode = 0U; curveMode <= 2U; curveMode++)
  2052. {
  2053. ResetCore();
  2054. ConfigureCommon(curveMode, PLSR_POSITION_RELATIVE, 1U,
  2055. PLSR_SEND_COMPLETE, 100000UL, 100000UL, 100UL,
  2056. 0U, 1000U);
  2057. EXPECT_U(PLSR_MB_OK,
  2058. SetSegment(1U, 100000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2059. 0U, 0U, 0U));
  2060. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2061. previousFrequencyHz = PlsrTestOutputFrequency();
  2062. EXPECT_TRUE(previousFrequencyHz >= 99990UL);
  2063. EXPECT_TRUE(previousFrequencyHz <= 100000UL);
  2064. durationNs = PulsePeriodNs(previousFrequencyHz);
  2065. for (pulse = 1U; pulse < 10U; pulse++)
  2066. {
  2067. PlsrTestEmitPulses(1UL);
  2068. EXPECT_U(1U, PlsrTestPulseIsActive());
  2069. currentFrequencyHz = PlsrTestOutputFrequency();
  2070. EXPECT_TRUE(currentFrequencyHz <= previousFrequencyHz);
  2071. EXPECT_TRUE(currentFrequencyHz >= 99990UL);
  2072. durationNs += PulsePeriodNs(currentFrequencyHz);
  2073. previousFrequencyHz = currentFrequencyHz;
  2074. if (((pulse + 1UL) % 100UL) == 0UL)
  2075. {
  2076. PlsrPoll1ms();
  2077. }
  2078. }
  2079. EXPECT_TRUE(durationNs >= 99990ULL);
  2080. EXPECT_TRUE(durationNs <= 100010ULL);
  2081. PlsrTestEmitPulses(1UL);
  2082. EXPECT_U(0U, PlsrTestPulseIsActive());
  2083. PlsrPoll1ms();
  2084. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2085. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2086. EXPECT_I(10L, ReadPosition());
  2087. }
  2088. }
  2089. static void ExpectCompletedDiagnostic(uint32_t pulseCount);
  2090. static void TestZeroToMaximumRampKeepsConfiguredDuration(void)
  2091. {
  2092. uint16_t curveMode;
  2093. uint32_t firstFrequencyHz[3];
  2094. uint32_t frequencyHz;
  2095. uint32_t pulseAccumulator;
  2096. uint32_t pulsesThisMillisecond;
  2097. uint32_t emittedPulses;
  2098. uint32_t tick;
  2099. const uint32_t pulseCount = 3000UL;
  2100. for (curveMode = 0U; curveMode <= 2U; curveMode++)
  2101. {
  2102. ResetCore();
  2103. ConfigureCommon(curveMode, PLSR_POSITION_RELATIVE, 1U,
  2104. PLSR_SEND_COMPLETE, 100000UL, 0UL, 100000UL,
  2105. 20U, 0U);
  2106. EXPECT_U(PLSR_MB_OK,
  2107. SetSegment(1U, 100000UL, (int32_t)pulseCount,
  2108. PLSR_EXT_OR_COMPLETE, 0U, 0U, 0U));
  2109. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2110. EXPECT_U(0U, PlsrTestPulseIsActive());
  2111. pulseAccumulator = 0UL;
  2112. emittedPulses = 0UL;
  2113. for (tick = 1UL; tick <= 20UL; tick++)
  2114. {
  2115. PlsrPoll1ms();
  2116. EXPECT_U(1U, PlsrTestPulseIsActive());
  2117. frequencyHz = PlsrTestOutputFrequency();
  2118. EXPECT_TRUE(frequencyHz != 0UL);
  2119. EXPECT_TRUE(frequencyHz <= 100000UL);
  2120. if (tick == 1UL)
  2121. {
  2122. firstFrequencyHz[curveMode] = frequencyHz;
  2123. }
  2124. if (tick < 20UL)
  2125. {
  2126. EXPECT_U(PLSR_STATUS_ACCELERATING, ReadStatus());
  2127. }
  2128. else
  2129. {
  2130. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  2131. }
  2132. pulseAccumulator += frequencyHz;
  2133. pulsesThisMillisecond = pulseAccumulator / 1000UL;
  2134. pulseAccumulator %= 1000UL;
  2135. PlsrTestEmitPulses(pulsesThisMillisecond);
  2136. emittedPulses += pulsesThisMillisecond;
  2137. }
  2138. EXPECT_TRUE(emittedPulses < pulseCount);
  2139. PlsrTestEmitPulses(pulseCount - emittedPulses);
  2140. EXPECT_U(0U, PlsrTestPulseIsActive());
  2141. PlsrPoll1ms();
  2142. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2143. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2144. EXPECT_I((long)pulseCount, ReadPosition());
  2145. ExpectCompletedDiagnostic(pulseCount);
  2146. }
  2147. EXPECT_TRUE(firstFrequencyHz[0] > firstFrequencyHz[1]);
  2148. EXPECT_TRUE(firstFrequencyHz[1] > firstFrequencyHz[2]);
  2149. }
  2150. typedef struct
  2151. {
  2152. uint32_t emittedPulses;
  2153. uint32_t elapsedMs;
  2154. uint32_t maximumFrequencyHz;
  2155. uint32_t finalFrequencyHz;
  2156. } REAL_TIME_PROFILE_STATS;
  2157. static void RunProfileAtOneMillisecondCadence(
  2158. uint32_t pulseCount,
  2159. REAL_TIME_PROFILE_STATS *stats)
  2160. {
  2161. uint32_t pulseAccumulator = 0UL;
  2162. uint32_t frequencyHz;
  2163. uint32_t pulsesThisMillisecond;
  2164. uint32_t remainingPulses;
  2165. stats->emittedPulses = 0UL;
  2166. stats->elapsedMs = 0UL;
  2167. stats->maximumFrequencyHz = 0UL;
  2168. stats->finalFrequencyHz = 0UL;
  2169. while ((stats->emittedPulses < pulseCount)
  2170. && (PlsrTestPulseIsActive() != 0U)
  2171. && (stats->elapsedMs < 2000UL))
  2172. {
  2173. PlsrPoll1ms();
  2174. stats->elapsedMs++;
  2175. if (PlsrTestPulseIsActive() == 0U)
  2176. {
  2177. break;
  2178. }
  2179. frequencyHz = PlsrTestOutputFrequency();
  2180. EXPECT_TRUE(frequencyHz != 0UL);
  2181. if (frequencyHz > stats->maximumFrequencyHz)
  2182. {
  2183. stats->maximumFrequencyHz = frequencyHz;
  2184. }
  2185. stats->finalFrequencyHz = frequencyHz;
  2186. pulseAccumulator += frequencyHz;
  2187. pulsesThisMillisecond = pulseAccumulator / 1000UL;
  2188. pulseAccumulator %= 1000UL;
  2189. remainingPulses = pulseCount - stats->emittedPulses;
  2190. if (pulsesThisMillisecond > remainingPulses)
  2191. {
  2192. pulsesThisMillisecond = remainingPulses;
  2193. }
  2194. PlsrTestEmitPulses(pulsesThisMillisecond);
  2195. stats->emittedPulses += pulsesThisMillisecond;
  2196. }
  2197. PlsrPoll1ms();
  2198. EXPECT_U(pulseCount, stats->emittedPulses);
  2199. EXPECT_U(0U, PlsrTestPulseIsActive());
  2200. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2201. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2202. EXPECT_I((long)pulseCount, ReadPosition());
  2203. }
  2204. static void ExpectCompletedDiagnostic(uint32_t pulseCount)
  2205. {
  2206. uint16_t flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  2207. EXPECT_U(pulseCount, ReadU32(PLSR_DIAG_EXPECTED_COUNT_ADDRESS));
  2208. EXPECT_U(pulseCount, ReadU32(PLSR_DIAG_OBSERVED_COUNT_ADDRESS));
  2209. EXPECT_I(0L, ReadI32(PLSR_DIAG_COUNT_ERROR_ADDRESS));
  2210. EXPECT_U(PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS
  2211. | PLSR_DIAG_FREQUENCY_CHECKED | PLSR_DIAG_FREQUENCY_PASS
  2212. | PLSR_DIAG_CURVE_CHECKED | PLSR_DIAG_CURVE_PASS,
  2213. flags & (PLSR_DIAG_COUNT_CHECKED | PLSR_DIAG_COUNT_PASS
  2214. | PLSR_DIAG_FREQUENCY_CHECKED
  2215. | PLSR_DIAG_FREQUENCY_PASS
  2216. | PLSR_DIAG_CURVE_CHECKED | PLSR_DIAG_CURVE_PASS));
  2217. EXPECT_U(0U, flags & PLSR_DIAG_FAULT_LATCHED);
  2218. EXPECT_U(PLSR_DIAG_REASON_NONE, ReadWord(PLSR_DIAG_REASON_ADDRESS));
  2219. }
  2220. static void TestLongProfile259UsesMillisecondRamp(void)
  2221. {
  2222. REAL_TIME_PROFILE_STATS stats;
  2223. ResetCore();
  2224. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2225. 100000UL, 1000UL, 1000UL, 100U, 100U);
  2226. EXPECT_U(PLSR_MB_OK,
  2227. SetSegment(1U, 100000UL, 259L, PLSR_EXT_OR_COMPLETE,
  2228. 0U, 0U, 0U));
  2229. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2230. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2231. EXPECT_U(0UL, PlsrTestProfileQueueReadIndex());
  2232. EXPECT_U(0UL, PlsrTestProfileQueueWriteIndex());
  2233. RunProfileAtOneMillisecondCadence(259UL, &stats);
  2234. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2235. EXPECT_TRUE(stats.elapsedMs > 1UL);
  2236. ExpectCompletedDiagnostic(259UL);
  2237. }
  2238. static void TestMaximumProfileOneMillisecondCadence(void)
  2239. {
  2240. REAL_TIME_PROFILE_STATS stats;
  2241. uint16_t curveMode;
  2242. for (curveMode = 0U; curveMode <= 2U; curveMode++)
  2243. {
  2244. ResetCore();
  2245. ConfigureCommon(curveMode, PLSR_POSITION_RELATIVE, 1U,
  2246. PLSR_SEND_COMPLETE, 100000UL, 1000UL, 1000UL,
  2247. 100U, 100U);
  2248. EXPECT_U(PLSR_MB_OK,
  2249. SetSegment(1U, 100000UL, 65535L,
  2250. PLSR_EXT_OR_COMPLETE, 0U, 0U, 0U));
  2251. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2252. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2253. EXPECT_U(0UL, PlsrTestProfileQueueReadIndex());
  2254. EXPECT_U(0UL, PlsrTestProfileQueueWriteIndex());
  2255. RunProfileAtOneMillisecondCadence(65535UL, &stats);
  2256. EXPECT_TRUE(stats.maximumFrequencyHz >= 99990UL);
  2257. EXPECT_U(1000UL, stats.finalFrequencyHz);
  2258. ExpectCompletedDiagnostic(65535UL);
  2259. }
  2260. }
  2261. static void TestShortProfileTimerFailure(void)
  2262. {
  2263. ResetCore();
  2264. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2265. 1000UL, 100UL, 100UL, 1000U, 1000U);
  2266. EXPECT_U(PLSR_MB_OK,
  2267. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2268. 0U, 0U, 0U));
  2269. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2270. PlsrTestFailNextFrequencyAtUpdate();
  2271. PlsrTestEmitPulses(1UL);
  2272. EXPECT_U(0U, PlsrTestPulseIsActive());
  2273. PlsrPoll1ms();
  2274. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  2275. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  2276. EXPECT_I(1L, ReadPosition());
  2277. ExpectDiagnosticInterrupted(10UL, 1UL);
  2278. }
  2279. static void TestStopImmediatelyAfterSubsequentHandoff(void)
  2280. {
  2281. unsigned int tick;
  2282. ResetCore();
  2283. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2284. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL,
  2285. 0U, 100U);
  2286. EXPECT_U(PLSR_MB_OK,
  2287. SetSegment(1U, 1000UL, 3L, PLSR_EXT_OR_COMPLETE,
  2288. 0U, 0U, 0U));
  2289. EXPECT_U(PLSR_MB_OK,
  2290. SetSegment(2U, 2000UL, 20L, PLSR_EXT_OR_COMPLETE,
  2291. 0U, 0U, 0U));
  2292. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2293. PlsrTestEmitPulses(3UL);
  2294. EXPECT_U(2U, ReadCurrentSegment());
  2295. EXPECT_TRUE(PlsrTestOutputFrequency() <= 2000UL);
  2296. EXPECT_TRUE(PlsrTestOutputFrequency() > 100UL);
  2297. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  2298. PlsrPoll1ms();
  2299. PlsrTestEmitPulses(1UL);
  2300. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  2301. EXPECT_U(1U, PlsrTestPulseIsActive());
  2302. EXPECT_TRUE(PlsrTestOutputFrequency() < 2000UL);
  2303. EXPECT_TRUE(PlsrTestOutputFrequency() > 100UL);
  2304. for (tick = 1U; tick < 190U; tick++)
  2305. {
  2306. PlsrPoll1ms();
  2307. }
  2308. while (PlsrTestPulseIsActive() != 0U)
  2309. {
  2310. PlsrTestEmitPulses(1UL);
  2311. }
  2312. PlsrPoll1ms();
  2313. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  2314. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2315. EXPECT_I(7L, ReadPosition());
  2316. }
  2317. static void TestShortProfileZeroSpeedEdges(void)
  2318. {
  2319. unsigned int tick;
  2320. ResetCore();
  2321. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2322. 1000UL, 0UL, 0UL, 1000U, 1000U);
  2323. EXPECT_U(PLSR_MB_OK,
  2324. SetSegment(1U, 1000UL, 2L, PLSR_EXT_OR_COMPLETE,
  2325. 0U, 0U, 0U));
  2326. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2327. EXPECT_U(1U, PlsrTestPulseIsActive());
  2328. EXPECT_TRUE(PlsrTestOutputFrequency() > 0UL);
  2329. PlsrTestEmitPulses(1UL);
  2330. EXPECT_U(1U, PlsrTestPulseIsActive());
  2331. EXPECT_TRUE(PlsrTestOutputFrequency() > 0UL);
  2332. PlsrTestEmitPulses(1UL);
  2333. EXPECT_U(0U, PlsrTestPulseIsActive());
  2334. PlsrPoll1ms();
  2335. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2336. EXPECT_I(2L, ReadPosition());
  2337. ResetCore();
  2338. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2339. 1000UL, 0UL, 0UL, 1000U, 1000U);
  2340. EXPECT_U(PLSR_MB_OK,
  2341. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2342. 0U, 0U, 0U));
  2343. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2344. for (tick = 0U; (tick < 10U) && (PlsrTestPulseIsActive() == 0U);
  2345. tick++)
  2346. {
  2347. PlsrPoll1ms();
  2348. }
  2349. EXPECT_U(1U, PlsrTestPulseIsActive());
  2350. PlsrTestEmitPulses(1UL);
  2351. PlsrPoll1ms();
  2352. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2353. EXPECT_I(1L, ReadPosition());
  2354. }
  2355. static void TestShortProfileDynamicRetarget(void)
  2356. {
  2357. unsigned int tick;
  2358. uint32_t frequencyAfterRetarget;
  2359. int32_t positionBeforeStop;
  2360. int32_t positionAfterStop;
  2361. ResetCore();
  2362. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2363. 1000UL, 100UL, 100UL, 1000U, 1000U);
  2364. EXPECT_U(PLSR_MB_OK,
  2365. SetSegment(1U, 1000UL, 50L, PLSR_EXT_OR_COMPLETE,
  2366. 0U, 0U, 0U));
  2367. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2368. PlsrTestEmitPulses(3UL);
  2369. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  2370. PlsrPoll1ms();
  2371. PlsrTestEmitPulses(1UL);
  2372. frequencyAfterRetarget = PlsrTestOutputFrequency();
  2373. PlsrTestEmitPulses(1UL);
  2374. EXPECT_TRUE(PlsrTestOutputFrequency() > 0UL);
  2375. for (tick = 0U; tick < 10U; tick++)
  2376. {
  2377. PlsrPoll1ms();
  2378. PlsrTestEmitPulses(1UL);
  2379. }
  2380. EXPECT_TRUE(PlsrTestOutputFrequency() > frequencyAfterRetarget);
  2381. positionBeforeStop = ReadPosition();
  2382. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  2383. for (tick = 0U; tick < 2000U; tick++)
  2384. {
  2385. PlsrPoll1ms();
  2386. }
  2387. while (PlsrTestPulseIsActive() != 0U)
  2388. {
  2389. PlsrTestEmitPulses(1UL);
  2390. }
  2391. PlsrPoll1ms();
  2392. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  2393. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2394. positionAfterStop = ReadPosition();
  2395. EXPECT_TRUE(positionAfterStop > positionBeforeStop);
  2396. EXPECT_TRUE(positionAfterStop <= positionBeforeStop + 3L);
  2397. }
  2398. static void TestShortProfileExtCut(void)
  2399. {
  2400. uint32_t frequencyBeforeCut;
  2401. ResetCore();
  2402. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2403. 1000UL, 100UL, 100UL, 1000U, 1000U);
  2404. EXPECT_U(PLSR_MB_OK,
  2405. SetSegment(1U, 1000UL, 50L, PLSR_EXT_SIGNAL,
  2406. 0U, 0U, 0U));
  2407. PlsrTestSetInput(0U, 0U);
  2408. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2409. PlsrTestEmitPulses(3UL);
  2410. frequencyBeforeCut = PlsrTestOutputFrequency();
  2411. PlsrTestSetInput(0U, 1U);
  2412. PlsrPoll1ms();
  2413. PlsrTestEmitPulses(1UL);
  2414. EXPECT_U(0U, PlsrTestPulseIsActive());
  2415. EXPECT_U(0UL, PlsrTestOutputFrequency());
  2416. PlsrPoll1ms();
  2417. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2418. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2419. EXPECT_I(4L, ReadPosition());
  2420. EXPECT_TRUE(frequencyBeforeCut > 100UL);
  2421. }
  2422. static void TestCurrentFrequencyIsDynamic(void)
  2423. {
  2424. ResetCore();
  2425. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2426. 1000UL, 1000UL, 100UL, 0U, 0U);
  2427. EXPECT_U(PLSR_MB_OK,
  2428. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  2429. 0U, 0U, 0U));
  2430. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2431. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2432. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  2433. PlsrPoll1ms();
  2434. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2435. PlsrTestEmitPulses(1UL);
  2436. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2437. EXPECT_U(1000UL, ReadFrequency());
  2438. PlsrTestEmitPulses(1UL);
  2439. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  2440. EXPECT_U(2000UL, ReadFrequency());
  2441. EXPECT_U(PLSR_MB_OK, WriteI32(0x1102U, 1L));
  2442. PlsrTestEmitPulses(2UL);
  2443. EXPECT_U(1U, PlsrTestPulseIsActive());
  2444. StopAndSettle();
  2445. }
  2446. static void StartMaximumShortProfile(void)
  2447. {
  2448. ResetCore();
  2449. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2450. 100000UL, 1000UL, 1000UL, 100U, 100U);
  2451. EXPECT_U(PLSR_MB_OK,
  2452. SetSegment(1U, 100000UL, 258L, PLSR_EXT_OR_COMPLETE,
  2453. 0U, 0U, 0U));
  2454. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2455. EXPECT_U(256U, PlsrTestProfileQueueCount());
  2456. }
  2457. static void TestProfileQueueStaleDoesNotAdvance(void)
  2458. {
  2459. uint32_t readIndex;
  2460. uint32_t headFrequencyHz;
  2461. uint16_t producerPeriod;
  2462. uint16_t activePeriod;
  2463. StartMaximumShortProfile();
  2464. readIndex = PlsrTestProfileQueueReadIndex();
  2465. headFrequencyHz = PlsrTestProfileQueueHeadFrequency();
  2466. producerPeriod = PlsrTestProfileProducerNextPeriod();
  2467. activePeriod = PlsrTestActiveProfileNextPeriod();
  2468. EXPECT_TRUE(headFrequencyHz != 0UL);
  2469. PlsrTestStaleNextFrequencyAtUpdate();
  2470. PlsrTestEmitPulses(1UL);
  2471. EXPECT_U(1U, PlsrTestPulseIsActive());
  2472. EXPECT_U(readIndex, PlsrTestProfileQueueReadIndex());
  2473. EXPECT_U(256U, PlsrTestProfileQueueCount());
  2474. EXPECT_U(headFrequencyHz, PlsrTestProfileQueueHeadFrequency());
  2475. EXPECT_U(producerPeriod, PlsrTestProfileProducerNextPeriod());
  2476. EXPECT_U(activePeriod, PlsrTestActiveProfileNextPeriod());
  2477. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2478. PlsrTestEmitPulses(1UL);
  2479. EXPECT_U(readIndex + 1UL, PlsrTestProfileQueueReadIndex());
  2480. EXPECT_U(255U, PlsrTestProfileQueueCount());
  2481. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2482. }
  2483. static void TestProfileQueueRetargetInvalidatesGeneration(void)
  2484. {
  2485. uint32_t generationBefore;
  2486. uint32_t generationAfterWrite;
  2487. StartMaximumShortProfile();
  2488. generationBefore = PlsrTestProfileQueueGeneration();
  2489. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  2490. generationAfterWrite = PlsrTestProfileQueueGeneration();
  2491. EXPECT_TRUE(generationAfterWrite != generationBefore);
  2492. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2493. EXPECT_U(0UL, PlsrTestProfileQueueReadIndex());
  2494. EXPECT_U(0UL, PlsrTestProfileQueueWriteIndex());
  2495. PlsrPoll1ms();
  2496. EXPECT_TRUE(PlsrTestProfileQueueGeneration() != generationAfterWrite);
  2497. EXPECT_U(0U, PlsrTestProfileQueueCount());
  2498. EXPECT_U(1U, PlsrTestPulseIsActive());
  2499. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2500. }
  2501. static void TestFinalPulseGatesBeforeDiagnosticFinish(void)
  2502. {
  2503. uint32_t gateEvent;
  2504. uint32_t diagnosticEvent;
  2505. ResetCore();
  2506. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2507. 1000UL, 1000UL, 1000UL, 0U, 0U);
  2508. EXPECT_U(PLSR_MB_OK,
  2509. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2510. 0U, 0U, 0U));
  2511. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2512. PlsrTestEmitPulses(1UL);
  2513. gateEvent = PlsrTestLastGateEvent();
  2514. diagnosticEvent = PlsrTestLastDiagnosticFinishEvent();
  2515. EXPECT_TRUE(gateEvent != 0UL);
  2516. EXPECT_U(gateEvent + 1UL, diagnosticEvent);
  2517. EXPECT_U(0U, PlsrTestPulseIsActive());
  2518. EXPECT_U(PLSR_DIAG_COUNT_PASS,
  2519. ReadWord(PLSR_DIAG_FLAGS_ADDRESS) & PLSR_DIAG_COUNT_PASS);
  2520. }
  2521. static void TestDeferredFrequencyRetriesAfterStale(void)
  2522. {
  2523. ResetCore();
  2524. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2525. 1000UL, 1000UL, 100UL, 0U, 0U);
  2526. EXPECT_U(PLSR_MB_OK,
  2527. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  2528. 0U, 0U, 0U));
  2529. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2530. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  2531. PlsrPoll1ms();
  2532. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2533. EXPECT_U(1000UL, PlsrTestQueuedFrequency());
  2534. PlsrTestStaleNextFrequencyAtUpdate();
  2535. PlsrTestEmitPulses(1UL);
  2536. EXPECT_U(1U, PlsrTestPulseIsActive());
  2537. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2538. EXPECT_U(1000UL, PlsrTestQueuedFrequency());
  2539. EXPECT_I(1L, ReadPosition());
  2540. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2541. PlsrTestEmitPulses(1UL);
  2542. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2543. EXPECT_U(2000UL, PlsrTestQueuedFrequency());
  2544. EXPECT_I(2L, ReadPosition());
  2545. PlsrTestEmitPulses(1UL);
  2546. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  2547. EXPECT_U(2000UL, PlsrTestQueuedFrequency());
  2548. EXPECT_I(3L, ReadPosition());
  2549. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2550. StopAndSettle();
  2551. }
  2552. static void TestShortProfileRetriesSameSampleAfterStale(void)
  2553. {
  2554. uint32_t expectedThirdFrequencyHz;
  2555. uint32_t expectedFourthFrequencyHz;
  2556. ResetCore();
  2557. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2558. 1000UL, 100UL, 100UL, 1000U, 1000U);
  2559. EXPECT_U(PLSR_MB_OK,
  2560. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2561. 0U, 0U, 0U));
  2562. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2563. PlsrTestEmitPulses(1UL);
  2564. expectedThirdFrequencyHz = PlsrTestQueuedFrequency();
  2565. PlsrTestEmitPulses(1UL);
  2566. expectedFourthFrequencyHz = PlsrTestQueuedFrequency();
  2567. EXPECT_TRUE(expectedThirdFrequencyHz != expectedFourthFrequencyHz);
  2568. ResetCore();
  2569. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2570. 1000UL, 100UL, 100UL, 1000U, 1000U);
  2571. EXPECT_U(PLSR_MB_OK,
  2572. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2573. 0U, 0U, 0U));
  2574. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2575. PlsrTestStaleNextFrequencyAtUpdate();
  2576. PlsrTestEmitPulses(1UL);
  2577. EXPECT_U(1U, PlsrTestPulseIsActive());
  2578. EXPECT_U(PlsrTestOutputFrequency(), PlsrTestQueuedFrequency());
  2579. EXPECT_I(1L, ReadPosition());
  2580. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2581. PlsrTestEmitPulses(1UL);
  2582. EXPECT_U(expectedThirdFrequencyHz, PlsrTestQueuedFrequency());
  2583. EXPECT_I(2L, ReadPosition());
  2584. PlsrTestEmitPulses(1UL);
  2585. EXPECT_U(expectedThirdFrequencyHz, PlsrTestOutputFrequency());
  2586. EXPECT_U(expectedFourthFrequencyHz, PlsrTestQueuedFrequency());
  2587. EXPECT_I(3L, ReadPosition());
  2588. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2589. PlsrTestEmitPulses(7UL);
  2590. EXPECT_U(0U, PlsrTestPulseIsActive());
  2591. EXPECT_I(10L, ReadPosition());
  2592. PlsrPoll1ms();
  2593. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2594. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2595. }
  2596. static void TestPollMailboxDefersPlatformFailure(void)
  2597. {
  2598. ResetCore();
  2599. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2600. 1000UL, 1000UL, 100UL, 0U, 0U);
  2601. EXPECT_U(PLSR_MB_OK,
  2602. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  2603. 0U, 0U, 0U));
  2604. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2605. PlsrTestFailNextFrequencyAtUpdate();
  2606. EXPECT_U(PLSR_MB_OK, WriteU32(0x1100U, 2000UL));
  2607. PlsrPoll1ms();
  2608. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  2609. EXPECT_U(1U, PlsrTestPulseIsActive());
  2610. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2611. PlsrTestEmitPulses(1UL);
  2612. EXPECT_U(0U, PlsrTestPulseIsActive());
  2613. PlsrPoll1ms();
  2614. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  2615. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  2616. EXPECT_I(1L, ReadPosition());
  2617. }
  2618. static void TestFutureSegmentFrequencyAppliesOnArrival(void)
  2619. {
  2620. ResetCore();
  2621. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U, PLSR_SEND_COMPLETE,
  2622. 1000UL, 1000UL, 100UL, 0U, 0U);
  2623. EXPECT_U(PLSR_MB_OK,
  2624. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2625. 0U, 0U, 0U));
  2626. EXPECT_U(PLSR_MB_OK,
  2627. SetSegment(2U, 3000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2628. 0U, 0U, 0U));
  2629. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2630. EXPECT_U(PLSR_MB_OK, WriteU32(0x1110U, 5000UL));
  2631. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2632. PlsrTestEmitPulses(1UL);
  2633. PlsrPoll1ms();
  2634. EXPECT_U(2U, ReadCurrentSegment());
  2635. EXPECT_U(5000UL, PlsrTestOutputFrequency());
  2636. EXPECT_U(5000UL, ReadFrequency());
  2637. StopAndSettle();
  2638. }
  2639. static void TestSubsequentFutureFrequencyRebuildsHandoff(void)
  2640. {
  2641. ResetCore();
  2642. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2643. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL, 0U, 0U);
  2644. EXPECT_U(PLSR_MB_OK,
  2645. SetSegment(1U, 1000UL, 3L, PLSR_EXT_OR_COMPLETE,
  2646. 0U, 0U, 0U));
  2647. EXPECT_U(PLSR_MB_OK,
  2648. SetSegment(2U, 2000UL, 4L, PLSR_EXT_OR_COMPLETE,
  2649. 0U, 0U, 0U));
  2650. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2651. EXPECT_U(PLSR_MB_OK, WriteU32(0x1110U, 5000UL));
  2652. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2653. PlsrTestEmitPulses(3UL);
  2654. EXPECT_U(1U, PlsrTestPulseIsActive());
  2655. EXPECT_U(2U, ReadCurrentSegment());
  2656. EXPECT_U(5000UL, PlsrTestOutputFrequency());
  2657. EXPECT_U(5000UL, ReadFrequency());
  2658. PlsrTestEmitPulses(4UL);
  2659. EXPECT_U(0U, PlsrTestPulseIsActive());
  2660. PlsrPoll1ms();
  2661. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2662. EXPECT_I(7L, ReadPosition());
  2663. }
  2664. static void TestFutureFrequencyRaceAtLastPulse(void)
  2665. {
  2666. ResetCore();
  2667. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2668. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL, 0U, 0U);
  2669. EXPECT_U(PLSR_MB_OK,
  2670. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2671. 0U, 0U, 0U));
  2672. EXPECT_U(PLSR_MB_OK,
  2673. SetSegment(2U, 2000UL, 4L, PLSR_EXT_OR_COMPLETE,
  2674. 0U, 0U, 0U));
  2675. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2676. PlsrTestEmitPulseOnCriticalExit();
  2677. EXPECT_U(PLSR_MB_OK, WriteU32(0x1110U, 5000UL));
  2678. EXPECT_U(1U, PlsrTestPulseIsActive());
  2679. EXPECT_U(2U, ReadCurrentSegment());
  2680. EXPECT_U(5000UL, PlsrTestOutputFrequency());
  2681. EXPECT_I(1L, ReadPosition());
  2682. PlsrTestEmitPulses(4UL);
  2683. EXPECT_U(0U, PlsrTestPulseIsActive());
  2684. PlsrPoll1ms();
  2685. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2686. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2687. EXPECT_I(5L, ReadPosition());
  2688. }
  2689. static void TestLatchedUpdateDrainsBeforeFutureFrequencyCommit(void)
  2690. {
  2691. ResetCore();
  2692. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2693. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL, 0U, 0U);
  2694. EXPECT_U(PLSR_MB_OK,
  2695. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2696. 0U, 0U, 0U));
  2697. EXPECT_U(PLSR_MB_OK,
  2698. SetSegment(2U, 2000UL, 4L, PLSR_EXT_OR_COMPLETE,
  2699. 0U, 0U, 0U));
  2700. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2701. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2702. EXPECT_U(2000UL, PlsrTestQueuedFrequency());
  2703. /* The physical edge latches 2000 Hz while interrupts are masked by the
  2704. configuration commit. The ISR must consume that old handoff before
  2705. the new 5000 Hz preload replaces it. */
  2706. PlsrTestLatchPulseOnCriticalEntry();
  2707. EXPECT_U(PLSR_MB_OK, WriteU32(0x1110U, 5000UL));
  2708. EXPECT_U(2U, ReadCurrentSegment());
  2709. EXPECT_I(1L, ReadPosition());
  2710. EXPECT_U(2000UL, ReadFrequency());
  2711. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  2712. PlsrPoll1ms();
  2713. EXPECT_U(5000UL, PlsrTestQueuedFrequency());
  2714. PlsrTestEmitPulses(1UL);
  2715. EXPECT_U(2U, ReadCurrentSegment());
  2716. EXPECT_I(2L, ReadPosition());
  2717. EXPECT_U(5000UL, ReadFrequency());
  2718. EXPECT_U(5000UL, PlsrTestOutputFrequency());
  2719. PlsrTestEmitPulses(3UL);
  2720. EXPECT_U(0U, PlsrTestPulseIsActive());
  2721. PlsrPoll1ms();
  2722. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2723. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2724. EXPECT_I(5L, ReadPosition());
  2725. }
  2726. static void TestSubsequentHandoffHasNoPollGap(void)
  2727. {
  2728. ResetCore();
  2729. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2730. PLSR_SEND_SUBSEQUENT, 1000UL, 1000UL, 100UL, 0U, 0U);
  2731. EXPECT_U(PLSR_MB_OK,
  2732. SetSegment(1U, 1000UL, 3L, PLSR_EXT_OR_COMPLETE,
  2733. 0U, 0U, 0U));
  2734. EXPECT_U(PLSR_MB_OK,
  2735. SetSegment(2U, 2000UL, 4L, PLSR_EXT_OR_COMPLETE,
  2736. 0U, 0U, 0U));
  2737. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2738. PlsrTestEmitPulses(3UL);
  2739. EXPECT_U(1U, PlsrTestPulseIsActive());
  2740. EXPECT_U(2U, ReadCurrentSegment());
  2741. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  2742. EXPECT_I(3L, ReadPosition());
  2743. PlsrTestEmitPulses(4UL);
  2744. EXPECT_U(0U, PlsrTestPulseIsActive());
  2745. PlsrPoll1ms();
  2746. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2747. EXPECT_I(7L, ReadPosition());
  2748. }
  2749. static void TestThreeSinglePulseSubsequentWithoutPoll(void)
  2750. {
  2751. ResetCore();
  2752. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 3U,
  2753. PLSR_SEND_SUBSEQUENT, 3000UL, 1000UL, 3000UL,
  2754. 0U, 0U);
  2755. EXPECT_U(PLSR_MB_OK,
  2756. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2757. 0U, 0U, 0U));
  2758. EXPECT_U(PLSR_MB_OK,
  2759. SetSegment(2U, 2000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2760. 0U, 0U, 0U));
  2761. EXPECT_U(PLSR_MB_OK,
  2762. SetSegment(3U, 3000UL, 1L, PLSR_EXT_OR_COMPLETE,
  2763. 0U, 0U, 0U));
  2764. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2765. EXPECT_U(1000UL, PlsrTestOutputFrequency());
  2766. PlsrTestEmitPulses(1UL);
  2767. EXPECT_U(1U, PlsrTestPulseIsActive());
  2768. EXPECT_U(2U, ReadCurrentSegment());
  2769. EXPECT_U(2000UL, PlsrTestOutputFrequency());
  2770. EXPECT_I(1L, ReadPosition());
  2771. PlsrTestEmitPulses(1UL);
  2772. EXPECT_U(1U, PlsrTestPulseIsActive());
  2773. EXPECT_U(3U, ReadCurrentSegment());
  2774. EXPECT_U(3000UL, PlsrTestOutputFrequency());
  2775. EXPECT_I(2L, ReadPosition());
  2776. PlsrTestEmitPulses(1UL);
  2777. EXPECT_U(0U, PlsrTestPulseIsActive());
  2778. EXPECT_I(3L, ReadPosition());
  2779. PlsrPoll1ms();
  2780. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2781. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2782. }
  2783. static void ConfigureHandoffFailureCase(void)
  2784. {
  2785. ResetCore();
  2786. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 2U,
  2787. PLSR_SEND_SUBSEQUENT, 2000UL, 1000UL, 2000UL,
  2788. 0U, 0U);
  2789. EXPECT_U(PLSR_MB_OK,
  2790. SetSegment(1U, 1000UL, 3L, PLSR_EXT_OR_COMPLETE,
  2791. 0U, 0U, 0U));
  2792. EXPECT_U(PLSR_MB_OK,
  2793. SetSegment(2U, 2000UL, 2L, PLSR_EXT_OR_COMPLETE,
  2794. 0U, 0U, 0U));
  2795. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2796. }
  2797. static void ExpectHandoffTimerError(void)
  2798. {
  2799. EXPECT_U(0U, PlsrTestPulseIsActive());
  2800. PlsrPoll1ms();
  2801. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  2802. EXPECT_U(PLSR_ERROR_TIMER, ReadError());
  2803. EXPECT_U(0U, ReadCurrentSegment());
  2804. EXPECT_I(3L, ReadPosition());
  2805. }
  2806. static void TestHandoffQueueFailuresBecomeTimerError(void)
  2807. {
  2808. ConfigureHandoffFailureCase();
  2809. PlsrTestEmitPulses(1UL);
  2810. PlsrTestFailNextFrequencyAtUpdate();
  2811. PlsrTestEmitPulses(1UL);
  2812. EXPECT_U(1U, PlsrTestPulseIsActive());
  2813. PlsrTestEmitPulses(1UL);
  2814. ExpectHandoffTimerError();
  2815. ConfigureHandoffFailureCase();
  2816. PlsrTestEmitPulses(2UL);
  2817. PlsrTestFailNextFrequencyAtUpdate();
  2818. PlsrTestEmitPulses(1UL);
  2819. ExpectHandoffTimerError();
  2820. }
  2821. static void TestCommandStateRestrictions(void)
  2822. {
  2823. ResetCore();
  2824. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2825. 1000UL, 1000UL, 100UL, 0U, 0U);
  2826. EXPECT_U(PLSR_MB_OK,
  2827. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  2828. 0U, 0U, 0U));
  2829. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_STOP));
  2830. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  2831. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2832. EXPECT_U(PLSR_MB_DEVICE_BUSY, SendCommand(PLSR_COMMAND_START));
  2833. EXPECT_U(PLSR_MB_DEVICE_BUSY, SendCommand(PLSR_COMMAND_CLEAR));
  2834. EXPECT_U(PLSR_MB_DEVICE_BUSY, WriteWord(0x1000U, 1U));
  2835. EXPECT_U(PLSR_MB_DEVICE_BUSY, WriteWord(0x1001U, 1U));
  2836. EXPECT_U(PLSR_MB_OK, WriteWord(0x1002U, 1U));
  2837. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, SendCommand(3U));
  2838. StopAndSettle();
  2839. }
  2840. static void TestCommandMailboxStartSnapshotAndConflicts(void)
  2841. {
  2842. ResetCore();
  2843. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2844. 1000UL, 1000UL, 1000UL, 0U, 0U);
  2845. EXPECT_U(PLSR_MB_OK,
  2846. SetSegment(1U, 1000UL, 20L, PLSR_EXT_OR_COMPLETE,
  2847. 0U, 0U, 0U));
  2848. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_START));
  2849. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2850. EXPECT_U(0U, ReadCurrentSegment());
  2851. EXPECT_U(0UL, ReadFrequency());
  2852. EXPECT_U(0U, PlsrTestPulseIsActive());
  2853. EXPECT_I(0L, ReadPosition());
  2854. EXPECT_U(PLSR_MB_OK, WriteI32(0x1102U, 1L));
  2855. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_START));
  2856. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_STOP));
  2857. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_CLEAR));
  2858. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, QueueCommand(3U));
  2859. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2860. EXPECT_U(0U, PlsrTestPulseIsActive());
  2861. PlsrPoll1ms();
  2862. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  2863. EXPECT_U(1U, ReadCurrentSegment());
  2864. EXPECT_U(1U, PlsrTestPulseIsActive());
  2865. PlsrTestEmitPulses(1UL);
  2866. EXPECT_U(1U, PlsrTestPulseIsActive());
  2867. EXPECT_I(1L, ReadPosition());
  2868. StopAndSettle();
  2869. }
  2870. static void TestCommandMailboxStopAndClearAreDeferred(void)
  2871. {
  2872. ResetCore();
  2873. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2874. 1000UL, 1000UL, 1000UL, 0U, 0U);
  2875. EXPECT_U(PLSR_MB_OK,
  2876. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  2877. 0U, 0U, 0U));
  2878. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2879. PlsrTestEmitPulses(2UL);
  2880. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_STOP));
  2881. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_STOP));
  2882. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_CLEAR));
  2883. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_START));
  2884. EXPECT_U(PLSR_STATUS_RUNNING, ReadStatus());
  2885. EXPECT_U(1U, PlsrTestPulseIsActive());
  2886. EXPECT_I(2L, ReadPosition());
  2887. PlsrPoll1ms();
  2888. EXPECT_U(PLSR_STATUS_DECELERATING, ReadStatus());
  2889. EXPECT_U(1U, PlsrTestPulseIsActive());
  2890. PlsrTestEmitPulses(1UL);
  2891. PlsrPoll1ms();
  2892. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  2893. EXPECT_U(0U, PlsrTestPulseIsActive());
  2894. PlsrTestSetPosition(17L, 1U);
  2895. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_CLEAR));
  2896. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_CLEAR));
  2897. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_START));
  2898. EXPECT_U(PLSR_STATUS_STOPPED, ReadStatus());
  2899. EXPECT_I(17L, ReadPosition());
  2900. PlsrPoll1ms();
  2901. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2902. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2903. EXPECT_I(0L, ReadPosition());
  2904. }
  2905. static void TestCommandMailboxValidatesBeforeQueue(void)
  2906. {
  2907. ResetCore();
  2908. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2909. 1000UL, 1000UL, 1000UL, 0U, 0U);
  2910. EXPECT_U(PLSR_MB_OK,
  2911. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2912. 0U, 0U, 0U));
  2913. EXPECT_U(PLSR_MB_OK, WriteWord(0x100AU, 2U));
  2914. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, QueueCommand(PLSR_COMMAND_START));
  2915. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2916. EXPECT_U(0U, PlsrTestPulseIsActive());
  2917. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_STOP));
  2918. PlsrPoll1ms();
  2919. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2920. EXPECT_U(PLSR_MB_OK, WriteWord(0x100AU, 1U));
  2921. EXPECT_U(PLSR_MB_OK, WriteWord(0x1008U, PLSR_POSITION_ABSOLUTE));
  2922. PlsrTestSetPosition(3L, 0U);
  2923. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, QueueCommand(PLSR_COMMAND_START));
  2924. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2925. EXPECT_U(0U, PlsrTestPulseIsActive());
  2926. }
  2927. static void TestCommandMailboxStartFailureBecomesError(void)
  2928. {
  2929. uint16_t flags;
  2930. ResetCore();
  2931. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2932. 1000UL, 1000UL, 1000UL, 0U, 0U);
  2933. EXPECT_U(PLSR_MB_OK,
  2934. SetSegment(1U, 1000UL, 10L, PLSR_EXT_OR_COMPLETE,
  2935. 0U, 0U, 0U));
  2936. PlsrTestFailNextStart();
  2937. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_START));
  2938. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2939. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2940. EXPECT_U(0U, PlsrTestPulseIsActive());
  2941. PlsrPoll1ms();
  2942. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  2943. EXPECT_U(PLSR_ERROR_INVALID_RESOURCE, ReadError());
  2944. EXPECT_U(0U, ReadCurrentSegment());
  2945. EXPECT_U(0U, PlsrTestPulseIsActive());
  2946. flags = ReadWord(PLSR_DIAG_FLAGS_ADDRESS);
  2947. EXPECT_U(0U, flags & PLSR_DIAG_MONITORING_ACTIVE);
  2948. EXPECT_U(0U, flags & PLSR_DIAG_FAULT_LATCHED);
  2949. EXPECT_U(PLSR_MB_DEVICE_BUSY, QueueCommand(PLSR_COMMAND_START));
  2950. EXPECT_U(PLSR_MB_OK, QueueCommand(PLSR_COMMAND_CLEAR));
  2951. PlsrPoll1ms();
  2952. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2953. EXPECT_U(PLSR_ERROR_NONE, ReadError());
  2954. }
  2955. static void TestWaitSignalPositivePath(void)
  2956. {
  2957. ResetCore();
  2958. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2959. 1000UL, 1000UL, 100UL, 0U, 0U);
  2960. EXPECT_U(PLSR_MB_OK,
  2961. SetSegment(1U, 1000UL, 2L, PLSR_WAIT_SIGNAL,
  2962. 0U, 0U, 0U));
  2963. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2964. PlsrTestEmitPulses(2UL);
  2965. PlsrPoll1ms();
  2966. EXPECT_U(PLSR_STATUS_WAITING, ReadStatus());
  2967. PlsrTestSetInput(0U, 1U);
  2968. PlsrPoll1ms();
  2969. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2970. }
  2971. static void TestPersistenceAcrossReinit(void)
  2972. {
  2973. ResetCore();
  2974. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  2975. 2345UL, 2345UL, 100UL, 0U, 0U);
  2976. EXPECT_U(PLSR_MB_OK, WriteWord(0x1000U, 2U));
  2977. EXPECT_U(PLSR_MB_OK, WriteWord(0x1001U, 3U));
  2978. EXPECT_U(PLSR_MB_OK,
  2979. SetSegment(1U, 2345UL, 4L, PLSR_EXT_OR_COMPLETE,
  2980. 0U, 0U, 0U));
  2981. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  2982. PlsrTestEmitPulses(4UL);
  2983. PlsrPoll1ms();
  2984. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  2985. EXPECT_I(4L, ReadPosition());
  2986. EXPECT_U(1U, PlsrInit());
  2987. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2988. EXPECT_U(2U, ReadWord(0x1000U));
  2989. EXPECT_U(3U, ReadWord(0x1001U));
  2990. EXPECT_U(2345UL, ReadU32(0x1100U));
  2991. EXPECT_I(4L, ReadPosition());
  2992. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  2993. PlsrPoll1ms();
  2994. EXPECT_U(1U, PlsrInit());
  2995. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  2996. EXPECT_I(0L, ReadPosition());
  2997. }
  2998. static void TestFlashStartupRecoveryDecision(void)
  2999. {
  3000. EXPECT_U(1U, PlsrTestFlashNeedsStartupRecovery(0U, 1U, 0UL,
  3001. 1U, 0UL));
  3002. EXPECT_U(0U, PlsrTestFlashNeedsStartupRecovery(1U, 1U, 0UL,
  3003. 1U, 0UL));
  3004. EXPECT_U(0U, PlsrTestFlashNeedsStartupRecovery(0U, 1U, 0x080C0000UL,
  3005. 1U, 0UL));
  3006. EXPECT_U(0U, PlsrTestFlashNeedsStartupRecovery(0U, 1U, 0UL,
  3007. 1U, 0x080E0000UL));
  3008. EXPECT_U(0U, PlsrTestFlashNeedsStartupRecovery(0U, 0U, 0UL,
  3009. 1U, 0UL));
  3010. EXPECT_U(0U, PlsrTestFlashNeedsStartupRecovery(0U, 1U, 0UL,
  3011. 0U, 0UL));
  3012. }
  3013. static void TestPositionSchedulesFlashSave(void)
  3014. {
  3015. unsigned int tick;
  3016. ResetCore();
  3017. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  3018. 1000UL, 1000UL, 100UL, 0U, 0U);
  3019. EXPECT_U(PLSR_MB_OK,
  3020. SetSegment(1U, 1000UL, 1L, PLSR_EXT_OR_COMPLETE,
  3021. 0U, 0U, 0U));
  3022. for (tick = 0U; tick < 1001U; tick++)
  3023. {
  3024. PlsrPoll1ms();
  3025. PlsrServicePersistence();
  3026. }
  3027. PlsrTestResetSaveCount();
  3028. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  3029. PlsrTestEmitPulses(1UL);
  3030. PlsrPoll1ms();
  3031. PlsrServicePersistence();
  3032. EXPECT_U(0UL, PlsrTestSaveCount());
  3033. for (tick = 0U; tick < 1001U; tick++)
  3034. {
  3035. PlsrPoll1ms();
  3036. PlsrServicePersistence();
  3037. }
  3038. EXPECT_U(1UL, PlsrTestSaveCount());
  3039. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  3040. for (tick = 0U; tick < 1001U; tick++)
  3041. {
  3042. PlsrPoll1ms();
  3043. PlsrServicePersistence();
  3044. }
  3045. EXPECT_U(2UL, PlsrTestSaveCount());
  3046. }
  3047. static void TestBusyResetInvalidatesAbsolutePosition(void)
  3048. {
  3049. unsigned int tick;
  3050. ResetCore();
  3051. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  3052. 1000UL, 1000UL, 100UL, 0U, 0U);
  3053. EXPECT_U(PLSR_MB_OK,
  3054. SetSegment(1U, 1000UL, 100L, PLSR_EXT_OR_COMPLETE,
  3055. 0U, 0U, 0U));
  3056. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  3057. PlsrTestEmitPulses(5UL);
  3058. for (tick = 0U; tick < 10U; tick++)
  3059. {
  3060. PlsrPoll1ms();
  3061. }
  3062. EXPECT_I(5L, ReadPosition());
  3063. EXPECT_U(1U, PlsrInit());
  3064. EXPECT_U(PLSR_STATUS_IDLE, ReadStatus());
  3065. EXPECT_I(5L, ReadPosition());
  3066. EXPECT_U(PLSR_MB_OK, WriteWord(0x1008U, PLSR_POSITION_ABSOLUTE));
  3067. EXPECT_U(PLSR_MB_OK,
  3068. SetSegment(1U, 1000UL, 5L, PLSR_EXT_OR_COMPLETE,
  3069. 0U, 0U, 0U));
  3070. EXPECT_U(PLSR_MB_ILLEGAL_VALUE, SendCommand(PLSR_COMMAND_START));
  3071. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_CLEAR));
  3072. EXPECT_I(0L, ReadPosition());
  3073. EXPECT_U(PLSR_MB_OK,
  3074. SetSegment(1U, 1000UL, 0L, PLSR_EXT_OR_COMPLETE,
  3075. 0U, 0U, 0U));
  3076. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  3077. PlsrPoll1ms();
  3078. EXPECT_U(PLSR_STATUS_COMPLETED, ReadStatus());
  3079. }
  3080. static void TestPositionOverflowStopsWithError(void)
  3081. {
  3082. ResetCore();
  3083. ConfigureCommon(0U, PLSR_POSITION_RELATIVE, 1U, PLSR_SEND_COMPLETE,
  3084. 1000UL, 1000UL, 100UL, 0U, 0U);
  3085. EXPECT_U(PLSR_MB_OK,
  3086. SetSegment(1U, 1000UL, 2L, PLSR_EXT_OR_COMPLETE,
  3087. 0U, 0U, 0U));
  3088. PlsrTestSetPosition(INT32_MAX, 1U);
  3089. EXPECT_I(INT32_MAX, ReadPosition());
  3090. EXPECT_U(PLSR_MB_OK, SendCommand(PLSR_COMMAND_START));
  3091. PlsrTestEmitPulses(1UL);
  3092. EXPECT_U(0U, PlsrTestPulseIsActive());
  3093. PlsrPoll1ms();
  3094. EXPECT_U(PLSR_STATUS_ERROR, ReadStatus());
  3095. EXPECT_U(PLSR_ERROR_COUNT, ReadError());
  3096. EXPECT_I(INT32_MIN, ReadPosition());
  3097. }
  3098. typedef void (*TEST_FUNCTION)(void);
  3099. typedef struct
  3100. {
  3101. const char *name;
  3102. TEST_FUNCTION function;
  3103. } TEST_CASE;
  3104. static const TEST_CASE TestCases[] =
  3105. {
  3106. {"u64_by_u32_division", TestU64ByU32Division},
  3107. {"protocol_boundaries", TestProtocolBoundaries},
  3108. {"ab_output_pairs_phase_sequence", TestAbOutputPairsAndPhaseSequence},
  3109. {"ab_single_pulse_100khz_matrix",
  3110. TestAbSinglePulseMaximumFrequencyMatrix},
  3111. {"ab_fast_gate_cleanup_deferred_to_poll",
  3112. TestAbFastGateCleanupIsDeferredToPoll},
  3113. {"ab_final_arm_job_tail_chain_once",
  3114. TestAbFinalArmJobTailChainsOnce},
  3115. {"ab_final_boundary_before_arm_job_noop",
  3116. TestAbFinalBoundaryBeforeArmJobIsNoOp},
  3117. {"ab_final_arm_job_failure_no_final_count",
  3118. TestAbFinalArmJobFailureDoesNotCountFinalPulse},
  3119. {"ab_stop_mailbox_pending_boundary",
  3120. TestAbStopMailboxAtPendingBoundary},
  3121. {"ab_act_ext_cut_zero_boundary", TestAbActAndExtCutsFinishAtZero},
  3122. {"ab_subsequent_single_pulse_continuous",
  3123. TestAbSubsequentSinglePulsesStayContinuous},
  3124. {"ab_armed_frequency_write", TestAbArmedFrequencyWriteDoesNotReopenOutput},
  3125. {"ab_stop_request_forced_fault", TestAbStopRequestForcedFault},
  3126. {"ab_stop_after_final_boundary_armed",
  3127. TestAbStopAfterFinalBoundaryIsArmed},
  3128. {"ab_stop_arm_latched_final_quarter_once",
  3129. TestAbStopArmConsumesLatchedFinalQuarterOnce},
  3130. {"ab_rejects_unpaired_outputs", TestAbRejectsUnpairedOutputs},
  3131. {"ab_stop_complete_cycle_boundary", TestAbStopAtCompleteCycleBoundary},
  3132. {"ab_dynamic_frequency_zero_boundary",
  3133. TestAbDynamicFrequencyChangesOnlyAtZeroPhase},
  3134. {"ab_stale_frequency_commit_after_completion",
  3135. TestAbStaleFrequencyCommitAfterNaturalCompletion},
  3136. {"ab_direction_reversal_zero_restart",
  3137. TestAbDirectionReversalRestartsFromZeroPhase},
  3138. {"ab_mode_persistence", TestAbModePersistence},
  3139. {"diagnostic_pass", TestDiagnosticPass},
  3140. {"diagnostic_count_fault_clear", TestDiagnosticCountFaultAndClear},
  3141. {"diagnostic_frequency_fault_clear",
  3142. TestDiagnosticFrequencyFaultAndClear},
  3143. {"diagnostic_curve_fault_clear", TestDiagnosticCurveFaultAndClear},
  3144. {"diagnostic_interrupted_segments", TestDiagnosticInterruptedSegments},
  3145. {"diagnostic_fault_latch_explicit_clear",
  3146. TestDiagnosticFaultLatchNeedsExplicitClear},
  3147. {"diagnostic_frequency_pass_latched",
  3148. TestDiagnosticFrequencyPassStaysFailed},
  3149. {"diagnostic_curve_counter_saturation",
  3150. TestDiagnosticCurveCountersSaturate},
  3151. {"wait_zero_one_ms", TestWaitZeroUsesOneMillisecond},
  3152. {"act_zero_no_pulse", TestActZeroSkipsWithoutPulse},
  3153. {"relative_absolute_zero", TestRelativeAndAbsoluteZeroDisplacement},
  3154. {"ten_segments_sequence", TestAllTenSegmentsRunInSequence},
  3155. {"ten_segments_jump_chain", TestAllTenSegmentsRunThroughJumpChain},
  3156. {"start_segment_ten", TestStartSegmentTenRunsNormally},
  3157. {"self_jump_stop", TestSelfJumpCanStop},
  3158. {"stop_deceleration", TestStopDeceleratesBeforeCut},
  3159. {"stop_pending_boundary", TestStopAtPendingBoundary},
  3160. {"direction_delay_one_ms", TestOneMillisecondDirectionDelay},
  3161. {"direction_output_polarity_matrix", TestDirectionOutputPolarityMatrix},
  3162. {"direction_same_reverse_segments", TestDirectionSameAndReverseSegments},
  3163. {"direction_output_change", TestDirectionOutputCanChangeBetweenCommands},
  3164. {"ext_edge_at_natural_boundary", TestExtEdgeAtNaturalBoundary},
  3165. {"ext_cut_natural_boundary_interleavings",
  3166. TestExtCutAndNaturalBoundaryInterleavings},
  3167. {"ext_edge_during_direction_delay", TestExtEdgeDuringDirectionDelay},
  3168. {"stopped_clears_pending_ext", TestStoppedTaskClearsPendingExtEdge},
  3169. {"ext_edge_seamless_epoch", TestExtEdgeDoesNotCutSeamlessNextSegment},
  3170. {"ramp_seamless_epoch", TestOldRampDoesNotRetargetSeamlessNextSegment},
  3171. {"short_profile_boundary_matrix", TestShortProfileBoundaryMatrix},
  3172. {"short_profile_258_fully_precomputed",
  3173. TestShortProfile258IsFullyPrecomputed},
  3174. {"short_final_no_poll", TestShortFinalDeceleratesWithoutPoll},
  3175. {"zero_to_maximum_ramp_duration",
  3176. TestZeroToMaximumRampKeepsConfiguredDuration},
  3177. {"long_profile_259_1ms_ramp", TestLongProfile259UsesMillisecondRamp},
  3178. {"maximum_profile_1ms_cadence",
  3179. TestMaximumProfileOneMillisecondCadence},
  3180. {"profile_queue_stale_no_advance", TestProfileQueueStaleDoesNotAdvance},
  3181. {"profile_queue_retarget_generation",
  3182. TestProfileQueueRetargetInvalidatesGeneration},
  3183. {"final_pulse_gate_before_diagnostic",
  3184. TestFinalPulseGatesBeforeDiagnosticFinish},
  3185. {"short_timer_failure", TestShortProfileTimerFailure},
  3186. {"stop_after_subsequent_handoff",
  3187. TestStopImmediatelyAfterSubsequentHandoff},
  3188. {"short_zero_speed_edges", TestShortProfileZeroSpeedEdges},
  3189. {"short_dynamic_retarget", TestShortProfileDynamicRetarget},
  3190. {"short_ext_cut", TestShortProfileExtCut},
  3191. {"current_frequency_dynamic", TestCurrentFrequencyIsDynamic},
  3192. {"deferred_frequency_retries_after_stale",
  3193. TestDeferredFrequencyRetriesAfterStale},
  3194. {"short_profile_retries_same_sample_after_stale",
  3195. TestShortProfileRetriesSameSampleAfterStale},
  3196. {"poll_mailbox_failure", TestPollMailboxDefersPlatformFailure},
  3197. {"future_frequency_on_arrival",
  3198. TestFutureSegmentFrequencyAppliesOnArrival},
  3199. {"subsequent_future_frequency_handoff",
  3200. TestSubsequentFutureFrequencyRebuildsHandoff},
  3201. {"future_frequency_last_pulse_race",
  3202. TestFutureFrequencyRaceAtLastPulse},
  3203. {"latched_update_before_future_frequency_commit",
  3204. TestLatchedUpdateDrainsBeforeFutureFrequencyCommit},
  3205. {"subsequent_no_poll_gap", TestSubsequentHandoffHasNoPollGap},
  3206. {"three_single_pulse_no_poll", TestThreeSinglePulseSubsequentWithoutPoll},
  3207. {"handoff_queue_failures", TestHandoffQueueFailuresBecomeTimerError},
  3208. {"command_state_restrictions", TestCommandStateRestrictions},
  3209. {"command_mailbox_start_snapshot",
  3210. TestCommandMailboxStartSnapshotAndConflicts},
  3211. {"command_mailbox_stop_clear_deferred",
  3212. TestCommandMailboxStopAndClearAreDeferred},
  3213. {"command_mailbox_validation", TestCommandMailboxValidatesBeforeQueue},
  3214. {"command_mailbox_start_failure",
  3215. TestCommandMailboxStartFailureBecomesError},
  3216. {"wait_signal_positive", TestWaitSignalPositivePath},
  3217. {"persistence_reinit", TestPersistenceAcrossReinit},
  3218. {"flash_startup_recovery_decision", TestFlashStartupRecoveryDecision},
  3219. {"position_flash_save", TestPositionSchedulesFlashSave},
  3220. {"busy_reset_absolute_gate", TestBusyResetInvalidatesAbsolutePosition},
  3221. {"position_overflow", TestPositionOverflowStopsWithError}
  3222. };
  3223. int main(void)
  3224. {
  3225. unsigned int index;
  3226. for (index = 0U;
  3227. index < (unsigned int)(sizeof(TestCases) / sizeof(TestCases[0]));
  3228. index++)
  3229. {
  3230. unsigned int failuresBefore = FailureCount;
  3231. CurrentTest = TestCases[index].name;
  3232. (void)printf("RUN %s\n", CurrentTest);
  3233. (void)fflush(stdout);
  3234. TestCases[index].function();
  3235. if (FailureCount == failuresBefore)
  3236. {
  3237. (void)printf("PASS %s\n", CurrentTest);
  3238. }
  3239. else
  3240. {
  3241. (void)printf("FAIL %s (%u new failure(s))\n",
  3242. CurrentTest, FailureCount - failuresBefore);
  3243. }
  3244. }
  3245. (void)printf("SUMMARY tests=%u assertions=%u failures=%u\n",
  3246. (unsigned int)(sizeof(TestCases) / sizeof(TestCases[0])),
  3247. AssertionCount, FailureCount);
  3248. return (FailureCount == 0U) ? 0 : 1;
  3249. }