#ifndef PLSR_PATH_H #define PLSR_PATH_H #include "plsr_job.h" #include "plsr_types.h" #include #ifdef __cplusplus extern "C" { #endif #define PLSR_PATH_ZERO_JUMP_BUDGET (100U) typedef enum { PLSR_PATH_SEGMENT_RUNNING = 0, PLSR_PATH_WAIT_TIME, PLSR_PATH_WAIT_SIGNAL, PLSR_PATH_ACT_PENDING, PLSR_PATH_ENDED } PLSR_PATH_PHASE; typedef enum { PLSR_PATH_ACTION_NONE = 0, PLSR_PATH_ACTION_NEXT_SEGMENT, PLSR_PATH_ACTION_ENTER_WAIT, PLSR_PATH_ACTION_JOB_COMPLETE, PLSR_PATH_ACTION_YIELD, PLSR_PATH_ACTION_ERROR } PLSR_PATH_ACTION; typedef struct { PLSR_PATH_PHASE phase; uint16_t currentSegment; uint16_t nextSegment; uint8_t waitCondition; uint32_t waitRemainingMs; uint16_t zeroJumpBudget; uint8_t lastExtLevel; uint8_t segmentEnded; uint8_t extActive; uint8_t actActive; uint8_t jumpChainPending; uint8_t jobEnded; uint8_t waitSignalDevice; uint32_t waitSignalAddress; } PLSR_PATH_CONTEXT; void PlsrPathBegin(PLSR_PATH_CONTEXT *context, const PLSR_JOB_SNAPSHOT *job, int64_t logicalPosition); PLSR_PATH_ACTION PlsrPathOnSegmentDone(PLSR_PATH_CONTEXT *context, const PLSR_JOB_SNAPSHOT *job, int64_t logicalPosition); PLSR_PATH_ACTION PlsrPathTick(PLSR_PATH_CONTEXT *context, const PLSR_JOB_SNAPSHOT *job, int64_t logicalPosition); uint16_t PlsrPathGetCurrentSegment(const PLSR_PATH_CONTEXT *context); void PlsrPathTerminate(PLSR_PATH_CONTEXT *context); #ifdef __cplusplus } #endif #endif /* PLSR_PATH_H */