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

215 líneas
5.2 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. int64_t positiveSoftLimitPulses;
  122. int64_t negativeSoftLimitPulses;
  123. uint8_t softLimitEnabled;
  124. uint8_t positiveInputPoint;
  125. uint8_t negativeInputPoint;
  126. uint8_t positiveInputActiveLow;
  127. uint8_t negativeInputActiveLow;
  128. } PLSR_LIMIT_SNAPSHOT;
  129. typedef struct
  130. {
  131. PLSR_DATA_SOURCE source;
  132. PLSR_DATA_REF s0;
  133. PLSR_DATA_REF s1;
  134. PLSR_S2_SNAPSHOT s2;
  135. PLSR_EQUIVALENT_CONFIG equivalent;
  136. PLSR_LIMIT_SNAPSHOT limits;
  137. PLSR_SEGMENT_SNAPSHOT segments[PLSR_MAX_SEGMENTS];
  138. uint32_t inputDefaultSpeed;
  139. uint32_t inputMaximumSpeed;
  140. uint32_t timerClockHz;
  141. uint32_t pairedTimerClockHz;
  142. uint16_t segmentCount;
  143. uint16_t startSegment;
  144. uint8_t dAxis;
  145. uint8_t s2Set;
  146. uint8_t positioningMode;
  147. uint8_t outputMode;
  148. uint8_t directionPoint;
  149. uint8_t directionActiveHigh;
  150. uint8_t initialDirectionPositive;
  151. uint8_t speedClamped;
  152. uint8_t hasSelfLoop;
  153. } PLSR_JOB_SNAPSHOT;
  154. typedef enum
  155. {
  156. PLSR_PARSE_BLOCK_NONE = 0,
  157. PLSR_PARSE_BLOCK_S0,
  158. PLSR_PARSE_BLOCK_S1,
  159. PLSR_PARSE_BLOCK_S2,
  160. PLSR_PARSE_BLOCK_OUTPUT,
  161. PLSR_PARSE_BLOCK_POSITION
  162. } PLSR_PARSE_BLOCK;
  163. typedef struct
  164. {
  165. PLSR_RESULT result;
  166. PLSR_PARSE_BLOCK block;
  167. uint32_t address;
  168. int32_t value;
  169. uint16_t segment;
  170. } PLSR_PARSE_DETAIL;
  171. typedef struct
  172. {
  173. int64_t logicalPosition;
  174. uint8_t positionValid;
  175. } PLSR_PARSE_CONTEXT;
  176. PLSR_RESULT PlsrBuildJobSnapshot(const PLSR_CALL *call,
  177. const PLSR_PARSE_CONTEXT *context,
  178. PLSR_JOB_SNAPSHOT *snapshot,
  179. PLSR_PARSE_DETAIL *detail);
  180. PLSR_RESULT PlsrResolveLiveFrequency(const PLSR_JOB_SNAPSHOT *snapshot,
  181. uint16_t segment,
  182. uint32_t *frequency,
  183. uint8_t *clamped);
  184. PLSR_RESULT PlsrCalculateTimerDivider(uint32_t timerClockHz,
  185. uint32_t frequencyHz,
  186. uint16_t *psc,
  187. uint16_t *arr);
  188. #ifdef __cplusplus
  189. }
  190. #endif
  191. #endif /* PLSR_JOB_H */