-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wait for both selectors to clear the limit for end of row detection #200
base: main
Are you sure you want to change the base?
Wait for both selectors to clear the limit for end of row detection #200
Conversation
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
8f2b5bd
to
ce4b11b
Compare
ce4b11b
to
69da90e
Compare
We now maintain a "current line direction" that allows us to know whether the carriage is on the expected side of the working area for the line to be considered complete. Then we get rid of m_workedOnLine that is no longer useful. We also use the current line direction when determining which needle to program, making this more reliable than depending on the instantaneous carriage direction. Had to fix a few tests that used a mix of Knit and Garter carriage.
69da90e
to
11ad974
Compare
Fixes #197, see there for a detailed description of the problem this PR is trying to address.
Proposed solution
As described in #197, the problem is likely caused by the firmware using the instantaneous carriage direction as given by the belt encoder to determine which of the active carriage's two "needle selectors" to consider when trying to determine whether the current row of knitting is complete.
With this PR, we instead maintain a "current line direction" variable (
m_currentLineDirection
) that stores the expected direction of carriage travel for the current line, regardless of its immediate physical movement. This variable is initialized when knitting starts based on which Hall sensor was last passed, and flipped every time we detect a line is complete, as we request the next line from the computer.To detect that a line is complete, instead of using a flag (
m_workedOnLine
) that alternates betweentrue
andfalse
, we use the current line direction to know whether to expect the carriage on the left or right end of the working area. This more securely guarantees that we don't trigger multiple end-of-row events while staying on the same end of the bed.The precise determination of the row being done is also improved. Not only do we check for the active needle selector (e.g. the one on the left side of the K carriage when moving right, or the one on the right side of the garter carriage also when moving right) to be past the last needle in work, we also check for the inactive needle selector to be past the last working needle.
Why is this important?
Let's look at a (schematized) K carriage moving right, hence with its active needle selector on the left side:
Once the active needle selector gets past the last needle in work, we're ready to turn around and start the new row (with the active and inactive selectors switching roles):
So far, so good. But what about a garter carriage in the same situation?
After a while, the active needle selector will have worked on the last active needle:
But if we were to turn the carriage around at this point, the newly-active selector would have missed a number of needles from the right end of the working area!
Therefore, it is imperative to wait for the inactive selector to pass the last needle, so that when it becomes active it can get started on what is now the first needle of the next row:
Waiting at both needle selectors to pass the last needle is a solution that works for both types of carriage, therefore this is what is implemented in this PR.