If a heater falls out of the target range, accumulate the temperature
differences to determine if an error should be raised. This should
make it less likely to report an error for heaters that drift slightly
out of range, and it should make error reporting faster for heaters
that rapidly fall out of range.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
A default of 4 degrees and 10 seconds may be too aggressive - change
the default to 10 degrees and 15 seconds.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for additional carriages on cartesian printers. This is
used by some printers to handle multiple extruders.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Separate out the hd44780 screen drawing from the st7920 code. Use a
layout that takes advantage of the 20 columns. Add custom hd44780
fonts.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for displaying basic status information on ST7920 and
HD44780 based LCDs that are attached directly to a micro-controller.
Signed-off-by: Marcio Teixeira <marcio@alephobjects.com>
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Support low-priority message transmits. This may be useful for bulk
commands that should be delayed util the comms are otherwise idle.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add a lookup_command() method to the SerialReader class that provides
a wrapper that stores the serial and commandqueue references. This
makes it easier to run the send() method.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add --always flag to "git describe" command to get a build identifier
even if one checks out the repo with a depth parameter that prunes out
the last tagged version.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The multi-mcu clock syncing code relies on the ability to periodically
update the mcu clock adjustments. If a series of very long moves are
submitted then it is possible the adjustments could become unstable.
For example, if an adjustment is made to reduce a clock error over the
next couple of seconds, but it is applied to a longer period because
the next move lasts many seconds, then this would result in a bigger
adjustment for the following move, which would result in an even
bigger error when that move lasts many seconds. This can repeat until
the system destabilizes.
Check for cases where the print_time is far in the future of the
current estimated print time and average over a longer period in that
case. That should reduce the possibility of the adjustment code
becoming unstable.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for directly printing from a local file on the host. This
may be useful if the host cpu is not fast enough to run OctoPrint
well.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The bed_tilt_calibrate command determines the tilt of the bed.
However, we need to report the tilt compensation which is the negative
of the bed tilt.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of using the toolhead class to determine if stats should be
reported, allow every printer object with a stats() callback to
determine if stats are needed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Average clock sync times over approximately 30 seconds instead of 120
seconds so that the clock prediction responds to changes faster.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use both load_config() and load_config_prefix() functions when
dynamically loading a module from the extras directory - if the config
section name has parameters in it then use load_config_prefix().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
OctoPrint (and other software) will sometimes send additional commands
even if the previous command has not yet responded with an "ok".
Change the g-code input reading code to keep reading input so that an
M112 can be detected (and processed out-of-order). To avoid the
extreme case where one writes an entire g-code file to the input
without any pacing, disable the input reading if more than 20 commands
are pending.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If the script being run raises an error, then stop running that script
and return the error to the caller.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Specify hardware pwm cycle times using the same method as software pwm
(in seconds, not clock ticks). Allow the fan code to be configured
with an explicit cycle time even when using software pwm.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If the mcu supports command restarts and it does not appear to use a
real serial port, then default the restart method to 'command'. This
is a better default on boards with native USB support.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Report the current temperature, current pwm setting, and target
temperature as statistics in the log.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for disabling homing checks via the homing_override
mechanism. This may be useful to move an axis prior to homing it.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Create a virtual pin that may be used as the z endstop pin on
cartesian printers that use the probe in place of a z endstop.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow a set of g-code scripts to be run on each probe invocation.
This may be useful for probes that need to be setup before they are
useful (eg, with servo actuated probes).
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow users to override the behavior of G28 using a new
"homing_override" config section. This may be used on printers that
require specific steps during the homing process.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The print cooling fan and printer heater_fan are independent modules
that can reside in the extras directory.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Check if a config section matches a python filename in the
klippy/extras/ directory. If it does, load that python code to handle
the config section.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of hardcoding which objects are called on state transitions,
allow any "printer object" to be invoked if it has a printer_state()
method. Convert connect, ready, shutdown, and disconnect callbacks to
this mechanism.
Similarly, allow all printer objects to provide a stats() callback.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add get_reactor(), lookup_object(), lookup_module_objects(), and
set_rollover_info() to the main Printer class so that callers do not
need to peek into the class' members. Similarly, add get_printer()
and get_name() methods to the ConfigWrapper class.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If register_command() is passed None as the function to call, then
treat it as an unregister command request.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use the existing reset_last_position() code in cmd_G28() instead of
manually implementing the logic.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The previous code increases print_stall if a move is proactively
flushed due to buffer_time_low and a follow up move is ready to send
before the existing moves are fully retired. However, this would not
track the case where a move is proactively flushed and it takes an
extended amount of time to get sufficient moves to refill the queue.
Change the code so that print_stall increases anytime a new move is
queued after a proactive flush and there are existing moves not yet
fully retired.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Determine the median period from the pin tuning tests and use that to
recommend a set of PID parameters. Report the results over the g-code
terminal.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Enable all the steppers via the shift registers when the first stepper
is enabled, and disable all the steppers once all steppers are
disabled. This avoids having to enable all the steppers all of the
time. Note that, this support is independent from the current control
for each stepper, which is still done individually.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The enable lines are not one per stepper - instead there are 5
distinct enable settings. Handle them properly.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Change the update_command() call to use a new PinResolver class. In
that new class, verify that the same pin isn't referenced in two
different parts of the config using different aliases for the pin.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's common for multiple steppers to use the same stepper enable
line. Detect this and only create a single digital_out oid on the
micro-controller.
Also, prohibit any other pin from being used multiple times in the
config file.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Always set the pin_params['type'] field on a pin lookup. Rename
parse_pin_desc() to lookup_pin() to make the change more clear.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The extruder check_move() code will permit moves with huge extrusion
ratios if the amount extruded is tiny. (Some slicers emit these silly
moves - they are allowed because they are harmless.) Unfortunately,
the pressure advance code did not handle the huge extrusion ratios -
it would result in a massive, near instantaneous, extruder move in an
attempt to build pressure in the extruder. Catch this case and limit
the impact to the pressure advance code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Added the pwm_cycle_time option for heater config sections. Defaults
to previous value of 0.100 seconds, but may be reduced to shorter times
at the expense of MCU workload and possible MOSFET heating, depending on
controller design. Some printers that need bed PID to be enabled,
notably the Felixprinters series, are known to benefit from shorter
cycle times, as the default 10hz rate results in excessive voltage
supply droop.
While this option can be used on extruder heaters as well, there
is not expected to be any particular benefit from doing so unless
the extruder heater presents a particularly large load.
Signed-off-by: Andy Silverman <andrewsi@outlook.com>
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add PID_SETTLE_DELTA and PID_SETTLE_SLOPE constants to the code to try
and make it a little more clear how the wait for temperature code
works.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Group commands by category instead of listing them in numerical
order. This is just code movement; no code changes.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Store the gcc and binutils versions used in the compilation of the
firmware in the firmware data dictionary. Forward that information to
the log so it is available during debugging.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit 002dc0df added rounding to the homing speed, but it did not
work if the configured homing speed was less than the printer's
maximum velocity. Move the speed rounding from stepper.py to
homing.py and make sure the rounded speed is less than the maximum
speed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add the ability to alias multiple output pins from a single pin alias.
This makes it possible to support some cases where a single logical
output is driven by multiple output pins.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add the ability to define output pins that may be set at runtime with
a new SET_PIN extended g-code command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The atmega168 and atmega328 need to define PE0 and PE1 in order to
support the 2 extra analog pins.
Also, support the arduino mappings for the atmega328.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Change the config file so that the delta arm length is specified
per-tower. This makes it possible to support advanced calibration.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use the formulas for trilateration (instead of the circumcenter
formulas) when calculating the position of the nozzle from the
position of the carriages. The trilateration formula is more general
and it allows each tower to have a different arm length.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's valid to consider the stepper at a position that is not on a step
interval - only the "mcu position" needs to be an integer.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add a new config option 'homing_endstop_align_zero' to enable the
alignment of the endstop to a stepper full step. It's possible one
may wish to specify a homing_endstop_phase while not aligning the
endstop.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Move the homing logic out of toolhead.py and into homing.py. This
simplifies the toolhead logic and centralizes the homing code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Reset the last step clock during the init phase and after each home -
this simplifies the runtime code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Make sure to always call MCU_endstop.home_wait() if
MCU_endstop.home_start() is invoked. Rename
MCU_stepper.note_homing_triggered() to note_homing_end() and make sure
it is always called if MCU_stepper.note_homing_start() is invoked.
With these changes, MCU_endstop.home_finalize() is no longer needed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The homing code wants the list of endstops to enable during a homing
operation - it's confusing to pass the steppers.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Now that commands can be registered dynamically, move the code for
SET_SERVO from gcode.py to the PrinterServo() class in chipmisc.py.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Translate caught exceptions into a gcode.error() exception. This way
there is one standard place to invoke respond_error(). Also, always
reset the last_position on a handled error.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit e05c6354 changed the internal step compress queue from 64bit
integers to 32bit integers. However, that commit broke the proactive
flushing of moves that could produce more than 64K steps. This could
lead to large memory allocations and cpu slow downs on printers that
had a very large Z axis - possibly leading to a "Timer too close" mcu
shutdown. Correct the code so that it properly generates a 64bit
flush clock.
Also, be sure to only expand / memmove the queue when there is no room
for a new element at the end.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of adding 250ms to each homing operation add a time relative
to the number of estimated steps that are to be generated. This
scales the delay to really large axes without adding a delay for
normal users.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow multiple steppers to be defined for a single cartesian axis.
This adds support for dual-z setups.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add wrappers around mcu_endstop and mcu_stepper so that the kinematic
classes do not need to directly access these low-level classes.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If an MCU signals a shutdown from the background thread, notify the
main thread and handle the shutdown there. Dispatch shutdown handling
from the main Printer() class instead of from the Toolhead class.
This simplifies the shutdown logic.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow the start value to be different from the default/shutdown value
for the pin. This will be useful for "heater fans" that should
startup in the off state, and transition to full on in a shutdown
state.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Continue to sample the ADC input pins even if the MCU goes into a
shutdown state. This enables the printer to continue reporting
temperatures even on an mcu error.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Pass the sample_ticks and sample_count parameters directly in the
end_stop_home command instead. This simplifies the code.
Also, simplify calculation of next wakeup time in
end_stop_oversample_event().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It is possible to have an acceleration greater than max_z_accel on
XY+Z moves. That needs to be taken into account when calculating the
min_stop_interval. This prevents spurious "No next step" MCU errors.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If the stepper phases are known then it is possible to arrange for the
0.0 position to occur at a full step. On cartesian style printer,
this makes it possible for the Z levels to occur at full steps (which
may help reduce "Z ribbing").
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Don't discard samples that are less than 500us from the prediction
regardless of the prediction variance. Also, don't use the prediction
variance in the external time estimate.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Some printers can show occasional noise on the endstop pin. Support
sampling the endstop pin multiple times to attempt to filter out this
noise.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Implement a "moving" linear regression between the reported mcu clock
and the sent_time of the get_status message that generated that
report. Use this linear regression to make predictions on the
relationship between the system time and the mcu clock.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
On a retransmit, the sent_time of the command associated with the
given response message isn't accurate.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Revert commit f37fc775. It is not valid to pass a conservative
frequency to serialqueue.set_clock_est() as that function may not be
called for extended periods - a too low frequency would eventually
lead to "Timer too close" mcu errors.
Instead, increase the 1ms time offset to 5ms to avoid corner cases
that could lead to a message arriving too soon.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This prevents divide by zero errors during stats output if the stats
are generated before a connection completes.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Update the homing code to pass in the start of the homing operation to
toolhead.reset_print_time(). This prevents an error when batch
processing gcode files that contain multiple homing operations.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The logging module can build strings directly from printf syntax - no
need to build the string first.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Build a single (very large) logging message with the debug state.
This prevents the output from being fragmented.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Build a single (very large) logging message with the debug state.
This prevents the output from being fragmented.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Accuracy is not as important as ensuring a message is never sent
before it can be received in the serialqueue code. So, use the
smallest frequency ever seen and add the minimum rtt time when setting
set_clock_est().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use baud_adjust when determining the receive_time of a message read
from the serial port. This improves the accuracy of the clock
synchronization code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of tracking the minimum frequency ever observed, attempt to
track the actual frequency of the micro-controller (relative to the
host clock). This improves the stability of the secondary mcu clocks
when multiple mcus are configured.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for configuring and controlling the hardware specific to
the revision "B3" Replicape board.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for reading analog values via the standard Linux IIO
interface. This can be used on Replicape boards to sample analog
input pins.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add support for compiling the Klipper micro-controller code as a
real-time process capable of running on standard Linux systems.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add initial support for controlling multiple independent
micro-controllers from a single Klippy host instance. Add basic
support for synchronizing the clocks of the additional mcus to the
main mcu's clock.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Don't directly access any of the mcu class variables externally from
the class. Add wrapper functions for those external callers that need
access to some internal state.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Implement the conversion from print_time to the local mcu's clock
within the C code. This simplifies the python code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Everywhere the data in get_last_clock() is used can be done just as
easily with estimated_print_time().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Now that the print_time is always synchronized with the mcu_time,
there is no longer a need to track mcu_time as a separate quantity.
Eliminate references to mcu_time from the code and pass print_time
directly in its place.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of starting the print_time at zero, start it at the estimated
time of the main mcu's clock. This simplifies the code and it ensures
that print_time never goes backwards.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Make sure to initialize mcu_enable to None so that it is initialized
if no 'enable_pin' config value is provided.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Return the same information from stepcompress_push() that is returned
from stepcompress_push_const() and stpcompress_push_delta().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
On corexy, the stepper velocity of a diagonal move could be greater
than the maximum printer velocity. Account for that when setting the
maximum xy halt velocity in the mcu stepper config.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit 4655a6bf allowed naks to be honored if receive_seq was greater
than the last retransmitted sequence. However, receive_seq is the
receiver's next sequence number, so a nak should only be processed if
it is one greater than that.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Make sure schedule_digital_out and schedule_pwm_out commands always go
out with a value that is in range for the particular command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Make sure the ADC range sent to the MCU can be encoded into a 16bit
integer. Otherwise, if the provided min_temp/max_temp was outside the
range of possible values it could result in a spurious mcu shutdown.
In particular, the AD595 could not properly encode a min_temp of zero.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Extend the look-ahead mechanism to work between moves that contain Z
movement. This improves Klipper's handling of g-code produced in
"vase mode".
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow the kinematic classes to query the max velocity, max accel, and
max halt velocity from the toolhead class instead of having the
toolhead class call into the kinematic classes with those values.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit d0932009 changed the way command handling was performed, and
commit 95950949 fixed a defect in that commit. Unfortunately, the fix
was incomplete.
If multiple commands were sent to Klippy without waiting for an "ok"
response from Klippy, then it was possible for those additional
commands to be queued and processed after subsequent commands. This
would result in commands being processed out of order.
Fix this by only reregistering the input fd in the greenlet that
performs the unregistration of the fd.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Invert the if conditional in queue_append() and change the order of
reads in minmax_point() - gcc on the rpi seems to do generate better
code this way.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The RaspberryPi processor implements 'double to int32' conversions
much faster than 'double to int64' conversions. Rework the code so
that steps stored in the queue are always a small offset from the last
sent step time. (In the unlikely event that a step is far from the
last step time, then the queue is flushed to maintain this invariant.)
This simplifies the step compression code as well - it no longer needs
to check for integer overflows.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Create an insertion "cursor" for adding items to the step compression
queue. This makes the calling code simpler and it makes it easier to
update the queue memory management in the future.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The homing operation can be cpu intensive for the host software. Add
a small (250ms) delay before homing so that the host has additional
time to process the command before it is due on the mcu. This is
intended to work around some reports of "timer too close" errors
during Z homing on RPi2 hosts and printers with high precision Z
positioning.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Adjust the configured homing speed so that it always results in a
speed that is an even number of mcu ticks per step. This ensures that
the code can always get good step compression during homing, which is
important as the entire homing operation must be able to fit within
the mcu's move queue. This fixes some "move queue empty" mcu shutdown
errors that could occur when the Z step distance was an unusual size.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow external code to obtain the mcu object that controls a pin setup
with setup_pin(). Also, don't bother defining print_to_mcu_time() and
system_to_mcu_time() on each pin object as they can be obtained via
the new get_mcu() method.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit 9d75c3b0 changed the order of allocation for mcu oid integer
ids. However, the stepper oids must always be allocated before
endstop oids so that corexy can register multiple steppers on a single
endstop.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Preface the internal functions to make it more clear which functions
are interfaces to external code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's no longer necessary to use the TICKS() hack as the config
commands are now all generated after the mcu speed is known.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Support an "ad5206" config section so that one can configure the
digipots found on Reprap "RAMBo" boards.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow digital and PWM output pins to be setup via new config
sections. This makes it easier to setup pin configurations.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The MCU() class needs to track the stepqueues so that it can
initialize the steppersync object. Track the stepqueues directly
instead of via the list of steppers.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Track the oid count separately from the configurable object count -
this way it is possible to have internal objects that don't require an
oid in the mcu.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's not necessary to register and execute "init callbacks" when
configuring the mcu. Instead, have each mcu object produce its init
messages in the build_config() callback.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Allow multiple chips to provide pin mappings (not just the main mcu
chip). Move the pin parsing from the mcu.py code to pins.py and
support mapping from pin descriptions to their corresponding chips and
parameters.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Store pertinent information from the software startup in a dictionary
that the various printer components can access instead of in
individual variables in the Printer() class. This makes it easier to
add future command-line options.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Store the underlying temperature and resistance values instead of the
Steinhart-Hart coefficents obtained from them. This makes it easier
to add new thermistors.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Keep the homing code separate from the main stepper class. This makes
it easier to verify the correct config parameters are provided.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of limiting the amount of non-acked messages to 50ms, limit
the amount to one round-trip-time. This should make it less likely
that the mcu will be overloaded and it should make retransmits faster.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The first message always has a sync byte with it, so its size should
be one larger. Also, the idle_time should always be the minimum time
that the message could be received, so it should always be reset to
eventtime on a retransmit.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If a nak message causes a retransmission then also accept a second nak
message as long as it is for a sequence greater than the first nak.
This should allow faster retransmits when there are multiple
transmission errors in a small time period.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Track the sequence number of the message last retransmitted (not the
sequence number of the next message to be transmitted). This fixes a
small possibility of a valid nak not being honored.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If a retransmit is triggered by a nak, then it is not necessary to
increase the rto. The next retransmit time should be based on the
expected reception of the first retransmitted message, not the last.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Wait for any pending moves to be fully handled before exiting. Make
sure the wait is done inside the "self.is_processing_data" check to
avoid infinite recursion. Don't keep reading from the file while
waiting to exit.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The existing clock synchronization code has two flaws: intermittent
transmission latency during get_status requests can cause the
estimated clock to be too low, and the estimated clock calculation did
not take into account possible clock drift between samples. The
former could potentially lead to "Timer too close" errors and the
latter could potentially lead to "Move queue empty" errors.
Rework the code to avoid the above problems. It's not necessary to
estimate the micro-controller clock as an excellent estimate is
reported by the micro-controller (via the CLOCK_FREQ constant).
Account for a small drift from the reported value, and check on each
sample if the drift exceeds the expected limits. With a good starting
estimated clock, only the offset needs to be calculated. Use previous
offsets (and the estimated clock) in calculation of new offsets to
avoid intermittent latency from badly skewing the results. Finally,
add an additional time offset of one millisecond to account for any
minor inaccuracies.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Some systems point python to python3 instead of python2 - explicitly
request python2 to avoid conflicts.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Make sure the heater.target_temp is set during the auto-tune test so
that the heater.set_pwm() command will allow the heater to be turned
on.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The endstop_position is intended to support different values for each
stepper so that the individual tower heights can be configured.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit d0932009 introduced an error that could cause lost input in
cases where the sender did not wait for an "ok" message before sending
the next command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Don't modify dictionaries while iterating them and be careful to use
// when doing an integer divide.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Create add_printer_objects() functions in the fan, heater, extruder,
and toolhead modules. Create the necessary printer component objects
from this call instead of placing the code directly in klippy.py.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The atmega328 is basically the same as the atmega168 - it just adds
some additional memory. Allow the chip to be selected during the
build.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of assuming the maximum PWM value is 255, export a constant
from the firmware to the host with the maximum value.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
On a retract move (which are common during "wipe" operations), treat
the move as if it were an extrude only move. It's valid for a retract
move to reverse more filament then it would be practical to push.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
When the log file does a rollover, start the top of the log with
critical system information (eg, software versions).
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The set_printer_ready() can be called from a background thread on a
shutdown event, so don't try to lookup the printer components in that
case. Simplify build_handlers() so that it no longer tests for
components being available - test for component availability in the
command handlers.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Always call the regular .parse() method for each message type during
dump() - add a new .format_params() method for dumping a verbose
representation of the parsed message. This allows the new
format_params() to also be used with data already parsed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
No need to recommend users disable "SD card support" in octoprint -
instead, just ignore the M21 command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Always log the last synchronized clock during a shutdown event, and
use debug level for normal reports.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Advice users to issue a FIRMWARE_RESTART command on a printer shutdown
event, and remove support for CLEAR_SHUTDOWN. A full mcu reset is
preferable and it simplifies the interface.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Extend the FIRMWARE_RESTART command so that it can use the firmware
"reset" command instead of the "arduino" mechanism.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add the new item at the same time as checking if there is space in the
queue.
Also, update the default optimization level of c_helper.so to O2 to
improve the compiled code layout.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Calculate where a tower must reverse direction during a move in the C
code instead of the delta.py kinematic code. This simplifies the
python code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The delta code calculates a "virtual tower" along the line of
movement. Rework the variable names and comments to make it clear
that this is occurring.
It is not necessary to pass the start_pos variable to the C code as it
is simple to update the start_pos at the start of each movement.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's not necessary to have separate C delta kinematic functions for
constant acceleration and constant velocity as constant velocity can
be obtained by using a constant acceleration of zero.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Update the C delta kinematic code to take velocity and acceleration
directly in step distances and clock ticks. This simplifies the
mcu.py python code as it only needs to do unit and axis conversion.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
It's not necessary to have separate C functions for constant
acceleration and constant velocity as constant velocity can be
obtained by using a constant acceleration of zero.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Update the C code to take velocity and acceleration directly in step
distances and clock ticks. This simplifies the mcu.py python code as
it only needs to do unit and axis conversion.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Update the set_position() method to convert from millimeters to
absolute step position.
Also, update PrinterStepper.get_homed_offset() and
mcu_stepper.get_commanded_position() to return millimeters.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Now that the kinematic classes call the mcu_stepper with millimeters
and seconds it is no longer necessary for them to directly access the
stepper's position in absolute steps. Rename
mcu_stepper.commanded_position to mcu_stepper._commanded_pos to make
clear it is not a variable intended to be externally accessed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Rework the parameters of step_delta_const() and step_delta_accel() so
that they take velocity and acceleration directly in millimeters and
seconds. This simplifies the delta.py kinematic code.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Rename step_sqrt/step_factor to step_accel/step_const and have them
directly take the velocity and acceleration in millimeters and
seconds. This simplifies the kinematic classes.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Extend the endstop code so that more than one stepper can be halted
during endstop homing. Some kinematic setups (eg, corexy) require an
endstop to support this.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If the reactor isn't running then implement pause using the system
sleep command. This simplifies the users of pause().
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Increase the default motor_off_time from 1 minute to 10 minutes. The
small value is a common source of confusion.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The est_clock calculation code requires timestamps on status messages
to never be prior to the reception of the message. The eventtime of
handle_message() is taken before the read() and there is a small
possibility that it could be inaccurate enough to corrupt the
est_clock calculation. Take a new timestamp when storing receive_time
to prevent this. This fix prevents some firmware "Move queue empty"
shutdowns.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
sqrt() of a negative number in the C code returns NaN. This value
results in behavior that is difficult to debug. Always return 0.0
instead as this results in better behavior that is easier to track
down. Also, on some code paths, safe_sqrt is called on numbers that
are multiplied by very large amounts (eg, 16000000**2) and thus
distinguishing between large and small negative numbers is difficult.
For now, report in the log if the value is below -0.001.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The code disables lookahead between two extruding moves with
significantly different extrude ratios. Unfortunately, it was
possible for very tiny moves to show different extrude ratios just due
to how the slicer implements rounding when it produces the gcode.
Allow lookahead to be enabled between moves with extrude ratios that
are different if they don't noticeably produce more or less extrusion.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Be less likely to raise a "Move exceeds maximum extrusion cross
section" error on very short moves. It's okay to extrude a little
extra plastic on moves shorter than the nozzle diameter.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Catch and ignore any exceptions when trying to shutdown the printer in
toolhead.force_shutdown() - there's a good chance an exception will be
raised as this method is often called after an invalid internal state
is found.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
The previous calculation was only valid if the stepper is always
commanded to a position that is an exact multiple of the
step_distance. The safety check was programmed with a value too large
for other commanded positions, which could result in "No next step"
errors. Fix by changing the calculation to use the worst case
scenario.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Don't force a firmware shutdown on a simple gcode parse error.
Instead, report the error back to the user and otherwise ignore the
command.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Fix a corner case where a residual in the PID could cause a non-zero
pwm request even when the target_temp is zero. (Which could lead to a
firmware "Missed scheduling of next pwm event" shutdown.)
Simplify the logic for suppressing duplicate pwm updates and make sure
a zero target_temp always results in a zero pwm update on the
following set_pwm calculation.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Rename the thermistor_type and thermistor_pin config variables to
sensor_type and sensor_pin. This is in preparation for support of
sensors beyond thermistors.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
When using a sensor that isn't a thermisistor, the maximum and minimum
adc values may be swapped - handle that case.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Now that the mcu objects can be created prior to connecting to the
mcu, it is no longer necessary to separate the init and build_config
phases in the high-level code. Move the mcu objection creation from
the build_config phase to the init phase and eliminate the
build_config phase.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Create a separate callback for setting the min_stop_interval.
Also, move the setting of the stepper max_error from the stepper
configs to the mcu config and rename it to max_stepper_error.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Create a build_config() method on each oid object and call it just
after connecting to the MCU. Move code that requires a connected
state from the oid init to its new build_config method.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Introduce a TICKS() macro during config parsing that will translate
time in seconds to time in clock ticks.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use map_pins() to obtain the pin mapping - don't export
mcu_to_pins(). The functionality of mcu_to_pins() can be obtained by
calling map_pins() with name=None.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Move the logic to calculate and report the stepper's current position
from endstop.c to stepper.c. This localizes the stepper code into
stepper.c.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add initial support for micro-controller resets via the Arduino reset
mechanism. Also, automatically attempt a firmware restart if the
printer CRC does not match.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Don't report a CRC mismatch if a shutdown or other failure occurs
during config - instead report the appropriate details.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Not all hardware has PWM support and there is no compelling reason to
use hardware PWM for fans. Change the default to use software PWM.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Store a full 64bit uptime in the mcu and query it at the start of each
connection. This ensures the host's 64bit clock is always in synch
with the mcu's clock.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Change the mcu PWM value from an integer (0-255) to a float (0. - 1.).
Add support for limiting the maximum power (as measured over a
sufficiently long duration) to a particular heater.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Instead of defaulting the pressure advance lookahead time to be the
same as the pressure_advance variable, allow it to be configured.
Default the new config setting (pressure_advance_lookahead_time) to
10ms.
Also, make the setting more accurate if a future move is accelerating
in the middle of the lookahead window.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Simplify the mechanism for limiting stepper speed (introduced in
commit bdfdf7ef) - split the extreme end of the build envelope into
two zones and use the same speeds for all moves that traverse any part
of one of those zones.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Commit c24b7a7e reworked the way lookahead was done and it introduced
a bug when a full acceleration move is immiedietly followed by a full
deceleration move. In that situation, depending on when the lookahead
queue was flushed, it was possible to call move.move() without calling
move.set_junction(). This resulted in a "Move instance has no
attribute 'accel_t'" internal error.
Simplify and fix the logic for checking full accel moves followed by
full decel moves.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
There's no reason for the user to specify position_max - it can be
inferred on deltas from the endstop positions.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Some XY moves at the extreme end of the build envelope could cause
excessive axis stepper movement. Check for any moves that could
possibly result in a stepper movement of more than 3 times the XY
movement and cap the move's acceleration and speed.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Calculate and store the maximum xy2 value for the given z level each
time the head moves to a new z level. This simplifies the boundary
check for common XY moves.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Report in the log the host CPU type and count. This helps distinguish
between different rpi versions when debugging the log from a problem
report.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
If the user requests a restart and the machine appears to be otherwise
functioning normally, then attempt to stop the heaters and fans prior
to restarting the host. This prevents the firmware from going into a
shutdown state when the heater is on and the host restarts.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Change the lookahead queue so that it attempts to buffer at least
buffer_time_high amount of moves when first starting a print. This
helps ensure the buffer is normally always full.
If the buffer falls below buffer_time_low then it is either due to the
end of a print or because octoprint/klippy is unable to keep up.
Change the code so that in this case the lookahead queue will attempt
to gather buffer_time_high amount of moves before restarting movement.
Update the default buffer_time_low to 1 second and buffer_time_high to
2 seconds. With the above changes a smaller buffer_time_high and a
larger buffer_time_low are more practical.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Use a minimum time window as a heuristic for determining when to try
to lazily flush the lookahead buffer. In the common case this will
result in more moves processed for each flush and thus reduce the
overall cost of the lookahead processing.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>