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

227 строки
5.9 KiB

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