Scott Lahteine
9c800d1f8c
Position adjustment for bed leveling
2016-06-15 20:49:36 -07:00
esenapaj
44f091a413
Fix for the PR #4023(Add macros to move servos)
...
・Add missing ')'
2016-06-15 22:34:55 +09:00
Scott Lahteine
52ac2a62ee
Merge pull request #4013 from thinkyhead/rc_toolchange_no_move
...
Use "Tn S1" to change tools without moving
2016-06-14 20:13:01 -07:00
Scott Lahteine
d2a00b74e3
Merge pull request #4004 from thinkyhead/rc_feedrate_in_gcode_T
...
Use linear feedrate in gcode_T, not volumetric
2016-06-14 20:10:08 -07:00
Scott Lahteine
8d8180e028
Parse M905 args in Marlin_main.cpp
2016-06-13 19:25:28 -07:00
Scott Lahteine
2b340f5acb
patch LIN_ADVANCE to use code_value_float
2016-06-13 18:54:25 -07:00
Scott Lahteine
b708196770
Merge pull request #4032 from AnHardt/bootscreen-delay
...
Show bootscreen later
2016-06-13 18:27:05 -07:00
Scott Lahteine
587de1b6b6
Merge pull request #3676 from thinkyhead/rc_lin_advance_feature
...
Advance extrusion algorithm – LIN_ADVANCE
2016-06-13 18:04:58 -07:00
AnHardt
b4fedec0d1
Show bootscreen later
...
Init display and show bootscreen later, but init display in `kill()`
to init outputs before the bootscreen delays but being able to display
kill errors.
2016-06-14 01:59:50 +02:00
Scott Lahteine
4fbe818163
Add macros to move servos
2016-06-12 15:38:30 -07:00
Scott Lahteine
7fb69e24fb
Use "Tn S1" to change tools without moving
2016-06-11 15:58:45 -07:00
Scott Lahteine
b75e648f2c
Clarify names of prepare_move functions
2016-06-11 15:32:49 -07:00
Scott Lahteine
0e2bfd0769
Use linear feedrate in gcode_T, not volumetric
2016-06-10 18:27:01 -07:00
Scott Lahteine
6d62a4ffc8
Patch LIN_ADVANCE for style and forward-compatibility
2016-06-09 21:03:27 -07:00
Sebastianv650
fb8e880734
Add LIN_ADVANCE
2016-06-09 21:03:27 -07:00
Scott Lahteine
e2d4919c01
Merge pull request #3991 from thinkyhead/rc_axis_units
...
Rename some vars to clarify their relationship to acceleration
2016-06-09 20:57:01 -07:00
João Brázio
5b5aa1572b
Non-blocking buzzer
2016-06-09 20:20:05 -07:00
Scott Lahteine
72c6f2923f
axis_steps_per_unit => axis_steps_per_mm
2016-06-09 17:04:51 -07:00
Scott Lahteine
cb4704e07a
Rename some planner acceleration vars
...
- `per_sq_second` => `per_s2`
- `per_sqr_second` => `per_s2`
- `axis_steps_per_sqr_second` => `max_acceleration_steps_per_s2`
2016-06-09 17:04:50 -07:00
Scott Lahteine
4980ecc1f7
Smaller binary using inline gcode argument getters
2016-06-08 17:03:28 -07:00
Reid Rankin
16212432c9
G20/21 and M149 support, and code_value() refactor
...
This is an update of MarlinDev PR #196 .
G20/21: support for switching input units between millimeters and
inches.
M149: support for changing input temperature units.
In support of these changes, code_value() and code_value_short() are
replaced with an array of functions which handle converting to the
proper types and/or units.
2016-06-08 16:51:10 -07:00
Scott Lahteine
cca047424d
MBL: cel => cell
2016-06-07 19:10:39 -07:00
Scott Lahteine
43947072d5
Merge pull request #3895 from thinkyhead/rc_singlenozzle_part_2
...
SINGLENOZZLE: EXTRUDERS versus HOTENDS
2016-06-04 15:23:17 -07:00
Scott Lahteine
d7e4e8e9be
Fix a typo in #3955
2016-06-04 02:09:58 -07:00
Scott Lahteine
c2362c1b3c
Apply Marlin coding standards to MBL class
2016-06-03 21:43:32 -07:00
Edward Patel
c06de0f097
MBL: Added keeping MBL active when homing single axises for #3750
2016-06-03 21:42:29 -07:00
Scott Lahteine
f2fb66c00d
With SINGLENOZZLE only set temperature for the active tool
2016-06-03 17:38:03 -07:00
Scott Lahteine
cd441ce652
SINGLENOZZLE: EXTRUDERS versus HOTENDS
2016-06-03 17:38:03 -07:00
Scott Lahteine
32f8300cc6
Merge pull request #3944 from thinkyhead/rc_eboston_lcd_contrast
...
Improved LCD contrast handling
2016-06-03 17:08:41 -07:00
Scott Lahteine
4e13cd3f35
Merge pull request #3955 from MagoKimbra/RCBugFix
...
Fix M428 width DELTA & SCARA
2016-06-03 15:50:37 -07:00
Scott Lahteine
8529122af1
Merge pull request #3946 from thinkyhead/rc_g28_servo_raise_before_stow
...
Raise the servo probe before stow outside ABL context
2016-06-03 15:45:36 -07:00
MagoKimbra
f499be084a
Fix M428 width DELTA & SCARA
2016-06-03 23:23:23 +02:00
Scott Lahteine
664b299a51
This fix is not DELTA compatible
2016-06-02 17:16:19 -07:00
Scott Lahteine
064efb20e0
Also call clear_command_queue for lcd_sdcard_stop
2016-06-02 17:16:19 -07:00
Scott Lahteine
6277395e1e
set_current_position_from_planner() after stepper.quick_stop()
2016-06-02 17:16:19 -07:00
Scott Lahteine
381bc6f0b0
set_position => set_position_mm
2016-06-02 17:16:19 -07:00
Scott Lahteine
9eecb4404b
Make raise_z_after_probing null sometimes
2016-06-02 16:56:49 -07:00
Scott Lahteine
b3a37b493d
Patch G28 servo stow to use Conditionals, raise_z_after_probing
2016-06-02 16:56:49 -07:00
Scott Lahteine
efa7209acf
Improved LCD contrast handling
...
Based on MarlinFirmware/MarlinDev#200 from @eboston
2016-06-02 16:17:34 -07:00
lrpirlet
3aefa04386
Raise the servo probe before stow outside ABL context
2016-06-01 21:53:45 +02:00
Scott Lahteine
d698c89971
Fix bad movement in gcode_T when switching
2016-05-31 19:14:33 -07:00
Scott Lahteine
1a01a44a94
Merge pull request #3936 from thinkyhead/rc_sav_mk1
...
Support for SAV_3DGLCD OLED LCD controller
2016-05-31 18:46:25 -07:00
Scott Lahteine
bd97bbc52a
Make HAS_LCD_CONTRAST a boolean flag
2016-05-31 11:47:02 -07:00
Scott Lahteine
55ef04a566
Need to call dac_init() in setup() for DAC_STEPPER_CURRENT
...
As reported by https://github.com/MarlinFirmware/Marlin/pull/3182#issuecomment-222595488
2016-05-30 23:35:06 -07:00
Scott Lahteine
360adc6a3b
Small reduction in M421 code
2016-05-23 14:25:42 -07:00
Scott Lahteine
a4ed988c60
Two index finding functions for MBL
2016-05-23 14:25:42 -07:00
Scott Lahteine
cadf441059
Merge pull request #3798 from AnHardt/extend-M421
...
Extend M421 with I and J parameters
2016-05-20 16:17:23 -07:00
AnHardt
f5a036510f
Extend M421 with I and J parameters
...
Extend M421 with I and J parameters
2016-05-21 00:18:09 +02:00
Edward Patel
c7d90dc5ec
Add option to configure G28 all axis resting position for MBL
2016-05-20 11:52:27 -07:00
Scott Lahteine
8218558953
Update comments, rename next_ping_ms, followup to #3797
2016-05-19 16:44:57 -07:00
AnHardt
e761bdbb4b
Remove SF_ARC_FIX from G5 (Cubic B-spline)
...
Remove SF_ARC_FIX from G5 (Cubic B-spline).
SF_ARC_FIX is a fix for G2/G3 (arcs) where Skeinforge always produced relative instead of absolute coordinates for the endpoint of an arc.
It's very unlikely this is also a problem with Cubic B-splines. More likely is copying from the G2/G3 code.
2016-05-19 21:00:12 +02:00
AnHardt
2207001333
No compromises for the manage_heater()
...
No compromises for the manage_heater(). manage_heater() will return immediately when there is nothing to do, but needs a constant detaT to work proper.
Calling idle() only every 200ms results in a display update every ~2 seconds - that should be enough.
For the other functionalities in idle() and manage_inactivity() 200ms is a lot but hopefully works.
2016-05-19 20:52:11 +02:00
João Brázio
e6effb8f35
Implements S1 argument in M999
2016-05-19 00:13:33 +01:00
Scott Lahteine
4041508ffb
Function decl. in headers don't need "extern"
2016-05-17 18:35:01 -07:00
Scott Lahteine
d66e53c42b
Merge pull request #3782 from thinkyhead/rc_home_z_before_g29
...
Require homing of Z before G29
2016-05-17 17:53:56 -07:00
Scott Lahteine
552516ddf5
Merge pull request #3781 from AnHardt/minor-delta-segmenting-speedup
...
Minor DELTA segmentation speedup
2016-05-17 17:17:38 -07:00
Scott Lahteine
a28970784c
XYZ unhomed
2016-05-17 17:02:53 -07:00
Scott Lahteine
a9926b71a4
Require homing of Z before G29
2016-05-17 16:57:12 -07:00
AnHardt
41e9569dbc
Minor DELTA segmentation speedup
...
Minor DELTA segmentation speedup by pulling calculations out of the loop.
2016-05-18 01:49:30 +02:00
Scott Lahteine
3016dfe484
Merge pull request #3744 from thinkyhead/rc_bezier_curves
...
Add BEZIER_CURVE_SUPPORT — G5 command
2016-05-17 13:57:38 -07:00
Scott Lahteine
d0ac4541d3
Merge pull request #3775 from jbrazio/bugfix/followup-3770
...
G29: Report final position back to host when using MBL
2016-05-17 13:55:26 -07:00
João Brázio
b6a3aef297
G29: Report final position back to host when using MBL
2016-05-17 01:27:59 +01:00
esenapaj
95f30529a6
Add stowing process for MECHANICAL_PROBE
2016-05-16 18:12:10 +09:00
esenapaj
e2b87f6c85
Separate Z_PROBE_ALLEN_KEY from MECHANICAL_PROBE
2016-05-16 18:12:10 +09:00
Scott Lahteine
754b0152f5
Fix MBL zigzag calls
2016-05-15 12:35:01 -07:00
Scott Lahteine
13175ce7da
Fix error checking in M421
2016-05-14 17:12:44 -07:00
João Brázio
8a18c52002
Adds an option to disable print job timer auto start
2016-05-14 15:22:44 -07:00
João Brázio
a79267217b
M78 now allows stats reset using the S78 argument
2016-05-14 15:22:44 -07:00
Scott Lahteine
a713043acd
Merge pull request #3749 from esenapaj/patch-3
...
Enclose all #error strings by double-quotes
2016-05-14 15:01:56 -07:00
Scott Lahteine
3cfea3ff12
Merge pull request #3752 from AnHardt/fix-FIX_MOUNTED_PROBE
...
G29 missing FIX_MOUNTED_PROBE condition
2016-05-14 15:00:42 -07:00
Scott Lahteine
ddac17a195
Add BEZIER_CURVE_SUPPORT (G5 XYZEFIJPQ)
2016-05-14 14:52:08 -07:00
AnHardt
8a4376d51f
Idle during long arcs
...
Idle during long arcs
to prevent from watchdog resets during high segmented fast arcs.
2016-05-14 00:29:13 +02:00
esenapaj
888443ca1e
Enclose all #error strings with apostrophes
2016-05-13 21:10:23 +09:00
AnHardt
b74af78736
Make arc support (G2/G3) configurable
...
Saves about 2669 bytes when deactivated. (About 1% for a AT2560, about __4%__ for a AT644!)
2016-05-13 13:27:45 +02:00
AnHardt
aef2559bd8
fix-FIX_MOUNTED_PROBE
...
Add a forgotten condition
2016-05-13 12:07:17 +02:00
Scott Lahteine
aaeadf0cbd
If no "B" parameter given, get 1 byte
2016-05-11 15:30:08 -07:00
Scott Lahteine
a6d594665b
Print an error on bad i2c request
...
Reference: https://github.com/MarlinFirmware/Marlin/pull/3713#issuecomment-218333678
2016-05-11 15:30:02 -07:00
Scott Lahteine
56dd31ea3c
Use code_value_long for potentially large values
...
Addressing #3711
2016-05-10 09:15:31 -07:00
Scott Lahteine
96b71e62c0
Fix dipping on DELTA robots during G29
...
- Addressing #3689 , et. al.
2016-05-08 18:28:46 -07:00
Scott Lahteine
15fc93d742
Cleanup and consolidate probe conditionals for clarity
2016-05-08 12:59:43 -07:00
Scott Lahteine
084f6b5b44
Temperature singleton class
2016-05-04 19:42:12 -07:00
esenapaj
605808fe37
Additional follow-up the PR #3631(Encapsulate S...
...
Additional follow-up the PR #3631(Encapsulate Stepper, Planner, Endstops in singleton classes)
・Change from abort_on_endstop_hit to stepper.abort_on_endstop_hit in endstop.cpp, Marlin_main.cpp, and ultralcd.cpp
・Add include path to cardreader.h and temperature.h in endstop.cpp(for CardReader class and disable_all_heaters())
It fix compilation error when ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED and SDSUPPORT are enabled.
・Change from digipot_current() to stepper.digipot_current() in Marlin_main.cpp
・Change from digitalPotWrite() to stepper.digitalPotWrite() in Marlin_main.cpp
It fix compilation errors when HAS_DIGIPOTSS is enabled.
・Change from microstep_mode() to stepper.microstep_mode() in Marlin_main.cpp
・Change attribute of microstep_mode() from private to public in stepper.h
・Change from microstep_readings() to stepper.microstep_readings() in Marlin_main.cpp
・Change from microstep_ms() to stepper.microstep_ms() in Marlin_main.
It fix compilation errors when HAS_MICROSTEPS is enabled.
2016-05-03 18:28:37 +09:00
esenapaj
a82cfcff2d
Follow-up the PR #3631(Encapsulate Stepper, ...
...
Follow-up the PR #3631(Encapsulate Stepper, Planner, Endstops in singleton classes)
plan_bed_level_matrix -> planner.bed_level_matrix in multi extruders section of Marlin_main.cpp
It probably fix the Issue #3658(plan_bed_level_matrix not declarate).
movesplanned() -> planner.movesplanned() in ADVANCED_OK section of Marlin_main.cpp
It fix compilation error when ADVANCED_OK is enabled
2016-05-02 22:04:26 +09:00
Scott Lahteine
462a8a951e
A little extra gcode_T spacing
2016-04-30 17:26:50 -07:00
Scott Lahteine
96f51f400f
Planner singleton class
2016-04-30 17:26:50 -07:00
Scott Lahteine
5076d12344
Localize M119 in Endstops class
2016-04-30 17:26:50 -07:00
Scott Lahteine
5e4e535ce8
Stepper and Endstops as singleton objects
2016-04-30 17:26:50 -07:00
Scott Lahteine
6d3e4e1f8f
Prevent stuck M109/M190 when target is changed
2016-04-30 17:03:54 -07:00
Scott Lahteine
c3ef9993b9
Merge pull request #3625 from jbrazio/feature/print-counter
...
Print job statistics
2016-04-29 15:31:14 -07:00
João Brázio
1491d682fb
Miscellaneous tweaks on PrintCounter
2016-04-29 23:13:59 +01:00
João Brázio
d6cfcc9c8b
Added new G-Code: M78
2016-04-29 23:13:58 +01:00
Scott Lahteine
f4706bb90e
Keepalive not needed while waiting for temperatures
2016-04-28 21:11:15 -07:00
Blue-Marlin
e58e281473
Fix feedrate after toolchange
...
The fix is simple. Most changes are because of changed indendation,
bacause of leaving early for wrong tool number
2016-04-27 00:57:45 +02:00
Scott Lahteine
ec82e1e05d
Merge pull request #3616 from thinkyhead/rc_fixup_some_movement
...
General cleanup around high level move functions
2016-04-25 20:23:38 -07:00
Scott Lahteine
abeab792cb
General cleanup around high level move functions
...
- Use new `DEBUG_POS` macro for `DELTA` debug
- Neaten up `prepare_move` a smidgen
- Remove an old commented `prepare_move()` line
2016-04-25 20:02:24 -07:00
Scott Lahteine
68d0347e67
Call report_current_position after M206 / M428
2016-04-25 18:43:28 -07:00
Scott Lahteine
dcb4cdaa9e
Call report_current_position instead of gcode_M114 directly
2016-04-25 18:43:27 -07:00
João Brázio
a901555da4
Moved G29 debug output before matrix.set_to_identity()
2016-04-22 20:57:22 -07:00
Scott Lahteine
1caa2628da
Use sync_plan_position_e function elsewhere
2016-04-20 13:02:19 -07:00
Scott Lahteine
c7df961144
Fix G92 so it only sets the plan position once
2016-04-20 13:01:58 -07:00
Scott Lahteine
3db5a75f30
Merge pull request #3568 from thinkyhead/rc_various_fixes
...
General code cleanup, improved naming, etc.
2016-04-19 20:53:38 -07:00
Scott Lahteine
ac69fad96d
lowercase "stop" function
2016-04-19 19:43:54 -07:00
Scott Lahteine
39ee9c526b
setTargetedHotend => get_target_extruder_from_command
2016-04-19 19:43:54 -07:00
Scott Lahteine
cafa8b8ce3
Rename filament runout items
2016-04-19 19:43:39 -07:00
Scott Lahteine
27b2e2e786
Document some variables
2016-04-19 19:43:39 -07:00
Scott Lahteine
a4062a47ac
Rename baricuda variables
2016-04-19 19:43:38 -07:00
Scott Lahteine
78747b1328
min_pos/max_pos => sw_endstop_min/sw_endstop_max
2016-04-19 19:43:38 -07:00
Scott Lahteine
ba84d8d091
Allow setting PIDTEMP and PIDTEMPBED together or apart
2016-04-19 18:09:29 -07:00
Scott Lahteine
a26d70e932
Apply indentation to gcode_M303, PID_autotune
2016-04-18 19:04:45 -07:00
Scott Lahteine
ba66336503
Output error for disabled M303
2016-04-18 19:03:45 -07:00
Scott Lahteine
5905ec5ba8
Merge pull request #3541 from thinkyhead/rc_mbl_one_last_lift
...
Add a final lift, if configured, in Manual Bed Leveling
2016-04-17 17:20:02 -07:00
Jeff K
90c49f5a14
Fixed invalid addressing (overflow) of position_shift / software endstops
...
Signed-off-by: Jeff K
2016-04-17 19:28:50 -04:00
Scott Lahteine
c242bee449
Add a final lift, if configured, in Manual Bed Leveling
2016-04-17 00:12:46 -07:00
Scott Lahteine
837df6108c
Fix borked set_bed_level_equation_lsq
2016-04-16 20:35:42 -07:00
Scott Lahteine
4b75b11a53
Wrap defines in parentheses in configs, M48
2016-04-16 18:21:09 -07:00
Scott Lahteine
234987ee2f
Fix MBL lift
2016-04-16 14:17:06 -07:00
Scott Lahteine
e0830bf8f1
Don't use LCD alert unless error or alert level is reset later
2016-04-15 18:48:49 -07:00
Scott Lahteine
a8e4d7c135
Merge pull request #3477 from alephobjects/BedTempHysteresis
...
Implementation of M190 bed temp hysteresis
2016-04-15 16:20:58 -07:00
esenapaj
5ecd75eeb3
Fix for PR #3502(General cleanup of arc code)
2016-04-16 07:22:07 +09:00
gralco
8ec8d59df8
Use #if TEMP_RESIDENCY_TIME > 0 rather than #ifdef TEMP_RESIDENCY_TIME
2016-04-15 11:20:32 -06:00
Scott Lahteine
6e52b0b723
Merge pull request #3504 from thinkyhead/rc_fix_debugging
...
Fix debugging of vector_3
2016-04-14 19:08:30 -07:00
Scott Lahteine
88367a37f7
Merge pull request #3227 from thinkyhead/rc_home_offsets_and_limits
...
Relating current_position, min_pos, max_pos, and home_offset
2016-04-14 18:50:43 -07:00
Scott Lahteine
b20bf1826d
Fix debugging of vector_3
2016-04-14 18:45:26 -07:00
Scott Lahteine
b243844690
Merge pull request #3502 from thinkyhead/rc_fix_arcs_bugs
...
General cleanup of arc code
2016-04-14 18:19:44 -07:00
Scott Lahteine
2129db581e
Simplify MBL movement, zigzag
2016-04-14 16:58:42 -07:00
Scott Lahteine
0493fccc0b
mbl.active is a bool now
2016-04-14 16:58:42 -07:00
Scott Lahteine
8e5099fa0c
Update software endstop positions with M206, M428, G92, etc.
2016-04-14 16:47:22 -07:00
Scott Lahteine
5cfb2533d6
Initial cleaning up of arc code
2016-04-14 16:43:49 -07:00
Scott Lahteine
9ce4264fda
Merge pull request #3490 from thinkyhead/rc_mbl_adjustments
...
Document some movement functions, rename a local
2016-04-13 20:55:20 -07:00
esenapaj
2eb1b102f8
Support for "mechanical probe" with Allen Key as a special case
2016-04-13 20:34:12 -07:00
Scott Lahteine
cfcd3d7b3e
Rename z_offset local to zoffset
2016-04-13 20:09:20 -07:00
Scott Lahteine
5fd20ecac3
Comments on some movement functions
2016-04-13 20:09:20 -07:00
Scott Lahteine
a781a6f955
Apply esenapaj 3479 and delta/scara position bugfix
2016-04-13 17:41:20 -07:00
Scott Lahteine
525d8256d4
Merge pull request #3481 from thinkyhead/rc_extruder_offset_array
...
Fix: gcode_T using non-existent Z offset
2016-04-12 18:23:08 -07:00
Scott Lahteine
46881c846c
Add comments for extruder offset options
2016-04-12 17:16:58 -07:00
Scott Lahteine
edf376ce0d
Fix: gcode_T using non-existent Z offset
...
As noted by @snowzach in #3461
2016-04-12 17:15:10 -07:00
gralco
178aeb79c8
Implementation of M190 bed temp hysteresis
2016-04-12 08:56:14 -06:00
Scott Lahteine
0439483bc8
Merge pull request #3476 from thinkyhead/rc_debug_leveling_gcode_t
...
Add DEBUG_LEVELING output for gcode_T
2016-04-11 21:03:15 -07:00
Scott Lahteine
63d8893f5d
Add DEBUG_LEVELING output for gcode_T
2016-04-11 20:45:10 -07:00
Scott Lahteine
f840c7de4d
Initialize stepper counts for Delta/SCARA
2016-04-11 19:02:35 -07:00
Scott Lahteine
56acaf3594
Merge pull request #3469 from thinkyhead/rc_aleph_cooldownfix
...
Fix for M109 and M190 cooldown
2016-04-11 18:01:01 -07:00
gralco
c218db136a
Fix for M109 and M190 cooldown
...
Also removes the re-definition of now inside M190's while loop
2016-04-11 17:12:23 -07:00
Scott Lahteine
c5a2ce4366
Merge pull request #3446 from thinkyhead/rc_fixup_M206_and_mesh
...
Fix home_offset handling and account for it in G29
2016-04-11 16:49:01 -07:00
Scott Lahteine
b1bb1c7989
Merge pull request #3466 from thinkyhead/rc_look_for_leveling_bug
...
Add CORE support to st_set_position and plan_set_position
2016-04-11 16:45:00 -07:00
Scott Lahteine
fdee2be49c
More logging of matrix behavior
2016-04-11 00:06:33 -07:00
Scott Lahteine
7f265db3ef
Move sync_plan_position after DEBUG_LEVELING
2016-04-10 23:40:11 -07:00
Scott Lahteine
02550af7c3
Merge pull request #3453 from thinkyhead/rc_jbrazio_m190
...
ELAPSED / PENDING for rollover-safe time checking
2016-04-10 20:25:02 -07:00
Scott Lahteine
803845ec18
Add a case for M113 to process_next_command
2016-04-10 18:53:03 -07:00
Scott Lahteine
386140f361
Test time difference in safe way
2016-04-10 18:09:31 -07:00
Scott Lahteine
1b7356b3a1
Account for home_offset in G29 handler
2016-04-10 15:35:02 -07:00