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

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