You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

199 regels
4.8 KiB

  1. #ifndef PLSR_JOB_H
  2. #define PLSR_JOB_H
  3. #include "plsr_types.h"
  4. #include <stdint.h>
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. #define PLSR_MAX_SEGMENTS (100U)
  9. #define PLSR_OUTPUT_MODE_FROM_SFD (0xFFU)
  10. #define PLSR_FREQUENCY_MIN_HZ (1UL)
  11. #define PLSR_FREQUENCY_MAX_HZ (100000UL)
  12. typedef enum
  13. {
  14. PLSR_DEVICE_D = 0,
  15. PLSR_DEVICE_HD,
  16. PLSR_DEVICE_FD,
  17. PLSR_DEVICE_X,
  18. PLSR_DEVICE_M,
  19. PLSR_DEVICE_HM
  20. } PLSR_DEVICE_TYPE;
  21. typedef uint8_t (*PLSR_VALIDATE_WORDS_FN)(void *context,
  22. PLSR_DEVICE_TYPE device,
  23. uint32_t firstAddress,
  24. uint32_t wordCount);
  25. typedef uint8_t (*PLSR_READ_WORD_FN)(void *context,
  26. PLSR_DEVICE_TYPE device,
  27. uint32_t address,
  28. uint16_t *value);
  29. typedef uint8_t (*PLSR_READ_BIT_FN)(void *context,
  30. PLSR_DEVICE_TYPE device,
  31. uint32_t address,
  32. uint8_t *value);
  33. typedef struct
  34. {
  35. void *context;
  36. PLSR_VALIDATE_WORDS_FN validateWords;
  37. PLSR_READ_WORD_FN readWord;
  38. PLSR_READ_BIT_FN readBit;
  39. } PLSR_DATA_SOURCE;
  40. typedef struct
  41. {
  42. PLSR_DEVICE_TYPE device;
  43. uint32_t address;
  44. } PLSR_DATA_REF;
  45. typedef enum
  46. {
  47. PLSR_OPERAND_CONSTANT = 0,
  48. PLSR_OPERAND_DATA
  49. } PLSR_OPERAND_TYPE;
  50. typedef struct
  51. {
  52. PLSR_OPERAND_TYPE type;
  53. PLSR_DATA_REF data;
  54. int32_t constant;
  55. } PLSR_VALUE_OPERAND;
  56. typedef struct
  57. {
  58. uint32_t sequence;
  59. /* The source context must remain valid while the queued/running job exists. */
  60. PLSR_DATA_SOURCE source;
  61. PLSR_DATA_REF s0;
  62. PLSR_DATA_REF s1;
  63. PLSR_VALUE_OPERAND s2;
  64. uint8_t dAxis;
  65. uint8_t outputModeOverride;
  66. } PLSR_CALL;
  67. typedef enum
  68. {
  69. PLSR_WAIT_PULSE_COMPLETE = 0,
  70. PLSR_WAIT_TIME,
  71. PLSR_WAIT_SIGNAL,
  72. PLSR_WAIT_ACT_TIME,
  73. PLSR_WAIT_EXT,
  74. PLSR_WAIT_EXT_OR_COMPLETE
  75. } PLSR_WAIT_CONDITION;
  76. typedef enum
  77. {
  78. PLSR_VALUE_CONSTANT = 0,
  79. PLSR_VALUE_D,
  80. PLSR_VALUE_HD,
  81. PLSR_VALUE_FD,
  82. PLSR_VALUE_X,
  83. PLSR_VALUE_M,
  84. PLSR_VALUE_HM
  85. } PLSR_VALUE_SOURCE;
  86. #define PLSR_SEGMENT_FLAG_ZERO_PULSE (1U << 0U)
  87. #define PLSR_SEGMENT_FLAG_DEFAULT_SPEED (1U << 1U)
  88. #define PLSR_SEGMENT_FLAG_SPEED_CLAMPED (1U << 2U)
  89. #define PLSR_SEGMENT_FLAG_SELF_LOOP (1U << 3U)
  90. typedef struct
  91. {
  92. uint32_t targetFrequency;
  93. int32_t pulseOrTarget;
  94. int32_t waitValueOrAddress;
  95. int32_t jumpValueOrAddress;
  96. uint8_t waitCondition;
  97. uint8_t waitSource;
  98. uint8_t jumpSource;
  99. uint8_t flags;
  100. } PLSR_SEGMENT_SNAPSHOT;
  101. typedef struct
  102. {
  103. uint32_t defaultSpeed;
  104. uint32_t maximumSpeed;
  105. uint32_t startSpeed;
  106. uint32_t stopSpeed;
  107. uint32_t zrnHighSpeed;
  108. uint32_t zrnCrawlSpeed;
  109. uint16_t accelerationMs;
  110. uint16_t decelerationMs;
  111. uint16_t gapAccelerationMs;
  112. uint16_t directionDelayUs;
  113. uint8_t curveMode;
  114. uint8_t follow;
  115. uint8_t feedforwardPercent;
  116. uint8_t refreshCode;
  117. } PLSR_S2_SNAPSHOT;
  118. typedef struct
  119. {
  120. PLSR_DATA_SOURCE source;
  121. PLSR_DATA_REF s0;
  122. PLSR_DATA_REF s1;
  123. PLSR_S2_SNAPSHOT s2;
  124. PLSR_SEGMENT_SNAPSHOT segments[PLSR_MAX_SEGMENTS];
  125. uint32_t timerClockHz;
  126. uint32_t pairedTimerClockHz;
  127. uint16_t segmentCount;
  128. uint16_t startSegment;
  129. uint8_t dAxis;
  130. uint8_t s2Set;
  131. uint8_t positioningMode;
  132. uint8_t outputMode;
  133. uint8_t directionPoint;
  134. uint8_t directionActiveHigh;
  135. uint8_t initialDirectionPositive;
  136. uint8_t speedClamped;
  137. uint8_t hasSelfLoop;
  138. } PLSR_JOB_SNAPSHOT;
  139. typedef enum
  140. {
  141. PLSR_PARSE_BLOCK_NONE = 0,
  142. PLSR_PARSE_BLOCK_S0,
  143. PLSR_PARSE_BLOCK_S1,
  144. PLSR_PARSE_BLOCK_S2,
  145. PLSR_PARSE_BLOCK_OUTPUT,
  146. PLSR_PARSE_BLOCK_POSITION
  147. } PLSR_PARSE_BLOCK;
  148. typedef struct
  149. {
  150. PLSR_RESULT result;
  151. PLSR_PARSE_BLOCK block;
  152. uint32_t address;
  153. int32_t value;
  154. uint16_t segment;
  155. } PLSR_PARSE_DETAIL;
  156. typedef struct
  157. {
  158. int64_t logicalPosition;
  159. uint8_t positionValid;
  160. } PLSR_PARSE_CONTEXT;
  161. PLSR_RESULT PlsrBuildJobSnapshot(const PLSR_CALL *call,
  162. const PLSR_PARSE_CONTEXT *context,
  163. PLSR_JOB_SNAPSHOT *snapshot,
  164. PLSR_PARSE_DETAIL *detail);
  165. PLSR_RESULT PlsrResolveLiveFrequency(const PLSR_JOB_SNAPSHOT *snapshot,
  166. uint16_t segment,
  167. uint32_t *frequency,
  168. uint8_t *clamped);
  169. PLSR_RESULT PlsrCalculateTimerDivider(uint32_t timerClockHz,
  170. uint32_t frequencyHz,
  171. uint16_t *psc,
  172. uint16_t *arr);
  173. #ifdef __cplusplus
  174. }
  175. #endif
  176. #endif /* PLSR_JOB_H */