diff --git a/.gitignore b/.gitignore index 844cd7a67..b61325d28 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ *.elf *.DS_Store *.d + +README.md diff --git a/COPYING b/COPYING index 8bc83929b..cdf88d6a9 100644 --- a/COPYING +++ b/COPYING @@ -1,56 +1,31 @@ ------------------------------------------------------------------------------ -COPYRIGHT NOTICE FOR GRBL v0.9: +COPYRIGHT NOTICE FOR GRBL: ------------------------------------------------------------------------------ -GRBL v0.9 - Embedded CNC g-code interpreter and motion-controller -Copyright (c) 2012-2014 Sungeun K. Jeon +Grbl - Embedded CNC g-code interpreter and motion-controller -This program is free software: you can redistribute it and/or modify +Copyright (c) 2011-2015 Sungeun K. Jeon +Copyright (c) 2009-2011 Simen Svale Skogsrud +Copyright (c) 2011 Jens Geisler + +Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. -This program is distributed in the hope that it will be useful, +Grbl is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program. If not, see . - +along with Grbl. If not, see . ------------------------------------------------------------------------------ COPYRIGHT NOTICE(S) FOR WORK CONTAINED IN THIS SOFTWARE: ------------------------------------------------------------------------------ -The MIT License (MIT) - -GRBL(tm) v0.8 - Embedded CNC g-code interpreter and motion-controller -Copyright (c) 2009-2011 Simen Svale Skogsrud -Copyright (c) 2011-2013 Sungeun K. Jeon -Copyright (c) 2011 Jens Geisler - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -------------- - Copyright (c) 2008, Atmel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without @@ -704,5 +679,3 @@ Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS - ------------------------------------------------------------------------------- diff --git a/Makefile b/Makefile index 77542dda3..52ff5d46b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Part of Grbl # # Copyright (c) 2009-2011 Simen Svale Skogsrud -# Copyright (c) 2012 Sungeun K. Jeon +# Copyright (c) 2012-2015 Sungeun K. Jeon # # Grbl is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -31,33 +31,36 @@ DEVICE ?= atmega2560 CLOCK = 16000000 PROGRAMMER ?= -c avrisp2 -P usb -OBJECTS = main.o motion_control.o gcode.o spindle_control.o coolant_control.o serial.o \ - protocol.o stepper.o eeprom.o settings.o planner.o nuts_bolts.o limits.o \ - print.o probe.o report.o system.o +SOURCE = main.c motion_control.c gcode.c spindle_control.c coolant_control.c serial.c \ + protocol.c stepper.c eeprom.c settings.c planner.c nuts_bolts.c limits.c \ + print.c probe.c report.c system.c +BUILDDIR = build +SOURCEDIR = grbl # FUSES = -U hfuse:w:0xd9:m -U lfuse:w:0x24:m FUSES = -U hfuse:w:0xd2:m -U lfuse:w:0xff:m # Tune the lines below only if you know what you are doing: AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE) -B 10 -F -COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -I. -ffunction-sections +COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE) -I. -ffunction-sections -fdata-sections + +OBJECTS = $(addprefix $(BUILDDIR)/,$(notdir $(SOURCE:.c=.o))) # symbolic targets: all: grbl.hex -.c.o: - $(COMPILE) -c $< -o $@ - @$(COMPILE) -MM $< > $*.d +$(BUILDDIR)/%.o: $(SOURCEDIR)/%.c + $(COMPILE) -MMD -MP -c $< -o $@ .S.o: - $(COMPILE) -x assembler-with-cpp -c $< -o $@ + $(COMPILE) -x assembler-with-cpp -c $< -o $(BUILDDIR)/$@ # "-x assembler-with-cpp" should not be necessary since this is the default # file type for the .S (with capital S) extension. However, upper case # characters are not always preserved on Windows. To ensure WinAVR # compatibility define the file type manually. -.c.s: - $(COMPILE) -S $< -o $@ +#.c.s: + $(COMPILE) -S $< -o $(BUILDDIR)/$@ flash: all $(AVRDUDE) -U flash:w:grbl.hex:i @@ -73,25 +76,25 @@ load: all bootloadHID grbl.hex clean: - rm -f grbl.hex main.elf $(OBJECTS) $(OBJECTS:.o=.d) + rm -f grbl.hex $(BUILDDIR)/*.o $(BUILDDIR)/*.d $(BUILDDIR)/*.elf # file targets: -main.elf: $(OBJECTS) - $(COMPILE) -o main.elf $(OBJECTS) -lm -Wl,--gc-sections +$(BUILDDIR)/main.elf: $(OBJECTS) + $(COMPILE) -o $(BUILDDIR)/main.elf $(OBJECTS) -lm -Wl,--gc-sections -grbl.hex: main.elf +grbl.hex: $(BUILDDIR)/main.elf rm -f grbl.hex - avr-objcopy -j .text -j .data -O ihex main.elf grbl.hex - avr-size --format=berkeley main.elf + avr-objcopy -j .text -j .data -O ihex $(BUILDDIR)/main.elf grbl.hex + avr-size --format=berkeley $(BUILDDIR)/main.elf # If you have an EEPROM section, you must also create a hex file for the # EEPROM and add it to the "flash" target. # Targets for code debugging and analysis: disasm: main.elf - avr-objdump -d main.elf + avr-objdump -d $(BUILDDIR)/main.elf cpp: - $(COMPILE) -E main.c + $(COMPILE) -E $(SOURCEDIR)/main.c # include generated header dependencies --include $(OBJECTS:.o=.d) +-include $(BUILDDIR)/$(OBJECTS:.o=.d) diff --git a/README.md b/README.md index 59ed096ce..7facb9a11 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -#Grbl - An embedded g-code interpreter and motion-controller for the Arduino/AVR328 microcontroller +![GitHub Logo](/doc/media/Grbl Logo 250px.png) + *** @@ -10,24 +11,34 @@ It accepts standards-compliant g-code and has been tested with the output of sev Grbl includes full acceleration management with look ahead. That means the controller will look up to 18 motions into the future and plan its velocities ahead to deliver smooth acceleration and jerk-free cornering. -* [Licensing](https://github.com/grbl/grbl/wiki/Licensing): Grbl v0.9 is free software, released under the GPLv3 license. Obsolete versions of Grbl, v0.8 and prior, are released under the permissive MIT-license. This will ensure Grbl will always be an open-source project while making the code permissive for others. +* [Licensing](https://github.com/grbl/grbl/wiki/Licensing): Grbl is free software, released under the GPLv3 license. * For more information and help, check out our **[Wiki pages!](https://github.com/grbl/grbl/wiki)** If you find that the information is out-dated, please to help us keep it updated by editing it or notifying our community! Thanks! -* Lead Developer [_2011 - Current_]: Sonny Jeon, Ph.D. (USA) +* Lead Developer [_2011 - Current_]: Sungeun(Sonny) K. Jeon, Ph.D. (USA) aka @chamnit * Lead Developer [_2009 - 2011_]: Simen Svale Skogsrud (Norway). aka The Originator/Creator/Pioneer/Father of Grbl. *** +### Official Supporters of the Grbl CNC Project +![Official Supporters](https://dl.dropboxusercontent.com/u/2221997/Contributors.png) + +*** + _**Master Branch:**_ -* [Grbl v0.9g Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1m8E1Qa) _(2014-09-05)_ -* [Grbl v0.9g Atmega328p 16mhz 115200baud with ShapeOko2 defaults](http://bit.ly/1kOAzig) _(2014-09-05)_ - - **IMPORTANT INFO WHEN UPGRADING TO GRBL v0.9g:** +* [Grbl v0.9j Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1I8Ey4S) _(2015-09-30)_ +* [Grbl v0.9j Atmega328p 16mhz 115200baud with ShapeOko2 defaults](http://bit.ly/1OjUSia) _(2015-09-30)_ + - **IMPORTANT INFO WHEN UPGRADING TO GRBL v0.9 :** - Baudrate is now **115200** (Up from 9600). - - Settings WILL be overwritten. Please make sure you have a backup. Also, settings have been renumbered and some have changed how they work. See our [Configuring v0.9 Wiki page](https://github.com/grbl/grbl/wiki/Configuring-Grbl-v0.9) for details. + - Homing cycle updated. Located based on switch trigger, rather than release point. + - Variable spindle is now enabled by default. Z-limit(D12) and spindle enable(D11) have switched to access the hardware PWM on D11. Homing will not work if you do not re-wire your Z-limit switch to D12. _**Archives:**_ +* [Grbl v0.9i Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1EiviDk) +* [Grbl v0.9i Atmega328p 16mhz 115200baud with ShapeOko2 defaults](http://bit.ly/1NYIfKl) +* [Grbl v0.9g Atmega328p 16mhz 115200baud with generic defaults](http://bit.ly/1m8E1Qa) +* [Grbl v0.9g Atmega328p 16mhz 115200baud with ShapeOko2 defaults](http://bit.ly/1kOAzig) * [Grbl v0.8c Atmega328p 16mhz 9600baud](http://bit.ly/SSdCJE) * [Grbl v0.7d Atmega328p 16mhz 9600baud](http://bit.ly/ZhL15G) * [Grbl v0.6b Atmega328p 16mhz 9600baud](http://bit.ly/VD04A5) @@ -35,49 +46,65 @@ _**Archives:**_ * [Grbl v0.6b Atmega168 16mhz 9600baud](http://bit.ly/SScWnE) * [Grbl v0.51 Atmega168 16mhz 9600baud](http://bit.ly/VXyrYu) -------------- - -_Grbl is an open-source project and fueled by the free-time of our intrepid administrators and altruistic users. If you'd like to donate, all proceeds will be used to help keep this project sustainable and to fund supporting equipment. Thank you!_ - -| [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=EBQWAWQAAT878) | [![Flattr Grbl](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=chamnit&url=github.com/grbl/grbl&title=Grbl&language=&tags=github&category=software) | [![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.1.3/dist/gratipay.png)](https://gratipay.com/chamnit/) | -|:--:|:--:|:--:| - *** -##Update Summary for v0.9 from v0.8 - - **IMPORTANT: Default serial baudrate is now 115200! (Up from 9600). And your settings will be over-written! Make sure to have a backup.** - - **_NEW_ Super Smooth Stepper Algorithm:** Complete overhaul of the handling of the stepper driver to simplify and reduce task time per ISR tick. Much smoother operation with the new Adaptive Multi-Axis Step Smoothing (AMASS) algorithm which does what its name implies (see stepper.c source for details). Users should immediately see significant improvements in how their machines move and overall performance! - - **Stability and Robustness Updates:** Grbl's overall stability has been focused on for this version. The planner and step-execution interface has been completely re-written for robustness and incorruptibility by the introduction of an intermediate step segment buffer that "checks-out" steps from the planner buffer in real-time. This means we can now fearlessly drive Grbl to it's highest limits. Combined with the new stepper algorithm and planner optimizations, this translated to **5x to 10x** overall performance increases in our testing! Also, stability and robustness tests have been reported to easily take 1.4 million (yes, **million**) line g-code programs like a champ! - - **(x4)+ Faster Planner:** Planning computations improved four-fold or more by optimizing end-to-end operations, which included streamlining the computations and introducing a planner pointer to locate un-improvable portions of the buffer and not waste cycles recomputing them. - - **Compile-able via Arduino IDE!:** Grbl's source code may be now download and altered, and then be compiled and flashed directly through the Arduino IDE, which should work on all platforms. See the Wiki for details on how to do it. - - **G-Code Parser Overhaul:** Completely re-written from the ground-up for 100%-compliance* to the g-code standard. (* Parts of the NIST standard are a bit out-dated and arbitrary, so we altered some minor things to make more sense. Differences are outlined in the source code.) We also took steps to allow us to break up the g-code parser into distinct separate tasks, which is key for some future development ideas and improvements. - - **Independent Acceleration and Velocity Settings:** Each axes may be defined with unique acceleration and velocity parameters and Grbl will automagically calculate the maximum acceleration and velocity through a path depending on the direction traveled. This is very useful for machines that have very different axes properties, like the ShapeOko's z-axis. - - **Soft Limits:** Checks if any motion command exceeds workspace limits before executing it, and alarms out, if detected. Another safety feature, but, unlike hard limits, position does not get lost, as it forces a feed hold before erroring out. NOTE: This still requires limit switches for homing so Grbl knows where the machine origin is, and the new max axis travel settings configured correctly for the machine. - - **Probing:** The G38.2 straight probe and G43.1/49 tool offset g-code commands are now supported. A simple probe switch must be connected to the Uno analog pin 5 (normally-open to ground). Grbl will report the probe position back to the user when the probing cycle detects a pin state change. - - **Tool Length Offsets:** Probing doesn't make sense without tool length offsets(TLO), so we added it! The G43.1 dynamic TLO (described by linuxcnc.org) and G49 TLO cancel commands are now supported. G43.1 dynamic TLO works like the normal G43 TLO(NOT SUPPORTED) but requires an additional axis word with the offset value attached. We did this so Grbl does not have to track and maintain a tool offset database in its memory. Perhaps in the future, we will support a tool database, but not for this version. - - **Improved Arc Performance:** The larger the arc radius, the faster Grbl will trace it! We are now defining arcs in terms of arc chordal tolerance, rather than a fixed segment length. This automatically scales the arc segment length such that maximum radial error of the segment from the true arc is never more than the chordal tolerance value of a super-accurate default of 0.002 mm. - - **CPU Pin Mapping:** In an effort for Grbl to be compatible with other AVR architectures, such as the 1280 or 2560, a new cpu_map.h pin configuration file has been created to allow Grbl to be compiled for them. This is currently user supported, so your mileage may vary. If you run across a bug, please let us know or better send us a fix! Thanks in advance! - - **New Grbl SIMULATOR! (by @jgeisler and @ashelly):** A completely independent wrapper of the Grbl main source code that may be compiled as an executable on a computer. No Arduino required. Simply simulates the responses of Grbl as if it was on an Arduino. May be used for many things: checking out how Grbl works, pre-process moves for GUI graphics, debugging of new features, etc. Much left to do, but potentially very powerful, as the dummy AVR variables can be written to output anything you need. - - **Configurable Real-time Status Reporting:** Users can now customize the type of real-time data Grbl reports back when they issue a '?' status report. This includes data such as: machine position, work position, planner buffer usage, serial RX buffer usage. - - **Updated Homing Routine:** Sets workspace volume in all negative space regardless of limit switch position. Common on pro CNCs. But, the behavior may be changed by a compile-time option though. Now tied directly into the main planner and stepper modules to reduce flash space and allow maximum speeds during seeking. - - **Optional Limit Pin Sharing:** Limit switches can be combined to share the same pins to free up precious I/O pins for other purposes. When combined, users must adjust the homing cycle mask in config.h to not home the axes on a shared pin at the same time. Don't worry; hard limits and the homing cycle still work just like they did before. - - **Optional Variable Spindle Speed Output:** Available only as a compile-time option through the config.h file. Enables PWM output for 'S' g-code commands. Enabling this feature will swap the Z-limit D11 pin and spindle enable D12 pin to access the hardware PWM on pin D11. The Z-limit pin, now on D12, should work just as it did before. - - **Additional Compile-Time Feature Options:** Line number tracking, real-time feed rate reporting. - - **SLATED FOR v1.0 DEVELOPMENT** Jogging controls and feedrate/spindle/coolant overrides. (In v0.9, the framework for feedrate overrides are in-place, only the minor details to complete it have yet to be installed.) +##Update Summary for v0.9j + - **Restore EEPROM feature:** A new set of restore EEPROM features to help OEMs and users reset their Grbl installation to the build defaults. See Configuring Grbl Wiki for details. + +##Update Summary for v0.9i + - **IMPORTANT:** + - **Homing cycle updated. Locates based on trigger point, rather than release point.** + - **System tweaks: $14 cycle auto-start has been removed. No more QUEUE state.** + - **New G-Codes** + - **CoreXY Support** + - **Safety Door Support** + - **Full Limit and Control Pin Configurability** + - **Additional Compile-Time Feature Options** + +##Update Summary for v0.9h from v0.8 + - **IMPORTANT:** + - **Default serial baudrate is now 115200! (Up from 9600)** + - **Z-limit(D12) and spindle enable(D11) pins have switched to support variable spindle!** + - **Super Smooth Stepper Algorithm** + - **Stability and Robustness Updates** + - **(x4)+ Faster Planner** + - **Compile-able via Arduino IDE!** + - **G-Code Parser Overhaul** + - **Independent Acceleration and Velocity Settings** + - **Soft Limits** + - **Probing** + - **Dynamic Tool Length Offsets** + - **Improved Arc Performance** + - **CPU Pin Mapping** + - **New Grbl SIMULATOR! (by @jgeisler and @ashelly)** + - **Configurable Real-time Status Reporting** + - **Updated Homing Routine** + - **Optional Limit Pin Sharing** + - **Optional Variable Spindle Speed Output** + - **Additional Compile-Time Feature Options** - ``` -List of Supported G-Codes in Grbl v0.9 - - Non-Modal Commands: G4, G10 L2, G10 L20, G28, G30, G28.1, G30.1, G53, G92, G92.1 - - Motion Modes: G0, G1, G2, G3, G38.1, G80 +List of Supported G-Codes in Grbl v0.9 Master: + - Non-Modal Commands: G4, G10L2, G10L20, G28, G30, G28.1, G30.1, G53, G92, G92.1 + - Motion Modes: G0, G1, G2, G3, G38.2, G38.3, G38.4, G38.5, G80 - Feed Rate Modes: G93, G94 - Unit Modes: G20, G21 - Distance Modes: G90, G91 + - Arc IJK Distance Modes: G91.1 - Plane Select Modes: G17, G18, G19 - Tool Length Offset Modes: G43.1, G49 + - Cutter Compensation Modes: G40 - Coordinate System Modes: G54, G55, G56, G57, G58, G59 + - Control Modes: G61 - Program Flow: M0, M1, M2, M30* - Coolant Control: M7*, M8, M9 - Spindle Control: M3, M4, M5 + - Valid Non-Command Words: F, I, J, K, L, N, P, R, S, T, X, Y, Z ``` + +------------- +Grbl is an open-source project and fueled by the free-time of our intrepid administrators and altruistic users. If you'd like to donate, all proceeds will be used to help fund supporting hardware and testing equipment. Thank you! + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CUGXJHXA36BYW) diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 000000000..86d0cb272 --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,4 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore \ No newline at end of file diff --git a/cpu_map.h b/cpu_map.h deleted file mode 100644 index 5fd1be988..000000000 --- a/cpu_map.h +++ /dev/null @@ -1,627 +0,0 @@ -/* - cpu_map.h - CPU and pin mapping configuration file - Part of Grbl v0.9 - - Copyright (c) 2012-2014 Sungeun K. Jeon - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ - -/* The cpu_map.h file serves as a central pin mapping settings file for different processor - types, i.e. AVR 328p or AVR Mega 2560. Grbl officially supports the Arduino Uno, but the - other supplied pin mappings are supplied by users, so your results may vary. */ - -// NOTE: This is still a work in progress. We are still centralizing the configurations to -// this file, so your success may vary for other CPUs. - -#ifndef cpu_map_h -#define cpu_map_h - - -//---------------------------------------------------------------------------------------- - -#ifdef CPU_MAP_ATMEGA328P_TRADITIONAL // (Arduino Uno) Officially supported by Grbl. - - // Define serial port pins and interrupt vectors. - #define SERIAL_RX USART_RX_vect - #define SERIAL_UDRE USART_UDRE_vect - - // Define step pulse output pins. NOTE: All step bit pins must be on the same port. - #define STEP_DDR DDRD - #define STEP_PORT PORTD - #define X_STEP_BIT 2 // Uno Digital Pin 2 - #define Y_STEP_BIT 3 // Uno Digital Pin 3 - #define Z_STEP_BIT 4 // Uno Digital Pin 4 - #define STEP_MASK ((1<. -*/ - -/* The defaults.h file serves as a central default settings file for different machine - types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings - here are supplied by users, so your results may vary. However, this should give you - a good starting point as you get to know your machine and tweak the settings for your - our nefarious needs. */ - -#ifndef defaults_h -#define defaults_h - -#ifdef DEFAULTS_GENERIC - // Grbl generic default settings. Should work across different machines. - #define DEFAULT_X_STEPS_PER_MM 250.0 - #define DEFAULT_Y_STEPS_PER_MM 250.0 - #define DEFAULT_Z_STEPS_PER_MM 250.0 - #define DEFAULT_X_MAX_RATE 500.0 // mm/min - #define DEFAULT_Y_MAX_RATE 500.0 // mm/min - #define DEFAULT_Z_MAX_RATE 500.0 // mm/min - #define DEFAULT_X_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 - #define DEFAULT_Y_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 - #define DEFAULT_Z_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 - #define DEFAULT_X_MAX_TRAVEL 200.0 // mm - #define DEFAULT_Y_MAX_TRAVEL 200.0 // mm - #define DEFAULT_Z_MAX_TRAVEL 200.0 // mm - #define DEFAULT_STEP_PULSE_MICROSECONDS 10 - #define DEFAULT_STEPPING_INVERT_MASK 0 - #define DEFAULT_DIRECTION_INVERT_MASK ((1< 0 check in gcode.c. - Identified the long slope +at the end of rapid de/ac-celerations noted by stephanix. Problem with +the numerical integration truncation error between the exact solution +of estimate_acceleration_distance and how grbl actually performs the +acceleration ramps discretely. Increasing the +ACCELERATION_TICKS_PER_SECOND in config.h helps fix this problem. +Investigating further. + + +---------------- +Date: 2011-09-15 +Author: Sonny J +Subject: More '%' modulo opertor removals and some housecleaning. + +- Serial functions contained quite a few modulo operations that would +be executed with high frequency when streaming. AVR processors are very +slow when operating these. In one test on the Arduino forums, it showed +about a 15x slow down compared to a simple if-then statement. - +Clarified some variable names and types and comments. + + +---------------- +Date: 2011-09-13 +Author: Sonny J +Subject: Further planner improvements and misc minor bug fixes. Memory savings and increased buffer size. + +- Update grbl version and settings version to automatically reset +eeprom. FYI, this will reset your grbl settings. - Saved +3*BLOCK_BUFFER_SIZE doubles in static memory by removing obsolete +variables: speed_x, speed_y, and speed_z. - Increased buffer size +conservatively to 18 from 16. (Probably can do 20). - Removed expensive! +modulo operator from block indexing function. Reduces significant +computational overhead. - Re-organized some sqrt() calls to be more +efficient during time critical planning cases, rather than non-time +critical. - Minor bug fix in planner max junction velocity logic. - +Simplified arc logic and removed need to multiply for CW or CCW +direction. + + +---------------- +Date: 2011-09-06 +Author: Sonny J +Subject: Optimized planner re-write. Significantly faster. Full arc support enabled by rotation matrix approach. + +- Significant improvements in the planner. Removed or reordered +repetitive and expensive calculations by order of importance: +recalculating unchanged blocks, trig functions [sin(), cos(), tan()], +sqrt(), divides, and multiplications. Blocks long enough for nominal +speed to be guaranteed to be reached ignored by planner. Done by +introducing two uint8_t flags per block. Reduced computational overhead +by an order of magnitude. - Arc motion generation completely +re-written and optimized. Now runs with acceleration planner. Removed +all but one trig function (atan2) from initialization. Streamlined +computations. Segment target locations generated by vector +transformation and small angle approximation. Arc path correction +implemented for accumulated error of approximation and single precision +calculation of Arduino. Bug fix in message passing. + + +---------------- +Date: 2011-09-04 +Author: Sonny J +Subject: Minor update for memory savings in ring buffer and fleshed out commenting. + +No changes in functionality. Path vectors moved from ring buffer to +local planner static variables to save 3*(BUFFER_SIZE - 1) doubles in +memory. Detailed comments. Really need to stop micro-updating. Should be +the last until a planner optimization (ala Jens Geisler) has been +completed. + + +---------------- +Date: 2011-09-04 +Author: Sonny J +Subject: More minor bug fixes in planner. + +Reverse planner was over-writing the initial/buffer tail entry speed, +which reset the forward planner and caused it to lose track of its +speed. Should now accelerate into short linear segments much nicer now. + + +---------------- +Date: 2011-09-03 +Author: Sonny J +Subject: Minor bug fixes in planner. + + +---------------- +Date: 2011-09-03 +Author: Sonny J +Subject: Add G02/03 arc conversion/pre-processor script and example streaming script + +Beta pre-processor script used to clean and streamline g-code for +streaming and converts G02/03 arcs into linear segments. Allows for full +acceleration support if the pre-processed g-code is then streamed to +grill, sans G02/03 arcs. Added a simple example streaming script for +Python users. + + +---------------- +Date: 2011-09-03 +Author: Sonny J +Subject: Significantly improved junction control and fixed computation bugs in planner + +- Junction jerk now re-defined as junction_deviation. The distance from +the junction to the edge of a circle tangent to both previous and +current path lines. The circle radii is used to compute the maximum +junction velocity by centripetal acceleration. More robust and +simplified way to compute jerk. - Fixed bugs related to entry and exit +factors. They were computed based on the current nominal speeds but not +when computing exit factors for neighboring blocks. Removed factors and +replaced with entry speeds only. Factors now only computed for stepper +trapezoid rate conversions. - Misc: Added min(), next_block_index, +prev_block_index functions for clarity. + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Moved comment and block delete handling into protocol.c from gcode.c. Fixes bug when comment and block delete are not isolated. Blank lines ignored. + +Comments, block delete characters, and blank lines are no longer passed +to the gcode parser and should free up some memory by ignoring these +characters. Gcode parser now expects clean gcode only. There was a bug +if there were block deletes or comments not in the first character (i.e. +spindle on/off for proofing geode without turning it on, or a NXX +followed by a comment). This should fix it by bypassing the problem. +Left a commented line for easily turning on and off block deletes for a +later feature, if desired. + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Revert ea5b8942db2616e93fc0478922010c3bab7c0481^..HEAD + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Moved comment and block delete handling into protocol.c from gcode.c. Fixes bug when comment and block delete are not isolated. Blank lines ignored. + +Comments, block delete characters, and blank lines are no longer passed +to the gcode parser and should free up some memory by ignoring these +characters. Gcode parser now expects clean gcode only. There was a bug +if there were block deletes or comments not in the first character (i.e. +spindle on/off for proofing geode without turning it on, or a NXX +followed by a comment). This should fix it by bypassing the problem. +Left a commented line for easily turning on and off block deletes for a +later feature, if desired. + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Revert 517a0f659a06182c89cafe27ee371edccad777a4^..HEAD + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Revert "Moved comment and block delete handling to be done in protocol.c rather than gcode.c. Prevents these from being held in memory. Also, fixes bug when comments and block delete character are mixed with g-code." + +This reverts commit ea5b8942db2616e93fc0478922010c3bab7c0481. + + +---------------- +Date: 2011-08-15 +Author: Sonny J +Subject: Revert fdc90f1821f1f5edb7756fcddce75b4b4fbf6bbf^..HEAD + + +---------------- +Date: 2011-08-15 +Author: chamnit +Subject: Removed comment and block delete handling from gcode.c. Parser expects clean gcode. + +---------------- +Date: 2011-08-15 +Author: chamnit +Subject: Moved comment and block delete handling to be done in protocol.c rather than gcode.c. Prevents these from being held in memory. Also, fixes bug when comments and block delete character are mixed with g-code. diff --git a/doc/log/commit_log_v0.8c.txt b/doc/log/commit_log_v0.8c.txt new file mode 100644 index 000000000..f62cf89eb --- /dev/null +++ b/doc/log/commit_log_v0.8c.txt @@ -0,0 +1,831 @@ +---------------- +Date: 2012-11-25 +Author: Sonny Jeon +Subject: G28/G30 post move bug fix. Altered file permissions. + + +---------------- +Date: 2012-11-25 +Author: Sonny Jeon +Subject: G28/G30 post move bug fix. + +- Fixed a bug when after moving to a pre-defined position G28/G30, the +next move would go someplace unexpected. The g-code parser position +vector wasn't getting updated. + + +---------------- +Date: 2012-11-20 +Author: Sonny Jeon +Subject: Merge error fix. + + +---------------- +Date: 2012-11-20 +Author: Sonny Jeon +Subject: Merge v0.8 edge to master + + +---------------- +Date: 2012-11-19 +Author: Sonny Jeon +Subject: Updated interface protocol. Fixed M2 bug. + +- Updated interface protocol to play nicer with interface programs. All +Grbl responses beginning with '$' signifies a setting. Bracketed '[]' +responses are feedback messages containing either state, parameter, or +general messages. Chevron '<>' response are from the real-time status +messages, i.e. position. + +- M2 Program end command was causing a system alarm. Fixed. Thanks +@blinkenlight ! + + +---------------- +Date: 2012-11-18 +Author: Sonny Jeon +Subject: Updated readme + + +---------------- +Date: 2012-11-18 +Author: Sonny Jeon +Subject: Homing search sequence now compile-time option. New defaults.h file. Tidying up. + +- The homing sequence is now a compile-time option, where a user can +choose which axes(s) move in sequence during the search phase. Up to 3 +sequences. Works with the locating phase and the pull-off maneuver. + +- New defaults.h file to store user generated default settings for +different machines. Mainly to be used as a central repo, but each set +may be select to be compiled in as a config.h define. + + +---------------- +Date: 2012-11-15 +Author: Sonny Jeon +Subject: Added Grbl state in status report. Removed switch support. + +- Added Grbl state (Idle, Running, Queued, Hold, etc) to the real-time +status reporting feature as feedback to the user of what Grbl is doing. +Updated the help message to reflect this change. + +- Removed switches (dry run, block delete, single block mode). To keep +Grbl simple and not muddled up from things that can easily be taken +care of by an external interface, these were removed. + +- Check g-code mode was retained, but the command was moved to '$C' +from '$S0'. + + +---------------- +Date: 2012-11-14 +Author: Sonny Jeon +Subject: Re-factored system states and alarm management. Serial baud support greater than 57600. + +- Refactored system states to be more clear and concise. Alarm locks +processes when position is unknown to indicate to user something has +gone wrong. + +- Changed mc_alarm to mc_reset, which now manages the system reset +function. Centralizes it. + +- Renamed '$X' kill homing lock to kill alarm lock. + +- Created an alarm error reporting method to clear up what is an alarm: +message vs a status error: message. For GUIs mainly. Alarm codes are +negative. Status codes are positive. + +- Serial baud support upto 115200. Previous baudrate calc was unstable +for 57600 and above. + +- Alarm state locks out all g-code blocks, including startup scripts, +but allows user to access settings and internal commands. For example, +to disable hard limits, if they are problematic. + +- Hard limits do not respond in an alarm state. + +- Fixed a problem with the hard limit interrupt during the homing +cycle. The interrupt register is still active during the homing cycle +and still signal the interrupt to trigger when re-enabled. Instead, +just disabled the register. + +- Homing rate adjusted. All axes move at homing seek rate, regardless +of how many axes move at the same time. This is unlike how the stepper +module does it as a point to point rate. + +- New config.h settings to disable the homing rate adjustment and the +force homing upon powerup. + +- Reduced the number of startup lines back down to 2 from 3. This +discourages users from placing motion block in there, which can be very +dangerous. + +- Startup blocks now run only after an alarm-free reset or after a +homing cycle. Does not run when $X kill is called. For satefy reasons + + +---------------- +Date: 2012-11-10 +Author: Sonny Jeon +Subject: Tweaks. Seek rate updates when set. CCW arc full circle fix. + +- Fixed a minor issue where the seek rates would not immediately be +used and only would after a reset. Should update live now. + +- A full circle IJ offset CCW arc would not do anything. Fixed bug via +a simple if-then statement. + +- Radius mode tweaks to check for negative value in sqrt() rather than +isnan() it. Error report updated to indicate what actually happened. + + +---------------- +Date: 2012-11-09 +Author: Sonny Jeon +Subject: Added note that D13 can't be used as input, pulled-high. + + +---------------- +Date: 2012-11-09 +Author: Sonny Jeon +Subject: Fixed homing cycle hanging after locating switches. + + +---------------- +Date: 2012-11-08 +Author: Sonny Jeon +Subject: Housekeeping. + +- Added some more notes to config.h. + +- Added the ability to override some of the #defines around Grbl in +config.h, like planner buffer size, line buffer size, serial +send/receive buffers. Mainly to centralize the configurations to be +able to port to different microcontrollers later. + + +---------------- +Date: 2012-11-08 +Author: Sonny Jeon +Subject: Sanguino compile patch + +@daapp : Sanguino compile serial USART path. Thanks! + + +---------------- +Date: 2012-11-07 +Author: Sonny Jeon +Subject: More tweaks. Removed dry run. Trimmed all messages to save flash space. + +- Removed the dry run switch. It was getting overly complicated for +what it needed to do. In practice, single block mode and feed rate +overrides (coming in next release) does a much better job with dry runs +than 'dry run'. + +- Trimmed all of Grbl's messages from help, status, feedback to +settings. Saved 0.6KB+ of flash space that could be used for v0.9 +features. + +- Removed some settings inits when set. Will depend on user to power +cycle to get some of these to reload. + +- Fixed a bug with settings version not re-writing old settings, when +it should. Thanks Alden! + + +---------------- +Date: 2012-11-06 +Author: Sonny Jeon +Subject: Merge pull request #132 from hin/header_dependencies + +Header dependencies + +---------------- +Date: 2012-11-05 +Author: Sonny Jeon +Subject: Tweaks and bug fixes. Increase to 3 startup blocks. Remove purge/added unlock command + +- Increased the number of startup blocks to 3 for no good reason other +than it doesn't increase the flash size. + +- Removed the purge buffer command and replaced with an disable homing +lock command. + +- Homing now blocks all g-code commands (not system commands) until the +homing cycle has been performed or the disable homing lock is sent. +Homing is required upon startup or if Grbl loses it position. This is +for safety reasons. + +- Cleaned up some of the Grbl states and re-organized it to be little +more cohesive. + +- Cleaned up the feedback and status messages to not use so much flash +space, as it's a premium now. + + - Check g-code and dry run switches how are mutually exclusive and +can't be enabled when the other is. And automatically resets Grbl when +disabled. + +- Some bug fixes and other minor tweaks. + + +---------------- +Date: 2012-11-05 +Author: Hans Insulander +Subject: Ignore dependency files + + +---------------- +Date: 2012-11-05 +Author: Hans Insulander +Subject: Generate header dependencies and use them in Makefile + + +---------------- +Date: 2012-11-05 +Author: Sonny Jeon +Subject: Tweaked dry run and check g-code switches. Now resets when toggled off. + +- To make managing the code easier and to help ensure a user starts +with a fresh reset, the functionality of check g-code and dry run has +been changed to automatically perform a soft reset when toggled off. +Position will not be lost, unless there is a cycle active. Feed hold +before toggling off it needed. + +This is mainly a safety issue. If a user dry runs a program and kills +it mid-program, and then restarts it thinking to run it as normal, the +g-code modes that we're set may not be what they expect, and very bad +things can happen. + +- NOTE: Grbl is at 83.5% of flash capacity. Not a lot of room left, but +I think we can squeeze in some more! + + +---------------- +Date: 2012-11-04 +Author: Sonny Jeon +Subject: Runtime command pinned out! Re-organized coolant pins. + +- Pinned out cycle start(A2), feed hold(A1), and reset(A0) runtime +commands. These pins are held high with the internal pull-up resistor +enabled. All you have to do is connect a normally-open switch to the +pin and ground. That's it. + +- Moved the coolant control pins to A3 (and the optional mist control +to A4). + +- Moved all of the MASK defines into the config.h file to centralize +them. + + +---------------- +Date: 2012-11-04 +Author: Sonny Jeon +Subject: Tweaks and minor bug fixes. Added purge buffer command. + +- Added a purge buffer (and lock) command. This is an advanced option +to clear any queued blocks in the buffer in the event of system +position being lost or homed. These queued blocks will likely not move +correctly if not purged. In typical use, the purging command releases +the homing axes lock in case a user need to move the axes off their +hard limit switches, but position is not guaranteed. Homing is advised +immediately after. + +- Created a system-wide sync current position function. Cleans up some +of the repetitive tasks in various places in the code that do the same +thing. + +- Removed the clear all switches command '$S'. Not really needed and +helped clean up a sync call. + +- Other minor tweaks. Readme updated slightly.. + + +---------------- +Date: 2012-11-03 +Author: Sonny Jeon +Subject: New startup script setting. New dry run, check gcode switches. New system state variable. Lots of reorganizing. + +(All v0.8 features installed. Still likely buggy, but now thourough +testing will need to start to squash them all. As soon as we're done, +this will be pushed to master and v0.9 development will be started. +Please report ANY issues to us so we can get this rolled out ASAP.) + +- User startup script! A user can now save one (up to 5 as compile-time +option) block of g-code in EEPROM memory. This will be run everytime +Grbl resets. Mainly to be used as a way to set your preferences, like +G21, G54, etc. + +- New dry run and check g-code switches. Dry run moves ALL motions at +rapids rate ignoring spindle, coolant, and dwell commands. For rapid +physical proofing of your code. The check g-code switch ignores all +motion and provides the user a way to check if there are any errors in +their program that Grbl may not like. + +- Program restart! (sort of). Program restart is typically an advanced +feature that allows users to restart a program mid-stream. The check +g-code switch can perform this feature by enabling the switch at the +start of the program, and disabling it at the desired point with some +minimal changes. + +- New system state variable. This state variable tracks all of the +different state processes that Grbl performs, i.e. cycle start, feed +hold, homing, etc. This is mainly for making managing of these task +easier and more clear. + +- Position lost state variable. Only when homing is enabled, Grbl will +refuse to move until homing is completed and position is known. This is +mainly for safety. Otherwise, it will let users fend for themselves. + +- Moved the default settings defines into config.h. The plan is to +eventually create a set of config.h's for particular as-built machines +to help users from doing it themselves. + +- Moved around misc defines into .h files. And lots of other little +things. + + +---------------- +Date: 2012-11-01 +Author: Sonny Jeon +Subject: Added block delete, opt stop, single block mode. New parser state and parameter feedback. Overhauled '$' command. + +NOTE: Another incremental update. Likely buggy, still a ways to go +before everything is installed, such as startup blocks. + +- Changed the '$' command to print help. '$$' now prints Grbl settings. +The help now instructs the user of runtime commands, switch toggling, +homing, etc. Jogging will be added to these in v0.9. + +- Added switches: block delete, opt stop, and single block mode. + +- Now can print the g-code parser state and persistent parameters +(coord sys) to view what Grbl has internally. + +- Made the gc struct in the g-code parser global to be able to print +the states. Also moved coordinate system tracking from sys to gc struct. + +- Changed up the welcome flag and updated version to v0.8c. + +- Removed spindle speed from gcode parser. Not used. + + +---------------- +Date: 2012-11-01 +Author: Sonny Jeon +Subject: New report module. 6 persistent work coordinates. New G-codes and settings. README and minor bug updates + +(NOTE: This push is likely buggy so proceed with caution. Just +uploading to let people know where we're going.) + +- New report.c module. Moved all feedback functions into this module to +centralize these processes. Includes realtime status reports, status +messages, feedback messages. + +- Official support 6 work coordinate systems (G54-G59), which are +persistently held in EEPROM memory. + +- New g-code support: G28.1, G30.1 stores current machine position as a +home position into EEPROM. G10 L20 Px stores current machine position +into work coordinates without needing to explicitly send XYZ words. + +- Homing performed with '$H' command. G28/G30 no longer start the +homing cycle. This is how it's supposed to be. + +- New settings: Stepper enable invert and n_arc correction installed. + +- Updated and changed up some limits and homing functionality. Pull-off +travel will now move after the homing cycle regardless of hard limits +enabled. Fixed direction of pull-off travel (went wrong way). + +- Started on designing an internal Grbl command protocol based on the +'$' settings letter. Commands with non numeric characters after '$' +will perform switch commands, homing cycle, jogging, printing +paramters, etc. Much more to do here. + +- Updated README to reflect all of the new features. + + +---------------- +Date: 2012-10-21 +Author: Sonny Jeon +Subject: Added misc message to indicate how to exit ALARM mode. + + +---------------- +Date: 2012-10-21 +Author: Sonny Jeon +Subject: New alarm method. Re(re)organized status messages. + +- Installed a new 'alarm' method to centralize motion kills across +alarm or reset events. Right now, this is controlled by system abort +and hard limits. But, in the future, a g-code parser error may call +this too as a safety feature. + +- Re(re)organized status messages to just print all errors, regardless +from where it was called. This centralizes them into one place. + +- Misc messages method installed for any user feedback that is not a +confirmation or error. Mainly so that there is a place to perform +warnings and such. + +- New stuff installed and still made the flash size smaller by saving +flash space from clearing out repeated '\r\n' pgmstrings. + +- Fixed a bug where hard limits message would print everytime a system +abort was sent. + + +---------------- +Date: 2012-10-21 +Author: Sonny Jeon +Subject: Re-organized status messages to be more coherent and centralized. + +- Reorganized all of the status message feedback from both the g-code +parser and settings modules to be centralized into two message modules: +status feedback from executing a line and warnings for misc feedback. + +- Pulled out the printPgmString() messages in settings.c and placed it +into the new module. (settings_dump() not moved). + +- Some other minor edits. Renaming defines, comment updates, etc. + + +---------------- +Date: 2012-10-18 +Author: Sonny Jeon +Subject: Hard limits code minor updates. + +- Fixed a bug that would not disable the steppers if a user issues a +system abort during a homing cycle. + +- Updated the hard limit interrupt to be more correct and to issue a +shutdown for the right situations when the switch has been triggered. + +- Added a status message to indicate to the user what happened and what +to do upon a hard limit trigger. + + +---------------- +Date: 2012-10-16 +Author: Sonny Jeon +Subject: Hard limits, homing direction, pull-off limits after homing, status reports in mm or inches, system alarm, and more. + +- Thank you statement added for Alden Hart of Synthetos. + +- Hard limits option added, which also works with homing by pulling off +the switches to help prevent unintended triggering. Hard limits use a +interrupt to sense a falling edge pin change and immediately go into +alarm mode, which stops everything and forces the user to issue a reset +(Ctrl-x) or reboot. + +- Auto cycle start now a configuration option. + +- Alarm mode: A new method to kill all Grbl processes in the event of +something catastrophic or potentially catastropic. Just works with hard +limits for now, but will be expanded to include g-code errors (most +likely) and other events. + +- Updated status reports to be configurable in inches or mm mode. Much +more to do here, but this is the first step. + +- New settings: auto cycle start, hard limit enable, homing direction +mask (which works the same as the stepper mask), homing pulloff +distance (or distance traveled from homed machine zero to prevent +accidental limit trip). + +- Minor memory liberation and calculation speed ups. + + +---------------- +Date: 2012-10-13 +Author: Sonny Jeon +Subject: Minor updates, improvements, and bug fixes. + +- Allowed status_message function to be called by others. This is to +centralize all feedback into protocol.c. + +- Fixed a bug where line number words 'N' were causing the parser to +error out. + +- Allowed homing routine feed rates to move slower than the +MINIMUM_STEP_RATE parameter in config.h. + +- Homing performs idle lock at the end of the routine. + +- Stepper idle lock time will now not disable the steppers when the +value is set at 255. This is accomodate users who prefer to keep their +axes enabled at all times. + +- Moved some defines around to where they need to be. + + +---------------- +Date: 2012-10-12 +Author: Sonny Jeon +Subject: Updated delay_us() function to accept long integers + + +---------------- +Date: 2012-10-11 +Author: Sonny Jeon +Subject: (2x) speed increase in printFloat() function. Decimal places setting added. + +- printFloat() function execution doubled in speed. This is a precursor +to status reporting, since GUIs may query real-time position rapidly. + +- Decimal places added to settings (for now). This may disappear in +future pushes, but here for testing purposes. + + +---------------- +Date: 2012-10-11 +Author: Sonny Jeon +Subject: Homing stepper enable bit fix. + + +---------------- +Date: 2012-10-10 +Author: Sonny Jeon +Subject: Homing direction pin bits fixed. Lite refactoring of settings. + + +---------------- +Date: 2012-10-09 +Author: Sonny Jeon +Subject: Improved homing cycle. New settings: homing enable/rates, debounce and step idle lock time. + +- Homing cycle will now cycle twice (spec more/less in config) to +improve repeatability and accuracy by decreasing overshoot. + +- New Grbl settings added: Enable/disable homing cycles, homing seek +and feed rates, switch debounce delay, and stepper idle lock time. + +- Please note that these settings may change upon the next push, since +there will be more added soon. Grbl *should* not re-write your old +settings, just re-write the new ones. So, make sure you keep these +written down somewhere in case they get lost from a code bug. + +- Refactored settings migration to be a little smaller and managable +going forward. + + +---------------- +Date: 2012-10-08 +Author: Sonny Jeon +Subject: Fixed an issue with leaving the limit switches during a homing cycle. + + +---------------- +Date: 2012-10-08 +Author: Sonny Jeon +Subject: Updated version number to v0.8b to reflect changes. + + +---------------- +Date: 2012-10-08 +Author: Sonny Jeon +Subject: Limit pin internal pull-resistors enabled. Re-wrote read_double() function. Correctly changed all 'double's to 'float's. + +- Limit pin internal pull-resistors now enabled. Normal high operation. +This will be the standard going forward. + +- Updated all of the 'double' variable types to 'float' to reflect what +happens when compiled for the Arduino. Also done for compatibility +reasons to @jgeisler0303 's Grbl simulator code. + +- G-code parser will now ignore 'E' exponent values, since they are +reserved g-code characters for some machines. Thanks @csdexter! + +- The read_double() function was re-written and optimized for use in +Grbl. The strtod() avr lib was removed. + + +---------------- +Date: 2012-09-30 +Author: Sonny Jeon +Subject: Updated limit/homing routine. Works, but needs more TLC. + +- Added acceleration to the homing routine. + +- Homing now accounts for different step rates when moving multiple +axes without exceeding acceleration limits. + +- Homing now updates all internal positioning variables to machine zero +after completion. + +- "Poor-man's" debounce delay added. + +- Updated the delay_us() function to perform faster and more accurate +microsecond delays. Previously, the single increments would add +noticeable time drift for larger delays. + +- Fix a bug in the stepper.c prescalar calculations that was changed in +the last commit. + +- Other minor fixes. + + +---------------- +Date: 2012-09-21 +Author: Sonny Jeon +Subject: Minor prescalar optimization. Changed up some defines. + + +---------------- +Date: 2012-09-21 +Author: Sonny Jeon +Subject: Added coolant control (M7*, M8, M9). Mist control can be enabled via config.h. + +- Added coolant control! Flood control (M8) functions on analog pin 0. +Mist control (M7) is compile-time optional and is on analog pin 1. (Use +only if you have multiple coolants on your system). Based on work by +@openpnp. + +- Fixed some variable assignments in spindle control. + + +---------------- +Date: 2012-09-21 +Author: Sonny Jeon +Subject: Merge pull request #120 from tmpvar/configurable-makefile + +Add support for overriding DEVICE and PROGRAMMER + +---------------- +Date: 2012-09-21 +Author: Elijah Insua +Subject: Add support for overriding DEVICE and PROGRAMMER + +By setting environment variables. + +example: PROGRAMMER=-c arduino -P /dev/tty.usbmodemfa131 make flash + + +---------------- +Date: 2012-09-19 +Author: Sonny Jeon +Subject: M30 minor bug fix. + +Order of operations was off. Now works as intended, + + +---------------- +Date: 2012-06-27 +Author: Sonny Jeon +Subject: No changes. Github commit bug. + + +---------------- +Date: 2012-06-26 +Author: Sonny Jeon +Subject: Added step pulse delay after direction set (Compile-time option only). Updated read me. + +Added a compile-time only experimental feature that creates a +user-specified time delay between a step pulse and a direction pin set +(in config.h). This is for users with hardware-specific issues +(opto-couplers) that need more than a few microseconds between events, +which can lead to slowly progressing step drift after many many +direction changes. We suggest to try the hack/fix posted in the Wiki +before using this, as this experimental feature may cause Grbl to take +a performance hit at high step rates and about complex curves. + + +---------------- +Date: 2012-03-10 +Author: Sonny Jeon +Subject: Minor fix related to spindle_stop() crashing abort in certain cases. + +- Updated spindle_stop() to fix abort bug and to be more in line with +v0.8. + + +---------------- +Date: 2012-03-05 +Author: Sonny Jeon +Subject: Minor updates. + +- Updated makefile to be more universally compatible by not requiring +grep or ruby. + +- Edited XON/XOFF flow control usage, noting that FTDI-based Arduinos +are known to work, but not Atmega8U2-based Arduino. Still officially +not supported, but added for advanced users. + +- Minor edits. + + +---------------- +Date: 2012-02-25 +Author: Sonny Jeon +Subject: Minor include related compile fix. Added experimental XON/XOFF flow control. Not officially supported! + +- A latency issue related to USB-to-serial converters on the Arduino +does not allow for XON/XOFF flow control to work correctly on standard +terminal programs. It seems that only specialized UI's or avoiding the +USB port all together solves this problem. However, XON/XOFF flow +control is added for advanced users only as a compile-time option. This +feature is officially *NOT* supported by grbl, but let us know of any +successes with it! + + +---------------- +Date: 2012-02-12 +Author: Sonny Jeon +Subject: Spindle DDR pins init minor fix. + + +---------------- +Date: 2012-02-11 +Author: Sonny Jeon +Subject: Fix to enable spindle DDR ports. + +---------------- +Date: 2012-02-11 +Author: Sonny Jeon +Subject: Minor compiler compatibility update for _delay_us(). + + +---------------- +Date: 2012-02-11 +Author: Sonny Jeon +Subject: G54 work coordinate support (w/ G10,G92.1). Re-factored g-code parser with error checking. Minor compiler compatibility changes. + +- G54 work coordinate system support. Up to 6 work coordinate systems +(G54-G59) available as a compile-time option. + +- G10 command added to set work coordinate offsets from machine +position. + +- G92/G92.1 position offsets and cancellation support. Properly follows +NIST standard rules with other systems. + +- G53 absolute override now works correctly with new coordinate systems. + +- Revamped g-code parser with robust error checking. Providing user +feedback with bad commands. Follows NIST standards. + +- Planner module slightly changed to only expected position movements +in terms of machine coordinates only. This was to simplify coordinate +system handling, which is done solely by the g-code parser. + +- Upon grbl system abort, machine position and work positions are +retained, while G92 offsets are reset per NIST standards. + +- Compiler compatibility update for _delay_us(). + +- Updated README. + + +---------------- +Date: 2012-01-31 +Author: Sonny Jeon +Subject: printFloat rounding fix. Affected settings. Recommend using new build. + +printFloat was printing incorrectly and adding a value of 5 to every +float instead of 0.0005 when rounding to 3 decimal places. The printed +settings values do not accurately portray the actual stored value. +Recommend using newly posted build. + + +---------------- +Date: 2012-01-28 +Author: Sonny Jeon +Subject: Program stop support (M0,M1*,M2,M30*), proper position retainment upon reset, misc minor updates. + +- Program stop support (M0,M1*,M2,M30*). *Optional stop to be done. +*Pallet shuttle not supported. + +- Work position is set equal to machine position upon reset, as +according to NIST RS274-NGC guidelines. G92 is disabled. + +- Renamed mc_set_current_position() to mc_set_coordinate_offset(). + +- Fixed bug in plan_synchronize(). Would exit right before last step is +finished and caused issues with program stops. Now fixed. + +- Spindle now stops upon a run-time abort command. + +- Updated readme and misc upkeeping. + + +---------------- +Date: 2012-01-27 +Author: Sonny Jeon +Subject: Streaming script argparse bugfix. + + +---------------- +Date: 2012-01-27 +Author: Sonny Jeon +Subject: Updated streaming scripts. Compiler compatibility for _delay_ms(). + +- Moved obsolete streaming scripts to folder for reference. + +- Added a more complex Python streaming script which uses the serial +buffer as an additional streaming buffer. + +- Removed all references to a _delay_ms(variable) to allow for better +porting across different compilers. + diff --git a/doc/log/commit_log_v0.9g.txt b/doc/log/commit_log_v0.9g.txt new file mode 100644 index 000000000..bb9f107de --- /dev/null +++ b/doc/log/commit_log_v0.9g.txt @@ -0,0 +1,2409 @@ +---------------- +Date: 2014-09-05 +Author: Sonny Jeon +Subject: Minor bug fix and CPU pin map update. + +- Sometime I HATE github. This push is just here to be able to describe +the last two pushes today that had a merging conflict and lost all of +the commit comments before. + +- Setting $10 would cause $11 to be the same value. Missed a break +statement in the switch-case. Oops! Now fixed. + +- CPU pin map for the future versions of Grbl introduced, but not yet +finalized. Still working on it and it’s subject to change. + +- Added a new high-speed machining test g-code routine written by Todd +Fleming. Mills a pocket at 15,000mm/min. Do not use when connected to +your machine! You’ve been warned! + + +---------------- +Date: 2014-09-05 +Author: Sonny Jeon +Subject: Updated README.md + + +---------------- +Date: 2014-09-05 +Author: Sonny Jeon +Subject: Merge branch 'master' of https://github.com/grbl/grbl + +Conflicts: + README.md + + +---------------- +Date: 2014-08-24 +Author: Sonny Jeon +Subject: Merge pull request #472 from BinaryConstruct/edge + +Add defaults for OX CNC + +---------------- +Date: 2014-08-24 +Author: BinaryConstruct +Subject: Add defaults for OX CNC + + +---------------- +Date: 2014-08-22 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-22 +Author: Sonny Jeon +Subject: Updated build date. + + +---------------- +Date: 2014-08-22 +Author: Sonny Jeon +Subject: WPos report bug fix when MPos disabled. + + +---------------- +Date: 2014-08-18 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-17 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-17 +Author: Sonny Jeon +Subject: Updated bitly link to master firmware + + +---------------- +Date: 2014-08-17 +Author: Sonny Jeon +Subject: Merge branch 'master' into edge + + +---------------- +Date: 2014-08-17 +Author: Sonny Jeon +Subject: Final minor updates for master release. + +- Updated ShapeOko2 defaults based on machine testing of the basic +model provided by Inventables. (or close to it.) Should be pretty +conservative but much faster than before. For example, X and Y axes are +set at (10x) faster at 5000mm/min. It can run much faster than this, +but this seems like a safe speed for everyone. + +- Updated README for master release. + +- Added some new settings methods for clearing the EEPROM when changing +versions. Needs some more work, but it should ok for master release. +Should work on it more for the next version. + + +---------------- +Date: 2014-08-13 +Author: Sonny Jeon +Subject: Added EEPROM force clear. + +- When updating from v0.8, the settings will wipe the startup lines and +build info locations so that it won’t use whatever is already there in +the EEPROM. Parameters (coord offsets) are retained. They should be ok +during an upgrade. + + +---------------- +Date: 2014-08-13 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-13 +Author: Sonny Jeon +Subject: G28/30 bug fix. Block '$$' during cycle. SO2 defaults. + +- A G28/30 bug would cause it to move to machine coordinate [0,0,0] if +no axis words were sent. It was a typo in the new g-code parser. Fixed +and slightly re-written to be more consistent with the program flow. + +- Updated the ShapeOko2 defaults based on testing on the real machine. +A little conservative, but it might change again after some more +testing. + +- Now blocks ‘$$’ command during a motion, because the printout takes +too long and can starve the segment buffer. + + +---------------- +Date: 2014-08-08 +Author: Sonny Jeon +Subject: XON/XOFF flow control variable typo. + + +---------------- +Date: 2014-08-07 +Author: Sonny Jeon +Subject: Moved Grbl Sim to its own repo. + + +---------------- +Date: 2014-08-07 +Author: Sonny Jeon +Subject: Updated licensing + + +---------------- +Date: 2014-08-05 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-05 +Author: Sonny Jeon +Subject: Fixed bug related to very very low feed rates. + +- A very very low feed rate command like `G1 X100 F0.01` would cause +some floating-point round-off error and freeze Grbl into an infinite +loop. To fix it, introduced a MINIMUM_FEED_RATE parameter in config.h +to ensure motions always complete. + +- MINIMUM_FEED_RATE is set at 1.0 mm/min by default. It’s recommended +that no rates are below this value, but 0.1mm/min may be ok in some +situations. + + +---------------- +Date: 2014-08-04 +Author: Sonny Jeon +Subject: Allow '$$' in check mode. + +- Now allows the ‘$$’ view Grbl settings while in check mode + +- Updated the version build date + + +---------------- +Date: 2014-08-04 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-04 +Author: Sonny Jeon +Subject: Fixed probe position sync error. + +- Restored probe position syncing. Had removed a pull-off motion after +a probe cycle completes, but ended up de-synchronizing the g-code +parser and probing cycle positions. Putting the pull-off motion back +fixed the problem. + + +---------------- +Date: 2014-08-03 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-03 +Author: Sonny Jeon +Subject: Probing cycle and view build info bug fixes. + +- Probing cycle would drop into a QUEUED state, if multiple G38.2 are +sent. It would not honor the auto cycle start flags. To fix, the auto +cycle start state is saved at the beginning of the probing cycle and +restored at the end, since the feed hold it uses to stop a triggered +probe will disable the auto start flag. For now it’s a patch, rather +than a permanent fix. + +- protocol_buffer_synchronize() also has a failure case. Auto cycle +start does not get executed when the system is waiting in here, so if +it’s in a QUEUED state already, it won’t resume. Patched here, but not +fully resolved. + +- Fixed a problem with the “view build info” command. The EEPROM write +would do weird things and corrupt the EEPROM. Not sure exactly what +caused it, but it’s likely a compiler problem with an improperly +defined EEPROM address. It didn’t have enough room to store a full +string. To fix, the build info EEPROM range was increased and the max +number of STARTUP_BLOCKS was reduced to 2 from 3. + +- Lastly, when a $I view build info is used for the first time, it +would normally show an EEPROM read error, since it wasn’t cleared or +wasn’t therein the first place. It will now not show that error. A +patch rather than a permanent fix again. + + +---------------- +Date: 2014-08-01 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-08-01 +Author: Sonny Jeon +Subject: Minor bug fixes. + +- Bug fix for step and direction invert masks not immediately being in +effect. Now regenerates the masks when a user changes this setting. + +- Bug fix for probing cycle. G-code standard mandates that there is an +error if the probe is already triggered when the cycle is commanded. +However, Grbl may have motions to pull off a previous probing cycle in +queue and can falsely lead to errors. To fix this, the triggered check +is performed within the probing cycle itself, right after the planner +buffer is synced. If there is an error, it will now alarm out as a +probe fail. + + +---------------- +Date: 2014-07-28 +Author: Sonny Jeon +Subject: Compile in Atmel Studio fix. + + +---------------- +Date: 2014-07-28 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-27 +Author: Sonny Jeon +Subject: Added build info feedback in help + +- `$I` prints the Grbl build info and version number. NOTE: `$I=xxx` +stores an additional 30 character string into EEPROM, which will be +printed with the build info the next time it’s run. This is for +identification purposes for users that have more than one system using +Grbl. + + +---------------- +Date: 2014-07-26 +Author: Sonny Jeon +Subject: Updates to allow Arduino IDE direct compiling. + +- Only minor changes were required to make the Arduino IDE compile all +of the Grbl’s source code (correctly using the C-compiler). Tested in +Windows and Mac and with the normal USB upload and with a programmer. + + +---------------- +Date: 2014-07-26 +Author: Sonny Jeon +Subject: Settings refactoring. Bug fixes. Misc new features. + +This is likely the last major change to the v0.9 code base before push +to master. Only two minor things remain on the agenda (CoreXY support, +force clear EEPROM, and an extremely low federate bug). + +- NEW! Grbl is now compile-able and may be flashed directly through the +Arduino IDE. Only minor changes were required for this compatibility. +See the Wiki to learn how to do it. + +- New status reporting mask to turn on and off what Grbl sends back. +This includes machine coordinates, work coordinates, serial RX buffer +usage, and planner buffer usage. Expandable to more information on user +request, but that’s it for now. + +- Settings have been completely renumbered to allow for future new +settings to be installed without having to constantly reshuffle and +renumber all of the settings every time. + +- All settings masks have been standardized to mean bit 0 = X, bit 1 = +Y, and bit 2 = Z, to reduce confusion on how they work. The invert +masks used by the internal Grbl system were updated to accommodate this +change as well. + +- New invert probe pin setting, which does what it sounds like. + +- Fixed a probing cycle bug, where it would freeze intermittently, and +removed some redundant code. + +- Homing may now be set to the origin wherever the limit switches are. +Traditionally machine coordinates should always be in negative space, +but when limit switches on are on the opposite side, the machine +coordinate would be set to -max_travel for the axis. Now you can always +make it [0,0,0] via a compile-time option in config.h. (Soft limits +routine was updated to account for this as well.) + + - Probe coordinate message immediately after a probing cycle may now +be turned off via a compile-time option in config.h. By default the +probing location is always reported. + +- Reduced the N_ARC_CORRECTION default value to reflect the changes in +how circles are generated by an arc tolerance, rather than a fixed arc +segment setting. + +- Increased the incoming line buffer limit from 70 to 80 characters. +Had some extra memory space to invest into this. + +- Fixed a bug where tool number T was not being tracked and reported +correctly. + +- Added a print free memory function for debugging purposes. Not used +otherwise. + +- Realtime rate report should now work during feed holds, but it hasn’t +been tested yet. + +- Updated the streaming scripts with MIT-license and added the simple +streaming to the main stream.py script to allow for settings to be sent. + +- Some minor code refactoring to improve flash efficiency. Reduced the +flash by several hundred KB, which was re-invested in some of these new +features. + + +---------------- +Date: 2014-07-17 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-12 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-12 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-12 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-12 +Author: Sonny Jeon +Subject: Updated README + + +---------------- +Date: 2014-07-11 +Author: Sonny Jeon +Subject: Updated README + + +---------------- +Date: 2014-07-11 +Author: Sonny Jeon +Subject: Merge pull request #441 from ashelly/edge-simfix + +Fixes for simulator in alternate configurations. + +---------------- +Date: 2014-07-10 +Author: ashelly +Subject: Restore changes made only for testing. + + +---------------- +Date: 2014-07-10 +Author: ashelly +Subject: Bug fixes for timers, added some wdt support for limit debounce. + +- Typo in timer def, +- Handle 8 bit timers correctly, +- Don't skip TOP count in CTC mode +- added SREG for atomic bit operations + + +---------------- +Date: 2014-07-09 +Author: Sonny Jeon +Subject: Merge branch 'dev' into edge + +Conflicts: + sim/simulator.c + sim/simulator.h + + +---------------- +Date: 2014-07-09 +Author: Sonny Jeon +Subject: Added test g-code programs. + + +---------------- +Date: 2014-07-06 +Author: Sonny Jeon +Subject: Version and build update. + +- Incremented from v0.9e to v0.9f due to the new g-codes, velocity +reporting option, decimal printing refactoring, grbl-sim updates, and +G0/G1 bug fix. + +- Settings version was also incremented since settings.decimal_places +is now gone. + + +---------------- +Date: 2014-07-06 +Author: Sonny Jeon +Subject: Isolate atomic bit flag for execution. + +- Denoted bit_true_atomic only for sys.execute bit settings. All other +bit_true type calls are for local variables only and don’t need atomic +access. Still looking into other ways of setting these flags without +requiring atomic access, but this is a patch for now. + + +---------------- +Date: 2014-07-06 +Author: Sonny Jeon +Subject: Merge pull request #436 from kfoltman/dev + +Fixed atomic access to flags in sys.execute. + +---------------- +Date: 2014-07-06 +Author: Sonny Jeon +Subject: Syntax fix for gcode.c + +- Whoops! Missed a bracket and it wasn’t compiling. Now fixed. + +- Updated the unsupported gcodes listed at the end of the gcode.c file. + + +---------------- +Date: 2014-07-06 +Author: Sonny Jeon +Subject: G43.1/G49 tool length offset installed. Minor bug fix. + +- Minor bug fix that caused G92.1 not to work. The mantissa of G92.1 +was not computed correctly due to floating point round-off errors and +the use of trunc(). Fixed it by changing the computation with round(). + +- Installed tool length offsets with G43.1 and G49! True tool length +offsets via G43 are not supported, because these require us to store +tool data that we don’t have space for. But we’ve come up with a good +solution for users that need this. Instead we are strictly using the +dynamic version G43.1 via linuxcnc.org. Visit their website for more +details on the command. + +- G43.1 operates by requiring an axis word and value to offset the +configured tool length axis, which can be configured for any axis +(default Z-axis) in config.h. For example, ```G43.1 Z0.5``` will offset +the work coordinates from Z0.0 to Z-0.5. + +- G49 will cancel the last tool length offset value and reset it to +zero. + +- Tweaked the ‘$#’ parameters report. `Probe` is now `PRB` and a new +value `TLO` states the tool length offset value. + + +---------------- +Date: 2014-07-05 +Author: Sonny Jeon +Subject: Merge branch 'ashelly-sim-update' into dev + + +---------------- +Date: 2014-07-05 +Author: Sonny Jeon +Subject: Merge grbl-sim updates for v0.9. + +- Removed some conflicting code in the main Grbl firmware source. + +- Temporary patch for coolant and spindle control with streaming +applied. + + +---------------- +Date: 2014-07-05 +Author: Sonny Jeon +Subject: New G43.1/G49 gcodes. Not working yet!! + +- Pushed this uncompleted code to merge a conflicting pull request. + +- New G43.1 and G49 g-codes to be installed. The beginnings of it are +in place. These g-codes are intended to be used in conjunction with +probing and allow GUIs to set tool length offsets without Grbl needing +to store a tool table. + +- G43.1 is defined as a dynamic tool length offset that is not stored +in memory. Rather, when commanded, these are applied to the work +coordinates until a reset or disabled by G49. This works much like G92. + + +---------------- +Date: 2014-07-05 +Author: ashelly +Subject: formatting + +---------------- +Date: 2014-07-05 +Author: ashelly +Subject: Update readme.md + +---------------- +Date: 2014-07-04 +Author: ashelly +Subject: Don't need kbhit.h + +---------------- +Date: 2014-07-04 +Author: Adam Shelly +Subject: minor tweaks for mingw. + + +---------------- +Date: 2014-07-04 +Author: Sonny Jeon +Subject: Realtime rate reporting. Updated decimal places. + +- Added a new optional compile-time feature for ‘realtime’ (within +50ms) feed rate reporting. When querying for a status report, a new +data value will state the current operating rate. It’s only beta at the +moment and has some kinks to work out. + +- Updated the code for printing floating point values to N decimal +places. Generalized the main floating point print code to accept a new +decimal places value and created a set of handler functions to print +certain floating point value types used in Grbl, like position, rates, +coordinate offsets, etc. All of these have different decimal +requirements and change when printed in mm or inches mode. + +- Number of decimal places for the different value types can be +re-defined in config.h, but there shouldn’t be a need for this, as +these are physically limited. + +- Removed the decimal places settings, as this was now obsoleted by the +new decimal places code. + +- The new decimal places code also saves almost 300kB in flash space, +as it’s more efficient. + + +---------------- +Date: 2014-07-04 +Author: ashelly +Subject: reduce diffs with dev branch + + +---------------- +Date: 2014-07-04 +Author: ashelly +Subject: Total rework of simulator for dev branch. Create separate thread for interrupt processes. Tick-accurate simulation of timers. Non-blocking character input for running in realtime mode. Decouple hardware sim from grbl code as much as possible. Expanded command line options. Provisions for cross-platform solution. + + +---------------- +Date: 2014-07-03 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-07-03 +Author: Sonny Jeon +Subject: G18 reporting bug fix. + +- G18 wasn’t getting reported back to the user correctly, even though +it has been set internally. Fixed the reporting code to reflect this +accurately. + + +---------------- +Date: 2014-07-03 +Author: Sonny Jeon +Subject: G-code parser G0/G1 bug fix. + +- Although stated as invalid in the NIST g-code standard, most g-code +parsers, including linuxcnc, allow G0 and G1 to be commanded without +axis words present. For example, something like ‘G1 F100.0’ to preset +the motion mode and feed rate without a motion commanded. Older CNC +controllers actually required this for feed rate settings. This update +should now allow this type of behavior. + + +---------------- +Date: 2014-07-02 +Author: Sonny Jeon +Subject: Minor bug fixes and updates. Line number tracking. + +- Line number tracking was getting truncated at 255, since it was using +wrong variable type. Fixed it with a trunc(). + +- Increased the max number line allowed by Grbl to 9999999 from the +g-code standard 99999. The latter seems to be an arbitrary number, so +we are allowing larger ones for at least one known use case scenario. + +- Created a new test directory to contain some testing g-code to proof +the firmware. Only got started with one test case so far. More will be +inserted as needed. + +- Some other commenting updates to clarify certain aspects of the code. + + +---------------- +Date: 2014-06-26 +Author: Krzysztof Foltman +Subject: Fixed atomic access to flags in sys.execute. + +This seems to fix the bug that caused Grbl to hang during some operations, +especially jogging. + + +---------------- +Date: 2014-05-31 +Author: Sonny Jeon +Subject: Arc error-checking update. + +- Updated offset-mode arc error-checking to EMC2’s version: The old +NIST definition required the radii to the current location and target +location to differ no more than 0.002mm. This proved to be problematic +and probably why LinuxCNC(EMC2) updated it to be 0.005mm AND 0.1% +radius OR 0.5mm. + + +---------------- +Date: 2014-05-31 +Author: Sonny Jeon +Subject: Various minor g-code parser fixes. + +- Updated the mantissa calculation that checks for non-integer values +and GXX.X commands that aren’t supported. There was a potential uint8 +overflow issue. + +- Fixed g-code parser bug related to not using the correct modal +struct. G10 P0 not selecting the current coordinate system when a +G55-59 is issued in the same line. + +- Fixed g-code parser bug related to not using the correct modal +struct. Target position locations were not computed correctly when +G90/91 distance modes were changed in the same line. It was using the +previous state, rather than the current block. + + +---------------- +Date: 2014-05-29 +Author: Sonny Jeon +Subject: Fixed spindle/coolant/dwell state check. + + +---------------- +Date: 2014-05-25 +Author: Sonny Jeon +Subject: Major g-code parser overhaul. 100%* compliant. Other related updates. + +- Completely overhauled the g-code parser. It’s now 100%* compliant. (* +may have some bugs). Being compliant, here are some of the major +differences. + +- SMALLER and JUST AS FAST! A number of optimizations were found that +sped things up and allowed for the more thorough error-checking to be +installed without a speed hit. Trimmed a lot of ‘fat’ in the parser and +still was able to make it significantly smaller than it was. + +- No default feed rate setting! Removed completely! This doesn’t exist +in the g-code standard. So, it now errors out whenever it’s undefined +for motions that require it (G1/2/3/38.2). + +- Any g-code parser error expunges the ENTIRE block. This means all +information is lost and not passed on to the running state. Before some +of the states would remain, which could have led to some problems. + +- If the g-code block passes all of the error-checks, the g-code state +is updated and all motions are executed according to the order of +execution. + +- Changes in spindle speed, when already running, will update the +output pin accordingly. This fixes a bug, where it wouldn’t update the +speed. + +- Update g-code parser error reporting. Errors now return detailed +information of what exact went wrong. The most common errors return a +short text description. For less common errors, the parser reports +‘Invalid gcode ID:20’, where 20 is a error ID. A list of error code IDs +and their descriptions will be documented for user reference elsewhere +to save flash space. + +- Other notable changes: + +- Added a print integer routine for uint8 variables. This saved +significant flash space by switching from a heavier universal print +integer routine. + +- Saved some flash space with our own short hypotenuse calculation + +- Some arc computation flash and memory optimizations. + + +---------------- +Date: 2014-05-18 +Author: Jens Geisler +Subject: Merge pull request #408 from chamnit/master + +MIT-Licensing change. + +---------------- +Date: 2014-05-18 +Author: Sonny Jeon +Subject: MIT-licensing change. + + +---------------- +Date: 2014-05-18 +Author: Sonny Jeon +Subject: MIT-licensing change + + +---------------- +Date: 2014-04-28 +Author: Sonny Jeon +Subject: Merge pull request #391 from paulkaplan/master + +Update Shapeoko 2 defaults + +---------------- +Date: 2014-04-14 +Author: Paul Kaplan +Subject: updated shapeoko2 defaults + + +---------------- +Date: 2014-03-14 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-03-13 +Author: Sonny Jeon +Subject: Comment corrections and function call update. + + +---------------- +Date: 2014-03-13 +Author: Sonny Jeon +Subject: Merge pull request #373 from EliteEng/dev + +Added Probing to Mega2560 and fixed Shapeoko2 compile error + +---------------- +Date: 2014-03-11 +Author: Rob Brown +Subject: Added Probing to Mega2560 and fixed Shapeoko2 compile error + + +---------------- +Date: 2014-03-07 +Author: henols +Subject: Probing command gets stuck in hold if several g38.2 are submitted +Ex. +G0 X0 Y0 Z0 +G38.2 Z-10 F100 +G10 L20 P0 Z0 +G0 Z2 +G38.2 Z-1 F50 +G10 L20 P0 Z0 +G0 Z2 +G0 X0 Y0 +G38.2 Z-1 F100 +G0 Z2 + + +---------------- +Date: 2014-03-10 +Author: Sonny Jeon +Subject: Merge pull request #372 from martinstingl/master + +Corrected units of default acceleration values + +---------------- +Date: 2014-03-10 +Author: Martin Stingl +Subject: Corrected units of default acceleration values + + +---------------- +Date: 2014-03-07 +Author: Sonny Jeon +Subject: Merge pull request #368 from henols/dev + +Probing command gets stuck in hold if several g38.2 are submitted + +---------------- +Date: 2014-03-07 +Author: henols +Subject: Probing command gets stuck in hold if several g38.2 are submitted +Ex. +G0 X0 Y0 Z0 +G38.2 Z-10 F100 +G10 L20 P0 Z0 +G0 Z2 +G38.2 Z-1 F50 +G10 L20 P0 Z0 +G0 Z2 +G0 X0 Y0 +G38.2 Z-1 F100 +G0 Z2 + + +---------------- +Date: 2014-02-28 +Author: Sonny Jeon +Subject: G38.2 probe feature rough draft installed. Working but needs testing. + +- G38.2 straight probe now supported. Rough draft. May be tweaked more +as testing ramps up. + +- G38.2 requires at least one axis word. Multiple axis words work too. +When commanded, the probe cycle will move at the last ‘F’ feed rate +specified in a straight line. + +- During a probe cycle: If the probe pin goes low (normal high), Grbl +will record that immediate position and engage a feed hold. Meaning +that the CNC machine will move a little past the probe switch point, so +keep federates low to stop sooner. Once stopped, Grbl will issue a move +to go back to the recorded probe trigger point. + +- During a probe cycle: If the probe switch does not engage by the time +the machine has traveled to its target coordinates, Grbl will issue an +ALARM and the user will be forced to reset Grbl. (Currently G38.3 probe +without error isn’t supported, but would be easy to implement later.) + +- After a successful probe, Grbl will send a feedback message +containing the recorded probe coordinates in the machine coordinate +system. This is as the g-code standard on probe parameters specifies. + +- The recorded probe parameters are retained in Grbl memory and can be +viewed with the ‘$#’ print parameters command. Upon a power-cycle, not +a soft-reset, Grbl will re-zero these values. + +- Moved ‘$#’ command to require IDLE or ALARM mode, because it accesses +EEPROM to fetch the coordinate system offsets. + +- Updated the Grbl version to v0.9d. + +- The probe cycle is subject to change upon testing or user-feedback. + + +---------------- +Date: 2014-02-27 +Author: Sonny Jeon +Subject: Probe cycle line numbers ifdef fixes to get it to compile. + +- Updated some of the ifdefs when disabling line numbers feature. +Getting messy with this compile-time option. This will likely get +cleaned up later. + +- This is just a push to get the new probing code to compile. Testing +and optimization of the code will soon follow and be pushed next. + + +---------------- +Date: 2014-02-27 +Author: Sonny Jeon +Subject: Merge pull request #362 from robgrz/dev + +Minimal probing cycle working. Supports both G38.2 for error and G38.3 ... + +---------------- +Date: 2014-02-26 +Author: Sonny Jeon +Subject: Added grbl planner Matlab simulator for test reference. Updated line number compile-time option. + +- Added a grbl planner simulation tool that was written in Matlab and +Python. It was used to visualize the inner workings of the planner as a +program is streamed to it. The simulation assumes that the planner +buffer is empty, then filled, and kept filled. This is mainly for users +to see how the planner works. + +- Updated some of the compile-time ifdefs when enabling line numbers. +The leaving the un-used line numbers in the function calls eats a +non-neglible amount of flash memory. So the new if-defs remove them. + + +---------------- +Date: 2014-02-25 +Author: Robert Grzesek +Subject: Minimal probing cycle working. Supports both G38.2 for error and G38.3 when no errors are desired. + + +---------------- +Date: 2014-02-19 +Author: Sonny Jeon +Subject: Minor updates to line number feature. + +- Changed line number integer types from unsigned to signed int32. +G-code mandates values cannot exceed 99999. Negative values can be used +to indicate certain modes. + +- Homing cycle line number changed to -1, as an indicator. + +- Fixed a reporting define for the spindle states that was broken by +the last merge. + + +---------------- +Date: 2014-02-19 +Author: Sonny Jeon +Subject: Merge pull request #356 from robgrz/dev + +Line number reporting as compile-time option. + +---------------- +Date: 2014-02-19 +Author: Sonny Jeon +Subject: Commenting updates. Minor bug fix with exit of soft limit event. + + +---------------- +Date: 2014-02-18 +Author: Robert Grzesek +Subject: Merge commit 'cd71a90ce8a770e0030ed6c9bac805b89724e275' into dev + +Conflicts: + limits.c + motion_control.c + report.c + + +---------------- +Date: 2014-02-15 +Author: Sonny Jeon +Subject: Homing and feed hold bug fixes. + +WARNING: Bugs may still exist. This branch is a work in progress and +will be pushed to the edge branch when at beta stability. Use at your +own risk. + +- Homing freezing issue fixed. Had to do with the cycle stop flag being +set incorrectly after the homing cycles and before the pull-off +maneuver. Now resets the stepper motors before this can happen. + +- Fixed an issue with a rare feed hold failure. Had to do with feed +hold ending exactly at the end of a block. The runtime protocol now +sets the QUEUED and IDLE states appropriately when this occurs. Still +need to clean this code up however, as it’s patched rather than written +well. + +- Updated version build via $I command. + +- Forgot to comment on a new feature for the last commit. Since steps +are integers and millimeters traveled are floats, the old step segment +generator ignored the step fraction differences in generating the +segment velocities. Didn’t see like it would be much of a big deal, but +there were instances that this would be a problem, especially for very +slow feed rates. The stepper algorithm now micro-adjusts the segment +velocities based on the step fractions not executed from the previous +segment. This ensures that Grbl generates the velocity profiles EXACTLY +and noticeably improves overall acceleration performance. + + +---------------- +Date: 2014-02-09 +Author: Sonny Jeon +Subject: Refactoring and lots of bug fixes. Updated homing cycle. + +WARNING: There are still some bugs to be worked out. Please use caution +if you test this firmware. + +- Feed holds work much better, but there are still some failure +conditions that need to be worked out. This is the being worked on +currently and a fix is planned to be pushed next. + +- Homing cycle refactoring: Slight adjustment of the homing cycle to +allow for limit pins to be shared by different axes, as long as the +shared limit pins are not homed on the same cycle. Also, removed the +LOCATE_CYCLE portion of the homing cycle configuration. It was +redundant. + +- Limit pin sharing: (See above). To clear up one or two limit pins for +other IO, limit pins can now be shared. For example, the Z-limit can be +shared with either X or Y limit pins, because it’s on a separate homing +cycle. Hard limit will still work exactly as before. + +- Spindle pin output fixed. The pins weren’t getting initialized +correctly. + +- Fixed a cycle issue where streaming was working almost like a single +block mode. This was caused by a problem with the spindle_run() and +coolant_run() commands and issuing an unintended planner buffer sync. + +- Refactored the cycle_start, feed_hold, and other runtime routines +into the runtime command module, where they should be handled here +only. These were redundant. + +- Moved some function calls around into more appropriate source code +modules. + +- Fixed the reporting of spindle state. + + +---------------- +Date: 2014-02-06 +Author: Robert Grzesek +Subject: Made line number reporting optional via config.h + + +---------------- +Date: 2014-02-06 +Author: Robert Grzesek +Subject: Initial line number reporting + + +---------------- +Date: 2014-02-02 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-01-28 +Author: Jens Geisler +Subject: Merge pull request #337 from michmerr/edge + +Make sure that cycle_start state is set before simulating steps. + +---------------- +Date: 2014-01-28 +Author: michmerr +Subject: Simplify setting of STATE_CYCLE and ISR interval. + +Set sys.state to STATE_CYCLE directly instead of calling back to +st_wakeup(). + +Convert get_step_time() to a constant and rename it to ISR_INTERVAL. + + +---------------- +Date: 2014-01-22 +Author: michmerr +Subject: Make sure that cycle_start state is set before simulating steps. + + +---------------- +Date: 2014-01-15 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-01-14 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-01-10 +Author: Sonny Jeon +Subject: Lots of re-organization and cleaning-up. Some bug fixes. + +- Added a new source and header file called system. These files contain +the system commands and variables, as well as all of the system headers +and standard libraries Grbl uses. Centralizing some of the code. + +- Re-organized the include headers throughout the source code. + +- ENABLE_M7 define was missing from config.h. Now there. + +- SPINDLE_MAX_RPM and SPINDLE_MIN_RPM now defined in config.h. No +uncommenting to prevent user issues. Minimum spindle RPM now provides +the lower, near 0V, scale adjustment, i.e. some spindles can go really +slow so why use up our 256 voltage bins for them? + +- Remove some persistent variables from coolant and spindle control. +They were redundant. + +- Removed a VARIABLE_SPINDLE define in cpu_map.h that shouldn’t have +been there. + +- Changed the DEFAULT_ARC_TOLERANCE to 0.002mm to improve arc tracing. +Before we had issues with performance, no longer. + +- Fixed a bug with the hard limits and the software debounce feature +enabled. The invert limit pin setting wasn’t honored. + +- Fixed a bug with the homing direction mask. Now is like it used to +be. At least for now. + +- Re-organized main.c to serve as only as the reset/initialization +routine. Makes things a little bit clearer in terms of execution +procedures. + +- Re-organized protocol.c as the overall master control unit for +execution procedures. Not quite there yet, but starting to make a +little more sense in how things are run. + +- Removed updating of old settings records. So many new settings have +been added that it’s not worth adding the code to migrate old user +settings. + +- Tweaked spindle_control.c a bit and made it more clear and consistent +with other parts of Grbl. + +- Tweaked the stepper disable bit code in stepper.c. Requires less +flash memory. + + +---------------- +Date: 2014-01-05 +Author: Sonny Jeon +Subject: Updates to some stepper algorithm commenting + + +---------------- +Date: 2014-01-05 +Author: Sonny Jeon +Subject: New build info feature. (per @Analogreality request) + +- New build info feature. Hidden command ‘$I’ will print the build info +for your Grbl firmware. Users may also write an identifying message +within it via ‘$I=‘ with up to 32 characters. (no more, or else it will +break). + +- Adjusted the max number of startup lines to 3. Majority of people +will only need one. + +- Fixed a compile error with spindle_control.c. A rogue #endif was +causing problems. + + +---------------- +Date: 2014-01-04 +Author: Sonny Jeon +Subject: Variable spindle output. Resolved conflicts in last push. + +Resolve conflicts. + + +---------------- +Date: 2014-01-04 +Author: Sonny Jeon +Subject: Cleaned up variable spindle output (PWM). Code and config comments. + +- Variable spindle speed output as a configuration option. Thanks +@EliteEng! When enabled, the Z-limit (D11) and spindle enable(D12) pins +switch to allow access to the hardware PWM output on pin D11. +Otherwise, everything should work as it does. + +- Removed option for inverting the spindle and coolant enable pins. +This is a safety hazard, especially for the spindle. When Grbl +initializes, all pins are momentarily low until it finishes booting. If +an invert is enabled, this means the spindles can be energized briefly +during this time. If users need signal inversion, it’s recommended to +just wire in an inversion circuit instead. + +- Cleared out references to spindle variable output in terms of step +signal. This isn’t complete and requires more deliberation before +installing. + +- Cleared up and cleaned up some code and config comments. + + +---------------- +Date: 2014-01-03 +Author: Sonny Jeon +Subject: Merge pull request #322 from EliteEng/dev + +Update to fix compile error + +---------------- +Date: 2014-01-03 +Author: Rob Brown +Subject: Update to fix compile error + +Update to fix compile error + + +---------------- +Date: 2014-01-02 +Author: Sonny Jeon +Subject: Merge pull request #318 from EliteEng/dev + +PWM Spindle Control and Invert Spindle & Coolant Pins + +---------------- +Date: 2014-01-03 +Author: Rob Brown +Subject: Update spindle_control.c + +Updated spindle_control.c due to compile error. + +---------------- +Date: 2014-01-02 +Author: Sonny Jeon +Subject: Fix for M7/8/9 modal group checks. Updated AMASS frequency cutoffs and code cleaned. + +- Updated Grbl version to 0.9c and build number. + +- G-code parser was missing modal group violation checks for M7/8/9 +commands. Added them. + +- Updated the Adaptive Multi-Axis Step Smoothing (AMASS) cutoff +frequencies so that the trade between the 16-bit Timer1 accuracy and +the level step smoothing are somewhat better balanced. (Smoothing isn’t +free, but a higher accuracy timer would provide high cutoff +frequencies.) + + +---------------- +Date: 2014-01-02 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-01-02 +Author: Rob Brown +Subject: PWM Spindle Control and Invert Spindle & Coolant Pins + +PWM Spindle Control and Invert Spindle & Coolant Pins + + +---------------- +Date: 2013-12-30 +Author: Sonny Jeon +Subject: Minor bug fixes: Homing travel calculations. Cycle resuming after spindle and dwell commands. + +- Homing travel calculations fixed. It was computing the min travel +rather than max. + +- Auto-start disable and pausing after spindle or dwell commands. +Related to plan_synchronize() function call. Now fixed, but still need +to work on the system state. + +- Pushed a fix to make this branch more Arduino IDE compatible. Removed +extern call in nuts_bolts.c + +- Updated the stepper configuration option of enabling or disabling the +new Adaptive Multi-Axis Step Smoothing Algorithm. Now works either way. + +- Updated some copyright info. + + +---------------- +Date: 2013-12-30 +Author: Sonny Jeon +Subject: Merge pull request #201 from Protoneer/master + +Made a few changes to make the code compatible with the Arduino IDE. Sorry about the tardiness! + +---------------- +Date: 2013-12-30 +Author: Sonny Jeon +Subject: Incomplete push but working. Lots more stuff. More to come. + +- NEW! An active multi-axis step smoothing algorithm that automatically +adjusts dependent on step frequency. This solves the long standing +issue to aliasing when moving with multiple axes. Similar in scheme to +Smoothieware, but more advanced in ensuring a more consistent CPU +overhead throughout all frequencies while maintaining step exactness. + +- Switched from Timer2 to Timer0 for the Step Port Reset Interrupt. +Mainly to free up hardware PWM pins. + +- Seperated the direction and step pin assignments, so we can now move +them to seperate ports. This means that we can more easily support 4+ +axes in the future. + +- Added a setting for inverting the limit pins, as so many users have +request. Better late than never. + +- Bug fix related to EEPROM calls when in cycle. The EEPROM would kill +the stepper motion. Now protocol mandates that the system be either in +IDLE or ALARM to access or change any settings. + +- Bug fix related to resuming the cycle after a spindle or dwell +command if auto start has been disabled. This fix is somewhat temporary +or more of a patch. Doesn’t work with a straight call-response +streaming protocol, but works fine with serial buffer pre-filling +streaming that most clients use. + +- Renamed the pin_map.h to cpu_map.h to more accurately describe what +the file is. + +- Pushed an auto start bug fix upon re-initialization. + +- Much more polishing to do! + + +---------------- +Date: 2013-12-29 +Author: Sonny Jeon +Subject: Incomplete dev code push, but working. Lots of updates/fixes/improvements. Much still to polish. + +- Ugh. Github just erased my list of improvements and changes due to a +conflict and forcing me to resolve it. Hope this goes through. + +- Major stepper algorithm change. Trashed the old v0.9 edge +branch-style stepper algorithm. It’s fine, but it was susceptible to +aliasing noise when moving very slow or very fast. It also had a bit of +CPU overhead. It was written to solve a standing issue with v0.8 +master, where it couldn’t generate a smooth acceleration abocve +10-15kHz. But, with new step segment buffer in v0.9c, it inadvertently +fixed the acceleration problem with v0.8 stepper algorithm. So, what +does it mean for you? Smoother stepper pulses and likely higher step +frequencies. + +- Stepper algorithm now uses Timer1 and Timer2, instead of Timer0 and +Timer2. Timers 0 and 2 can be swapped if there is an issue. + +- With the old v0.8 stepper algorithm, the STEP_DELAY_PULSE +configuration option is also back. + +- NEW! Hard limit software debouncing. Grbl now employs the AVR’s +watchdog timer as a way to monitor the hard limit pins and checking +their states after a delay. This is a simple software debouncing +technique and may help alleviate some of the false trigger some users +have been complaining about. BUT, this won’t fix electric noise issues! + +- Fixed an issue with the new homing cycle routine where it wasn’t +honoring the acceleration and axis speed limits depending on the homing +cycle mask. Now does. Also, updated the homing direction mask code to +be a little cleaner. + +- Moved the main part of the homing cycle control and execution to +motion_control.c, where it fits better. + +- Removed the STATE_INIT system state as it was redundant. Made the +system states into bitflags so multiple system states can be checked +via one if statement. + +- Reorganized the power-up routine to work with the new system states. + + +---------------- +Date: 2013-12-29 +Author: Sonny Jeon +Subject: Merge branch 'dev' of https://github.com/grbl/grbl into dev + +Conflicts: + limits.c + + +---------------- +Date: 2013-12-29 +Author: Sonny Jeon +Subject: Merge branch 'dev' of https://github.com/grbl/grbl into dev + +Conflicts: + limits.c + + +---------------- +Date: 2013-12-27 +Author: Sonny Jeon +Subject: Merge pull request #312 from scottrcarlson/dev + +Fixed homing_dir_mask functionality in the re-written homing_cycle. + +---------------- +Date: 2013-12-27 +Author: Scott R Carlson +Subject: Hard Limits configured for active high. + +Added the use of homing_dir_mask to homing_cycle + + +---------------- +Date: 2013-12-10 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2013-12-10 +Author: Sonny Jeon +Subject: Revamped homing cycle. Axis limits and max travel bug fixes. Build info. Refactored config.h. + +- Revamped and improved homing cycle. Now tied directly into the main +planner and stepper code, which enables much faster homing seek rates. +Also dropped the compiled flash size by almost 1KB, meaning 1KB more +for other features. + +- Refactored config.h. Removed obsolete defines and configuration +options. Moved lots of “advanced” options into the advanced area of the +file. + +- Updated defaults.h with the new homing cycle. Also updated the +Sherline 5400 defaults and added the ShapeOko2 defaults per user +submissions. + +- Fixed a bug where the individual axes limits on velocity and +acceleration were not working correctly. Caused by abs() returning a +int, rather than a float. Corrected with fabs(). Duh. + +- Added build version/date to the Grbl welcome message to help indicate +which version a user is operating on. + +- Max travel settings were not being defaulted into the settings EEPROM +correctly. Fixed. + +- To stop a single axis during a multi-axes homing move, the stepper +algorithm now has a simple axis lock mask which inhibits the desired +axes from moving. Meaning, if one of the limit switches engages before +the other, we stop that one axes and keep moving the other. + + +---------------- +Date: 2013-12-10 +Author: Sonny Jeon +Subject: Merge pull request #301 from shapeoko/master + +added shapeoko2 profile + +---------------- +Date: 2013-12-10 +Author: Edward +Subject: added shapeoko2 profile + +shapeoko 2 uses 2mm GT2 belting and 20tooth pulleys + + +---------------- +Date: 2013-12-07 +Author: Sonny Jeon +Subject: Deceleration to zero speed improvements. Update defaults. + +- A minor issue with deceleration ramps when close to zero velocity. +Should be virtually unnoticeable for most CNC systems, but fixed in +this push and accurate to physics. + +- Updated some of the junction deviation defaults. Because the new +stepper algorithm can easily maximize a CNC machine’s capabilities or +simply go much faster, this means the speed in which it enters +junctions has to be a little more constrained. Meaning that, we have to +slow a little bit down more so that we don’t exceed the acceleration +limits of the stepper motors. + + +---------------- +Date: 2013-12-07 +Author: Sonny Jeon +Subject: Pushed bug fixes. Updated readme. + +- G18 plane select fix from XZ-plane to ZX-plane per right hand rule. + +- Added volatile declaration for rx_buffer_tail in serial.c. No real +effect to operation as avr-gcc adds this upon compilation. Helps with +porting issues when using a different compiler. + + +---------------- +Date: 2013-12-07 +Author: Sonny Jeon +Subject: Pushed limits active high option. Updated defaults.h. Misc bug fixes. Cleaned up codebase. + +- Pushed limit switch active high option (i.e. NC switches). + +- Updated defaults.h to be in-line with the new settings. + +- Refactored feed hold handling and step segment buffer to be more +generalized in effort to make adding feedrate overrides easier in the +future. Also made it a little more clean. + +- Fixed G18 plane select issue. Now ZX-plane, rather than XZ-plane, per +right hand rule. + +- Cleaned some of the system settings by more accurately renaming some +of the variables and removing old obsolete ones. + +- Declared serial.c rx_buffer_tail to be volatile. No effect, since +avr-gcc automatically does this during compilation. Helps with porting +when using other compilers. + +- Updated version number to v0.9b. + +- Updates to README.md + + +---------------- +Date: 2013-12-04 +Author: Sonny Jeon +Subject: Reinstated feed holds into new stepper algorithm and planner. Rough draft, but working. + +- Reinstated the feed hold feature with the new stepper algorithm and +new optimized planner. It works, but will be re-factored a bit soon to +clean up the code. + +- At this point, feedrate overrides may need to be installed in the +v1.0 version of grbl, while this version will likely be pushed to the +edge branch soon and pushed to master after the bugs have been squashed. + +- Measured the overall performance of the new planner and stepper +algorithm on an oscilloscope. The new planner is about 4x faster than +before, where it is completing a plan in around 1ms. The stepper +algorithm itself is minutely faster, as it is a little lighter. The +trade-off in the increased planner performance comes from the new step +segment buffer. However, even in the worse case scenario, the step +segment buffer generates a new segment with a typical 0.2 ms, and the +worse case is 1ms upon a new block or replanning the active block. +Added altogether, it’s argubly still twice as efficient as the old one. + + +---------------- +Date: 2013-11-23 +Author: Sonny Jeon +Subject: Merge pull request #289 from Travis-Snoozy/master + +Add support for active-high limit switches + +---------------- +Date: 2013-11-22 +Author: Travis Snoozy +Subject: Add support for active-high limit switches + + +---------------- +Date: 2013-11-22 +Author: Sonny Jeon +Subject: Yet another major stepper algorithm and planner overhaul. + +- Overhauled the stepper algorithm and planner again. This time +concentrating on the decoupling of the stepper ISR completely. It is +now dumb, relying on the segment generator to provide the number of +steps to execute and how fast it needs to go. This freed up lots of +memory as well because it made a lot tracked variables obsolete. + +- The segment generator now computes the velocity profile of the +executing planner block on the fly in floating point math, instead of +allowing the stepper algorithm to govern accelerations in the previous +code. What this accomplishes is the ability and framework to (somewhat) +easily install a different physics model for generating a velocity +profile, i.e. s-curves. + +- Made some more planner enhancements and increased efficiency a bit. + +- The changes also did not increase the compiled size of Grbl, but +decreased it slightly as well. + +- Cleaned up a lot of the commenting. + +- Still much to do, but this push works and still is missing feedholds +(coming next.) + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Another merge fix. + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Merge fixes. + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Merge branch 'dev_2' into dev + +Conflicts: + README.md + gcode.c + motion_control.c + planner.c + planner.h + protocol.c + report.c + settings.c + settings.h + stepper.c + stepper.h + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Merge branch 'dev_2' into dev + +Conflicts: +README.md +gcode.c +motion_control.c +planner.c +planner.h +protocol.c +report.c +settings.c +settings.h +stepper.c +stepper.h + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Planner function call fix. More clean up. + + +---------------- +Date: 2013-10-29 +Author: Sonny Jeon +Subject: Updated comments. Changed stepper variable names to be more understandable. Added step locking note. + +- Updated config comments and stepper code comments for the new changes. + +- Changed stepper algorithm variable names to be more understandable in +what they actually do. + +- Added a stepper lock note in default.h per user request. + +- Started some code layout in handling feed holds and refactoring the +homing routine to use the main stepper algorithm instead of a seperate +version. + + +---------------- +Date: 2013-10-24 +Author: Sonny Jeon +Subject: Cleaned up stepper and planner code. + +- Added some compile-time error checking. Will add more in future +pushes to ensure settings are correct and within parameters that won't +break anything. + +- Pushed some master branch changes with MEGA pin settings. + +- Cleaned up planner code and comments to clarify some of the new +changes. Still much to do here. + +- Cleaned up the new stepper code. May need to abstract some of the +segment buffer more to fix the feed holds (and integrate homing into +the main stepper routine). With what's planned, this should make the +stepper algorithm easier to attach other types of processes to it, +where it is now tightly integrated with the planner buffer and nothing +else. + + +---------------- +Date: 2013-10-21 +Author: Sonny Jeon +Subject: Merge pull request #279 from EliteEng/master + +Changed Stepper Pins + +---------------- +Date: 2013-10-18 +Author: Rob Brown +Subject: Changed Stepper Pins + +Changed Stepper Pins so the Step Port Invert Mask matches the UNO + + +---------------- +Date: 2013-10-17 +Author: Sonny Jeon +Subject: Merge pull request #278 from EliteEng/master + +Update Pin Change Interrupts on Mega 2560 + +---------------- +Date: 2013-10-17 +Author: Rob Brown +Subject: Update Pin Change Interrupts so it works + +PCIE1 - Interrupt 8 on the Mega is attached to USART0 RX so when any +serial communication was transmitted it was triggering the Reset +Interrupt + + +---------------- +Date: 2013-10-14 +Author: Sonny Jeon +Subject: Fine tuning of new stepper algorithm with protected planner. Adaptive step prediction for segment buffer. + +- Cleaned up the new stepper algorithm code with more commenting and +better logic flow. + +- The new segment buffer now predicts the number of steps each segment +should have to execute over about 8 milliseconds each (based on the +ACCELERATION_TICKS_PER_SECOND setting). So, for when the whole segment +buffer is full, the stepper algorithm has roughly 40 milliseconds of +steps queued before it needs to refilled by the main program. + +- Readjusted the max supported step rate back to 30kHz from the lower +development 20kHz. Everything still works amazing great and the test +CNC machine still runs twice as fast with the new stepper algorithm and +planner. + +- Upped the standard serial baudrate to 115200 baud, as it is clear +that the bottleneck is the serial interface. Will now support this, as +well as the old 9600 baud, in new firmware builds. + + +---------------- +Date: 2013-10-12 +Author: Sonny Jeon +Subject: New stepper subsystem bug fixes. + +- New stepper algorithm with the new optimized planner seems to be +working nearly twice as fast as the previous algorithm. + +- For one, the planner computation overhead is probably a fraction of +what it used to be with the worst case being about half still. + +- Secondly, anytime the planner plans back to the first executing +block, it no longer overwrites the block conditions and allows it to +complete without lost steps. So no matter if the streams slows, the +protected planner should keep the steppers moving without risk of lost +steps (although this still needs to be tested thoroughly and may +audibly sound weird when this happens.) + +- It now seems that the bottleneck is the serial baudrate (which is +good!) + + +---------------- +Date: 2013-10-09 +Author: Sonny Jeon +Subject: Protected buffer works! Vast improvements to planner efficiency. Many things still broken with overhaul. + +Development push. Lots still broken. + +- Protected planner concept works! This is a critical precursor to +enabling feedrate overrides in allowing the planner buffer and the +stepper execution operate atomically. This is done through a +intermediary segment buffer. + +- Still lots of work to be done, as this was a complete overhaul of the +planner and stepper subsystems. The code can be cleaned up quite a bit, +re-enabling some of the broken features like feed holds, and finishing +up some of the concepts + +- Pushed some of the fixes from the master and edge branch to here, as +this will likely replace the edge branch when done. + + +---------------- +Date: 2013-08-25 +Author: Sonny Jeon +Subject: Merge pull request #263 from 0xPIT/master + +remove mcu argument for avr-size in makefile as it is not present in GNU... + +---------------- +Date: 2013-08-25 +Author: 0xPIT +Subject: remove mcu argument for avr-size in makefile as it is not present in GNU Binutils 2.22 + + +---------------- +Date: 2013-08-20 +Author: Sonny Jeon +Subject: Pin map definition cleanup. + + +---------------- +Date: 2013-08-19 +Author: Sonny Jeon +Subject: Processor-independent pin mapping feature. + +- Cleaned up and organized pin mapping concept by @elmom. + +- pin_map.h allows for user-supplied pin mapping and port vector +definitions in a centralized file. With more processor types, more +definitions could be added. + + +---------------- +Date: 2013-08-19 +Author: Sonny Jeon +Subject: Merge pull request #260 from elmom/master + +Thanks for the contribution! Looks good. Will update some of the semantics shortly, but the idea is solid. + +---------------- +Date: 2013-08-19 +Author: Sonny Jeon +Subject: Push old dev_2 draft to work on other things. + +- **NON-FUNCTIONAL** +- Contains an old draft of separating the stepper driver direct access +to the planner buffer. This is designed to keep the stepper and planner +modules independent and prevent overwriting or other complications. In +this way, feedrate override should be able to be installed as well. +- A number of planner optimizations are installed too. +- Not sure where the bugs are. Either in the new planner optimizations, +new stepper module updates, or in both. Or it just could be that the +Arduino AVR is choking with the new things it has to do. + + +---------------- +Date: 2013-08-19 +Author: Sonny Jeon +Subject: Merge pull request #229 from 0xPIT/patch-1 + +fix command line parameter for avr-size + +---------------- +Date: 2013-07-21 +Author: Elmo Mäntynen +Subject: Refactor config.h to allow defaults for chips/boards with different pin mappings + + +---------------- +Date: 2013-07-21 +Author: Elmo Mäntynen +Subject: Added pin mapping list to docs, useful for porting + + +---------------- +Date: 2013-07-21 +Author: Elmo Mäntynen +Subject: Make serial work with most chips by default + + +---------------- +Date: 2013-05-16 +Author: 0xPIT +Subject: fix command line parameter for avr-size + +---------------- +Date: 2013-04-05 +Author: Sonny Jeon +Subject: Updated readme + + +---------------- +Date: 2013-04-05 +Author: Sonny Jeon +Subject: Increased g-code parser line buffer. Added line overflow feedback. + +- Increased g-code parser line buffer from 50 to 70 characters. Should +fix most all issues with long arc statements, provided that they are 8 +digits(float) long only. + +- Added a line buffer overflow feedback error to let the user know when +it encounters this problem. Resets the line whenever this occurs. +(Thanks @BHSPitMonkey!) + + +---------------- +Date: 2013-04-05 +Author: Sonny Jeon +Subject: Updates to edge/dev. Line buffer increased/planner buffer decreased. Line overflow feedback. + +- Increased g-code parser line buffer to 70 characters (from 50) to +prevent some long arc commands from getting truncated. + +- Decreased planner buffer from 18 to 17 blocks to free up memory for +line buffer. + +- Added a line buffer overflow feedback error (Thanks @BHSPitMonkey!) + + +---------------- +Date: 2013-03-28 +Author: Sonny Jeon +Subject: Minor updates to code and commenting. + + +---------------- +Date: 2013-03-22 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2013-03-21 +Author: Sonny Jeon +Subject: Untested! Soft limits, max travel, homing changes, new settings. + +- WARNING: Completely untested. Will later when there is time. Settings +WILL be overwritten, as there are new settings. + +- Soft limits installed. Homing must be enabled for soft limits to work +correctly. Errors out much like a hard limit, locking out everything +and bringing up the alarm mode. Only difference is it forces a feed +hold before doing so. Position is not lost. + +- IMPORTANT: Homing had to be updated so that soft limits work better +with less CPU overhead. When homing completes, all axes are assumed to +exist in negative space. If your limit switch is other side, the homing +cycle with set this axis location to the max travel value, rather than +zero. + +- Update mc_line() to accept an array, rather than individual variables. + +- Added an mc_auto_cycle_start() function handle this feature. +Organization only. + +- + + +---------------- +Date: 2013-03-19 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2013-03-19 +Author: Sonny Jeon +Subject: G-code updates for G10 L2 and L20 + +- Updated g-codes G10 L2 and G10 L20 to the new descriptions on +linuxcnc.org + + +---------------- +Date: 2013-03-19 +Author: Sonny Jeon +Subject: G-code updates for G10 L2 and L20. + +- LinuxCNC's g-code definitions changed for G10. Updated to their +descriptions. + + +---------------- +Date: 2013-03-13 +Author: Bertus Kruger +Subject: Update planner.c + +Removed inline from all functions. + +If this is really needed is there another way that we can get +around using it? (The Arduino IDE does not recognize it)  + +---------------- +Date: 2013-03-13 +Author: Bertus Kruger +Subject: Update nuts_bolts.c + +Removed __floatunsisf and used normal casting on line 81. +This makes it compatible with the Arduino IDE. + +---------------- +Date: 2013-03-12 +Author: Sonny Jeon +Subject: Pushed minor changes. Thanks @Protoneer! + + +---------------- +Date: 2013-03-12 +Author: Sonny Jeon +Subject: Merge pull request #200 from Protoneer/master + +Fixed small bug. + +---------------- +Date: 2013-03-13 +Author: Bertus Kruger +Subject: Update gcode.c + +Removed the home_select variable. + +---------------- +Date: 2013-03-13 +Author: Bertus Kruger +Subject: Update eeprom.h + +Fixed the function signature. + +---------------- +Date: 2013-03-13 +Author: Bertus Kruger +Subject: Update eeprom.c + +Changed back + +---------------- +Date: 2013-03-12 +Author: Bertus Kruger +Subject: Update gcode.c + +home_select defined out of scope. Moved it outside the switch +so the rest of the switch can see it properly.  + +---------------- +Date: 2013-03-12 +Author: Bertus Kruger +Subject: Update eeprom.c + +Function eeprom_put_char's parameters did not align with the .h file. + +---------------- +Date: 2013-03-01 +Author: Sonny Jeon +Subject: Bug fix to-do note on soft limit checks. Not yet completed. + + +---------------- +Date: 2013-03-01 +Author: Sonny Jeon +Subject: Minor changes and added notes to soft limits routines. + +- Changed up mc_line to accept an array rather than individual x,y,z +coordinates. Makes some of the position data handling more effective, +especially for a 4th-axis later on. + +- Changed up some soft limits variable names. + + +---------------- +Date: 2013-02-26 +Author: Sonny Jeon +Subject: Merge pull request #193 from bungao/soft_limts + +integrating soft limits + +---------------- +Date: 2013-02-26 +Author: Jens Geisler +Subject: bugfix: uninitiallized curr_block->new_entry_speed_sqr lead to step loss +in some cases + +---------------- +Date: 2013-02-26 +Author: bungao +Subject: integrating soft limits + + +---------------- +Date: 2013-02-22 +Author: Sonny Jeon +Subject: Added some prelimary notes to new changes. + + +---------------- +Date: 2013-02-22 +Author: Sonny Jeon +Subject: Push additional updates from @jgeisler0303 + + +---------------- +Date: 2013-02-22 +Author: Jens Geisler +Subject: changed atomic access for updating the acceleration profile +the stepper interrupt is only halted when necessary and for the shortest +time possible (8% cycle time) + +---------------- +Date: 2013-02-20 +Author: Sonny Jeon +Subject: Merge pull request #188 from jgeisler0303/new_planner + +New planner commits merge into dev branch. + +---------------- +Date: 2013-02-20 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2013-02-20 +Author: Jens Geisler +Subject: added counter for planner steps + +---------------- +Date: 2013-02-20 +Author: Jens Geisler +Subject: implemented a mixture of Sonny's MATLAB and my previous grbl planner +ontop of the edge planner +examples run byte for byte identical old and new version + +---------------- +Date: 2013-01-18 +Author: Sonny Jeon +Subject: Merge pull request #169 from silasb/fix-execute-bit-on-files + +Removing executable bit on the files + +---------------- +Date: 2013-01-18 +Author: Sonny Jeon +Subject: Merge bug fixes from recent v0.8c push. Added readme for Grbl Sim. + + +---------------- +Date: 2013-01-18 +Author: Sonny Jeon +Subject: Merge pull request #167 from tmpvar/simulator-mac + +Fix sim makefile so it works on mac + +---------------- +Date: 2013-01-18 +Author: Elijah Insua +Subject: Fix sim makefile so it works on mac + +These changes include a path separator fix and the removal of --gc-sections which causes ld failures, and is not needed on a pc. + +This patch also changes how a compiler is selected. The makefile will now select the system compiler , which should work fine +under mingw and linux. + + +---------------- +Date: 2013-01-17 +Author: Silas Baronda +Subject: Removing executable bit on the files + + +---------------- +Date: 2013-01-17 +Author: Sonny Jeon +Subject: Merge pull request #112 from jgeisler0303/simulator + +Grbl Simulator. Oh yeah. + +---------------- +Date: 2013-01-17 +Author: Jens Geisler +Subject: relaunch ontop of latest grbl edge +code very messy but tested + +---------------- +Date: 2013-01-09 +Author: Sonny Jeon +Subject: Merge pull request #160 from daapp/edge + +Replace some constants with N_AXIS. + +---------------- +Date: 2013-01-10 +Author: Alexander Danilov +Subject: Replace some constants with N_AXIS. + + +---------------- +Date: 2013-01-06 +Author: Sonny Jeon +Subject: Fixed bug with homing and polling at the same time. Updated readme. + + +---------------- +Date: 2013-01-06 +Author: Sonny Jeon +Subject: Minor changes. + +- Changed some names up and removed a plan_reset() function that is +never used. + + +---------------- +Date: 2012-12-21 +Author: Sonny Jeon +Subject: Readme link to edge build 2012-12-21 + + +---------------- +Date: 2012-12-21 +Author: Sonny Jeon +Subject: Updated README. Max step rate back at 30kHz. Acceleration minor bug fix. + +- Returned the max step rate to 30kHz. The new arc algorithm works uses +so much less CPU overhead, because the segments are longer, that the +planner has no problem computing through them. + +- Fixed an issue with the acceleration independence scaling. Should now +work with accelerations above 400mm/sec^2 or so. + +- Updated README + + +---------------- +Date: 2012-12-19 +Author: Sonny Jeon +Subject: Arc mm_per_segment removed, now in terms of tolerance. Stepper ramp counter variable type corrected. + +- Arc mm_per_segment parameter was removed and replaced with an +arc_tolerance parameter, which scales all arc segments automatically to +radius, such that the line segment error doesn't exceed the tolerance. +Significantly improves arc performance through larger radius arc, +because the segments are much longer and the planner buffer has more to +work with. + +- Moved n_arc correction from the settings to config.h. Mathematically +this doesn't need to be a setting anymore, as the default config value +will work for all known CNC applications. The error does not accumulate +as much anymore, since the small angle approximation used by the arc +generation has been updated to a third-order approximation and how the +line segment length scale with radius and tolerance now. Left in +config.h for extraneous circumstances. + +- Corrected the st.ramp_count variable (acceleration tick counter) to a +8-bit vs. 32-bit variable. Should make the stepper algorithm just a +touch faster overall. + + +---------------- +Date: 2012-12-16 +Author: Sonny Jeon +Subject: Slow trailing steps fix. Added more defaults. + +- Fixed an issue (hopefully) with slow trailing steps after a +triangular velocity profile move. Sets the trapezoid tick cycle counter +to the correct value for an accurate reproduction of the deceleration +curve. Keeps it from arriving too early to the target position, which +causes the slow trailing steps. + +- Added Zen Toolworks 7x7 to default settings. + +- Updated readme with new edge build. + + +---------------- +Date: 2012-12-16 +Author: Sonny Jeon +Subject: Max velocity axes independence installed. Fixed intermittent slow trailing steps. Timer0 disable fix. + +- Maximum velocity for each axis is now configurable in settings. All +rapids/seek move at these maximums. All feed rates(including rapids) +may be limited and scaled down so that no axis does not exceed their +limits. + +- Moved around auto-cycle start. May change later, but mainly to ensure +the planner buffer is completely full before cycle starting a streaming +program. Otherwise it should auto-start when there is a break in the +serial stream. + +- Reverted old block->max_entry_speed_sqr calculations. Feedrate +overrides not close to ready at all. + +- Fixed intermittent slow trailing steps for some triangle velocity +profile moves. The acceleration tick counter updating was corrected to +be exact for that particular transition. Should be ok for normal +trapezoidal profiles. + +- Fixed the Timer0 disable after a step pulse falling edge. Thanks +@blinkenlight! + + +---------------- +Date: 2012-12-14 +Author: Sonny Jeon +Subject: Acceleration independence installed. Initial re-work of planner for feedrate overrides. + +NOTE: This push is a work-in-progress and there are known bugs that +need to be fixed, like homing acceleration being incompatible. Released +for testing. Settings will definitely be overwritten, as new settings +were needed. + +- Acceleration independence installed in planner. Each axis can now +have different accelerations and Grbl will maximize the accelerations +depending on the direction its moving. Very useful for users like on +the ShapeOko with vastly different Z-axis properties. + +- More planner optimizations and re-factoring. Slightly improved some +of the older calculations, but new acceleration calculations offset +these improvements. Overall no change in processing speed. + +- Removed planner nominal length checks. It was arguable whether or not +this improved planner efficiency, especially in the worst case scenario +of arcs. + +- Updated readme and changed to markdown format. + + +---------------- +Date: 2012-12-12 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2012-12-12 +Author: Sonny Jeon +Subject: Changed README to markdown + + +---------------- +Date: 2012-12-12 +Author: Sonny Jeon +Subject: Added download links to README. + + +---------------- +Date: 2012-12-12 +Author: Sonny Jeon +Subject: Moved compiled builds to different repo. + + +---------------- +Date: 2012-12-11 +Author: Sonny Jeon +Subject: Added builds folder. + +Because the Downloads section has been removed, added a builds folder +for users to download pre-compiled firmware without needing to compile +it themselves. + + +---------------- +Date: 2012-12-11 +Author: Sonny Jeon +Subject: Added builds folder. + +In light of the downloads section in Github being removed, added a +builds folder for all of the .hex files. Hopefully these won't be +removed either. + + +---------------- +Date: 2012-12-11 +Author: Sonny Jeon +Subject: Planner optimizations. + +- Improved planner execution speed by 5% or more. Re-factored most of +the calculations in terms of the square of velocity. This removed a lot +of sqrt() calculations for every planner_recalculate. + + +---------------- +Date: 2012-12-10 +Author: Sonny Jeon +Subject: (Another) Planner bug fix. + +- Oops again. Thought the new planner changes made things much better, +but there was a bug. Improvements we on the order of 20% execution time +reduction, rather than half. The increase to 30kHz Ranade timer +frequency also increased the overall overhead, so the total planner +change? Zero. But, it's still better. + + +---------------- +Date: 2012-12-10 +Author: Sonny Jeon +Subject: Planner bug fix. + +- Oops! Misplace an if-then statement. Should work as advertised now. +(Hopefully) + + +---------------- +Date: 2012-12-10 +Author: Sonny Jeon +Subject: Planner execution time halved and bug fixes. Increased step rate limit to 30kHz. + +- Planner execute speed has been more than halved from 4ms to 1.9ms +when computing a plan for a single line segment during arc generation. +This means that Grbl can now run through an arc (or complex curve) +twice as fast as before without starving the buffer. For 0.1mm arc +segments, this means about the theoretical feed rate limit is about +3000mm/min for arcs now. + +- Increased the Ranade timer frequency to 30kHz, as there doesn't seem +to be any problems with increasing the frequency. This means that the +maximum step frequency is now back at 30kHz. + +- Added Zen Toolworks 7x7 defaults. + + +---------------- +Date: 2012-12-08 +Author: Sonny Jeon +Subject: New stepper algorithm. Optimized planner. + +- Brand-new stepper algorithm. Based on the Pramod Ranade inverse time +algorithm, but modified to ensure step events are exact. Currently +limited to about 15kHz step rates, much more to be done to enable 30kHz +again. + +- Removed Timer1. Stepper algorithm now uses Timer0 and Timer2. + +- Much improved step generation during accelerations. Smoother. Allows +much higher accelerations (and speeds) than before on the same machine. + +- Cleaner algorithm that is more easily portable to other CPU types. + +- Streamlined planner calculations. Removed accelerate_until and +final_rate variables from block buffer since the new stepper algorithm +is that much more accurate. + +- Improved planner efficiency by about 15-20% during worst case +scenarios (arcs). + +- New config.h options to tune new stepper algorithm. + diff --git a/doc/log/commit_log_v0.9i.txt b/doc/log/commit_log_v0.9i.txt new file mode 100644 index 000000000..a3401c2a6 --- /dev/null +++ b/doc/log/commit_log_v0.9i.txt @@ -0,0 +1,876 @@ +---------------- +Date: 2015-08-16 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2015-08-14 +Author: Sonny Jeon +Subject: Individual control pin invert compile-option. + +- Control pins may be individually inverted through a +CONTROL_INVERT_MASK macro. This mask is define in the cpu_map.h file. + + +---------------- +Date: 2015-07-17 +Author: Sonny Jeon +Subject: Version bump to v0.9j + +- Version bump requested by OEMs to easily determine whether the +firmware supports the new EEPROM reset feature. Other than that, no +significant changes. + + +---------------- +Date: 2015-06-25 +Author: Sonny Jeon +Subject: Restore parameters minor bug fix. + +- `$RST=#` was not wiping the G30 positions from EEPROM. Minor but now +fixed. + + +---------------- +Date: 2015-06-20 +Author: Sonny Jeon +Subject: New EEPROM restore functions. + +- Tweaked the previous EEPROM restore implementation and added new +functionality. + +- `$RST=$` restores the `$$` grbl settings back to firmware defaults, +which are set when compiled. + +- `$RST=#` restores the `$#` parameters in EEPROM. At times it’s useful +to clear these and start over, rather than manually writing each entry. + +-`$RST=*` wipe all of the data in EEPROM that Grbl uses and restores +them to defaults. This includes `$$` settings, `$#` parameters, `$N` +startup lines, and `$i` build info string. + +NOTE: This doesn’t write zeros throughout the EEPROM. It only writes +where Grbl looks for data. For a complete wipe, please use the Arduino +IDE’s EEPROM clear example. + +- Refactored the restore and wipe functions in settings.c to +accommodate the new commands. + + +---------------- +Date: 2015-06-18 +Author: Sonny Jeon +Subject: Updated README + + +---------------- +Date: 2015-06-18 +Author: Sonny Jeon +Subject: Added restore settings defaults command. + +- New restore setting defaults command. Only wipes ‘$$’ setting in +EEPROM and reloads them based on the defaults used when Grbl was +compiled. Used with a `$RST` command + +NOTE: `$RST` is intentionally not listed in the Grbl ‘$’ help message. + + +---------------- +Date: 2015-05-29 +Author: Sonny Jeon +Subject: Added G61 exact path support. + +- G61 exact path is the Grbl default path control mode, so it’s now +added as a supported g-code. + + +---------------- +Date: 2015-05-27 +Author: Sonny Jeon +Subject: Another git case-sensitive folder fix. + +- I’m now officially annoyed. + + +---------------- +Date: 2015-05-27 +Author: Sonny Jeon +Subject: Added X-Carve defaults. + +- Added X-Carve 500mm and 1000mm default files. + +- Tweaked all default files. Removed obsolete AUTO_START and updated +some JUNCTION_DEVIATION defaults after testing showed these needed to +be reduced slightly. + + +---------------- +Date: 2015-05-27 +Author: Sonny Jeon +Subject: Merge pull request #710 from buserror/fix-directory-case-sensitivity + +Rename Grbl to grbl + +---------------- +Date: 2015-05-27 +Author: Michel Pollet +Subject: Rename Grbl to grbl + +Otherwise compilation fails on linux, or other case sensitive systems + +Signed-off-by: Michel Pollet + + +---------------- +Date: 2015-05-26 +Author: Sonny Jeon +Subject: Updated README + + +---------------- +Date: 2015-05-26 +Author: Sonny Jeon +Subject: Merge pull request #706 from grbl/edge + +Merge edge branch. + +---------------- +Date: 2015-05-23 +Author: Sonny Jeon +Subject: CoreXY planner bug fix. + +- CoreXY motions were moving to the negative value of the intended +target. Now fixed. + + +---------------- +Date: 2015-05-23 +Author: Sonny Jeon +Subject: Moved cpu_map. + +- Moved cpu_map files to a cpu_map directory, like the defaults file +organization. + + +---------------- +Date: 2015-05-23 +Author: Sonny Jeon +Subject: Homing and limit updates. Minor bug fixes. + +- Updated new homing cycle to error out when a pull-off motion detects +the limit is still active. + +- Created a limits_get_state() function to centralize it. It reports +state as a bit-wise booleans according to axis numbering. + +- Updated the print uint8 functions. Generalized it to allow both base2 +and base10 printouts, while allowing base2 prints with N_AXIS digits +for limit state status reports. Doing this saved about 100bytes of +flash as well. + +- Applied CoreXY status reporting bug fix by @phd0. Thanks! + + +---------------- +Date: 2015-05-22 +Author: Sonny Jeon +Subject: Merge pull request #702 from ashelly/default-split + +Moving defaults to individual files in subdirectory + +---------------- +Date: 2015-05-22 +Author: ashelly +Subject: Moving defaults to individual files in subdirectory + + +---------------- +Date: 2015-05-22 +Author: Sonny Jeon +Subject: Merge pull request #700 from ashelly/header-split + +Header split + +---------------- +Date: 2015-05-22 +Author: ashelly +Subject: Fixing up comment blocks in headers + + +---------------- +Date: 2015-05-22 +Author: ashelly +Subject: Splitting Cpu map into separate files. + +Makes comparison, addition of new ones easier + + +---------------- +Date: 2015-05-17 +Author: Sonny Jeon +Subject: Critical M0/2/30 fix. Homing updates. + +- Critical fix for M0 program pause. Due to its recent change, it would +cause Grbl to suspend but wouldn’t notify the user of why Grbl was not +doing anything. The state would show IDLE and a cycle start would +resume it. Grbl now enters a HOLD state to better indicate the state +change. + +- Critical fix for M2 and M30 program end. As with M0, the state +previously would show IDLE while suspended. Grbl now does not suspend +upon program end and leaves job control to the GUI. Grbl simply reports +a `[Pgm End]` as a feedback message and resets certain g-code modes. + +- M2/30 g-code reseting fix. Previously Grbl would soft-reset after an +M2/30, but this was not complaint to the (linuxcnc) g-code standard. It +simply resets [G1,G17,G90,G94,G40,G54,M5,M9,M48] and keeps all other +modes the same. + +- M0/M2/M30 check-mode fix. It now does not suspend the machine during +check-mode. + +- Minor bug fix related to commands similar to G90.1, but not G90.1, +not reporting an unsupported command. + +- Homing cycle refactoring. To help reduce the chance of users +misunderstanding their limit switch wiring, Grbl only moves a short +distance for the locate cycles only. In addition, the homing cycle +pulls-off the limit switch by the pull-off distance to re-engage and +locate home. This should improve its accuracy. + +- HOMING_FORCE_ORIGIN now sets the origin to the pull-off location, +rather than where the limit switch was triggered. + +- Updated default junction deviation to 0.01mm. Recent tests showed +that this improves Grbl’s cornering behavior a bit. + +- Added the ShapeOko3 defaults. + +- Added new feedback message `[Pgm End]` for M2/30 notification. + +- Limit pin reporting is now a $10 status report option. Requested by +OEMs to help simplify support troubleshooting. + + +---------------- +Date: 2015-03-29 +Author: Sonny Jeon +Subject: Fix for limit pin reporting compile-option + +- The limit pin reporting wasn’t working correctly due to calling the +wrong similarly-named function. Verified to be working now. + + +---------------- +Date: 2015-03-29 +Author: Sonny Jeon +Subject: Commit history, logo license, full-arc fix. + +- Commit history added to repo, as an easier way for people to see view +the changes over time. + +- Grbl logo copyright license added. All rights reserved with regards +to the Grbl logo. + +- G2/3 full circles would sometime not execute. The problem was due to +numerical round-off of a trig calculation. Added a machine epsilon +define to help detect and correct for this problem. Tested and should +not effect general operation of arcs. + + +---------------- +Date: 2015-03-27 +Author: Sungeun Jeon +Subject: Compile-option for inverting spindle enable. + +- Installed a compile-option for inverting the spindle enable pin for +certain electronics boards users have reported needing this. + + +---------------- +Date: 2015-03-27 +Author: Sungeun Jeon +Subject: New compile options and inverse time bug fix. + +- Apparently inverse time motion were not working for quite some time. +Goes to show how many people actually use it. The calculation was bad +and is now fixed in this update. It should now work correctly. + +- `;` comment type is now supported. This is standard on LinuxCNC and +common on 3d printers. It was previously not supported due to not +existing in the NIST standard, which is out-dated. + +- New compile-option to ECHO the line received. This should help users +experiencing very weird problems and help diagnose if there is +something amiss in the communication to Grbl. + +- New compile-option to use the spindle direction pin D13 as a spindle +enable pin with PWM spindle speed on D11. This feature has been +requested often from the laser cutter community. Since spindle +direction isn’t really of much use, it seemed like good good trade. +Note that M4 spindle enable counter-clock-wise support is removed for +obvious reasons, while M3 and M5 still work. + + +---------------- +Date: 2015-03-27 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2015-03-26 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2015-03-16 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2015-03-15 +Author: Sungeun Jeon +Subject: Updated README + + +---------------- +Date: 2015-03-15 +Author: Sonny Jeon +Subject: Create README.md + +---------------- +Date: 2015-03-15 +Author: Sungeun Jeon +Subject: Merge branch 'edge' + + +---------------- +Date: 2015-03-15 +Author: Sungeun Jeon +Subject: Updated README. + +- Also altered the G38.X reporting to save some bytes. + + +---------------- +Date: 2015-03-14 +Author: Sungeun Jeon +Subject: Cleaned-up limit pin reporting and comments. + +- Cleaned up the limit pin state reporting option to display only the +state per axis, rather than the whole port. It’s organized by an XYZ +order, 0(low)-1(high), and generally looks like `Lim:001`. + +- Separated the control pin state reporting from limit state reporting +as a new compile option. This stayed the same in terms of showing the +entire port in binary, since it’s not anticipated that this will be +used much, if at all. + +- Updated some of the gcode source comments regarding supported g-codes. + + +---------------- +Date: 2015-03-07 +Author: Sonny Jeon +Subject: Another homing cycle fix. + +- The homing cycle should be working again. Reverted it back to how it +was about a month ago before I started to fiddle with it. Turns out +that my past self knew what he was doing. + + +---------------- +Date: 2015-03-04 +Author: Sonny Jeon +Subject: Arduino IDE compatibility and minor homing fixes + +- Added an include in the right spot, if a user tries to compile and +upload Grbl through the Arduino IDE with the old way. + +- Fixed a minor bug with homing max travel calculations. It was causing +simultaneous axes homing to move slow than it did before. + + +---------------- +Date: 2015-02-25 +Author: Sonny Jeon +Subject: G91.1 support. Fixed a config.h option. + +- G91.1 support added. This g-code sets the arc IJK distance mode to +incremental, which is the default already. This simply helps reduce +parsing errors with certain CAM programs that output this command. + +- Max step rate checks weren’t being compiled in if the option was +enabled. Fixed now. + +- Alarm codes were not displaying correctly when GUI reporting mode was +enabled. Due to unsigned int problem. Changed codes to positive values +since they aren’t shared with other codes. + + +---------------- +Date: 2015-02-23 +Author: Sonny Jeon +Subject: Fixed config.h to Grbl release defaults. + +- REPORT_GUI_MODE was accidentally enabled, when it shouldn’t have. + + +---------------- +Date: 2015-02-23 +Author: Sonny Jeon +Subject: New configuration options. + +- New configuration option at compile-time: + - Force alarm upon power-up or hard reset. When homing is enabled, +this is already the default behavior. This simply forces this all of +the time. + - GUI reporting mode. Removes most human-readable strings that GUIs +don’t need. This saves nearly 2KB in flash space that can be used for +other features. + - Hard limit force state check: In the hard limit pin change ISR, Grbl +by default sets the hard limit alarm upon any pin change to guarantee +the alarm is set. If this option is set, it’ll check the state within +the ISR, but can’t guarantee the pin will be read correctly if the +switch is bouncing. This option makes hard limit behavior a little less +annoying if you have a good buffered switch circuit that removes +bouncing and electronic noise. + +- Software debounce bug fix. It was reading the pin incorrectly for the +setting. + +- Re-factored some of the ‘$’ settings code. + + +---------------- +Date: 2015-02-15 +Author: Sonny Jeon +Subject: Improved homing limit search handling. + +- Instead of a single overall max travel for a search distance for the +homing limit switches. The homing cycle now applies the max travel of +each axis to the search target. Generally makes more sense this way and +saved more than a 100bytes of flash too. + + +---------------- +Date: 2015-02-15 +Author: Sonny Jeon +Subject: Homing alarm upon no switch. Licensing update. + +- Homing cycle failure reports alarm feedback when the homing cycle is +exited via a reset, interrupted by a safety door switch, or does not +find the limit switch. + +- Homing cycle bug fix when not finding the limit switch. It would just +idle before, but now will exit with an alarm. + +- Licensing update. Corrected licensing according to lawyer +recommendations. Removed references to other Grbl versions. + + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Merge pull request #593 from poelstra/fix_makefile_deps + +Fix generating header dependencies, merge with 'normal' compile, force r... + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Updated README with new logo sized for github. + + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Doc re-org. New Grbl Logos! + + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Merge pull request #591 from EliteEng/edge + +Safety Door Update for Mega2560 + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Merge pull request #592 from poelstra/fix_softlimit + +Fix EXEC_ALARM_* flags: soft limit would lead to hard limit error. + +---------------- +Date: 2015-02-13 +Author: Sonny Jeon +Subject: Merge pull request #594 from poelstra/fix_sim_build + +Fix function signature of print_uint32_base10(), necessary for compiling simulator. + +---------------- +Date: 2015-02-13 +Author: Martin Poelstra +Subject: Fix function signature of print_uint32_base10(), necessary for compiling simulator. + + +---------------- +Date: 2015-02-13 +Author: Martin Poelstra +Subject: Fix generating header dependencies, merge with 'normal' compile, force recompile when files are removed. + + +---------------- +Date: 2015-02-13 +Author: Martin Poelstra +Subject: Fix EXEC_ALARM_* flags: soft limit would lead to hard limit error. + + +---------------- +Date: 2015-02-13 +Author: Rob Brown +Subject: Safety Door Update for Mega2560 + + +---------------- +Date: 2015-02-11 +Author: Sonny Jeon +Subject: Overhauled state machine. New safety door feature. + +- Overhauled the state machine and cleaned up its overall operation. +This involved creating a new ‘suspend’ state for what all external +commands, except real-time commands, are ignored. All hold type states +enter this suspend state. + +- Removed ‘auto cycle start’ setting from Grbl. This was not used by +users in its intended way and is somewhat redundant, as GUI manage the +cycle start by streaming. It also muddled up how Grbl should interpret +how and when to execute a g-code block. Removing it made everything +much much simpler. + +- Fixed a program pause bug when used with other buffer_sync commands. + +- New safety door feature for OEMs. Immediately forces a feed hold and +then de-energizes the machine. Resuming is blocked until the door is +closed. When it is, it re-energizes the system and then resumes on the +normal toolpath. + +- Safety door input pin is optional and uses the feed hold pin on A1. +Enabled by config.h define. + +- Spindle and coolant re-energizing upon a safety door resume has a +programmable delay time to allow for complete spin up to rpm and +turning on the coolant before resuming motion. + +- Safety door-style feed holds can be used instead of regular feed hold +(doesn’t de-energize the machine) with a ‘@‘ character. If the safety +door input pin is not enabled, the system can be resumed at any time. + + +---------------- +Date: 2015-02-10 +Author: Sonny Jeon +Subject: Git fix for empty directory. Makefile updated. + +- ‘build’ directory was not being synced by git because it was empty. +Added a .gitignore file in the ‘build’ directory to force git to sync +it but keep it empty. + +- Updated the Makefile to not erase the .gitignore. + + +---------------- +Date: 2015-02-10 +Author: Sonny Jeon +Subject: File re-organization. New Makefile. + +- Re-organized source code files into a ‘grbl’ directory to lessen one +step in compiling Grbl through the Arduino IDE. + +- Added an ‘examples’ directory with an upload .INO sketch to further +simplify compiling and uploading Grbl via the Arduino IDE. + +- Updated the Makefile with regard to the source code no longer being +in the root directory. All files generated by compiling is placed in a +separate ‘build’ directory to keep things tidy. The makefile should +operate in the same way as it did before. + + +---------------- +Date: 2015-02-10 +Author: Sonny Jeon +Subject: Bug fix for certain motions. Re-org of includes. + +- Critical bug fix for diagonal motions that continue on the same +direction or return in the exact opposite direction. This issue could +cause Grbl to crash intermittently due to a numerical round-off error. +Grbl versions prior to v0.9g shouldn’t have this issue. + +- Reorganized all of the includes used by Grbl. Centralized it into a +single “grbl.h” include. This will help simplify the compiling and +uploading process through the Arduino IDE. + +- Added an example .INO file for users to simply open and run when +compiling and uploading through the IDE. More to come later. + + +---------------- +Date: 2015-02-06 +Author: Sonny Jeon +Subject: Limit/control pin state reporting option + +- As a setup feature, users can compile-in input pin status reporting. +Doesn’t do anything special, just prints the binary for the port. 0’s +and 1’s indicate low and high signals on the pins. It’s a bit cryptic +right now, but it’s just a start. + +- Added a max step rate check when writing step/mm and max rate +settings. Should help avoid people misdiagnosing problems associated +with going over the 30kHz step rate limit. Right now not enabled. Takes +up over 100k of flash. Need that room for other things right now. + + +---------------- +Date: 2015-02-04 +Author: Sonny Jeon +Subject: Rare planner bug fix and added simulator defaults. + +- Planner bug when moving along a diagonal back and forth on the same +path. Rare for the fact that most CAM programs don’t program this type +of motion, neither does jogging. Fixed in this update. + +- Added grbl_sim defaults for testing purposes. + + +---------------- +Date: 2015-01-17 +Author: Sonny Jeon +Subject: Fully configurable pins for NO or NC switches. + +- All pins, which include limits, control command, and probe pins, can +now all be configured to trigger as active-low or active-high and +whether the pin has its internal pull-up resistor enabled. This should +allow for just about all types of NO and NC switch configurations. + +- The probe pin invert setting hasn’t been added to the Grbl settings, +like the others, and will have to wait until v1.0. But for now, it’s +available as a compile-time option in config.h. + +- Fixed a variable spindle bug. + + +---------------- +Date: 2015-01-14 +Author: Sonny Jeon +Subject: Lot of refactoring for the future. CoreXY support. + +- Rudimentary CoreXY kinematics support. Didn’t test, but homing and +feed holds should work. See config.h. Please report successes and +issues as we find bugs. + +- G40 (disable cutter comp) is now “supported”. Meaning that Grbl will +no longer issue an error when typically sent in g-code program header. + +- Refactored coolant and spindle state setting into separate functions +for future features. + +- Configuration option for fixing homing behavior when there are two +limit switches on the same axis sharing an input pin. + +- Created a new “grbl.h” that will eventually be used as the main +include file for Grbl. Also will help simply uploading through the +Arduino IDE + +- Separated out the alarms execution flags from the realtime (used be +called runtime) execution flag variable. Now reports exactly what +caused the alarm. Expandable for new alarms later on. + +- Refactored the homing cycle to support CoreXY. + +- Applied @EliteEng updates to Mega2560 support. Some pins were +reconfigured. + +- Created a central step to position and vice versa function. Needed +for non-traditional cartesian machines. Should make it easier later. + +- Removed the new CPU map for the Uno. No longer going to used. There +will be only one configuration to keep things uniform. + + +---------------- +Date: 2014-11-05 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-10-29 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-10-28 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-10-28 +Author: Sonny Jeon +Subject: Update README.md + +---------------- +Date: 2014-10-01 +Author: Sonny Jeon +Subject: Updated variable spindle and new probing. Minor bug fixes. + +- Minor bug fix for variable spindle PWM output. Values smaller than +the minimum RPM for the spindle would overflow the PWM value. Thanks +Rob! + +- Created an optional minimum spindle PWM low-mark value as a +compile-time option. This is for special circumstances when the PWM has +to be at a certain level to be read by the spindle controller. + +- Refactored the new probing commands (G38.3, G38.4, G38.5) code to +work better with the rest of Grbl’s systems. + +- Refactored mc_probe() and mc_arc() to accept the mode of the command, +i.e. clockwise vs counter, toward vs away, etc. This is to make these +functions independent of gcode state variables. + +- Removed the pull off motion in the probing cycle. This is not an +official operation and was added for user simplicity, but wrongly did +so. So bye bye. + +- Created a configure probe invert mask function to handle the +different probe pin setting and probing cycle modes with a single mask. + + - Minor bug fix with reporting motion modes via $G. G38.2 wasn’t +showing up. It now does, along with the other new probing commands. + +- Refactored some of the new pin configurations for the future of Grbl. + +- + + +---------------- +Date: 2014-09-25 +Author: Sonny Jeon +Subject: Merge pull request #491 from tmpvar/G38.2+ + +G38.2+ + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: report probe_succeeded with probe status + + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: add probe_finalize to keep things DRY + +this allows the PRB report to be valid when in "no errors" mode and the probe fails + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: hop over probe pull-off sequence after probe miss + +and while "no errors" is enabled (G38.3, G38.5) + + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: add/install probe_errors_enabled in mc_probe_cycle + + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: bump mantissa to uint16_t to enable G38.5 + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: test only for & PROBE_ACTIVE + + +---------------- +Date: 2014-09-22 +Author: Elijah Insua +Subject: cleanup global var and push probe mode into probe_get_state + + +---------------- +Date: 2014-09-20 +Author: Sonny Jeon +Subject: Edit hard limit check at start of homing cycle + + +---------------- +Date: 2014-09-20 +Author: Sonny Jeon +Subject: Merge pull request #494 from ashelly/homing-alarm + +Alarm if limits engaged on homing start. + +---------------- +Date: 2014-09-20 +Author: Sonny Jeon +Subject: Merge pull request #493 from alpharesearch/edge + +If variable spindle is defined print S value via $G command. + +---------------- +Date: 2014-09-20 +Author: Sonny Jeon +Subject: Minor settings number overflow bug fix. + +- The `x` in `$x=val` would overflow when a value larger than 255 was +entered and passed to Grbl. This resulted with unintended parameters +being set by the overflow value. To fix, simply check for values larger +than 255 and error out. + + +---------------- +Date: 2014-09-17 +Author: ashelly +Subject: No false alarm if other bits in port are set. + +---------------- +Date: 2014-09-17 +Author: Markus Schulz +Subject: If variable spindle is defined print S value via $G command. + + +---------------- +Date: 2014-09-14 +Author: Elijah Insua +Subject: utilize MOTION_MODE_PROBE_NO_ERROR + + +---------------- +Date: 2014-09-14 +Author: Elijah Insua +Subject: install G38.{3,4,5} + + +---------------- +Date: 2014-09-14 +Author: Elijah Insua +Subject: add MOTION_MODE_PROBE_NO_ERROR + + +---------------- +Date: 2014-09-08 +Author: ashelly +Subject: Alarm if limits engaged on homing + diff --git a/doc/media/COPYING b/doc/media/COPYING new file mode 100644 index 000000000..ee26e1938 --- /dev/null +++ b/doc/media/COPYING @@ -0,0 +1,2 @@ + +Copyright (c) 2015 Gnea Research LLC. All Rights Reserved. diff --git a/doc/media/Grbl Logo 150px.png b/doc/media/Grbl Logo 150px.png new file mode 100644 index 000000000..999886e6c Binary files /dev/null and b/doc/media/Grbl Logo 150px.png differ diff --git a/doc/media/Grbl Logo 250px.png b/doc/media/Grbl Logo 250px.png new file mode 100644 index 000000000..bc9319b3d Binary files /dev/null and b/doc/media/Grbl Logo 250px.png differ diff --git a/doc/media/Grbl Logo 320px.png b/doc/media/Grbl Logo 320px.png new file mode 100644 index 000000000..0a2f2017d Binary files /dev/null and b/doc/media/Grbl Logo 320px.png differ diff --git a/doc/media/Grbl Logo 640px.png b/doc/media/Grbl Logo 640px.png new file mode 100644 index 000000000..96a386a11 Binary files /dev/null and b/doc/media/Grbl Logo 640px.png differ diff --git a/doc/media/Grbl Logo.pdf b/doc/media/Grbl Logo.pdf new file mode 100644 index 000000000..99a83ce5c Binary files /dev/null and b/doc/media/Grbl Logo.pdf differ diff --git a/doc/media/Grbl Logo.svg b/doc/media/Grbl Logo.svg new file mode 100644 index 000000000..df083ebfe --- /dev/null +++ b/doc/media/Grbl Logo.svg @@ -0,0 +1,134 @@ + + + + + + image/svg+xml + + + + + + + /Users/chamnit/Dropbox/documents/OHS/Logo/Grbl.DXF - scale = 58.043118, origin = (0.000000, 0.000000), auto = True + + + + + + + + + + + + + + + + + + + + + + + diff --git a/script/simple_stream.py b/doc/script/simple_stream.py similarity index 100% rename from script/simple_stream.py rename to doc/script/simple_stream.py diff --git a/script/stream.py b/doc/script/stream.py similarity index 100% rename from script/stream.py rename to doc/script/stream.py diff --git a/eeprom.h b/eeprom.h deleted file mode 100644 index 0743425a8..000000000 --- a/eeprom.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - eeprom.h - EEPROM methods - Part of Grbl - - The MIT License (MIT) - - GRBL(tm) - Embedded CNC g-code interpreter and motion-controller - Copyright (c) 2009-2011 Simen Svale Skogsrud - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -*/ - -#ifndef eeprom_h -#define eeprom_h - -unsigned char eeprom_get_char(unsigned int addr); -void eeprom_put_char(unsigned int addr, unsigned char new_value); -void memcpy_to_eeprom_with_checksum(unsigned int destination, char *source, unsigned int size); -int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size); - -#endif diff --git a/config.h b/grbl/config.h similarity index 55% rename from config.h rename to grbl/config.h index 728dd02f1..cb3635021 100644 --- a/config.h +++ b/grbl/config.h @@ -1,8 +1,9 @@ /* config.h - compile time configuration - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2013-2014 Sungeun K. Jeon + Copyright (c) 2012-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,13 +18,7 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2013 Sungeun K. Jeon -*/ - + // This file contains compile-time configurations for Grbl's internal system. For the most part, // users will not need to directly modify these, but they are here for specific needs, i.e. // performance tuning or adjusting to non-typical machines. @@ -32,7 +27,7 @@ #ifndef config_h #define config_h -#include "system.h" +#include "grbl.h" // For Arduino IDE compatibility. // Default settings. Used when resetting EEPROM. Change to desired name in defaults.h @@ -43,18 +38,20 @@ // Default cpu mappings. Grbl officially supports the Arduino Uno only. Other processor types // may exist from user-supplied templates or directly user-defined in cpu_map.h -#define CPU_MAP_ATMEGA2560_GSHIELD // Arduino Uno CPU +#define CPU_MAP_ATMEGA2560_RAMPS // mega 2560 and ramps (or azteegpro) +//#define CPU_MAP_ATMEGA328P // Arduino Uno CPU -// Define runtime command special characters. These characters are 'picked-off' directly from the +// Define realtime command special characters. These characters are 'picked-off' directly from the // serial read data stream and are not passed to the grbl line execution parser. Select characters -// that do not and must not exist in the streamed g-code program. ASCII control characters may be -// used, if they are available per user setup. Also, extended ASCII codes (>127), which are never in +// that do not and must not exist in the streamed g-code program. ASCII control characters may be +// used, if they are available per user setup. Also, extended ASCII codes (>127), which are never in // g-code programs, maybe selected for interface programs. // NOTE: If changed, manually update help message in report.c. #define CMD_STATUS_REPORT '?' #define CMD_FEED_HOLD '!' #define CMD_CYCLE_START '~' #define CMD_RESET 0x18 // ctrl-x. +#define CMD_SAFETY_DOOR '@' // If homing is enabled, homing init lock sets Grbl into an alarm state upon power up. This forces // the user to perform the homing cycle (or override the locks) before doing anything else. This is @@ -63,17 +60,17 @@ // Define the homing cycle patterns with bitmasks. The homing cycle first performs a search mode // to quickly engage the limit switches, followed by a slower locate mode, and finished by a short -// pull-off motion to disengage the limit switches. The following HOMING_CYCLE_x defines are executed +// pull-off motion to disengage the limit switches. The following HOMING_CYCLE_x defines are executed // in order starting with suffix 0 and completes the homing routine for the specified-axes only. If // an axis is omitted from the defines, it will not home, nor will the system update its position. // Meaning that this allows for users with non-standard cartesian machines, such as a lathe (x then z, -// with no y), to configure the homing cycle behavior to their needs. +// with no y), to configure the homing cycle behavior to their needs. // NOTE: The homing cycle is designed to allow sharing of limit pins, if the axes are not in the same // cycle, but this requires some pin settings changes in cpu_map.h file. For example, the default homing // cycle can share the Z limit pin with either X or Y limit pins, since they are on different cycles. // By sharing a pin, this frees up a precious IO pin for other purposes. In theory, all axes limit pins // may be reduced to one pin, if all axes are homed with seperate cycles, or vice versa, all three axes -// on separate pin, but homed in one cycle. Also, it should be noted that the function of hard limits +// on separate pin, but homed in one cycle. Also, it should be noted that the function of hard limits // will not be affected by pin sharing. // NOTE: Defaults are set for a traditional 3-axis CNC machine. Z-axis first to clear, followed by X & Y. #define HOMING_CYCLE_0 (1< 3us, and, when added with the // user-supplied step pulse time, the total time must not exceed 127us. Reported successful @@ -202,69 +321,84 @@ // #define STEP_PULSE_DELAY 10 // Step pulse delay in microseconds. Default disabled. // The number of linear motions in the planner buffer to be planned at any give time. The vast -// majority of RAM that Grbl uses is based on this buffer size. Only increase if there is extra +// majority of RAM that Grbl uses is based on this buffer size. Only increase if there is extra // available RAM, like when re-compiling for a Mega or Sanguino. Or decrease if the Arduino // begins to crash due to the lack of available RAM or if the CPU is having trouble keeping -// up with planning new incoming motions as they are executed. +// up with planning new incoming motions as they are executed. // #define BLOCK_BUFFER_SIZE 18 // Uncomment to override default in planner.h. // Governs the size of the intermediary step segment buffer between the step execution algorithm // and the planner blocks. Each segment is set of steps executed at a constant velocity over a // fixed time defined by ACCELERATION_TICKS_PER_SECOND. They are computed such that the planner -// block velocity profile is traced exactly. The size of this buffer governs how much step -// execution lead time there is for other Grbl processes have to compute and do their thing +// block velocity profile is traced exactly. The size of this buffer governs how much step +// execution lead time there is for other Grbl processes have to compute and do their thing // before having to come back and refill this buffer, currently at ~50msec of step moves. // #define SEGMENT_BUFFER_SIZE 6 // Uncomment to override default in stepper.h. -// Line buffer size from the serial input stream to be executed. Also, governs the size of +// Line buffer size from the serial input stream to be executed. Also, governs the size of // each of the startup blocks, as they are each stored as a string of this size. Make sure // to account for the available EEPROM at the defined memory address in settings.h and for // the number of desired startup blocks. -// NOTE: 80 characters is not a problem except for extreme cases, but the line buffer size -// can be too small and g-code blocks can get truncated. Officially, the g-code standards -// support up to 256 characters. In future versions, this default will be increased, when +// NOTE: 80 characters is not a problem except for extreme cases, but the line buffer size +// can be too small and g-code blocks can get truncated. Officially, the g-code standards +// support up to 256 characters. In future versions, this default will be increased, when // we know how much extra memory space we can re-invest into this. // #define LINE_BUFFER_SIZE 80 // Uncomment to override default in protocol.h - + // Serial send and receive buffer size. The receive buffer is often used as another streaming // buffer to store incoming blocks to be processed by Grbl when its ready. Most streaming -// interfaces will character count and track each block send to each block response. So, +// interfaces will character count and track each block send to each block response. So, // increase the receive buffer if a deeper receive buffer is needed for streaming and avaiable // memory allows. The send buffer primarily handles messages in Grbl. Only increase if large // messages are sent and Grbl begins to stall, waiting to send the rest of the message. // NOTE: Buffer size values must be greater than zero and less than 256. // #define RX_BUFFER_SIZE 128 // Uncomment to override defaults in serial.h // #define TX_BUFFER_SIZE 64 - + // Toggles XON/XOFF software flow control for serial communications. Not officially supported // due to problems involving the Atmega8U2 USB-to-serial chips on current Arduinos. The firmware -// on these chips do not support XON/XOFF flow control characters and the intermediate buffer -// in the chips cause latency and overflow problems with standard terminal programs. However, +// on these chips do not support XON/XOFF flow control characters and the intermediate buffer +// in the chips cause latency and overflow problems with standard terminal programs. However, // using specifically-programmed UI's to manage this latency problem has been confirmed to work. // As well as, older FTDI FT232RL-based Arduinos(Duemilanove) are known to work with standard // terminal programs since their firmware correctly manage these XON/XOFF characters. In any // case, please report any successes to grbl administrators! // #define ENABLE_XONXOFF // Default disabled. Uncomment to enable. -// A simple software debouncing feature for hard limit switches. When enabled, the interrupt -// monitoring the hard limit switch pins will enable the Arduino's watchdog timer to re-check -// the limit pin state after a delay of about 32msec. This can help with CNC machines with -// problematic false triggering of their hard limit switches, but it WILL NOT fix issues with +// A simple software debouncing feature for hard limit switches. When enabled, the interrupt +// monitoring the hard limit switch pins will enable the Arduino's watchdog timer to re-check +// the limit pin state after a delay of about 32msec. This can help with CNC machines with +// problematic false triggering of their hard limit switches, but it WILL NOT fix issues with // electrical interference on the signal cables from external sources. It's recommended to first -// use shielded signal cables with their shielding connected to ground (old USB/computer cables +// use shielded signal cables with their shielding connected to ground (old USB/computer cables // work well and are cheap to find) and wire in a low-pass circuit into each limit pin. // #define ENABLE_SOFTWARE_DEBOUNCE // Default disabled. Uncomment to enable. -// --------------------------------------------------------------------------------------- +// Force Grbl to check the state of the hard limit switches when the processor detects a pin +// change inside the hard limit ISR routine. By default, Grbl will trigger the hard limits +// alarm upon any pin change, since bouncing switches can cause a state check like this to +// misread the pin. When hard limits are triggered, they should be 100% reliable, which is the +// reason that this option is disabled by default. Only if your system/electronics can guarantee +// that the switches don't bounce, we recommend enabling this option. This will help prevent +// triggering a hard limit when the machine disengages from the switch. +// NOTE: This option has no effect if SOFTWARE_DEBOUNCE is enabled. +// #define HARD_LIMIT_FORCE_STATE_CHECK // Default disabled. Uncomment to enable. -// TODO: Install compile-time option to send numeric status codes rather than strings. // --------------------------------------------------------------------------------------- // COMPILE-TIME ERROR CHECKING OF DEFINE VALUES: -// #if (ISR_TICKS_PER_ACCELERATION_TICK > 255) -// #error Parameters ACCELERATION_TICKS / ISR_TICKS must be < 256 to prevent integer overflow. -// #endif +#ifndef HOMING_CYCLE_0 + #error "Required HOMING_CYCLE_0 not defined." +#endif + +#if defined(USE_SPINDLE_DIR_AS_ENABLE_PIN) && !defined(VARIABLE_SPINDLE) + #error "USE_SPINDLE_DIR_AS_ENABLE_PIN may only be used with VARIABLE_SPINDLE enabled" +#endif + +#if defined(USE_SPINDLE_DIR_AS_ENABLE_PIN) && !defined(CPU_MAP_ATMEGA328P) + #error "USE_SPINDLE_DIR_AS_ENABLE_PIN may only be used with a 328p processor" +#endif // --------------------------------------------------------------------------------------- diff --git a/coolant_control.c b/grbl/coolant_control.c similarity index 85% rename from coolant_control.c rename to grbl/coolant_control.c index 9f629ce8c..4429dd4f2 100644 --- a/coolant_control.c +++ b/grbl/coolant_control.c @@ -1,8 +1,8 @@ /* coolant_control.c - coolant control methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2012-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,10 +18,7 @@ along with Grbl. If not, see . */ -#include "system.h" -#include "coolant_control.h" -#include "protocol.h" -#include "gcode.h" +#include "grbl.h" void coolant_init() @@ -43,12 +40,8 @@ void coolant_stop() } -void coolant_run(uint8_t mode) +void coolant_set_state(uint8_t mode) { - if (sys.state == STATE_CHECK_MODE) { return; } - - protocol_auto_cycle_start(); //temp fix for M8 lockup - protocol_buffer_synchronize(); // Ensure coolant turns on when specified in program. if (mode == COOLANT_FLOOD_ENABLE) { COOLANT_FLOOD_PORT |= (1 << COOLANT_FLOOD_BIT); @@ -61,3 +54,11 @@ void coolant_run(uint8_t mode) coolant_stop(); } } + + +void coolant_run(uint8_t mode) +{ + if (sys.state == STATE_CHECK_MODE) { return; } + protocol_buffer_synchronize(); // Ensure coolant turns on when specified in program. + coolant_set_state(mode); +} diff --git a/coolant_control.h b/grbl/coolant_control.h similarity index 89% rename from coolant_control.h rename to grbl/coolant_control.h index db3c71cd8..7694a78d9 100644 --- a/coolant_control.h +++ b/grbl/coolant_control.h @@ -1,8 +1,8 @@ /* coolant_control.h - spindle control methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2012-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ void coolant_init(); void coolant_stop(); +void coolant_set_state(uint8_t mode); void coolant_run(uint8_t mode); #endif \ No newline at end of file diff --git a/grbl/cpu_map.h b/grbl/cpu_map.h new file mode 100644 index 000000000..c5a86f341 --- /dev/null +++ b/grbl/cpu_map.h @@ -0,0 +1,52 @@ +/* + cpu_map.h - CPU and pin mapping configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The cpu_map.h files serve as a central pin mapping selection file for different processor + types, i.e. AVR 328p or AVR Mega 2560. Each processor has its own pin mapping file. + (i.e. cpu_map_atmega328p.h) Grbl officially supports the Arduino Uno, but the + other supplied pin mappings are supplied by users, so your results may vary. */ + +// NOTE: With new processors, only add the define name and filename to use. + +#ifndef cpu_map_h +#define cpu_map_h + + +#ifdef CPU_MAP_ATMEGA328P // (Arduino Uno) Officially supported by Grbl. + #include "cpu_map/cpu_map_atmega328p.h" +#endif + +#ifdef CPU_MAP_ATMEGA2560 // (Arduino Mega 2560) Working @EliteEng + #include "cpu_map/cpu_map_atmega2560.h" +#endif + +#ifdef CPU_MAP_ATMEGA2560_RAMPS // (Arduino Mega 2560 RAMPS) Working @wolfmanjm + #include "cpu_map/cpu_map_atmega2560_RAMPS.h" +#endif + +/* +#ifdef CPU_MAP_CUSTOM_PROC + // For a custom pin map or different processor, copy and edit one of the available cpu + // map files and modify it to your needs. Make sure the defined name is also changed in + // the config.h file. +#endif +*/ + +#endif diff --git a/grbl/cpu_map/cpu_map_atmega2560.h b/grbl/cpu_map/cpu_map_atmega2560.h new file mode 100644 index 000000000..0287f4417 --- /dev/null +++ b/grbl/cpu_map/cpu_map_atmega2560.h @@ -0,0 +1,138 @@ +/* + cpu_map_atmega2560.h - CPU and pin mapping configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* This cpu_map file serves as a central pin mapping settings file for AVR Mega 2560 */ + + +#ifdef GRBL_PLATFORM +#error "cpu_map already defined: GRBL_PLATFORM=" GRBL_PLATFORM +#endif + + +#define GRBL_PLATFORM "Atmega2560" + +// Serial port pins +#define SERIAL_RX USART0_RX_vect +#define SERIAL_UDRE USART0_UDRE_vect + +// Increase Buffers to make use of extra SRAM +//#define RX_BUFFER_SIZE 256 +//#define TX_BUFFER_SIZE 128 +//#define BLOCK_BUFFER_SIZE 36 +//#define LINE_BUFFER_SIZE 100 + +// Define step pulse output pins. NOTE: All step bit pins must be on the same port. +#define STEP_DDR DDRA +#define STEP_PORT PORTA +#define STEP_PIN PINA +#define X_STEP_BIT 2 // MEGA2560 Digital Pin 24 +#define Y_STEP_BIT 3 // MEGA2560 Digital Pin 25 +#define Z_STEP_BIT 4 // MEGA2560 Digital Pin 26 +#define STEP_MASK ((1<. +*/ + +/* This cpu_map file serves as a central pin mapping settings file for AVR Mega 2560 */ + + +#ifdef GRBL_PLATFORM +#error "cpu_map already defined: GRBL_PLATFORM=" GRBL_PLATFORM +#endif + + +#define GRBL_PLATFORM "Atmega2560" + + // Serial port pins +#define SERIAL_RX USART0_RX_vect +#define SERIAL_UDRE USART0_UDRE_vect + + // Increase Buffers to make use of extra SRAM +#define RX_BUFFER_SIZE 256 +#define TX_BUFFER_SIZE 128 + + // Define step pulse output pins. +#define X_STEP_DDR DDRF +#define X_STEP_PORT PORTF +#define X_STEP_PIN PINF +#define X_STEP_BIT 0 // MEGA2560 A0 + +#define Y_STEP_DDR DDRF +#define Y_STEP_PORT PORTF +#define Y_STEP_PIN PINF +#define Y_STEP_BIT 6 // MEGA2560 A6 + +#define Z_STEP_DDR DDRL +#define Z_STEP_PORT PORTL +#define Z_STEP_PIN PINL +#define Z_STEP_BIT 3 // MEGA2560 Digital Pin 46 + + + // Define step direction output pins. +#define X_DIRECTION_DDR DDRF +#define X_DIRECTION_PORT PORTF +#define X_DIRECTION_PIN PINF +#define X_DIRECTION_BIT 1 // MEGA2560 A1 + +#define Y_DIRECTION_DDR DDRF +#define Y_DIRECTION_PORT PORTF +#define Y_DIRECTION_PIN PINF +#define Y_DIRECTION_BIT 7 // MEGA2560 A7 + +#define Z_DIRECTION_DDR DDRL +#define Z_DIRECTION_PORT PORTL +#define Z_DIRECTION_PIN PINL +#define Z_DIRECTION_BIT 1 // MEGA2560 Digital Pin 48 + + // Define stepper driver enable/disable output pin. +#define X_STEPPERS_DISABLE_DDR DDRD +#define X_STEPPERS_DISABLE_PORT PORTD +#define X_STEPPERS_DISABLE_BIT 7 // MEGA2560 Digital Pin 38 +#define X_STEPPERS_DISABLE_MASK (1<. +*/ + +/* Grbl officially supports the Arduino Uno, but the other supplied pin mappings are + supplied by users, so your results may vary. This cpu_map file serves as a central + pin mapping settings file for AVR 328p used on the Arduino Uno. */ + +#ifdef GRBL_PLATFORM +#error "cpu_map already defined: GRBL_PLATFORM=" GRBL_PLATFORM +#endif + + +#define GRBL_PLATFORM "Atmega328p" + +// Define serial port pins and interrupt vectors. +#define SERIAL_RX USART_RX_vect +#define SERIAL_UDRE USART_UDRE_vect + +// Define step pulse output pins. NOTE: All step bit pins must be on the same port. +#define STEP_DDR DDRD +#define STEP_PORT PORTD +#define X_STEP_BIT 2 // Uno Digital Pin 2 +#define Y_STEP_BIT 3 // Uno Digital Pin 3 +#define Z_STEP_BIT 4 // Uno Digital Pin 4 +#define STEP_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings selector for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + files listed here are supplied by users, so your results may vary. However, this should + give you a good starting point as you get to know your machine and tweak the settings for + your nefarious needs. + Ensure one and only one of these DEFAULTS_XXX values is defined in config.h */ + +#ifndef defaults_h + +// Only define the DEFAULT_XXX with where to find the corresponding default_XXX.h file. +// Don't #define defaults_h here, let the selected file do it. Prevents including more than one. + +#ifdef DEFAULTS_GENERIC + // Grbl generic default settings. Should work across different machines. + #include "defaults/defaults_generic.h" +#endif + +#ifdef DEFAULTS_SHERLINE_5400 + // Description: Sherline 5400 mill with three NEMA 23 Keling KL23H256-21-8B 185 oz-in stepper motors, + // driven by three Pololu A4988 stepper drivers with a 30V, 6A power supply at 1.5A per winding. + #include "defaults/defaults_sherline.h" +#endif + +#ifdef DEFAULTS_SHAPEOKO + // Description: Shapeoko CNC mill with three NEMA 17 stepper motors, driven by Synthetos + // grblShield with a 24V, 4.2A power supply. + #include "defaults/defaults_shapeoko.h" +#endif + +#ifdef DEFAULTS_SHAPEOKO_2 + // Description: Shapeoko CNC mill with three NEMA 17 stepper motors, driven by Synthetos + // grblShield at 28V. + #include "defaults/defaults_shapeoko2.h" +#endif + +#ifdef DEFAULTS_SHAPEOKO_3 + // Description: Shapeoko CNC mill with three NEMA 23 stepper motors, driven by CarbideMotion + #include "defaults/defaults_shapeoko3.h" +#endif + +#ifdef DEFAULTS_X_CARVE_500MM + // Description: X-Carve 3D Carver CNC mill with three 200 step/rev motors driven by Synthetos + // grblShield at 24V. + #include "defaults/defaults_x_carve_500mm.h" +#endif + +#ifdef DEFAULTS_X_CARVE_1000MM + // Description: X-Carve 3D Carver CNC mill with three 200 step/rev motors driven by Synthetos + // grblShield at 24V. + #include "defaults/defaults_x_carve_1000mm.h" +#endif + +#ifdef DEFAULTS_ZEN_TOOLWORKS_7x7 + // Description: Zen Toolworks 7x7 mill with three Shinano SST43D2121 65oz-in NEMA 17 stepper motors. + // Leadscrew is different from some ZTW kits, where most are 1.25mm/rev rather than 8.0mm/rev here. + // Driven by 30V, 6A power supply and TI DRV8811 stepper motor drivers. + #include "defaults/defaults_zen_toolworks_7x7.h" +#endif + +#ifdef DEFAULTS_OXCNC + // Grbl settings for OpenBuilds OX CNC Machine + // http://www.openbuilds.com/builds/openbuilds-ox-cnc-machine.341/ + #include "defaults/defaults_oxcnc.h" +#endif + +#ifdef DEFAULTS_SIMULATOR + // Settings only for Grbl Simulator (www.github.com/grbl/grbl-sim) + #include "defaults/defaults_simulator.h" +#endif + +#endif diff --git a/grbl/defaults/defaults_generic.h b/grbl/defaults/defaults_generic.h new file mode 100644 index 000000000..b5cf00b32 --- /dev/null +++ b/grbl/defaults/defaults_generic.h @@ -0,0 +1,62 @@ +/* + defaults_generic.h - defaults settings configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Grbl generic default settings. Should work across different machines. + #define DEFAULT_X_STEPS_PER_MM 250.0 + #define DEFAULT_Y_STEPS_PER_MM 250.0 + #define DEFAULT_Z_STEPS_PER_MM 250.0 + #define DEFAULT_X_MAX_RATE 500.0 // mm/min + #define DEFAULT_Y_MAX_RATE 500.0 // mm/min + #define DEFAULT_Z_MAX_RATE 500.0 // mm/min + #define DEFAULT_X_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 200.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 200.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 200.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK 0 + #define DEFAULT_STEPPER_IDLE_LOCK_TIME 25 // msec (0-254, 255 keeps steppers enabled) + #define DEFAULT_STATUS_REPORT_MASK ((BITFLAG_RT_STATUS_MACHINE_POSITION)|(BITFLAG_RT_STATUS_WORK_POSITION)) + #define DEFAULT_JUNCTION_DEVIATION 0.01 // mm + #define DEFAULT_ARC_TOLERANCE 0.002 // mm + #define DEFAULT_REPORT_INCHES 0 // false + #define DEFAULT_INVERT_ST_ENABLE 0 // false + #define DEFAULT_INVERT_LIMIT_PINS 0 // false + #define DEFAULT_SOFT_LIMIT_ENABLE 0 // false + #define DEFAULT_HARD_LIMIT_ENABLE 0 // false + #define DEFAULT_HOMING_ENABLE 0 // false + #define DEFAULT_HOMING_DIR_MASK 0 // move positive dir + #define DEFAULT_HOMING_FEED_RATE 25.0 // mm/min + #define DEFAULT_HOMING_SEEK_RATE 500.0 // mm/min + #define DEFAULT_HOMING_DEBOUNCE_DELAY 250 // msec (0-65k) + #define DEFAULT_HOMING_PULLOFF 1.0 // mm + +#endif diff --git a/grbl/defaults/defaults_oxcnc.h b/grbl/defaults/defaults_oxcnc.h new file mode 100644 index 000000000..1c89ab8af --- /dev/null +++ b/grbl/defaults/defaults_oxcnc.h @@ -0,0 +1,63 @@ +/* + defaults_oxcnc.h - defaults settings configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Grbl settings for OpenBuilds OX CNC Machine + // http://www.openbuilds.com/builds/openbuilds-ox-cnc-machine.341/ + #define DEFAULT_X_STEPS_PER_MM 26.670 + #define DEFAULT_Y_STEPS_PER_MM 26.670 + #define DEFAULT_Z_STEPS_PER_MM 50 + #define DEFAULT_X_MAX_RATE 500.0 // mm/min + #define DEFAULT_Y_MAX_RATE 500.0 // mm/min + #define DEFAULT_Z_MAX_RATE 500.0 // mm/min + #define DEFAULT_X_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (10.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 500.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 750.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 80.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK 0 + #define DEFAULT_STEPPER_IDLE_LOCK_TIME 25 // msec (0-254, 255 keeps steppers enabled) + #define DEFAULT_STATUS_REPORT_MASK ((BITFLAG_RT_STATUS_MACHINE_POSITION)|(BITFLAG_RT_STATUS_WORK_POSITION)) + #define DEFAULT_JUNCTION_DEVIATION 0.02 // mm + #define DEFAULT_ARC_TOLERANCE 0.002 // mm + #define DEFAULT_REPORT_INCHES 0 // false + #define DEFAULT_INVERT_ST_ENABLE 0 // false + #define DEFAULT_INVERT_LIMIT_PINS 0 // false + #define DEFAULT_SOFT_LIMIT_ENABLE 0 // false + #define DEFAULT_HARD_LIMIT_ENABLE 0 // false + #define DEFAULT_HOMING_ENABLE 0 // false + #define DEFAULT_HOMING_DIR_MASK 0 // move positive dir + #define DEFAULT_HOMING_FEED_RATE 25.0 // mm/min + #define DEFAULT_HOMING_SEEK_RATE 500.0 // mm/min + #define DEFAULT_HOMING_DEBOUNCE_DELAY 250 // msec (0-65k) + #define DEFAULT_HOMING_PULLOFF 1.0 // mm + +#endif diff --git a/grbl/defaults/defaults_shapeoko.h b/grbl/defaults/defaults_shapeoko.h new file mode 100644 index 000000000..46346ea39 --- /dev/null +++ b/grbl/defaults/defaults_shapeoko.h @@ -0,0 +1,70 @@ +/* + defaults_shapeoko.h - defaults settings configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + + // Description: Shapeoko CNC mill with three NEMA 17 stepper motors, driven by Synthetos + // grblShield with a 24V, 4.2A power supply. + #define MICROSTEPS_XY 8 + #define STEP_REVS_XY 400 + #define MM_PER_REV_XY (0.08*18*MM_PER_INCH) // 0.08 in belt pitch, 18 pulley teeth + #define MICROSTEPS_Z 2 + #define STEP_REVS_Z 400 + #define MM_PER_REV_Z 1.250 // 1.25 mm/rev leadscrew + #define DEFAULT_X_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Y_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Z_STEPS_PER_MM (MICROSTEPS_Z*STEP_REVS_Z/MM_PER_REV_Z) + #define DEFAULT_X_MAX_RATE 1000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 1000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 1000.0 // mm/min + #define DEFAULT_X_ACCELERATION (15.0*60*60) // 15*60*60 mm/min^2 = 15 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (15.0*60*60) // 15*60*60 mm/min^2 = 15 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (15.0*60*60) // 15*60*60 mm/min^2 = 15 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 200.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 200.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 200.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: Shapeoko CNC mill with three NEMA 17 stepper motors, driven by Synthetos + // grblShield at 28V. + #define MICROSTEPS_XY 8 + #define STEP_REVS_XY 200 + #define MM_PER_REV_XY (2.0*20) // 2mm belt pitch, 20 pulley teeth + #define MICROSTEPS_Z 2 + #define STEP_REVS_Z 200 + #define MM_PER_REV_Z 1.250 // 1.25 mm/rev leadscrew + #define DEFAULT_X_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Y_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Z_STEPS_PER_MM (MICROSTEPS_Z*STEP_REVS_Z/MM_PER_REV_Z) + #define DEFAULT_X_MAX_RATE 5000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 5000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 500.0 // mm/min + #define DEFAULT_X_ACCELERATION (250.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (250.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (50.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 290.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 290.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 100.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: Shapeoko CNC mill with three NEMA 23 stepper motors, driven by CarbideMotion + #define MICROSTEPS_XY 8 + #define STEP_REVS_XY 200 + #define MM_PER_REV_XY (2.0*20) // 2mm belt pitch, 20 pulley teeth + #define MICROSTEPS_Z 8 + #define STEP_REVS_Z 200 + #define MM_PER_REV_Z (2.0*20) // 2mm belt pitch, 20 pulley teeth + #define DEFAULT_X_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Y_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Z_STEPS_PER_MM (MICROSTEPS_Z*STEP_REVS_Z/MM_PER_REV_Z) + #define DEFAULT_X_MAX_RATE 5000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 5000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 5000.0 // mm/min + #define DEFAULT_X_ACCELERATION (400.0*60*60) // 400*60*60 mm/min^2 = 400 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (400.0*60*60) // 400*60*60 mm/min^2 = 400 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (400.0*60*60) // 400*60*60 mm/min^2 = 400 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 425.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 465.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 80.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: Sherline 5400 mill with three NEMA 23 Keling KL23H256-21-8B 185 oz-in stepper motors, + // driven by three Pololu A4988 stepper drivers with a 30V, 6A power supply at 1.5A per winding. + #define MICROSTEPS 2 + #define STEPS_PER_REV 200.0 + #define MM_PER_REV (0.050*MM_PER_INCH) // 0.050 inch/rev leadscrew + #define DEFAULT_X_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_Y_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_Z_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_X_MAX_RATE 635.0 // mm/min (25 ipm) + #define DEFAULT_Y_MAX_RATE 635.0 // mm/min + #define DEFAULT_Z_MAX_RATE 635.0 // mm/min + #define DEFAULT_X_ACCELERATION (50.0*60*60) // 50*60*60 mm/min^2 = 50 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (50.0*60*60) // 50*60*60 mm/min^2 = 50 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (50.0*60*60) // 50*60*60 mm/min^2 = 50 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 225.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 125.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 170.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Settings only for Grbl Simulator (www.github.com/grbl/grbl-sim) + // Grbl generic default settings. Should work across different machines. + #define DEFAULT_X_STEPS_PER_MM 1000.0 + #define DEFAULT_Y_STEPS_PER_MM 1000.0 + #define DEFAULT_Z_STEPS_PER_MM 1000.0 + #define DEFAULT_X_MAX_RATE 1000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 1000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 1000.0 // mm/min + #define DEFAULT_X_ACCELERATION (100.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (100.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (100.0*60*60) // 10*60*60 mm/min^2 = 10 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 1000.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 1000.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 1000.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK 0 + #define DEFAULT_STEPPER_IDLE_LOCK_TIME 25 // msec (0-254, 255 keeps steppers enabled) + #define DEFAULT_STATUS_REPORT_MASK ((BITFLAG_RT_STATUS_MACHINE_POSITION)|(BITFLAG_RT_STATUS_WORK_POSITION)) + #define DEFAULT_JUNCTION_DEVIATION 0.01 // mm + #define DEFAULT_ARC_TOLERANCE 0.002 // mm + #define DEFAULT_REPORT_INCHES 0 // false + #define DEFAULT_INVERT_ST_ENABLE 0 // false + #define DEFAULT_INVERT_LIMIT_PINS 0 // false + #define DEFAULT_SOFT_LIMIT_ENABLE 0 // false + #define DEFAULT_HARD_LIMIT_ENABLE 0 // false + #define DEFAULT_HOMING_ENABLE 0 // false + #define DEFAULT_HOMING_DIR_MASK 0 // move positive dir + #define DEFAULT_HOMING_FEED_RATE 25.0 // mm/min + #define DEFAULT_HOMING_SEEK_RATE 500.0 // mm/min + #define DEFAULT_HOMING_DEBOUNCE_DELAY 250 // msec (0-65k) + #define DEFAULT_HOMING_PULLOFF 1.0 // mm + +#endif diff --git a/grbl/defaults/defaults_x_carve_1000mm.h b/grbl/defaults/defaults_x_carve_1000mm.h new file mode 100644 index 000000000..f88e5ad12 --- /dev/null +++ b/grbl/defaults/defaults_x_carve_1000mm.h @@ -0,0 +1,70 @@ +/* + defaults_x_carve_1000mm.h - defaults settings configuration file + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: X-Carve 3D Carver CNC mill with three 200 step/rev motors driven by Synthetos + // grblShield at 24V. + #define MICROSTEPS_XY 8 + #define STEP_REVS_XY 200 + #define MM_PER_REV_XY (2.0*20) // 2mm belt pitch, 20 pulley teeth + #define MICROSTEPS_Z 2 + #define STEP_REVS_Z 200 + #define MM_PER_REV_Z 2.117 // ACME 3/8-12 Leadscrew + #define DEFAULT_X_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Y_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Z_STEPS_PER_MM (MICROSTEPS_Z*STEP_REVS_Z/MM_PER_REV_Z) + #define DEFAULT_X_MAX_RATE 8000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 8000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 500.0 // mm/min + #define DEFAULT_X_ACCELERATION (500.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (500.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (50.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 740.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 790.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 100.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: X-Carve 3D Carver CNC mill with three 200 step/rev motors driven by Synthetos + // grblShield at 24V. + #define MICROSTEPS_XY 8 + #define STEP_REVS_XY 200 + #define MM_PER_REV_XY (2.0*20) // 2mm belt pitch, 20 pulley teeth + #define MICROSTEPS_Z 2 + #define STEP_REVS_Z 200 + #define MM_PER_REV_Z 2.117 // ACME 3/8-12 Leadscrew + #define DEFAULT_X_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Y_STEPS_PER_MM (MICROSTEPS_XY*STEP_REVS_XY/MM_PER_REV_XY) + #define DEFAULT_Z_STEPS_PER_MM (MICROSTEPS_Z*STEP_REVS_Z/MM_PER_REV_Z) + #define DEFAULT_X_MAX_RATE 8000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 8000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 500.0 // mm/min + #define DEFAULT_X_ACCELERATION (500.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (500.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (50.0*60*60) // 25*60*60 mm/min^2 = 25 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 290.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 290.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 100.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +/* The defaults.h file serves as a central default settings file for different machine + types, from DIY CNC mills to CNC conversions of off-the-shelf machines. The settings + here are supplied by users, so your results may vary. However, this should give you + a good starting point as you get to know your machine and tweak the settings for your + nefarious needs. */ + +#ifndef defaults_h +#define defaults_h + + // Description: Zen Toolworks 7x7 mill with three Shinano SST43D2121 65oz-in NEMA 17 stepper motors. + // Leadscrew is different from some ZTW kits, where most are 1.25mm/rev rather than 8.0mm/rev here. + // Driven by 30V, 6A power supply and TI DRV8811 stepper motor drivers. + #define MICROSTEPS 8 + #define STEPS_PER_REV 200.0 + #define MM_PER_REV 8.0 // 8 mm/rev leadscrew + #define DEFAULT_X_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_Y_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_Z_STEPS_PER_MM (STEPS_PER_REV*MICROSTEPS/MM_PER_REV) + #define DEFAULT_X_MAX_RATE 6000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 6000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 6000.0 // mm/min + #define DEFAULT_X_ACCELERATION (600.0*60*60) // 600*60*60 mm/min^2 = 600 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (600.0*60*60) // 600*60*60 mm/min^2 = 600 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (600.0*60*60) // 600*60*60 mm/min^2 = 600 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 190.0 // mm + #define DEFAULT_Y_MAX_TRAVEL 180.0 // mm + #define DEFAULT_Z_MAX_TRAVEL 150.0 // mm + #define DEFAULT_STEP_PULSE_MICROSECONDS 10 + #define DEFAULT_STEPPING_INVERT_MASK 0 + #define DEFAULT_DIRECTION_INVERT_MASK ((1<. +*/ + +#ifndef eeprom_h +#define eeprom_h + +unsigned char eeprom_get_char(unsigned int addr); +void eeprom_put_char(unsigned int addr, unsigned char new_value); +void memcpy_to_eeprom_with_checksum(unsigned int destination, char *source, unsigned int size); +int memcpy_from_eeprom_with_checksum(char *destination, unsigned int source, unsigned int size); + +#endif diff --git a/grbl/examples/grblUpload/grblUpload.ino b/grbl/examples/grblUpload/grblUpload.ino new file mode 100644 index 000000000..581b6b3d7 --- /dev/null +++ b/grbl/examples/grblUpload/grblUpload.ino @@ -0,0 +1,29 @@ +/*********************************************************************** +This sketch compiles and uploads Grbl to your 328p-based Arduino! + +To use: +- First make sure you have imported Grbl source code into your Arduino + IDE. There are details on our Github website on how to do this. + +- Select your Arduino Board and Serial Port in the Tools drop-down menu. + NOTE: Grbl only officially supports 328p-based Arduinos, like the Uno. + Using other boards will likely not work! + +- Then just click 'Upload'. That's it! + +For advanced users: + If you'd like to see what else Grbl can do, there are some additional + options for customization and features you can enable or disable. + Navigate your file system to where the Arduino IDE has stored the Grbl + source code files, open the 'config.h' file in your favorite text + editor. Inside are dozens of feature descriptions and #defines. Simply + comment or uncomment the #defines or alter their assigned values, save + your changes, and then click 'Upload' here. + +Copyright (c) 2015 Sungeun K. Jeon +Released under the MIT-license. See license.txt for details. +***********************************************************************/ + +#include + +// Do not alter this file! diff --git a/grbl/examples/grblUpload/license.txt b/grbl/examples/grblUpload/license.txt new file mode 100644 index 000000000..1abcdb959 --- /dev/null +++ b/grbl/examples/grblUpload/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Sungeun K. Jeon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/gcode.c b/grbl/gcode.c similarity index 87% rename from gcode.c rename to grbl/gcode.c index 1977d8344..a0a8ad13d 100644 --- a/gcode.c +++ b/grbl/gcode.c @@ -1,9 +1,10 @@ /* gcode.c - rs274/ngc parser. - Part of Grbl v0.9 + Part of Grbl + + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2012-2014 Sungeun K. Jeon - Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -17,22 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ -#include "system.h" -#include "settings.h" -#include "protocol.h" -#include "gcode.h" -#include "motion_control.h" -#include "spindle_control.h" -#include "coolant_control.h" -#include "probe.h" -#include "report.h" +#include "grbl.h" // NOTE: Max line number is defined by the g-code standard to be 99999. It seems to be an // arbitrary value, and some GUIs may require more. So we increased it based on a max safe @@ -66,10 +53,7 @@ void gc_init() // limit pull-off routines. void gc_sync_position() { - uint8_t i; - for (i=0; i 255, variable type must be changed to uint16_t. - + uint16_t mantissa = 0; while (line[char_counter] != 0) { // Loop until no more g-code words in line. @@ -210,11 +193,10 @@ uint8_t gc_execute_line(char *line) case 3: gc_block.modal.motion = MOTION_MODE_CCW_ARC; break; // G3 case 38: switch(mantissa) { - case 20: gc_block.modal.motion = MOTION_MODE_PROBE; break; // G38.2 - // NOTE: If G38.3+ are enabled, change mantissa variable type to uint16_t. - // case 30: gc_block.modal.motion = MOTION_MODE_PROBE_NO_ERROR; break; // G38.3 Not supported. - // case 40: // Not supported. - // case 50: // Not supported. + case 20: gc_block.modal.motion = MOTION_MODE_PROBE_TOWARD; break; // G38.2 + case 30: gc_block.modal.motion = MOTION_MODE_PROBE_TOWARD_NO_ERROR; break; // G38.3 + case 40: gc_block.modal.motion = MOTION_MODE_PROBE_AWAY; break; // G38.4 + case 50: gc_block.modal.motion = MOTION_MODE_PROBE_AWAY_NO_ERROR; break; // G38.5 default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G38.x command] } mantissa = 0; // Set to zero to indicate valid non-integer G command. @@ -231,9 +213,16 @@ uint8_t gc_execute_line(char *line) } break; case 90: case 91: - word_bit = MODAL_GROUP_G3; - if (int_value == 90) { gc_block.modal.distance = DISTANCE_MODE_ABSOLUTE; } // G90 - else { gc_block.modal.distance = DISTANCE_MODE_INCREMENTAL; } // G91 + if (mantissa == 0) { + word_bit = MODAL_GROUP_G3; + if (int_value == 90) { gc_block.modal.distance = DISTANCE_MODE_ABSOLUTE; } // G90 + else { gc_block.modal.distance = DISTANCE_MODE_INCREMENTAL; } // G91 + } else { + word_bit = MODAL_GROUP_G4; + if ((mantissa != 10) || (int_value == 90)) { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); } // [G90.1 not supported] + mantissa = 0; // Set to zero to indicate valid non-integer G command. + // Otherwise, arc IJK incremental mode is default. G91.1 does nothing. + } break; case 93: case 94: word_bit = MODAL_GROUP_G5; @@ -245,6 +234,12 @@ uint8_t gc_execute_line(char *line) if (int_value == 20) { gc_block.modal.units = UNITS_MODE_INCHES; } // G20 else { gc_block.modal.units = UNITS_MODE_MM; } // G21 break; + case 40: + word_bit = MODAL_GROUP_G7; + // NOTE: Not required since cutter radius compensation is always disabled. Only here + // to support G40 commands that often appear in g-code program headers to setup defaults. + // gc_block.modal.cutter_comp = CUTTER_COMP_DISABLE; // G40 + break; case 43: case 49: word_bit = MODAL_GROUP_G8; // NOTE: The NIST g-code standard vaguely states that when a tool length offset is changed, @@ -264,6 +259,11 @@ uint8_t gc_execute_line(char *line) word_bit = MODAL_GROUP_G12; gc_block.modal.coord_select = int_value-54; // Shift to array indexing. break; + case 61: + word_bit = MODAL_GROUP_G13; + if (mantissa != 0) { FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); } // [G61.1 not supported] + // gc_block.modal.control = CONTROL_MODE_EXACT_PATH; // G61 + break; default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported G command] } if (mantissa > 0) { FAIL(STATUS_GCODE_COMMAND_VALUE_NOT_INTEGER); } // [Unsupported or invalid Gxx.x command] @@ -286,11 +286,16 @@ uint8_t gc_execute_line(char *line) case 2: case 30: gc_block.modal.program_flow = PROGRAM_FLOW_COMPLETED; break; // Program end and reset } break; - case 3: case 4: case 5: + #ifndef USE_SPINDLE_DIR_AS_ENABLE_PIN + case 4: + #endif + case 3: case 5: word_bit = MODAL_GROUP_M7; switch(int_value) { case 3: gc_block.modal.spindle = SPINDLE_ENABLE_CW; break; - case 4: gc_block.modal.spindle = SPINDLE_ENABLE_CCW; break; + #ifndef USE_SPINDLE_DIR_AS_ENABLE_PIN + case 4: gc_block.modal.spindle = SPINDLE_ENABLE_CCW; break; + #endif case 5: gc_block.modal.spindle = SPINDLE_DISABLE; break; } break; @@ -308,7 +313,7 @@ uint8_t gc_execute_line(char *line) } break; default: FAIL(STATUS_GCODE_UNSUPPORTED_COMMAND); // [Unsupported M command] - } + } // Check for more than one command per modal group violations in the current block // NOTE: Variable 'word_bit' is always assigned, if the command is valid. @@ -490,7 +495,10 @@ uint8_t gc_execute_line(char *line) } } - // [13. Cutter radius compensation ]: NOT SUPPORTED. Error, if G53 is active. + // [13. Cutter radius compensation ]: G41/42 NOT SUPPORTED. Error, if enabled while G53 is active. + // [G40 Errors]: G2/3 arc is programmed after a G40. The linear move after disabling is less than tool diameter. + // NOTE: Since cutter radius compensation is never enabled, these G40 errors don't apply. Grbl supports G40 + // only for the purpose to not error when G40 is sent with a g-code program header to setup the default modes. // [14. Cutter length compensation ]: G43 NOT SUPPORTED, but G43.1 and G49 are. // [G43.1 Errors]: Motion command in same line. @@ -516,8 +524,8 @@ uint8_t gc_execute_line(char *line) } } - // [16. Set path control mode ]: NOT SUPPORTED. - // [17. Set distance mode ]: N/A. G90.1 and G91.1 NOT SUPPORTED. + // [16. Set path control mode ]: N/A. Only G61. G61.1 and G64 NOT SUPPORTED. + // [17. Set distance mode ]: N/A. Only G91.1. G90.1 NOT SUPPORTED. // [18. Set retract mode ]: NOT SUPPORTED. // [19. Remaining non-modal actions ]: Check go to predefined position, set G10, or set axis offsets. @@ -800,7 +808,8 @@ uint8_t gc_execute_line(char *line) } } break; - case MOTION_MODE_PROBE: + case MOTION_MODE_PROBE_TOWARD: case MOTION_MODE_PROBE_TOWARD_NO_ERROR: + case MOTION_MODE_PROBE_AWAY: case MOTION_MODE_PROBE_AWAY_NO_ERROR: // [G38 Errors]: Target is same current. No axis words. Cutter compensation is enabled. Feed rate // is undefined. Probe is triggered. NOTE: Probe check moved to probe cycle. Instead of returning // an error, it issues an alarm to prevent further motion to the probe. It's also done there to @@ -827,6 +836,9 @@ uint8_t gc_execute_line(char *line) need to update the state and execute the block according to the order-of-execution. */ + // [0. Non-specific/common error-checks and miscellaneous setup]: + gc_state.line_number = gc_block.values.n; + // [1. Comments feedback ]: NOT SUPPORTED // [2. Set feed rate mode ]: @@ -837,10 +849,9 @@ uint8_t gc_execute_line(char *line) // [4. Set spindle speed ]: if (gc_state.spindle_speed != gc_block.values.s) { - gc_state.spindle_speed = gc_block.values.s; - // Update running spindle only if not in check mode and not already enabled. - if (gc_state.modal.spindle != SPINDLE_DISABLE) { spindle_run(gc_state.modal.spindle, gc_state.spindle_speed); } + if (gc_state.modal.spindle != SPINDLE_DISABLE) { spindle_run(gc_state.modal.spindle, gc_block.values.s); } + gc_state.spindle_speed = gc_block.values.s; } // [5. Select tool ]: NOT SUPPORTED. Only tracks tool value. @@ -850,15 +861,15 @@ uint8_t gc_execute_line(char *line) // [7. Spindle control ]: if (gc_state.modal.spindle != gc_block.modal.spindle) { - gc_state.modal.spindle = gc_block.modal.spindle; // Update spindle control and apply spindle speed when enabling it in this block. - spindle_run(gc_state.modal.spindle, gc_state.spindle_speed); + spindle_run(gc_block.modal.spindle, gc_state.spindle_speed); + gc_state.modal.spindle = gc_block.modal.spindle; } // [8. Coolant control ]: if (gc_state.modal.coolant != gc_block.modal.coolant) { + coolant_run(gc_block.modal.coolant); gc_state.modal.coolant = gc_block.modal.coolant; - coolant_run(gc_state.modal.coolant); } // [9. Enable/disable feed rate or spindle overrides ]: NOT SUPPORTED @@ -872,7 +883,8 @@ uint8_t gc_execute_line(char *line) // [12. Set length units ]: gc_state.modal.units = gc_block.modal.units; - // [13. Cutter radius compensation ]: NOT SUPPORTED + // [13. Cutter radius compensation ]: G41/42 NOT SUPPORTED + // gc_state.modal.cutter_comp = gc_block.modal.cutter_comp; // NOTE: Not needed since always disabled. // [14. Cutter length compensation ]: G43.1 and G49 supported. G43 NOT SUPPORTED. // NOTE: If G43 were supported, its operation wouldn't be any different from G43.1 in terms @@ -893,7 +905,8 @@ uint8_t gc_execute_line(char *line) memcpy(gc_state.coord_system,coordinate_data,sizeof(coordinate_data)); } - // [16. Set path control mode ]: NOT SUPPORTED + // [16. Set path control mode ]: G61.1/G64 NOT SUPPORTED + // gc_state.modal.control = gc_block.modal.control; // NOTE: Always default. // [17. Set distance mode ]: gc_state.modal.distance = gc_block.modal.distance; @@ -912,13 +925,13 @@ uint8_t gc_execute_line(char *line) // and absolute and incremental modes. if (axis_command) { #ifdef USE_LINE_NUMBERS - mc_line(gc_block.values.xyz, -1.0, false, gc_block.values.n); + mc_line(gc_block.values.xyz, -1.0, false, gc_state.line_number); #else mc_line(gc_block.values.xyz, -1.0, false); #endif } #ifdef USE_LINE_NUMBERS - mc_line(parameter_data, -1.0, false, gc_block.values.n); + mc_line(parameter_data, -1.0, false, gc_state.line_number); #else mc_line(parameter_data, -1.0, false); #endif @@ -948,41 +961,71 @@ uint8_t gc_execute_line(char *line) switch (gc_state.modal.motion) { case MOTION_MODE_SEEK: #ifdef USE_LINE_NUMBERS - mc_line(gc_block.values.xyz, -1.0, false, gc_block.values.n); + mc_line(gc_block.values.xyz, -1.0, false, gc_state.line_number); #else mc_line(gc_block.values.xyz, -1.0, false); #endif break; case MOTION_MODE_LINEAR: #ifdef USE_LINE_NUMBERS - mc_line(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, gc_block.values.n); + mc_line(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, gc_state.line_number); #else mc_line(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate); #endif break; - case MOTION_MODE_CW_ARC: case MOTION_MODE_CCW_ARC: + case MOTION_MODE_CW_ARC: #ifdef USE_LINE_NUMBERS mc_arc(gc_state.position, gc_block.values.xyz, gc_block.values.ijk, gc_block.values.r, - gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear, gc_block.values.n); + gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear, true, gc_state.line_number); #else mc_arc(gc_state.position, gc_block.values.xyz, gc_block.values.ijk, gc_block.values.r, - gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear); + gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear, true); + #endif + break; + case MOTION_MODE_CCW_ARC: + #ifdef USE_LINE_NUMBERS + mc_arc(gc_state.position, gc_block.values.xyz, gc_block.values.ijk, gc_block.values.r, + gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear, false, gc_state.line_number); + #else + mc_arc(gc_state.position, gc_block.values.xyz, gc_block.values.ijk, gc_block.values.r, + gc_state.feed_rate, gc_state.modal.feed_rate, axis_0, axis_1, axis_linear, false); #endif break; - case MOTION_MODE_PROBE: + case MOTION_MODE_PROBE_TOWARD: // NOTE: gc_block.values.xyz is returned from mc_probe_cycle with the updated position value. So // upon a successful probing cycle, the machine position and the returned value should be the same. #ifdef USE_LINE_NUMBERS - mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, gc_block.values.n); + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, false, false, gc_state.line_number); + #else + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, false, false); + #endif + break; + case MOTION_MODE_PROBE_TOWARD_NO_ERROR: + #ifdef USE_LINE_NUMBERS + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, false, true, gc_state.line_number); + #else + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, false, true); + #endif + break; + case MOTION_MODE_PROBE_AWAY: + #ifdef USE_LINE_NUMBERS + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, true, false, gc_state.line_number); #else - mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate); + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, true, false); + #endif + break; + case MOTION_MODE_PROBE_AWAY_NO_ERROR: + #ifdef USE_LINE_NUMBERS + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, true, true, gc_state.line_number); + #else + mc_probe_cycle(gc_block.values.xyz, gc_state.feed_rate, gc_state.modal.feed_rate, true, true); #endif } // As far as the parser is concerned, the position is now == target. In reality the // motion control system might still be processing the action and the real tool position // in any intermediate location. - memcpy(gc_state.position, gc_block.values.xyz, sizeof(gc_block.values.xyz)); // gc.position[] = target[]; + memcpy(gc_state.position, gc_block.values.xyz, sizeof(gc_block.values.xyz)); // gc_state.position[] = gc_block.values.xyz[] } } @@ -991,16 +1034,41 @@ uint8_t gc_execute_line(char *line) // refill and can only be resumed by the cycle start run-time command. gc_state.modal.program_flow = gc_block.modal.program_flow; if (gc_state.modal.program_flow) { - protocol_buffer_synchronize(); // Finish all remaining buffered motions. Program paused when complete. - sys.auto_start = false; // Disable auto cycle start. Forces pause until cycle start issued. - - // If complete, reset to reload defaults (G92.2,G54,G17,G90,G94,M48,G40,M5,M9). Otherwise, - // re-enable program flow after pause complete, where cycle start will resume the program. - if (gc_state.modal.program_flow == PROGRAM_FLOW_COMPLETED) { mc_reset(); } - else { gc_state.modal.program_flow = PROGRAM_FLOW_RUNNING; } + protocol_buffer_synchronize(); // Sync and finish all remaining buffered motions before moving on. + if (gc_state.modal.program_flow == PROGRAM_FLOW_PAUSED) { + if (sys.state != STATE_CHECK_MODE) { + bit_true_atomic(sys_rt_exec_state, EXEC_FEED_HOLD); // Use feed hold for program pause. + protocol_execute_realtime(); // Execute suspend. + } + } else { // == PROGRAM_FLOW_COMPLETED + // Upon program complete, only a subset of g-codes reset to certain defaults, according to + // LinuxCNC's program end descriptions and testing. Only modal groups [G-code 1,2,3,5,7,12] + // and [M-code 7,8,9] reset to [G1,G17,G90,G94,G40,G54,M5,M9,M48]. The remaining modal groups + // [G-code 4,6,8,10,13,14,15] and [M-code 4,5,6] and the modal words [F,S,T,H] do not reset. + gc_state.modal.motion = MOTION_MODE_LINEAR; + gc_state.modal.plane_select = PLANE_SELECT_XY; + gc_state.modal.distance = DISTANCE_MODE_ABSOLUTE; + gc_state.modal.feed_rate = FEED_RATE_MODE_UNITS_PER_MIN; + // gc_state.modal.cutter_comp = CUTTER_COMP_DISABLE; // Not supported. + gc_state.modal.coord_select = 0; // G54 + gc_state.modal.spindle = SPINDLE_DISABLE; + gc_state.modal.coolant = COOLANT_DISABLE; + // gc_state.modal.override = OVERRIDE_DISABLE; // Not supported. + + // Execute coordinate change and spindle/coolant stop. + if (sys.state != STATE_CHECK_MODE) { + if (!(settings_read_coord_data(gc_state.modal.coord_select,coordinate_data))) { FAIL(STATUS_SETTING_READ_FAIL); } + memcpy(gc_state.coord_system,coordinate_data,sizeof(coordinate_data)); + spindle_stop(); + coolant_stop(); + } + + report_feedback_message(MESSAGE_PROGRAM_END); + } + gc_state.modal.program_flow = PROGRAM_FLOW_RUNNING; // Reset program flow. } - // TODO: % to denote start of program. Sets auto cycle start? + // TODO: % to denote start of program. return(STATUS_OK); } @@ -1022,10 +1090,10 @@ uint8_t gc_execute_line(char *line) group 1 = {G81 - G89} (Motion modes: Canned cycles) group 4 = {M1} (Optional stop, ignored) group 6 = {M6} (Tool change) - group 7 = {G40, G41, G42} cutter radius compensation - group 8 = {G43} tool length offset (But G43.1/G94 IS SUPPORTED) - group 8 = {*M7} enable mist coolant + group 7 = {G41, G42} cutter radius compensation (G40 is supported) + group 8 = {G43} tool length offset (G43.1/G49 are supported) + group 8 = {*M7} enable mist coolant (* Compile-option) group 9 = {M48, M49} enable/disable feed and speed override switches group 10 = {G98, G99} return mode canned cycles - group 13 = {G61, G61.1, G64} path control mode + group 13 = {G61.1, G64} path control mode (G61 is supported) */ diff --git a/gcode.h b/grbl/gcode.h similarity index 71% rename from gcode.h rename to grbl/gcode.h index 8a29aab1c..9a289aff4 100644 --- a/gcode.h +++ b/grbl/gcode.h @@ -1,8 +1,9 @@ /* gcode.h - rs274/ngc parser. - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef gcode_h #define gcode_h @@ -35,21 +30,24 @@ // and are similar/identical to other g-code interpreters by manufacturers (Haas,Fanuc,Mazak,etc). // NOTE: Modal group define values must be sequential and starting from zero. #define MODAL_GROUP_G0 0 // [G4,G10,G28,G28.1,G30,G30.1,G53,G92,G92.1] Non-modal -#define MODAL_GROUP_G1 1 // [G0,G1,G2,G3,G38.2,G80] Motion +#define MODAL_GROUP_G1 1 // [G0,G1,G2,G3,G38.2,G38.3,G38.4,G38.5,G80] Motion #define MODAL_GROUP_G2 2 // [G17,G18,G19] Plane selection #define MODAL_GROUP_G3 3 // [G90,G91] Distance mode -#define MODAL_GROUP_G5 4 // [G93,G94] Feed rate mode -#define MODAL_GROUP_G6 5 // [G20,G21] Units -#define MODAL_GROUP_G8 6 // [G43,G43.1,G49] Tool length offset -#define MODAL_GROUP_G12 7 // [G54,G55,G56,G57,G58,G59] Coordinate system selection - -#define MODAL_GROUP_M4 8 // [M0,M1,M2,M30] Stopping -#define MODAL_GROUP_M7 9 // [M3,M4,M5] Spindle turning -#define MODAL_GROUP_M8 10 // [M7,M8,M9] Coolant control - -#define OTHER_INPUT_F 11 -#define OTHER_INPUT_S 12 -#define OTHER_INPUT_T 13 +#define MODAL_GROUP_G4 4 // [G91.1] Arc IJK distance mode +#define MODAL_GROUP_G5 5 // [G93,G94] Feed rate mode +#define MODAL_GROUP_G6 6 // [G20,G21] Units +#define MODAL_GROUP_G7 7 // [G40] Cutter radius compensation mode. G41/42 NOT SUPPORTED. +#define MODAL_GROUP_G8 8 // [G43.1,G49] Tool length offset +#define MODAL_GROUP_G12 9 // [G54,G55,G56,G57,G58,G59] Coordinate system selection +#define MODAL_GROUP_G13 10 // [G61] Control mode + +#define MODAL_GROUP_M4 11 // [M0,M1,M2,M30] Stopping +#define MODAL_GROUP_M7 12 // [M3,M4,M5] Spindle turning +#define MODAL_GROUP_M8 13 // [M7,M8,M9] Coolant control + +// #define OTHER_INPUT_F 14 +// #define OTHER_INPUT_S 15 +// #define OTHER_INPUT_T 16 // Define command actions for within execution-type modal groups (motion, stopping, non-modal). Used // internally by the parser to know which command to execute. @@ -71,8 +69,11 @@ #define MOTION_MODE_LINEAR 1 // G1 #define MOTION_MODE_CW_ARC 2 // G2 #define MOTION_MODE_CCW_ARC 3 // G3 -#define MOTION_MODE_PROBE 4 // G38.2 -#define MOTION_MODE_NONE 5 // G80 +#define MOTION_MODE_PROBE_TOWARD 4 // G38.2 NOTE: G38.2, G38.3, G38.4, G38.5 must be sequential. See report_gcode_modes(). +#define MOTION_MODE_PROBE_TOWARD_NO_ERROR 5 // G38.3 +#define MOTION_MODE_PROBE_AWAY 6 // G38.4 +#define MOTION_MODE_PROBE_AWAY_NO_ERROR 7 // G38.5 +#define MOTION_MODE_NONE 8 // G80 // Modal Group G2: Plane select #define PLANE_SELECT_XY 0 // G17 (Default: Must be zero) @@ -83,6 +84,9 @@ #define DISTANCE_MODE_ABSOLUTE 0 // G90 (Default: Must be zero) #define DISTANCE_MODE_INCREMENTAL 1 // G91 +// Modal Group G4: Arc IJK distance mode +#define DISTANCE_ARC_MODE_INCREMENTAL 0 // G91.1 (Default: Must be zero) + // Modal Group M4: Program flow #define PROGRAM_FLOW_RUNNING 0 // (Default: Must be zero) #define PROGRAM_FLOW_PAUSED 1 // M0, M1 @@ -96,6 +100,12 @@ #define UNITS_MODE_MM 0 // G21 (Default: Must be zero) #define UNITS_MODE_INCHES 1 // G20 +// Modal Group G7: Cutter radius compensation mode +#define CUTTER_COMP_DISABLE 0 // G40 (Default: Must be zero) + +// Modal Group G13: Control mode +#define CONTROL_MODE_EXACT_PATH 0 // G61 (Default: Must be zero) + // Modal Group M7: Spindle control #define SPINDLE_DISABLE 0 // M5 (Default: Must be zero) #define SPINDLE_ENABLE_CW 1 // M3 @@ -113,6 +123,8 @@ // Modal Group G12: Active work coordinate system // N/A: Stores coordinate system value (54-59) to change to. + +// Define parameter word mapping. #define WORD_F 0 #define WORD_I 1 #define WORD_J 2 @@ -128,20 +140,21 @@ #define WORD_Z 12 - - // NOTE: When this struct is zeroed, the above defines set the defaults for the system. typedef struct { - uint8_t motion; // {G0,G1,G2,G3,G38.2,G80} - uint8_t feed_rate; // {G93,G94} - uint8_t units; // {G20,G21} - uint8_t distance; // {G90,G91} - uint8_t plane_select; // {G17,G18,G19} - uint8_t tool_length; // {G43.1,G49} - uint8_t coord_select; // {G54,G55,G56,G57,G58,G59} - uint8_t program_flow; // {M0,M1,M2,M30} - uint8_t coolant; // {M7,M8,M9} - uint8_t spindle; // {M3,M4,M5} + uint8_t motion; // {G0,G1,G2,G3,G38.2,G80} + uint8_t feed_rate; // {G93,G94} + uint8_t units; // {G20,G21} + uint8_t distance; // {G90,G91} + // uint8_t distance_arc; // {G91.1} NOTE: Don't track. Only default supported. + uint8_t plane_select; // {G17,G18,G19} + // uint8_t cutter_comp; // {G40} NOTE: Don't track. Only default supported. + uint8_t tool_length; // {G43.1,G49} + uint8_t coord_select; // {G54,G55,G56,G57,G58,G59} + // uint8_t control; // {G61} NOTE: Don't track. Only default supported. + uint8_t program_flow; // {M0,M1,M2,M30} + uint8_t coolant; // {M7,M8,M9} + uint8_t spindle; // {M3,M4,M5} } gc_modal_t; typedef struct { @@ -164,6 +177,7 @@ typedef struct { float spindle_speed; // RPM float feed_rate; // Millimeters/min uint8_t tool; // Tracks tool number. NOT USED. + int32_t line_number; // Last line number sent float position[N_AXIS]; // Where the interpreter considers the tool to be at this point in the code diff --git a/grbl/grbl.h b/grbl/grbl.h new file mode 100644 index 000000000..85e94e5a1 --- /dev/null +++ b/grbl/grbl.h @@ -0,0 +1,62 @@ +/* + grbl.h - main Grbl include file + Part of Grbl + + Copyright (c) 2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#ifndef grbl_h +#define grbl_h + +// Grbl versioning system +#define GRBL_VERSION "0.9j" +#define GRBL_VERSION_BUILD "20150930" + +// Define standard libraries used by Grbl. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Define the Grbl system include files. NOTE: Do not alter organization. +#include "config.h" +#include "nuts_bolts.h" +#include "settings.h" +#include "system.h" +#include "defaults.h" +#include "cpu_map.h" +#include "coolant_control.h" +#include "eeprom.h" +#include "gcode.h" +#include "limits.h" +#include "motion_control.h" +#include "planner.h" +#include "print.h" +#include "probe.h" +#include "protocol.h" +#include "report.h" +#include "serial.h" +#include "spindle_control.h" +#include "stepper.h" + +#endif diff --git a/grbl/limits.c b/grbl/limits.c new file mode 100644 index 000000000..0acff4cee --- /dev/null +++ b/grbl/limits.c @@ -0,0 +1,352 @@ +/* + limits.c - code pertaining to limit-switches and performing the homing cycle + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#include "grbl.h" + + +// Homing axis search distance multiplier. Computed by this value times the cycle travel. +#ifndef HOMING_AXIS_SEARCH_SCALAR + #define HOMING_AXIS_SEARCH_SCALAR 1.5 // Must be > 1 to ensure limit switch will be engaged. +#endif +#ifndef HOMING_AXIS_LOCATE_SCALAR + #define HOMING_AXIS_LOCATE_SCALAR 5.0 // Must be > 1 to ensure limit switch is cleared. +#endif + +void limits_init() +{ + LIMIT_DDR &= ~(LIMIT_MASK); // Set as input pins + + #ifdef DISABLE_LIMIT_PIN_PULL_UP + LIMIT_PORT &= ~(LIMIT_MASK); // Normal low operation. Requires external pull-down. + #else + LIMIT_PORT |= (LIMIT_MASK); // Enable internal pull-up resistors. Normal high operation. + #endif + + if (bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)) { + LIMIT_PCMSK |= LIMIT_MASK; // Enable specific pins of the Pin Change Interrupt + PCICR |= (1 << LIMIT_INT); // Enable Pin Change Interrupt + } else { + limits_disable(); + } + + #ifdef ENABLE_SOFTWARE_DEBOUNCE + MCUSR &= ~(1< 0); + + // The active cycle axes should now be homed and machine limits have been located. By + // default, Grbl defines machine space as all negative, as do most CNCs. Since limit switches + // can be on either side of an axes, check and set axes machine zero appropriately. Also, + // set up pull-off maneuver from axes limit switches that have been homed. This provides + // some initial clearance off the switches and should also help prevent them from falsely + // triggering when hard limits are enabled or when more than one axes shares a limit pin. + #ifdef COREXY + int32_t off_axis_position = 0; + #endif + int32_t set_axis_position; + // Set machine positions for homed limit switches. Don't update non-homed axes. + for (idx=0; idx -settings.max_travel[idx]) { soft_limit_error = true; } + } else { + if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } + } + #else + // NOTE: max_travel is stored as negative + if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } + #endif + + if (soft_limit_error) { + // Force feed hold if cycle is active. All buffered blocks are guaranteed to be within + // workspace volume so just come to a controlled stop so position is not lost. When complete + // enter alarm mode. + if (sys.state == STATE_CYCLE) { + bit_true_atomic(sys_rt_exec_state, EXEC_FEED_HOLD); + do { + protocol_execute_realtime(); + if (sys.abort) { return; } + } while ( sys.state != STATE_IDLE ); + } + + mc_reset(); // Issue system reset and ensure spindle and coolant are shutdown. + bit_true_atomic(sys_rt_exec_alarm, (EXEC_ALARM_SOFT_LIMIT|EXEC_CRITICAL_EVENT)); // Indicate soft limit critical event + protocol_execute_realtime(); // Execute to enter critical event loop and system abort + return; + } + } +} diff --git a/limits.h b/grbl/limits.h similarity index 80% rename from limits.h rename to grbl/limits.h index 6ccd70f20..74512ceb8 100644 --- a/limits.h +++ b/grbl/limits.h @@ -1,9 +1,10 @@ /* limits.h - code pertaining to limit-switches and performing the homing cycle - Part of Grbl v0.9 - - Copyright (c) 2012-2014 Sungeun K. Jeon + Part of Grbl + Copyright (c) 2012-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -17,11 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud -*/ #ifndef limits_h #define limits_h @@ -30,8 +26,12 @@ // Initialize the limits module void limits_init(); +// Disables hard limits. void limits_disable(); +// Returns limit state as a bit-wise uint8 variable. +uint8_t limits_get_state(); + // Perform one portion of the homing cycle based on the input settings. void limits_go_home(uint8_t cycle_mask); diff --git a/main.c b/grbl/main.c similarity index 78% rename from main.c rename to grbl/main.c index 6a57ba540..250baaf42 100644 --- a/main.c +++ b/grbl/main.c @@ -1,9 +1,10 @@ /* main.c - An embedded CNC Controller with rs274/ngc (g-code) support - Part of Grbl v0.9 + Part of Grbl + + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2012-2014 Sungeun K. Jeon - Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -17,26 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ -#include "system.h" -#include "serial.h" -#include "settings.h" -#include "protocol.h" -#include "gcode.h" -#include "planner.h" -#include "stepper.h" -#include "spindle_control.h" -#include "coolant_control.h" -#include "motion_control.h" -#include "limits.h" -#include "probe.h" -#include "report.h" +#include "grbl.h" // Declare system global variable structure @@ -47,7 +30,7 @@ int main(void) { // Initialize system upon power-up. serial_init(); // Setup serial baud rate and interrupts - settings_init(); // Load grbl settings from EEPROM + settings_init(); // Load Grbl settings from EEPROM stepper_init(); // Configure stepper pins and interrupt timers system_init(); // Configure pinout pins and pin-change interrupt @@ -66,6 +49,11 @@ int main(void) if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif + // Force Grbl into an ALARM state upon a power-cycle or hard reset. + #ifdef FORCE_INITIALIZATION_ALARM + sys.state = STATE_ALARM; + #endif + // Grbl initialization loop upon power-up or a system abort. For the latter, all processes // will return to this loop to be cleanly re-initialized. for(;;) { @@ -89,9 +77,9 @@ int main(void) // Reset system variables. sys.abort = false; - sys.execute = 0; - if (bit_istrue(settings.flags,BITFLAG_AUTO_START)) { sys.auto_start = true; } - else { sys.auto_start = false; } + sys_rt_exec_state = 0; + sys_rt_exec_alarm = 0; + sys.suspend = false; // Start Grbl main loop. Processes program inputs and executes them. protocol_main_loop(); diff --git a/motion_control.c b/grbl/motion_control.c similarity index 79% rename from motion_control.c rename to grbl/motion_control.c index 66633d156..1da671c0a 100644 --- a/motion_control.c +++ b/grbl/motion_control.c @@ -1,8 +1,10 @@ /* motion_control.c - high level interface for issuing motion commands - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + Copyright (c) 2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,26 +19,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon - Copyright (c) 2011 Jens Geisler -*/ - -#include "system.h" -#include "settings.h" -#include "protocol.h" -#include "gcode.h" -#include "planner.h" -#include "stepper.h" -#include "motion_control.h" -#include "spindle_control.h" -#include "coolant_control.h" -#include "limits.h" -#include "probe.h" -#include "report.h" + +#include "grbl.h" // Execute linear motion in absolute millimeter coordinates. Feed rate given in millimeters/second @@ -76,26 +60,23 @@ // If the buffer is full: good! That means we are well ahead of the robot. // Remain in this loop until there is room in the buffer. do { - protocol_execute_runtime(); // Check for any run-time commands + protocol_execute_realtime(); // Check for any run-time commands if (sys.abort) { return; } // Bail, if system abort. if ( plan_check_full_buffer() ) { protocol_auto_cycle_start(); } // Auto-cycle start when buffer is full. else { break; } } while (1); + // Plan and queue motion into planner buffer #ifdef USE_LINE_NUMBERS plan_buffer_line(target, feed_rate, invert_feed_rate, line_number); #else plan_buffer_line(target, feed_rate, invert_feed_rate); #endif - - // If idle, indicate to the system there is now a planned block in the buffer ready to cycle - // start. Otherwise ignore and continue on. - if (!sys.state) { sys.state = STATE_QUEUED; } } // Execute an arc in offset mode format. position == current xyz, target == target xyz, -// offset == offset from current xyz, axis_XXX defines circle plane in tool space, axis_linear is +// offset == offset from current xyz, axis_X defines circle plane in tool space, axis_linear is // the direction of helical travel, radius == circle radius, isclockwise boolean. Used // for vector transformation direction. // The arc is approximated by generating a huge number of tiny, linear segments. The chordal tolerance @@ -103,10 +84,10 @@ // distance from segment to the circle when the end points both lie on the circle. #ifdef USE_LINE_NUMBERS void mc_arc(float *position, float *target, float *offset, float radius, float feed_rate, - uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, int32_t line_number) + uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc, int32_t line_number) #else void mc_arc(float *position, float *target, float *offset, float radius, float feed_rate, - uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear) + uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc) #endif { float center_axis0 = position[axis_0] + offset[axis_0]; @@ -118,10 +99,10 @@ // CCW angle between position and target from circle center. Only one atan2() trig computation required. float angular_travel = atan2(r_axis0*rt_axis1-r_axis1*rt_axis0, r_axis0*rt_axis0+r_axis1*rt_axis1); - if (gc_state.modal.motion == MOTION_MODE_CW_ARC) { // Correct atan2 output per direction - if (angular_travel >= 0) { angular_travel -= 2*M_PI; } + if (is_clockwise_arc) { // Correct atan2 output per direction + if (angular_travel >= -ARC_ANGULAR_TRAVEL_EPSILON) { angular_travel -= 2*M_PI; } } else { - if (angular_travel <= 0) { angular_travel += 2*M_PI; } + if (angular_travel <= ARC_ANGULAR_TRAVEL_EPSILON) { angular_travel += 2*M_PI; } } // NOTE: Segment end points are on the arc, which can lead to the arc diameter being smaller by up to @@ -227,8 +208,8 @@ void mc_dwell(float seconds) protocol_buffer_synchronize(); delay_ms(floor(1000*seconds-i*DWELL_TIME_STEP)); // Delay millisecond remainder. while (i-- > 0) { - // NOTE: Check and execute runtime commands during dwell every <= DWELL_TIME_STEP milliseconds. - protocol_execute_runtime(); + // NOTE: Check and execute realtime commands during dwell every <= DWELL_TIME_STEP milliseconds. + protocol_execute_realtime(); if (sys.abort) { return; } _delay_ms(DWELL_TIME_STEP); // Delay DWELL_TIME_STEP increment } @@ -240,7 +221,17 @@ void mc_dwell(float seconds) // executing the homing cycle. This prevents incorrect buffered plans after homing. void mc_homing_cycle() { - sys.state = STATE_HOMING; // Set system state variable + // Check and abort homing cycle, if hard limits are already enabled. Helps prevent problems + // with machines with limits wired on both ends of travel to one limit pin. + // TODO: Move the pin-specific LIMIT_PIN call to limits.c as a function. + #ifdef LIMITS_TWO_SWITCHES_ON_AXES + if (limits_get_state()) { + mc_reset(); // Issue system reset and ensure spindle and coolant are shutdown. + bit_true_atomic(sys_rt_exec_alarm, (EXEC_ALARM_HARD_LIMIT|EXEC_CRITICAL_EVENT)); + return; + } + #endif + limits_disable(); // Disable hard limits pin change register for cycle duration // ------------------------------------------------------------------------------------- @@ -255,7 +246,7 @@ void mc_homing_cycle() limits_go_home(HOMING_CYCLE_2); // Homing cycle 2 #endif - protocol_execute_runtime(); // Check for reset and set system abort. + protocol_execute_realtime(); // Check for reset and set system abort. if (sys.abort) { return; } // Did not complete. Alarm state set by mc_alarm. // Homing cycle complete! Setup system for normal operation. @@ -263,10 +254,6 @@ void mc_homing_cycle() // Gcode parser position was circumvented by the limits_go_home() routine, so sync position now. gc_sync_position(); - - // Set idle state after homing completes and before returning to main program. - sys.state = STATE_IDLE; - st_go_idle(); // Set idle state after homing completes // If hard limits feature enabled, re-enable hard limits pin change register after homing cycle. limits_init(); @@ -276,9 +263,11 @@ void mc_homing_cycle() // Perform tool length probe cycle. Requires probe switch. // NOTE: Upon probe failure, the program will be stopped and placed into ALARM state. #ifdef USE_LINE_NUMBERS - void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, int32_t line_number) + void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t is_probe_away, + uint8_t is_no_error, int32_t line_number) #else - void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate) + void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t is_probe_away, + uint8_t is_no_error) #endif { // TODO: Need to update this cycle so it obeys a non-auto cycle start. @@ -286,12 +275,16 @@ void mc_homing_cycle() // Finish all queued commands and empty planner buffer before starting probe cycle. protocol_buffer_synchronize(); - uint8_t auto_start_state = sys.auto_start; // Store run state + + // Initialize probing control variables + sys.probe_succeeded = false; // Re-initialize probe history before beginning cycle. + probe_configure_invert_mask(is_probe_away); // After syncing, check if probe is already triggered. If so, halt and issue alarm. - if (probe_get_state()) { - bit_true_atomic(sys.execute, EXEC_CRIT_EVENT); - protocol_execute_runtime(); + // NOTE: This probe initialization error applies to all probing cycles. + if ( probe_get_state() ) { // Check probe pin state. + bit_true_atomic(sys_rt_exec_alarm, EXEC_ALARM_PROBE_FAIL); + protocol_execute_realtime(); } if (sys.abort) { return; } // Return if system reset has been issued. @@ -302,45 +295,37 @@ void mc_homing_cycle() mc_line(target, feed_rate, invert_feed_rate); #endif - // Activate the probing monitor in the stepper module. - sys.probe_state = PROBE_ACTIVE; + // Activate the probing state monitor in the stepper module. + sys_probe_state = PROBE_ACTIVE; // Perform probing cycle. Wait here until probe is triggered or motion completes. - bit_true_atomic(sys.execute, EXEC_CYCLE_START); + bit_true_atomic(sys_rt_exec_state, EXEC_CYCLE_START); do { - protocol_execute_runtime(); + protocol_execute_realtime(); if (sys.abort) { return; } // Check for system abort - } while ((sys.state != STATE_IDLE) && (sys.state != STATE_QUEUED)); - - // Probing motion complete. If the probe has not been triggered, error out. - if (sys.probe_state == PROBE_ACTIVE) { bit_true_atomic(sys.execute, EXEC_CRIT_EVENT); } - protocol_execute_runtime(); // Check and execute run-time commands + } while (sys.state != STATE_IDLE); + + // Probing cycle complete! + + // Set state variables and error out, if the probe failed and cycle with error is enabled. + if (sys_probe_state == PROBE_ACTIVE) { + if (is_no_error) { memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS); } + else { bit_true_atomic(sys_rt_exec_alarm, EXEC_ALARM_PROBE_FAIL); } + } else { + sys.probe_succeeded = true; // Indicate to system the probing cycle completed successfully. + } + sys_probe_state = PROBE_OFF; // Ensure probe state monitor is disabled. + protocol_execute_realtime(); // Check and execute run-time commands if (sys.abort) { return; } // Check for system abort // Reset the stepper and planner buffers to remove the remainder of the probe motion. st_reset(); // Reest step segment buffer. plan_reset(); // Reset planner buffer. Zero planner positions. Ensure probing motion is cleared. plan_sync_position(); // Sync planner position to current machine position. - - // Pull-off triggered probe to the trigger location since we had to decelerate a little beyond - // it to stop the machine in a controlled manner. - uint8_t idx; - for(idx=0; idx. */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef motion_control_h #define motion_control_h + #define HOMING_CYCLE_LINE_NUMBER -1 // Execute linear motion in absolute millimeter coordinates. Feed rate given in millimeters/second @@ -40,14 +36,14 @@ void mc_line(float *target, float feed_rate, uint8_t invert_feed_rate); // Execute an arc in offset mode format. position == current xyz, target == target xyz, // offset == offset from current xyz, axis_XXX defines circle plane in tool space, axis_linear is -// the direction of helical travel, radius == circle radius, isclockwise boolean. Used +// the direction of helical travel, radius == circle radius, is_clockwise_arc boolean. Used // for vector transformation direction. #ifdef USE_LINE_NUMBERS void mc_arc(float *position, float *target, float *offset, float radius, float feed_rate, - uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, int32_t line_number); + uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc, int32_t line_number); #else void mc_arc(float *position, float *target, float *offset, float radius, float feed_rate, - uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear); + uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc); #endif // Dwell for a specific number of seconds @@ -58,9 +54,11 @@ void mc_homing_cycle(); // Perform tool length probe cycle. Requires probe switch. #ifdef USE_LINE_NUMBERS -void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, int32_t line_number); +void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t is_probe_away, + uint8_t is_no_error, int32_t line_number); #else -void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate); +void mc_probe_cycle(float *target, float feed_rate, uint8_t invert_feed_rate, uint8_t is_probe_away, + uint8_t is_no_error); #endif // Performs system reset. If in motion state, kills all motion and sets system alarm. diff --git a/nuts_bolts.c b/grbl/nuts_bolts.c similarity index 92% rename from nuts_bolts.c rename to grbl/nuts_bolts.c index 785372506..b33e2306d 100644 --- a/nuts_bolts.c +++ b/grbl/nuts_bolts.c @@ -1,8 +1,9 @@ /* nuts_bolts.c - Shared functions - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,15 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ - -#include "system.h" -#include "print.h" + +#include "grbl.h" #define MAX_INT_DIGITS 8 // Maximum number of digits in int32 (and float) diff --git a/nuts_bolts.h b/grbl/nuts_bolts.h similarity index 83% rename from nuts_bolts.h rename to grbl/nuts_bolts.h index 7e5a06bd8..882d33733 100644 --- a/nuts_bolts.h +++ b/grbl/nuts_bolts.h @@ -1,8 +1,9 @@ /* nuts_bolts.h - Header file for shared definitions, variables, and functions - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef nuts_bolts_h #define nuts_bolts_h @@ -30,15 +25,23 @@ #define false 0 #define true 1 +// Axis array index values. Must start with 0 and be continuous. #define N_AXIS 3 // Number of axes -#define X_AXIS 0 // Axis indexing value. Must start with 0 and be continuous. +#define X_AXIS 0 // Axis indexing value. #define Y_AXIS 1 #define Z_AXIS 2 // #define A_AXIS 3 +// CoreXY motor assignments. DO NOT ALTER. +// NOTE: If the A and B motor axis bindings are changed, this effects the CoreXY equations. +#ifdef COREXY + #define A_MOTOR X_AXIS // Must be X_AXIS + #define B_MOTOR Y_AXIS // Must be Y_AXIS +#endif + +// Conversions #define MM_PER_INCH (25.40) #define INCH_PER_MM (0.0393701) - #define TICKS_PER_MICROSECOND (F_CPU/1000000) // Useful macros diff --git a/planner.c b/grbl/planner.c similarity index 86% rename from planner.c rename to grbl/planner.c index 21e4181ff..1e0bd3551 100644 --- a/planner.c +++ b/grbl/planner.c @@ -1,8 +1,10 @@ /* planner.c - buffers movement commands and manages the acceleration profile plan - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + Copyright (c) 2011 Jens Geisler Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,20 +19,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon - Copyright (c) 2011 Jens Geisler -*/ - -#include "system.h" -#include "planner.h" -#include "protocol.h" -#include "stepper.h" -#include "settings.h" +#include "grbl.h" #define SOME_LARGE_VALUE 1.0E+38 // Used by rapids and acceleration maximization calculations. Just needs // to be larger than any feasible (mm/min)^2 or mm/sec^2 value. @@ -284,17 +274,36 @@ uint8_t plan_check_full_buffer() int32_t target_steps[N_AXIS]; float unit_vec[N_AXIS], delta_mm; uint8_t idx; + #ifdef COREXY + target_steps[A_MOTOR] = lround(target[A_MOTOR]*settings.steps_per_mm[A_MOTOR]); + target_steps[B_MOTOR] = lround(target[B_MOTOR]*settings.steps_per_mm[B_MOTOR]); + block->steps[A_MOTOR] = labs((target_steps[X_AXIS]-pl.position[X_AXIS]) + (target_steps[Y_AXIS]-pl.position[Y_AXIS])); + block->steps[B_MOTOR] = labs((target_steps[X_AXIS]-pl.position[X_AXIS]) - (target_steps[Y_AXIS]-pl.position[Y_AXIS])); + #endif + for (idx=0; idxsteps[idx] = labs(target_steps[idx]-pl.position[idx]); - block->step_event_count = max(block->step_event_count, block->steps[idx]); - - // Compute individual axes distance for move and prep unit vector calculations. + // Calculate target position in absolute steps, number of steps for each axis, and determine max step events. + // Also, compute individual axes distance for move and prep unit vector calculations. // NOTE: Computes true distance from converted step values. - delta_mm = (target_steps[idx] - pl.position[idx])/settings.steps_per_mm[idx]; + #ifdef COREXY + if ( !(idx == A_MOTOR) && !(idx == B_MOTOR) ) { + target_steps[idx] = lround(target[idx]*settings.steps_per_mm[idx]); + block->steps[idx] = labs(target_steps[idx]-pl.position[idx]); + } + block->step_event_count = max(block->step_event_count, block->steps[idx]); + if (idx == A_MOTOR) { + delta_mm = ((target_steps[X_AXIS]-pl.position[X_AXIS]) + (target_steps[Y_AXIS]-pl.position[Y_AXIS]))/settings.steps_per_mm[idx]; + } else if (idx == B_MOTOR) { + delta_mm = ((target_steps[X_AXIS]-pl.position[X_AXIS]) - (target_steps[Y_AXIS]-pl.position[Y_AXIS]))/settings.steps_per_mm[idx]; + } else { + delta_mm = (target_steps[idx] - pl.position[idx])/settings.steps_per_mm[idx]; + } + #else + target_steps[idx] = lround(target[idx]*settings.steps_per_mm[idx]); + block->steps[idx] = labs(target_steps[idx]-pl.position[idx]); + block->step_event_count = max(block->step_event_count, block->steps[idx]); + delta_mm = (target_steps[idx] - pl.position[idx])/settings.steps_per_mm[idx]; + #endif unit_vec[idx] = delta_mm; // Store unit vector numerator. Denominator computed later. // Set direction bits. Bit enabled always means direction is negative. @@ -311,7 +320,7 @@ uint8_t plan_check_full_buffer() // Adjust feed_rate value to mm/min depending on type of rate input (normal, inverse time, or rapids) // TODO: Need to distinguish a rapids vs feed move for overrides. Some flag of some sort. if (feed_rate < 0) { feed_rate = SOME_LARGE_VALUE; } // Scaled down to absolute max/rapids rate later - else if (invert_feed_rate) { feed_rate = block->millimeters/feed_rate; } + else if (invert_feed_rate) { feed_rate *= block->millimeters; } if (feed_rate < MINIMUM_FEED_RATE) { feed_rate = MINIMUM_FEED_RATE; } // Prevents step generation round-off condition. // Calculate the unit vector of the line move and the block maximum feed rate and acceleration scaled @@ -352,7 +361,7 @@ uint8_t plan_check_full_buffer() colinear with the circle center. The circular segment joining the two paths represents the path of centripetal acceleration. Solve for max velocity based on max acceleration about the radius of the circle, defined indirectly by junction deviation. This may be also viewed as - path width or max_jerk in the previous grbl version. This approach does not actually deviate + path width or max_jerk in the previous Grbl version. This approach does not actually deviate from path, but used as a robust way to compute cornering speeds, as it takes into account the nonlinearities of both the junction angle and junction velocity. @@ -369,12 +378,19 @@ uint8_t plan_check_full_buffer() change the overall maximum entry speed conditions of all blocks. */ // NOTE: Computed without any expensive trig, sin() or acos(), by trig half angle identity of cos(theta). - float sin_theta_d2 = sqrt(0.5*(1.0-junction_cos_theta)); // Trig half angle identity. Always positive. + if (junction_cos_theta > 0.99) { + // For a 0 degree acute junction, just set minimum junction speed. + block->max_junction_speed_sqr = MINIMUM_JUNCTION_SPEED*MINIMUM_JUNCTION_SPEED; + } else { + junction_cos_theta = max(junction_cos_theta,-0.99); // Check for numerical round-off to avoid divide by zero. + float sin_theta_d2 = sqrt(0.5*(1.0-junction_cos_theta)); // Trig half angle identity. Always positive. + + // TODO: Technically, the acceleration used in calculation needs to be limited by the minimum of the + // two junctions. However, this shouldn't be a significant problem except in extreme circumstances. + block->max_junction_speed_sqr = max( MINIMUM_JUNCTION_SPEED*MINIMUM_JUNCTION_SPEED, + (block->acceleration * settings.junction_deviation * sin_theta_d2)/(1.0-sin_theta_d2) ); - // TODO: Technically, the acceleration used in calculation needs to be limited by the minimum of the - // two junctions. However, this shouldn't be a significant problem except in extreme circumstances. - block->max_junction_speed_sqr = max( MINIMUM_JUNCTION_SPEED*MINIMUM_JUNCTION_SPEED, - (block->acceleration * settings.junction_deviation * sin_theta_d2)/(1.0-sin_theta_d2) ); + } } // Store block nominal speed @@ -403,9 +419,21 @@ uint8_t plan_check_full_buffer() // Reset the planner position vectors. Called by the system abort/initialization routine. void plan_sync_position() { + // TODO: For motor configurations not in the same coordinate frame as the machine position, + // this function needs to be updated to accomodate the difference. uint8_t idx; for (idx=0; idx. */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef planner_h #define planner_h diff --git a/print.c b/grbl/print.c similarity index 78% rename from print.c rename to grbl/print.c index b398e824a..f029c4ff0 100644 --- a/print.c +++ b/grbl/print.c @@ -1,8 +1,9 @@ /* print.c - Functions for formatting output strings - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,16 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ -#include "system.h" -#include "serial.h" -#include "settings.h" +#include "grbl.h" void printString(const char *s) @@ -67,42 +60,40 @@ void printPgmString(const char *s) // } -void print_uint8_base2(uint8_t n) +// Prints an uint8 variable with base and number of desired digits. +void print_unsigned_int8(uint8_t n, uint8_t base, uint8_t digits) { - unsigned char buf[8]; - uint8_t i = 0; + unsigned char buf[digits]; + uint8_t i = 0; - for (; i < 8; i++) { - buf[i] = n & 1; - n >>= 1; - } + for (; i < digits; i++) { + buf[i] = n % base ; + n /= base; + } - for (; i > 0; i--) - serial_write('0' + buf[i - 1]); + for (; i > 0; i--) + serial_write('0' + buf[i - 1]); } -void print_uint8_base10(uint8_t n) -{ - if (n == 0) { - serial_write('0'); - return; - } - - unsigned char buf[3]; - uint8_t i = 0; +// Prints an uint8 variable in base 2. +void print_uint8_base2(uint8_t n) { + print_unsigned_int8(n,2,8); +} - while (n > 0) { - buf[i++] = n % 10 + '0'; - n /= 10; - } - for (; i > 0; i--) - serial_write(buf[i - 1]); +// Prints an uint8 variable in base 10. +void print_uint8_base10(uint8_t n) +{ + uint8_t digits; + if (n < 10) { digits = 1; } + else if (n < 100) { digits = 2; } + else { digits = 3; } + print_unsigned_int8(n,10,digits); } -void print_uint32_base10(unsigned long n) +void print_uint32_base10(uint32_t n) { if (n == 0) { serial_write('0'); @@ -126,7 +117,7 @@ void printInteger(long n) { if (n < 0) { serial_write('-'); - print_uint32_base10((-n)); + print_uint32_base10(-n); } else { print_uint32_base10(n); } @@ -201,12 +192,13 @@ void printFloat_RateValue(float n) { void printFloat_SettingValue(float n) { printFloat(n,N_DECIMAL_SETTINGVALUE); } -// Debug tool to print free memory in bytes at the called point. Not used otherwise. -void printFreeMemory() -{ - extern int __heap_start, *__brkval; - uint16_t free; // Up to 64k values. - free = (int) &free - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); - printInteger((int32_t)free); - printString(" "); -} +// Debug tool to print free memory in bytes at the called point. +// NOTE: Keep commented unless using. Part of this function always gets compiled in. +// void printFreeMemory() +// { +// extern int __heap_start, *__brkval; +// uint16_t free; // Up to 64k values. +// free = (int) &free - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); +// printInteger((int32_t)free); +// printString(" "); +// } diff --git a/print.h b/grbl/print.h similarity index 82% rename from print.h rename to grbl/print.h index 845c80c3f..e6399aa9d 100644 --- a/print.h +++ b/grbl/print.h @@ -1,8 +1,9 @@ /* print.h - Functions for formatting output strings - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef print_h #define print_h @@ -36,8 +31,13 @@ void printInteger(long n); void print_uint32_base10(uint32_t n); +// Prints uint8 variable with base and number of desired digits. +void print_unsigned_int8(uint8_t n, uint8_t base, uint8_t digits); + +// Prints an uint8 variable in base 2. void print_uint8_base2(uint8_t n); +// Prints an uint8 variable in base 10. void print_uint8_base10(uint8_t n); void printFloat(float n, uint8_t decimal_places); diff --git a/probe.c b/grbl/probe.c similarity index 61% rename from probe.c rename to grbl/probe.c index 00dde4766..fc957566f 100644 --- a/probe.c +++ b/grbl/probe.c @@ -1,8 +1,8 @@ /* probe.c - code pertaining to probing methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2014 Sungeun K. Jeon + Copyright (c) 2014-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,11 +18,10 @@ along with Grbl. If not, see . */ -#include "system.h" -#include "settings.h" -#include "probe.h" +#include "grbl.h" -// Inverts the probe pin state depending on user settings. + +// Inverts the probe pin state depending on user settings and probing cycle mode. uint8_t probe_invert_mask; @@ -30,13 +29,23 @@ uint8_t probe_invert_mask; void probe_init() { PROBE_DDR &= ~(PROBE_MASK); // Configure as input pins - if (bit_istrue(settings.flags,BITFLAG_INVERT_PROBE_PIN)) { + #ifdef DISABLE_PROBE_PIN_PULL_UP PROBE_PORT &= ~(PROBE_MASK); // Normal low operation. Requires external pull-down. - probe_invert_mask = 0; - } else { + #else PROBE_PORT |= PROBE_MASK; // Enable internal pull-up resistors. Normal high operation. - probe_invert_mask = PROBE_MASK; - } + #endif + // probe_configure_invert_mask(false); // Initialize invert mask. Not required. Updated when in-use. +} + + +// Called by probe_init() and the mc_probe() routines. Sets up the probe pin invert mask to +// appropriately set the pin logic according to setting for normal-high/normal-low operation +// and the probing cycle modes for toward-workpiece/away-from-workpiece. +void probe_configure_invert_mask(uint8_t is_probe_away) +{ + probe_invert_mask = 0; // Initialize as zero. + if (bit_isfalse(settings.flags,BITFLAG_INVERT_PROBE_PIN)) { probe_invert_mask ^= PROBE_MASK; } + if (is_probe_away) { probe_invert_mask ^= PROBE_MASK; } } @@ -49,11 +58,11 @@ uint8_t probe_get_state() { return((PROBE_PIN & PROBE_MASK) ^ probe_invert_mask) // NOTE: This function must be extremely efficient as to not bog down the stepper ISR. void probe_state_monitor() { - if (sys.probe_state == PROBE_ACTIVE) { + if (sys_probe_state == PROBE_ACTIVE) { if (probe_get_state()) { - sys.probe_state = PROBE_OFF; + sys_probe_state = PROBE_OFF; memcpy(sys.probe_position, sys.position, sizeof(float)*N_AXIS); - bit_true(sys.execute, EXEC_FEED_HOLD); + bit_true(sys_rt_exec_state, EXEC_MOTION_CANCEL); } } } diff --git a/probe.h b/grbl/probe.h similarity index 65% rename from probe.h rename to grbl/probe.h index 81fb55bf2..81bd48696 100644 --- a/probe.h +++ b/grbl/probe.h @@ -1,8 +1,8 @@ /* probe.h - code pertaining to probing methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2014 Sungeun K. Jeon + Copyright (c) 2014-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,14 +22,18 @@ #define probe_h // Values that define the probing state machine. -#define PROBE_OFF 0 // No probing. (Must be zero.) +#define PROBE_OFF 0 // Probing disabled or not in use. (Must be zero.) #define PROBE_ACTIVE 1 // Actively watching the input pin. - // Probe pin initialization routine. void probe_init(); -// Returns probe pin state. +// Called by probe_init() and the mc_probe() routines. Sets up the probe pin invert mask to +// appropriately set the pin logic according to setting for normal-high/normal-low operation +// and the probing cycle modes for toward-workpiece/away-from-workpiece. +void probe_configure_invert_mask(uint8_t is_probe_away); + +// Returns probe pin state. Triggered = true. Called by gcode parser and probe state monitor. uint8_t probe_get_state(); // Monitors probe pin state and records the system position when detected. Called by the diff --git a/grbl/protocol.c b/grbl/protocol.c new file mode 100644 index 000000000..d07a43a62 --- /dev/null +++ b/grbl/protocol.c @@ -0,0 +1,401 @@ +/* + protocol.c - controls Grbl execution protocol and procedures + Part of Grbl + + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#include "grbl.h" + +// Define different comment types for pre-parsing. +#define COMMENT_NONE 0 +#define COMMENT_TYPE_PARENTHESES 1 +#define COMMENT_TYPE_SEMICOLON 2 + + +static char line[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated. + + +// Directs and executes one line of formatted input from protocol_process. While mostly +// incoming streaming g-code blocks, this also directs and executes Grbl internal commands, +// such as settings, initiating the homing cycle, and toggling switch states. +static void protocol_execute_line(char *line) +{ + protocol_execute_realtime(); // Runtime command check point. + if (sys.abort) { return; } // Bail to calling function upon system abort + + #ifdef REPORT_ECHO_LINE_RECEIVED + report_echo_line_received(line); + #endif + + if (line[0] == 0) { + // Empty or comment line. Send status message for syncing purposes. + report_status_message(STATUS_OK); + + } else if (line[0] == '$') { + // Grbl '$' system command + report_status_message(system_execute_line(line)); + + } else if (sys.state == STATE_ALARM) { + // Everything else is gcode. Block if in alarm mode. + report_status_message(STATUS_ALARM_LOCK); + + } else { + // Parse and execute g-code block! + report_status_message(gc_execute_line(line)); + } +} + + +/* + GRBL PRIMARY LOOP: +*/ +void protocol_main_loop() +{ + // ------------------------------------------------------------ + // Complete initialization procedures upon a power-up or reset. + // ------------------------------------------------------------ + + // Print welcome message + report_init_message(); + + // Check for and report alarm state after a reset, error, or an initial power up. + if (sys.state == STATE_ALARM) { + report_feedback_message(MESSAGE_ALARM_LOCK); + } else { + // All systems go! But first check for safety door. + if (system_check_safety_door_ajar()) { + bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); + protocol_execute_realtime(); // Enter safety door mode. Should return as IDLE state. + } else { + sys.state = STATE_IDLE; // Set system to ready. Clear all state flags. + } + system_execute_startup(line); // Execute startup script. + } + + // --------------------------------------------------------------------------------- + // Primary loop! Upon a system abort, this exits back to main() to reset the system. + // --------------------------------------------------------------------------------- + + uint8_t comment = COMMENT_NONE; + uint8_t char_counter = 0; + uint8_t c; + for (;;) { + + // Process one line of incoming serial data, as the data becomes available. Performs an + // initial filtering by removing spaces and comments and capitalizing all letters. + + // NOTE: While comment, spaces, and block delete(if supported) handling should technically + // be done in the g-code parser, doing it here helps compress the incoming data into Grbl's + // line buffer, which is limited in size. The g-code standard actually states a line can't + // exceed 256 characters, but the Arduino Uno does not have the memory space for this. + // With a better processor, it would be very easy to pull this initial parsing out as a + // seperate task to be shared by the g-code parser and Grbl's system commands. + + while((c = serial_read()) != SERIAL_NO_DATA) { + if ((c == '\n') || (c == '\r')) { // End of line reached + line[char_counter] = 0; // Set string termination character. + protocol_execute_line(line); // Line is complete. Execute it! + comment = COMMENT_NONE; + char_counter = 0; + } else { + if (comment != COMMENT_NONE) { + // Throw away all comment characters + if (c == ')') { + // End of comment. Resume line. But, not if semicolon type comment. + if (comment == COMMENT_TYPE_PARENTHESES) { comment = COMMENT_NONE; } + } + } else { + if (c <= ' ') { + // Throw away whitepace and control characters + } else if (c == '/') { + // Block delete NOT SUPPORTED. Ignore character. + // NOTE: If supported, would simply need to check the system if block delete is enabled. + } else if (c == '(') { + // Enable comments flag and ignore all characters until ')' or EOL. + // NOTE: This doesn't follow the NIST definition exactly, but is good enough for now. + // In the future, we could simply remove the items within the comments, but retain the + // comment control characters, so that the g-code parser can error-check it. + comment = COMMENT_TYPE_PARENTHESES; + } else if (c == ';') { + // NOTE: ';' comment to EOL is a LinuxCNC definition. Not NIST. + comment = COMMENT_TYPE_SEMICOLON; + + // TODO: Install '%' feature + // } else if (c == '%') { + // Program start-end percent sign NOT SUPPORTED. + // NOTE: This maybe installed to tell Grbl when a program is running vs manual input, + // where, during a program, the system auto-cycle start will continue to execute + // everything until the next '%' sign. This will help fix resuming issues with certain + // functions that empty the planner buffer to execute its task on-time. + + } else if (char_counter >= (LINE_BUFFER_SIZE-1)) { + // Detect line buffer overflow. Report error and reset line buffer. + report_status_message(STATUS_OVERFLOW); + comment = COMMENT_NONE; + char_counter = 0; + } else if (c >= 'a' && c <= 'z') { // Upcase lowercase + line[char_counter++] = c-'a'+'A'; + } else { + line[char_counter++] = c; + } + } + } + } + + // If there are no more characters in the serial read buffer to be processed and executed, + // this indicates that g-code streaming has either filled the planner buffer or has + // completed. In either case, auto-cycle start, if enabled, any queued moves. + protocol_auto_cycle_start(); + + protocol_execute_realtime(); // Runtime command check point. + if (sys.abort) { return; } // Bail to main() program loop to reset system. + + } + + return; /* Never reached */ +} + + +// Executes run-time commands, when required. This is called from various check points in the main +// program, primarily where there may be a while loop waiting for a buffer to clear space or any +// point where the execution time from the last check point may be more than a fraction of a second. +// This is a way to execute realtime commands asynchronously (aka multitasking) with grbl's g-code +// parsing and planning functions. This function also serves as an interface for the interrupts to +// set the system realtime flags, where only the main program handles them, removing the need to +// define more computationally-expensive volatile variables. This also provides a controlled way to +// execute certain tasks without having two or more instances of the same task, such as the planner +// recalculating the buffer upon a feedhold or override. +// NOTE: The sys_rt_exec_state variable flags are set by any process, step or serial interrupts, pinouts, +// limit switches, or the main program. +void protocol_execute_realtime() +{ + uint8_t rt_exec; // Temp variable to avoid calling volatile multiple times. + + do { // If system is suspended, suspend loop restarts here. + + // Check and execute alarms. + rt_exec = sys_rt_exec_alarm; // Copy volatile sys_rt_exec_alarm. + if (rt_exec) { // Enter only if any bit flag is true + // System alarm. Everything has shutdown by something that has gone severely wrong. Report + // the source of the error to the user. If critical, Grbl disables by entering an infinite + // loop until system reset/abort. + sys.state = STATE_ALARM; // Set system alarm state + if (rt_exec & EXEC_ALARM_HARD_LIMIT) { + report_alarm_message(ALARM_HARD_LIMIT_ERROR); + } else if (rt_exec & EXEC_ALARM_SOFT_LIMIT) { + report_alarm_message(ALARM_SOFT_LIMIT_ERROR); + } else if (rt_exec & EXEC_ALARM_ABORT_CYCLE) { + report_alarm_message(ALARM_ABORT_CYCLE); + } else if (rt_exec & EXEC_ALARM_PROBE_FAIL) { + report_alarm_message(ALARM_PROBE_FAIL); + } else if (rt_exec & EXEC_ALARM_HOMING_FAIL) { + report_alarm_message(ALARM_HOMING_FAIL); + } + // Halt everything upon a critical event flag. Currently hard and soft limits flag this. + if (rt_exec & EXEC_CRITICAL_EVENT) { + report_feedback_message(MESSAGE_CRITICAL_EVENT); + bit_false_atomic(sys_rt_exec_state,EXEC_RESET); // Disable any existing reset + do { + // Nothing. Block EVERYTHING until user issues reset or power cycles. Hard limits + // typically occur while unattended or not paying attention. Gives the user time + // to do what is needed before resetting, like killing the incoming stream. The + // same could be said about soft limits. While the position is not lost, the incoming + // stream could be still engaged and cause a serious crash if it continues afterwards. + + // TODO: Allow status reports during a critical alarm. Still need to think about implications of this. +// if (sys_rt_exec_state & EXEC_STATUS_REPORT) { +// report_realtime_status(); +// bit_false_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT); +// } + } while (bit_isfalse(sys_rt_exec_state,EXEC_RESET)); + } + bit_false_atomic(sys_rt_exec_alarm,0xFF); // Clear all alarm flags + } + + // Check amd execute realtime commands + rt_exec = sys_rt_exec_state; // Copy volatile sys_rt_exec_state. + if (rt_exec) { // Enter only if any bit flag is true + + // Execute system abort. + if (rt_exec & EXEC_RESET) { + sys.abort = true; // Only place this is set true. + return; // Nothing else to do but exit. + } + + // Execute and serial print status + if (rt_exec & EXEC_STATUS_REPORT) { + report_realtime_status(); + bit_false_atomic(sys_rt_exec_state,EXEC_STATUS_REPORT); + } + + // Execute hold states. + // NOTE: The math involved to calculate the hold should be low enough for most, if not all, + // operational scenarios. Once hold is initiated, the system enters a suspend state to block + // all main program processes until either reset or resumed. + if (rt_exec & (EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR)) { + + // TODO: CHECK MODE? How to handle this? Likely nothing, since it only works when IDLE and then resets Grbl. + + // State check for allowable states for hold methods. + if ((sys.state == STATE_IDLE) || (sys.state & (STATE_CYCLE | STATE_HOMING | STATE_MOTION_CANCEL | STATE_HOLD | STATE_SAFETY_DOOR))) { + + // If in CYCLE state, all hold states immediately initiate a motion HOLD. + if (sys.state == STATE_CYCLE) { + st_update_plan_block_parameters(); // Notify stepper module to recompute for hold deceleration. + sys.suspend = SUSPEND_ENABLE_HOLD; // Initiate holding cycle with flag. + } + // If IDLE, Grbl is not in motion. Simply indicate suspend ready state. + if (sys.state == STATE_IDLE) { sys.suspend = SUSPEND_ENABLE_READY; } + + // Execute and flag a motion cancel with deceleration and return to idle. Used primarily by probing cycle + // to halt and cancel the remainder of the motion. + if (rt_exec & EXEC_MOTION_CANCEL) { + // MOTION_CANCEL only occurs during a CYCLE, but a HOLD and SAFETY_DOOR may been initiated beforehand + // to hold the CYCLE. If so, only flag that motion cancel is complete. + if (sys.state == STATE_CYCLE) { sys.state = STATE_MOTION_CANCEL; } + sys.suspend |= SUSPEND_MOTION_CANCEL; // Indicate motion cancel when resuming. Special motion complete. + } + + // Execute a feed hold with deceleration, only during cycle. + if (rt_exec & EXEC_FEED_HOLD) { + // Block SAFETY_DOOR state from prematurely changing back to HOLD. + if (bit_isfalse(sys.state,STATE_SAFETY_DOOR)) { sys.state = STATE_HOLD; } + } + + // Execute a safety door stop with a feed hold, only during a cycle, and disable spindle/coolant. + // NOTE: Safety door differs from feed holds by stopping everything no matter state, disables powered + // devices (spindle/coolant), and blocks resuming until switch is re-engaged. The power-down is + // executed here, if IDLE, or when the CYCLE completes via the EXEC_CYCLE_STOP flag. + if (rt_exec & EXEC_SAFETY_DOOR) { + report_feedback_message(MESSAGE_SAFETY_DOOR_AJAR); + // If already in active, ready-to-resume HOLD, set CYCLE_STOP flag to force de-energize. + // NOTE: Only temporarily sets the 'rt_exec' variable, not the volatile 'rt_exec_state' variable. + if (sys.suspend & SUSPEND_ENABLE_READY) { bit_true(rt_exec,EXEC_CYCLE_STOP); } + sys.suspend |= SUSPEND_ENERGIZE; + sys.state = STATE_SAFETY_DOOR; + } + + } + bit_false_atomic(sys_rt_exec_state,(EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR)); + } + + // Execute a cycle start by starting the stepper interrupt to begin executing the blocks in queue. + if (rt_exec & EXEC_CYCLE_START) { + // Block if called at same time as the hold commands: feed hold, motion cancel, and safety door. + // Ensures auto-cycle-start doesn't resume a hold without an explicit user-input. + if (!(rt_exec & (EXEC_FEED_HOLD | EXEC_MOTION_CANCEL | EXEC_SAFETY_DOOR))) { + // Cycle start only when IDLE or when a hold is complete and ready to resume. + // NOTE: SAFETY_DOOR is implicitly blocked. It reverts to HOLD when the door is closed. + if ((sys.state == STATE_IDLE) || ((sys.state & (STATE_HOLD | STATE_MOTION_CANCEL)) && (sys.suspend & SUSPEND_ENABLE_READY))) { + // Re-energize powered components, if disabled by SAFETY_DOOR. + if (sys.suspend & SUSPEND_ENERGIZE) { + // Delayed Tasks: Restart spindle and coolant, delay to power-up, then resume cycle. + if (gc_state.modal.spindle != SPINDLE_DISABLE) { + spindle_set_state(gc_state.modal.spindle, gc_state.spindle_speed); + delay_ms(SAFETY_DOOR_SPINDLE_DELAY); // TODO: Blocking function call. Need a non-blocking one eventually. + } + if (gc_state.modal.coolant != COOLANT_DISABLE) { + coolant_set_state(gc_state.modal.coolant); + delay_ms(SAFETY_DOOR_COOLANT_DELAY); // TODO: Blocking function call. Need a non-blocking one eventually. + } + // TODO: Install return to pre-park position. + } + // Start cycle only if queued motions exist in planner buffer and the motion is not canceled. + if (plan_get_current_block() && bit_isfalse(sys.suspend,SUSPEND_MOTION_CANCEL)) { + sys.state = STATE_CYCLE; + st_prep_buffer(); // Initialize step segment buffer before beginning cycle. + st_wake_up(); + } else { // Otherwise, do nothing. Set and resume IDLE state. + sys.state = STATE_IDLE; + } + sys.suspend = SUSPEND_DISABLE; // Break suspend state. + } + } + bit_false_atomic(sys_rt_exec_state,EXEC_CYCLE_START); + } + + // Reinitializes the cycle plan and stepper system after a feed hold for a resume. Called by + // realtime command execution in the main program, ensuring that the planner re-plans safely. + // NOTE: Bresenham algorithm variables are still maintained through both the planner and stepper + // cycle reinitializations. The stepper path should continue exactly as if nothing has happened. + // NOTE: EXEC_CYCLE_STOP is set by the stepper subsystem when a cycle or feed hold completes. + if (rt_exec & EXEC_CYCLE_STOP) { + if (sys.state & (STATE_HOLD | STATE_SAFETY_DOOR)) { + // Hold complete. Set to indicate ready to resume. Remain in HOLD or DOOR states until user + // has issued a resume command or reset. + if (sys.suspend & SUSPEND_ENERGIZE) { // De-energize system if safety door has been opened. + spindle_stop(); + coolant_stop(); + // TODO: Install parking motion here. + } + bit_true(sys.suspend,SUSPEND_ENABLE_READY); + } else { // Motion is complete. Includes CYCLE, HOMING, and MOTION_CANCEL states. + sys.suspend = SUSPEND_DISABLE; + sys.state = STATE_IDLE; + } + bit_false_atomic(sys_rt_exec_state,EXEC_CYCLE_STOP); + } + + } + + // Overrides flag byte (sys.override) and execution should be installed here, since they + // are realtime and require a direct and controlled interface to the main stepper program. + + // Reload step segment buffer + if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_MOTION_CANCEL | STATE_SAFETY_DOOR | STATE_HOMING)) { st_prep_buffer(); } + + // If safety door was opened, actively check when safety door is closed and ready to resume. + // NOTE: This unlocks the SAFETY_DOOR state to a HOLD state, such that CYCLE_START can activate a resume. + if (sys.state == STATE_SAFETY_DOOR) { + if (bit_istrue(sys.suspend,SUSPEND_ENABLE_READY)) { + if (!(system_check_safety_door_ajar())) { + sys.state = STATE_HOLD; // Update to HOLD state to indicate door is closed and ready to resume. + } + } + } + + } while(sys.suspend); // Check for system suspend state before exiting. + +} + + +// Block until all buffered steps are executed or in a cycle state. Works with feed hold +// during a synchronize call, if it should happen. Also, waits for clean cycle end. +void protocol_buffer_synchronize() +{ + // If system is queued, ensure cycle resumes if the auto start flag is present. + protocol_auto_cycle_start(); + do { + protocol_execute_realtime(); // Check and execute run-time commands + if (sys.abort) { return; } // Check for system abort + } while (plan_get_current_block() || (sys.state == STATE_CYCLE)); +} + + +// Auto-cycle start has two purposes: 1. Resumes a plan_synchronize() call from a function that +// requires the planner buffer to empty (spindle enable, dwell, etc.) 2. As a user setting that +// automatically begins the cycle when a user enters a valid motion command manually. This is +// intended as a beginners feature to help new users to understand g-code. It can be disabled +// as a beginner tool, but (1.) still operates. If disabled, the operation of cycle start is +// manually issuing a cycle start command whenever the user is ready and there is a valid motion +// command in the planner queue. +// NOTE: This function is called from the main loop, buffer sync, and mc_line() only and executes +// when one of these conditions exist respectively: There are no more blocks sent (i.e. streaming +// is finished, single commands), a command that needs to wait for the motions in the buffer to +// execute calls a buffer sync, or the planner buffer is full and ready to go. +void protocol_auto_cycle_start() { bit_true_atomic(sys_rt_exec_state, EXEC_CYCLE_START); } diff --git a/protocol.h b/grbl/protocol.h similarity index 82% rename from protocol.h rename to grbl/protocol.h index 5a752fd1a..3fc3780d6 100644 --- a/protocol.h +++ b/grbl/protocol.h @@ -1,8 +1,9 @@ /* protocol.h - controls Grbl execution protocol and procedures - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef protocol_h #define protocol_h @@ -41,8 +36,8 @@ // them as they complete. It is also responsible for finishing the initialization procedures. void protocol_main_loop(); -// Checks and executes a runtime command at various stop points in main program -void protocol_execute_runtime(); +// Checks and executes a realtime command at various stop points in main program +void protocol_execute_realtime(); // Notify the stepper subsystem to start executing the g-code program in buffer. // void protocol_cycle_start(); diff --git a/report.c b/grbl/report.c similarity index 51% rename from report.c rename to grbl/report.c index 32720ebfb..152fabe40 100644 --- a/report.c +++ b/grbl/report.c @@ -1,8 +1,8 @@ /* report.c - reporting and messaging methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2012-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,16 +26,7 @@ methods to accomodate their needs. */ -#include "system.h" -#include "report.h" -#include "print.h" -#include "settings.h" -#include "gcode.h" -#include "coolant_control.h" -#include "planner.h" -#include "spindle_control.h" -#include "stepper.h" -#include "serial.h" +#include "grbl.h" // Handles the primary confirmation protocol response for streaming interfaces and human-feedback. @@ -52,42 +43,49 @@ void report_status_message(uint8_t status_code) printPgmString(PSTR("ok\r\n")); } else { printPgmString(PSTR("error: ")); - switch(status_code) { - case STATUS_EXPECTED_COMMAND_LETTER: - printPgmString(PSTR("Expected command letter")); break; - case STATUS_BAD_NUMBER_FORMAT: - printPgmString(PSTR("Bad number format")); break; - case STATUS_INVALID_STATEMENT: - printPgmString(PSTR("Invalid statement")); break; - case STATUS_NEGATIVE_VALUE: - printPgmString(PSTR("Value < 0")); break; - case STATUS_SETTING_DISABLED: - printPgmString(PSTR("Setting disabled")); break; - case STATUS_SETTING_STEP_PULSE_MIN: - printPgmString(PSTR("Value < 3 usec")); break; - case STATUS_SETTING_READ_FAIL: - printPgmString(PSTR("EEPROM read fail. Using defaults")); break; - case STATUS_IDLE_ERROR: - printPgmString(PSTR("Not idle")); break; - case STATUS_ALARM_LOCK: - printPgmString(PSTR("Alarm lock")); break; - case STATUS_SOFT_LIMIT_ERROR: - printPgmString(PSTR("Homing not enabled")); break; - case STATUS_OVERFLOW: - printPgmString(PSTR("Line overflow")); break; - - // Common g-code parser errors. - case STATUS_GCODE_MODAL_GROUP_VIOLATION: - printPgmString(PSTR("Modal group violation")); break; - case STATUS_GCODE_UNSUPPORTED_COMMAND: - printPgmString(PSTR("Unsupported command")); break; - case STATUS_GCODE_UNDEFINED_FEED_RATE: - printPgmString(PSTR("Undefined feed rate")); break; - default: - // Remaining g-code parser errors with error codes - printPgmString(PSTR("Invalid gcode ID:")); - print_uint8_base10(status_code); // Print error code for user reference - } + #ifdef REPORT_GUI_MODE + print_uint8_base10(status_code); + #else + switch(status_code) { + case STATUS_EXPECTED_COMMAND_LETTER: + printPgmString(PSTR("Expected command letter")); break; + case STATUS_BAD_NUMBER_FORMAT: + printPgmString(PSTR("Bad number format")); break; + case STATUS_INVALID_STATEMENT: + printPgmString(PSTR("Invalid statement")); break; + case STATUS_NEGATIVE_VALUE: + printPgmString(PSTR("Value < 0")); break; + case STATUS_SETTING_DISABLED: + printPgmString(PSTR("Setting disabled")); break; + case STATUS_SETTING_STEP_PULSE_MIN: + printPgmString(PSTR("Value < 3 usec")); break; + case STATUS_SETTING_READ_FAIL: + printPgmString(PSTR("EEPROM read fail. Using defaults")); break; + case STATUS_IDLE_ERROR: + printPgmString(PSTR("Not idle")); break; + case STATUS_ALARM_LOCK: + printPgmString(PSTR("Alarm lock")); break; + case STATUS_SOFT_LIMIT_ERROR: + printPgmString(PSTR("Homing not enabled")); break; + case STATUS_OVERFLOW: + printPgmString(PSTR("Line overflow")); break; + #ifdef MAX_STEP_RATE_HZ + case STATUS_MAX_STEP_RATE_EXCEEDED: + printPgmString(PSTR("Step rate > 30kHz")); break; + #endif + // Common g-code parser errors. + case STATUS_GCODE_MODAL_GROUP_VIOLATION: + printPgmString(PSTR("Modal group violation")); break; + case STATUS_GCODE_UNSUPPORTED_COMMAND: + printPgmString(PSTR("Unsupported command")); break; + case STATUS_GCODE_UNDEFINED_FEED_RATE: + printPgmString(PSTR("Undefined feed rate")); break; + default: + // Remaining g-code parser errors with error codes + printPgmString(PSTR("Invalid gcode ID:")); + print_uint8_base10(status_code); // Print error code for user reference + } + #endif printPgmString(PSTR("\r\n")); } } @@ -96,14 +94,22 @@ void report_status_message(uint8_t status_code) void report_alarm_message(int8_t alarm_code) { printPgmString(PSTR("ALARM: ")); - switch (alarm_code) { - case ALARM_LIMIT_ERROR: - printPgmString(PSTR("Hard/soft limit")); break; - case ALARM_ABORT_CYCLE: - printPgmString(PSTR("Abort during cycle")); break; - case ALARM_PROBE_FAIL: - printPgmString(PSTR("Probe fail")); break; - } + #ifdef REPORT_GUI_MODE + print_uint8_base10(alarm_code); + #else + switch (alarm_code) { + case ALARM_HARD_LIMIT_ERROR: + printPgmString(PSTR("Hard limit")); break; + case ALARM_SOFT_LIMIT_ERROR: + printPgmString(PSTR("Soft limit")); break; + case ALARM_ABORT_CYCLE: + printPgmString(PSTR("Abort during cycle")); break; + case ALARM_PROBE_FAIL: + printPgmString(PSTR("Probe fail")); break; + case ALARM_HOMING_FAIL: + printPgmString(PSTR("Homing fail")); break; + } + #endif printPgmString(PSTR("\r\n")); delay_ms(500); // Force delay to ensure message clears serial write buffer. } @@ -128,6 +134,12 @@ void report_feedback_message(uint8_t message_code) printPgmString(PSTR("Enabled")); break; case MESSAGE_DISABLED: printPgmString(PSTR("Disabled")); break; + case MESSAGE_SAFETY_DOOR_AJAR: + printPgmString(PSTR("Check Door")); break; + case MESSAGE_PROGRAM_END: + printPgmString(PSTR("Pgm End")); break; + case MESSAGE_RESTORE_DEFAULTS: + printPgmString(PSTR("Restoring defaults")); break; } printPgmString(PSTR("]\r\n")); } @@ -141,20 +153,22 @@ void report_init_message() // Grbl help message void report_grbl_help() { - printPgmString(PSTR("$$ (view Grbl settings)\r\n" - "$# (view # parameters)\r\n" - "$G (view parser state)\r\n" - "$I (view build info)\r\n" - "$N (view startup blocks)\r\n" - "$x=value (save Grbl setting)\r\n" - "$Nx=line (save startup block)\r\n" - "$C (check gcode mode)\r\n" - "$X (kill alarm lock)\r\n" - "$H (run homing cycle)\r\n" - "~ (cycle start)\r\n" - "! (feed hold)\r\n" - "? (current status)\r\n" - "ctrl-x (reset Grbl)\r\n")); + #ifndef REPORT_GUI_MODE + printPgmString(PSTR("$$ (view Grbl settings)\r\n" + "$# (view # parameters)\r\n" + "$G (view parser state)\r\n" + "$I (view build info)\r\n" + "$N (view startup blocks)\r\n" + "$x=value (save Grbl setting)\r\n" + "$Nx=line (save startup block)\r\n" + "$C (check gcode mode)\r\n" + "$X (kill alarm lock)\r\n" + "$H (run homing cycle)\r\n" + "~ (cycle start)\r\n" + "! (feed hold)\r\n" + "? (current status)\r\n" + "ctrl-x (reset Grbl)\r\n")); + #endif } @@ -162,32 +176,54 @@ void report_grbl_help() { // NOTE: The numbering scheme here must correlate to storing in settings.c void report_grbl_settings() { // Print Grbl settings. - printPgmString(PSTR("$0=")); print_uint8_base10(settings.pulse_microseconds); - printPgmString(PSTR(" (step pulse, usec)\r\n$1=")); print_uint8_base10(settings.stepper_idle_lock_time); - printPgmString(PSTR(" (step idle delay, msec)\r\n$2=")); print_uint8_base10(settings.step_invert_mask); - printPgmString(PSTR(" (step port invert mask:")); print_uint8_base2(settings.step_invert_mask); - printPgmString(PSTR(")\r\n$3=")); print_uint8_base10(settings.dir_invert_mask); - printPgmString(PSTR(" (dir port invert mask:")); print_uint8_base2(settings.dir_invert_mask); - printPgmString(PSTR(")\r\n$4=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)); - printPgmString(PSTR(" (step enable invert, bool)\r\n$5=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)); - printPgmString(PSTR(" (limit pins invert, bool)\r\n$6=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_PROBE_PIN)); - printPgmString(PSTR(" (probe pin invert, bool)\r\n$10=")); print_uint8_base10(settings.status_report_mask); - printPgmString(PSTR(" (status report mask:")); print_uint8_base2(settings.status_report_mask); - printPgmString(PSTR(")\r\n$11=")); printFloat_SettingValue(settings.junction_deviation); - printPgmString(PSTR(" (junction deviation, mm)\r\n$12=")); printFloat_SettingValue(settings.arc_tolerance); - printPgmString(PSTR(" (arc tolerance, mm)\r\n$13=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_REPORT_INCHES)); - printPgmString(PSTR(" (report inches, bool)\r\n$14=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_AUTO_START)); - printPgmString(PSTR(" (auto start, bool)\r\n$20=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE)); - printPgmString(PSTR(" (soft limits, bool)\r\n$21=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)); - printPgmString(PSTR(" (hard limits, bool)\r\n$22=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)); - printPgmString(PSTR(" (homing cycle, bool)\r\n$23=")); print_uint8_base10(settings.homing_dir_mask); - printPgmString(PSTR(" (homing dir invert mask:")); print_uint8_base2(settings.homing_dir_mask); - printPgmString(PSTR(")\r\n$24=")); printFloat_SettingValue(settings.homing_feed_rate); - printPgmString(PSTR(" (homing feed, mm/min)\r\n$25=")); printFloat_SettingValue(settings.homing_seek_rate); - printPgmString(PSTR(" (homing seek, mm/min)\r\n$26=")); print_uint8_base10(settings.homing_debounce_delay); - printPgmString(PSTR(" (homing debounce, msec)\r\n$27=")); printFloat_SettingValue(settings.homing_pulloff); - printPgmString(PSTR(" (homing pull-off, mm)\r\n")); - + #ifdef REPORT_GUI_MODE + printPgmString(PSTR("$0=")); print_uint8_base10(settings.pulse_microseconds); + printPgmString(PSTR("\r\n$1=")); print_uint8_base10(settings.stepper_idle_lock_time); + printPgmString(PSTR("\r\n$2=")); print_uint8_base10(settings.step_invert_mask); + printPgmString(PSTR("\r\n$3=")); print_uint8_base10(settings.dir_invert_mask); + printPgmString(PSTR("\r\n$4=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)); + printPgmString(PSTR("\r\n$5=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)); + printPgmString(PSTR("\r\n$6=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_PROBE_PIN)); + printPgmString(PSTR("\r\n$10=")); print_uint8_base10(settings.status_report_mask); + printPgmString(PSTR("\r\n$11=")); printFloat_SettingValue(settings.junction_deviation); + printPgmString(PSTR("\r\n$12=")); printFloat_SettingValue(settings.arc_tolerance); + printPgmString(PSTR("\r\n$13=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_REPORT_INCHES)); + printPgmString(PSTR("\r\n$20=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE)); + printPgmString(PSTR("\r\n$21=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)); + printPgmString(PSTR("\r\n$22=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)); + printPgmString(PSTR("\r\n$23=")); print_uint8_base10(settings.homing_dir_mask); + printPgmString(PSTR("\r\n$24=")); printFloat_SettingValue(settings.homing_feed_rate); + printPgmString(PSTR("\r\n$25=")); printFloat_SettingValue(settings.homing_seek_rate); + printPgmString(PSTR("\r\n$26=")); print_uint8_base10(settings.homing_debounce_delay); + printPgmString(PSTR("\r\n$27=")); printFloat_SettingValue(settings.homing_pulloff); + printPgmString(PSTR("\r\n")); + #else + printPgmString(PSTR("$0=")); print_uint8_base10(settings.pulse_microseconds); + printPgmString(PSTR(" (step pulse, usec)\r\n$1=")); print_uint8_base10(settings.stepper_idle_lock_time); + printPgmString(PSTR(" (step idle delay, msec)\r\n$2=")); print_uint8_base10(settings.step_invert_mask); + printPgmString(PSTR(" (step port invert mask:")); print_uint8_base2(settings.step_invert_mask); + printPgmString(PSTR(")\r\n$3=")); print_uint8_base10(settings.dir_invert_mask); + printPgmString(PSTR(" (dir port invert mask:")); print_uint8_base2(settings.dir_invert_mask); + printPgmString(PSTR(")\r\n$4=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)); + printPgmString(PSTR(" (step enable invert, bool)\r\n$5=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)); + printPgmString(PSTR(" (limit pins invert, bool)\r\n$6=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_INVERT_PROBE_PIN)); + printPgmString(PSTR(" (probe pin invert, bool)\r\n$10=")); print_uint8_base10(settings.status_report_mask); + printPgmString(PSTR(" (status report mask:")); print_uint8_base2(settings.status_report_mask); + printPgmString(PSTR(")\r\n$11=")); printFloat_SettingValue(settings.junction_deviation); + printPgmString(PSTR(" (junction deviation, mm)\r\n$12=")); printFloat_SettingValue(settings.arc_tolerance); + printPgmString(PSTR(" (arc tolerance, mm)\r\n$13=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_REPORT_INCHES)); + printPgmString(PSTR(" (report inches, bool)\r\n$20=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE)); + printPgmString(PSTR(" (soft limits, bool)\r\n$21=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)); + printPgmString(PSTR(" (hard limits, bool)\r\n$22=")); print_uint8_base10(bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)); + printPgmString(PSTR(" (homing cycle, bool)\r\n$23=")); print_uint8_base10(settings.homing_dir_mask); + printPgmString(PSTR(" (homing dir invert mask:")); print_uint8_base2(settings.homing_dir_mask); + printPgmString(PSTR(")\r\n$24=")); printFloat_SettingValue(settings.homing_feed_rate); + printPgmString(PSTR(" (homing feed, mm/min)\r\n$25=")); printFloat_SettingValue(settings.homing_seek_rate); + printPgmString(PSTR(" (homing seek, mm/min)\r\n$26=")); print_uint8_base10(settings.homing_debounce_delay); + printPgmString(PSTR(" (homing debounce, msec)\r\n$27=")); printFloat_SettingValue(settings.homing_pulloff); + printPgmString(PSTR(" (homing pull-off, mm)\r\n")); + #endif + // Print axis settings uint8_t idx, set_idx; uint8_t val = AXIS_SETTINGS_START_VAL; @@ -202,19 +238,23 @@ void report_grbl_settings() { case 2: printFloat_SettingValue(settings.acceleration[idx]/(60*60)); break; case 3: printFloat_SettingValue(-settings.max_travel[idx]); break; } - printPgmString(PSTR(" (")); - switch (idx) { - case X_AXIS: printPgmString(PSTR("x")); break; - case Y_AXIS: printPgmString(PSTR("y")); break; - case Z_AXIS: printPgmString(PSTR("z")); break; - } - switch (set_idx) { - case 0: printPgmString(PSTR(", step/mm")); break; - case 1: printPgmString(PSTR(" max rate, mm/min")); break; - case 2: printPgmString(PSTR(" accel, mm/sec^2")); break; - case 3: printPgmString(PSTR(" max travel, mm")); break; - } - printPgmString(PSTR(")\r\n")); + #ifdef REPORT_GUI_MODE + printPgmString(PSTR("\r\n")); + #else + printPgmString(PSTR(" (")); + switch (idx) { + case X_AXIS: printPgmString(PSTR("x")); break; + case Y_AXIS: printPgmString(PSTR("y")); break; + case Z_AXIS: printPgmString(PSTR("z")); break; + } + switch (set_idx) { + case 0: printPgmString(PSTR(", step/mm")); break; + case 1: printPgmString(PSTR(" max rate, mm/min")); break; + case 2: printPgmString(PSTR(" accel, mm/sec^2")); break; + case 3: printPgmString(PSTR(" max travel, mm")); break; + } + printPgmString(PSTR(")\r\n")); + #endif } val += AXIS_SETTINGS_INCREMENT; } @@ -230,12 +270,14 @@ void report_probe_parameters() float print_position[N_AXIS]; // Report in terms of machine position. - printPgmString(PSTR("[PRB:")); + printPgmString(PSTR("[PRB:")); for (i=0; i< N_AXIS; i++) { - print_position[i] = sys.probe_position[i]/settings.steps_per_mm[i]; + print_position[i] = system_convert_axis_steps_to_mpos(sys.probe_position,i); printFloat_CoordValue(print_position[i]); if (i < (N_AXIS-1)) { printPgmString(PSTR(",")); } - } + } + printPgmString(PSTR(":")); + print_uint8_base10(sys.probe_succeeded); printPgmString(PSTR("]\r\n")); } @@ -279,12 +321,17 @@ void report_ngc_parameters() // Print current gcode parser mode state void report_gcode_modes() { + printPgmString(PSTR("[")); + switch (gc_state.modal.motion) { - case MOTION_MODE_SEEK : printPgmString(PSTR("[G0")); break; - case MOTION_MODE_LINEAR : printPgmString(PSTR("[G1")); break; - case MOTION_MODE_CW_ARC : printPgmString(PSTR("[G2")); break; - case MOTION_MODE_CCW_ARC : printPgmString(PSTR("[G3")); break; - case MOTION_MODE_NONE : printPgmString(PSTR("[G80")); break; + case MOTION_MODE_SEEK : printPgmString(PSTR("G0")); break; + case MOTION_MODE_LINEAR : printPgmString(PSTR("G1")); break; + case MOTION_MODE_CW_ARC : printPgmString(PSTR("G2")); break; + case MOTION_MODE_CCW_ARC : printPgmString(PSTR("G3")); break; + case MOTION_MODE_NONE : printPgmString(PSTR("G80")); break; + default: + printPgmString(PSTR("G38.")); + print_uint8_base10(gc_state.modal.motion - (MOTION_MODE_PROBE_TOWARD-2)); } printPgmString(PSTR(" G")); @@ -330,6 +377,11 @@ void report_gcode_modes() printPgmString(PSTR(" F")); printFloat_RateValue(gc_state.feed_rate); + + #ifdef VARIABLE_SPINDLE + printPgmString(PSTR(" S")); + printFloat_RateValue(gc_state.spindle_speed); + #endif printPgmString(PSTR("]\r\n")); } @@ -352,6 +404,15 @@ void report_build_info(char *line) } +// Prints the character string line Grbl has received from the user, which has been pre-parsed, +// and has been sent into protocol_execute_line() routine to be executed by Grbl. +void report_echo_line_received(char *line) +{ + printPgmString(PSTR("[echo: ")); printString(line); + printPgmString(PSTR("]\r\n")); +} + + // Prints real-time data. This function grabs a real-time snapshot of the stepper subprogram // and the actual location of the CNC machine. Users may change the following function to their // specific needs, but the desired real-time data report must be as short as possible. This is @@ -363,7 +424,7 @@ void report_realtime_status() // the system power on location (0,0,0) and work coordinate position (G54 and G92 applied). Eventually // to be added are distance to go on block, processed block id, and feed rate. Also a settings bitmask // for a user to select the desired real-time data. - uint8_t i; + uint8_t idx; int32_t current_position[N_AXIS]; // Copy current state of the system position variable memcpy(current_position,sys.position,sizeof(sys.position)); float print_position[N_AXIS]; @@ -371,42 +432,38 @@ void report_realtime_status() // Report current machine state switch (sys.state) { case STATE_IDLE: printPgmString(PSTR("\r\n")); } diff --git a/report.h b/grbl/report.h similarity index 85% rename from report.h rename to grbl/report.h index ffbdcc331..69a1d8318 100644 --- a/report.h +++ b/grbl/report.h @@ -1,8 +1,8 @@ /* report.h - reporting and messaging methods - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2012-2015 Sungeun K. Jeon Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,6 +33,7 @@ #define STATUS_ALARM_LOCK 9 #define STATUS_SOFT_LIMIT_ERROR 10 #define STATUS_OVERFLOW 11 +#define STATUS_MAX_STEP_RATE_EXCEEDED 12 #define STATUS_GCODE_UNSUPPORTED_COMMAND 20 #define STATUS_GCODE_MODAL_GROUP_VIOLATION 21 @@ -53,10 +54,12 @@ #define STATUS_GCODE_UNUSED_WORDS 36 #define STATUS_GCODE_G43_DYNAMIC_AXIS_ERROR 37 -// Define Grbl alarm codes. Less than zero to distinguish alarm error from status error. -#define ALARM_LIMIT_ERROR -1 -#define ALARM_ABORT_CYCLE -2 -#define ALARM_PROBE_FAIL -3 +// Define Grbl alarm codes. +#define ALARM_HARD_LIMIT_ERROR 1 +#define ALARM_SOFT_LIMIT_ERROR 2 +#define ALARM_ABORT_CYCLE 3 +#define ALARM_PROBE_FAIL 4 +#define ALARM_HOMING_FAIL 5 // Define Grbl feedback message codes. #define MESSAGE_CRITICAL_EVENT 1 @@ -64,6 +67,9 @@ #define MESSAGE_ALARM_UNLOCK 3 #define MESSAGE_ENABLED 4 #define MESSAGE_DISABLED 5 +#define MESSAGE_SAFETY_DOOR_AJAR 6 +#define MESSAGE_PROGRAM_END 7 +#define MESSAGE_RESTORE_DEFAULTS 8 // Prints system status messages. void report_status_message(uint8_t status_code); @@ -83,6 +89,9 @@ void report_grbl_help(); // Prints Grbl global settings void report_grbl_settings(); +// Prints an echo of the pre-parsed line received right before execution. +void report_echo_line_received(char *line); + // Prints realtime status report void report_realtime_status(); diff --git a/serial.c b/grbl/serial.c similarity index 85% rename from serial.c rename to grbl/serial.c index 8e7d50b9d..56f84e092 100644 --- a/serial.c +++ b/grbl/serial.c @@ -1,8 +1,9 @@ /* serial.c - Low level functions for sending and recieving bytes via the serial port - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,18 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ -#include -#include "system.h" -#include "serial.h" -#include "motion_control.h" -#include "protocol.h" +#include "grbl.h" uint8_t serial_rx_buffer[RX_BUFFER_SIZE]; @@ -98,7 +89,7 @@ void serial_write(uint8_t data) { // Wait until there is space in the buffer while (next_head == serial_tx_buffer_tail) { // TODO: Restructure st_prep_buffer() calls to be executed here during a long print. - if (sys.execute & EXEC_RESET) { return; } // Only check for abort to avoid an endless loop. + if (sys_rt_exec_state & EXEC_RESET) { return; } // Only check for abort to avoid an endless loop. } // Store data and advance head @@ -170,12 +161,13 @@ ISR(SERIAL_RX) uint8_t data = UDR0; uint8_t next_head; - // Pick off runtime command characters directly from the serial stream. These characters are - // not passed into the buffer, but these set system state flag bits for runtime execution. + // Pick off realtime command characters directly from the serial stream. These characters are + // not passed into the buffer, but these set system state flag bits for realtime execution. switch (data) { - case CMD_STATUS_REPORT: bit_true_atomic(sys.execute, EXEC_STATUS_REPORT); break; // Set as true - case CMD_CYCLE_START: bit_true_atomic(sys.execute, EXEC_CYCLE_START); break; // Set as true - case CMD_FEED_HOLD: bit_true_atomic(sys.execute, EXEC_FEED_HOLD); break; // Set as true + case CMD_STATUS_REPORT: bit_true_atomic(sys_rt_exec_state, EXEC_STATUS_REPORT); break; // Set as true + case CMD_CYCLE_START: bit_true_atomic(sys_rt_exec_state, EXEC_CYCLE_START); break; // Set as true + case CMD_FEED_HOLD: bit_true_atomic(sys_rt_exec_state, EXEC_FEED_HOLD); break; // Set as true + case CMD_SAFETY_DOOR: bit_true_atomic(sys_rt_exec_state, EXEC_SAFETY_DOOR); break; // Set as true case CMD_RESET: mc_reset(); break; // Call motion control reset routine. default: // Write character to buffer next_head = serial_rx_buffer_head + 1; diff --git a/serial.h b/grbl/serial.h similarity index 85% rename from serial.h rename to grbl/serial.h index c281949c5..b48fd35e4 100644 --- a/serial.h +++ b/grbl/serial.h @@ -1,8 +1,9 @@ /* serial.c - Low level functions for sending and recieving bytes via the serial port - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef serial_h #define serial_h diff --git a/settings.c b/grbl/settings.c similarity index 68% rename from settings.c rename to grbl/settings.c index 1a8044b8f..56690e823 100644 --- a/settings.c +++ b/grbl/settings.c @@ -1,8 +1,9 @@ /* settings.c - eeprom configuration handling - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,20 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ - -#include "system.h" -#include "settings.h" -#include "eeprom.h" -#include "protocol.h" -#include "report.h" -#include "limits.h" -#include "stepper.h" + +#include "grbl.h" settings_t settings; @@ -67,70 +56,65 @@ void write_global_settings() // Method to restore EEPROM-saved Grbl global settings back to defaults. -void settings_restore_global_settings() { - settings.pulse_microseconds = DEFAULT_STEP_PULSE_MICROSECONDS; - settings.stepper_idle_lock_time = DEFAULT_STEPPER_IDLE_LOCK_TIME; - settings.step_invert_mask = DEFAULT_STEPPING_INVERT_MASK; - settings.dir_invert_mask = DEFAULT_DIRECTION_INVERT_MASK; - settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK; - settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION; - settings.arc_tolerance = DEFAULT_ARC_TOLERANCE; - settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK; - settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE; - settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE; - settings.homing_debounce_delay = DEFAULT_HOMING_DEBOUNCE_DELAY; - settings.homing_pulloff = DEFAULT_HOMING_PULLOFF; - - settings.flags = 0; - if (DEFAULT_REPORT_INCHES) { settings.flags |= BITFLAG_REPORT_INCHES; } - if (DEFAULT_AUTO_START) { settings.flags |= BITFLAG_AUTO_START; } - if (DEFAULT_INVERT_ST_ENABLE) { settings.flags |= BITFLAG_INVERT_ST_ENABLE; } - if (DEFAULT_INVERT_LIMIT_PINS) { settings.flags |= BITFLAG_INVERT_LIMIT_PINS; } - if (DEFAULT_SOFT_LIMIT_ENABLE) { settings.flags |= BITFLAG_SOFT_LIMIT_ENABLE; } - if (DEFAULT_HARD_LIMIT_ENABLE) { settings.flags |= BITFLAG_HARD_LIMIT_ENABLE; } - if (DEFAULT_HOMING_ENABLE) { settings.flags |= BITFLAG_HOMING_ENABLE; } +void settings_restore(uint8_t restore_flag) { + if (restore_flag & SETTINGS_RESTORE_DEFAULTS) { + settings.pulse_microseconds = DEFAULT_STEP_PULSE_MICROSECONDS; + settings.stepper_idle_lock_time = DEFAULT_STEPPER_IDLE_LOCK_TIME; + settings.step_invert_mask = DEFAULT_STEPPING_INVERT_MASK; + settings.dir_invert_mask = DEFAULT_DIRECTION_INVERT_MASK; + settings.status_report_mask = DEFAULT_STATUS_REPORT_MASK; + settings.junction_deviation = DEFAULT_JUNCTION_DEVIATION; + settings.arc_tolerance = DEFAULT_ARC_TOLERANCE; + settings.homing_dir_mask = DEFAULT_HOMING_DIR_MASK; + settings.homing_feed_rate = DEFAULT_HOMING_FEED_RATE; + settings.homing_seek_rate = DEFAULT_HOMING_SEEK_RATE; + settings.homing_debounce_delay = DEFAULT_HOMING_DEBOUNCE_DELAY; + settings.homing_pulloff = DEFAULT_HOMING_PULLOFF; + + settings.flags = 0; + if (DEFAULT_REPORT_INCHES) { settings.flags |= BITFLAG_REPORT_INCHES; } + if (DEFAULT_INVERT_ST_ENABLE) { settings.flags |= BITFLAG_INVERT_ST_ENABLE; } + if (DEFAULT_INVERT_LIMIT_PINS) { settings.flags |= BITFLAG_INVERT_LIMIT_PINS; } + if (DEFAULT_SOFT_LIMIT_ENABLE) { settings.flags |= BITFLAG_SOFT_LIMIT_ENABLE; } + if (DEFAULT_HARD_LIMIT_ENABLE) { settings.flags |= BITFLAG_HARD_LIMIT_ENABLE; } + if (DEFAULT_HOMING_ENABLE) { settings.flags |= BITFLAG_HOMING_ENABLE; } - settings.steps_per_mm[X_AXIS] = DEFAULT_X_STEPS_PER_MM; - settings.steps_per_mm[Y_AXIS] = DEFAULT_Y_STEPS_PER_MM; - settings.steps_per_mm[Z_AXIS] = DEFAULT_Z_STEPS_PER_MM; - settings.max_rate[X_AXIS] = DEFAULT_X_MAX_RATE; - settings.max_rate[Y_AXIS] = DEFAULT_Y_MAX_RATE; - settings.max_rate[Z_AXIS] = DEFAULT_Z_MAX_RATE; - settings.acceleration[X_AXIS] = DEFAULT_X_ACCELERATION; - settings.acceleration[Y_AXIS] = DEFAULT_Y_ACCELERATION; - settings.acceleration[Z_AXIS] = DEFAULT_Z_ACCELERATION; - settings.max_travel[X_AXIS] = (-DEFAULT_X_MAX_TRAVEL); - settings.max_travel[Y_AXIS] = (-DEFAULT_Y_MAX_TRAVEL); - settings.max_travel[Z_AXIS] = (-DEFAULT_Z_MAX_TRAVEL); - - write_global_settings(); -} - - -// Helper function to clear the EEPROM space containing parameter data. -void settings_clear_parameters() { - uint8_t idx; - float coord_data[3]; - memset(&coord_data, 0, sizeof(coord_data)); - for (idx=0; idx < SETTING_INDEX_NCOORD; idx++) { settings_write_coord_data(idx, coord_data); } -} - - -// Helper function to clear the EEPROM space containing the startup lines. -void settings_clear_startup_lines() { - #if N_STARTUP_LINE > 0 - eeprom_put_char(EEPROM_ADDR_STARTUP_BLOCK, 0); - #endif - #if N_STARTUP_LINE > 1 - eeprom_put_char(EEPROM_ADDR_STARTUP_BLOCK+(LINE_BUFFER_SIZE+1), 0); - #endif + settings.steps_per_mm[X_AXIS] = DEFAULT_X_STEPS_PER_MM; + settings.steps_per_mm[Y_AXIS] = DEFAULT_Y_STEPS_PER_MM; + settings.steps_per_mm[Z_AXIS] = DEFAULT_Z_STEPS_PER_MM; + settings.max_rate[X_AXIS] = DEFAULT_X_MAX_RATE; + settings.max_rate[Y_AXIS] = DEFAULT_Y_MAX_RATE; + settings.max_rate[Z_AXIS] = DEFAULT_Z_MAX_RATE; + settings.acceleration[X_AXIS] = DEFAULT_X_ACCELERATION; + settings.acceleration[Y_AXIS] = DEFAULT_Y_ACCELERATION; + settings.acceleration[Z_AXIS] = DEFAULT_Z_ACCELERATION; + settings.max_travel[X_AXIS] = (-DEFAULT_X_MAX_TRAVEL); + settings.max_travel[Y_AXIS] = (-DEFAULT_Y_MAX_TRAVEL); + settings.max_travel[Z_AXIS] = (-DEFAULT_Z_MAX_TRAVEL); + + write_global_settings(); + } + + if (restore_flag & SETTINGS_RESTORE_PARAMETERS) { + uint8_t idx; + float coord_data[N_AXIS]; + memset(&coord_data, 0, sizeof(coord_data)); + for (idx=0; idx <= SETTING_INDEX_NCOORD; idx++) { settings_write_coord_data(idx, coord_data); } + } + + if (restore_flag & SETTINGS_RESTORE_STARTUP_LINES) { + #if N_STARTUP_LINE > 0 + eeprom_put_char(EEPROM_ADDR_STARTUP_BLOCK, 0); + #endif + #if N_STARTUP_LINE > 1 + eeprom_put_char(EEPROM_ADDR_STARTUP_BLOCK+(LINE_BUFFER_SIZE+1), 0); + #endif + } + + if (restore_flag & SETTINGS_RESTORE_BUILD_INFO) { eeprom_put_char(EEPROM_ADDR_BUILD_INFO , 0); } } -// Helper function to clear the EEPROM space containing the user build info string. -void settings_clear_build_info() { eeprom_put_char(EEPROM_ADDR_BUILD_INFO , 0); } - - // Reads startup line from EEPROM. Updated pointed line string data. uint8_t settings_read_startup_line(uint8_t n, char *line) { @@ -200,8 +184,18 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) { if (parameter < N_AXIS) { // Valid axis setting found. switch (set_idx) { - case 0: settings.steps_per_mm[parameter] = value; break; - case 1: settings.max_rate[parameter] = value; break; + case 0: + #ifdef MAX_STEP_RATE_HZ + if (value*settings.max_rate[parameter] > (MAX_STEP_RATE_HZ*60.0)) { return(STATUS_MAX_STEP_RATE_EXCEEDED); } + #endif + settings.steps_per_mm[parameter] = value; + break; + case 1: + #ifdef MAX_STEP_RATE_HZ + if (value*settings.steps_per_mm[parameter] > (MAX_STEP_RATE_HZ*60.0)) { return(STATUS_MAX_STEP_RATE_EXCEEDED); } + #endif + settings.max_rate[parameter] = value; + break; case 2: settings.acceleration[parameter] = value*60*60; break; // Convert to mm/min^2 for grbl internal use. case 3: settings.max_travel[parameter] = -value; break; // Store as negative for grbl internal use. } @@ -248,10 +242,6 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) { if (int_value) { settings.flags |= BITFLAG_REPORT_INCHES; } else { settings.flags &= ~BITFLAG_REPORT_INCHES; } break; - case 14: // Reset to ensure change. Immediate re-init may cause problems. - if (int_value) { settings.flags |= BITFLAG_AUTO_START; } - else { settings.flags &= ~BITFLAG_AUTO_START; } - break; case 20: if (int_value) { if (bit_isfalse(settings.flags, BITFLAG_HOMING_ENABLE)) { return(STATUS_SOFT_LIMIT_ERROR); } @@ -288,27 +278,21 @@ uint8_t settings_store_global_setting(uint8_t parameter, float value) { void settings_init() { if(!read_global_settings()) { report_status_message(STATUS_SETTING_READ_FAIL); - - settings_restore_global_settings(); - - // Force clear startup lines and build info user data. Parameters should be ok. - // TODO: For next version, remove these clears. Only here because line buffer increased. - settings_clear_startup_lines(); - settings_clear_build_info(); - + settings_restore(SETTINGS_RESTORE_ALL); // Force restore all EEPROM data. report_grbl_settings(); } + // NOTE: Checking paramater data, startup lines, and build info string should be done here, + // but it seems fairly redundant. Each of these can be manually checked and reset or restored. // Check all parameter data into a dummy variable. If error, reset to zero, otherwise do nothing. - float coord_data[N_AXIS]; - uint8_t i; - for (i=0; i<=SETTING_INDEX_NCOORD; i++) { - if (!settings_read_coord_data(i, coord_data)) { - report_status_message(STATUS_SETTING_READ_FAIL); - } - } + // float coord_data[N_AXIS]; + // uint8_t i; + // for (i=0; i<=SETTING_INDEX_NCOORD; i++) { + // if (!settings_read_coord_data(i, coord_data)) { + // report_status_message(STATUS_SETTING_READ_FAIL); + // } + // } // NOTE: Startup lines are checked and executed by protocol_main_loop at the end of initialization. - // TODO: Build info should be checked here, but will wait until v1.0 to address this. Ok for now. } diff --git a/settings.h b/grbl/settings.h similarity index 88% rename from settings.h rename to grbl/settings.h index 1d63e388b..3442b9e1b 100644 --- a/settings.h +++ b/grbl/settings.h @@ -1,8 +1,9 @@ /* settings.h - eeprom configuration handling - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,19 +18,12 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ #ifndef settings_h #define settings_h +#include "grbl.h" -#define GRBL_VERSION "0.9g" -#define GRBL_VERSION_BUILD "20140905" // Version of the EEPROM data. Will be used to migrate existing data from older versions of Grbl // when firmware is upgraded. Always stored in byte 0 of eeprom @@ -37,7 +31,7 @@ // Define bit flag masks for the boolean settings in settings.flag. #define BITFLAG_REPORT_INCHES bit(0) -#define BITFLAG_AUTO_START bit(1) +// #define BITFLAG_AUTO_START bit(1) // Obsolete. Don't alter to keep back compatibility. #define BITFLAG_INVERT_ST_ENABLE bit(2) #define BITFLAG_HARD_LIMIT_ENABLE bit(3) #define BITFLAG_HOMING_ENABLE bit(4) @@ -50,6 +44,14 @@ #define BITFLAG_RT_STATUS_WORK_POSITION bit(1) #define BITFLAG_RT_STATUS_PLANNER_BUFFER bit(2) #define BITFLAG_RT_STATUS_SERIAL_RX bit(3) +#define BITFLAG_RT_STATUS_LIMIT_PINS bit(4) + +// Define settings restore bitflags. +#define SETTINGS_RESTORE_ALL 0xFF // All bitflags +#define SETTINGS_RESTORE_DEFAULTS bit(0) +#define SETTINGS_RESTORE_PARAMETERS bit(1) +#define SETTINGS_RESTORE_STARTUP_LINES bit(2) +#define SETTINGS_RESTORE_BUILD_INFO bit(3) // Define EEPROM memory address location values for Grbl settings and parameters // NOTE: The Atmega328p has 1KB EEPROM. The upper half is reserved for parameters and @@ -103,11 +105,8 @@ extern settings_t settings; // Initialize the configuration subsystem (load settings from EEPROM) void settings_init(); -// Helper functions to clear and restore EEPROM defaults -void settings_restore_global_settings(); -void settings_clear_parameters(); -void settings_clear_startup_line(); -void settings_clear_build_info(); +// Helper function to clear and restore EEPROM defaults +void settings_restore(uint8_t restore_flag); // A helper method to set new settings from command line uint8_t settings_store_global_setting(uint8_t parameter, float value); diff --git a/grbl/spindle_control.c b/grbl/spindle_control.c new file mode 100644 index 000000000..d9c5c100f --- /dev/null +++ b/grbl/spindle_control.c @@ -0,0 +1,136 @@ +/* + spindle_control.c - spindle control methods + Part of Grbl + + Copyright (c) 2012-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#include "grbl.h" + + +void spindle_init() +{ + // Configure variable spindle PWM and enable pin, if requried. On the Uno, PWM and enable are + // combined unless configured otherwise. + #ifdef VARIABLE_SPINDLE + SPINDLE_PWM_DDR |= (1< SPINDLE_RPM_RANGE ) { rpm = SPINDLE_RPM_RANGE; } // Prevent integer overflow + } + current_pwm = floor( rpm*(PWM_MAX_VALUE/SPINDLE_RPM_RANGE) + 0.5); + #ifdef MINIMUM_SPINDLE_PWM + if (current_pwm < MINIMUM_SPINDLE_PWM) { current_pwm = MINIMUM_SPINDLE_PWM; } + #endif + OCR_REGISTER = current_pwm; // Set PWM pin output + + // On the Uno, spindle enable and PWM are shared, unless otherwise specified. + #if defined(CPU_MAP_ATMEGA2560) || defined(USE_SPINDLE_DIR_AS_ENABLE_PIN) + #ifdef INVERT_SPINDLE_ENABLE_PIN + SPINDLE_ENABLE_PORT &= ~(1<. -*/ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2012 Sungeun K. Jeon */ #ifndef spindle_control_h @@ -34,6 +29,8 @@ void spindle_init(); // Sets spindle direction and spindle rpm via PWM, if enabled. void spindle_run(uint8_t direction, float rpm); +void spindle_set_state(uint8_t state, float rpm); + // Kills spindle. void spindle_stop(); diff --git a/stepper.c b/grbl/stepper.c similarity index 93% rename from stepper.c rename to grbl/stepper.c index 8e7022cfc..ce4b7d9f5 100644 --- a/stepper.c +++ b/grbl/stepper.c @@ -1,8 +1,9 @@ /* stepper.c - stepper motor driver: executes motion plans using stepper motors - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,19 +18,8 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ -#include "system.h" -#include "nuts_bolts.h" -#include "stepper.h" -#include "settings.h" -#include "planner.h" -#include "probe.h" +#include "grbl.h" // Some useful constants. @@ -193,8 +183,23 @@ static st_prep_t prep; void st_wake_up() { // Enable stepper drivers. - if (bit_istrue(settings.flags,BITFLAG_INVERT_ST_ENABLE)) { STEPPERS_DISABLE_PORT |= (1<step_event_count >> 1); - st.counter_y = st.counter_x; - st.counter_z = st.counter_x; + st.counter_x = st.counter_y = st.counter_z = (st.exec_block->step_event_count >> 1); } - st.dir_outbits = st.exec_block->direction_bits ^ dir_port_invert_mask; #ifdef ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING @@ -357,7 +374,7 @@ ISR(TIMER1_COMPA_vect) } else { // Segment buffer empty. Shutdown. st_go_idle(); - bit_true_atomic(sys.execute,EXEC_CYCLE_STOP); // Flag main program for cycle end + bit_true_atomic(sys_rt_exec_state,EXEC_CYCLE_STOP); // Flag main program for cycle end return; // Nothing to do but exit. } } @@ -502,8 +519,14 @@ void stepper_init() X_STEP_DDR |= bit(X_STEP_BIT); Y_STEP_DDR |= bit(Y_STEP_BIT); Z_STEP_DDR |= bit(Z_STEP_BIT); - + +#ifdef STEPPERS_DISABLE_DDR STEPPERS_DISABLE_DDR |= STEPPERS_DISABLE_MASK; +#else + X_STEPPERS_DISABLE_DDR |= X_STEPPERS_DISABLE_MASK; + Y_STEPPERS_DISABLE_DDR |= Y_STEPPERS_DISABLE_MASK; + Z_STEPPERS_DISABLE_DDR |= Z_STEPPERS_DISABLE_MASK; +#endif X_DIRECTION_DDR |= bit(X_DIRECTION_BIT); Y_DIRECTION_DDR |= bit(Y_DIRECTION_BIT); @@ -554,6 +577,12 @@ void st_update_plan_block_parameters() */ void st_prep_buffer() { + + if (sys.state & (STATE_HOLD|STATE_MOTION_CANCEL|STATE_SAFETY_DOOR)) { + // Check if we still need to generate more segments for a motion suspend. + if (prep.current_speed == 0.0) { return; } // Nothing to do. Bail. + } + while (segment_buffer_tail != segment_next_head) { // Check if we need to fill the buffer. // Determine if we need to load a new planner block or if the block has been replanned. @@ -596,7 +625,7 @@ void st_prep_buffer() prep.dt_remainder = 0.0; // Reset for new planner block - if (sys.state == STATE_HOLD) { + if (sys.state & (STATE_HOLD|STATE_MOTION_CANCEL|STATE_SAFETY_DOOR)) { // Override planner block entry speed and enforce deceleration during feed hold. prep.current_speed = prep.exit_speed; pl_block->entry_speed_sqr = prep.exit_speed*prep.exit_speed; @@ -612,7 +641,7 @@ void st_prep_buffer() */ prep.mm_complete = 0.0; // Default velocity profile complete at 0.0mm from end of block. float inv_2_accel = 0.5/pl_block->acceleration; - if (sys.state == STATE_HOLD) { // [Forced Deceleration to Zero Velocity] + if (sys.state & (STATE_HOLD|STATE_MOTION_CANCEL|STATE_SAFETY_DOOR)) { // [Forced Deceleration to Zero Velocity] // Compute velocity profile parameters for a feed hold in-progress. This profile overrides // the planner block profile, enforcing a deceleration to zero speed. prep.ramp_type = RAMP_DECEL; @@ -771,16 +800,14 @@ void st_prep_buffer() // Bail if we are at the end of a feed hold and don't have a step to execute. if (prep_segment->n_step == 0) { - if (sys.state == STATE_HOLD) { - + if (sys.state & (STATE_HOLD|STATE_MOTION_CANCEL|STATE_SAFETY_DOOR)) { // Less than one step to decelerate to zero speed, but already very close. AMASS // requires full steps to execute. So, just bail. - prep.current_speed = 0.0; + prep.current_speed = 0.0; // NOTE: (=0.0) Used to indicate completed segment calcs for hold. prep.dt_remainder = 0.0; prep.steps_remaining = n_steps_remaining; pl_block->millimeters = prep.steps_remaining/prep.step_per_mm; // Update with full steps. plan_cycle_reinitialize(); - sys.state = STATE_QUEUED; return; // Segment not generated, but current step data still retained. } } @@ -843,21 +870,18 @@ void st_prep_buffer() } else { // End of planner block or forced-termination. No more distance to be executed. if (mm_remaining > 0.0) { // At end of forced-termination. - // Reset prep parameters for resuming and then bail. - // NOTE: Currently only feed holds qualify for this scenario. May change with overrides. - prep.current_speed = 0.0; + // Reset prep parameters for resuming and then bail. Allow the stepper ISR to complete + // the segment queue, where realtime protocol will set new state upon receiving the + // cycle stop flag from the ISR. Prep_segment is blocked until then. + prep.current_speed = 0.0; // NOTE: (=0.0) Used to indicate completed segment calcs for hold. prep.dt_remainder = 0.0; prep.steps_remaining = ceil(steps_remaining); pl_block->millimeters = prep.steps_remaining/prep.step_per_mm; // Update with full steps. plan_cycle_reinitialize(); - sys.state = STATE_QUEUED; // End cycle. - return; // Bail! -// TODO: Try to move QUEUED setting into cycle re-initialize. - } else { // End of planner block // The planner block is complete. All steps are set to be executed in the segment buffer. - pl_block = NULL; + pl_block = NULL; // Set pointer to indicate check and load next planner block. plan_discard_current_block(); } } @@ -866,14 +890,14 @@ void st_prep_buffer() } -// Called by runtime status reporting to fetch the current speed being executed. This value +// Called by realtime status reporting to fetch the current speed being executed. This value // however is not exactly the current speed, but the speed computed in the last step segment // in the segment buffer. It will always be behind by up to the number of segment blocks (-1) // divided by the ACCELERATION TICKS PER SECOND in seconds. #ifdef REPORT_REALTIME_RATE float st_get_realtime_rate() { - if (sys.state & (STATE_CYCLE | STATE_HOMING | STATE_HOLD)){ + if (sys.state & (STATE_CYCLE | STATE_HOMING | STATE_HOLD | STATE_MOTION_CANCEL | STATE_SAFETY_DOOR)){ return prep.current_speed; } return 0.0f; diff --git a/stepper.h b/grbl/stepper.h similarity index 74% rename from stepper.h rename to grbl/stepper.h index 0e8be87d7..074570461 100644 --- a/stepper.h +++ b/grbl/stepper.h @@ -1,8 +1,9 @@ /* stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors - Part of Grbl v0.9 + Part of Grbl - Copyright (c) 2012-2014 Sungeun K. Jeon + Copyright (c) 2011-2015 Sungeun K. Jeon + Copyright (c) 2009-2011 Simen Svale Skogsrud Grbl is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +18,6 @@ You should have received a copy of the GNU General Public License along with Grbl. If not, see . */ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011 Sungeun K. Jeon -*/ #ifndef stepper_h #define stepper_h @@ -34,7 +29,7 @@ // Initialize and setup the stepper motor subsystem void stepper_init(); -// Enable steppers, but cycle does not start unless called by motion control or runtime command. +// Enable steppers, but cycle does not start unless called by motion control or realtime command. void st_wake_up(); // Immediately disables steppers @@ -46,13 +41,13 @@ void st_generate_step_dir_invert_masks(); // Reset the stepper subsystem variables void st_reset(); -// Reloads step segment buffer. Called continuously by runtime execution system. +// Reloads step segment buffer. Called continuously by realtime execution system. void st_prep_buffer(); // Called by planner_recalculate() when the executing block is updated by the new plan. void st_update_plan_block_parameters(); -// Called by runtime status reporting if realtime rate reporting is enabled in config.h. +// Called by realtime status reporting if realtime rate reporting is enabled in config.h. #ifdef REPORT_REALTIME_RATE float st_get_realtime_rate(); #endif diff --git a/grbl/system.c b/grbl/system.c new file mode 100644 index 000000000..b3371d904 --- /dev/null +++ b/grbl/system.c @@ -0,0 +1,288 @@ +/* + system.c - Handles system level commands and real-time processes + Part of Grbl + + Copyright (c) 2014-2015 Sungeun K. Jeon + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#include "grbl.h" + + +void system_init() +{ + CONTROL_DDR &= ~(CONTROL_MASK); // Configure as input pins + #ifdef DISABLE_CONTROL_PIN_PULL_UP + CONTROL_PORT &= ~(CONTROL_MASK); // Normal low operation. Requires external pull-down. + #else + CONTROL_PORT |= CONTROL_MASK; // Enable internal pull-up resistors. Normal high operation. + #endif + CONTROL_PCMSK |= CONTROL_MASK; // Enable specific pins of the Pin Change Interrupt + PCICR |= (1 << CONTROL_INT); // Enable Pin Change Interrupt +} + + +// Pin change interrupt for pin-out commands, i.e. cycle start, feed hold, and reset. Sets +// only the realtime command execute variable to have the main program execute these when +// its ready. This works exactly like the character-based realtime commands when picked off +// directly from the incoming serial data stream. +ISR(CONTROL_INT_vect) +{ + uint8_t pin = (CONTROL_PIN & CONTROL_MASK); + #ifndef INVERT_ALL_CONTROL_PINS + pin ^= CONTROL_INVERT_MASK; + #endif + // Enter only if any CONTROL pin is detected as active. + if (pin) { + if (bit_istrue(pin,bit(RESET_BIT))) { + mc_reset(); + } else if (bit_istrue(pin,bit(CYCLE_START_BIT))) { + bit_true(sys_rt_exec_state, EXEC_CYCLE_START); + #ifndef ENABLE_SAFETY_DOOR_INPUT_PIN + } else if (bit_istrue(pin,bit(FEED_HOLD_BIT))) { + bit_true(sys_rt_exec_state, EXEC_FEED_HOLD); + #else + } else if (bit_istrue(pin,bit(SAFETY_DOOR_BIT))) { + bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); + #endif + } + } +} + + +// Returns if safety door is ajar(T) or closed(F), based on pin state. +uint8_t system_check_safety_door_ajar() +{ + #ifdef ENABLE_SAFETY_DOOR_INPUT_PIN + #ifdef INVERT_CONTROL_PIN + return(bit_istrue(CONTROL_PIN,bit(SAFETY_DOOR_BIT))); + #else + return(bit_isfalse(CONTROL_PIN,bit(SAFETY_DOOR_BIT))); + #endif + #else + return(false); // Input pin not enabled, so just return that it's closed. + #endif +} + + +// Executes user startup script, if stored. +void system_execute_startup(char *line) +{ + uint8_t n; + for (n=0; n < N_STARTUP_LINE; n++) { + if (!(settings_read_startup_line(n, line))) { + report_status_message(STATUS_SETTING_READ_FAIL); + } else { + if (line[0] != 0) { + printString(line); // Echo startup line to indicate execution. + report_status_message(gc_execute_line(line)); + } + } + } +} + + +// Directs and executes one line of formatted input from protocol_process. While mostly +// incoming streaming g-code blocks, this also executes Grbl internal commands, such as +// settings, initiating the homing cycle, and toggling switch states. This differs from +// the realtime command module by being susceptible to when Grbl is ready to execute the +// next line during a cycle, so for switches like block delete, the switch only effects +// the lines that are processed afterward, not necessarily real-time during a cycle, +// since there are motions already stored in the buffer. However, this 'lag' should not +// be an issue, since these commands are not typically used during a cycle. +uint8_t system_execute_line(char *line) +{ + uint8_t char_counter = 1; + uint8_t helper_var = 0; // Helper variable + float parameter, value; + switch( line[char_counter] ) { + case 0 : report_grbl_help(); break; + case '$': case 'G': case 'C': case 'X': + if ( line[(char_counter+1)] != 0 ) { return(STATUS_INVALID_STATEMENT); } + switch( line[char_counter] ) { + case '$' : // Prints Grbl settings + if ( sys.state & (STATE_CYCLE | STATE_HOLD) ) { return(STATUS_IDLE_ERROR); } // Block during cycle. Takes too long to print. + else { report_grbl_settings(); } + break; + case 'G' : // Prints gcode parser state + // TODO: Move this to realtime commands for GUIs to request this data during suspend-state. + report_gcode_modes(); + break; + case 'C' : // Set check g-code mode [IDLE/CHECK] + // Perform reset when toggling off. Check g-code mode should only work if Grbl + // is idle and ready, regardless of alarm locks. This is mainly to keep things + // simple and consistent. + if ( sys.state == STATE_CHECK_MODE ) { + mc_reset(); + report_feedback_message(MESSAGE_DISABLED); + } else { + if (sys.state) { return(STATUS_IDLE_ERROR); } // Requires no alarm mode. + sys.state = STATE_CHECK_MODE; + report_feedback_message(MESSAGE_ENABLED); + } + break; + case 'X' : // Disable alarm lock [ALARM] + if (sys.state == STATE_ALARM) { + report_feedback_message(MESSAGE_ALARM_UNLOCK); + sys.state = STATE_IDLE; + // Don't run startup script. Prevents stored moves in startup from causing accidents. + if (system_check_safety_door_ajar()) { // Check safety door switch before returning. + bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); + protocol_execute_realtime(); // Enter safety door mode. + } + } // Otherwise, no effect. + break; + // case 'J' : break; // Jogging methods + // TODO: Here jogging can be placed for execution as a seperate subprogram. It does not need to be + // susceptible to other realtime commands except for e-stop. The jogging function is intended to + // be a basic toggle on/off with controlled acceleration and deceleration to prevent skipped + // steps. The user would supply the desired feedrate, axis to move, and direction. Toggle on would + // start motion and toggle off would initiate a deceleration to stop. One could 'feather' the + // motion by repeatedly toggling to slow the motion to the desired location. Location data would + // need to be updated real-time and supplied to the user through status queries. + // More controlled exact motions can be taken care of by inputting G0 or G1 commands, which are + // handled by the planner. It would be possible for the jog subprogram to insert blocks into the + // block buffer without having the planner plan them. It would need to manage de/ac-celerations + // on its own carefully. This approach could be effective and possibly size/memory efficient. +// } +// break; + } + break; + default : + // Block any system command that requires the state as IDLE/ALARM. (i.e. EEPROM, homing) + if ( !(sys.state == STATE_IDLE || sys.state == STATE_ALARM) ) { return(STATUS_IDLE_ERROR); } + switch( line[char_counter] ) { + case '#' : // Print Grbl NGC parameters + if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } + else { report_ngc_parameters(); } + break; + case 'H' : // Perform homing cycle [IDLE/ALARM] + if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { + sys.state = STATE_HOMING; // Set system state variable + // Only perform homing if Grbl is idle or lost. + + // TODO: Likely not required. + if (system_check_safety_door_ajar()) { // Check safety door switch before homing. + bit_true(sys_rt_exec_state, EXEC_SAFETY_DOOR); + protocol_execute_realtime(); // Enter safety door mode. + } + + + mc_homing_cycle(); + if (!sys.abort) { // Execute startup scripts after successful homing. + sys.state = STATE_IDLE; // Set to IDLE when complete. + st_go_idle(); // Set steppers to the settings idle state before returning. + system_execute_startup(line); + } + } else { return(STATUS_SETTING_DISABLED); } + break; + case 'I' : // Print or store build info. [IDLE/ALARM] + if ( line[++char_counter] == 0 ) { + settings_read_build_info(line); + report_build_info(line); + } else { // Store startup line [IDLE/ALARM] + if(line[char_counter++] != '=') { return(STATUS_INVALID_STATEMENT); } + helper_var = char_counter; // Set helper variable as counter to start of user info line. + do { + line[char_counter-helper_var] = line[char_counter]; + } while (line[char_counter++] != 0); + settings_store_build_info(line); + } + break; + case 'R' : // Restore defaults [IDLE/ALARM] + if (line[++char_counter] != 'S') { return(STATUS_INVALID_STATEMENT); } + if (line[++char_counter] != 'T') { return(STATUS_INVALID_STATEMENT); } + if (line[++char_counter] != '=') { return(STATUS_INVALID_STATEMENT); } + if (line[char_counter+2] != 0) { return(STATUS_INVALID_STATEMENT); } + switch (line[++char_counter]) { + case '$': settings_restore(SETTINGS_RESTORE_DEFAULTS); break; + case '#': settings_restore(SETTINGS_RESTORE_PARAMETERS); break; + case '*': settings_restore(SETTINGS_RESTORE_ALL); break; + default: return(STATUS_INVALID_STATEMENT); + } + report_feedback_message(MESSAGE_RESTORE_DEFAULTS); + mc_reset(); // Force reset to ensure settings are initialized correctly. + break; + case 'N' : // Startup lines. [IDLE/ALARM] + if ( line[++char_counter] == 0 ) { // Print startup lines + for (helper_var=0; helper_var < N_STARTUP_LINE; helper_var++) { + if (!(settings_read_startup_line(helper_var, line))) { + report_status_message(STATUS_SETTING_READ_FAIL); + } else { + report_startup_line(helper_var,line); + } + } + break; + } else { // Store startup line [IDLE Only] Prevents motion during ALARM. + if (sys.state != STATE_IDLE) { return(STATUS_IDLE_ERROR); } // Store only when idle. + helper_var = true; // Set helper_var to flag storing method. + // No break. Continues into default: to read remaining command characters. + } + default : // Storing setting methods [IDLE/ALARM] + if(!read_float(line, &char_counter, ¶meter)) { return(STATUS_BAD_NUMBER_FORMAT); } + if(line[char_counter++] != '=') { return(STATUS_INVALID_STATEMENT); } + if (helper_var) { // Store startup line + // Prepare sending gcode block to gcode parser by shifting all characters + helper_var = char_counter; // Set helper variable as counter to start of gcode block + do { + line[char_counter-helper_var] = line[char_counter]; + } while (line[char_counter++] != 0); + // Execute gcode block to ensure block is valid. + helper_var = gc_execute_line(line); // Set helper_var to returned status code. + if (helper_var) { return(helper_var); } + else { + helper_var = trunc(parameter); // Set helper_var to int value of parameter + settings_store_startup_line(helper_var,line); + } + } else { // Store global setting. + if(!read_float(line, &char_counter, &value)) { return(STATUS_BAD_NUMBER_FORMAT); } + if((line[char_counter] != 0) || (parameter > 255)) { return(STATUS_INVALID_STATEMENT); } + return(settings_store_global_setting((uint8_t)parameter, value)); + } + } + } + return(STATUS_OK); // If '$' command makes it to here, then everything's ok. +} + + +// Returns machine position of axis 'idx'. Must be sent a 'step' array. +// NOTE: If motor steps and machine position are not in the same coordinate frame, this function +// serves as a central place to compute the transformation. +float system_convert_axis_steps_to_mpos(int32_t *steps, uint8_t idx) +{ + float pos; + #ifdef COREXY + if (idx==A_MOTOR) { + pos = 0.5*((steps[A_MOTOR] + steps[B_MOTOR])/settings.steps_per_mm[idx]); + } else if (idx==B_MOTOR) { + pos = 0.5*((steps[A_MOTOR] - steps[B_MOTOR])/settings.steps_per_mm[idx]); + } else { + pos = steps[idx]/settings.steps_per_mm[idx]; + } + #else + pos = steps[idx]/settings.steps_per_mm[idx]; + #endif + return(pos); +} + + +void system_convert_array_steps_to_mpos(float *position, int32_t *steps) +{ + uint8_t idx; + for (idx=0; idx. +*/ + +#ifndef system_h +#define system_h + +#include "grbl.h" + +// Define system executor bit map. Used internally by realtime protocol as realtime command flags, +// which notifies the main program to execute the specified realtime command asynchronously. +// NOTE: The system executor uses an unsigned 8-bit volatile variable (8 flag limit.) The default +// flags are always false, so the realtime protocol only needs to check for a non-zero value to +// know when there is a realtime command to execute. +#define EXEC_STATUS_REPORT bit(0) // bitmask 00000001 +#define EXEC_CYCLE_START bit(1) // bitmask 00000010 +#define EXEC_CYCLE_STOP bit(2) // bitmask 00000100 +#define EXEC_FEED_HOLD bit(3) // bitmask 00001000 +#define EXEC_RESET bit(4) // bitmask 00010000 +#define EXEC_SAFETY_DOOR bit(5) // bitmask 00100000 +#define EXEC_MOTION_CANCEL bit(6) // bitmask 01000000 + +// Alarm executor bit map. +// NOTE: EXEC_CRITICAL_EVENT is an optional flag that must be set with an alarm flag. When enabled, +// this halts Grbl into an infinite loop until the user aknowledges the problem and issues a soft- +// reset command. For example, a hard limit event needs this type of halt and aknowledgement. +#define EXEC_CRITICAL_EVENT bit(0) // bitmask 00000001 (SPECIAL FLAG. See NOTE:) +#define EXEC_ALARM_HARD_LIMIT bit(1) // bitmask 00000010 +#define EXEC_ALARM_SOFT_LIMIT bit(2) // bitmask 00000100 +#define EXEC_ALARM_ABORT_CYCLE bit(3) // bitmask 00001000 +#define EXEC_ALARM_PROBE_FAIL bit(4) // bitmask 00010000 +#define EXEC_ALARM_HOMING_FAIL bit(5) // bitmask 00100000 + +// Define system state bit map. The state variable primarily tracks the individual functions +// of Grbl to manage each without overlapping. It is also used as a messaging flag for +// critical events. +#define STATE_IDLE 0 // Must be zero. No flags. +#define STATE_ALARM bit(0) // In alarm state. Locks out all g-code processes. Allows settings access. +#define STATE_CHECK_MODE bit(1) // G-code check mode. Locks out planner and motion only. +#define STATE_HOMING bit(2) // Performing homing cycle +#define STATE_CYCLE bit(3) // Cycle is running or motions are being executed. +#define STATE_HOLD bit(4) // Active feed hold +#define STATE_SAFETY_DOOR bit(5) // Safety door is ajar. Feed holds and de-energizes system. +#define STATE_MOTION_CANCEL bit(6) // Motion cancel by feed hold and return to idle. + +// Define system suspend states. +#define SUSPEND_DISABLE 0 // Must be zero. +#define SUSPEND_ENABLE_HOLD bit(0) // Enabled. Indicates the cycle is active and currently undergoing a hold. +#define SUSPEND_ENABLE_READY bit(1) // Ready to resume with a cycle start command. +#define SUSPEND_ENERGIZE bit(2) // Re-energizes output before resume. +#define SUSPEND_MOTION_CANCEL bit(3) // Cancels resume motion. Used by probing routine. + + +// Define global system variables +typedef struct { + uint8_t abort; // System abort flag. Forces exit back to main loop for reset. + uint8_t state; // Tracks the current state of Grbl. + uint8_t suspend; // System suspend bitflag variable that manages holds, cancels, and safety door. + + int32_t position[N_AXIS]; // Real-time machine (aka home) position vector in steps. + // NOTE: This may need to be a volatile variable, if problems arise. + + int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps. + uint8_t probe_succeeded; // Tracks if last probing cycle was successful. + uint8_t homing_axis_lock; // Locks axes when limits engage. Used as an axis motion mask in the stepper ISR. +} system_t; +extern system_t sys; + +volatile uint8_t sys_probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR. +volatile uint8_t sys_rt_exec_state; // Global realtime executor bitflag variable for state management. See EXEC bitmasks. +volatile uint8_t sys_rt_exec_alarm; // Global realtime executor bitflag variable for setting various alarms. + + +// Initialize the serial protocol +void system_init(); + +// Returns if safety door is open or closed, based on pin state. +uint8_t system_check_safety_door_ajar(); + +// Executes an internal system command, defined as a string starting with a '$' +uint8_t system_execute_line(char *line); + +// Execute the startup script lines stored in EEPROM upon initialization +void system_execute_startup(char *line); + +// Returns machine position of axis 'idx'. Must be sent a 'step' array. +float system_convert_axis_steps_to_mpos(int32_t *steps, uint8_t idx); + +// Updates a machine 'position' array based on the 'step' array sent. +void system_convert_array_steps_to_mpos(float *position, int32_t *steps); + +#endif diff --git a/limits.c b/limits.c deleted file mode 100644 index 38e331767..000000000 --- a/limits.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - limits.c - code pertaining to limit-switches and performing the homing cycle - Part of Grbl v0.9 - - Copyright (c) 2012-2014 Sungeun K. Jeon - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2012 Sungeun K. Jeon -*/ - -#include "system.h" -#include "settings.h" -#include "protocol.h" -#include "planner.h" -#include "stepper.h" -#include "motion_control.h" -#include "limits.h" -#include "report.h" - -// Homing axis search distance multiplier. Computed by this value times the axis max travel. -#define HOMING_AXIS_SEARCH_SCALAR 1.5 // Must be > 1 to ensure limit switch will be engaged. - - -void limits_init() -{ - LIMIT_DDR &= ~(LIMIT_MASK); // Set as input pins - - if (bit_istrue(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { - LIMIT_PORT &= ~(LIMIT_MASK); // Normal low operation. Requires external pull-down. - } else { - LIMIT_PORT |= (LIMIT_MASK); // Enable internal pull-up resistors. Normal high operation. - } - - if (bit_istrue(settings.flags,BITFLAG_HARD_LIMIT_ENABLE)) { - LIMIT_PCMSK |= LIMIT_MASK; // Enable specific pins of the Pin Change Interrupt - PCICR |= (1 << LIMIT_INT); // Enable Pin Change Interrupt - } else { - limits_disable(); - } - - #ifdef ENABLE_SOFTWARE_DEBOUNCE - MCUSR &= ~(1< settings.max_travel[idx]) { max_travel = settings.max_travel[idx]; } - } - max_travel *= -HOMING_AXIS_SEARCH_SCALAR; // Ensure homing switches engaged by over-estimating max travel. - - plan_reset(); // Reset planner buffer to zero planner current position and to clear previous motions. - - do { - // Initialize invert_pin boolean based on approach and invert pin user setting. - if (bit_isfalse(settings.flags,BITFLAG_INVERT_LIMIT_PINS)) { invert_pin = approach; } - else { invert_pin = !approach; } - - // Initialize and declare variables needed for homing routine. - uint8_t n_active_axis = 0; - uint8_t axislock = 0; - - for (idx=0; idx 0); - - // The active cycle axes should now be homed and machine limits have been located. By - // default, grbl defines machine space as all negative, as do most CNCs. Since limit switches - // can be on either side of an axes, check and set axes machine zero appropriately. Also, - // set up pull-off maneuver from axes limit switches that have been homed. This provides - // some initial clearance off the switches and should also help prevent them from falsely - // triggering when hard limits are enabled or when more than one axes shares a limit pin. - for (idx=0; idx -settings.max_travel[idx]) { soft_limit_error = true; } - } else { - if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } - } - #else - // NOTE: max_travel is stored as negative - if (target[idx] > 0 || target[idx] < settings.max_travel[idx]) { soft_limit_error = true; } - #endif - - if (soft_limit_error) { - // Force feed hold if cycle is active. All buffered blocks are guaranteed to be within - // workspace volume so just come to a controlled stop so position is not lost. When complete - // enter alarm mode. - if (sys.state == STATE_CYCLE) { - bit_true_atomic(sys.execute, EXEC_FEED_HOLD); - do { - protocol_execute_runtime(); - if (sys.abort) { return; } - } while ( sys.state != STATE_IDLE || sys.state != STATE_QUEUED); - } - - mc_reset(); // Issue system reset and ensure spindle and coolant are shutdown. - bit_true_atomic(sys.execute, (EXEC_ALARM | EXEC_CRIT_EVENT)); // Indicate soft limit critical event - protocol_execute_runtime(); // Execute to enter critical event loop and system abort - return; - } - } -} diff --git a/protocol.c b/protocol.c deleted file mode 100644 index 897832525..000000000 --- a/protocol.c +++ /dev/null @@ -1,306 +0,0 @@ -/* - protocol.c - controls Grbl execution protocol and procedures - Part of Grbl v0.9 - - Copyright (c) 2012-2014 Sungeun K. Jeon - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2011-2012 Sungeun K. Jeon -*/ - -#include "system.h" -#include "serial.h" -#include "settings.h" -#include "protocol.h" -#include "gcode.h" -#include "planner.h" -#include "stepper.h" -#include "motion_control.h" -#include "report.h" - - -static char line[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated. - - -// Directs and executes one line of formatted input from protocol_process. While mostly -// incoming streaming g-code blocks, this also directs and executes Grbl internal commands, -// such as settings, initiating the homing cycle, and toggling switch states. -static void protocol_execute_line(char *line) -{ - protocol_execute_runtime(); // Runtime command check point. - if (sys.abort) { return; } // Bail to calling function upon system abort - - if (line[0] == 0) { - // Empty or comment line. Send status message for syncing purposes. - report_status_message(STATUS_OK); - - } else if (line[0] == '$') { - // Grbl '$' system command - report_status_message(system_execute_line(line)); - - } else if (sys.state == STATE_ALARM) { - // Everything else is gcode. Block if in alarm mode. - report_status_message(STATUS_ALARM_LOCK); - - } else { - // Parse and execute g-code block! - report_status_message(gc_execute_line(line)); - } -} - - -/* - GRBL PRIMARY LOOP: -*/ -void protocol_main_loop() -{ - // ------------------------------------------------------------ - // Complete initialization procedures upon a power-up or reset. - // ------------------------------------------------------------ - - // Print welcome message - report_init_message(); - - // Check for and report alarm state after a reset, error, or an initial power up. - if (sys.state == STATE_ALARM) { - report_feedback_message(MESSAGE_ALARM_LOCK); - } else { - // All systems go! - sys.state = STATE_IDLE; // Set system to ready. Clear all state flags. - system_execute_startup(line); // Execute startup script. - } - - // --------------------------------------------------------------------------------- - // Primary loop! Upon a system abort, this exits back to main() to reset the system. - // --------------------------------------------------------------------------------- - - uint8_t iscomment = false; - uint8_t char_counter = 0; - uint8_t c; - for (;;) { - - // Process one line of incoming serial data, as the data becomes available. Performs an - // initial filtering by removing spaces and comments and capitalizing all letters. - - // NOTE: While comment, spaces, and block delete(if supported) handling should technically - // be done in the g-code parser, doing it here helps compress the incoming data into Grbl's - // line buffer, which is limited in size. The g-code standard actually states a line can't - // exceed 256 characters, but the Arduino Uno does not have the memory space for this. - // With a better processor, it would be very easy to pull this initial parsing out as a - // seperate task to be shared by the g-code parser and Grbl's system commands. - - while((c = serial_read()) != SERIAL_NO_DATA) { - if ((c == '\n') || (c == '\r')) { // End of line reached - line[char_counter] = 0; // Set string termination character. - protocol_execute_line(line); // Line is complete. Execute it! - iscomment = false; - char_counter = 0; - } else { - if (iscomment) { - // Throw away all comment characters - if (c == ')') { - // End of comment. Resume line. - iscomment = false; - } - } else { - if (c <= ' ') { - // Throw away whitepace and control characters - } else if (c == '/') { - // Block delete NOT SUPPORTED. Ignore character. - // NOTE: If supported, would simply need to check the system if block delete is enabled. - } else if (c == '(') { - // Enable comments flag and ignore all characters until ')' or EOL. - // NOTE: This doesn't follow the NIST definition exactly, but is good enough for now. - // In the future, we could simply remove the items within the comments, but retain the - // comment control characters, so that the g-code parser can error-check it. - iscomment = true; - // } else if (c == ';') { - // Comment character to EOL NOT SUPPORTED. LinuxCNC definition. Not NIST. - - // TODO: Install '%' feature - // } else if (c == '%') { - // Program start-end percent sign NOT SUPPORTED. - // NOTE: This maybe installed to tell Grbl when a program is running vs manual input, - // where, during a program, the system auto-cycle start will continue to execute - // everything until the next '%' sign. This will help fix resuming issues with certain - // functions that empty the planner buffer to execute its task on-time. - - } else if (char_counter >= (LINE_BUFFER_SIZE-1)) { - // Detect line buffer overflow. Report error and reset line buffer. - report_status_message(STATUS_OVERFLOW); - iscomment = false; - char_counter = 0; - } else if (c >= 'a' && c <= 'z') { // Upcase lowercase - line[char_counter++] = c-'a'+'A'; - } else { - line[char_counter++] = c; - } - } - } - } - - // If there are no more characters in the serial read buffer to be processed and executed, - // this indicates that g-code streaming has either filled the planner buffer or has - // completed. In either case, auto-cycle start, if enabled, any queued moves. - protocol_auto_cycle_start(); - - protocol_execute_runtime(); // Runtime command check point. - if (sys.abort) { return; } // Bail to main() program loop to reset system. - - } - - return; /* Never reached */ -} - - -// Executes run-time commands, when required. This is called from various check points in the main -// program, primarily where there may be a while loop waiting for a buffer to clear space or any -// point where the execution time from the last check point may be more than a fraction of a second. -// This is a way to execute runtime commands asynchronously (aka multitasking) with grbl's g-code -// parsing and planning functions. This function also serves as an interface for the interrupts to -// set the system runtime flags, where only the main program handles them, removing the need to -// define more computationally-expensive volatile variables. This also provides a controlled way to -// execute certain tasks without having two or more instances of the same task, such as the planner -// recalculating the buffer upon a feedhold or override. -// NOTE: The sys.execute variable flags are set by any process, step or serial interrupts, pinouts, -// limit switches, or the main program. -void protocol_execute_runtime() -{ - uint8_t rt_exec = sys.execute; // Copy to avoid calling volatile multiple times - if (rt_exec) { // Enter only if any bit flag is true - - // System alarm. Everything has shutdown by something that has gone severely wrong. Report - // the source of the error to the user. If critical, Grbl disables by entering an infinite - // loop until system reset/abort. - if (rt_exec & (EXEC_ALARM | EXEC_CRIT_EVENT)) { - sys.state = STATE_ALARM; // Set system alarm state - - // Critical events. Hard/soft limit events identified by both critical event and alarm exec - // flags. Probe fail is identified by the critical event exec flag only. - if (rt_exec & EXEC_CRIT_EVENT) { - if (rt_exec & EXEC_ALARM) { report_alarm_message(ALARM_LIMIT_ERROR); } - else { report_alarm_message(ALARM_PROBE_FAIL); } - report_feedback_message(MESSAGE_CRITICAL_EVENT); - bit_false_atomic(sys.execute,EXEC_RESET); // Disable any existing reset - do { - // Nothing. Block EVERYTHING until user issues reset or power cycles. Hard limits - // typically occur while unattended or not paying attention. Gives the user time - // to do what is needed before resetting, like killing the incoming stream. The - // same could be said about soft limits. While the position is not lost, the incoming - // stream could be still engaged and cause a serious crash if it continues afterwards. - } while (bit_isfalse(sys.execute,EXEC_RESET)); - - // Standard alarm event. Only abort during motion qualifies. - } else { - // Runtime abort command issued during a cycle, feed hold, or homing cycle. Message the - // user that position may have been lost and set alarm state to enable the alarm lockout - // to indicate the possible severity of the problem. - report_alarm_message(ALARM_ABORT_CYCLE); - } - bit_false_atomic(sys.execute,(EXEC_ALARM | EXEC_CRIT_EVENT)); - } - - // Execute system abort. - if (rt_exec & EXEC_RESET) { - sys.abort = true; // Only place this is set true. - return; // Nothing else to do but exit. - } - - // Execute and serial print status - if (rt_exec & EXEC_STATUS_REPORT) { - report_realtime_status(); - bit_false_atomic(sys.execute,EXEC_STATUS_REPORT); - } - - // Execute a feed hold with deceleration, only during cycle. - if (rt_exec & EXEC_FEED_HOLD) { - // !!! During a cycle, the segment buffer has just been reloaded and full. So the math involved - // with the feed hold should be fine for most, if not all, operational scenarios. - if (sys.state == STATE_CYCLE) { - sys.state = STATE_HOLD; - st_update_plan_block_parameters(); - st_prep_buffer(); - sys.auto_start = false; // Disable planner auto start upon feed hold. - } - bit_false_atomic(sys.execute,EXEC_FEED_HOLD); - } - - // Execute a cycle start by starting the stepper interrupt begin executing the blocks in queue. - if (rt_exec & EXEC_CYCLE_START) { - if (sys.state == STATE_QUEUED) { - sys.state = STATE_CYCLE; - st_prep_buffer(); // Initialize step segment buffer before beginning cycle. - st_wake_up(); - if (bit_istrue(settings.flags,BITFLAG_AUTO_START)) { - sys.auto_start = true; // Re-enable auto start after feed hold. - } else { - sys.auto_start = false; // Reset auto start per settings. - } - } - bit_false_atomic(sys.execute,EXEC_CYCLE_START); - } - - // Reinitializes the cycle plan and stepper system after a feed hold for a resume. Called by - // runtime command execution in the main program, ensuring that the planner re-plans safely. - // NOTE: Bresenham algorithm variables are still maintained through both the planner and stepper - // cycle reinitializations. The stepper path should continue exactly as if nothing has happened. - // NOTE: EXEC_CYCLE_STOP is set by the stepper subsystem when a cycle or feed hold completes. - if (rt_exec & EXEC_CYCLE_STOP) { - if ( plan_get_current_block() ) { sys.state = STATE_QUEUED; } - else { sys.state = STATE_IDLE; } - bit_false_atomic(sys.execute,EXEC_CYCLE_STOP); - } - - } - - // Overrides flag byte (sys.override) and execution should be installed here, since they - // are runtime and require a direct and controlled interface to the main stepper program. - - // Reload step segment buffer - if (sys.state & (STATE_CYCLE | STATE_HOLD | STATE_HOMING)) { st_prep_buffer(); } - -} - - -// Block until all buffered steps are executed or in a cycle state. Works with feed hold -// during a synchronize call, if it should happen. Also, waits for clean cycle end. -void protocol_buffer_synchronize() -{ - // If system is queued, ensure cycle resumes if the auto start flag is present. - protocol_auto_cycle_start(); - // Check and set auto start to resume cycle after synchronize and caller completes. - if (sys.state == STATE_CYCLE) { sys.auto_start = true; } - while (plan_get_current_block() || (sys.state == STATE_CYCLE)) { - protocol_execute_runtime(); // Check and execute run-time commands - if (sys.abort) { return; } // Check for system abort - } -} - - -// Auto-cycle start has two purposes: 1. Resumes a plan_synchronize() call from a function that -// requires the planner buffer to empty (spindle enable, dwell, etc.) 2. As a user setting that -// automatically begins the cycle when a user enters a valid motion command manually. This is -// intended as a beginners feature to help new users to understand g-code. It can be disabled -// as a beginner tool, but (1.) still operates. If disabled, the operation of cycle start is -// manually issuing a cycle start command whenever the user is ready and there is a valid motion -// command in the planner queue. -// NOTE: This function is called from the main loop and mc_line() only and executes when one of -// two conditions exist respectively: There are no more blocks sent (i.e. streaming is finished, -// single commands), or the planner buffer is full and ready to go. -void protocol_auto_cycle_start() { if (sys.auto_start) { bit_true_atomic(sys.execute, EXEC_CYCLE_START); } } diff --git a/spindle_control.c b/spindle_control.c deleted file mode 100644 index b8410844e..000000000 --- a/spindle_control.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - spindle_control.c - spindle control methods - Part of Grbl v0.9 - - Copyright (c) 2012-2014 Sungeun K. Jeon - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ -/* - This file is based on work from Grbl v0.8, distributed under the - terms of the MIT-license. See COPYING for more details. - Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2012 Sungeun K. Jeon -*/ - -#include "system.h" -#include "spindle_control.h" -#include "protocol.h" -#include "gcode.h" - - -void spindle_init() -{ - // On the Uno, spindle enable and PWM are shared. Other CPUs have seperate enable pin. - #ifdef VARIABLE_SPINDLE - SPINDLE_PWM_DDR |= (1< SPINDLE_RPM_RANGE ) { rpm = SPINDLE_RPM_RANGE; } // Prevent uint8 overflow - uint8_t current_pwm = floor( rpm*(255.0/SPINDLE_RPM_RANGE) + 0.5); - OCR_REGISTER = current_pwm; - - #ifndef CPU_MAP_ATMEGA328P // On the Uno, spindle enable and PWM are shared. - SPINDLE_ENABLE_PORT |= (1<. -*/ - -#include "system.h" -#include "settings.h" -#include "gcode.h" -#include "motion_control.h" -#include "report.h" -#include "print.h" - - -void system_init() -{ - PINOUT_DDR &= ~(PINOUT_MASK); // Configure as input pins - PINOUT_PORT |= PINOUT_MASK; // Enable internal pull-up resistors. Normal high operation. - PINOUT_PCMSK |= PINOUT_MASK; // Enable specific pins of the Pin Change Interrupt - PCICR |= (1 << PINOUT_INT); // Enable Pin Change Interrupt -} - - -// Pin change interrupt for pin-out commands, i.e. cycle start, feed hold, and reset. Sets -// only the runtime command execute variable to have the main program execute these when -// its ready. This works exactly like the character-based runtime commands when picked off -// directly from the incoming serial data stream. -ISR(PINOUT_INT_vect) -{ - // Enter only if any pinout pin is actively low. - if ((PINOUT_PIN & PINOUT_MASK) ^ PINOUT_MASK) { - if (bit_isfalse(PINOUT_PIN,bit(PIN_RESET))) { - mc_reset(); - } else if (bit_isfalse(PINOUT_PIN,bit(PIN_FEED_HOLD))) { - bit_true(sys.execute, EXEC_FEED_HOLD); - } else if (bit_isfalse(PINOUT_PIN,bit(PIN_CYCLE_START))) { - bit_true(sys.execute, EXEC_CYCLE_START); - } - } -} - - -// Executes user startup script, if stored. -void system_execute_startup(char *line) -{ - uint8_t n; - for (n=0; n < N_STARTUP_LINE; n++) { - if (!(settings_read_startup_line(n, line))) { - report_status_message(STATUS_SETTING_READ_FAIL); - } else { - if (line[0] != 0) { - printString(line); // Echo startup line to indicate execution. - report_status_message(gc_execute_line(line)); - } - } - } -} - - -// Directs and executes one line of formatted input from protocol_process. While mostly -// incoming streaming g-code blocks, this also executes Grbl internal commands, such as -// settings, initiating the homing cycle, and toggling switch states. This differs from -// the runtime command module by being susceptible to when Grbl is ready to execute the -// next line during a cycle, so for switches like block delete, the switch only effects -// the lines that are processed afterward, not necessarily real-time during a cycle, -// since there are motions already stored in the buffer. However, this 'lag' should not -// be an issue, since these commands are not typically used during a cycle. -uint8_t system_execute_line(char *line) -{ - uint8_t char_counter = 1; - uint8_t helper_var = 0; // Helper variable - float parameter, value; - switch( line[char_counter] ) { - case 0 : report_grbl_help(); break; - case '$' : // Prints Grbl settings - if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } - if ( sys.state & (STATE_CYCLE | STATE_HOLD) ) { return(STATUS_IDLE_ERROR); } // Block during cycle. Takes too long to print. - else { report_grbl_settings(); } - break; - case 'G' : // Prints gcode parser state - if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } - else { report_gcode_modes(); } - break; - case 'C' : // Set check g-code mode [IDLE/CHECK] - if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } - // Perform reset when toggling off. Check g-code mode should only work if Grbl - // is idle and ready, regardless of alarm locks. This is mainly to keep things - // simple and consistent. - if ( sys.state == STATE_CHECK_MODE ) { - mc_reset(); - report_feedback_message(MESSAGE_DISABLED); - } else { - if (sys.state) { return(STATUS_IDLE_ERROR); } // Requires no alarm mode. - sys.state = STATE_CHECK_MODE; - report_feedback_message(MESSAGE_ENABLED); - } - break; - case 'X' : // Disable alarm lock [ALARM] - if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } - if (sys.state == STATE_ALARM) { - report_feedback_message(MESSAGE_ALARM_UNLOCK); - sys.state = STATE_IDLE; - // Don't run startup script. Prevents stored moves in startup from causing accidents. - } // Otherwise, no effect. - break; -// case 'J' : break; // Jogging methods - // TODO: Here jogging can be placed for execution as a seperate subprogram. It does not need to be - // susceptible to other runtime commands except for e-stop. The jogging function is intended to - // be a basic toggle on/off with controlled acceleration and deceleration to prevent skipped - // steps. The user would supply the desired feedrate, axis to move, and direction. Toggle on would - // start motion and toggle off would initiate a deceleration to stop. One could 'feather' the - // motion by repeatedly toggling to slow the motion to the desired location. Location data would - // need to be updated real-time and supplied to the user through status queries. - // More controlled exact motions can be taken care of by inputting G0 or G1 commands, which are - // handled by the planner. It would be possible for the jog subprogram to insert blocks into the - // block buffer without having the planner plan them. It would need to manage de/ac-celerations - // on its own carefully. This approach could be effective and possibly size/memory efficient. - default : - // Block any system command that requires the state as IDLE/ALARM. (i.e. EEPROM, homing) - if ( !(sys.state == STATE_IDLE || sys.state == STATE_ALARM) ) { return(STATUS_IDLE_ERROR); } - switch( line[char_counter] ) { - case '#' : // Print Grbl NGC parameters - if ( line[++char_counter] != 0 ) { return(STATUS_INVALID_STATEMENT); } - else { report_ngc_parameters(); } - break; - case 'H' : // Perform homing cycle [IDLE/ALARM] - if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { - // Only perform homing if Grbl is idle or lost. - mc_homing_cycle(); - if (!sys.abort) { system_execute_startup(line); } // Execute startup scripts after successful homing. - } else { return(STATUS_SETTING_DISABLED); } - break; - case 'I' : // Print or store build info. [IDLE/ALARM] - if ( line[++char_counter] == 0 ) { - settings_read_build_info(line); - report_build_info(line); - } else { // Store startup line [IDLE/ALARM] - if(line[char_counter++] != '=') { return(STATUS_INVALID_STATEMENT); } - helper_var = char_counter; // Set helper variable as counter to start of user info line. - do { - line[char_counter-helper_var] = line[char_counter]; - } while (line[char_counter++] != 0); - settings_store_build_info(line); - } - break; - case 'N' : // Startup lines. [IDLE/ALARM] - if ( line[++char_counter] == 0 ) { // Print startup lines - for (helper_var=0; helper_var < N_STARTUP_LINE; helper_var++) { - if (!(settings_read_startup_line(helper_var, line))) { - report_status_message(STATUS_SETTING_READ_FAIL); - } else { - report_startup_line(helper_var,line); - } - } - break; - } else { // Store startup line [IDLE Only] Prevents motion during ALARM. - if (sys.state != STATE_IDLE) { return(STATUS_IDLE_ERROR); } // Store only when idle. - helper_var = true; // Set helper_var to flag storing method. - // No break. Continues into default: to read remaining command characters. - } - default : // Storing setting methods [IDLE/ALARM] - if(!read_float(line, &char_counter, ¶meter)) { return(STATUS_BAD_NUMBER_FORMAT); } - if(line[char_counter++] != '=') { return(STATUS_INVALID_STATEMENT); } - if (helper_var) { // Store startup line - // Prepare sending gcode block to gcode parser by shifting all characters - helper_var = char_counter; // Set helper variable as counter to start of gcode block - do { - line[char_counter-helper_var] = line[char_counter]; - } while (line[char_counter++] != 0); - // Execute gcode block to ensure block is valid. - helper_var = gc_execute_line(line); // Set helper_var to returned status code. - if (helper_var) { return(helper_var); } - else { - helper_var = trunc(parameter); // Set helper_var to int value of parameter - settings_store_startup_line(helper_var,line); - } - } else { // Store global setting. - if(!read_float(line, &char_counter, &value)) { return(STATUS_BAD_NUMBER_FORMAT); } - if(line[char_counter] != 0) { return(STATUS_INVALID_STATEMENT); } - return(settings_store_global_setting((uint8_t)parameter, value)); - } - } - } - return(STATUS_OK); // If '$' command makes it to here, then everything's ok. -} diff --git a/system.h b/system.h deleted file mode 100644 index 93ab2b96a..000000000 --- a/system.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - system.h - Header for system level commands and real-time processes - Part of Grbl v0.9 - - Copyright (c) 2014 Sungeun K. Jeon - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ - -#ifndef system_h -#define system_h - -// Define system header files and standard libraries used by Grbl -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Define Grbl configuration and shared header files -#include "config.h" -#include "defaults.h" -#include "cpu_map.h" -#include "nuts_bolts.h" - - -// Define system executor bit map. Used internally by runtime protocol as runtime command flags, -// which notifies the main program to execute the specified runtime command asynchronously. -// NOTE: The system executor uses an unsigned 8-bit volatile variable (8 flag limit.) The default -// flags are always false, so the runtime protocol only needs to check for a non-zero value to -// know when there is a runtime command to execute. -#define EXEC_STATUS_REPORT bit(0) // bitmask 00000001 -#define EXEC_CYCLE_START bit(1) // bitmask 00000010 -#define EXEC_CYCLE_STOP bit(2) // bitmask 00000100 -#define EXEC_FEED_HOLD bit(3) // bitmask 00001000 -#define EXEC_RESET bit(4) // bitmask 00010000 -#define EXEC_ALARM bit(5) // bitmask 00100000 -#define EXEC_CRIT_EVENT bit(6) // bitmask 01000000 -// #define bit(7) // bitmask 10000000 - -// Define system state bit map. The state variable primarily tracks the individual functions -// of Grbl to manage each without overlapping. It is also used as a messaging flag for -// critical events. -#define STATE_IDLE 0 // Must be zero. No flags. -#define STATE_ALARM bit(0) // In alarm state. Locks out all g-code processes. Allows settings access. -#define STATE_CHECK_MODE bit(1) // G-code check mode. Locks out planner and motion only. -#define STATE_HOMING bit(2) // Performing homing cycle -#define STATE_QUEUED bit(3) // Indicates buffered blocks, awaiting cycle start. -#define STATE_CYCLE bit(4) // Cycle is running -#define STATE_HOLD bit(5) // Executing feed hold -// #define STATE_JOG bit(6) // Jogging mode is unique like homing. - - -// Define global system variables -typedef struct { - uint8_t abort; // System abort flag. Forces exit back to main loop for reset. - uint8_t state; // Tracks the current state of Grbl. - volatile uint8_t execute; // Global system runtime executor bitflag variable. See EXEC bitmasks. - uint8_t homing_axis_lock; - int32_t position[N_AXIS]; // Real-time machine (aka home) position vector in steps. - // NOTE: This may need to be a volatile variable, if problems arise. - uint8_t auto_start; // Planner auto-start flag. Toggled off during feed hold. Defaulted by settings. - volatile uint8_t probe_state; // Probing state value. Used to coordinate the probing cycle with stepper ISR. - int32_t probe_position[N_AXIS]; // Last probe position in machine coordinates and steps. -} system_t; -extern system_t sys; - - -// Initialize the serial protocol -void system_init(); - -// Executes an internal system command, defined as a string starting with a '$' -uint8_t system_execute_line(char *line); - -// Checks and executes a runtime command at various stop points in main program -void system_execute_runtime(); - -// Execute the startup script lines stored in EEPROM upon initialization -void system_execute_startup(char *line); - -#endif diff --git a/test/gcode/8x_gear_test.nc b/test/gcode/8x_gear_test.nc deleted file mode 100644 index 35abf40da..000000000 --- a/test/gcode/8x_gear_test.nc +++ /dev/null @@ -1,4919 +0,0 @@ -(Test program provided by @kikigey89) -(Possible lockup issues when cutting gear tooth feature) -G17 -G90 -M3 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -G0 Z3.000 -G0 X15.000 Y15.695 -G1 Z-1.700 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G1 Z-3.400 F200 -G3 X15.000 Y14.305 I0.000 J-0.695 F300 -G3 X15.000 Y15.695 I0.000 J0.695 -G0 Z3.000 -G0 Z3.000 -G0 X15.177 Y14.225 -G1 Z-3.400 F200 -G2 X14.823 Y15.775 I-0.177 J0.775 F300 -G2 X15.177 Y14.225 I0.177 J-0.775 -G0 Z3.000 -G0 Z3.000 -G0 X26.678 Y16.047 -G1 Z-1.200 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G1 Z-2.400 F200 -G1 X26.672 Y16.116 F300 -G1 X27.063 Y16.214 -G3 X27.905 Y16.578 I-0.857 J3.140 -G3 X28.740 Y17.161 I-2.944 J5.110 -G1 X29.415 Y17.789 -G3 X29.661 Y18.615 I-0.579 J0.622 -G1 X29.395 Y19.561 -G3 X28.724 Y20.217 I-0.906 J-0.255 -G1 X27.820 Y20.396 -G3 X26.934 Y20.454 I-0.862 J-6.341 -G3 X25.511 Y20.195 I-0.043 J-3.796 -G1 X25.482 Y20.254 -G1 X25.809 Y20.490 -G3 X26.463 Y21.134 I-1.924 J2.610 -G3 X27.032 Y21.978 I-4.648 J3.740 -G1 X27.434 Y22.808 -G3 X27.364 Y23.668 I-0.765 J0.371 -G1 X26.761 Y24.470 -G3 X25.913 Y24.823 I-0.729 J-0.558 -G1 X25.005 Y24.663 -G3 X24.157 Y24.397 I1.492 J-6.239 -G3 X22.925 Y23.642 I1.331 J-3.555 -G1 X22.873 Y23.688 -G1 X23.096 Y24.024 -G3 X23.474 Y24.860 I-2.746 J1.742 -G3 X23.698 Y25.853 I-5.620 J1.794 -G1 X23.774 Y26.772 -G3 X23.398 Y27.549 I-0.847 J0.070 -G1 X22.582 Y28.058 -G3 X21.627 Y28.101 I-0.514 J-0.786 -G1 X20.838 Y27.624 -G3 X20.144 Y27.070 I3.612 J-5.239 -G3 X19.268 Y25.921 I2.527 J-2.836 -G1 X19.208 Y25.944 -G1 X19.290 Y26.339 -G3 X19.339 Y27.256 I-3.189 J0.632 -G3 X19.190 Y28.263 I-5.915 J-0.361 -G1 X18.929 Y29.147 -G3 X18.298 Y29.735 I-0.816 J-0.242 -G1 X17.311 Y29.922 -G3 X16.447 Y29.611 I-0.168 J-0.889 -G1 X15.884 Y28.881 -G3 X15.437 Y28.114 I5.285 J-3.594 -G3 X15.035 Y26.725 I3.375 J-1.729 -G1 X14.965 Y26.725 -G1 X14.904 Y27.123 -G3 X14.619 Y27.996 I-3.195 J-0.560 -G3 X14.116 Y28.881 I-5.389 J-2.476 -G1 X13.553 Y29.611 -G3 X12.979 Y29.936 I-0.673 J-0.519 -G1 X12.754 Y29.932 -G1 X11.784 Y29.754 -G3 X11.071 Y29.147 I0.171 J-0.923 -G1 X10.810 Y28.263 -G3 X10.670 Y27.386 I6.272 J-1.449 -G3 X10.797 Y25.946 I3.773 J-0.393 -G1 X10.738 Y25.923 -G1 X10.531 Y26.270 -G3 X9.950 Y26.980 I-2.779 J-1.677 -G3 X9.162 Y27.624 I-4.108 J-4.228 -G1 X8.373 Y28.101 -G3 X7.509 Y28.111 I-0.440 J-0.727 -G1 X6.687 Y27.606 -G3 X6.226 Y26.772 I0.474 J-0.807 -G1 X6.302 Y25.853 -G3 X6.488 Y24.985 I6.290 J0.896 -G3 X7.127 Y23.688 I3.664 J0.998 -G1 X7.082 Y23.648 -G1 X6.762 Y23.894 -G3 X5.963 Y24.347 I-1.985 J-2.568 -G3 X4.995 Y24.663 I-2.322 J-5.483 -G1 X4.087 Y24.823 -G3 X3.279 Y24.520 I-0.147 J-0.837 -G1 X2.696 Y23.754 -G3 X2.566 Y22.808 I0.736 J-0.583 -G1 X2.968 Y21.978 -G3 X3.456 Y21.236 I5.613 J3.156 -G3 X4.520 Y20.257 I3.053 J2.251 -G1 X4.492 Y20.201 -G1 X4.105 Y20.318 -G3 X3.197 Y20.452 I-0.924 J-3.115 -G3 X2.180 Y20.396 I-0.184 J-5.952 -G1 X1.276 Y20.217 -G3 X0.632 Y19.643 I0.165 J-0.834 -G1 X0.360 Y18.697 -G3 X0.585 Y17.789 I0.900 J-0.259 -G1 X1.260 Y17.161 -G3 X1.982 Y16.645 I4.045 J4.900 -G3 X3.328 Y16.116 I2.036 J3.208 -G1 X3.322 Y16.051 -G1 X2.920 Y16.023 -G3 X2.025 Y15.820 I0.264 J-3.238 -G3 X1.097 Y15.401 I1.964 J-5.586 -G1 X0.318 Y14.907 -G3 X-0.075 Y14.140 I0.455 J-0.718 -G1 X0.015 Y13.139 -G3 X0.551 Y12.393 I0.912 J0.091 -G1 X1.407 Y12.051 -G3 X2.267 Y11.831 I1.996 J6.006 -G3 X3.713 Y11.825 I0.740 J3.723 -G1 X3.731 Y11.761 -G1 X3.366 Y11.590 -G3 X2.605 Y11.077 I1.418 J-2.927 -G3 X1.891 Y10.351 I3.858 J-4.507 -G1 X1.343 Y9.610 -G3 X1.253 Y8.753 I0.684 J-0.505 -G1 X1.692 Y7.866 -G3 X2.468 Y7.350 I0.834 J0.413 -G1 X3.390 Y7.340 -G3 X4.272 Y7.446 I-0.324 J6.435 -G3 X5.622 Y7.962 I-0.655 J3.740 -G1 X5.662 Y7.910 -G1 X5.383 Y7.617 -G3 X4.859 Y6.865 I2.380 J-2.217 -G3 X4.494 Y6.041 I5.116 J-2.758 -G3 X4.212 Y5.040 I7.161 J-2.557 -G3 X4.439 Y4.208 I0.820 J-0.224 -G1 X5.180 Y3.529 -G3 X6.078 Y3.340 I0.614 J0.686 -G1 X6.941 Y3.664 -G3 X7.725 Y4.080 I-2.599 J5.835 -G3 X8.798 Y5.050 I-1.962 J3.251 -G1 X8.857 Y5.013 -G1 X8.700 Y4.642 -G3 X8.482 Y3.751 I3.014 J-1.207 -G3 X8.444 Y2.733 I5.829 J-0.729 -G1 X8.539 Y1.816 -G3 X8.856 Y1.237 I0.846 J0.087 -G3 X9.283 Y1.024 I1.367 J2.207 -G1 X10.007 Y0.750 -G3 X10.893 Y0.904 I0.312 J0.829 -G1 X11.581 Y1.518 -G3 X12.161 Y2.190 I-4.586 J4.549 -G3 X12.812 Y3.481 I-3.003 J2.322 -G1 X12.880 Y3.468 -G1 X12.867 Y3.066 -G3 X12.986 Y2.156 I3.248 J-0.036 -G3 X13.318 Y1.193 I5.723 J1.433 -G1 X13.738 Y0.372 -G3 X14.465 Y-0.090 I0.757 J0.387 -G1 X15.492 Y-0.092 -G3 X16.262 Y0.372 I0.010 J0.856 -G1 X16.682 Y1.193 -G3 X16.980 Y2.029 I-5.917 J2.584 -G3 X17.120 Y3.468 I-3.640 J1.081 -G1 X17.183 Y3.480 -G1 X17.322 Y3.101 -G3 X17.762 Y2.296 I3.040 J1.138 -G3 X18.419 Y1.518 I4.841 J3.423 -G1 X19.107 Y0.904 -G3 X19.953 Y0.736 I0.566 J0.634 -G1 X20.717 Y1.024 -G1 X20.891 Y1.096 -G3 X21.461 Y1.816 I-0.341 J0.856 -G1 X21.556 Y2.733 -G3 X21.532 Y3.620 I-6.357 J0.275 -G3 X21.143 Y5.013 I-3.785 J-0.308 -G1 X21.200 Y5.048 -G1 X21.464 Y4.743 -G3 X22.165 Y4.151 I2.423 J2.160 -G3 X23.059 Y3.664 I3.276 J4.938 -G1 X23.922 Y3.340 -G3 X24.771 Y3.488 I0.299 J0.796 -G1 X25.501 Y4.149 -G3 X25.788 Y5.040 I-0.627 J0.693 -G1 X25.545 Y5.930 -G3 X25.202 Y6.749 I-5.980 J-2.020 -G3 X24.336 Y7.906 I-3.418 J-1.654 -G1 X24.376 Y7.960 -G1 X24.732 Y7.771 -G3 X25.600 Y7.472 I1.480 J2.889 -G3 X26.610 Y7.340 I1.273 J5.800 -G1 X27.532 Y7.350 -G3 X28.270 Y7.794 I-0.009 J0.850 -G1 X28.729 Y8.713 -G3 X28.657 Y9.610 I-0.795 J0.388 -G1 X28.109 Y10.351 -G3 X27.494 Y10.991 I-4.939 J-4.135 -G3 X26.268 Y11.758 I-2.590 J-2.778 -G1 X26.287 Y11.825 -G1 X26.687 Y11.775 -G3 X27.604 Y11.810 I0.335 J3.237 -G3 X28.593 Y12.051 I-0.898 J5.823 -G1 X29.449 Y12.393 -G3 X29.977 Y13.075 I-0.315 J0.789 -G1 X30.070 Y14.054 -G3 X29.682 Y14.907 I-0.915 J0.098 -G1 X28.903 Y15.401 -G3 X28.098 Y15.775 I-3.105 J-5.626 -G3 X26.678 Y16.047 I-1.412 J-3.523 -G0 Z3.000 -G0 Z3.000 -G0 X26.565 Y16.179 -G1 Z-3.400 F200 -G1 X27.244 Y16.375 F300 -G3 X27.861 Y16.668 I-1.564 J4.089 -G3 X28.672 Y17.234 I-2.916 J5.043 -G1 X29.347 Y17.862 -G3 X29.564 Y18.591 I-0.511 J0.549 -G1 X29.299 Y19.531 -G3 X28.705 Y20.119 I-0.810 J-0.225 -G1 X27.800 Y20.298 -G3 X26.813 Y20.352 I-0.832 J-6.136 -G3 X25.496 Y20.086 I0.158 J-4.176 -G1 X25.453 Y20.086 -G1 X25.359 Y20.276 -G1 X25.921 Y20.705 -G3 X26.390 Y21.201 I-2.897 J3.212 -G3 X26.942 Y22.022 I-4.517 J3.633 -G1 X27.344 Y22.852 -G3 X27.283 Y23.610 I-0.674 J0.327 -G1 X26.683 Y24.408 -G3 X25.930 Y24.724 I-0.652 J-0.499 -G1 X25.022 Y24.564 -G3 X24.082 Y24.258 I1.449 J-6.047 -G3 X22.950 Y23.534 I1.656 J-3.838 -G1 X22.910 Y23.519 -G1 X22.754 Y23.661 -G1 X23.122 Y24.265 -G3 X23.381 Y24.897 I-3.922 J1.972 -G3 X23.599 Y25.862 I-5.522 J1.756 -G1 X23.674 Y26.781 -G3 X23.343 Y27.466 I-0.747 J0.061 -G1 X22.532 Y27.972 -G3 X21.679 Y28.016 I-0.463 J-0.700 -G1 X20.890 Y27.539 -G3 X20.124 Y26.913 I3.540 J-5.120 -G3 X19.330 Y25.830 I2.930 J-2.980 -G1 X19.299 Y25.801 -G1 X19.102 Y25.877 -G1 X19.227 Y26.574 -G3 X19.239 Y27.256 I-4.331 J0.422 -G3 X19.094 Y28.234 I-5.814 J-0.362 -G1 X18.833 Y29.119 -G3 X18.276 Y29.638 I-0.719 J-0.213 -G1 X17.296 Y29.823 -G3 X16.526 Y29.550 I-0.153 J-0.789 -G1 X15.963 Y28.820 -G3 X15.474 Y27.960 I5.183 J-3.514 -G3 X15.125 Y26.662 I3.812 J-1.721 -G1 X15.107 Y26.625 -G1 X14.893 Y26.625 -G1 X14.761 Y27.319 -G3 X14.526 Y27.960 I-4.219 J-1.182 -G3 X14.037 Y28.820 I-5.261 J-2.420 -G1 X13.474 Y29.550 -G3 X12.967 Y29.836 I-0.593 J-0.458 -G1 X12.768 Y29.833 -G1 X11.805 Y29.656 -G3 X11.167 Y29.119 I0.149 J-0.825 -G1 X10.906 Y28.234 -G3 X10.761 Y27.256 I6.098 J-1.404 -G3 X10.904 Y25.921 I4.171 J-0.228 -G1 X10.900 Y25.878 -G1 X10.704 Y25.802 -G1 X10.327 Y26.401 -G3 X9.876 Y26.913 I-3.513 J-2.632 -G3 X9.110 Y27.539 I-4.021 J-4.144 -G1 X8.321 Y28.016 -G3 X7.559 Y28.024 I-0.388 J-0.641 -G1 X6.728 Y27.513 -G3 X6.326 Y26.781 I0.420 J-0.707 -G1 X6.401 Y25.862 -G3 X6.586 Y25.007 I6.260 J0.903 -G3 X7.236 Y23.703 I3.682 J1.021 -G1 X7.247 Y23.663 -G1 X7.104 Y23.531 -G1 X7.090 Y23.519 -G1 X6.524 Y23.942 -G3 X5.918 Y24.258 I-2.309 J-3.691 -G3 X4.978 Y24.564 I-2.269 J-5.370 -G1 X4.070 Y24.724 -G3 X3.357 Y24.457 I-0.130 J-0.738 -G1 X2.778 Y23.696 -G3 X2.656 Y22.852 I0.652 J-0.525 -G1 X3.058 Y22.022 -G3 X3.610 Y21.201 I5.399 J3.035 -G3 X4.616 Y20.311 I3.242 J2.648 -G1 X4.642 Y20.277 -G1 X4.547 Y20.086 -G1 X3.866 Y20.277 -G3 X3.187 Y20.352 I-0.824 J-4.316 -G3 X2.200 Y20.298 I-0.178 J-5.782 -G1 X1.295 Y20.119 -G3 X0.727 Y19.613 I0.145 J-0.736 -G1 X0.457 Y18.673 -G3 X0.653 Y17.862 I0.799 J-0.235 -G1 X1.328 Y17.234 -G3 X2.040 Y16.727 I3.997 J4.855 -G3 X3.399 Y16.201 I2.032 J3.234 -G1 X3.435 Y16.179 -G1 X3.415 Y15.966 -G1 X2.712 Y15.898 -G3 X2.052 Y15.723 I0.781 J-4.287 -G3 X1.150 Y15.316 I1.929 J-5.470 -G1 X0.372 Y14.823 -G3 X0.024 Y14.146 I0.402 J-0.634 -G1 X0.114 Y13.151 -G3 X0.588 Y12.486 I0.811 J0.077 -G1 X1.444 Y12.144 -G3 X2.291 Y11.928 I1.969 J5.953 -G3 X3.748 Y11.929 I0.727 J3.755 -G1 X3.790 Y11.922 -G1 X3.849 Y11.716 -G1 X3.217 Y11.398 -G3 X2.665 Y10.997 I2.268 J-3.704 -G3 X1.971 Y10.292 I3.808 J-4.436 -G1 X1.423 Y9.550 -G3 X1.344 Y8.794 I0.603 J-0.446 -G1 X1.780 Y7.913 -G3 X2.469 Y7.450 I0.747 J0.367 -G1 X3.391 Y7.440 -G3 X4.372 Y7.568 I-0.322 J6.277 -G3 X5.617 Y8.072 I-0.922 J4.075 -G1 X5.659 Y8.080 -G1 X5.788 Y7.910 -G1 X5.314 Y7.385 -G3 X4.944 Y6.812 I3.456 J-2.637 -G3 X4.552 Y5.903 I5.113 J-2.744 -G1 X4.309 Y5.014 -G3 X4.509 Y4.279 I0.724 J-0.198 -G1 X5.138 Y3.698 -G1 X5.245 Y3.605 -G3 X6.043 Y3.433 I0.549 J0.607 -G1 X6.906 Y3.757 -G3 X7.677 Y4.168 I-2.547 J5.709 -G3 X8.754 Y5.150 I-1.991 J3.263 -G1 X8.790 Y5.173 -G1 X8.968 Y5.063 -G1 X8.719 Y4.400 -G3 X8.581 Y3.732 I4.201 J-1.215 -G3 X8.544 Y2.743 I5.769 J-0.711 -G1 X8.638 Y1.826 -G3 X9.089 Y1.214 I0.746 J0.077 -G1 X9.984 Y0.864 -G3 X10.826 Y0.979 I0.324 J0.769 -G1 X11.514 Y1.593 -G3 X12.152 Y2.348 I-4.445 J4.404 -G3 X12.734 Y3.559 I-3.429 J2.391 -G1 X12.759 Y3.593 -G1 X12.965 Y3.554 -G1 X12.972 Y2.847 -G3 X13.085 Y2.174 I4.365 J0.386 -G3 X13.407 Y1.238 I5.620 J1.414 -G1 X13.827 Y0.418 -G3 X14.468 Y0.009 I0.668 J0.341 -G1 X15.489 Y0.008 -G3 X16.173 Y0.418 I0.012 J0.757 -G1 X16.593 Y1.238 -G3 X16.886 Y2.062 I-5.788 J2.524 -G3 X17.020 Y3.513 I-3.668 J1.070 -G1 X17.031 Y3.554 -G1 X17.239 Y3.593 -G1 X17.499 Y2.935 -G3 X17.848 Y2.348 I3.917 J1.928 -G3 X18.486 Y1.593 I4.730 J3.350 -G1 X19.174 Y0.979 -G3 X19.920 Y0.830 I0.499 J0.559 -G1 X20.852 Y1.189 -G3 X21.362 Y1.826 I-0.302 J0.764 -G1 X21.456 Y2.743 -G3 X21.419 Y3.732 I-6.218 J0.261 -G3 X21.033 Y5.018 I-4.146 J-0.544 -G1 X21.029 Y5.060 -G1 X21.210 Y5.172 -G1 X21.689 Y4.652 -G3 X22.226 Y4.231 I2.943 J3.196 -G3 X23.094 Y3.757 I3.198 J4.828 -G1 X23.957 Y3.433 -G3 X24.539 Y3.456 I0.264 J0.703 -G1 X24.862 Y3.698 -G1 X24.862 Y3.698 -G1 X25.433 Y4.223 -G3 X25.691 Y5.014 I-0.558 J0.619 -G1 X25.448 Y5.903 -G3 X25.056 Y6.812 I-5.892 J-2.003 -G3 X24.231 Y7.872 I-3.670 J-2.005 -G1 X24.212 Y7.910 -G1 X24.338 Y8.077 -G1 X24.975 Y7.767 -G3 X25.628 Y7.568 I1.591 J4.052 -G3 X26.609 Y7.440 I1.243 J5.688 -G1 X27.531 Y7.450 -G3 X28.182 Y7.842 I-0.008 J0.750 -G1 X28.638 Y8.755 -G3 X28.576 Y9.550 I-0.707 J0.346 -G1 X28.029 Y10.292 -G3 X27.335 Y10.997 I-4.781 J-4.005 -G3 X26.183 Y11.688 I-2.697 J-3.194 -G1 X26.151 Y11.716 -G1 X26.210 Y11.922 -G1 X26.915 Y11.859 -G3 X27.595 Y11.909 I0.021 J4.345 -G3 X28.556 Y12.144 I-0.892 J5.733 -G1 X29.412 Y12.486 -G3 X29.878 Y13.088 I-0.278 J0.697 -G1 X29.971 Y14.061 -G3 X29.628 Y14.823 I-0.815 J0.091 -G1 X28.850 Y15.316 -G3 X27.948 Y15.723 I-3.008 J-5.457 -G3 X26.624 Y15.951 I-1.360 J-3.947 -G1 X26.585 Y15.966 -G1 X26.565 Y16.179 -G0 Z3.000 -G0 X0 Y0 -M5 -M30 diff --git a/test/gcode/HSM_test.nc b/test/gcode/HSM_test.nc deleted file mode 100644 index 7a2166d12..000000000 --- a/test/gcode/HSM_test.nc +++ /dev/null @@ -1,1758 +0,0 @@ -(DO NOT USE WHEN CONNECTED TO A MACHINE!!) -(EXCEEDINGLY FAST HIGH-SPEED POCKETING ROUTINE) -(NC program provided by Todd Fleming) - -G90 -G1 X0 Y0 F200.00000 -G1 Z0 F200.00000 - -G1 Z-6.00000 - -(Slow cut small circle) - -G1 X1.58750 F100.00000 -G1 -G1 X1.58437 Y0.09968 -G1 X1.57498 Y0.19897 -G1 X1.55938 Y0.29747 -G1 X1.53763 Y0.39480 -G1 X1.50980 Y0.49056 -G1 X1.47602 Y0.58440 -G1 X1.43641 Y0.67592 -G1 X1.39114 Y0.76478 -G1 X1.34037 Y0.85063 -G1 X1.28431 Y0.93311 -G1 X1.22319 Y1.01191 -G1 X1.15724 Y1.08672 -G1 X1.08672 Y1.15724 -G1 X1.01191 Y1.22319 -G1 X0.93311 Y1.28431 -G1 X0.85063 Y1.34037 -G1 X0.76478 Y1.39114 -G1 X0.67592 Y1.43641 -G1 X0.58440 Y1.47602 -G1 X0.49056 Y1.50980 -G1 X0.39480 Y1.53763 -G1 X0.29747 Y1.55938 -G1 X0.19897 Y1.57498 -G1 X0.09968 Y1.58437 -G1 X0.00000 Y1.58750 -G1 X-0.09968 Y1.58437 -G1 X-0.19897 Y1.57498 -G1 X-0.29747 Y1.55938 -G1 X-0.39480 Y1.53763 -G1 X-0.49056 Y1.50980 -G1 X-0.58440 Y1.47602 -G1 X-0.67592 Y1.43641 -G1 X-0.76478 Y1.39114 -G1 X-0.85063 Y1.34037 -G1 X-0.93311 Y1.28431 -G1 X-1.01191 Y1.22319 -G1 X-1.08672 Y1.15724 -G1 X-1.15724 Y1.08672 -G1 X-1.22319 Y1.01191 -G1 X-1.28431 Y0.93311 -G1 X-1.34037 Y0.85063 -G1 X-1.39114 Y0.76478 -G1 X-1.43641 Y0.67592 -G1 X-1.47602 Y0.58440 -G1 X-1.50980 Y0.49056 -G1 X-1.53763 Y0.39480 -G1 X-1.55938 Y0.29747 -G1 X-1.57498 Y0.19897 -G1 X-1.58437 Y0.09968 -G1 X-1.58750 Y0.00000 -G1 X-1.58437 Y-0.09968 -G1 X-1.57498 Y-0.19897 -G1 X-1.55938 Y-0.29747 -G1 X-1.53763 Y-0.39480 -G1 X-1.50980 Y-0.49056 -G1 X-1.47602 Y-0.58440 -G1 X-1.43641 Y-0.67592 -G1 X-1.39114 Y-0.76478 -G1 X-1.34037 Y-0.85063 -G1 X-1.28431 Y-0.93311 -G1 X-1.22319 Y-1.01191 -G1 X-1.15724 Y-1.08672 -G1 X-1.08672 Y-1.15724 -G1 X-1.01191 Y-1.22319 -G1 X-0.93311 Y-1.28431 -G1 X-0.85063 Y-1.34037 -G1 X-0.76478 Y-1.39114 -G1 X-0.67592 Y-1.43641 -G1 X-0.58440 Y-1.47602 -G1 X-0.49056 Y-1.50980 -G1 X-0.39480 Y-1.53763 -G1 X-0.29747 Y-1.55938 -G1 X-0.19897 Y-1.57498 -G1 X-0.09968 Y-1.58437 -G1 X-0.00000 Y-1.58750 -G1 X0.09968 Y-1.58437 -G1 X0.19897 Y-1.57498 -G1 X0.29747 Y-1.55938 -G1 X0.39480 Y-1.53763 -G1 X0.49056 Y-1.50980 -G1 X0.58440 Y-1.47602 -G1 X0.67592 Y-1.43641 -G1 X0.76478 Y-1.39114 -G1 X0.85063 Y-1.34037 -G1 X0.93311 Y-1.28431 -G1 X1.01191 Y-1.22319 -G1 X1.08672 Y-1.15724 -G1 X1.15724 Y-1.08672 -G1 X1.22319 Y-1.01191 -G1 X1.28431 Y-0.93311 -G1 X1.34037 Y-0.85063 -G1 X1.39114 Y-0.76478 -G1 X1.43641 Y-0.67592 -G1 X1.47602 Y-0.58440 -G1 X1.50980 Y-0.49056 -G1 X1.53763 Y-0.39480 -G1 X1.55938 Y-0.29747 -G1 X1.57498 Y-0.19897 -G1 X1.58437 Y-0.09968 -G1 X1.58750 Y-0.00000 -G1 X0.00000 Y0.00000 F500.00000 - -(Spiral) - -G1 F15000.00000 -G1 X0.00549 Y0.00035 -G1 X0.01091 Y0.00138 -G1 X0.01621 Y0.00309 -G1 X0.02131 Y0.00547 -G1 X0.02615 Y0.00850 -G1 X0.03068 Y0.01215 -G1 X0.03484 Y0.01639 -G1 X0.03856 Y0.02120 -G1 X0.04179 Y0.02652 -G1 X0.04450 Y0.03233 -G1 X0.04662 Y0.03856 -G1 X0.04811 Y0.04518 -G1 X0.04895 Y0.05212 -G1 X0.04908 Y0.05933 -G1 X0.04849 Y0.06674 -G1 X0.04715 Y0.07430 -G1 X0.04504 Y0.08193 -G1 X0.04215 Y0.08958 -G1 X0.03847 Y0.09716 -G1 X0.03399 Y0.10462 -G1 X0.02872 Y0.11187 -G1 X0.02267 Y0.11886 -G1 X0.01585 Y0.12550 -G1 X0.00829 Y0.13174 -G1 X-0.00000 Y0.13750 -G1 X-0.00898 Y0.14272 -G1 X-0.01861 Y0.14733 -G1 X-0.02886 Y0.15127 -G1 X-0.03967 Y0.15449 -G1 X-0.05099 Y0.15692 -G1 X-0.06277 Y0.15853 -G1 X-0.07494 Y0.15925 -G1 X-0.08744 Y0.15905 -G1 X-0.10020 Y0.15789 -G1 X-0.11315 Y0.15574 -G1 X-0.12621 Y0.15256 -G1 X-0.13931 Y0.14835 -G1 X-0.15235 Y0.14307 -G1 X-0.16528 Y0.13673 -G1 X-0.17798 Y0.12931 -G1 X-0.19040 Y0.12083 -G1 X-0.20243 Y0.11129 -G1 X-0.21399 Y0.10070 -G1 X-0.22501 Y0.08909 -G1 X-0.23539 Y0.07648 -G1 X-0.24505 Y0.06292 -G1 X-0.25392 Y0.04844 -G1 X-0.26192 Y0.03309 -G1 X-0.26897 Y0.01692 -G1 X-0.27500 Y-0.00000 -G1 X-0.27995 Y-0.01761 -G1 X-0.28374 Y-0.03585 -G1 X-0.28634 Y-0.05462 -G1 X-0.28767 Y-0.07386 -G1 X-0.28769 Y-0.09348 -G1 X-0.28637 Y-0.11338 -G1 X-0.28366 Y-0.13348 -G1 X-0.27954 Y-0.15368 -G1 X-0.27398 Y-0.17388 -G1 X-0.26698 Y-0.19397 -G1 X-0.25851 Y-0.21386 -G1 X-0.24858 Y-0.23343 -G1 X-0.23720 Y-0.25259 -G1 X-0.22437 Y-0.27122 -G1 X-0.21013 Y-0.28922 -G1 X-0.19451 Y-0.30649 -G1 X-0.17753 Y-0.32292 -G1 X-0.15924 Y-0.33841 -G1 X-0.13970 Y-0.35285 -G1 X-0.11897 Y-0.36616 -G1 X-0.09711 Y-0.37823 -G1 X-0.07420 Y-0.38899 -G1 X-0.05032 Y-0.39833 -G1 X-0.02556 Y-0.40620 -G1 X-0.00000 Y-0.41250 -G1 X0.02625 Y-0.41718 -G1 X0.05308 Y-0.42016 -G1 X0.08039 Y-0.42140 -G1 X0.10806 Y-0.42085 -G1 X0.13597 Y-0.41846 -G1 X0.16400 Y-0.41422 -G1 X0.19203 Y-0.40808 -G1 X0.21992 Y-0.40003 -G1 X0.24755 Y-0.39008 -G1 X0.27479 Y-0.37822 -G1 X0.30150 Y-0.36445 -G1 X0.32756 Y-0.34881 -G1 X0.35282 Y-0.33132 -G1 X0.37717 Y-0.31202 -G1 X0.40046 Y-0.29095 -G1 X0.42259 Y-0.26818 -G1 X0.44341 Y-0.24377 -G1 X0.46282 Y-0.21779 -G1 X0.48069 Y-0.19032 -G1 X0.49693 Y-0.16146 -G1 X0.51141 Y-0.13131 -G1 X0.52405 Y-0.09997 -G1 X0.53475 Y-0.06755 -G1 X0.54343 Y-0.03419 -G1 X0.55000 Y-0.00000 -G1 X0.55440 Y0.03488 -G1 X0.55658 Y0.07031 -G1 X0.55647 Y0.10615 -G1 X0.55403 Y0.14225 -G1 X0.54924 Y0.17846 -G1 X0.54206 Y0.21462 -G1 X0.53249 Y0.25057 -G1 X0.52053 Y0.28616 -G1 X0.50617 Y0.32123 -G1 X0.48946 Y0.35561 -G1 X0.47040 Y0.38915 -G1 X0.44904 Y0.42168 -G1 X0.42545 Y0.45305 -G1 X0.39966 Y0.48311 -G1 X0.37177 Y0.51170 -G1 X0.34186 Y0.53868 -G1 X0.31001 Y0.56390 -G1 X0.27633 Y0.58723 -G1 X0.24094 Y0.60854 -G1 X0.20395 Y0.62770 -G1 X0.16550 Y0.64459 -G1 X0.12573 Y0.65911 -G1 X0.08479 Y0.67117 -G1 X0.04282 Y0.68065 -G1 X0.00000 Y0.68750 -G1 X-0.04351 Y0.69163 -G1 X-0.08755 Y0.69299 -G1 X-0.13192 Y0.69153 -G1 X-0.17645 Y0.68721 -G1 X-0.22095 Y0.68001 -G1 X-0.26523 Y0.66990 -G1 X-0.30912 Y0.65690 -G1 X-0.35240 Y0.64102 -G1 X-0.39490 Y0.62227 -G1 X-0.43643 Y0.60070 -G1 X-0.47679 Y0.57634 -G1 X-0.51581 Y0.54928 -G1 X-0.55329 Y0.51957 -G1 X-0.58906 Y0.48731 -G1 X-0.62294 Y0.45259 -G1 X-0.65478 Y0.41553 -G1 X-0.68440 Y0.37625 -G1 X-0.71165 Y0.33488 -G1 X-0.73638 Y0.29155 -G1 X-0.75847 Y0.24644 -G1 X-0.77777 Y0.19970 -G1 X-0.79418 Y0.15150 -G1 X-0.80758 Y0.10202 -G1 X-0.81788 Y0.05146 -G1 X-0.82500 Y0.00000 -G1 X-0.82886 Y-0.05215 -G1 X-0.82941 Y-0.10478 -G1 X-0.82659 Y-0.15768 -G1 X-0.82039 Y-0.21064 -G1 X-0.81078 Y-0.26344 -G1 X-0.79775 Y-0.31585 -G1 X-0.78132 Y-0.36766 -G1 X-0.76151 Y-0.41864 -G1 X-0.73836 Y-0.46858 -G1 X-0.71193 Y-0.51725 -G1 X-0.68229 Y-0.56444 -G1 X-0.64951 Y-0.60993 -G1 X-0.61370 Y-0.65352 -G1 X-0.57496 Y-0.69500 -G1 X-0.53342 Y-0.73418 -G1 X-0.48921 Y-0.77087 -G1 X-0.44249 Y-0.80489 -G1 X-0.39342 Y-0.83606 -G1 X-0.34217 Y-0.86423 -G1 X-0.28893 Y-0.88924 -G1 X-0.23389 Y-0.91095 -G1 X-0.17726 Y-0.92924 -G1 X-0.11925 Y-0.94400 -G1 X-0.06009 Y-0.95511 -G1 X-0.00000 Y-0.96250 -G1 X0.06078 Y-0.96609 -G1 X0.12201 Y-0.96582 -G1 X0.18345 Y-0.96166 -G1 X0.24484 Y-0.95357 -G1 X0.30593 Y-0.94155 -G1 X0.36647 Y-0.92559 -G1 X0.42621 Y-0.90573 -G1 X0.48489 Y-0.88200 -G1 X0.54226 Y-0.85446 -G1 X0.59807 Y-0.82317 -G1 X0.65208 Y-0.78824 -G1 X0.70406 Y-0.74974 -G1 X0.75375 Y-0.70782 -G1 X0.80095 Y-0.66260 -G1 X0.84542 Y-0.61424 -G1 X0.88697 Y-0.56289 -G1 X0.92538 Y-0.50873 -G1 X0.96047 Y-0.45196 -G1 X0.99207 Y-0.39279 -G1 X1.02001 Y-0.33142 -G1 X1.04413 Y-0.26809 -G1 X1.06431 Y-0.20303 -G1 X1.08041 Y-0.13649 -G1 X1.09234 Y-0.06872 -G1 X1.10000 Y-0.00000 -G1 X1.10332 Y0.06941 -G1 X1.10224 Y0.13925 -G1 X1.09672 Y0.20921 -G1 X1.08675 Y0.27903 -G1 X1.07232 Y0.34842 -G1 X1.05344 Y0.41709 -G1 X1.03015 Y0.48475 -G1 X1.00249 Y0.55113 -G1 X0.97055 Y0.61593 -G1 X0.93441 Y0.67889 -G1 X0.89418 Y0.73973 -G1 X0.84998 Y0.79818 -G1 X0.80195 Y0.85399 -G1 X0.75025 Y0.90689 -G1 X0.69506 Y0.95666 -G1 X0.63656 Y1.00306 -G1 X0.57497 Y1.04587 -G1 X0.51051 Y1.08489 -G1 X0.44341 Y1.11992 -G1 X0.37391 Y1.15078 -G1 X0.30228 Y1.17731 -G1 X0.22879 Y1.19937 -G1 X0.15372 Y1.21683 -G1 X0.07736 Y1.22957 -G1 X0.00000 Y1.23750 -G1 X-0.07805 Y1.24055 -G1 X-0.15648 Y1.23866 -G1 X-0.23498 Y1.23179 -G1 X-0.31322 Y1.21993 -G1 X-0.39091 Y1.20309 -G1 X-0.46770 Y1.18128 -G1 X-0.54329 Y1.15456 -G1 X-0.61737 Y1.12299 -G1 X-0.68961 Y1.08665 -G1 X-0.75971 Y1.04565 -G1 X-0.82738 Y1.00013 -G1 X-0.89231 Y0.95021 -G1 X-0.95422 Y0.89607 -G1 X-1.01284 Y0.83789 -G1 X-1.06790 Y0.77588 -G1 X-1.11916 Y0.71024 -G1 X-1.16636 Y0.64121 -G1 X-1.20930 Y0.56905 -G1 X-1.24776 Y0.49402 -G1 X-1.28155 Y0.41640 -G1 X-1.31049 Y0.33648 -G1 X-1.33444 Y0.25456 -G1 X-1.35324 Y0.17095 -G1 X-1.36680 Y0.08599 -G1 X-1.37500 Y0.00000 -G1 X-1.37778 Y-0.08668 -G1 X-1.37507 Y-0.17371 -G1 X-1.36685 Y-0.26074 -G1 X-1.35311 Y-0.34742 -G1 X-1.33386 Y-0.43340 -G1 X-1.30913 Y-0.51832 -G1 X-1.27897 Y-0.60184 -G1 X-1.24348 Y-0.68361 -G1 X-1.20275 Y-0.76329 -G1 X-1.15689 Y-0.84053 -G1 X-1.10607 Y-0.91502 -G1 X-1.05044 Y-0.98643 -G1 X-0.99020 Y-1.05445 -G1 X-0.92554 Y-1.11879 -G1 X-0.85670 Y-1.17914 -G1 X-0.78391 Y-1.23525 -G1 X-0.70746 Y-1.28686 -G1 X-0.62760 Y-1.33372 -G1 X-0.54464 Y-1.37560 -G1 X-0.45889 Y-1.41232 -G1 X-0.37067 Y-1.44367 -G1 X-0.28032 Y-1.46950 -G1 X-0.18819 Y-1.48966 -G1 X-0.09463 Y-1.50403 -G1 X-0.00000 Y-1.51250 -G1 X0.09532 Y-1.51500 -G1 X0.19095 Y-1.51149 -G1 X0.28651 Y-1.50192 -G1 X0.38161 Y-1.48629 -G1 X0.47589 Y-1.46463 -G1 X0.56894 Y-1.43697 -G1 X0.66038 Y-1.40339 -G1 X0.74985 Y-1.36397 -G1 X0.83696 Y-1.31884 -G1 X0.92135 Y-1.26813 -G1 X1.00267 Y-1.21202 -G1 X1.08056 Y-1.15068 -G1 X1.15469 Y-1.08432 -G1 X1.22473 Y-1.01319 -G1 X1.29038 Y-0.93752 -G1 X1.35135 Y-0.85759 -G1 X1.40735 Y-0.77370 -G1 X1.45813 Y-0.68614 -G1 X1.50345 Y-0.59526 -G1 X1.54309 Y-0.50138 -G1 X1.57685 Y-0.40487 -G1 X1.60457 Y-0.30609 -G1 X1.62608 Y-0.20542 -G1 X1.64125 Y-0.10326 -G1 X1.65000 Y-0.00000 -G1 X1.65223 Y0.10395 -G1 X1.64790 Y0.20818 -G1 X1.63698 Y0.31227 -G1 X1.61947 Y0.41581 -G1 X1.59540 Y0.51838 -G1 X1.56481 Y0.61955 -G1 X1.52780 Y0.71893 -G1 X1.48446 Y0.81609 -G1 X1.43494 Y0.91064 -G1 X1.37937 Y1.00217 -G1 X1.31796 Y1.09031 -G1 X1.25091 Y1.17468 -G1 X1.17845 Y1.25492 -G1 X1.10083 Y1.33068 -G1 X1.01834 Y1.40162 -G1 X0.93127 Y1.46744 -G1 X0.83994 Y1.52784 -G1 X0.74469 Y1.58254 -G1 X0.64587 Y1.63129 -G1 X0.54387 Y1.67386 -G1 X0.43906 Y1.71003 -G1 X0.33185 Y1.73963 -G1 X0.22265 Y1.76249 -G1 X0.11189 Y1.77848 -G1 X0.00000 Y1.78750 -G1 X-0.11258 Y1.78946 -G1 X-0.22541 Y1.78432 -G1 X-0.33804 Y1.77205 -G1 X-0.45000 Y1.75265 -G1 X-0.56087 Y1.72617 -G1 X-0.67017 Y1.69266 -G1 X-0.77747 Y1.65221 -G1 X-0.88233 Y1.60496 -G1 X-0.98431 Y1.55103 -G1 X-1.08299 Y1.49061 -G1 X-1.17796 Y1.42391 -G1 X-1.26881 Y1.35114 -G1 X-1.35515 Y1.27257 -G1 X-1.43662 Y1.18848 -G1 X-1.51286 Y1.09916 -G1 X-1.58354 Y1.00494 -G1 X-1.64833 Y0.90618 -G1 X-1.70696 Y0.80323 -G1 X-1.75914 Y0.69649 -G1 X-1.80463 Y0.58636 -G1 X-1.84321 Y0.47326 -G1 X-1.87470 Y0.35762 -G1 X-1.89891 Y0.23989 -G1 X-1.91571 Y0.12053 -G1 X-1.92500 Y0.00000 -G1 X-1.92669 Y-0.12122 -G1 X-1.92073 Y-0.24265 -G1 X-1.90711 Y-0.36380 -G1 X-1.88583 Y-0.48420 -G1 X-1.85694 Y-0.60336 -G1 X-1.82050 Y-0.72079 -G1 X-1.77663 Y-0.83602 -G1 X-1.72545 Y-0.94857 -G1 X-1.66713 Y-1.05799 -G1 X-1.60185 Y-1.16381 -G1 X-1.52985 Y-1.26561 -G1 X-1.45138 Y-1.36293 -G1 X-1.36670 Y-1.45539 -G1 X-1.27612 Y-1.54257 -G1 X-1.17998 Y-1.62410 -G1 X-1.07862 Y-1.69963 -G1 X-0.97242 Y-1.76883 -G1 X-0.86178 Y-1.83137 -G1 X-0.74711 Y-1.88698 -G1 X-0.62885 Y-1.93540 -G1 X-0.50745 Y-1.97639 -G1 X-0.38338 Y-2.00976 -G1 X-0.25712 Y-2.03532 -G1 X-0.12916 Y-2.05294 -G1 X-0.00000 Y-2.06250 -G1 X0.12985 Y-2.06392 -G1 X0.25988 Y-2.05715 -G1 X0.38957 Y-2.04218 -G1 X0.51839 Y-2.01901 -G1 X0.64585 Y-1.98771 -G1 X0.77141 Y-1.94835 -G1 X0.89456 Y-1.90104 -G1 X1.01481 Y-1.84594 -G1 X1.13167 Y-1.78322 -G1 X1.24464 Y-1.71309 -G1 X1.35325 Y-1.63580 -G1 X1.45706 Y-1.55161 -G1 X1.55562 Y-1.46082 -G1 X1.64851 Y-1.36377 -G1 X1.73534 Y-1.26080 -G1 X1.81573 Y-1.15230 -G1 X1.88932 Y-1.03866 -G1 X1.95578 Y-0.92032 -G1 X2.01483 Y-0.79773 -G1 X2.06617 Y-0.67134 -G1 X2.10957 Y-0.54165 -G1 X2.14482 Y-0.40915 -G1 X2.17174 Y-0.27435 -G1 X2.19017 Y-0.13779 -G1 X2.20000 Y-0.00000 -G1 X2.20115 Y0.13848 -G1 X2.19357 Y0.27711 -G1 X2.17724 Y0.41533 -G1 X2.15219 Y0.55259 -G1 X2.11848 Y0.68834 -G1 X2.07619 Y0.82202 -G1 X2.02546 Y0.95311 -G1 X1.96643 Y1.08106 -G1 X1.89932 Y1.20534 -G1 X1.82433 Y1.32546 -G1 X1.74175 Y1.44090 -G1 X1.65184 Y1.55118 -G1 X1.55495 Y1.65585 -G1 X1.45141 Y1.75446 -G1 X1.34162 Y1.84658 -G1 X1.22597 Y1.93182 -G1 X1.10490 Y2.00981 -G1 X0.97887 Y2.08020 -G1 X0.84834 Y2.14267 -G1 X0.71383 Y2.19694 -G1 X0.57584 Y2.24275 -G1 X0.43491 Y2.27989 -G1 X0.29159 Y2.30815 -G1 X0.14643 Y2.32740 -G1 X0.00000 Y2.33750 -G1 X-0.14712 Y2.33838 -G1 X-0.29435 Y2.32998 -G1 X-0.44110 Y2.31230 -G1 X-0.58678 Y2.28537 -G1 X-0.73083 Y2.24925 -G1 X-0.87264 Y2.20404 -G1 X-1.01165 Y2.14987 -G1 X-1.14730 Y2.08692 -G1 X-1.27902 Y2.01541 -G1 X-1.40628 Y1.93557 -G1 X-1.52854 Y1.84769 -G1 X-1.64531 Y1.75208 -G1 X-1.75609 Y1.64907 -G1 X-1.86040 Y1.53906 -G1 X-1.95782 Y1.42244 -G1 X-2.04792 Y1.29965 -G1 X-2.13030 Y1.17114 -G1 X-2.20461 Y1.03741 -G1 X-2.27051 Y0.89896 -G1 X-2.32771 Y0.75632 -G1 X-2.37593 Y0.61004 -G1 X-2.41495 Y0.46068 -G1 X-2.44457 Y0.30882 -G1 X-2.46463 Y0.15506 -G1 X-2.47500 Y0.00000 -G1 X-2.47561 Y-0.15575 -G1 X-2.46640 Y-0.31158 -G1 X-2.44737 Y-0.46686 -G1 X-2.41855 Y-0.62098 -G1 X-2.38002 Y-0.77332 -G1 X-2.33188 Y-0.92326 -G1 X-2.27428 Y-1.07020 -G1 X-2.20742 Y-1.21354 -G1 X-2.13151 Y-1.35269 -G1 X-2.04681 Y-1.48710 -G1 X-1.95364 Y-1.61619 -G1 X-1.85231 Y-1.73943 -G1 X-1.74320 Y-1.85632 -G1 X-1.62671 Y-1.96635 -G1 X-1.50326 Y-2.06906 -G1 X-1.37332 Y-2.16401 -G1 X-1.23738 Y-2.25079 -G1 X-1.09596 Y-2.32902 -G1 X-0.94958 Y-2.39836 -G1 X-0.79881 Y-2.45848 -G1 X-0.64423 Y-2.50911 -G1 X-0.48644 Y-2.55002 -G1 X-0.32605 Y-2.58099 -G1 X-0.16369 Y-2.60186 -G1 X-0.00000 Y-2.61250 -G1 X0.16439 Y-2.61283 -G1 X0.32881 Y-2.60281 -G1 X0.49263 Y-2.58243 -G1 X0.65517 Y-2.55173 -G1 X0.81580 Y-2.51079 -G1 X0.97387 Y-2.45972 -G1 X1.12874 Y-2.39870 -G1 X1.27978 Y-2.32791 -G1 X1.42637 Y-2.24760 -G1 X1.56792 Y-2.15805 -G1 X1.70383 Y-2.05958 -G1 X1.83356 Y-1.95254 -G1 X1.95655 Y-1.83732 -G1 X2.07230 Y-1.71435 -G1 X2.18030 Y-1.58408 -G1 X2.28011 Y-1.44700 -G1 X2.37129 Y-1.30363 -G1 X2.45344 Y-1.15450 -G1 X2.52620 Y-1.00019 -G1 X2.58925 Y-0.84130 -G1 X2.64229 Y-0.67843 -G1 X2.68508 Y-0.51221 -G1 X2.71740 Y-0.34329 -G1 X2.73908 Y-0.17233 -G1 X2.75000 Y-0.00000 -G1 X2.75006 Y0.17302 -G1 X2.73923 Y0.34605 -G1 X2.71750 Y0.51839 -G1 X2.68491 Y0.68937 -G1 X2.64156 Y0.85829 -G1 X2.58757 Y1.02449 -G1 X2.52311 Y1.18729 -G1 X2.44840 Y1.34602 -G1 X2.36370 Y1.50005 -G1 X2.26929 Y1.64874 -G1 X2.16553 Y1.79148 -G1 X2.05278 Y1.92768 -G1 X1.93145 Y2.05678 -G1 X1.80200 Y2.17824 -G1 X1.66490 Y2.29154 -G1 X1.52068 Y2.39620 -G1 X1.36987 Y2.49178 -G1 X1.21305 Y2.57785 -G1 X1.05081 Y2.65405 -G1 X0.88379 Y2.72002 -G1 X0.71262 Y2.77548 -G1 X0.53797 Y2.82015 -G1 X0.36052 Y2.85382 -G1 X0.18096 Y2.87631 -G1 X0.00000 Y2.88750 -G1 X-0.18165 Y2.88729 -G1 X-0.36328 Y2.87564 -G1 X-0.54416 Y2.85256 -G1 X-0.72356 Y2.81809 -G1 X-0.90078 Y2.77233 -G1 X-1.07511 Y2.71541 -G1 X-1.24583 Y2.64752 -G1 X-1.41226 Y2.56889 -G1 X-1.57372 Y2.47979 -G1 X-1.72956 Y2.38053 -G1 X-1.87913 Y2.27147 -G1 X-2.02181 Y2.15301 -G1 X-2.15702 Y2.02557 -G1 X-2.28419 Y1.88964 -G1 X-2.40278 Y1.74572 -G1 X-2.51230 Y1.59435 -G1 X-2.61227 Y1.43611 -G1 X-2.70227 Y1.27159 -G1 X-2.78189 Y1.10143 -G1 X-2.85079 Y0.92628 -G1 X-2.90866 Y0.74682 -G1 X-2.95521 Y0.56374 -G1 X-2.99023 Y0.37775 -G1 X-3.01354 Y0.18960 -G1 X-3.02500 Y0.00000 -G1 X-3.02452 Y-0.19029 -G1 X-3.01206 Y-0.38051 -G1 X-2.98763 Y-0.56992 -G1 X-2.95127 Y-0.75776 -G1 X-2.90310 Y-0.94327 -G1 X-2.84326 Y-1.12572 -G1 X-2.77194 Y-1.30437 -G1 X-2.68939 Y-1.47850 -G1 X-2.59589 Y-1.64740 -G1 X-2.49177 Y-1.81038 -G1 X-2.37742 Y-1.96677 -G1 X-2.25324 Y-2.11594 -G1 X-2.11970 Y-2.25725 -G1 X-1.97729 Y-2.39013 -G1 X-1.82654 Y-2.51402 -G1 X-1.66803 Y-2.62839 -G1 X-1.50235 Y-2.73276 -G1 X-1.33013 Y-2.82668 -G1 X-1.15205 Y-2.90974 -G1 X-0.96877 Y-2.98156 -G1 X-0.78101 Y-3.04184 -G1 X-0.58950 Y-3.09028 -G1 X-0.39499 Y-3.12665 -G1 X-0.19823 Y-3.15077 -G1 X0.00000 Y-3.16250 -G1 X0.19892 Y-3.16175 -G1 X0.39775 Y-3.14848 -G1 X0.59569 Y-3.12269 -G1 X0.79195 Y-3.08445 -G1 X0.98576 Y-3.03387 -G1 X1.17634 Y-2.97110 -G1 X1.36292 Y-2.89635 -G1 X1.54474 Y-2.80988 -G1 X1.72108 Y-2.71198 -G1 X1.89120 Y-2.60301 -G1 X2.05442 Y-2.48336 -G1 X2.21006 Y-2.35348 -G1 X2.35748 Y-2.21383 -G1 X2.49608 Y-2.06494 -G1 X2.62526 Y-1.90736 -G1 X2.74449 Y-1.74170 -G1 X2.85325 Y-1.56859 -G1 X2.95109 Y-1.38868 -G1 X3.03758 Y-1.20266 -G1 X3.11233 Y-1.01126 -G1 X3.17502 Y-0.81521 -G1 X3.22534 Y-0.61527 -G1 X3.26307 Y-0.41222 -G1 X3.28800 Y-0.20686 -G1 X3.30000 Y0.00000 -G1 X3.29898 Y0.20755 -G1 X3.28489 Y0.41498 -G1 X3.25776 Y0.62145 -G1 X3.21763 Y0.82615 -G1 X3.16464 Y1.02825 -G1 X3.09895 Y1.22696 -G1 X3.02077 Y1.42146 -G1 X2.93037 Y1.61098 -G1 X2.82808 Y1.79475 -G1 X2.71425 Y1.97202 -G1 X2.58931 Y2.14206 -G1 X2.45371 Y2.30419 -G1 X2.30795 Y2.45772 -G1 X2.15258 Y2.60202 -G1 X1.98818 Y2.73650 -G1 X1.81538 Y2.86058 -G1 X1.63483 Y2.97375 -G1 X1.44722 Y3.07551 -G1 X1.25328 Y3.16542 -G1 X1.05375 Y3.24310 -G1 X0.84940 Y3.30820 -G1 X0.64103 Y3.36040 -G1 X0.42945 Y3.39948 -G1 X0.21550 Y3.42523 -G1 X-0.00000 Y3.43750 -G1 X-0.21619 Y3.43621 -G1 X-0.43221 Y3.42131 -G1 X-0.64722 Y3.39282 -G1 X-0.86034 Y3.35081 -G1 X-1.07074 Y3.29541 -G1 X-1.27758 Y3.22679 -G1 X-1.48001 Y3.14518 -G1 X-1.67723 Y3.05086 -G1 X-1.86843 Y2.94417 -G1 X-2.05284 Y2.82549 -G1 X-2.22971 Y2.69526 -G1 X-2.39831 Y2.55394 -G1 X-2.55795 Y2.40208 -G1 X-2.70797 Y2.24023 -G1 X-2.84774 Y2.06900 -G1 X-2.97668 Y1.88906 -G1 X-3.09424 Y1.70107 -G1 X-3.19992 Y1.50577 -G1 X-3.29327 Y1.30390 -G1 X-3.37387 Y1.09624 -G1 X-3.44138 Y0.88360 -G1 X-3.49547 Y0.66680 -G1 X-3.53590 Y0.44669 -G1 X-3.56246 Y0.22413 -G1 X-3.57500 Y-0.00000 -G1 X-3.57343 Y-0.22482 -G1 X-3.55772 Y-0.44944 -G1 X-3.52788 Y-0.67298 -G1 X-3.48399 Y-0.89454 -G1 X-3.42618 Y-1.11323 -G1 X-3.35463 Y-1.32819 -G1 X-3.26959 Y-1.53855 -G1 X-3.17135 Y-1.74347 -G1 X-3.06027 Y-1.94210 -G1 X-2.93673 Y-2.13366 -G1 X-2.80120 Y-2.31735 -G1 X-2.65417 Y-2.49244 -G1 X-2.49620 Y-2.65818 -G1 X-2.32787 Y-2.81391 -G1 X-2.14982 Y-2.95898 -G1 X-1.96273 Y-3.09277 -G1 X-1.76731 Y-3.21473 -G1 X-1.56431 Y-3.32433 -G1 X-1.35451 Y-3.42111 -G1 X-1.13873 Y-3.50464 -G1 X-0.91779 Y-3.57456 -G1 X-0.69256 Y-3.63053 -G1 X-0.46392 Y-3.67231 -G1 X-0.23276 Y-3.69969 -G1 X0.00000 Y-3.71250 -G1 X0.23346 Y-3.71066 -G1 X0.46668 Y-3.69414 -G1 X0.69874 Y-3.66295 -G1 X0.92873 Y-3.61717 -G1 X1.15572 Y-3.55695 -G1 X1.37881 Y-3.48248 -G1 X1.59710 Y-3.39401 -G1 X1.80971 Y-3.29185 -G1 X2.01578 Y-3.17636 -G1 X2.21448 Y-3.04797 -G1 X2.40500 Y-2.90715 -G1 X2.58656 Y-2.75441 -G1 X2.75842 Y-2.59033 -G1 X2.91986 Y-2.41552 -G1 X3.07022 Y-2.23065 -G1 X3.20887 Y-2.03641 -G1 X3.33522 Y-1.83355 -G1 X3.44875 Y-1.62286 -G1 X3.54896 Y-1.40513 -G1 X3.63541 Y-1.18122 -G1 X3.70774 Y-0.95198 -G1 X3.76560 Y-0.71833 -G1 X3.80873 Y-0.48115 -G1 X3.83691 Y-0.24140 -G1 X3.85000 Y0.00000 -G1 X3.84789 Y0.24209 -G1 X3.83055 Y0.48391 -G1 X3.79801 Y0.72451 -G1 X3.75035 Y0.96293 -G1 X3.68772 Y1.19821 -G1 X3.61032 Y1.42943 -G1 X3.51842 Y1.65564 -G1 X3.41234 Y1.87595 -G1 X3.29246 Y2.08946 -G1 X3.15921 Y2.29530 -G1 X3.01309 Y2.49265 -G1 X2.85464 Y2.68069 -G1 X2.68445 Y2.85865 -G1 X2.50316 Y3.02581 -G1 X2.31147 Y3.18146 -G1 X2.11009 Y3.32496 -G1 X1.89980 Y3.45572 -G1 X1.68140 Y3.57316 -G1 X1.45575 Y3.67680 -G1 X1.22371 Y3.76618 -G1 X0.98618 Y3.84092 -G1 X0.74409 Y3.90066 -G1 X0.49839 Y3.94514 -G1 X0.25003 Y3.97414 -G1 X-0.00000 Y3.98750 -G1 X-0.25072 Y3.98512 -G1 X-0.50114 Y3.96697 -G1 X-0.75027 Y3.93308 -G1 X-0.99712 Y3.88353 -G1 X-1.24070 Y3.81849 -G1 X-1.48004 Y3.73817 -G1 X-1.71419 Y3.64283 -G1 X-1.94219 Y3.53283 -G1 X-2.16313 Y3.40855 -G1 X-2.37612 Y3.27045 -G1 X-2.58029 Y3.11904 -G1 X-2.77481 Y2.95487 -G1 X-2.95888 Y2.77858 -G1 X-3.13175 Y2.59081 -G1 X-3.29270 Y2.39229 -G1 X-3.44106 Y2.18376 -G1 X-3.57621 Y1.96604 -G1 X-3.69758 Y1.73995 -G1 X-3.80465 Y1.50637 -G1 X-3.89695 Y1.26620 -G1 X-3.97410 Y1.02037 -G1 X-4.03573 Y0.76986 -G1 X-4.08156 Y0.51562 -G1 X-4.11137 Y0.25867 -G1 X-4.12500 Y-0.00000 -G1 X-4.12235 Y-0.25936 -G1 X-4.10339 Y-0.51838 -G1 X-4.06814 Y-0.77604 -G1 X-4.01671 Y-1.03132 -G1 X-3.94926 Y-1.28319 -G1 X-3.86601 Y-1.53066 -G1 X-3.76725 Y-1.77273 -G1 X-3.65332 Y-2.00843 -G1 X-3.52465 Y-2.23681 -G1 X-3.38169 Y-2.45694 -G1 X-3.22498 Y-2.66794 -G1 X-3.05511 Y-2.86894 -G1 X-2.87270 Y-3.05912 -G1 X-2.67846 Y-3.23770 -G1 X-2.47311 Y-3.40394 -G1 X-2.25744 Y-3.55715 -G1 X-2.03228 Y-3.69670 -G1 X-1.79849 Y-3.82199 -G1 X-1.55698 Y-3.93249 -G1 X-1.30869 Y-4.02772 -G1 X-1.05457 Y-4.10728 -G1 X-0.79562 Y-4.17079 -G1 X-0.53285 Y-4.21798 -G1 X-0.26730 Y-4.24860 -G1 X0.00000 Y-4.26250 -G1 X0.26799 Y-4.25958 -G1 X0.53561 Y-4.23980 -G1 X0.80180 Y-4.20321 -G1 X1.06551 Y-4.14989 -G1 X1.32568 Y-4.08003 -G1 X1.58128 Y-3.99385 -G1 X1.83128 Y-3.89166 -G1 X2.07467 Y-3.77381 -G1 X2.31049 Y-3.64074 -G1 X2.53776 Y-3.49293 -G1 X2.75558 Y-3.33093 -G1 X2.96306 Y-3.15534 -G1 X3.15935 Y-2.96683 -G1 X3.34364 Y-2.76610 -G1 X3.51518 Y-2.55393 -G1 X3.67325 Y-2.33111 -G1 X3.81719 Y-2.09852 -G1 X3.94640 Y-1.85704 -G1 X4.06033 Y-1.60760 -G1 X4.15849 Y-1.35118 -G1 X4.24046 Y-1.08876 -G1 X4.30586 Y-0.82139 -G1 X4.35439 Y-0.55009 -G1 X4.38583 Y-0.27593 -G1 X4.40000 Y0.00000 -G1 X4.39681 Y0.27662 -G1 X4.37622 Y0.55284 -G1 X4.33827 Y0.82757 -G1 X4.28307 Y1.09971 -G1 X4.21080 Y1.36817 -G1 X4.12170 Y1.63190 -G1 X4.01607 Y1.88982 -G1 X3.89431 Y2.14091 -G1 X3.75684 Y2.38416 -G1 X3.60417 Y2.61858 -G1 X3.43687 Y2.84323 -G1 X3.25557 Y3.05719 -G1 X3.06095 Y3.25958 -G1 X2.85375 Y3.44959 -G1 X2.63475 Y3.62642 -G1 X2.40479 Y3.78934 -G1 X2.16476 Y3.93768 -G1 X1.91558 Y4.07082 -G1 X1.65822 Y4.18818 -G1 X1.39367 Y4.28926 -G1 X1.12296 Y4.37364 -G1 X0.84715 Y4.44092 -G1 X0.56732 Y4.49081 -G1 X0.28457 Y4.52306 -G1 X-0.00000 Y4.53750 -G1 X-0.28526 Y4.53404 -G1 X-0.57008 Y4.51263 -G1 X-0.85333 Y4.47334 -G1 X-1.13390 Y4.41625 -G1 X-1.41066 Y4.34157 -G1 X-1.68251 Y4.24954 -G1 X-1.94837 Y4.14049 -G1 X-2.20715 Y4.01480 -G1 X-2.45784 Y3.87293 -G1 X-2.69940 Y3.71541 -G1 X-2.93088 Y3.54282 -G1 X-3.15131 Y3.35581 -G1 X-3.35982 Y3.15508 -G1 X-3.55553 Y2.94139 -G1 X-3.73766 Y2.71557 -G1 X-3.90544 Y2.47847 -G1 X-4.05818 Y2.23100 -G1 X-4.19523 Y1.97413 -G1 X-4.31602 Y1.70883 -G1 X-4.42004 Y1.43616 -G1 X-4.50682 Y1.15715 -G1 X-4.57599 Y0.87292 -G1 X-4.62722 Y0.58455 -G1 X-4.66029 Y0.29320 -G1 X-4.67500 Y-0.00000 -G1 X-4.67126 Y-0.29389 -G1 X-4.64905 Y-0.58731 -G1 X-4.60840 Y-0.87910 -G1 X-4.54944 Y-1.16810 -G1 X-4.47234 Y-1.45315 -G1 X-4.37739 Y-1.73313 -G1 X-4.26490 Y-2.00691 -G1 X-4.13529 Y-2.27340 -G1 X-3.98903 Y-2.53151 -G1 X-3.82665 Y-2.78022 -G1 X-3.64877 Y-3.01852 -G1 X-3.45604 Y-3.24544 -G1 X-3.24920 Y-3.46005 -G1 X-3.02904 Y-3.66148 -G1 X-2.79639 Y-3.84890 -G1 X-2.55214 Y-4.02153 -G1 X-2.29724 Y-4.17867 -G1 X-2.03267 Y-4.31964 -G1 X-1.75945 Y-4.44387 -G1 X-1.47865 Y-4.55081 -G1 X-1.19135 Y-4.64000 -G1 X-0.89868 Y-4.71105 -G1 X-0.60179 Y-4.76364 -G1 X-0.30183 Y-4.79751 -G1 X0.00000 Y-4.81250 -G1 X0.30252 Y-4.80849 -G1 X0.60454 Y-4.78547 -G1 X0.90486 Y-4.74347 -G1 X1.20229 Y-4.68262 -G1 X1.49564 Y-4.60311 -G1 X1.78375 Y-4.50523 -G1 X2.06546 Y-4.38932 -G1 X2.33964 Y-4.25578 -G1 X2.60519 Y-4.10512 -G1 X2.86104 Y-3.93789 -G1 X3.10617 Y-3.75471 -G1 X3.33956 Y-3.55627 -G1 X3.56028 Y-3.34333 -G1 X3.76742 Y-3.11668 -G1 X3.96014 Y-2.87721 -G1 X4.13763 Y-2.62582 -G1 X4.29916 Y-2.36348 -G1 X4.44406 Y-2.09121 -G1 X4.57171 Y-1.81007 -G1 X4.68158 Y-1.52114 -G1 X4.77318 Y-1.22554 -G1 X4.84611 Y-0.92445 -G1 X4.90005 Y-0.61902 -G1 X4.93474 Y-0.31047 -G1 X4.95000 Y0.00000 -G1 X4.94572 Y0.31116 -G1 X4.92188 Y0.62178 -G1 X4.87853 Y0.93063 -G1 X4.81580 Y1.23649 -G1 X4.73388 Y1.53813 -G1 X4.63308 Y1.83436 -G1 X4.51373 Y2.12400 -G1 X4.37628 Y2.40588 -G1 X4.22122 Y2.67887 -G1 X4.04913 Y2.94187 -G1 X3.86066 Y3.19381 -G1 X3.65651 Y3.43369 -G1 X3.43745 Y3.66052 -G1 X3.20433 Y3.87337 -G1 X2.95803 Y4.07138 -G1 X2.69950 Y4.25372 -G1 X2.42972 Y4.41965 -G1 X2.14976 Y4.56847 -G1 X1.86069 Y4.69956 -G1 X1.56363 Y4.81235 -G1 X1.25974 Y4.90636 -G1 X0.95021 Y4.98118 -G1 X0.63625 Y5.03647 -G1 X0.31910 Y5.07197 -G1 X-0.00000 Y5.08750 -G1 X-0.31979 Y5.08295 -G1 X-0.63901 Y5.05830 -G1 X-0.95639 Y5.01359 -G1 X-1.27068 Y4.94898 -G1 X-1.58062 Y4.86465 -G1 X-1.88498 Y4.76092 -G1 X-2.18254 Y4.63814 -G1 X-2.47212 Y4.49677 -G1 X-2.75254 Y4.33731 -G1 X-3.02269 Y4.16037 -G1 X-3.28146 Y3.96660 -G1 X-3.52781 Y3.75674 -G1 X-3.76075 Y3.53158 -G1 X-3.97932 Y3.29198 -G1 X-4.18262 Y3.03885 -G1 X-4.36982 Y2.77317 -G1 X-4.54014 Y2.49597 -G1 X-4.69289 Y2.20830 -G1 X-4.82740 Y1.91130 -G1 X-4.94312 Y1.60612 -G1 X-5.03954 Y1.29393 -G1 X-5.11624 Y0.97598 -G1 X-5.17289 Y0.65349 -G1 X-5.20920 Y0.32774 -G1 X-5.22500 Y-0.00000 -G1 X-5.22018 Y-0.32843 -G1 X-5.19471 Y-0.65624 -G1 X-5.14866 Y-0.98216 -G1 X-5.08216 Y-1.30488 -G1 X-4.99542 Y-1.62311 -G1 X-4.88876 Y-1.93560 -G1 X-4.76256 Y-2.24109 -G1 X-4.61726 Y-2.53836 -G1 X-4.45341 Y-2.82622 -G1 X-4.27161 Y-3.10351 -G1 X-4.07255 Y-3.36910 -G1 X-3.85697 Y-3.62194 -G1 X-3.62570 Y-3.86098 -G1 X-3.37962 Y-4.08526 -G1 X-3.11967 Y-4.29386 -G1 X-2.84685 Y-4.48591 -G1 X-2.56221 Y-4.66064 -G1 X-2.26685 Y-4.81730 -G1 X-1.96192 Y-4.95524 -G1 X-1.64861 Y-5.07389 -G1 X-1.32813 Y-5.17272 -G1 X-1.00174 Y-5.25131 -G1 X-0.67072 Y-5.30930 -G1 X-0.33637 Y-5.34643 -G1 X0.00000 Y-5.36250 -G1 X0.33706 Y-5.35741 -G1 X0.67348 Y-5.33113 -G1 X1.00792 Y-5.28372 -G1 X1.33907 Y-5.21534 -G1 X1.66560 Y-5.12619 -G1 X1.98622 Y-5.01661 -G1 X2.29963 Y-4.88697 -G1 X2.60460 Y-4.73775 -G1 X2.89989 Y-4.56950 -G1 X3.18433 Y-4.38285 -G1 X3.45675 Y-4.17849 -G1 X3.71606 Y-3.95721 -G1 X3.96122 Y-3.71983 -G1 X4.19121 Y-3.46727 -G1 X4.40510 Y-3.20049 -G1 X4.60201 Y-2.92052 -G1 X4.78113 Y-2.62845 -G1 X4.94171 Y-2.32539 -G1 X5.08309 Y-2.01254 -G1 X5.20466 Y-1.69110 -G1 X5.30590 Y-1.36232 -G1 X5.38637 Y-1.02751 -G1 X5.44572 Y-0.68795 -G1 X5.48366 Y-0.34500 -G1 X5.50000 Y0.00000 -G1 X5.49464 Y0.34569 -G1 X5.46754 Y0.69071 -G1 X5.41879 Y1.03369 -G1 X5.34852 Y1.37327 -G1 X5.25696 Y1.70809 -G1 X5.14445 Y2.03683 -G1 X5.01138 Y2.35818 -G1 X4.85824 Y2.67084 -G1 X4.68560 Y2.97357 -G1 X4.49409 Y3.26515 -G1 X4.28444 Y3.54440 -G1 X4.05744 Y3.81019 -G1 X3.81395 Y4.06145 -G1 X3.55491 Y4.29715 -G1 X3.28131 Y4.51634 -G1 X2.99420 Y4.71810 -G1 X2.69469 Y4.90162 -G1 X2.38394 Y5.06613 -G1 X2.06315 Y5.21093 -G1 X1.73359 Y5.33543 -G1 X1.39652 Y5.43908 -G1 X1.05327 Y5.52144 -G1 X0.70519 Y5.58213 -G1 X0.35364 Y5.62089 -G1 X-0.00000 Y5.63750 -G1 X-0.35433 Y5.63186 -G1 X-0.70794 Y5.60396 -G1 X-1.05945 Y5.55385 -G1 X-1.40746 Y5.48170 -G1 X-1.75058 Y5.38774 -G1 X-2.08745 Y5.27230 -G1 X-2.41672 Y5.13580 -G1 X-2.73708 Y4.97874 -G1 X-3.04725 Y4.80169 -G1 X-3.34597 Y4.60533 -G1 X-3.63204 Y4.39038 -G1 X-3.90431 Y4.15767 -G1 X-4.16168 Y3.90808 -G1 X-4.40310 Y3.64256 -G1 X-4.62758 Y3.36213 -G1 X-4.83420 Y3.06788 -G1 X-5.02211 Y2.76093 -G1 X-5.19054 Y2.44248 -G1 X-5.33878 Y2.11377 -G1 X-5.46620 Y1.77608 -G1 X-5.57226 Y1.43071 -G1 X-5.65650 Y1.07904 -G1 X-5.71855 Y0.72242 -G1 X-5.75812 Y0.36227 -G1 X-5.77500 Y-0.00000 -G1 X-5.76909 Y-0.36296 -G1 X-5.74038 Y-0.72518 -G1 X-5.68892 Y-1.08522 -G1 X-5.61488 Y-1.44166 -G1 X-5.51851 Y-1.79307 -G1 X-5.40014 Y-2.13807 -G1 X-5.26021 Y-2.47527 -G1 X-5.09923 Y-2.80332 -G1 X-4.91779 Y-3.12092 -G1 X-4.71657 Y-3.42679 -G1 X-4.49633 Y-3.71969 -G1 X-4.25791 Y-3.99844 -G1 X-4.00220 Y-4.26192 -G1 X-3.73021 Y-4.50904 -G1 X-3.44295 Y-4.73882 -G1 X-3.14155 Y-4.95029 -G1 X-2.82717 Y-5.14261 -G1 X-2.50103 Y-5.31495 -G1 X-2.16439 Y-5.46662 -G1 X-1.81857 Y-5.59697 -G1 X-1.46491 Y-5.70544 -G1 X-1.10480 Y-5.79157 -G1 X-0.73965 Y-5.85496 -G1 X-0.37090 Y-5.89534 -G1 X0.00000 Y-5.91250 -G1 X0.37159 Y-5.90632 -G1 X0.74241 Y-5.87679 -G1 X1.11098 Y-5.82398 -G1 X1.47585 Y-5.74806 -G1 X1.83556 Y-5.64928 -G1 X2.18868 Y-5.52799 -G1 X2.53381 Y-5.38463 -G1 X2.86957 Y-5.21972 -G1 X3.19460 Y-5.03388 -G1 X3.50761 Y-4.82781 -G1 X3.80733 Y-4.60228 -G1 X4.09256 Y-4.35814 -G1 X4.36215 Y-4.09633 -G1 X4.61499 Y-3.81785 -G1 X4.85006 Y-3.52377 -G1 X5.06639 Y-3.21523 -G1 X5.26310 Y-2.89341 -G1 X5.43937 Y-2.55957 -G1 X5.59447 Y-2.21501 -G1 X5.72774 Y-1.86105 -G1 X5.83862 Y-1.49910 -G1 X5.92663 Y-1.13057 -G1 X5.99138 Y-0.75689 -G1 X6.03257 Y-0.37954 -G1 X6.05000 Y0.00000 -G1 X6.04355 Y0.38023 -G1 X6.01321 Y0.75964 -G1 X5.95905 Y1.13675 -G1 X5.88124 Y1.51004 -G1 X5.78005 Y1.87805 -G1 X5.65583 Y2.23930 -G1 X5.50904 Y2.59236 -G1 X5.34021 Y2.93581 -G1 X5.14998 Y3.26828 -G1 X4.93905 Y3.58843 -G1 X4.70822 Y3.89498 -G1 X4.45837 Y4.18669 -G1 X4.19046 Y4.46238 -G1 X3.90550 Y4.72093 -G1 X3.60459 Y4.96130 -G1 X3.28890 Y5.18248 -G1 X2.95965 Y5.38359 -G1 X2.61812 Y5.56378 -G1 X2.26562 Y5.72231 -G1 X1.90354 Y5.85851 -G1 X1.53330 Y5.97180 -G1 X1.15633 Y6.06169 -G1 X0.77412 Y6.12780 -G1 X0.38817 Y6.16980 -G1 X-0.00000 Y6.18750 -G1 X-0.38886 Y6.18078 -G1 X-0.77688 Y6.14962 -G1 X-1.16251 Y6.09411 -G1 X-1.54424 Y6.01442 -G1 X-1.92054 Y5.91082 -G1 X-2.28992 Y5.78367 -G1 X-2.65090 Y5.63345 -G1 X-3.00205 Y5.46071 -G1 X-3.34195 Y5.26607 -G1 X-3.66925 Y5.05029 -G1 X-3.98263 Y4.81417 -G1 X-4.28082 Y4.55861 -G1 X-4.56261 Y4.28458 -G1 X-4.82688 Y3.99314 -G1 X-5.07254 Y3.68541 -G1 X-5.29858 Y3.36258 -G1 X-5.50408 Y3.02589 -G1 X-5.68820 Y2.67666 -G1 X-5.85015 Y2.31624 -G1 X-5.98928 Y1.94603 -G1 X-6.10498 Y1.56749 -G1 X-6.19676 Y1.18210 -G1 X-6.26421 Y0.79135 -G1 X-6.30703 Y0.39680 -G1 X-6.32500 Y-0.00000 -G1 X-6.31801 Y-0.39750 -G1 X-6.28604 Y-0.79411 -G1 X-6.22917 Y-1.18828 -G1 X-6.14760 Y-1.57843 -G1 X-6.04159 Y-1.96303 -G1 X-5.91152 Y-2.34054 -G1 X-5.75787 Y-2.70945 -G1 X-5.58120 Y-3.06829 -G1 X-5.38217 Y-3.41563 -G1 X-5.16153 Y-3.75007 -G1 X-4.92011 Y-4.07027 -G1 X-4.65884 Y-4.37494 -G1 X-4.37871 Y-4.66285 -G1 X-4.08079 Y-4.93283 -G1 X-3.76623 Y-5.18378 -G1 X-3.43626 Y-5.41467 -G1 X-3.09214 Y-5.62457 -G1 X-2.73521 Y-5.81261 -G1 X-2.36686 Y-5.97800 -G1 X-1.98852 Y-6.12005 -G1 X-1.60169 Y-6.23816 -G1 X-1.20786 Y-6.33182 -G1 X-0.80859 Y-6.40063 -G1 X-0.40544 Y-6.44426 -G1 X0.00000 Y-6.46250 -G1 X0.40613 Y-6.45524 -G1 X0.81134 Y-6.42245 -G1 X1.21404 Y-6.36424 -G1 X1.61263 Y-6.28078 -G1 X2.00552 Y-6.17236 -G1 X2.39115 Y-6.03936 -G1 X2.76799 Y-5.88228 -G1 X3.13453 Y-5.70169 -G1 X3.48930 Y-5.49826 -G1 X3.83089 Y-5.27277 -G1 X4.15792 Y-5.02606 -G1 X4.46907 Y-4.75907 -G1 X4.76308 Y-4.47283 -G1 X5.03877 Y-4.16843 -G1 X5.29502 Y-3.84705 -G1 X5.53077 Y-3.50993 -G1 X5.74507 Y-3.15838 -G1 X5.93702 Y-2.79375 -G1 X6.10584 Y-2.41747 -G1 X6.25082 Y-2.03101 -G1 X6.37134 Y-1.63588 -G1 X6.46689 Y-1.23362 -G1 X6.53704 Y-0.82582 -G1 X6.58149 Y-0.41407 -G1 X6.60000 Y0.00000 -G1 X6.59247 Y0.41476 -G1 X6.55887 Y0.82858 -G1 X6.49930 Y1.23981 -G1 X6.41396 Y1.64682 -G1 X6.30313 Y2.04801 -G1 X6.16721 Y2.44177 -G1 X6.00669 Y2.82654 -G1 X5.82218 Y3.20077 -G1 X5.61436 Y3.56298 -G1 X5.38401 Y3.91171 -G1 X5.13200 Y4.24556 -G1 X4.85930 Y4.56319 -G1 X4.56696 Y4.86331 -G1 X4.25608 Y5.14472 -G1 X3.92787 Y5.40626 -G1 X3.58361 Y5.64687 -G1 X3.22462 Y5.86556 -G1 X2.85230 Y6.06144 -G1 X2.46809 Y6.23369 -G1 X2.07350 Y6.38159 -G1 X1.67008 Y6.50452 -G1 X1.25939 Y6.60195 -G1 X0.84305 Y6.67346 -G1 X0.42271 Y6.71872 -G1 X-0.00000 Y6.73750 -G1 X-0.42340 Y6.72969 -G1 X-0.84581 Y6.69529 -G1 X-1.26557 Y6.63437 -G1 X-1.68102 Y6.54714 -G1 X-2.09050 Y6.43390 -G1 X-2.49239 Y6.29505 -G1 X-2.88508 Y6.13111 -G1 X-3.26701 Y5.94267 -G1 X-3.63666 Y5.73045 -G1 X-3.99253 Y5.49525 -G1 X-4.33321 Y5.23795 -G1 X-4.65732 Y4.95954 -G1 X-4.96355 Y4.66108 -G1 X-5.25066 Y4.34373 -G1 X-5.51750 Y4.00870 -G1 X-5.76296 Y3.65729 -G1 X-5.98605 Y3.29086 -G1 X-6.18585 Y2.91084 -G1 X-6.36153 Y2.51871 -G1 X-6.51236 Y2.11599 -G1 X-6.63770 Y1.70427 -G1 X-6.73702 Y1.28515 -G1 X-6.80988 Y0.86029 -G1 X-6.85594 Y0.43134 -G1 X-6.87500 Y-0.00000 -G1 X-6.86692 Y-0.43203 -G1 X-6.83170 Y-0.86304 -G1 X-6.76943 Y-1.29134 -G1 X-6.68032 Y-1.71521 -G1 X-6.56467 Y-2.13299 -G1 X-6.42290 Y-2.54300 -G1 X-6.25552 Y-2.94363 -G1 X-6.06317 Y-3.33325 -G1 X-5.84655 Y-3.71033 -G1 X-5.60649 Y-4.07335 -G1 X-5.34389 Y-4.42085 -G1 X-5.05977 Y-4.75144 -G1 X-4.75521 Y-5.06378 -G1 X-4.43137 Y-5.35661 -G1 X-4.08952 Y-5.62874 -G1 X-3.73096 Y-5.87906 -G1 X-3.35710 Y-6.10654 -G1 X-2.96938 Y-6.31026 -G1 X-2.56933 Y-6.48937 -G1 X-2.15848 Y-6.64313 -G1 X-1.73847 Y-6.77088 -G1 X-1.31092 Y-6.87208 -G1 X-0.87752 Y-6.94629 -G1 X-0.43997 Y-6.99317 -G1 X0.00000 Y-7.01250 -G1 X0.44066 Y-7.00415 -G1 X0.88028 Y-6.96812 -G1 X1.31710 Y-6.90450 -G1 X1.74941 Y-6.81350 -G1 X2.17548 Y-6.69544 -G1 X2.59362 Y-6.55074 -G1 X3.00217 Y-6.37994 -G1 X3.39949 Y-6.18366 -G1 X3.78401 Y-5.96264 -G1 X4.15417 Y-5.71773 -G1 X4.50850 Y-5.44984 -G1 X4.84557 Y-5.16000 -G1 X5.16401 Y-4.84933 -G1 X5.46255 Y-4.51902 -G1 X5.73998 Y-4.17034 -G1 X5.99515 Y-3.80464 -G1 X6.22704 Y-3.42334 -G1 X6.43468 Y-3.02793 -G1 X6.61722 Y-2.61994 -G1 X6.77390 Y-2.20097 -G1 X6.90406 Y-1.77266 -G1 X7.00715 Y-1.33668 -G1 X7.08271 Y-0.89475 -G1 X7.13040 Y-0.44861 -G1 X7.15000 Y0.00000 -G1 X7.14138 Y0.44930 -G1 X7.10453 Y0.89751 -G1 X7.03956 Y1.34287 -G1 X6.94668 Y1.78360 -G1 X6.82621 Y2.21797 -G1 X6.67858 Y2.64424 -G1 X6.50435 Y3.06071 -G1 X6.30415 Y3.46574 -G1 X6.07874 Y3.85769 -G1 X5.82897 Y4.23499 -G1 X5.55579 Y4.59615 -G1 X5.26024 Y4.93969 -G1 X4.94346 Y5.26425 -G1 X4.60666 Y5.56850 -G1 X4.25116 Y5.85122 -G1 X3.87831 Y6.11125 -G1 X3.48958 Y6.34753 -G1 X3.08647 Y6.55909 -G1 X2.67056 Y6.74506 -G1 X2.24346 Y6.90467 -G1 X1.80686 Y7.03724 -G1 X1.36245 Y7.14221 -G1 X0.91199 Y7.21912 -G1 X0.45724 Y7.26763 -G1 X-0.00000 Y7.28750 -G1 X-0.45793 Y7.27861 -G1 X-0.91474 Y7.24095 -G1 X-1.36863 Y7.17463 -G1 X-1.81780 Y7.07986 -G1 X-2.26046 Y6.95698 -G1 X-2.69486 Y6.80643 -G1 X-3.11926 Y6.62876 -G1 X-3.53198 Y6.42464 -G1 X-3.93136 Y6.19483 -G1 X-4.31581 Y5.94021 -G1 X-4.68379 Y5.66173 -G1 X-5.03382 Y5.36047 -G1 X-5.36448 Y5.03758 -G1 X-5.67444 Y4.69431 -G1 X-5.96246 Y4.33198 -G1 X-6.22734 Y3.95199 -G1 X-6.46802 Y3.55582 -G1 X-6.68351 Y3.14502 -G1 X-6.87291 Y2.72118 -G1 X-7.03544 Y2.28595 -G1 X-7.17042 Y1.84105 -G1 X-7.27728 Y1.38821 -G1 X-7.35554 Y0.92922 F1500.00000 -G1 X-7.40486 Y0.46587 -G1 X-7.42500 Y-0.00000 -G1 X-7.41584 Y-0.46656 -G1 X-7.37736 Y-0.93198 -G1 X-7.30969 Y-1.39440 -G1 X-7.21304 Y-1.85199 -G1 X-7.08775 Y-2.30295 -G1 X-6.93427 Y-2.74547 -G1 X-6.75318 Y-3.17780 -G1 X-6.54513 Y-3.59822 -G1 X-6.31093 Y-4.00504 -G1 X-6.05145 Y-4.39663 -G1 X-5.76768 Y-4.77144 -G1 X-5.46070 Y-5.12794 -G1 X-5.13171 Y-5.46471 -G1 X-4.78195 Y-5.78039 -G1 X-4.41280 Y-6.07370 -G1 X-4.02567 Y-6.34344 -G1 X-3.62206 Y-6.58851 -G1 X-3.20356 Y-6.80792 -G1 X-2.77179 Y-7.00075 -G1 X-2.32844 Y-7.16621 -G1 X-1.87525 Y-7.30360 -G1 X-1.41398 Y-7.41234 -G1 X-0.94645 Y-7.49195 -G1 X-0.47451 Y-7.54209 -G1 X0.00000 Y-7.56250 -G1 X0.47520 Y-7.55307 -G1 X0.94921 Y-7.51378 -G1 X1.42016 Y-7.44476 -G1 X1.88619 Y-7.34622 -G1 X2.34544 Y-7.21852 -G1 X2.79609 Y-7.06212 -G1 X3.23635 Y-6.87759 -G1 X3.66446 Y-6.66563 -G1 X4.07871 Y-6.42702 -G1 X4.47745 Y-6.16269 -G1 X4.85908 Y-5.87362 -G1 X5.22207 Y-5.56094 -G1 X5.56495 Y-5.22583 -G1 X5.88634 Y-4.86960 -G1 X6.18493 Y-4.49362 -G1 X6.45953 Y-4.09934 -G1 X6.70900 Y-3.68831 -G1 X6.93233 Y-3.26211 -G1 X7.12860 Y-2.82241 -G1 X7.29698 Y-2.37093 -G1 X7.43678 Y-1.90944 -G1 X7.54740 Y-1.43974 -G1 X7.62837 Y-0.96369 -G1 X7.67932 Y-0.48314 -G1 X7.70000 Y0.00000 -G1 X7.69029 Y0.48383 -G1 X7.65020 Y0.96644 -G1 X7.57982 Y1.44593 -G1 X7.47940 Y1.92038 -G1 X7.34929 Y2.38793 -G1 X7.18996 Y2.84671 -G1 X7.00200 Y3.29489 -G1 X6.78612 Y3.73070 -G1 X6.54312 Y4.15239 -G1 X6.27393 Y4.55827 -G1 X5.97957 Y4.94673 -G1 X5.66117 Y5.31619 -G1 X5.31996 Y5.66518 -G1 X4.95725 Y5.99228 -G1 X4.57444 Y6.29617 -G1 X4.17302 Y6.57563 -G1 X3.75455 Y6.82950 -G1 X3.32065 Y7.05675 -G1 X2.87303 Y7.25644 -G1 X2.41342 Y7.42775 -G1 X1.94364 Y7.56996 -G1 X1.46551 Y7.68247 -G1 X0.98092 Y7.76479 -G1 X0.49178 Y7.81655 -G1 X-0.00000 Y7.83750 -G1 X-0.49247 Y7.82752 -G1 X-0.98368 Y7.78661 -G1 X-1.47169 Y7.71488 -G1 X-1.95458 Y7.61258 -G1 X-2.43042 Y7.48006 -G1 X-2.89732 Y7.31781 -G1 X-3.35344 Y7.12642 -G1 X-3.79694 Y6.90661 -G1 X-4.22607 Y6.65921 -G1 X-4.63910 Y6.38517 -G1 X-5.03437 Y6.08551 -G1 X-5.41032 Y5.76140 -G1 X-5.76541 Y5.41408 -G1 X-6.09823 Y5.04489 -G1 X-6.40741 Y4.65526 -G1 X-6.69172 Y4.24670 -G1 X-6.94999 Y3.82079 -G1 X-7.18116 Y3.37920 -G1 X-7.38428 Y2.92365 -G1 X-7.55852 Y2.45591 -G1 X-7.70314 Y1.97783 -G1 X-7.81753 Y1.49127 -G1 X-7.90120 Y0.99815 -G1 X-7.95377 Y0.50041 -G1 X-7.97500 Y-0.00000 -G1 X-7.96475 Y-0.50110 -G1 X-7.92303 Y-1.00091 -G1 X-7.84995 Y-1.49746 -G1 X-7.74576 Y-1.98877 -G1 X-7.61083 Y-2.47291 -G1 X-7.44565 Y-2.94794 -G1 X-7.25083 Y-3.41198 -G1 X-7.02710 Y-3.86318 -G1 X-6.77531 Y-4.29974 -G1 X-6.49641 Y-4.71992 -G1 X-6.19146 Y-5.12202 -G1 X-5.86164 Y-5.50444 -G1 X-5.50821 Y-5.86565 -G1 X-5.13254 Y-6.20417 -G1 X-4.73608 Y-6.51865 -G1 X-4.32037 Y-6.80782 -G1 X-3.88703 Y-7.07048 -G1 X-3.43774 Y-7.30557 -G1 X-2.97426 Y-7.51213 -G1 X-2.49840 Y-7.68929 -G1 X-2.01203 Y-7.83632 -G1 X-1.51704 Y-7.95260 -G1 X-1.01539 Y-8.03762 -G1 X-0.50904 Y-8.09100 -G1 X0.00000 Y-8.11250 -G1 X0.50973 Y-8.10198 -G1 X1.01814 Y-8.05944 -G1 X1.52322 Y-7.98501 -G1 X2.02297 Y-7.87894 -G1 X2.51540 Y-7.74160 -G1 X2.99856 Y-7.57349 -G1 X3.47053 Y-7.37525 -G1 X3.92942 Y-7.14760 -G1 X4.37342 Y-6.89140 -G1 X4.80074 Y-6.60765 -G1 X5.20967 Y-6.29740 -G1 X5.59857 Y-5.96187 -G1 X5.96588 Y-5.60233 -G1 X6.31012 Y-5.22018 -G1 X6.62989 Y-4.81690 -G1 X6.92391 Y-4.39405 -G1 X7.19097 Y-3.95327 -G1 X7.42999 Y-3.49629 -G1 X7.63997 Y-3.02488 -G1 X7.82006 Y-2.54089 -G1 X7.96950 Y-2.04622 -G1 X8.08766 Y-1.54280 -G1 X8.17403 Y-1.03262 -G1 X8.22823 Y-0.51768 -G1 X8.25000 Y0.00000 -G1 X8.23921 Y0.51837 -G1 X8.19586 Y1.03538 -G1 X8.12008 Y1.54899 -G1 X8.01212 Y2.05716 -G1 X7.87237 Y2.55789 -G1 X7.70134 Y3.04918 -G1 X7.49966 Y3.52907 -G1 X7.26809 Y3.99566 -G1 X7.00750 Y4.44709 -G1 X6.71889 Y4.88156 -G1 X6.40335 Y5.29731 -G1 X6.06210 Y5.69269 -G1 X5.69646 Y6.06611 -G1 X5.30783 Y6.41606 -G1 X4.89772 Y6.74113 -G1 X4.46772 Y7.04001 -G1 X4.01951 Y7.31146 -G1 X3.55483 Y7.55440 -G1 X3.07550 Y7.76782 -G1 X2.58338 Y7.95083 -G1 X2.08042 Y8.10268 -G1 X1.56857 Y8.22273 -G1 X1.04985 Y8.31045 -G1 X0.52631 Y8.36546 -G1 X-0.00000 Y8.38750 -G1 X-0.52700 Y8.37644 -G1 X-1.05261 Y8.33228 -G1 X-1.57475 Y8.25514 -G1 X-2.09136 Y8.14530 - -(Outer Circle) - -G1 X-2.59961 Y8.00076 -G1 X-3.09685 Y7.82174 -G1 X-3.58187 Y7.61186 -G1 X-4.05275 Y7.37193 -G1 X-4.50764 Y7.10291 -G1 X-4.94474 Y6.80586 -G1 X-5.36233 Y6.48194 -G1 X-5.75875 Y6.13245 -G1 X-6.13245 Y5.75875 -G1 X-6.48194 Y5.36233 -G1 X-6.80586 Y4.94474 -G1 X-7.10291 Y4.50764 -G1 X-7.37193 Y4.05275 -G1 X-7.61186 Y3.58187 -G1 X-7.82174 Y3.09685 -G1 X-8.00076 Y2.59961 -G1 X-8.14821 Y2.09210 -G1 X-8.26349 Y1.57635 -G1 X-8.34616 Y1.05437 -G1 X-8.39590 Y0.52823 -G1 X-8.41250 Y-0.00000 -G1 X-8.39590 Y-0.52823 -G1 X-8.34616 Y-1.05437 -G1 X-8.26349 Y-1.57635 -G1 X-8.14821 Y-2.09210 -G1 X-8.00076 Y-2.59961 -G1 X-7.82174 Y-3.09685 -G1 X-7.61186 Y-3.58187 -G1 X-7.37193 Y-4.05275 -G1 X-7.10291 Y-4.50764 -G1 X-6.80586 Y-4.94474 -G1 X-6.48194 Y-5.36233 -G1 X-6.13245 Y-5.75875 -G1 X-5.75875 Y-6.13245 -G1 X-5.36233 Y-6.48194 -G1 X-4.94474 Y-6.80586 -G1 X-4.50764 Y-7.10291 -G1 X-4.05275 Y-7.37193 -G1 X-3.58187 Y-7.61186 -G1 X-3.09685 Y-7.82174 -G1 X-2.59961 Y-8.00076 -G1 X-2.09210 Y-8.14821 -G1 X-1.57635 Y-8.26349 -G1 X-1.05437 Y-8.34616 -G1 X-0.52823 Y-8.39590 -G1 X0.00000 Y-8.41250 -G1 X0.52823 Y-8.39590 -G1 X1.05437 Y-8.34616 -G1 X1.57635 Y-8.26349 -G1 X2.09210 Y-8.14821 -G1 X2.59961 Y-8.00076 -G1 X3.09685 Y-7.82174 -G1 X3.58187 Y-7.61186 -G1 X4.05275 Y-7.37193 -G1 X4.50764 Y-7.10291 -G1 X4.94474 Y-6.80586 -G1 X5.36233 Y-6.48194 -G1 X5.75875 Y-6.13245 -G1 X6.13245 Y-5.75875 -G1 X6.48194 Y-5.36233 -G1 X6.80586 Y-4.94474 -G1 X7.10291 Y-4.50764 -G1 X7.37193 Y-4.05275 -G1 X7.61186 Y-3.58187 -G1 X7.82174 Y-3.09685 -G1 X8.00076 Y-2.59961 -G1 X8.14821 Y-2.09210 -G1 X8.26349 Y-1.57635 -G1 X8.34616 Y-1.05437 -G1 X8.39590 Y-0.52823 -G1 X8.41250 Y0.00000 -G1 X8.39590 Y0.52823 -G1 X8.34616 Y1.05437 -G1 X8.26349 Y1.57635 -G1 X8.14821 Y2.09210 -G1 X8.00076 Y2.59961 -G1 X7.82174 Y3.09685 -G1 X7.61186 Y3.58187 -G1 X7.37193 Y4.05275 -G1 X7.10291 Y4.50764 -G1 X6.80586 Y4.94474 -G1 X6.48194 Y5.36233 -G1 X6.13245 Y5.75875 -G1 X5.75875 Y6.13245 -G1 X5.36233 Y6.48194 -G1 X4.94474 Y6.80586 -G1 X4.50764 Y7.10291 -G1 X4.05275 Y7.37193 -G1 X3.58187 Y7.61186 -G1 X3.09685 Y7.82174 -G1 X2.59961 Y8.00076 -G1 X2.09210 Y8.14821 -G1 X1.57635 Y8.26349 -G1 X1.05437 Y8.34616 -G1 X0.52823 Y8.39590 -G1 X-0.00000 Y8.41250 -G1 X-0.52823 Y8.39590 -G1 X-1.05437 Y8.34616 -G1 X-1.57635 Y8.26349 -G1 X-2.09210 Y8.14821 -G1 X-2.59961 Y8.00076 - -(Return) - -G1 X0.00000 Y0.00000 F500.00000 -(G4 P0.1) -G1 Z0.00000 diff --git a/test/gcode/SO2_helloworld.nc b/test/gcode/SO2_helloworld.nc deleted file mode 100644 index 1d100594f..000000000 --- a/test/gcode/SO2_helloworld.nc +++ /dev/null @@ -1,773 +0,0 @@ -(ShapeOko2 "Hello World" test file) -(Set up sheet of paper landscape, long edge on X-axis) -(Starting location around the lower[-y] left[-x] corner) - -(originally Generated by PartKam Version 0.05) - -G20 G90 (remove G40) - -(write the words) -G0 Z0.125 -(remove x) -G17 - -G0 X0.435 Y0.4042 -G1 Z-0.01 F10 -G3 X0.4557 Y0.4046 I0 J0.4533 F40 -G3 X0.4728 Y0.4059 I-0.0142 J0.3117 -G3 X0.4898 Y0.4082 I-0.0257 J0.2542 -G3 X0.5034 Y0.4111 I-0.028 J0.1653 -G3 X0.5168 Y0.415 I-0.0472 J0.1844 -G3 X0.5278 Y0.4192 I-0.0435 J0.1296 -G3 X0.5383 Y0.4245 I-0.0462 J0.1062 -G3 X0.5468 Y0.4299 I-0.0415 J0.0739 -G3 X0.5545 Y0.4363 I-0.0474 J0.0649 -G3 X0.5606 Y0.4429 I-0.0441 J0.0468 -G3 X0.5656 Y0.4503 I-0.0464 J0.0371 -G3 X0.5694 Y0.4582 I-0.0481 J0.0278 -G3 X0.5721 Y0.4664 I-0.0805 J0.031 -G3 X0.5741 Y0.4754 I-0.093 J0.0254 -G3 X0.5753 Y0.4846 I-0.1022 J0.0176 -G3 X0.5757 Y0.4946 I-0.1224 J0.01 -G3 X0.5731 Y0.5153 I-0.083 J0 -G3 X0.5656 Y0.5337 I-0.0731 J-0.0188 -G3 X0.5537 Y0.5498 I-0.072 J-0.0408 -G3 X0.5355 Y0.5656 I-0.0876 J-0.083 -G3 X0.5146 Y0.5784 I-0.1178 J-0.1676 -G3 X0.4808 Y0.5949 I-0.2293 J-0.4268 -G3 X0.4459 Y0.6092 I-0.282 J-0.6397 -G3 X0.3973 Y0.6265 I-0.4624 J-1.2235 -G2 X0.376 Y0.6343 I0.3353 J0.9488 -G2 X0.3546 Y0.6427 I0.3684 J0.9724 -G2 X0.3333 Y0.6515 I0.3967 J0.9808 -G2 X0.3119 Y0.661 I0.4333 J1.0077 -G2 X0.2909 Y0.6715 I0.1396 J0.3066 -G2 X0.2714 Y0.683 I0.1507 J0.2779 -G2 X0.2527 Y0.6959 I0.1666 J0.2606 -G2 X0.2353 Y0.71 I0.1811 J0.2422 -G2 X0.2191 Y0.7255 I0.1487 J0.1708 -G2 X0.2045 Y0.7427 I0.1668 J0.1572 -G2 X0.1916 Y0.7611 I0.1861 J0.1436 -G2 X0.18 Y0.7816 I0.2168 J0.1363 -G2 X0.1709 Y0.8032 I0.1508 J0.0765 -G2 X0.164 Y0.8282 I0.1965 J0.0675 -G2 X0.1601 Y0.854 I0.2316 J0.0483 -G2 X0.1587 Y0.884 I0.3133 J0.03 -G2 X0.1601 Y0.914 I0.3058 J0 -G2 X0.1643 Y0.9413 I0.2576 J-0.0254 -G2 X0.1715 Y0.968 I0.2377 J-0.0494 -G2 X0.1813 Y0.9926 I0.2132 J-0.0704 -G2 X0.1938 Y1.016 I0.2171 J-0.1015 -G2 X0.2086 Y1.0374 I0.1951 J-0.1191 -G2 X0.2257 Y1.0569 I0.1807 J-0.1407 -G2 X0.2453 Y1.0749 I0.1727 J-0.1691 -G2 X0.2668 Y1.0906 I0.1588 J-0.1942 -G2 X0.2912 Y1.1049 I0.1534 J-0.2346 -G2 X0.3168 Y1.1167 I0.1391 J-0.2681 -G2 X0.3458 Y1.127 I0.1352 J-0.3335 -G2 X0.3756 Y1.1348 I0.1068 J-0.3459 -G2 X0.4086 Y1.1407 I0.0911 J-0.4184 -G2 X0.442 Y1.144 I0.0638 J-0.4657 -G2 X0.4789 Y1.1452 I0.037 J-0.5706 -G2 X0.5228 Y1.144 I0 J-0.7643 -G2 X0.5609 Y1.1405 I-0.0333 J-0.5787 -G2 X0.5986 Y1.1344 I-0.062 J-0.5001 -G2 X0.6309 Y1.1264 I-0.0758 J-0.3755 -G2 X0.6627 Y1.1163 I-0.2335 J-0.7931 -G2 X0.6893 Y1.1066 I-0.191 J-0.5638 -G2 X0.7154 Y1.0955 I-0.1827 J-0.4653 -G2 X0.7364 Y1.0849 I-0.1447 J-0.3148 -G1 X0.6799 Y0.9304 -G3 X0.6615 Y0.9394 I-0.2077 J-0.4011 -G3 X0.6414 Y0.9482 I-0.2158 J-0.4675 -G3 X0.621 Y0.9561 I-0.2093 J-0.5093 -G3 X0.5989 Y0.9637 I-0.2164 J-0.5924 -G3 X0.5764 Y0.9698 I-0.0747 J-0.2309 -G3 X0.5498 Y0.9745 I-0.0698 J-0.3171 -G3 X0.5228 Y0.9772 I-0.0502 J-0.3738 -G3 X0.4915 Y0.9782 I-0.0314 J-0.5063 -G3 X0.4565 Y0.9767 I0 J-0.4369 -G3 X0.4311 Y0.9733 I0.0187 J-0.2329 -G3 X0.4065 Y0.9666 I0.0312 J-0.1619 -G3 X0.3904 Y0.9587 I0.0277 J-0.0771 -G3 X0.3767 Y0.9474 I0.0374 J-0.0591 -G3 X0.3673 Y0.9341 I0.0432 J-0.0405 -G3 X0.3618 Y0.9186 I0.0563 J-0.029 -G3 X0.3596 Y0.899 I0.0892 J-0.0196 -G3 X0.3604 Y0.8872 I0.093 J0 -G3 X0.3625 Y0.8771 I0.0704 J0.009 -G3 X0.366 Y0.8674 I0.0617 J0.0173 -G3 X0.3709 Y0.8588 I0.0525 J0.0244 -G3 X0.377 Y0.851 I0.0702 J0.0485 -G3 X0.3846 Y0.8433 I0.0772 J0.0678 -G3 X0.3929 Y0.8363 I0.0778 J0.0845 -G3 X0.403 Y0.8293 I0.0886 J0.1165 -G3 X0.4135 Y0.823 I0.1229 J0.1933 -G3 X0.4253 Y0.8168 I0.1326 J0.2355 -G3 X0.4373 Y0.8111 I0.1314 J0.2629 -G3 X0.4507 Y0.8055 I0.1413 J0.3181 -G3 X0.4642 Y0.8002 I0.4349 J1.1 -G3 X0.4791 Y0.7946 I0.5053 J1.3254 -G3 X0.4941 Y0.7892 I0.5351 J1.4522 -G3 X0.5104 Y0.7835 I0.615 J1.7234 -G2 X0.5441 Y0.7706 I-0.62 J-1.6745 -G2 X0.5738 Y0.7585 I-0.5126 J-1.3027 -G2 X0.6031 Y0.7457 I-0.4768 J-1.135 -G2 X0.6284 Y0.7339 I-0.3858 J-0.8553 -G2 X0.653 Y0.7208 I-0.1756 J-0.3603 -G2 X0.6744 Y0.7073 I-0.164 J-0.2844 -G2 X0.6946 Y0.6922 I-0.1689 J-0.2468 -G2 X0.7119 Y0.6767 I-0.1605 J-0.1966 -G2 X0.7276 Y0.6596 I-0.1493 J-0.1521 -G2 X0.741 Y0.6412 I-0.1581 J-0.1293 -G2 X0.7522 Y0.6215 I-0.172 J-0.1113 -G2 X0.7615 Y0.6001 I-0.1936 J-0.0968 -G2 X0.7685 Y0.5778 I-0.2008 J-0.0746 -G2 X0.7738 Y0.5514 I-0.2755 J-0.0693 -G2 X0.7768 Y0.5247 I-0.3264 J-0.0499 -G2 X0.7779 Y0.4934 I-0.4455 J-0.0313 -G2 X0.772 Y0.4337 I-0.3082 J0 -G2 X0.7565 Y0.3852 I-0.2183 J0.0431 -G2 X0.7301 Y0.3418 I-0.1887 J0.0852 -G2 X0.6925 Y0.3043 I-0.1784 J0.1413 -G2 X0.647 Y0.2762 I-0.146 J0.1856 -G2 X0.5854 Y0.2539 I-0.1514 J0.3216 -G2 X0.5204 Y0.2419 I-0.1159 J0.4443 -G2 X0.435 Y0.2371 I-0.0854 J0.7648 -G2 X0.4061 Y0.2376 I0 J0.919 -G2 X0.38 Y0.2388 I0.0236 J0.75 -G2 X0.354 Y0.2411 I0.0448 J0.6746 -G2 X0.3307 Y0.244 I0.0572 J0.5433 -G2 X0.3075 Y0.2478 I0.1319 J0.886 -G2 X0.2869 Y0.2517 I0.1238 J0.7045 -G2 X0.2664 Y0.2563 I0.1284 J0.6229 -G2 X0.2485 Y0.261 I0.1166 J0.4841 -G2 X0.2307 Y0.2663 I0.1781 J0.6347 -G2 X0.2152 Y0.2714 I0.1505 J0.4834 -G2 X0.1999 Y0.277 I0.1443 J0.4161 -G2 X0.1869 Y0.2823 I0.1191 J0.3062 -G2 X0.1741 Y0.2881 I0.2781 J0.6336 -G2 X0.1632 Y0.2933 I0.2146 J0.4632 -G2 X0.1524 Y0.2988 I0.1915 J0.3889 -G2 X0.1436 Y0.3037 I0.1422 J0.2695 -G1 X0.1988 Y0.4594 -G3 X0.2186 Y0.4494 I0.1622 J0.2959 -G3 X0.2423 Y0.4392 I0.1933 J0.4152 -G3 X0.2666 Y0.4302 I0.1967 J0.4934 -G3 X0.2949 Y0.4211 I0.2292 J0.6675 -G3 X0.3238 Y0.414 I0.0929 J0.313 -G3 X0.3585 Y0.4084 I0.0897 J0.4486 -G3 X0.3936 Y0.4053 I0.065 J0.537 -G3 X0.435 Y0.4042 I0.0414 J0.7464 -G0 Z0.125 -G0 X1.4536 Y1.1251 -G1 Z-0.01 F10 -G1 X1.6496 Y1.1251 F40 -G1 X1.6496 Y0.2547 -G1 X1.4536 Y0.2547 -G1 X1.4536 Y0.624 -G1 X1.1246 Y0.624 -G1 X1.1246 Y0.2547 -G1 X0.9286 Y0.2547 -G1 X0.9286 Y1.1251 -G1 X1.1246 Y1.1251 -G1 X1.1246 Y0.7923 -G1 X1.4536 Y0.7923 -G1 X1.4536 Y1.1251 -G0 Z0.125 -G0 X2.4338 Y0.2547 -G1 Z-0.01 F10 -G1 X2.403 Y0.3477 F40 -G1 X2.3698 Y0.4431 -G1 X2.0306 Y0.4431 -G1 X1.9973 Y0.3477 -G1 X1.9666 Y0.2547 -G1 X1.7631 Y0.2547 -G2 X1.7877 Y0.325 I17.8599 J-6.2193 -G2 X1.8108 Y0.39 I15.3154 J-5.401 -G2 X1.8342 Y0.455 I14.1288 J-5.0502 -G2 X1.856 Y0.5147 I11.9637 J-4.3385 -G2 X1.8782 Y0.5743 I9.7422 J-3.588 -G2 X1.8995 Y0.6306 I8.7097 J-3.2684 -G2 X1.9212 Y0.6867 I8.2125 J-3.1426 -G2 X1.9421 Y0.7395 I7.2956 J-2.8491 -G2 X1.9633 Y0.7922 I8.4224 J-3.3598 -G2 X1.9838 Y0.8424 I7.6529 J-3.1085 -G2 X2.0047 Y0.8924 I7.277 J-3.0116 -G2 X2.025 Y0.9399 I6.5821 J-2.7772 -G2 X2.0457 Y0.9872 I4.2002 J-1.8081 -G2 X2.0666 Y1.0336 I4.0692 J-1.8064 -G2 X2.0881 Y1.0798 I3.9952 J-1.8286 -G2 X2.1098 Y1.1251 I3.8717 J-1.8266 -G1 X2.2969 Y1.1251 -G2 X2.3181 Y1.0798 I-6.0675 J-2.8652 -G2 X2.3393 Y1.0336 I-6.3027 J-2.919 -G2 X2.3602 Y0.9872 I-6.4339 J-2.9227 -G2 X2.381 Y0.9399 I-6.6806 J-2.977 -G2 X2.4016 Y0.8924 I-5.4185 J-2.3686 -G2 X2.4227 Y0.8424 I-5.9798 J-2.5519 -G2 X2.4433 Y0.7922 I-6.2861 J-2.6208 -G2 X2.4646 Y0.7395 I-6.9077 J-2.8155 -G2 X2.4854 Y0.6867 I-7.3628 J-2.9356 -G2 X2.5071 Y0.6306 I-8.2907 J-3.237 -G2 X2.5284 Y0.5743 I-8.7947 J-3.3654 -G2 X2.5506 Y0.5147 I-9.8397 J-3.6933 -G2 X2.5724 Y0.455 I-11.8601 J-4.3698 -G2 X2.5958 Y0.39 I-14.0105 J-5.0822 -G2 X2.6189 Y0.325 I-15.1905 J-5.4307 -G2 X2.6436 Y0.2547 I-17.7191 J-6.2494 -G1 X2.4338 Y0.2547 -G0 Z0.125 -G0 X2.1989 Y0.9279 -G1 Z-0.01 F10 -G2 X2.1957 Y0.9185 I-0.5641 J0.1881 F40 -G2 X2.1911 Y0.9056 I-1.0677 J0.3759 -G2 X2.1863 Y0.8928 I-1.4028 J0.513 -G2 X2.1801 Y0.8764 I-2.2751 J0.8558 -G3 X2.1738 Y0.8601 I30.9994 J-11.916 -G3 X2.1666 Y0.8413 I41.2401 J-15.8275 -G3 X2.1594 Y0.8224 I47.1201 J-18.0595 -G3 X2.1512 Y0.8011 I60.4881 J-23.1553 -G3 X2.143 Y0.7797 I19.8859 J-7.6046 -G3 X2.1341 Y0.7562 I24.1414 J-9.2022 -G3 X2.1251 Y0.7326 I26.4832 J-10.0653 -G3 X2.1154 Y0.7069 I31.5951 J-11.976 -G3 X2.1057 Y0.6811 I4.794 J-1.8127 -G3 X2.0958 Y0.6541 I5.244 J-1.9507 -G3 X2.086 Y0.6271 I5.4846 J-2.0082 -G3 X2.0758 Y0.5988 I5.9771 J-2.1552 -G1 X2.3233 Y0.5988 -G3 X2.3132 Y0.6271 I-12.9639 J-4.6057 -G3 X2.3035 Y0.6541 I-11.8652 J-4.2445 -G3 X2.2937 Y0.6811 I-11.3354 J-4.0841 -G3 X2.2843 Y0.7069 I-10.3324 J-3.7506 -G3 X2.2748 Y0.7326 I-4.3139 J-1.5783 -G3 X2.266 Y0.7562 I-3.6331 J-1.3538 -G3 X2.2569 Y0.7797 I-3.3175 J-1.2608 -G3 X2.2485 Y0.8011 I-2.7503 J-1.0677 -G2 X2.2401 Y0.8224 I9.4214 J3.7426 -G2 X2.2327 Y0.8413 I7.3257 J2.8909 -G2 X2.2253 Y0.8601 I6.4077 J2.5096 -G2 X2.219 Y0.8764 I4.802 J1.8645 -G3 X2.2127 Y0.8927 I-7.2811 J-2.7989 -G3 X2.2077 Y0.9056 I-4.551 J-1.7612 -G3 X2.2027 Y0.9185 I-3.4837 J-1.3595 -G3 X2.1989 Y0.9279 I-1.8801 J-0.7417 -G0 Z0.125 -G0 X3.0175 Y1.1352 -G1 Z-0.01 F10 -G2 X3.1143 Y1.1304 I0 J-0.9783 F40 -G2 X3.1895 Y1.118 I-0.06 J-0.603 -G2 X3.2619 Y1.0953 I-0.1063 J-0.4642 -G2 X3.3164 Y1.0667 I-0.1178 J-0.2911 -G2 X3.362 Y1.0268 I-0.1208 J-0.184 -G2 X3.3946 Y0.9764 I-0.1634 J-0.1415 -G2 X3.4133 Y0.9188 I-0.2268 J-0.1055 -G2 X3.4207 Y0.8425 I-0.3919 J-0.0763 -G2 X3.4132 Y0.7656 I-0.4013 J0 -G2 X3.3943 Y0.7073 I-0.2484 J0.0485 -G2 X3.3613 Y0.6563 I-0.1992 J0.0927 -G2 X3.3152 Y0.6158 I-0.1701 J0.147 -G2 X3.26 Y0.5867 I-0.1755 J0.2656 -G2 X3.187 Y0.5635 I-0.1806 J0.4426 -G2 X3.1111 Y0.551 I-0.1365 J0.5905 -G2 X3.0137 Y0.5461 I-0.0974 J0.969 -G1 X2.9522 Y0.5461 -G1 X2.9522 Y0.2547 -G1 X2.7562 Y0.2547 -G1 X2.7562 Y1.1126 -G2 X2.7883 Y1.1183 I0.19 J-0.9718 -G2 X2.8222 Y1.1232 I0.1732 J-1.0725 -G2 X2.8561 Y1.1271 I0.1462 J-1.1296 -G2 X2.8919 Y1.1301 I0.1235 J-1.2476 -G2 X2.9277 Y1.1324 I0.1789 J-2.5504 -G2 X2.9591 Y1.1339 I0.1097 J-1.9581 -G2 X2.9905 Y1.1349 I0.068 J-1.701 -G2 X3.0175 Y1.1352 I0.027 J-1.257 -G0 Z0.125 -G0 X3.03 Y0.9681 -G1 Z-0.01 F10 -G1 X2.988 Y0.9669 F40 -G3 X2.9775 Y0.9662 I0.1375 J-2.2842 -G3 X2.9686 Y0.9656 I0.1084 J-1.6742 -G3 X2.9597 Y0.965 I0.0994 J-1.4177 -G3 X2.9522 Y0.9644 I0.0758 J-0.9911 -G1 X2.9522 Y0.7131 -G1 X3.0137 Y0.7131 -G3 X3.0644 Y0.7151 I0 J0.6562 -G3 X3.1029 Y0.72 I-0.0297 J0.3827 -G3 X3.1403 Y0.7294 I-0.051 J0.2826 -G3 X3.1669 Y0.7408 I-0.0497 J0.1535 -G3 X3.1895 Y0.7577 I-0.0439 J0.0818 -G3 X3.2056 Y0.7803 I-0.0644 J0.0629 -G3 X3.2147 Y0.807 I-0.0959 J0.048 -G3 X3.2184 Y0.8438 I-0.1813 J0.0368 -G3 X3.2175 Y0.8619 I-0.1838 J0 -G3 X3.2151 Y0.877 I-0.1312 J-0.013 -G3 X3.2109 Y0.8918 I-0.1104 J-0.0241 -G3 X3.2052 Y0.9041 I-0.0828 J-0.0303 -G3 X3.1979 Y0.9154 I-0.0877 J-0.0485 -G3 X3.1892 Y0.9256 I-0.078 J-0.058 -G3 X3.1793 Y0.9344 I-0.0709 J-0.0697 -G3 X3.1676 Y0.9424 I-0.0682 J-0.088 -G3 X3.155 Y0.9489 I-0.0659 J-0.1118 -G3 X3.1404 Y0.9546 I-0.0654 J-0.1451 -G3 X3.1253 Y0.959 I-0.0571 J-0.1695 -G3 X3.1079 Y0.9625 I-0.0538 J-0.2228 -G3 X3.0903 Y0.9649 I-0.0622 J-0.3868 -G3 X3.0709 Y0.9667 I-0.0535 J-0.4675 -G3 X3.0514 Y0.9677 I-0.0373 J-0.514 -G3 X3.03 Y0.9681 I-0.0213 J-0.6163 -G0 Z0.125 -G0 X3.5657 Y0.2547 -G1 Z-0.01 F10 -G1 X3.5657 Y1.1251 F40 -G1 X4.1536 Y1.1251 -G1 X4.1536 Y0.9606 -G1 X3.7617 Y0.9606 -G1 X3.7617 Y0.7898 -G1 X4.1096 Y0.7898 -G1 X4.1096 Y0.629 -G1 X3.7617 Y0.629 -G1 X3.7617 Y0.4193 -G1 X4.1825 Y0.4193 -G1 X4.1825 Y0.2547 -G1 X3.5657 Y0.2547 -G0 Z0.125 -G0 X4.4908 Y0.6905 -G1 Z-0.01 F10 -G3 X4.4918 Y0.6586 I0.4971 J0 F40 -G3 X4.4947 Y0.6296 I0.4109 J0.0265 -G3 X4.4997 Y0.601 I0.3733 J0.0507 -G3 X4.5065 Y0.575 I0.3139 J0.0676 -G3 X4.5154 Y0.5497 I0.3036 J0.0925 -G3 X4.5256 Y0.5271 I0.2511 J0.1004 -G3 X4.5379 Y0.5056 I0.2254 J0.1151 -G3 X4.5517 Y0.4864 I0.1934 J0.124 -G3 X4.5674 Y0.4689 I0.1636 J0.1303 -G3 X4.5845 Y0.4536 I0.1398 J0.1398 -G3 X4.6033 Y0.4405 I0.1224 J0.1548 -G3 X4.6239 Y0.4293 I0.109 J0.1765 -G3 X4.6457 Y0.4206 I0.0819 J0.174 -G3 X4.6698 Y0.4142 I0.0674 J0.205 -G3 X4.6944 Y0.4105 I0.0471 J0.2296 -G3 X4.7219 Y0.4092 I0.0275 J0.2849 -G3 X4.7487 Y0.4105 I0 J0.2758 -G3 X4.7732 Y0.4142 I-0.0227 J0.2323 -G3 X4.7971 Y0.4206 I-0.0443 J0.2143 -G3 X4.8192 Y0.4293 I-0.0629 J0.192 -G3 X4.8402 Y0.4405 I-0.0881 J0.1899 -G3 X4.8591 Y0.4536 I-0.1024 J0.1678 -G3 X4.8763 Y0.4689 I-0.1208 J0.154 -G3 X4.8921 Y0.4864 I-0.1445 J0.1452 -G3 X4.9058 Y0.5056 I-0.1798 J0.1433 -G3 X4.9181 Y0.5271 I-0.2133 J0.1367 -G3 X4.9284 Y0.5497 I-0.2412 J0.1232 -G3 X4.9373 Y0.575 I-0.295 J0.1181 -G3 X4.944 Y0.601 I-0.3069 J0.0937 -G3 X4.9491 Y0.6296 I-0.3679 J0.0794 -G3 X4.952 Y0.6586 I-0.4076 J0.0554 -G3 X4.953 Y0.6905 I-0.4955 J0.032 -G3 X4.952 Y0.7225 I-0.4983 J0 -G3 X4.9491 Y0.7516 I-0.4161 J-0.0268 -G3 X4.944 Y0.7804 I-0.3801 J-0.0514 -G3 X4.9373 Y0.8067 I-0.3232 J-0.0691 -G3 X4.9284 Y0.8324 I-0.3076 J-0.0928 -G3 X4.9181 Y0.8551 I-0.252 J-0.0999 -G3 X4.9058 Y0.8767 I-0.2249 J-0.1141 -G3 X4.8921 Y0.8959 I-0.1909 J-0.1218 -G3 X4.8763 Y0.9135 I-0.1602 J-0.1276 -G3 X4.8591 Y0.9287 I-0.1379 J-0.1385 -G3 X4.8402 Y0.9418 I-0.1212 J-0.1544 -G3 X4.8192 Y0.9531 I-0.1088 J-0.1784 -G3 X4.7971 Y0.9618 I-0.085 J-0.1835 -G3 X4.7732 Y0.9681 I-0.0682 J-0.2081 -G3 X4.7487 Y0.9718 I-0.0472 J-0.2288 -G3 X4.7219 Y0.9731 I-0.0269 J-0.2747 -G3 X4.6944 Y0.9718 I0 J-0.2778 -G3 X4.6698 Y0.968 I0.0226 J-0.2269 -G3 X4.6458 Y0.9614 I0.0436 J-0.206 -G3 X4.6239 Y0.9524 I0.0608 J-0.1793 -G3 X4.6033 Y0.941 I0.0938 J-0.1933 -G3 X4.5845 Y0.9276 I0.1085 J-0.1725 -G3 X4.5674 Y0.9123 I0.1271 J-0.159 -G3 X4.5517 Y0.8947 I0.1514 J-0.1507 -G3 X4.538 Y0.8755 I0.1766 J-0.1407 -G3 X4.5256 Y0.8538 I0.2121 J-0.1354 -G3 X4.5154 Y0.8311 I0.2413 J-0.1223 -G3 X4.5065 Y0.8055 I0.2984 J-0.1182 -G3 X4.4997 Y0.7792 I0.3216 J-0.0968 -G3 X4.4947 Y0.7507 I0.3729 J-0.0801 -G3 X4.4918 Y0.7219 I0.4066 J-0.0555 -G3 X4.4908 Y0.6905 I0.4804 J-0.0313 -G0 Z0.125 -G0 X5.1552 Y0.6905 -G1 Z-0.01 F10 -G2 X5.153 Y0.6348 I-0.7056 J0 F40 -G2 X5.1469 Y0.5855 I-0.5592 J0.0443 -G2 X5.1362 Y0.537 I-0.4973 J0.0842 -G2 X5.1219 Y0.494 I-0.4061 J0.1107 -G2 X5.1034 Y0.4526 I-0.4475 J0.1756 -G2 X5.0825 Y0.4161 I-0.3674 J0.1859 -G2 X5.058 Y0.3821 I-0.3264 J0.2094 -G2 X5.0309 Y0.3521 I-0.2803 J0.2261 -G2 X5.0006 Y0.3252 I-0.2579 J0.2609 -G2 X4.9676 Y0.302 I-0.2269 J0.2867 -G2 X4.9322 Y0.2824 I-0.1983 J0.3171 -G2 X4.8933 Y0.266 I-0.1783 J0.3683 -G2 X4.8529 Y0.2534 I-0.1576 J0.4351 -G2 X4.8106 Y0.2443 I-0.1231 J0.4701 -G2 X4.7676 Y0.239 I-0.0841 J0.4988 -G2 X4.7219 Y0.2371 I-0.0457 J0.5609 -G2 X4.6774 Y0.239 I0 J0.5346 -G2 X4.6352 Y0.2443 I0.0407 J0.4884 -G2 X4.5936 Y0.2534 I0.0806 J0.4691 -G2 X4.5536 Y0.266 I0.1189 J0.4479 -G2 X4.5149 Y0.2824 I0.1418 J0.3881 -G2 X4.4795 Y0.302 I0.1683 J0.3468 -G2 X4.4463 Y0.3252 I0.2011 J0.3229 -G2 X4.4154 Y0.3521 I0.2387 J0.3054 -G2 X4.3877 Y0.3821 I0.2524 J0.2608 -G2 X4.3627 Y0.4161 I0.2987 J0.246 -G2 X4.3414 Y0.4526 I0.3422 J0.2241 -G2 X4.3225 Y0.494 I0.4215 J0.2176 -G2 X4.3079 Y0.537 I0.3858 J0.1543 -G2 X4.297 Y0.5855 I0.4777 J0.1328 -G2 X4.2908 Y0.6348 I0.5427 J0.0937 -G2 X4.2885 Y0.6905 I0.6897 J0.0557 -G2 X4.2909 Y0.7462 I0.6678 J0 -G2 X4.2973 Y0.7956 I0.5306 J-0.0444 -G2 X4.3086 Y0.844 I0.473 J-0.0846 -G2 X4.3237 Y0.8871 I0.3899 J-0.1124 -G2 X4.3432 Y0.9285 I0.4519 J-0.1874 -G2 X4.365 Y0.9652 I0.376 J-0.199 -G2 X4.3904 Y0.9993 I0.3361 J-0.2236 -G2 X4.4185 Y1.0297 I0.2923 J-0.2425 -G2 X4.4497 Y1.0569 I0.2779 J-0.287 -G2 X4.4829 Y1.0802 I0.2379 J-0.303 -G2 X4.5184 Y1.1 I0.2055 J-0.3276 -G2 X4.5567 Y1.1163 I0.1789 J-0.3656 -G2 X4.5964 Y1.129 I0.1604 J-0.4356 -G2 X4.6372 Y1.138 I0.1212 J-0.4502 -G2 X4.6787 Y1.1434 I0.0819 J-0.4678 -G2 X4.7219 Y1.1452 I0.0432 J-0.5057 -G2 X4.7663 Y1.1434 I0 J-0.535 -G2 X4.8085 Y1.138 I-0.0407 J-0.4886 -G2 X4.8501 Y1.1289 I-0.0806 J-0.4692 -G2 X4.8902 Y1.1163 I-0.1189 J-0.4478 -G2 X4.9288 Y1.0999 I-0.1394 J-0.3816 -G2 X4.9643 Y1.0802 I-0.1667 J-0.3421 -G2 X4.9975 Y1.0568 I-0.2001 J-0.3191 -G2 X5.0284 Y1.0297 I-0.2393 J-0.3033 -G2 X5.0561 Y0.9993 I-0.2595 J-0.2651 -G2 X5.0811 Y0.9652 I-0.3049 J-0.2492 -G2 X5.1024 Y0.9285 I-0.3477 J-0.2267 -G2 X5.1213 Y0.8871 I-0.4252 J-0.219 -G2 X5.1358 Y0.844 I-0.3859 J-0.1543 -G2 X5.1467 Y0.7956 I-0.4781 J-0.1328 -G2 X5.1529 Y0.7462 I-0.5432 J-0.0937 -G2 X5.1552 Y0.6905 I-0.6906 J-0.0557 -G0 Z0.125 -G0 X5.831 Y0.2547 -G1 Z-0.01 F10 -G3 X5.8176 Y0.2759 I-1.044 J-0.6457 F40 -G3 X5.8023 Y0.2991 I-1.2661 J-0.8193 -G3 X5.7865 Y0.3221 I-1.3802 J-0.9298 -G3 X5.7688 Y0.347 I-1.648 J-1.1507 -G3 X5.7507 Y0.3716 I-1.2024 J-0.8671 -G3 X5.7315 Y0.3966 I-1.2587 J-0.9478 -G3 X5.7118 Y0.4213 I-1.2783 J-1.0032 -G3 X5.691 Y0.4462 I-1.3393 J-1.0938 -G3 X5.6697 Y0.4708 I-1.3401 J-1.1372 -G3 X5.6481 Y0.4949 I-1.3041 J-1.1488 -G3 X5.6261 Y0.5186 I-1.2762 J-1.1671 -G3 X5.6037 Y0.5417 I-1.2437 J-1.1807 -G3 X5.5807 Y0.5643 I-0.7609 J-0.7501 -G3 X5.5585 Y0.5849 I-0.6558 J-0.6866 -G3 X5.5355 Y0.6048 I-0.5973 J-0.6668 -G3 X5.5132 Y0.6227 I-0.5113 J-0.6113 -G1 X5.5132 Y0.2547 -G1 X5.3173 Y0.2547 -G1 X5.3173 Y1.1251 -G1 X5.5132 Y1.1251 -G1 X5.5132 Y0.796 -G3 X5.5514 Y0.8364 I-4.1871 J3.9914 -G3 X5.59 Y0.8782 I-4.4359 J4.1481 -G3 X5.6283 Y0.9203 I-4.5842 J4.207 -G3 X5.6671 Y0.9637 I-4.8507 J4.3705 -G2 X5.7058 Y1.0073 I26.9704 J-23.868 -G2 X5.7417 Y1.0477 I23.1463 J-20.5506 -G2 X5.7777 Y1.088 I21.3614 J-19.0327 -G2 X5.8109 Y1.1251 I18.1034 J-16.1914 -G1 X6.0433 Y1.1251 -G2 X5.9984 Y1.0726 I-5.3969 J4.5615 -G2 X5.9539 Y1.0215 I-5.1497 J4.4395 -G2 X5.9089 Y0.9709 I-5.0078 J4.405 -G2 X5.8643 Y0.9217 I-4.7755 J4.2874 -G2 X5.8191 Y0.8729 I-4.3297 J3.9689 -G2 X5.7721 Y0.8234 I-4.526 J4.244 -G2 X5.7246 Y0.7743 I-4.6029 J4.4123 -G2 X5.6753 Y0.7244 I-4.8095 J4.7102 -G2 X5.7262 Y0.6798 I-0.8185 J-0.9847 -G2 X5.7778 Y0.6296 I-0.9824 J-1.0622 -G2 X5.8269 Y0.577 I-1.1027 J-1.0792 -G2 X5.8769 Y0.5185 I-1.3152 J-1.1722 -G2 X5.9244 Y0.458 I-1.6952 J-1.3829 -G2 X5.9722 Y0.3929 I-1.9177 J-1.4551 -G2 X6.0177 Y0.3262 I-2.064 J-1.4598 -G2 X6.0634 Y0.2547 I-2.3302 J-1.5388 -G1 X5.831 Y0.2547 -G0 Z0.125 -G0 X6.3404 Y0.6905 -G1 Z-0.01 F10 -G3 X6.3415 Y0.6586 I0.4971 J0 F40 -G3 X6.3444 Y0.6296 I0.4109 J0.0265 -G3 X6.3494 Y0.601 I0.3733 J0.0507 -G3 X6.3561 Y0.575 I0.3139 J0.0676 -G3 X6.365 Y0.5497 I0.3036 J0.0925 -G3 X6.3753 Y0.5271 I0.2511 J0.1004 -G3 X6.3876 Y0.5056 I0.2254 J0.1151 -G3 X6.4013 Y0.4864 I0.1934 J0.124 -G3 X6.417 Y0.4689 I0.1636 J0.1303 -G3 X6.4342 Y0.4536 I0.1398 J0.1398 -G3 X6.4529 Y0.4405 I0.1224 J0.1548 -G3 X6.4736 Y0.4293 I0.109 J0.1765 -G3 X6.4954 Y0.4206 I0.0819 J0.174 -G3 X6.5194 Y0.4142 I0.0674 J0.205 -G3 X6.5441 Y0.4105 I0.0471 J0.2296 -G3 X6.5715 Y0.4092 I0.0275 J0.2849 -G3 X6.5984 Y0.4105 I0 J0.2758 -G3 X6.6229 Y0.4142 I-0.0227 J0.2323 -G3 X6.6468 Y0.4206 I-0.0443 J0.2143 -G3 X6.6689 Y0.4293 I-0.0629 J0.192 -G3 X6.6898 Y0.4405 I-0.0881 J0.1899 -G3 X6.7088 Y0.4536 I-0.1024 J0.1678 -G3 X6.726 Y0.4689 I-0.1208 J0.154 -G3 X6.7417 Y0.4864 I-0.1445 J0.1452 -G3 X6.7555 Y0.5056 I-0.1798 J0.1433 -G3 X6.7678 Y0.5271 I-0.2133 J0.1367 -G3 X6.778 Y0.5497 I-0.2412 J0.1232 -G3 X6.787 Y0.575 I-0.295 J0.1181 -G3 X6.7937 Y0.601 I-0.3069 J0.0937 -G3 X6.7987 Y0.6296 I-0.3679 J0.0794 -G3 X6.8016 Y0.6586 I-0.4076 J0.0554 -G3 X6.8027 Y0.6905 I-0.4955 J0.032 -G3 X6.8016 Y0.7225 I-0.4983 J0 -G3 X6.7987 Y0.7516 I-0.4161 J-0.0268 -G3 X6.7937 Y0.7804 I-0.3801 J-0.0514 -G3 X6.787 Y0.8067 I-0.3232 J-0.0691 -G3 X6.778 Y0.8324 I-0.3076 J-0.0928 -G3 X6.7678 Y0.8551 I-0.252 J-0.0999 -G3 X6.7554 Y0.8767 I-0.2249 J-0.1141 -G3 X6.7417 Y0.8959 I-0.1909 J-0.1218 -G3 X6.726 Y0.9135 I-0.1602 J-0.1276 -G3 X6.7088 Y0.9287 I-0.1379 J-0.1385 -G3 X6.6898 Y0.9418 I-0.1212 J-0.1544 -G3 X6.6689 Y0.9531 I-0.1088 J-0.1784 -G3 X6.6468 Y0.9618 I-0.085 J-0.1835 -G3 X6.6229 Y0.9681 I-0.0682 J-0.2081 -G3 X6.5984 Y0.9718 I-0.0472 J-0.2288 -G3 X6.5715 Y0.9731 I-0.0269 J-0.2747 -G3 X6.5441 Y0.9718 I0 J-0.2778 -G3 X6.5194 Y0.968 I0.0226 J-0.2269 -G3 X6.4954 Y0.9614 I0.0436 J-0.206 -G3 X6.4736 Y0.9524 I0.0608 J-0.1793 -G3 X6.4529 Y0.941 I0.0938 J-0.1933 -G3 X6.4342 Y0.9276 I0.1085 J-0.1725 -G3 X6.417 Y0.9123 I0.1271 J-0.159 -G3 X6.4013 Y0.8947 I0.1514 J-0.1507 -G3 X6.3876 Y0.8755 I0.1766 J-0.1407 -G3 X6.3753 Y0.8538 I0.2121 J-0.1354 -G3 X6.3651 Y0.8311 I0.2413 J-0.1223 -G3 X6.3561 Y0.8055 I0.2984 J-0.1182 -G3 X6.3494 Y0.7792 I0.3216 J-0.0968 -G3 X6.3444 Y0.7507 I0.3729 J-0.0801 -G3 X6.3415 Y0.7219 I0.4066 J-0.0555 -G3 X6.3404 Y0.6905 I0.4804 J-0.0313 -G0 Z0.125 -G0 X7.0049 Y0.6905 -G1 Z-0.01 F10 -G2 X7.0027 Y0.6348 I-0.7056 J0 F40 -G2 X6.9965 Y0.5855 I-0.5592 J0.0443 -G2 X6.9859 Y0.537 I-0.4973 J0.0842 -G2 X6.9716 Y0.494 I-0.4061 J0.1107 -G2 X6.953 Y0.4526 I-0.4475 J0.1756 -G2 X6.9322 Y0.4161 I-0.3674 J0.1859 -G2 X6.9077 Y0.3821 I-0.3264 J0.2094 -G2 X6.8805 Y0.3521 I-0.2803 J0.2261 -G2 X6.8503 Y0.3252 I-0.2579 J0.2609 -G2 X6.8173 Y0.302 I-0.2269 J0.2867 -G2 X6.7819 Y0.2824 I-0.1983 J0.3171 -G2 X6.743 Y0.266 I-0.1783 J0.3683 -G2 X6.7026 Y0.2534 I-0.1576 J0.4351 -G2 X6.6602 Y0.2443 I-0.1231 J0.4701 -G2 X6.6172 Y0.239 I-0.0841 J0.4988 -G2 X6.5715 Y0.2371 I-0.0457 J0.5609 -G2 X6.5271 Y0.239 I0 J0.5346 -G2 X6.4849 Y0.2443 I0.0407 J0.4884 -G2 X6.4433 Y0.2534 I0.0806 J0.4691 -G2 X6.4032 Y0.266 I0.1189 J0.4479 -G2 X6.3646 Y0.2824 I0.1418 J0.3881 -G2 X6.3291 Y0.302 I0.1683 J0.3468 -G2 X6.2959 Y0.3252 I0.2011 J0.3229 -G2 X6.2651 Y0.3521 I0.2387 J0.3054 -G2 X6.2374 Y0.3821 I0.2524 J0.2608 -G2 X6.2123 Y0.4161 I0.2987 J0.246 -G2 X6.191 Y0.4526 I0.3422 J0.2241 -G2 X6.1721 Y0.494 I0.4215 J0.2176 -G2 X6.1576 Y0.537 I0.3858 J0.1544 -G2 X6.1467 Y0.5855 I0.4777 J0.1328 -G2 X6.1405 Y0.6348 I0.5427 J0.0937 -G2 X6.1382 Y0.6905 I0.6897 J0.0557 -G2 X6.1405 Y0.7462 I0.6678 J0 -G2 X6.147 Y0.7956 I0.5306 J-0.0444 -G2 X6.1583 Y0.844 I0.473 J-0.0846 -G2 X6.1734 Y0.8871 I0.3899 J-0.1124 -G2 X6.1929 Y0.9285 I0.4519 J-0.1874 -G2 X6.2147 Y0.9652 I0.376 J-0.199 -G2 X6.2401 Y0.9993 I0.3361 J-0.2236 -G2 X6.2682 Y1.0297 I0.2923 J-0.2425 -G2 X6.2994 Y1.0569 I0.2779 J-0.287 -G2 X6.3326 Y1.0802 I0.2379 J-0.303 -G2 X6.3681 Y1.1 I0.2055 J-0.3276 -G2 X6.4064 Y1.1163 I0.1789 J-0.3656 -G2 X6.4461 Y1.129 I0.1604 J-0.4356 -G2 X6.4869 Y1.138 I0.1212 J-0.4502 -G2 X6.5284 Y1.1434 I0.0819 J-0.4678 -G2 X6.5715 Y1.1452 I0.0432 J-0.5057 -G2 X6.616 Y1.1434 I0 J-0.535 -G2 X6.6582 Y1.138 I-0.0407 J-0.4886 -G2 X6.6998 Y1.1289 I-0.0806 J-0.4692 -G2 X6.7399 Y1.1163 I-0.1189 J-0.4478 -G2 X6.7785 Y1.0999 I-0.1394 J-0.3816 -G2 X6.814 Y1.0802 I-0.1667 J-0.3421 -G2 X6.8471 Y1.0568 I-0.2001 J-0.3191 -G2 X6.878 Y1.0297 I-0.2393 J-0.3033 -G2 X6.9058 Y0.9993 I-0.2595 J-0.2651 -G2 X6.9308 Y0.9652 I-0.3049 J-0.2492 -G2 X6.9521 Y0.9285 I-0.3477 J-0.2267 -G2 X6.971 Y0.8871 I-0.4252 J-0.219 -G2 X6.9855 Y0.844 I-0.3859 J-0.1543 -G2 X6.9964 Y0.7956 I-0.4781 J-0.1328 -G2 X7.0026 Y0.7462 I-0.5432 J-0.0937 -G2 X7.0049 Y0.6905 I-0.6906 J-0.0557 -G0 Z0.125 -G0 X7.9912 Y0.8965 -G1 Z-0.01 F10 -G2 X7.99 Y0.8728 I-0.237 J0 F40 -G2 X7.9865 Y0.8497 I-0.2267 J0.0228 -G2 X7.9807 Y0.8272 I-0.2234 J0.0459 -G2 X7.9724 Y0.8048 I-0.2271 J0.0715 -G2 X7.9623 Y0.7832 I-0.3646 J0.1563 -G2 X7.9507 Y0.7617 I-0.3716 J0.1865 -G2 X7.9379 Y0.7409 I-0.371 J0.2144 -G2 X7.9234 Y0.7201 I-0.3849 J0.2528 -G2 X7.9079 Y0.7 I-0.5278 J0.3898 -G2 X7.8914 Y0.68 I-0.5353 J0.4282 -G2 X7.8741 Y0.6607 I-0.5316 J0.4593 -G2 X7.8556 Y0.6416 I-0.5427 J0.505 -G1 X7.7815 Y0.57 -G3 X7.7721 Y0.5611 I0.8861 J-0.9498 -G3 X7.7618 Y0.5513 I1.0881 J-1.1433 -G3 X7.7517 Y0.5413 I1.2053 J-1.2439 -G3 X7.7406 Y0.5304 I1.4521 J-1.4741 -G1 X7.6986 Y0.4858 -G3 X7.6886 Y0.4744 I1.1214 J-0.996 -G3 X7.6796 Y0.464 I0.9432 J-0.8208 -G3 X7.6707 Y0.4534 I0.8658 J-0.7369 -G3 X7.6628 Y0.4437 I0.7169 J-0.5953 -G3 X7.6552 Y0.4338 I0.1702 J-0.1375 -G3 X7.65 Y0.426 I0.0998 J-0.0716 -G3 X7.6456 Y0.4178 I0.0757 J-0.046 -G3 X7.6433 Y0.4117 I0.0391 J-0.0185 -G1 X8.0176 Y0.4117 -G1 X8.0176 Y0.2547 -G1 X7.4373 Y0.2547 -G2 X7.4363 Y0.2616 I0.1145 J0.0207 -G2 X7.4354 Y0.2704 I0.1829 J0.0218 -G2 X7.435 Y0.2792 I0.2268 J0.0161 -G2 X7.4348 Y0.2899 I0.3344 J0.0107 -G1 X7.4348 Y0.2998 -G1 X7.4348 Y0.3081 -G1 X7.4348 Y0.3148 -G1 X7.4348 Y0.32 -G2 X7.4361 Y0.3501 I0.3578 J0 -G2 X7.4397 Y0.3778 I0.3087 J-0.026 -G2 X7.4458 Y0.4051 I0.2878 J-0.0507 -G2 X7.4543 Y0.4306 I0.2595 J-0.0719 -G2 X7.4648 Y0.4553 I0.3938 J-0.1527 -G2 X7.4767 Y0.4791 I0.3744 J-0.1733 -G2 X7.4902 Y0.502 I0.3612 J-0.1964 -G2 X7.5052 Y0.5241 I0.3512 J-0.2214 -G2 X7.5213 Y0.5454 I0.4675 J-0.3386 -G2 X7.5386 Y0.566 I0.457 J-0.3645 -G2 X7.5568 Y0.5859 I0.4444 J-0.3892 -G2 X7.5761 Y0.6051 I0.4388 J-0.4211 -G1 X7.6546 Y0.6805 -G3 X7.6697 Y0.6949 I-6.5538 J6.8409 -G3 X7.6838 Y0.7086 I-5.8415 J6.0705 -G3 X7.6979 Y0.7223 I-5.5113 J5.7006 -G3 X7.7111 Y0.7351 I-4.8745 J5.0171 -G3 X7.7242 Y0.7482 I-0.5266 J0.5392 -G3 X7.7359 Y0.7606 I-0.4648 J0.4531 -G3 X7.7474 Y0.7733 I-0.4416 J0.4084 -G3 X7.7576 Y0.7854 I-0.388 J0.3389 -G3 X7.7673 Y0.7979 I-0.2179 J0.1789 -G3 X7.7755 Y0.8099 I-0.1921 J0.1404 -G3 X7.7829 Y0.8223 I-0.1846 J0.1184 -G3 X7.789 Y0.8343 I-0.1653 J0.0911 -G3 X7.794 Y0.8468 I-0.1205 J0.0556 -G3 X7.7975 Y0.859 I-0.1118 J0.0384 -G3 X7.7996 Y0.8715 I-0.111 J0.0253 -G3 X7.8003 Y0.884 I-0.1104 J0.0125 -G3 X7.798 Y0.9112 I-0.1655 J0 -G3 X7.7924 Y0.9311 I-0.0937 J-0.0156 -G3 X7.7824 Y0.9488 I-0.0702 J-0.0283 -G3 X7.7689 Y0.9618 I-0.0509 J-0.0389 -G3 X7.7525 Y0.9716 I-0.064 J-0.0889 -G3 X7.7337 Y0.9788 I-0.0523 J-0.1085 -G3 X7.714 Y0.9829 I-0.0372 J-0.1282 -G3 X7.691 Y0.9844 I-0.023 J-0.1742 -G3 X7.6741 Y0.9838 I0 J-0.2082 -G3 X7.6582 Y0.9818 I0.0152 J-0.1867 -G3 X7.6426 Y0.9784 I0.0299 J-0.1776 -G3 X7.6276 Y0.9738 I0.0434 J-0.166 -G3 X7.613 Y0.9681 I0.124 J-0.3427 -G3 X7.5994 Y0.9621 I0.1248 J-0.3035 -G3 X7.586 Y0.9556 I0.1317 J-0.2831 -G3 X7.5736 Y0.9486 I0.1322 J-0.2521 -G3 X7.5615 Y0.9412 I0.2233 J-0.3784 -G3 X7.5508 Y0.9342 I0.1896 J-0.2988 -G3 X7.5405 Y0.9268 I0.179 J-0.2609 -G3 X7.5315 Y0.9198 I0.1505 J-0.2014 -G3 X7.5228 Y0.9125 I0.4664 J-0.5685 -G3 X7.5161 Y0.9067 I0.2834 J-0.3348 -G3 X7.5096 Y0.9008 I0.2157 J-0.2447 -G3 X7.5052 Y0.8965 I0.1113 J-0.1196 -G1 X7.4122 Y1.0271 -G2 X7.4408 Y1.0516 I0.3033 J-0.3254 -G2 X7.472 Y1.0741 I0.2859 J-0.3642 -G2 X7.505 Y1.0939 I0.2634 J-0.4 -G2 X7.541 Y1.1119 I0.2525 J-0.4598 -G2 X7.5784 Y1.1265 I0.1528 J-0.3372 -G2 X7.6171 Y1.1369 I0.115 J-0.3507 -G2 X7.6567 Y1.1431 I0.078 J-0.3692 -G2 X7.6986 Y1.1452 I0.0419 J-0.4097 -G2 X7.7368 Y1.1441 I0 J-0.6209 -G2 X7.7698 Y1.1408 I-0.0288 J-0.4669 -G2 X7.8025 Y1.1351 I-0.0537 J-0.4022 -G2 X7.8304 Y1.1276 I-0.0656 J-0.3011 -G2 X7.8576 Y1.1176 I-0.0975 J-0.3061 -G2 X7.8808 Y1.1064 I-0.0996 J-0.2366 -G2 X7.9028 Y1.0929 I-0.1113 J-0.2042 -G2 X7.9215 Y1.078 I-0.1143 J-0.1635 -G2 X7.9383 Y1.0611 I-0.1312 J-0.1467 -G2 X7.9526 Y1.0425 I-0.1419 J-0.1243 -G2 X7.9645 Y1.0224 I-0.1576 J-0.1068 -G2 X7.9743 Y1.0002 I-0.1832 J-0.0937 -G2 X7.9816 Y0.9769 I-0.2296 J-0.085 -G2 X7.987 Y0.9513 I-0.2735 J-0.0712 -G2 X7.9901 Y0.9253 I-0.3042 J-0.0498 -G2 X7.9912 Y0.8965 I-0.3724 J-0.0288 -G0 Z0.125 -(remove M5 and M30) diff --git a/test/gcode/braid_cut2d.nc b/test/gcode/braid_cut2d.nc deleted file mode 100644 index 1e8deda4d..000000000 --- a/test/gcode/braid_cut2d.nc +++ /dev/null @@ -1,2517 +0,0 @@ -T1M6 -G17G21 -G0Z20.000 -G0X0.000Y0.000S8000M3 -G0X0.000Y-33.519Z6.000 -G1Z-1.000F7000.0 -G1X0.327Y-33.521 -X0.654Y-33.526 -X0.980Y-33.534 -X1.304Y-33.546 -X1.626Y-33.562 -X1.946Y-33.580 -X2.262Y-33.602 -X2.574Y-33.628 -X2.882Y-33.656 -X3.185Y-33.688 -X3.483Y-33.724 -X3.775Y-33.762 -X4.060Y-33.805 -X4.339Y-33.850 -X4.610Y-33.898 -X4.874Y-33.950 -X5.130Y-34.005 -X5.376Y-34.064 -X5.614Y-34.125 -X5.842Y-34.190 -X6.060Y-34.257 -X6.268Y-34.328 -X6.466Y-34.402 -X6.652Y-34.479 -X6.827Y-34.559 -X6.990Y-34.642 -X7.141Y-34.728 -X7.280Y-34.817 -X7.407Y-34.909 -X7.521Y-35.003 -X7.621Y-35.101 -X7.709Y-35.201 -X7.783Y-35.304 -X7.843Y-35.410 -X7.890Y-35.518 -X7.923Y-35.629 -X7.942Y-35.743 -X7.946Y-35.859 -X7.937Y-35.977 -X7.914Y-36.098 -X7.876Y-36.221 -X7.824Y-36.347 -X7.758Y-36.475 -X7.677Y-36.605 -X7.583Y-36.738 -X7.474Y-36.872 -X7.352Y-37.009 -X7.216Y-37.148 -X7.066Y-37.289 -X6.903Y-37.431 -X6.536Y-37.722 -X6.333Y-37.870 -X6.118Y-38.020 -X5.650Y-38.324 -X5.399Y-38.479 -X5.135Y-38.635 -X4.576Y-38.951 -X3.334Y-39.598 -X2.971Y-39.776 -X2.599Y-39.955 -X1.828Y-40.317 -X0.193Y-41.050 -X-3.302Y-42.537 -X-3.747Y-42.723 -X-4.191Y-42.908 -X-5.074Y-43.278 -X-6.803Y-44.012 -X-9.961Y-45.432 -X-10.315Y-45.603 -X-10.659Y-45.773 -X-11.312Y-46.107 -X-11.620Y-46.272 -X-11.915Y-46.434 -X-12.466Y-46.753 -X-12.720Y-46.909 -X-12.960Y-47.063 -X-13.186Y-47.214 -X-13.396Y-47.364 -X-13.591Y-47.510 -X-13.770Y-47.654 -X-13.933Y-47.796 -X-14.080Y-47.935 -X-14.211Y-48.071 -X-14.326Y-48.204 -X-14.424Y-48.334 -X-14.505Y-48.462 -X-14.570Y-48.586 -X-14.618Y-48.707 -X-14.649Y-48.825 -X-14.663Y-48.940 -X-14.661Y-49.052 -X-14.642Y-49.160 -X-14.607Y-49.265 -X-14.556Y-49.366 -X-14.488Y-49.464 -X-14.404Y-49.559 -X-14.305Y-49.649 -X-14.190Y-49.737 -X-14.068Y-49.815 -X-13.934Y-49.889 -X-13.787Y-49.961 -X-13.628Y-50.029 -X-13.456Y-50.094 -X-13.273Y-50.155 -X-13.078Y-50.213 -X-12.872Y-50.267 -X-12.655Y-50.318 -X-12.428Y-50.366 -X-12.190Y-50.410 -X-11.944Y-50.450 -X-11.688Y-50.487 -X-11.423Y-50.520 -X-11.150Y-50.549 -X-10.870Y-50.575 -X-10.582Y-50.597 -X-10.287Y-50.616 -X-9.987Y-50.630 -X-9.680Y-50.641 -X-9.368Y-50.649 -X-9.052Y-50.652 -X-8.732Y-50.652 -X-8.408Y-50.648 -X-8.081Y-50.640 -X-7.751Y-50.628 -X-7.420Y-50.613 -X-7.087Y-50.594 -X-6.754Y-50.571 -X-6.420Y-50.544 -X-6.087Y-50.513 -X-5.754Y-50.479 -X-5.424Y-50.441 -X-5.095Y-50.399 -X-4.769Y-50.353 -X-4.446Y-50.304 -X-4.127Y-50.250 -X-3.812Y-50.193 -X-3.198Y-50.068 -X-2.899Y-50.000 -X-2.606Y-49.928 -X-2.321Y-49.852 -X-2.043Y-49.773 -X-1.773Y-49.690 -X-1.511Y-49.603 -X-1.015Y-49.419 -X-0.781Y-49.322 -X-0.557Y-49.221 -X-0.343Y-49.116 -X-0.141Y-49.009 -X0.050Y-48.897 -X0.230Y-48.783 -X0.398Y-48.664 -X0.553Y-48.543 -X0.696Y-48.418 -X0.826Y-48.290 -X0.943Y-48.159 -X1.046Y-48.024 -X1.136Y-47.887 -X1.213Y-47.746 -X1.275Y-47.602 -X1.323Y-47.455 -X1.357Y-47.308 -X1.377Y-47.159 -X1.383Y-47.006 -X1.375Y-46.851 -X1.353Y-46.693 -X1.317Y-46.532 -X1.267Y-46.369 -X1.203Y-46.203 -X1.126Y-46.035 -X1.034Y-45.864 -X0.929Y-45.691 -X0.810Y-45.515 -X0.677Y-45.338 -X0.531Y-45.157 -X0.199Y-44.791 -X0.014Y-44.604 -X-0.184Y-44.416 -X-0.617Y-44.033 -X-1.624Y-43.245 -X-1.903Y-43.044 -X-2.193Y-42.841 -X-2.801Y-42.432 -X-4.125Y-41.596 -X-4.475Y-41.384 -X-4.833Y-41.171 -X-5.567Y-40.743 -X-7.098Y-39.876 -X-10.296Y-38.118 -X-10.698Y-37.897 -X-11.099Y-37.676 -X-11.894Y-37.235 -X-13.448Y-36.356 -X-13.825Y-36.137 -X-14.197Y-35.919 -X-14.923Y-35.485 -X-16.288Y-34.625 -X-16.636Y-34.395 -X-16.973Y-34.165 -X-17.613Y-33.711 -X-17.915Y-33.486 -X-18.204Y-33.262 -X-18.743Y-32.821 -X-18.992Y-32.602 -X-19.227Y-32.386 -X-19.447Y-32.171 -X-19.652Y-31.959 -X-19.843Y-31.749 -X-20.017Y-31.540 -X-20.176Y-31.335 -X-20.320Y-31.131 -X-20.447Y-30.930 -X-20.558Y-30.731 -X-20.653Y-30.535 -X-20.731Y-30.341 -X-20.793Y-30.150 -X-20.838Y-29.961 -X-20.867Y-29.776 -X-20.879Y-29.593 -X-20.875Y-29.413 -X-20.854Y-29.236 -X-20.817Y-29.062 -X-20.764Y-28.891 -X-20.695Y-28.723 -X-20.610Y-28.559 -X-20.510Y-28.397 -X-20.394Y-28.239 -X-20.263Y-28.084 -X-20.117Y-27.932 -X-19.957Y-27.784 -X-19.782Y-27.639 -X-19.594Y-27.498 -X-19.392Y-27.360 -X-19.177Y-27.226 -X-18.950Y-27.095 -X-18.710Y-26.968 -X-18.459Y-26.845 -X-18.197Y-26.725 -X-17.924Y-26.609 -X-17.641Y-26.497 -X-17.349Y-26.389 -X-16.737Y-26.183 -X-16.419Y-26.086 -X-16.094Y-25.993 -X-15.763Y-25.904 -X-15.426Y-25.818 -X-15.083Y-25.737 -X-14.736Y-25.660 -X-14.030Y-25.516 -X-13.672Y-25.451 -X-13.313Y-25.389 -X-12.953Y-25.332 -X-12.591Y-25.278 -X-12.230Y-25.228 -X-11.870Y-25.182 -X-11.511Y-25.140 -X-11.155Y-25.103 -X-10.824Y-25.071 -X-10.497Y-25.043 -X-10.173Y-25.018 -X-9.853Y-24.996 -X-9.538Y-24.978 -X-9.228Y-24.964 -X-8.924Y-24.952 -X-8.625Y-24.944 -X-8.334Y-24.940 -X-8.049Y-24.939 -X-7.772Y-24.941 -X-7.504Y-24.946 -X-7.243Y-24.955 -X-6.992Y-24.967 -X-6.750Y-24.982 -X-6.518Y-25.000 -X-6.295Y-25.022 -X-6.084Y-25.047 -X-5.883Y-25.075 -X-5.694Y-25.106 -X-5.517Y-25.140 -X-5.351Y-25.177 -X-5.197Y-25.217 -X-5.057Y-25.260 -X-4.928Y-25.306 -X-4.813Y-25.355 -X-4.711Y-25.407 -X-4.623Y-25.461 -X-4.548Y-25.518 -X-4.487Y-25.578 -X-4.439Y-25.641 -X-4.406Y-25.707 -X-4.387Y-25.775 -X-4.382Y-25.845 -X-4.392Y-25.918 -X-4.416Y-25.994 -X-4.454Y-26.072 -X-4.506Y-26.152 -X-4.572Y-26.235 -X-4.653Y-26.320 -X-4.748Y-26.407 -X-4.857Y-26.496 -X-4.980Y-26.588 -X-5.117Y-26.681 -X-5.267Y-26.777 -X-5.431Y-26.874 -X-5.798Y-27.074 -X-6.001Y-27.177 -X-6.216Y-27.282 -X-6.683Y-27.496 -X-7.755Y-27.942 -X-8.049Y-28.057 -X-8.353Y-28.173 -X-8.990Y-28.409 -X-10.362Y-28.891 -X-10.753Y-29.024 -X-11.151Y-29.158 -X-11.968Y-29.428 -X-13.658Y-29.973 -X-17.113Y-31.067 -X-17.538Y-31.202 -X-17.959Y-31.337 -X-18.788Y-31.604 -X-20.370Y-32.127 -X-20.746Y-32.255 -X-21.113Y-32.382 -X-21.817Y-32.631 -X-23.093Y-33.111 -X-23.381Y-33.226 -X-23.656Y-33.339 -X-24.164Y-33.560 -X-24.397Y-33.667 -X-24.615Y-33.772 -X-25.005Y-33.974 -X-25.177Y-34.072 -X-25.332Y-34.167 -X-25.472Y-34.259 -X-25.595Y-34.349 -X-25.701Y-34.436 -X-25.791Y-34.520 -X-25.864Y-34.601 -X-25.920Y-34.679 -X-25.960Y-34.754 -X-25.982Y-34.826 -X-25.987Y-34.895 -X-25.976Y-34.961 -X-25.948Y-35.023 -X-25.903Y-35.082 -X-25.841Y-35.138 -X-25.763Y-35.190 -X-25.669Y-35.239 -X-25.559Y-35.284 -X-25.433Y-35.325 -X-25.291Y-35.363 -X-25.134Y-35.397 -X-24.963Y-35.428 -X-24.777Y-35.455 -X-24.577Y-35.477 -X-24.367Y-35.496 -X-24.144Y-35.511 -X-23.909Y-35.522 -X-23.661Y-35.529 -X-23.403Y-35.532 -X-23.133Y-35.532 -X-22.853Y-35.527 -X-22.563Y-35.519 -X-22.263Y-35.506 -X-21.955Y-35.490 -X-21.638Y-35.470 -X-21.313Y-35.445 -X-20.981Y-35.416 -X-20.643Y-35.384 -X-20.299Y-35.347 -X-19.949Y-35.306 -X-19.595Y-35.261 -X-19.237Y-35.212 -X-18.875Y-35.158 -X-18.511Y-35.101 -X-18.145Y-35.039 -X-17.777Y-34.973 -X-17.041Y-34.829 -X-16.673Y-34.751 -X-16.306Y-34.668 -X-15.580Y-34.491 -X-15.222Y-34.396 -X-14.867Y-34.297 -X-14.172Y-34.086 -X-13.833Y-33.975 -X-13.501Y-33.859 -X-13.176Y-33.740 -X-12.858Y-33.616 -X-12.548Y-33.488 -X-12.248Y-33.357 -X-11.675Y-33.082 -X-11.404Y-32.938 -X-11.144Y-32.791 -X-10.896Y-32.639 -X-10.659Y-32.484 -X-10.435Y-32.326 -X-10.223Y-32.163 -X-10.025Y-31.997 -X-9.840Y-31.827 -X-9.669Y-31.653 -X-9.512Y-31.476 -X-9.370Y-31.295 -X-9.242Y-31.111 -X-9.130Y-30.923 -X-9.033Y-30.732 -X-8.951Y-30.538 -X-8.885Y-30.340 -X-8.835Y-30.139 -X-8.801Y-29.934 -X-8.782Y-29.727 -X-8.780Y-29.517 -X-8.794Y-29.303 -X-8.825Y-29.087 -X-8.871Y-28.867 -X-8.934Y-28.645 -X-9.006Y-28.435 -X-9.093Y-28.223 -X-9.194Y-28.008 -X-9.308Y-27.792 -X-9.435Y-27.573 -X-9.577Y-27.352 -X-9.898Y-26.903 -X-10.078Y-26.676 -X-10.271Y-26.446 -X-10.693Y-25.982 -X-10.922Y-25.748 -X-11.162Y-25.511 -X-11.675Y-25.034 -X-11.948Y-24.793 -X-12.230Y-24.550 -X-12.824Y-24.061 -X-14.114Y-23.068 -X-17.000Y-21.038 -X-17.380Y-20.782 -X-17.762Y-20.525 -X-18.532Y-20.010 -X-20.077Y-18.979 -X-20.462Y-18.721 -X-20.845Y-18.464 -X-21.602Y-17.949 -X-23.072Y-16.925 -X-23.427Y-16.671 -X-23.776Y-16.417 -X-24.454Y-15.911 -X-25.717Y-14.911 -X-26.011Y-14.664 -X-26.295Y-14.418 -X-26.833Y-13.930 -X-27.086Y-13.688 -X-27.328Y-13.447 -X-27.777Y-12.971 -X-28.000Y-12.715 -X-28.209Y-12.461 -X-28.404Y-12.210 -X-28.583Y-11.961 -X-28.746Y-11.713 -X-28.894Y-11.469 -X-29.026Y-11.226 -X-29.142Y-10.986 -X-29.242Y-10.749 -X-29.325Y-10.514 -X-29.391Y-10.281 -X-29.441Y-10.052 -X-29.475Y-9.825 -X-29.491Y-9.601 -X-29.491Y-9.380 -X-29.475Y-9.162 -X-29.441Y-8.947 -X-29.391Y-8.735 -X-29.325Y-8.526 -X-29.242Y-8.320 -X-29.144Y-8.118 -X-29.029Y-7.919 -X-28.899Y-7.723 -X-28.753Y-7.531 -X-28.592Y-7.342 -X-28.416Y-7.156 -X-28.226Y-6.974 -X-28.022Y-6.796 -X-27.804Y-6.621 -X-27.572Y-6.450 -X-27.071Y-6.119 -X-26.802Y-5.959 -X-26.522Y-5.803 -X-25.929Y-5.502 -X-25.617Y-5.358 -X-25.296Y-5.217 -X-24.628Y-4.948 -X-24.283Y-4.819 -X-23.930Y-4.694 -X-23.207Y-4.457 -X-22.838Y-4.344 -X-22.465Y-4.236 -X-21.707Y-4.031 -X-21.325Y-3.935 -X-20.941Y-3.842 -X-20.170Y-3.670 -X-19.786Y-3.590 -X-19.402Y-3.515 -X-18.642Y-3.375 -X-18.266Y-3.312 -X-17.894Y-3.252 -X-17.527Y-3.197 -X-17.164Y-3.145 -X-16.808Y-3.098 -X-16.459Y-3.055 -X-16.116Y-3.015 -X-15.781Y-2.980 -X-15.477Y-2.951 -X-15.179Y-2.925 -X-14.891Y-2.902 -X-14.611Y-2.883 -X-14.340Y-2.867 -X-14.078Y-2.855 -X-13.827Y-2.845 -X-13.586Y-2.839 -X-13.355Y-2.837 -X-13.136Y-2.837 -X-12.929Y-2.841 -X-12.733Y-2.848 -X-12.549Y-2.858 -X-12.378Y-2.871 -X-12.220Y-2.888 -X-12.074Y-2.907 -X-11.942Y-2.929 -X-11.823Y-2.955 -X-11.717Y-2.983 -X-11.626Y-3.014 -X-11.548Y-3.048 -X-11.484Y-3.084 -X-11.435Y-3.124 -X-11.400Y-3.166 -X-11.379Y-3.210 -X-11.372Y-3.258 -X-11.380Y-3.308 -X-11.403Y-3.360 -X-11.440Y-3.415 -X-11.491Y-3.472 -X-11.556Y-3.532 -X-11.636Y-3.594 -X-11.729Y-3.658 -X-11.837Y-3.724 -X-11.959Y-3.793 -X-12.094Y-3.863 -X-12.242Y-3.936 -X-12.404Y-4.010 -X-12.767Y-4.165 -X-12.967Y-4.245 -X-13.179Y-4.327 -X-13.639Y-4.495 -X-14.691Y-4.850 -X-14.979Y-4.942 -X-15.277Y-5.036 -X-15.897Y-5.225 -X-17.230Y-5.617 -X-20.146Y-6.431 -X-20.516Y-6.532 -X-20.887Y-6.634 -X-21.630Y-6.837 -X-23.106Y-7.241 -X-25.895Y-8.028 -X-26.218Y-8.123 -X-26.535Y-8.218 -X-27.145Y-8.403 -X-28.260Y-8.760 -X-28.514Y-8.846 -X-28.759Y-8.930 -X-29.214Y-9.095 -X-29.425Y-9.175 -X-29.624Y-9.253 -X-29.986Y-9.404 -X-30.149Y-9.477 -X-30.298Y-9.548 -X-30.435Y-9.617 -X-30.559Y-9.684 -X-30.669Y-9.749 -X-30.766Y-9.812 -X-30.849Y-9.872 -X-30.918Y-9.931 -X-30.974Y-9.987 -X-31.016Y-10.041 -X-31.043Y-10.092 -X-31.057Y-10.141 -X-31.057Y-10.188 -X-31.043Y-10.232 -X-31.015Y-10.273 -X-30.972Y-10.312 -X-30.916Y-10.349 -X-30.847Y-10.382 -X-30.763Y-10.413 -X-30.666Y-10.441 -X-30.556Y-10.466 -X-30.432Y-10.489 -X-30.295Y-10.508 -X-30.146Y-10.525 -X-29.984Y-10.539 -X-29.809Y-10.549 -X-29.622Y-10.557 -X-29.424Y-10.562 -X-29.214Y-10.563 -X-28.992Y-10.562 -X-28.760Y-10.557 -X-28.517Y-10.549 -X-28.242Y-10.537 -X-27.955Y-10.521 -X-27.657Y-10.501 -X-27.349Y-10.477 -X-27.031Y-10.450 -X-26.703Y-10.418 -X-26.366Y-10.383 -X-26.021Y-10.343 -X-25.668Y-10.300 -X-25.308Y-10.253 -X-24.568Y-10.146 -X-24.191Y-10.086 -X-23.808Y-10.023 -X-23.032Y-9.883 -X-22.640Y-9.807 -X-22.245Y-9.728 -X-21.453Y-9.556 -X-21.057Y-9.463 -X-20.662Y-9.367 -X-19.876Y-9.162 -X-19.487Y-9.054 -X-19.101Y-8.941 -X-18.343Y-8.704 -X-17.972Y-8.579 -X-17.606Y-8.450 -X-16.896Y-8.180 -X-16.552Y-8.040 -X-16.217Y-7.895 -X-15.574Y-7.594 -X-15.268Y-7.438 -X-14.972Y-7.277 -X-14.414Y-6.946 -X-14.153Y-6.774 -X-13.905Y-6.599 -X-13.669Y-6.420 -X-13.447Y-6.237 -X-13.239Y-6.051 -X-13.044Y-5.862 -X-12.864Y-5.669 -X-12.699Y-5.472 -X-12.549Y-5.272 -X-12.414Y-5.069 -X-12.294Y-4.862 -X-12.190Y-4.652 -X-12.102Y-4.439 -X-12.030Y-4.223 -X-11.975Y-4.003 -X-11.935Y-3.781 -X-11.911Y-3.555 -X-11.904Y-3.327 -X-11.914Y-3.096 -X-11.939Y-2.862 -X-11.981Y-2.625 -X-12.038Y-2.386 -X-12.112Y-2.144 -X-12.202Y-1.899 -X-12.300Y-1.669 -X-12.412Y-1.436 -X-12.537Y-1.201 -X-12.675Y-0.965 -X-12.826Y-0.726 -X-12.990Y-0.486 -X-13.355Y0.001 -X-13.555Y0.246 -X-13.768Y0.494 -X-14.226Y0.993 -X-15.266Y2.009 -X-15.550Y2.266 -X-15.842Y2.524 -X-16.451Y3.043 -X-17.752Y4.093 -X-20.572Y6.219 -X-20.935Y6.486 -X-21.298Y6.753 -X-22.024Y7.287 -X-23.456Y8.353 -X-23.807Y8.618 -X-24.154Y8.883 -X-24.835Y9.411 -X-26.125Y10.458 -X-26.431Y10.717 -X-26.728Y10.975 -X-27.297Y11.489 -X-27.568Y11.744 -X-27.830Y11.997 -X-28.322Y12.500 -X-28.552Y12.749 -X-28.771Y12.997 -X-28.978Y13.243 -X-29.174Y13.487 -X-29.357Y13.729 -X-29.528Y13.970 -X-29.686Y14.209 -X-29.831Y14.446 -X-29.974Y14.700 -X-30.101Y14.953 -X-30.212Y15.202 -X-30.307Y15.449 -X-30.385Y15.694 -X-30.447Y15.936 -X-30.492Y16.175 -X-30.521Y16.411 -X-30.532Y16.644 -X-30.527Y16.874 -X-30.505Y17.102 -X-30.466Y17.326 -X-30.411Y17.547 -X-30.338Y17.765 -X-30.249Y17.980 -X-30.144Y18.191 -X-30.022Y18.399 -X-29.884Y18.603 -X-29.730Y18.805 -X-29.561Y19.002 -X-29.376Y19.196 -X-29.176Y19.386 -X-28.962Y19.573 -X-28.733Y19.756 -X-28.490Y19.935 -X-28.233Y20.111 -X-27.964Y20.282 -X-27.681Y20.450 -X-27.386Y20.614 -X-27.080Y20.774 -X-26.434Y21.081 -X-26.096Y21.229 -X-25.748Y21.373 -X-25.025Y21.648 -X-24.652Y21.780 -X-24.272Y21.907 -X-23.493Y22.149 -X-23.095Y22.264 -X-22.693Y22.375 -X-21.877Y22.583 -X-21.466Y22.681 -X-21.053Y22.775 -X-20.223Y22.949 -X-19.809Y23.030 -X-19.396Y23.107 -X-18.575Y23.247 -X-18.169Y23.311 -X-17.767Y23.371 -X-16.977Y23.478 -X-16.591Y23.525 -X-16.211Y23.568 -X-15.838Y23.606 -X-15.473Y23.641 -X-15.116Y23.671 -X-14.769Y23.698 -X-14.430Y23.720 -X-14.102Y23.739 -X-13.791Y23.753 -X-13.490Y23.763 -X-13.200Y23.769 -X-12.922Y23.772 -X-12.657Y23.771 -X-12.404Y23.766 -X-12.164Y23.758 -X-11.937Y23.746 -X-11.724Y23.730 -X-11.525Y23.711 -X-11.340Y23.688 -X-11.171Y23.662 -X-11.016Y23.633 -X-10.876Y23.600 -X-10.752Y23.564 -X-10.643Y23.524 -X-10.549Y23.481 -X-10.472Y23.435 -X-10.411Y23.386 -X-10.365Y23.334 -X-10.336Y23.279 -X-10.323Y23.221 -X-10.326Y23.161 -X-10.344Y23.097 -X-10.379Y23.030 -X-10.430Y22.961 -X-10.497Y22.889 -X-10.579Y22.815 -X-10.676Y22.738 -X-10.789Y22.659 -X-10.917Y22.577 -X-11.060Y22.493 -X-11.217Y22.407 -X-11.389Y22.318 -X-11.773Y22.135 -X-11.985Y22.041 -X-12.210Y21.945 -X-12.697Y21.747 -X-12.958Y21.645 -X-13.230Y21.542 -X-13.806Y21.331 -X-15.066Y20.894 -X-15.401Y20.782 -X-15.742Y20.670 -X-16.442Y20.441 -X-17.896Y19.977 -X-20.868Y19.035 -X-21.208Y18.926 -X-21.545Y18.817 -X-22.208Y18.600 -X-23.472Y18.173 -X-23.772Y18.068 -X-24.066Y17.964 -X-24.629Y17.759 -X-25.650Y17.361 -X-25.881Y17.265 -X-26.101Y17.170 -X-26.509Y16.984 -X-26.696Y16.893 -X-26.871Y16.804 -X-27.184Y16.631 -X-27.322Y16.547 -X-27.447Y16.465 -X-27.559Y16.385 -X-27.658Y16.306 -X-27.743Y16.230 -X-27.815Y16.156 -X-27.873Y16.084 -X-27.917Y16.014 -X-27.947Y15.946 -X-27.963Y15.880 -X-27.965Y15.817 -X-27.953Y15.756 -X-27.927Y15.697 -X-27.887Y15.641 -X-27.832Y15.588 -X-27.764Y15.537 -X-27.681Y15.488 -X-27.585Y15.442 -X-27.475Y15.399 -X-27.351Y15.358 -X-27.214Y15.321 -X-27.063Y15.286 -X-26.899Y15.253 -X-26.723Y15.224 -X-26.533Y15.198 -X-26.332Y15.174 -X-26.118Y15.154 -X-25.892Y15.136 -X-25.654Y15.122 -X-25.405Y15.110 -X-25.145Y15.102 -X-24.875Y15.097 -X-24.594Y15.095 -X-24.304Y15.096 -X-24.004Y15.100 -X-23.694Y15.107 -X-23.377Y15.118 -X-23.051Y15.132 -X-22.717Y15.149 -X-22.376Y15.170 -X-21.998Y15.196 -X-21.613Y15.226 -X-21.221Y15.260 -X-20.822Y15.298 -X-20.418Y15.340 -X-20.010Y15.385 -X-19.180Y15.489 -X-18.761Y15.547 -X-18.339Y15.609 -X-17.492Y15.744 -X-17.067Y15.818 -X-16.644Y15.896 -X-15.800Y16.064 -X-15.382Y16.154 -X-14.967Y16.248 -X-14.150Y16.448 -X-13.749Y16.554 -X-13.354Y16.664 -X-12.583Y16.895 -X-12.209Y17.017 -X-11.844Y17.142 -X-11.140Y17.405 -X-10.803Y17.542 -X-10.477Y17.683 -X-9.858Y17.975 -X-9.566Y18.127 -X-9.287Y18.283 -X-9.021Y18.442 -X-8.768Y18.604 -X-8.529Y18.771 -X-8.305Y18.940 -X-8.094Y19.113 -X-7.899Y19.290 -X-7.718Y19.470 -X-7.553Y19.653 -X-7.403Y19.839 -X-7.270Y20.029 -X-7.152Y20.221 -X-7.050Y20.417 -X-6.965Y20.616 -X-6.895Y20.818 -X-6.843Y21.023 -X-6.806Y21.230 -X-6.787Y21.441 -X-6.783Y21.654 -X-6.796Y21.870 -X-6.826Y22.088 -X-6.872Y22.309 -X-6.933Y22.532 -X-7.011Y22.758 -X-7.104Y22.986 -X-7.213Y23.217 -X-7.338Y23.449 -X-7.477Y23.684 -X-7.631Y23.921 -X-7.982Y24.401 -X-8.165Y24.627 -X-8.360Y24.855 -X-8.782Y25.315 -X-9.751Y26.251 -X-10.017Y26.488 -X-10.291Y26.726 -X-10.863Y27.204 -X-12.089Y28.170 -X-12.409Y28.413 -X-12.734Y28.657 -X-13.395Y29.145 -X-14.749Y30.124 -X-17.457Y32.077 -X-17.785Y32.320 -X-18.108Y32.561 -X-18.740Y33.042 -X-19.930Y33.994 -X-20.210Y34.229 -X-20.481Y34.463 -X-20.997Y34.927 -X-21.240Y35.157 -X-21.474Y35.386 -X-21.910Y35.838 -X-22.111Y36.062 -X-22.302Y36.284 -X-22.480Y36.505 -X-22.646Y36.723 -X-22.800Y36.940 -X-22.941Y37.155 -X-23.069Y37.367 -X-23.183Y37.578 -X-23.285Y37.786 -X-23.373Y37.993 -X-23.447Y38.197 -X-23.507Y38.398 -X-23.553Y38.598 -X-23.585Y38.795 -X-23.602Y38.989 -X-23.606Y39.181 -X-23.593Y39.386 -X-23.563Y39.588 -X-23.516Y39.787 -X-23.452Y39.983 -X-23.372Y40.175 -X-23.274Y40.364 -X-23.160Y40.550 -X-23.029Y40.732 -X-22.882Y40.910 -X-22.719Y41.086 -X-22.539Y41.257 -X-22.344Y41.425 -X-22.134Y41.589 -X-21.908Y41.749 -X-21.668Y41.906 -X-21.413Y42.059 -X-21.144Y42.208 -X-20.862Y42.353 -X-20.566Y42.494 -X-20.257Y42.631 -X-19.937Y42.763 -X-19.604Y42.892 -X-18.906Y43.138 -X-18.542Y43.254 -X-18.168Y43.366 -X-17.785Y43.474 -X-17.394Y43.578 -X-16.995Y43.678 -X-16.589Y43.773 -X-15.758Y43.950 -X-15.335Y44.033 -X-14.908Y44.111 -X-14.476Y44.184 -X-14.042Y44.253 -X-13.606Y44.318 -X-13.168Y44.379 -X-12.289Y44.486 -X-11.851Y44.534 -X-11.414Y44.576 -X-10.978Y44.615 -X-10.546Y44.649 -X-10.116Y44.679 -X-9.691Y44.704 -X-9.271Y44.726 -X-8.856Y44.742 -X-8.447Y44.755 -X-8.044Y44.763 -X-7.650Y44.767 -X-7.263Y44.766 -X-6.885Y44.762 -X-6.516Y44.753 -X-6.157Y44.740 -X-5.808Y44.723 -X-5.471Y44.702 -X-5.145Y44.676 -X-4.830Y44.647 -X-4.529Y44.613 -X-4.240Y44.576 -X-3.965Y44.535 -X-3.703Y44.489 -X-3.456Y44.440 -X-3.227Y44.388 -X-3.013Y44.332 -X-2.813Y44.273 -X-2.629Y44.210 -X-2.459Y44.144 -X-2.305Y44.074 -X-2.167Y44.001 -X-2.044Y43.925 -X-1.938Y43.845 -X-1.847Y43.762 -X-1.773Y43.675 -X-1.715Y43.586 -X-1.673Y43.494 -X-1.647Y43.398 -X-1.638Y43.299 -X-1.645Y43.198 -X-1.667Y43.094 -X-1.706Y42.987 -X-1.761Y42.877 -X-1.832Y42.765 -X-1.918Y42.650 -X-2.019Y42.532 -X-2.135Y42.412 -X-2.267Y42.290 -X-2.412Y42.166 -X-2.572Y42.039 -X-2.934Y41.779 -X-3.134Y41.646 -X-3.347Y41.511 -X-3.810Y41.235 -X-4.059Y41.095 -X-4.319Y40.953 -X-4.869Y40.664 -X-6.076Y40.071 -X-8.785Y38.840 -X-9.139Y38.683 -X-9.494Y38.526 -X-10.205Y38.212 -X-11.612Y37.583 -X-14.215Y36.343 -X-14.490Y36.201 -X-14.756Y36.061 -X-15.263Y35.782 -X-15.503Y35.645 -X-15.734Y35.508 -X-16.165Y35.239 -X-16.365Y35.106 -X-16.553Y34.975 -X-16.730Y34.845 -X-16.895Y34.717 -X-17.049Y34.590 -X-17.190Y34.465 -X-17.318Y34.341 -X-17.434Y34.219 -X-17.537Y34.099 -X-17.626Y33.981 -X-17.702Y33.865 -X-17.764Y33.751 -X-17.813Y33.639 -X-17.847Y33.528 -X-17.868Y33.420 -X-17.875Y33.315 -X-17.867Y33.211 -X-17.845Y33.110 -X-17.809Y33.011 -X-17.759Y32.914 -X-17.695Y32.820 -X-17.616Y32.728 -X-17.523Y32.639 -X-17.417Y32.552 -X-17.296Y32.468 -X-17.162Y32.387 -X-17.014Y32.308 -X-16.852Y32.232 -X-16.677Y32.159 -X-16.489Y32.089 -X-16.288Y32.021 -X-16.075Y31.956 -X-15.849Y31.895 -X-15.611Y31.836 -X-15.361Y31.780 -X-15.099Y31.727 -X-14.827Y31.677 -X-14.543Y31.631 -X-14.250Y31.587 -X-13.946Y31.547 -X-13.632Y31.509 -X-13.309Y31.475 -X-12.977Y31.444 -X-12.637Y31.417 -X-12.289Y31.392 -X-11.933Y31.371 -X-11.570Y31.353 -X-11.201Y31.338 -X-10.825Y31.327 -X-10.444Y31.319 -X-10.058Y31.314 -X-9.667Y31.313 -X-9.273Y31.315 -X-8.874Y31.320 -X-8.473Y31.329 -X-8.069Y31.341 -X-7.630Y31.358 -X-7.188Y31.379 -X-6.746Y31.404 -X-6.303Y31.433 -X-5.861Y31.466 -X-5.421Y31.503 -X-4.982Y31.544 -X-4.546Y31.589 -X-4.113Y31.638 -X-3.684Y31.691 -X-3.260Y31.748 -X-2.841Y31.809 -X-2.428Y31.873 -X-2.021Y31.942 -X-1.231Y32.091 -X-0.848Y32.171 -X-0.475Y32.255 -X-0.110Y32.343 -X0.243Y32.434 -X0.587Y32.530 -X0.919Y32.629 -X1.547Y32.838 -X1.842Y32.948 -X2.124Y33.061 -X2.392Y33.178 -X2.647Y33.299 -X2.887Y33.423 -X3.112Y33.550 -X3.323Y33.681 -X3.518Y33.815 -X3.698Y33.952 -X3.862Y34.092 -X4.010Y34.236 -X4.142Y34.383 -X4.257Y34.533 -X4.356Y34.685 -X4.439Y34.841 -X4.505Y35.000 -X4.554Y35.161 -X4.586Y35.325 -X4.602Y35.492 -X4.602Y35.662 -X4.584Y35.834 -X4.551Y36.008 -X4.501Y36.185 -X4.435Y36.364 -X4.353Y36.546 -X4.255Y36.730 -X4.142Y36.916 -X4.014Y37.104 -X3.871Y37.294 -X3.713Y37.486 -X3.356Y37.876 -X3.157Y38.073 -X2.944Y38.272 -X2.483Y38.675 -X1.425Y39.496 -X1.155Y39.690 -X0.877Y39.885 -X0.300Y40.277 -X-0.925Y41.070 -X-3.540Y42.667 -X-3.871Y42.867 -X-4.202Y43.066 -X-4.858Y43.463 -X-6.136Y44.252 -X-6.444Y44.447 -X-6.748Y44.642 -X-7.337Y45.028 -X-8.430Y45.788 -X-8.682Y45.975 -X-8.926Y46.161 -X-9.383Y46.527 -X-9.596Y46.708 -X-9.799Y46.887 -X-10.170Y47.241 -X-10.337Y47.415 -X-10.493Y47.587 -X-10.636Y47.757 -X-10.766Y47.925 -X-10.884Y48.091 -X-10.988Y48.255 -X-11.078Y48.416 -X-11.155Y48.576 -X-11.218Y48.733 -X-11.267Y48.888 -X-11.301Y49.040 -X-11.322Y49.190 -X-11.328Y49.337 -X-11.319Y49.482 -X-11.296Y49.624 -X-11.259Y49.763 -X-11.207Y49.900 -X-11.140Y50.033 -X-11.059Y50.164 -X-10.963Y50.293 -X-10.853Y50.418 -X-10.729Y50.540 -X-10.591Y50.659 -X-10.439Y50.775 -X-10.276Y50.886 -X-10.100Y50.994 -X-9.912Y51.098 -X-9.710Y51.200 -X-9.496Y51.298 -X-9.270Y51.394 -X-8.783Y51.574 -X-8.522Y51.660 -X-8.250Y51.742 -X-7.968Y51.821 -X-7.675Y51.897 -X-7.372Y51.969 -X-7.059Y52.038 -X-6.407Y52.165 -X-6.068Y52.223 -X-5.722Y52.278 -X-5.368Y52.330 -X-5.006Y52.378 -X-4.639Y52.422 -X-4.265Y52.463 -X-3.886Y52.500 -X-3.501Y52.533 -X-3.112Y52.563 -X-2.719Y52.590 -X-2.322Y52.613 -X-1.923Y52.632 -X-1.521Y52.647 -X-1.116Y52.659 -X-0.711Y52.667 -X-0.304Y52.672 -X0.103Y52.673 -X0.510Y52.670 -X0.916Y52.664 -X1.321Y52.654 -X1.724Y52.640 -X2.125Y52.623 -X2.524Y52.602 -X2.919Y52.577 -X3.310Y52.549 -X3.696Y52.517 -X4.078Y52.481 -X4.455Y52.442 -X4.826Y52.400 -X5.190Y52.354 -X5.548Y52.304 -X5.898Y52.251 -X6.241Y52.194 -X6.576Y52.134 -X6.902Y52.070 -X7.219Y52.003 -X7.526Y51.933 -X7.824Y51.859 -X8.389Y51.701 -X8.656Y51.617 -X8.911Y51.530 -X9.154Y51.439 -X9.386Y51.346 -X9.606Y51.249 -X9.814Y51.149 -X10.009Y51.046 -X10.191Y50.939 -X10.374Y50.821 -X10.541Y50.698 -X10.693Y50.573 -X10.829Y50.444 -X10.948Y50.311 -X11.052Y50.175 -X11.139Y50.036 -X11.209Y49.894 -X11.263Y49.748 -X11.301Y49.600 -X11.323Y49.448 -X11.327Y49.293 -X11.316Y49.136 -X11.288Y48.975 -X11.245Y48.812 -X11.185Y48.646 -X11.109Y48.478 -X11.018Y48.307 -X10.912Y48.133 -X10.790Y47.957 -X10.654Y47.779 -X10.503Y47.598 -X10.159Y47.230 -X9.967Y47.043 -X9.762Y46.854 -X9.314Y46.470 -X8.282Y45.681 -X7.999Y45.480 -X7.707Y45.278 -X7.098Y44.870 -X5.798Y44.041 -X3.014Y42.350 -X2.662Y42.138 -X2.311Y41.925 -X1.617Y41.500 -X0.273Y40.654 -X-0.049Y40.444 -X-0.365Y40.234 -X-0.975Y39.817 -X-2.088Y38.994 -X-2.324Y38.805 -X-2.551Y38.617 -X-2.974Y38.245 -X-3.170Y38.061 -X-3.354Y37.878 -X-3.687Y37.516 -X-3.836Y37.338 -X-3.972Y37.162 -X-4.096Y36.987 -X-4.206Y36.813 -X-4.304Y36.642 -X-4.388Y36.473 -X-4.459Y36.305 -X-4.515Y36.139 -X-4.558Y35.976 -X-4.587Y35.815 -X-4.602Y35.655 -X-4.603Y35.498 -X-4.589Y35.343 -X-4.561Y35.191 -X-4.519Y35.041 -X-4.462Y34.893 -X-4.391Y34.748 -X-4.306Y34.605 -X-4.207Y34.465 -X-4.094Y34.327 -X-3.967Y34.192 -X-3.826Y34.060 -X-3.671Y33.930 -X-3.503Y33.803 -X-3.321Y33.679 -X-3.126Y33.558 -X-2.919Y33.440 -X-2.698Y33.324 -X-2.466Y33.212 -X-2.221Y33.102 -X-1.697Y32.893 -X-1.418Y32.792 -X-1.128Y32.695 -X-0.828Y32.601 -X-0.518Y32.510 -X-0.198Y32.422 -X0.131Y32.338 -X0.814Y32.178 -X1.168Y32.104 -X1.529Y32.032 -X1.897Y31.964 -X2.271Y31.899 -X2.651Y31.838 -X3.037Y31.780 -X3.822Y31.674 -X4.221Y31.626 -X4.622Y31.581 -X5.027Y31.540 -X5.434Y31.502 -X5.842Y31.468 -X6.252Y31.437 -X6.662Y31.410 -X7.072Y31.386 -X7.515Y31.363 -X7.957Y31.345 -X8.398Y31.331 -X8.835Y31.321 -X9.269Y31.315 -X9.699Y31.313 -X10.123Y31.315 -X10.543Y31.321 -X10.956Y31.330 -X11.362Y31.344 -X11.761Y31.362 -X12.152Y31.383 -X12.534Y31.409 -X12.907Y31.438 -X13.269Y31.471 -X13.622Y31.508 -X13.963Y31.549 -X14.293Y31.593 -X14.611Y31.641 -X14.916Y31.693 -X15.209Y31.749 -X15.487Y31.808 -X15.753Y31.870 -X16.003Y31.936 -X16.240Y32.006 -X16.461Y32.079 -X16.667Y32.155 -X16.858Y32.235 -X17.033Y32.318 -X17.191Y32.404 -X17.334Y32.493 -X17.460Y32.586 -X17.570Y32.681 -X17.662Y32.780 -X17.739Y32.881 -X17.798Y32.986 -X17.840Y33.093 -X17.866Y33.203 -X17.875Y33.316 -X17.867Y33.431 -X17.842Y33.549 -X17.801Y33.670 -X17.743Y33.793 -X17.669Y33.918 -X17.579Y34.045 -X17.473Y34.175 -X17.352Y34.307 -X17.215Y34.441 -X17.063Y34.577 -X16.897Y34.715 -X16.522Y34.997 -X16.314Y35.140 -X16.093Y35.285 -X15.614Y35.580 -X15.357Y35.729 -X15.089Y35.879 -X14.522Y36.184 -X13.280Y36.806 -X12.957Y36.960 -X12.628Y37.115 -X11.954Y37.427 -X10.561Y38.054 -X7.746Y39.303 -X7.404Y39.457 -X7.067Y39.611 -X6.409Y39.915 -X5.172Y40.511 -X4.883Y40.657 -X4.603Y40.802 -X4.074Y41.087 -X3.825Y41.227 -X3.588Y41.365 -X3.148Y41.636 -X2.947Y41.769 -X2.760Y41.900 -X2.585Y42.029 -X2.425Y42.156 -X2.278Y42.280 -X2.146Y42.402 -X2.028Y42.522 -X1.926Y42.639 -X1.839Y42.754 -X1.767Y42.866 -X1.711Y42.976 -X1.671Y43.083 -X1.646Y43.187 -X1.638Y43.289 -X1.645Y43.387 -X1.669Y43.483 -X1.709Y43.576 -X1.765Y43.665 -X1.838Y43.752 -X1.926Y43.835 -X2.030Y43.915 -X2.150Y43.992 -X2.286Y44.065 -X2.438Y44.135 -X2.605Y44.202 -X2.787Y44.265 -X2.984Y44.324 -X3.195Y44.380 -X3.421Y44.433 -X3.661Y44.481 -X3.915Y44.526 -X4.182Y44.568 -X4.443Y44.603 -X4.714Y44.635 -X4.996Y44.663 -X5.289Y44.688 -X5.591Y44.710 -X5.902Y44.728 -X6.223Y44.743 -X6.552Y44.754 -X6.890Y44.762 -X7.235Y44.766 -X7.587Y44.767 -X7.946Y44.764 -X8.311Y44.758 -X8.683Y44.748 -X9.059Y44.735 -X9.440Y44.717 -X9.826Y44.697 -X10.216Y44.672 -X10.608Y44.644 -X11.004Y44.613 -X11.401Y44.578 -X11.800Y44.539 -X12.602Y44.450 -X13.003Y44.400 -X13.403Y44.347 -X13.803Y44.289 -X14.201Y44.229 -X14.596Y44.164 -X14.990Y44.096 -X15.766Y43.949 -X16.148Y43.870 -X16.525Y43.787 -X17.263Y43.611 -X17.623Y43.518 -X17.976Y43.421 -X18.661Y43.217 -X18.991Y43.109 -X19.313Y42.999 -X19.626Y42.884 -X19.929Y42.767 -X20.223Y42.645 -X20.506Y42.521 -X21.041Y42.262 -X21.292Y42.127 -X21.531Y41.990 -X21.758Y41.849 -X21.974Y41.704 -X22.176Y41.557 -X22.366Y41.407 -X22.544Y41.253 -X22.708Y41.097 -X22.859Y40.937 -X22.996Y40.775 -X23.119Y40.609 -X23.229Y40.441 -X23.325Y40.269 -X23.407Y40.095 -X23.475Y39.919 -X23.529Y39.739 -X23.571Y39.541 -X23.597Y39.341 -X23.606Y39.137 -X23.599Y38.930 -X23.575Y38.721 -X23.534Y38.508 -X23.477Y38.293 -X23.404Y38.075 -X23.315Y37.855 -X23.211Y37.632 -X23.091Y37.406 -X22.955Y37.178 -X22.805Y36.948 -X22.640Y36.716 -X22.268Y36.244 -X22.061Y36.005 -X21.841Y35.765 -X21.364Y35.278 -X20.274Y34.284 -X19.975Y34.031 -X19.668Y33.778 -X19.029Y33.267 -X17.670Y32.234 -X17.316Y31.974 -X16.959Y31.713 -X16.236Y31.190 -X14.771Y30.140 -X14.405Y29.877 -X14.040Y29.614 -X13.319Y29.089 -X11.923Y28.043 -X11.588Y27.783 -X11.260Y27.524 -X10.626Y27.008 -X10.322Y26.752 -X10.027Y26.497 -X9.467Y25.990 -X9.203Y25.738 -X8.951Y25.488 -X8.482Y24.992 -X8.266Y24.747 -X8.064Y24.503 -X7.700Y24.021 -X7.550Y23.799 -X7.412Y23.578 -X7.288Y23.359 -X7.177Y23.143 -X7.079Y22.928 -X6.995Y22.715 -X6.925Y22.504 -X6.868Y22.295 -X6.826Y22.089 -X6.798Y21.884 -X6.784Y21.682 -X6.785Y21.483 -X6.800Y21.285 -X6.829Y21.091 -X6.873Y20.898 -X6.931Y20.708 -X7.003Y20.521 -X7.090Y20.336 -X7.191Y20.154 -X7.306Y19.975 -X7.434Y19.799 -X7.577Y19.625 -X7.733Y19.454 -X7.903Y19.286 -X8.085Y19.121 -X8.281Y18.959 -X8.489Y18.800 -X8.710Y18.644 -X8.943Y18.491 -X9.188Y18.341 -X9.711Y18.051 -X9.989Y17.910 -X10.278Y17.773 -X10.884Y17.508 -X11.201Y17.381 -X11.527Y17.257 -X12.203Y17.019 -X12.552Y16.905 -X12.908Y16.795 -X13.639Y16.584 -X14.012Y16.484 -X14.390Y16.387 -X15.159Y16.204 -X15.548Y16.118 -X15.940Y16.035 -X16.729Y15.880 -X17.126Y15.808 -X17.522Y15.739 -X18.315Y15.612 -X18.709Y15.554 -X19.102Y15.499 -X19.492Y15.448 -X19.879Y15.401 -X20.263Y15.357 -X20.642Y15.316 -X21.017Y15.279 -X21.387Y15.245 -X21.744Y15.215 -X22.095Y15.189 -X22.440Y15.166 -X22.778Y15.146 -X23.109Y15.129 -X23.431Y15.116 -X23.746Y15.106 -X24.052Y15.099 -X24.349Y15.095 -X24.636Y15.095 -X24.914Y15.097 -X25.181Y15.103 -X25.438Y15.112 -X25.684Y15.123 -X25.919Y15.138 -X26.142Y15.156 -X26.354Y15.177 -X26.553Y15.200 -X26.740Y15.227 -X26.914Y15.256 -X27.076Y15.288 -X27.225Y15.323 -X27.360Y15.361 -X27.482Y15.402 -X27.591Y15.445 -X27.686Y15.491 -X27.767Y15.539 -X27.835Y15.590 -X27.888Y15.643 -X27.928Y15.699 -X27.954Y15.757 -X27.965Y15.818 -X27.963Y15.881 -X27.947Y15.946 -X27.917Y16.014 -X27.873Y16.083 -X27.816Y16.155 -X27.744Y16.229 -X27.660Y16.305 -X27.562Y16.382 -X27.451Y16.462 -X27.327Y16.544 -X27.042Y16.712 -X26.881Y16.799 -X26.707Y16.887 -X26.326Y17.069 -X26.118Y17.162 -X25.900Y17.256 -X25.433Y17.449 -X24.385Y17.849 -X21.934Y18.690 -X21.575Y18.807 -X21.212Y18.925 -X20.474Y19.161 -X18.977Y19.635 -X16.040Y20.572 -X15.691Y20.686 -X15.348Y20.800 -X14.684Y21.024 -X13.458Y21.457 -X13.176Y21.562 -X12.904Y21.666 -X12.396Y21.868 -X12.159Y21.966 -X11.936Y22.063 -X11.528Y22.250 -X11.345Y22.340 -X11.176Y22.429 -X11.022Y22.515 -X10.882Y22.599 -X10.757Y22.681 -X10.648Y22.760 -X10.554Y22.836 -X10.476Y22.910 -X10.413Y22.982 -X10.367Y23.051 -X10.337Y23.117 -X10.323Y23.180 -X10.325Y23.240 -X10.344Y23.298 -X10.379Y23.352 -X10.430Y23.403 -X10.497Y23.452 -X10.580Y23.497 -X10.680Y23.538 -X10.795Y23.577 -X10.926Y23.612 -X11.072Y23.644 -X11.233Y23.673 -X11.410Y23.698 -X11.601Y23.719 -X11.807Y23.737 -X12.027Y23.751 -X12.260Y23.762 -X12.507Y23.769 -X12.767Y23.772 -X13.040Y23.771 -X13.325Y23.767 -X13.601Y23.760 -X13.887Y23.749 -X14.182Y23.734 -X14.486Y23.717 -X14.799Y23.696 -X15.120Y23.671 -X15.448Y23.643 -X15.784Y23.612 -X16.126Y23.577 -X16.475Y23.538 -X16.829Y23.496 -X17.188Y23.450 -X17.552Y23.401 -X17.921Y23.348 -X18.667Y23.232 -X19.045Y23.169 -X19.424Y23.102 -X20.187Y22.957 -X20.569Y22.879 -X20.951Y22.797 -X21.712Y22.623 -X22.090Y22.531 -X22.466Y22.435 -X23.208Y22.232 -X23.574Y22.125 -X23.935Y22.015 -X24.641Y21.784 -X24.985Y21.663 -X25.323Y21.538 -X25.977Y21.279 -X26.292Y21.144 -X26.599Y21.006 -X27.186Y20.719 -X27.465Y20.571 -X27.734Y20.419 -X27.993Y20.264 -X28.241Y20.106 -X28.477Y19.944 -X28.702Y19.779 -X29.116Y19.440 -X29.305Y19.266 -X29.481Y19.088 -X29.644Y18.908 -X29.794Y18.724 -X29.930Y18.538 -X30.053Y18.349 -X30.162Y18.156 -X30.258Y17.961 -X30.339Y17.763 -X30.406Y17.563 -X30.459Y17.359 -X30.498Y17.153 -X30.522Y16.944 -X30.532Y16.733 -X30.528Y16.519 -X30.510Y16.303 -X30.474Y16.066 -X30.421Y15.826 -X30.352Y15.583 -X30.266Y15.337 -X30.164Y15.089 -X30.046Y14.839 -X29.912Y14.586 -X29.762Y14.330 -X29.597Y14.073 -X29.417Y13.813 -X29.014Y13.287 -X28.791Y13.021 -X28.555Y12.753 -X28.044Y12.211 -X27.769Y11.938 -X27.483Y11.663 -X26.879Y11.109 -X25.553Y9.985 -X22.573Y7.693 -X22.183Y7.405 -X21.791Y7.116 -X21.005Y6.537 -X19.442Y5.382 -X19.058Y5.094 -X18.678Y4.806 -X17.931Y4.232 -X16.513Y3.095 -X16.178Y2.813 -X15.852Y2.532 -X15.229Y1.974 -X14.933Y1.697 -X14.649Y1.422 -X14.115Y0.876 -X13.867Y0.606 -X13.632Y0.337 -X13.411Y0.071 -X13.204Y-0.194 -X13.010Y-0.457 -X12.832Y-0.717 -X12.668Y-0.976 -X12.520Y-1.232 -X12.395Y-1.469 -X12.284Y-1.703 -X12.188Y-1.936 -X12.105Y-2.167 -X12.036Y-2.395 -X11.982Y-2.621 -X11.942Y-2.844 -X11.916Y-3.065 -X11.905Y-3.284 -X11.908Y-3.500 -X11.926Y-3.713 -X11.959Y-3.924 -X12.005Y-4.132 -X12.067Y-4.338 -X12.142Y-4.540 -X12.232Y-4.740 -X12.336Y-4.937 -X12.453Y-5.131 -X12.584Y-5.322 -X12.729Y-5.510 -X12.887Y-5.695 -X13.059Y-5.877 -X13.243Y-6.055 -X13.439Y-6.231 -X13.648Y-6.403 -X13.869Y-6.572 -X14.101Y-6.738 -X14.345Y-6.901 -X14.599Y-7.060 -X14.864Y-7.216 -X15.423Y-7.518 -X15.717Y-7.664 -X16.020Y-7.806 -X16.650Y-8.080 -X16.976Y-8.212 -X17.309Y-8.340 -X17.994Y-8.586 -X18.344Y-8.704 -X18.700Y-8.818 -X19.423Y-9.035 -X20.902Y-9.426 -X21.276Y-9.515 -X21.650Y-9.600 -X22.396Y-9.759 -X22.767Y-9.833 -X23.137Y-9.903 -X23.868Y-10.033 -X24.228Y-10.092 -X24.584Y-10.148 -X24.936Y-10.200 -X25.282Y-10.249 -X25.622Y-10.294 -X25.956Y-10.336 -X26.604Y-10.408 -X26.910Y-10.438 -X27.208Y-10.465 -X27.498Y-10.489 -X27.779Y-10.509 -X28.051Y-10.527 -X28.313Y-10.540 -X28.565Y-10.551 -X28.807Y-10.558 -X29.038Y-10.562 -X29.258Y-10.563 -X29.466Y-10.561 -X29.663Y-10.556 -X29.848Y-10.547 -X30.020Y-10.536 -X30.180Y-10.522 -X30.327Y-10.504 -X30.462Y-10.484 -X30.583Y-10.461 -X30.690Y-10.435 -X30.784Y-10.406 -X30.865Y-10.374 -X30.932Y-10.340 -X30.984Y-10.303 -X31.023Y-10.263 -X31.048Y-10.221 -X31.058Y-10.176 -X31.055Y-10.128 -X31.037Y-10.078 -X31.006Y-10.026 -X30.960Y-9.971 -X30.900Y-9.914 -X30.827Y-9.855 -X30.739Y-9.794 -X30.638Y-9.730 -X30.524Y-9.664 -X30.396Y-9.596 -X30.255Y-9.527 -X30.100Y-9.455 -X29.754Y-9.306 -X29.562Y-9.228 -X29.359Y-9.149 -X28.917Y-8.986 -X27.902Y-8.642 -X27.624Y-8.553 -X27.336Y-8.462 -X26.734Y-8.278 -X25.440Y-7.896 -X22.592Y-7.100 -X22.191Y-6.990 -X21.787Y-6.879 -X20.978Y-6.659 -X19.371Y-6.218 -X18.976Y-6.109 -X18.584Y-6.000 -X17.814Y-5.783 -X16.349Y-5.360 -X16.002Y-5.257 -X15.664Y-5.155 -X15.016Y-4.954 -X14.708Y-4.856 -X14.410Y-4.759 -X13.850Y-4.569 -X13.589Y-4.477 -X13.340Y-4.387 -X12.883Y-4.212 -X12.675Y-4.127 -X12.482Y-4.045 -X12.140Y-3.886 -X11.991Y-3.810 -X11.859Y-3.737 -X11.741Y-3.665 -X11.640Y-3.597 -X11.555Y-3.531 -X11.486Y-3.467 -X11.433Y-3.406 -X11.397Y-3.348 -X11.377Y-3.293 -X11.373Y-3.241 -X11.386Y-3.191 -X11.415Y-3.145 -X11.460Y-3.101 -X11.522Y-3.061 -X11.600Y-3.024 -X11.694Y-2.990 -X11.803Y-2.959 -X11.928Y-2.932 -X12.068Y-2.908 -X12.223Y-2.887 -X12.393Y-2.870 -X12.578Y-2.856 -X12.776Y-2.846 -X12.989Y-2.840 -X13.214Y-2.837 -X13.453Y-2.838 -X13.704Y-2.842 -X13.967Y-2.850 -X14.242Y-2.862 -X14.527Y-2.878 -X14.824Y-2.897 -X15.130Y-2.921 -X15.425Y-2.946 -X15.727Y-2.975 -X16.037Y-3.007 -X16.353Y-3.042 -X16.676Y-3.081 -X17.005Y-3.124 -X17.678Y-3.219 -X18.021Y-3.272 -X18.368Y-3.329 -X19.071Y-3.452 -X19.426Y-3.519 -X19.783Y-3.590 -X20.499Y-3.742 -X20.857Y-3.823 -X21.214Y-3.908 -X21.925Y-4.088 -X22.277Y-4.183 -X22.626Y-4.282 -X23.314Y-4.491 -X23.652Y-4.600 -X23.984Y-4.713 -X24.632Y-4.949 -X24.947Y-5.073 -X25.254Y-5.199 -X25.846Y-5.463 -X26.129Y-5.600 -X26.404Y-5.740 -X26.669Y-5.884 -X26.925Y-6.031 -X27.170Y-6.181 -X27.405Y-6.334 -X27.842Y-6.650 -X28.043Y-6.813 -X28.232Y-6.979 -X28.409Y-7.149 -X28.573Y-7.321 -X28.725Y-7.496 -X28.863Y-7.674 -X28.989Y-7.855 -X29.101Y-8.039 -X29.199Y-8.226 -X29.283Y-8.416 -X29.353Y-8.609 -X29.409Y-8.804 -X29.451Y-9.002 -X29.479Y-9.203 -X29.492Y-9.406 -X29.491Y-9.612 -X29.475Y-9.820 -X29.445Y-10.031 -X29.401Y-10.244 -X29.342Y-10.459 -X29.269Y-10.677 -X29.181Y-10.897 -X29.080Y-11.119 -X28.964Y-11.344 -X28.823Y-11.589 -X28.666Y-11.837 -X28.493Y-12.087 -X28.305Y-12.340 -X28.102Y-12.594 -X27.883Y-12.851 -X27.403Y-13.370 -X27.142Y-13.632 -X26.868Y-13.897 -X26.281Y-14.430 -X24.969Y-15.514 -X24.615Y-15.788 -X24.252Y-16.064 -X23.501Y-16.617 -X21.917Y-17.734 -X18.570Y-19.985 -X18.148Y-20.266 -X17.729Y-20.547 -X16.897Y-21.108 -X15.285Y-22.222 -X14.896Y-22.498 -X14.515Y-22.774 -X13.775Y-23.321 -X12.409Y-24.400 -X12.095Y-24.666 -X11.792Y-24.930 -X11.223Y-25.453 -X10.958Y-25.712 -X10.707Y-25.968 -X10.246Y-26.475 -X10.038Y-26.725 -X9.845Y-26.973 -X9.667Y-27.218 -X9.505Y-27.461 -X9.359Y-27.702 -X9.229Y-27.940 -X9.115Y-28.175 -X9.017Y-28.407 -X8.938Y-28.632 -X8.874Y-28.855 -X8.827Y-29.074 -X8.796Y-29.291 -X8.781Y-29.505 -X8.782Y-29.716 -X8.799Y-29.923 -X8.833Y-30.128 -X8.882Y-30.329 -X8.947Y-30.527 -X9.028Y-30.722 -X9.125Y-30.914 -X9.236Y-31.102 -X9.363Y-31.286 -X9.505Y-31.467 -X9.661Y-31.645 -X9.832Y-31.819 -X10.016Y-31.989 -X10.214Y-32.155 -X10.425Y-32.318 -X10.649Y-32.477 -X10.885Y-32.633 -X11.393Y-32.932 -X11.664Y-33.076 -X11.945Y-33.215 -X12.536Y-33.483 -X12.846Y-33.611 -X13.163Y-33.735 -X13.821Y-33.971 -X14.160Y-34.082 -X14.504Y-34.190 -X15.209Y-34.393 -X15.568Y-34.488 -X15.930Y-34.579 -X16.661Y-34.748 -X17.029Y-34.827 -X17.397Y-34.901 -X17.766Y-34.971 -X18.134Y-35.037 -X18.501Y-35.099 -X18.865Y-35.157 -X19.585Y-35.260 -X19.940Y-35.305 -X20.290Y-35.346 -X20.634Y-35.383 -X20.973Y-35.416 -X21.305Y-35.444 -X21.630Y-35.469 -X21.947Y-35.490 -X22.256Y-35.506 -X22.556Y-35.519 -X22.847Y-35.527 -X23.128Y-35.532 -X23.398Y-35.532 -X23.657Y-35.529 -X23.904Y-35.522 -X24.140Y-35.511 -X24.363Y-35.496 -X24.559Y-35.479 -X24.745Y-35.459 -X24.918Y-35.435 -X25.079Y-35.408 -X25.228Y-35.378 -X25.364Y-35.345 -X25.487Y-35.309 -X25.597Y-35.269 -X25.694Y-35.227 -X25.777Y-35.182 -X25.847Y-35.133 -X25.902Y-35.082 -X25.944Y-35.028 -X25.972Y-34.972 -X25.986Y-34.912 -X25.986Y-34.850 -X25.971Y-34.785 -X25.942Y-34.717 -X25.899Y-34.647 -X25.842Y-34.575 -X25.771Y-34.499 -X25.685Y-34.422 -X25.586Y-34.342 -X25.472Y-34.260 -X25.345Y-34.175 -X25.204Y-34.088 -X24.883Y-33.909 -X24.702Y-33.815 -X24.509Y-33.720 -X24.085Y-33.525 -X23.855Y-33.424 -X23.613Y-33.321 -X23.095Y-33.112 -X21.933Y-32.673 -X19.198Y-31.738 -X12.952Y-29.747 -X12.533Y-29.612 -X12.117Y-29.477 -X11.302Y-29.208 -X9.752Y-28.680 -X9.384Y-28.550 -X9.026Y-28.422 -X8.340Y-28.168 -X7.104Y-27.677 -X6.826Y-27.559 -X6.561Y-27.442 -X6.073Y-27.213 -X5.850Y-27.102 -X5.643Y-26.992 -X5.272Y-26.780 -X5.111Y-26.677 -X4.965Y-26.577 -X4.835Y-26.479 -X4.721Y-26.383 -X4.623Y-26.290 -X4.542Y-26.199 -X4.478Y-26.112 -X4.430Y-26.026 -X4.398Y-25.944 -X4.384Y-25.865 -X4.385Y-25.788 -X4.403Y-25.714 -X4.438Y-25.644 -X4.489Y-25.576 -X4.556Y-25.512 -X4.639Y-25.450 -X4.738Y-25.392 -X4.852Y-25.337 -X4.981Y-25.286 -X5.126Y-25.238 -X5.285Y-25.193 -X5.458Y-25.152 -X5.646Y-25.115 -X5.847Y-25.080 -X6.061Y-25.050 -X6.287Y-25.023 -X6.527Y-25.000 -X6.777Y-24.980 -X7.040Y-24.964 -X7.313Y-24.952 -X7.596Y-24.944 -X7.889Y-24.939 -X8.191Y-24.939 -X8.502Y-24.942 -X8.820Y-24.949 -X9.146Y-24.960 -X9.478Y-24.975 -X9.817Y-24.994 -X10.161Y-25.017 -X10.510Y-25.044 -X10.839Y-25.072 -X11.171Y-25.104 -X11.506Y-25.140 -X11.842Y-25.179 -X12.180Y-25.221 -X12.519Y-25.267 -X13.196Y-25.370 -X13.534Y-25.427 -X13.870Y-25.487 -X14.204Y-25.550 -X14.535Y-25.617 -X14.864Y-25.688 -X15.188Y-25.762 -X15.824Y-25.920 -X16.134Y-26.004 -X16.438Y-26.092 -X16.736Y-26.183 -X17.027Y-26.277 -X17.311Y-26.375 -X17.587Y-26.476 -X18.113Y-26.689 -X18.362Y-26.800 -X18.602Y-26.914 -X18.832Y-27.032 -X19.052Y-27.152 -X19.260Y-27.276 -X19.457Y-27.403 -X19.643Y-27.534 -X19.817Y-27.667 -X19.979Y-27.803 -X20.128Y-27.943 -X20.264Y-28.085 -X20.387Y-28.230 -X20.497Y-28.379 -X20.594Y-28.530 -X20.676Y-28.684 -X20.745Y-28.840 -X20.800Y-29.000 -X20.841Y-29.162 -X20.867Y-29.327 -X20.879Y-29.494 -X20.876Y-29.664 -X20.859Y-29.837 -X20.828Y-30.012 -X20.781Y-30.189 -X20.721Y-30.369 -X20.645Y-30.551 -X20.556Y-30.735 -X20.452Y-30.922 -X20.333Y-31.110 -X20.201Y-31.301 -X20.055Y-31.494 -X19.894Y-31.688 -X19.721Y-31.885 -X19.533Y-32.084 -X19.120Y-32.486 -X18.893Y-32.690 -X18.655Y-32.896 -X18.142Y-33.311 -X17.874Y-33.517 -X17.595Y-33.724 -X17.007Y-34.142 -X15.720Y-34.991 -X12.798Y-36.727 -X12.410Y-36.947 -X12.018Y-37.167 -X11.225Y-37.607 -X9.621Y-38.487 -X6.455Y-40.236 -X6.074Y-40.452 -X5.697Y-40.668 -X4.960Y-41.096 -X3.566Y-41.941 -X3.237Y-42.149 -X2.916Y-42.356 -X2.302Y-42.766 -X1.194Y-43.568 -X0.944Y-43.764 -X0.706Y-43.959 -X0.264Y-44.342 -X0.062Y-44.531 -X-0.128Y-44.718 -X-0.469Y-45.085 -X-0.620Y-45.266 -X-0.758Y-45.444 -X-0.882Y-45.620 -X-0.993Y-45.794 -X-1.090Y-45.965 -X-1.173Y-46.134 -X-1.243Y-46.301 -X-1.298Y-46.465 -X-1.342Y-46.640 -X-1.371Y-46.812 -X-1.382Y-46.980 -X-1.378Y-47.146 -X-1.357Y-47.308 -X-1.320Y-47.467 -X-1.267Y-47.622 -X-1.198Y-47.775 -X-1.114Y-47.923 -X-1.014Y-48.068 -X-0.899Y-48.210 -X-0.769Y-48.348 -X-0.625Y-48.482 -X-0.466Y-48.612 -X-0.293Y-48.739 -X-0.107Y-48.862 -X0.093Y-48.981 -X0.305Y-49.097 -X0.530Y-49.208 -X0.766Y-49.315 -X1.014Y-49.419 -X1.273Y-49.518 -X1.822Y-49.705 -X2.110Y-49.792 -X2.407Y-49.875 -X2.713Y-49.954 -X3.026Y-50.029 -X3.346Y-50.100 -X3.672Y-50.166 -X4.004Y-50.229 -X4.341Y-50.287 -X4.683Y-50.340 -X5.028Y-50.390 -X5.376Y-50.435 -X5.727Y-50.476 -X6.080Y-50.513 -X6.433Y-50.545 -X6.787Y-50.573 -X7.141Y-50.597 -X7.494Y-50.617 -X7.845Y-50.632 -X8.194Y-50.643 -X8.540Y-50.650 -X8.882Y-50.652 -X9.220Y-50.651 -X9.553Y-50.645 -X9.881Y-50.635 -X10.202Y-50.620 -X10.516Y-50.602 -X10.823Y-50.579 -X11.122Y-50.552 -X11.412Y-50.521 -X11.693Y-50.486 -X11.964Y-50.447 -X12.225Y-50.404 -X12.475Y-50.356 -X12.714Y-50.305 -X12.941Y-50.250 -X13.155Y-50.191 -X13.357Y-50.128 -X13.546Y-50.061 -X13.721Y-49.990 -X13.882Y-49.916 -X14.020Y-49.843 -X14.144Y-49.767 -X14.256Y-49.688 -X14.355Y-49.605 -X14.441Y-49.520 -X14.513Y-49.431 -X14.571Y-49.340 -X14.615Y-49.245 -X14.645Y-49.148 -X14.662Y-49.048 -X14.664Y-48.944 -X14.651Y-48.838 -X14.625Y-48.730 -X14.584Y-48.618 -X14.529Y-48.504 -X14.459Y-48.387 -X14.376Y-48.268 -X14.278Y-48.146 -X14.166Y-48.022 -X14.040Y-47.896 -X13.900Y-47.767 -X13.747Y-47.635 -X13.399Y-47.366 -X13.206Y-47.228 -X12.999Y-47.088 -X12.548Y-46.803 -X11.504Y-46.209 -X11.215Y-46.057 -X10.916Y-45.902 -X10.287Y-45.589 -X8.923Y-44.948 -X5.870Y-43.614 -X5.468Y-43.444 -X5.063Y-43.274 -X4.246Y-42.931 -X2.603Y-42.244 -X-0.599Y-40.871 -X-1.025Y-40.682 -X-1.444Y-40.493 -X-2.257Y-40.118 -X-3.764Y-39.380 -X-4.113Y-39.199 -X-4.450Y-39.019 -X-5.084Y-38.665 -X-5.380Y-38.490 -X-5.662Y-38.317 -X-6.181Y-37.977 -X-6.417Y-37.810 -X-6.637Y-37.645 -X-6.841Y-37.483 -X-7.028Y-37.322 -X-7.199Y-37.165 -X-7.352Y-37.009 -X-7.488Y-36.856 -X-7.607Y-36.706 -X-7.708Y-36.559 -X-7.791Y-36.414 -X-7.856Y-36.272 -X-7.904Y-36.133 -X-7.934Y-35.997 -X-7.946Y-35.864 -X-7.941Y-35.734 -X-7.918Y-35.608 -X-7.877Y-35.484 -X-7.819Y-35.364 -X-7.744Y-35.247 -X-7.652Y-35.134 -X-7.543Y-35.024 -X-7.418Y-34.918 -X-7.277Y-34.815 -X-7.121Y-34.716 -X-6.949Y-34.620 -X-6.762Y-34.528 -X-6.560Y-34.440 -X-6.345Y-34.356 -X-6.116Y-34.276 -X-5.874Y-34.199 -X-5.620Y-34.127 -X-5.353Y-34.058 -X-5.076Y-33.993 -X-4.787Y-33.933 -X-4.489Y-33.876 -X-4.181Y-33.824 -X-3.864Y-33.775 -X-3.539Y-33.731 -X-3.207Y-33.691 -X-2.867Y-33.655 -X-2.522Y-33.623 -X-2.172Y-33.596 -X-1.817Y-33.572 -X-1.458Y-33.553 -X-1.096Y-33.538 -X-0.732Y-33.528 -X-0.366Y-33.521 -X0.000Y-33.519 -G0Z6.000 -G0X37.560Y12.327Z6.000 -G1Z-1.000 -G1Y0.876 -X49.011 -Y12.327 -X37.560 -G0Z6.000 -G0Y0.876 -G1Z-1.000 -G1Y-10.575 -X49.011 -Y0.876 -X37.560 -G0Z6.000 -G0X49.011Y12.327 -G1Z-1.000 -G1X52.084Y15.011 -G0Z6.000 -G0X49.011Y0.876 -G1Z-1.000 -G1X52.084Y6.213 -Y15.011 -X43.286 -X37.560Y12.327 -G0Z6.000 -G0X49.011Y-10.575 -G1Z-1.000 -G1X52.084Y-2.585 -Y6.213 -X49.011Y0.876 -G0Z6.000 -G0Z20.000 -G0X0.000Y0.000 -M30 diff --git a/test/matlab/grbl_sim.m b/test/matlab/grbl_sim.m deleted file mode 100644 index 3f34d95b8..000000000 --- a/test/matlab/grbl_sim.m +++ /dev/null @@ -1,437 +0,0 @@ -% ---------------------------------------------------------------------------------------- -% The MIT License (MIT) -% -% Copyright (c) 2014 Sungeun K. Jeon -% -% Permission is hereby granted, free of charge, to any person obtaining a copy -% of this software and associated documentation files (the "Software"), to deal -% in the Software without restriction, including without limitation the rights -% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -% copies of the Software, and to permit persons to whom the Software is -% furnished to do so, subject to the following conditions: -% -% The above copyright notice and this permission notice shall be included in -% all copies or substantial portions of the Software. -% -% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -% THE SOFTWARE. -% ---------------------------------------------------------------------------------------- - -% This MATLAB script was written for the purpose of being a GRBL planner simulator. This -% simulator is a rough representation of the actual workings of Grbl on the Arduino, but -% was used to hone and proof the actual planner by providing quick visual feedback on its -% functionality when experimented on. This script should be considered for educational -% purposes only. This script requires and executes a pre-parsed g-code file from the -% matlab_convert.py script that is in a specific non-g-code format. - -% There will be two figures plotted. The first is the line motion paths of the complete -% g-code program. The second is a representation of Grbl's planner buffer as new line -% motions are fed to it, plotting the velocity profiles the stepper motors will execute. -% Every time the user inputs an , this feeds the simulator planner one line motion -% block. The left side is the first block in the buffer and the one that will be executed -% by the stepper module first. The right side is the end of the planner buffer, where the -% most recent streamed block is appended onto the planner buffer. Grbl's planner -% optimizes the velocity profiles between the beginning and end of the buffer based on -% the acceleration limits, intended velocity/feedrate, and line motion junction angles -% with their corresponding velocity limits (i.e. junctions with acute angles needs to come -% to a complete stop vs straight junctions can continue through at full speed.) - -% ---------------------------------------------------------------------------------------- - - -% Main function -% NOTE: This is just a way to keep all functions in one place, but all non-global variables -% are cleared as soon as this script completes. -function main() - -% Load pre-parsed gcode moves. -close all; -warning off; -clearvars -global -fid = fopen('matlab.gcode','r'); -gcode = textscan(fid,'%d8%f32%f32%f32%f32'); -nblock = length(gcode{1}); - -% Plot all g-code moves. -figure -line(gcode{3},gcode{4},gcode{5}); -axis equal; -% axis([min(gcode{3}) max(gcode{3}) min(gcode{4}) max(gcode{4}) min(gcode{5}) max(gcode{5})]); -title('G-code programming line motions'); -view(3); - -% Set up figure for planner queue -figure - -% Print help. -disp(''); -disp(' BLUE line indicates completed planner blocks that require no recalculation.'); -disp(' RED line indicates planner blocks that have been recalculated.'); -disp(' GREEN line indicates the location of the BPLANNED pointer. Always a recalculated block.'); -disp(' BLACK dotted-line and ''x'' indicates block nominal speed and max junction velocity, respectively.'); -disp(' CYAN ''.'' indicates block initial entry speed.'); - -% Define Grbl settings. -BUFFER_SIZE = 18; % Number of planner blocks in its ring buffer. -steps_per_mm = 200; -seekrate = 2500; % mm/min -acceleration = [100 100 100]; % mm/sec^2 [ X Y Z ] axes -junction_deviation = 0.1; % mm. See Grbl documentation on this parameter. -inch_2_mm = 25.4; -ACCELERATION_TICKS_PER_SECOND = 100; - -gcode{2} = gcode{2}; -gcode{2} = inch_2_mm*gcode{2}; -gcode{3} = inch_2_mm*gcode{3}; -gcode{4} = inch_2_mm*gcode{4}; -gcode{5} = inch_2_mm*gcode{5}; - -% Initialize blocks -block.steps = []; -block.step_event_count = []; -block.delta_mm = []; -block.millimeters = []; -block.acceleration = []; -block.speed = []; -block.nominal_speed = []; -block.max_entry_speed = []; -block.entry_speed = []; -block.recalculate_flag = false; -for i = 2:BUFFER_SIZE - block(i) = block(1); -end - -% Initialize planner -position = [0 0 0]; -prev_unit_vec = [0 0 0]; -previous_nominal_speed = 0; -pos = 0; - -% BHEAD and BTAIL act as pointers to the block head and tail. -% BPLANNED acts as a pointer of the location of the end of a completed/optimized plan. -bhead = 1; -btail = 1; -bplanned = 1; - -global block bhead btail bplanned nind acceleration BUFFER_SIZE pos ACCELERATION_TICKS_PER_SECOND - -% Main loop. Simulates plan_buffer_line(). All of the precalculations for the newest incoming -% block occurs here. Anything independent of the planner changes. -for i = 1:nblock - - target = round([gcode{3}(i) gcode{4}(i) gcode{5}(i)].*steps_per_mm); - if gcode{1}(i) == 1 - feedrate = gcode{2}(i); - else - feedrate = seekrate; - end - - nind = next_block_index(bhead); - if nind == btail - % Simulate a constantly full buffer. Move buffer tail. - bind = next_block_index(btail); - % Push planned pointer if encountered. Prevents it from looping back around the ring buffer. - if btail == bplanned; bplanned = bind; end - btail = bind; - end - - block(bhead).steps = abs(target-position); - block(bhead).step_event_count = max(block(bhead).steps); - - % Bail if this is a zero-length block - if block(bhead).step_event_count == 0 - disp(['Zero-length block in line ',int2str(i)]); - else - - % Compute path vector in terms of absolute step target and current positions - delta_mm = single((target-position)./steps_per_mm); - block(bhead).millimeters = single(norm(delta_mm)); - inverse_millimeters = single(1/block(bhead).millimeters); - - % Compute path unit vector - unit_vec = delta_mm/block(bhead).millimeters; - - % Calculate speed in mm/minute for each axis - inverse_minute = single(feedrate * inverse_millimeters); - block(bhead).speed = delta_mm*inverse_minute; - block(bhead).nominal_speed = block(bhead).millimeters*inverse_minute; - - % Calculate block acceleration. Operates on absolute value of unit vector. - [max_acc,ind] = max(abs(unit_vec)./acceleration); % Determine limiting acceleration - block(bhead).acceleration = acceleration(ind)/abs(unit_vec(ind)); - - % Compute maximum junction speed - block(bhead).max_entry_speed = 0.0; - if previous_nominal_speed > 0.0 - cos_theta = dot(-previous_unit_vec,unit_vec); - if (cos_theta < 0.95) - block(bhead).max_entry_speed = min([block(bhead).nominal_speed,previous_nominal_speed]); - if (cos_theta > -0.95) - sin_theta_d2 = sqrt(0.5*(1.0-cos_theta)); - block(bhead).max_entry_speed = min([block(bhead).max_entry_speed,sqrt(block(bhead).acceleration*3600*junction_deviation*sin_theta_d2/(1.0-sin_theta_d2))]); - end - end - end - - block(bhead).entry_speed = 0; % Just initialize. Set accurately in the replanning function. - block(bhead).recalculate_flag = true; % Plotting flag to indicate this block has been updated. - - previous_unit_vec = unit_vec; - previous_nominal_speed = block(bhead).nominal_speed; - position = target; - - bhead = nind; % Block complete. Push buffer pointer. - planner_recalculate(); - - plot_buffer_velocities(); - end -end -return - -% Computes the next block index in the planner ring buffer -function block_index = next_block_index(block_index) -global BUFFER_SIZE - block_index = block_index + 1; - if block_index > BUFFER_SIZE - block_index = 1; - end -return - -% Computes the previous block index in the planner ring buffer -function block_index = prev_block_index(block_index) -global BUFFER_SIZE - block_index = block_index-1; - if block_index < 1 - block_index = BUFFER_SIZE; - end -return - - -% Planner recalculate function. The magic happens here. -function planner_recalculate(block) - - global block bhead btail bplanned acceleration - - bind = prev_block_index(bhead); - if bind == bplanned; return; end % Bail, if only one block in buffer. Can't be operated on. - - % Reverse Pass: Coarsely maximize all possible deceleration curves back-planning from the last - % block in buffer. Cease planning when the last optimal planned or tail pointer is reached. - % NOTE: Forward pass will later refine and correct the reverse pass to create an optimal plan. - next = []; - curr = bind; % Last block in buffer. - - % Calculate maximum entry speed for last block in buffer, where the exit speed is always zero. - block(curr).entry_speed = min([block(curr).max_entry_speed,sqrt(2*block(curr).acceleration*60*60*block(curr).millimeters)]); - - bind = prev_block_index(bind); % Btail or second to last block - if (bind == bplanned) - % Only two plannable blocks in buffer. Reverse pass complete. - % Check if the first block is the tail. If so, notify stepper module to update its current parameters. - % if bind == btail; update_tail_block; end - else - % Three or more plannable blocks in buffer. Loop it. - while bind ~= bplanned % Loop until bplanned point hits. Replans to last plan point. - next = curr; - curr = bind; - bind = prev_block_index( bind ); % Previous block pointer. - - % Check if the first block is the tail. If so, notify stepper module to update its current parameters. - % if bind == btail; update_tail_block; end - - % Compute maximum entry speed decelerating over the current block from its exit speed. - if block(curr).entry_speed ~= block(curr).max_entry_speed - block(curr).recalculate_flag = true; % Plotting flag to indicate this block has been updated. - block(curr).entry_speed = min([ block(curr).max_entry_speed,... - sqrt(block(next).entry_speed^2 + 2*block(curr).acceleration*60*60*block(curr).millimeters)]); - end - - end - end - - % For two blocks, reverse pass is skipped, but forward pass plans second block entry speed - % onward. This prevents the first, or the potentially executing block, from being over-written. - % NOTE: Can never be bhead, since bsafe is always in active buffer. - next = bplanned; - bind = next_block_index(bplanned); % Start at bplanned - while bind ~= bhead - curr = next; - next = bind; - - % An acceleration block is always an optimally planned block since it starts from the first - % block's current speed or a maximum junction speed. Compute accelerations from this block - % and update the next block's entry speed. - if (block(curr).entry_speed < block(next).entry_speed) - % Once speed is set by forward planner, the plan for this block is finished and optimal. - % Increment the planner pointer forward one block. - - entry_speed = sqrt(block(curr).entry_speed^2 + 2*block(curr).acceleration*60*60*block(curr).millimeters); - if (block(next).entry_speed > entry_speed) - block(next).entry_speed = entry_speed; - bplanned = bind; - end - - end - - % Check if the next block entry speed is at max_entry_speed. If so, move the planned pointer, since - % this entry speed cannot be improved anymore and all prior blocks have been completed and optimally planned. - if block(next).entry_speed == block(next).max_entry_speed - bplanned = bind; - end - - % Recalculate trapezoid can be installed here, since it scans through all of the plannable blocks. - % NOTE: Eventually this will only be computed when being executed. - - bind = next_block_index( bind ); - - end - -return - -% ---------------------------------------------------------------------------------------- -% PLOTTING FUNCTIONS - -% Plots the entire buffer plan into a MATLAB figure to visual the plan. -% BLUE line indicates completed planner blocks that require no recalculation. -% RED line indicates planner blocks that have been recalculated. -% GREEN line indicates the location of the BPLANNED pointer. Always a recalculated block. -% BLACK dotted-line and 'x' indicates block nominal speed and max junction velocity, respectively. -% CYAN '.' indicates block initial entry speed. -function plot_buffer_velocities() - global block bhead btail bplanned acceleration pos ACCELERATION_TICKS_PER_SECOND - bind = btail; - curr = []; - next = []; - - pos_initial = 0; - pos = 0; - while bind ~= bhead - curr = next; - next = bind; - hold on; - if ~isempty(curr) - accel_d = estimate_acceleration_distance(block(curr).entry_speed, block(curr).nominal_speed, block(curr).acceleration*60*60); - decel_d = estimate_acceleration_distance(block(curr).nominal_speed, block(next).entry_speed,-block(curr).acceleration*60*60); - plateau_d = block(curr).millimeters-accel_d-decel_d; - if plateau_d < 0 - accel_d = intersection_distance(block(curr).entry_speed, block(next).entry_speed, block(curr).acceleration*60*60, block(curr).millimeters); - if accel_d < 0 - accel_d = 0; - elseif accel_d > block(curr).millimeters - accel_d = block(curr).millimeters; - end - plateau_d = 0; - end - color = 'b'; - if (block(curr).recalculate_flag || block(next).recalculate_flag) - block(curr).recalculate_flag = false; - color = 'r'; - end - if bplanned == curr - color = 'g'; - end - - plot_trap(pos,block(curr).entry_speed,block(next).entry_speed,block(curr).nominal_speed,block(curr).acceleration,accel_d,plateau_d,block(curr).millimeters,color) - plot([pos pos+block(curr).millimeters],block(curr).nominal_speed*[1 1],'k:') % BLACK dotted indicates - plot(pos,block(curr).max_entry_speed,'kx') - - pos = pos + block(curr).millimeters; - plot(pos,block(next).entry_speed,'c.'); - end - bind = next_block_index( bind ); - end - - accel_d = estimate_acceleration_distance(block(next).entry_speed, block(next).nominal_speed, block(next).acceleration*60*60); - decel_d = estimate_acceleration_distance(block(next).nominal_speed, 0, -block(next).acceleration*60*60); - plateau_d = block(next).millimeters-accel_d-decel_d; - if plateau_d < 0 - accel_d = intersection_distance(block(next).entry_speed, 0, block(next).acceleration*60*60, block(next).millimeters); - if accel_d < 0 - accel_d = 0; - elseif accel_d > block(next).millimeters - accel_d = block(next).millimeters; - end - plateau_d = 0; - end - block(next).recalculate_flag = false; - color = 'r'; - if bplanned == next - color= 'g'; - end - - plot_trap(pos,block(next).entry_speed,0,block(next).nominal_speed,block(next).acceleration,accel_d,plateau_d,block(next).millimeters,color) - plot([pos pos+block(next).millimeters],block(next).nominal_speed*[1 1],'k:') - plot(pos,block(next).max_entry_speed,'kx') - - plot(pos,block(next).entry_speed,'.'); - pos = pos + block(next).millimeters; - plot(pos,0,'rx'); - xlabel('mm'); - ylabel('mm/sec'); - xlim([pos_initial pos]) - title('Planner buffer optimized velocity profile'); - pause(); - hold off; - - plot(pos,0) -return - - -function d_a = estimate_acceleration_distance(initial_rate, target_rate, acceleration,rate_delta) - d_a = (target_rate*target_rate-initial_rate*initial_rate)/(2*acceleration); -return - -function d_i = intersection_distance(initial_rate, final_rate, acceleration, distance, rate_delta) - d_i = (2*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4*acceleration); -return - - -% Simply plots the ac/de-celeration curves and plateaus of a trapezoid. -function plot_trap(pos,initial_rate,final_rate,rate,accel,accel_d,plateau_d,millimeters,color) - - dx = 1.0; % Line segment length - linex = [pos]; liney = [initial_rate]; - - % Acceleration - np = floor(accel_d/dx); - if np - v = initial_rate; - for i = 1:np - v = sqrt(v^2+2*accel*60*60*dx); - linex = [linex pos+i*dx]; - liney = [liney v]; - end - end - - % Plateau - v = sqrt(initial_rate^2 + 2*accel*60*60*accel_d); - if v < rate - rate = v; - end - linex = [linex pos+[accel_d accel_d+plateau_d]]; - liney = [liney [rate rate]]; - - % Deceleration - np = floor((millimeters-accel_d-plateau_d)/dx); - if np - v = rate; - for i = 1:np - v = sqrt(v^2-2*accel*60*60*dx); - linex = [linex pos+i*dx+accel_d+plateau_d]; - liney = [liney v]; - end - end - - linex = [linex pos+millimeters]; - liney = [ liney final_rate]; - plot(linex,liney,color); - -return - - - diff --git a/test/matlab/matlab.gcode b/test/matlab/matlab.gcode deleted file mode 100644 index 8ad9cdc25..000000000 --- a/test/matlab/matlab.gcode +++ /dev/null @@ -1,2362 +0,0 @@ -0 0.0 0.0 0.0 0.0 -0 0.0 0.0 0.0 0.0 -0 0.0 0.0 0.0 0.0 -0 0.0 0.0 0.0 6.0 -0 0.0 37.56 12.33 6.0 -1 300.0 37.56 12.33 -1.0 -1 300.0 37.56 0.88 -1.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 49.01 12.33 -1.0 -1 300.0 37.56 12.33 -1.0 -0 300.0 37.56 12.33 6.0 -0 300.0 37.56 0.88 6.0 -1 300.0 37.56 0.88 -1.0 -1 300.0 37.56 -10.57 -1.0 -1 300.0 49.01 -10.57 -1.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 37.56 0.88 -1.0 -0 300.0 37.56 0.88 6.0 -0 300.0 49.01 12.33 6.0 -1 300.0 49.01 12.33 -1.0 -1 300.0 52.08 15.01 -1.0 -0 300.0 52.08 15.01 6.0 -0 300.0 49.01 0.88 6.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 52.08 6.21 -1.0 -1 300.0 52.08 15.01 -1.0 -1 300.0 43.29 15.01 -1.0 -1 300.0 37.56 12.33 -1.0 -0 300.0 37.56 12.33 6.0 -0 300.0 49.01 -10.57 6.0 -1 300.0 49.01 -10.57 -1.0 -1 300.0 52.08 -2.58 -1.0 -1 300.0 52.08 6.21 -1.0 -1 300.0 49.01 0.88 -1.0 -0 300.0 49.01 0.88 6.0 -0 300.0 49.01 0.88 20.0 -0 300.0 0.0 0.0 20.0 -1 300.0 -7.1 -39.88 20.0 -1 300.0 -10.3 -38.12 20.0 -1 300.0 -10.7 -37.9 20.0 -1 300.0 -11.1 -37.68 20.0 -1 300.0 -11.89 -37.23 20.0 -1 300.0 -13.45 -36.36 20.0 -1 300.0 -13.82 -36.14 20.0 -1 300.0 -14.2 -35.92 20.0 -1 300.0 -14.92 -35.48 20.0 -1 300.0 -16.29 -34.63 20.0 -1 300.0 -16.64 -34.4 20.0 -1 300.0 -16.97 -34.16 20.0 -1 300.0 -17.61 -33.71 20.0 -1 300.0 -17.91 -33.49 20.0 -1 300.0 -18.2 -33.26 20.0 -1 300.0 -18.74 -32.82 20.0 -1 300.0 -18.99 -32.6 20.0 -1 300.0 -19.23 -32.39 20.0 -1 300.0 -19.45 -32.17 20.0 -1 300.0 -19.65 -31.96 20.0 -1 300.0 -19.84 -31.75 20.0 -1 300.0 -20.02 -31.54 20.0 -1 300.0 -20.18 -31.34 20.0 -1 300.0 -20.32 -31.13 20.0 -1 300.0 -20.45 -30.93 20.0 -1 300.0 -20.56 -30.73 20.0 -1 300.0 -20.65 -30.54 20.0 -1 300.0 -20.73 -30.34 20.0 -1 300.0 -20.79 -30.15 20.0 -1 300.0 -20.84 -29.96 20.0 -1 300.0 -20.87 -29.78 20.0 -1 300.0 -20.88 -29.59 20.0 -1 300.0 -20.88 -29.41 20.0 -1 300.0 -20.85 -29.24 20.0 -1 300.0 -20.82 -29.06 20.0 -1 300.0 -20.76 -28.89 20.0 -1 300.0 -20.7 -28.72 20.0 -1 300.0 -20.61 -28.56 20.0 -1 300.0 -20.51 -28.4 20.0 -1 300.0 -20.39 -28.24 20.0 -1 300.0 -20.26 -28.08 20.0 -1 300.0 -20.12 -27.93 20.0 -1 300.0 -19.96 -27.78 20.0 -1 300.0 -19.78 -27.64 20.0 -1 300.0 -19.59 -27.5 20.0 -1 300.0 -19.39 -27.36 20.0 -1 300.0 -19.18 -27.23 20.0 -1 300.0 -18.95 -27.09 20.0 -1 300.0 -18.71 -26.97 20.0 -1 300.0 -18.46 -26.84 20.0 -1 300.0 -18.2 -26.73 20.0 -1 300.0 -17.92 -26.61 20.0 -1 300.0 -17.64 -26.5 20.0 -1 300.0 -17.35 -26.39 20.0 -1 300.0 -16.74 -26.18 20.0 -1 300.0 -16.42 -26.09 20.0 -1 300.0 -16.09 -25.99 20.0 -1 300.0 -15.76 -25.9 20.0 -1 300.0 -15.43 -25.82 20.0 -1 300.0 -15.08 -25.74 20.0 -1 300.0 -14.74 -25.66 20.0 -1 300.0 -14.03 -25.52 20.0 -1 300.0 -13.67 -25.45 20.0 -1 300.0 -13.31 -25.39 20.0 -1 300.0 -12.95 -25.33 20.0 -1 300.0 -12.59 -25.28 20.0 -1 300.0 -12.23 -25.23 20.0 -1 300.0 -11.87 -25.18 20.0 -1 300.0 -11.51 -25.14 20.0 -1 300.0 -11.15 -25.1 20.0 -1 300.0 -10.82 -25.07 20.0 -1 300.0 -10.5 -25.04 20.0 -1 300.0 -10.17 -25.02 20.0 -1 300.0 -9.85 -25.0 20.0 -1 300.0 -9.54 -24.98 20.0 -1 300.0 -9.23 -24.96 20.0 -1 300.0 -8.92 -24.95 20.0 -1 300.0 -8.63 -24.94 20.0 -1 300.0 -8.33 -24.94 20.0 -1 300.0 -8.05 -24.94 20.0 -1 300.0 -7.77 -24.94 20.0 -1 300.0 -7.5 -24.95 20.0 -1 300.0 -7.24 -24.95 20.0 -1 300.0 -6.99 -24.97 20.0 -1 300.0 -6.75 -24.98 20.0 -1 300.0 -6.52 -25.0 20.0 -1 300.0 -6.29 -25.02 20.0 -1 300.0 -6.08 -25.05 20.0 -1 300.0 -5.88 -25.07 20.0 -1 300.0 -5.69 -25.11 20.0 -1 300.0 -5.52 -25.14 20.0 -1 300.0 -5.35 -25.18 20.0 -1 300.0 -5.2 -25.22 20.0 -1 300.0 -5.06 -25.26 20.0 -1 300.0 -4.93 -25.31 20.0 -1 300.0 -4.81 -25.36 20.0 -1 300.0 -4.71 -25.41 20.0 -1 300.0 -4.62 -25.46 20.0 -1 300.0 -4.55 -25.52 20.0 -1 300.0 -4.49 -25.58 20.0 -1 300.0 -4.44 -25.64 20.0 -1 300.0 -4.41 -25.71 20.0 -1 300.0 -4.39 -25.77 20.0 -1 300.0 -4.38 -25.84 20.0 -1 300.0 -4.39 -25.92 20.0 -1 300.0 -4.42 -25.99 20.0 -1 300.0 -4.45 -26.07 20.0 -1 300.0 -4.51 -26.15 20.0 -1 300.0 -4.57 -26.23 20.0 -1 300.0 -4.65 -26.32 20.0 -1 300.0 -4.75 -26.41 20.0 -1 300.0 -4.86 -26.5 20.0 -1 300.0 -4.98 -26.59 20.0 -1 300.0 -5.12 -26.68 20.0 -1 300.0 -5.27 -26.78 20.0 -1 300.0 -5.43 -26.87 20.0 -1 300.0 -5.8 -27.07 20.0 -1 300.0 -6.0 -27.18 20.0 -1 300.0 -6.22 -27.28 20.0 -1 300.0 -6.68 -27.5 20.0 -1 300.0 -7.75 -27.94 20.0 -1 300.0 -8.05 -28.06 20.0 -1 300.0 -8.35 -28.17 20.0 -1 300.0 -8.99 -28.41 20.0 -1 300.0 -10.36 -28.89 20.0 -1 300.0 -10.75 -29.02 20.0 -1 300.0 -11.15 -29.16 20.0 -1 300.0 -11.97 -29.43 20.0 -1 300.0 -13.66 -29.97 20.0 -1 300.0 -17.11 -31.07 20.0 -1 300.0 -17.54 -31.2 20.0 -1 300.0 -17.96 -31.34 20.0 -1 300.0 -18.79 -31.6 20.0 -1 300.0 -20.37 -32.13 20.0 -1 300.0 -20.75 -32.26 20.0 -1 300.0 -21.11 -32.38 20.0 -1 300.0 -21.82 -32.63 20.0 -1 300.0 -23.09 -33.11 20.0 -1 300.0 -23.38 -33.23 20.0 -1 300.0 -23.66 -33.34 20.0 -1 300.0 -24.16 -33.56 20.0 -1 300.0 -24.4 -33.67 20.0 -1 300.0 -24.61 -33.77 20.0 -1 300.0 -25.0 -33.97 20.0 -1 300.0 -25.18 -34.07 20.0 -1 300.0 -25.33 -34.17 20.0 -1 300.0 -25.47 -34.26 20.0 -1 300.0 -25.59 -34.35 20.0 -1 300.0 -25.7 -34.44 20.0 -1 300.0 -25.79 -34.52 20.0 -1 300.0 -25.86 -34.6 20.0 -1 300.0 -25.92 -34.68 20.0 -1 300.0 -25.96 -34.75 20.0 -1 300.0 -25.98 -34.83 20.0 -1 300.0 -25.99 -34.9 20.0 -1 300.0 -25.98 -34.96 20.0 -1 300.0 -25.95 -35.02 20.0 -1 300.0 -25.9 -35.08 20.0 -1 300.0 -25.84 -35.14 20.0 -1 300.0 -25.76 -35.19 20.0 -1 300.0 -25.67 -35.24 20.0 -1 300.0 -25.56 -35.28 20.0 -1 300.0 -25.43 -35.33 20.0 -1 300.0 -25.29 -35.36 20.0 -1 300.0 -25.13 -35.4 20.0 -1 300.0 -24.96 -35.43 20.0 -1 300.0 -24.78 -35.45 20.0 -1 300.0 -24.58 -35.48 20.0 -1 300.0 -24.37 -35.5 20.0 -1 300.0 -24.14 -35.51 20.0 -1 300.0 -23.91 -35.52 20.0 -1 300.0 -23.66 -35.53 20.0 -1 300.0 -23.4 -35.53 20.0 -1 300.0 -23.13 -35.53 20.0 -1 300.0 -22.85 -35.53 20.0 -1 300.0 -22.56 -35.52 20.0 -1 300.0 -22.26 -35.51 20.0 -1 300.0 -21.95 -35.49 20.0 -1 300.0 -21.64 -35.47 20.0 -1 300.0 -21.31 -35.45 20.0 -1 300.0 -20.98 -35.42 20.0 -1 300.0 -20.64 -35.38 20.0 -1 300.0 -20.3 -35.35 20.0 -1 300.0 -19.95 -35.31 20.0 -1 300.0 -19.59 -35.26 20.0 -1 300.0 -19.24 -35.21 20.0 -1 300.0 -18.88 -35.16 20.0 -1 300.0 -18.51 -35.1 20.0 -1 300.0 -18.14 -35.04 20.0 -1 300.0 -17.78 -34.97 20.0 -1 300.0 -17.04 -34.83 20.0 -1 300.0 -16.67 -34.75 20.0 -1 300.0 -16.31 -34.67 20.0 -1 300.0 -15.58 -34.49 20.0 -1 300.0 -15.22 -34.4 20.0 -1 300.0 -14.87 -34.3 20.0 -1 300.0 -14.17 -34.09 20.0 -1 300.0 -13.83 -33.98 20.0 -1 300.0 -13.5 -33.86 20.0 -1 300.0 -13.18 -33.74 20.0 -1 300.0 -12.86 -33.62 20.0 -1 300.0 -12.55 -33.49 20.0 -1 300.0 -12.25 -33.36 20.0 -1 300.0 -11.68 -33.08 20.0 -1 300.0 -11.4 -32.94 20.0 -1 300.0 -11.14 -32.79 20.0 -1 300.0 -10.9 -32.64 20.0 -1 300.0 -10.66 -32.48 20.0 -1 300.0 -10.44 -32.33 20.0 -1 300.0 -10.22 -32.16 20.0 -1 300.0 -10.03 -32.0 20.0 -1 300.0 -9.84 -31.83 20.0 -1 300.0 -9.67 -31.65 20.0 -1 300.0 -9.51 -31.48 20.0 -1 300.0 -9.37 -31.3 20.0 -1 300.0 -9.24 -31.11 20.0 -1 300.0 -9.13 -30.92 20.0 -1 300.0 -9.03 -30.73 20.0 -1 300.0 -8.95 -30.54 20.0 -1 300.0 -8.88 -30.34 20.0 -1 300.0 -8.84 -30.14 20.0 -1 300.0 -8.8 -29.93 20.0 -1 300.0 -8.78 -29.73 20.0 -1 300.0 -8.78 -29.52 20.0 -1 300.0 -8.79 -29.3 20.0 -1 300.0 -8.82 -29.09 20.0 -1 300.0 -8.87 -28.87 20.0 -1 300.0 -8.93 -28.64 20.0 -1 300.0 -9.01 -28.43 20.0 -1 300.0 -9.09 -28.22 20.0 -1 300.0 -9.19 -28.01 20.0 -1 300.0 -9.31 -27.79 20.0 -1 300.0 -9.44 -27.57 20.0 -1 300.0 -9.58 -27.35 20.0 -1 300.0 -9.9 -26.9 20.0 -1 300.0 -10.08 -26.68 20.0 -1 300.0 -10.27 -26.45 20.0 -1 300.0 -10.69 -25.98 20.0 -1 300.0 -10.92 -25.75 20.0 -1 300.0 -11.16 -25.51 20.0 -1 300.0 -11.68 -25.03 20.0 -1 300.0 -11.95 -24.79 20.0 -1 300.0 -12.23 -24.55 20.0 -1 300.0 -12.82 -24.06 20.0 -1 300.0 -14.11 -23.07 20.0 -1 300.0 -17.0 -21.04 20.0 -1 300.0 -17.38 -20.78 20.0 -1 300.0 -17.76 -20.52 20.0 -1 300.0 -18.53 -20.01 20.0 -1 300.0 -20.08 -18.98 20.0 -1 300.0 -20.46 -18.72 20.0 -1 300.0 -20.84 -18.46 20.0 -1 300.0 -21.6 -17.95 20.0 -1 300.0 -23.07 -16.93 20.0 -1 300.0 -23.43 -16.67 20.0 -1 300.0 -23.78 -16.42 20.0 -1 300.0 -24.45 -15.91 20.0 -1 300.0 -25.72 -14.91 20.0 -1 300.0 -26.01 -14.66 20.0 -1 300.0 -26.3 -14.42 20.0 -1 300.0 -26.83 -13.93 20.0 -1 300.0 -27.09 -13.69 20.0 -1 300.0 -27.33 -13.45 20.0 -1 300.0 -27.78 -12.97 20.0 -1 300.0 -28.0 -12.71 20.0 -1 300.0 -28.21 -12.46 20.0 -1 300.0 -28.4 -12.21 20.0 -1 300.0 -28.58 -11.96 20.0 -1 300.0 -28.75 -11.71 20.0 -1 300.0 -28.89 -11.47 20.0 -1 300.0 -29.03 -11.23 20.0 -1 300.0 -29.14 -10.99 20.0 -1 300.0 -29.24 -10.75 20.0 -1 300.0 -29.32 -10.51 20.0 -1 300.0 -29.39 -10.28 20.0 -1 300.0 -29.44 -10.05 20.0 -1 300.0 -29.48 -9.82 20.0 -1 300.0 -29.49 -9.6 20.0 -1 300.0 -29.49 -9.38 20.0 -1 300.0 -29.48 -9.16 20.0 -1 300.0 -29.44 -8.95 20.0 -1 300.0 -29.39 -8.73 20.0 -1 300.0 -29.32 -8.53 20.0 -1 300.0 -29.24 -8.32 20.0 -1 300.0 -29.14 -8.12 20.0 -1 300.0 -29.03 -7.92 20.0 -1 300.0 -28.9 -7.72 20.0 -1 300.0 -28.75 -7.53 20.0 -1 300.0 -28.59 -7.34 20.0 -1 300.0 -28.42 -7.16 20.0 -1 300.0 -28.23 -6.97 20.0 -1 300.0 -28.02 -6.8 20.0 -1 300.0 -27.8 -6.62 20.0 -1 300.0 -27.57 -6.45 20.0 -1 300.0 -27.07 -6.12 20.0 -1 300.0 -26.8 -5.96 20.0 -1 300.0 -26.52 -5.8 20.0 -1 300.0 -25.93 -5.5 20.0 -1 300.0 -25.62 -5.36 20.0 -1 300.0 -25.3 -5.22 20.0 -1 300.0 -24.63 -4.95 20.0 -1 300.0 -24.28 -4.82 20.0 -1 300.0 -23.93 -4.69 20.0 -1 300.0 -23.21 -4.46 20.0 -1 300.0 -22.84 -4.34 20.0 -1 300.0 -22.46 -4.24 20.0 -1 300.0 -21.71 -4.03 20.0 -1 300.0 -21.32 -3.94 20.0 -1 300.0 -20.94 -3.84 20.0 -1 300.0 -20.17 -3.67 20.0 -1 300.0 -19.79 -3.59 20.0 -1 300.0 -19.4 -3.52 20.0 -1 300.0 -18.64 -3.38 20.0 -1 300.0 -18.27 -3.31 20.0 -1 300.0 -17.89 -3.25 20.0 -1 300.0 -17.53 -3.2 20.0 -1 300.0 -17.16 -3.15 20.0 -1 300.0 -16.81 -3.1 20.0 -1 300.0 -16.46 -3.06 20.0 -1 300.0 -16.12 -3.02 20.0 -1 300.0 -15.78 -2.98 20.0 -1 300.0 -15.48 -2.95 20.0 -1 300.0 -15.18 -2.92 20.0 -1 300.0 -14.89 -2.9 20.0 -1 300.0 -14.61 -2.88 20.0 -1 300.0 -14.34 -2.87 20.0 -1 300.0 -14.08 -2.85 20.0 -1 300.0 -13.83 -2.85 20.0 -1 300.0 -13.59 -2.84 20.0 -1 300.0 -13.36 -2.84 20.0 -1 300.0 -13.14 -2.84 20.0 -1 300.0 -12.93 -2.84 20.0 -1 300.0 -12.73 -2.85 20.0 -1 300.0 -12.55 -2.86 20.0 -1 300.0 -12.38 -2.87 20.0 -1 300.0 -12.22 -2.89 20.0 -1 300.0 -12.07 -2.91 20.0 -1 300.0 -11.94 -2.93 20.0 -1 300.0 -11.82 -2.96 20.0 -1 300.0 -11.72 -2.98 20.0 -1 300.0 -11.63 -3.01 20.0 -1 300.0 -11.55 -3.05 20.0 -1 300.0 -11.48 -3.08 20.0 -1 300.0 -11.44 -3.12 20.0 -1 300.0 -11.4 -3.17 20.0 -1 300.0 -11.38 -3.21 20.0 -1 300.0 -11.37 -3.26 20.0 -1 300.0 -11.38 -3.31 20.0 -1 300.0 -11.4 -3.36 20.0 -1 300.0 -11.44 -3.42 20.0 -1 300.0 -11.49 -3.47 20.0 -1 300.0 -11.56 -3.53 20.0 -1 300.0 -11.64 -3.59 20.0 -1 300.0 -11.73 -3.66 20.0 -1 300.0 -11.84 -3.72 20.0 -1 300.0 -11.96 -3.79 20.0 -1 300.0 -12.09 -3.86 20.0 -1 300.0 -12.24 -3.94 20.0 -1 300.0 -12.4 -4.01 20.0 -1 300.0 -12.77 -4.17 20.0 -1 300.0 -12.97 -4.25 20.0 -1 300.0 -13.18 -4.33 20.0 -1 300.0 -13.64 -4.5 20.0 -1 300.0 -14.69 -4.85 20.0 -1 300.0 -14.98 -4.94 20.0 -1 300.0 -15.28 -5.04 20.0 -1 300.0 -15.9 -5.22 20.0 -1 300.0 -17.23 -5.62 20.0 -1 300.0 -20.15 -6.43 20.0 -1 300.0 -20.52 -6.53 20.0 -1 300.0 -20.89 -6.63 20.0 -1 300.0 -21.63 -6.84 20.0 -1 300.0 -23.11 -7.24 20.0 -1 300.0 -25.89 -8.03 20.0 -1 300.0 -26.22 -8.12 20.0 -1 300.0 -26.54 -8.22 20.0 -1 300.0 -27.14 -8.4 20.0 -1 300.0 -28.26 -8.76 20.0 -1 300.0 -28.51 -8.85 20.0 -1 300.0 -28.76 -8.93 20.0 -1 300.0 -29.21 -9.1 20.0 -1 300.0 -29.43 -9.18 20.0 -1 300.0 -29.62 -9.25 20.0 -1 300.0 -29.99 -9.4 20.0 -1 300.0 -30.15 -9.48 20.0 -1 300.0 -30.3 -9.55 20.0 -1 300.0 -30.43 -9.62 20.0 -1 300.0 -30.56 -9.68 20.0 -1 300.0 -30.67 -9.75 20.0 -1 300.0 -30.77 -9.81 20.0 -1 300.0 -30.85 -9.87 20.0 -1 300.0 -30.92 -9.93 20.0 -1 300.0 -30.97 -9.99 20.0 -1 300.0 -31.02 -10.04 20.0 -1 300.0 -31.04 -10.09 20.0 -1 300.0 -31.06 -10.14 20.0 -1 300.0 -31.06 -10.19 20.0 -1 300.0 -31.04 -10.23 20.0 -1 300.0 -31.02 -10.27 20.0 -1 300.0 -30.97 -10.31 20.0 -1 300.0 -30.92 -10.35 20.0 -1 300.0 -30.85 -10.38 20.0 -1 300.0 -30.76 -10.41 20.0 -1 300.0 -30.67 -10.44 20.0 -1 300.0 -30.56 -10.47 20.0 -1 300.0 -30.43 -10.49 20.0 -1 300.0 -30.3 -10.51 20.0 -1 300.0 -30.15 -10.53 20.0 -1 300.0 -29.98 -10.54 20.0 -1 300.0 -29.81 -10.55 20.0 -1 300.0 -29.62 -10.56 20.0 -1 300.0 -29.42 -10.56 20.0 -1 300.0 -29.21 -10.56 20.0 -1 300.0 -28.99 -10.56 20.0 -1 300.0 -28.76 -10.56 20.0 -1 300.0 -28.52 -10.55 20.0 -1 300.0 -28.24 -10.54 20.0 -1 300.0 -27.95 -10.52 20.0 -1 300.0 -27.66 -10.5 20.0 -1 300.0 -27.35 -10.48 20.0 -1 300.0 -27.03 -10.45 20.0 -1 300.0 -26.7 -10.42 20.0 -1 300.0 -26.37 -10.38 20.0 -1 300.0 -26.02 -10.34 20.0 -1 300.0 -25.67 -10.3 20.0 -1 300.0 -25.31 -10.25 20.0 -1 300.0 -24.57 -10.15 20.0 -1 300.0 -24.19 -10.09 20.0 -1 300.0 -23.81 -10.02 20.0 -1 300.0 -23.03 -9.88 20.0 -1 300.0 -22.64 -9.81 20.0 -1 300.0 -22.25 -9.73 20.0 -1 300.0 -21.45 -9.56 20.0 -1 300.0 -21.06 -9.46 20.0 -1 300.0 -20.66 -9.37 20.0 -1 300.0 -19.88 -9.16 20.0 -1 300.0 -19.49 -9.05 20.0 -1 300.0 -19.1 -8.94 20.0 -1 300.0 -18.34 -8.7 20.0 -1 300.0 -17.97 -8.58 20.0 -1 300.0 -17.61 -8.45 20.0 -1 300.0 -16.9 -8.18 20.0 -1 300.0 -16.55 -8.04 20.0 -1 300.0 -16.22 -7.89 20.0 -1 300.0 -15.57 -7.59 20.0 -1 300.0 -15.27 -7.44 20.0 -1 300.0 -14.97 -7.28 20.0 -1 300.0 -14.41 -6.95 20.0 -1 300.0 -14.15 -6.77 20.0 -1 300.0 -13.9 -6.6 20.0 -1 300.0 -13.67 -6.42 20.0 -1 300.0 -13.45 -6.24 20.0 -1 300.0 -13.24 -6.05 20.0 -1 300.0 -13.04 -5.86 20.0 -1 300.0 -12.86 -5.67 20.0 -1 300.0 -12.7 -5.47 20.0 -1 300.0 -12.55 -5.27 20.0 -1 300.0 -12.41 -5.07 20.0 -1 300.0 -12.29 -4.86 20.0 -1 300.0 -12.19 -4.65 20.0 -1 300.0 -12.1 -4.44 20.0 -1 300.0 -12.03 -4.22 20.0 -1 300.0 -11.97 -4.0 20.0 -1 300.0 -11.94 -3.78 20.0 -1 300.0 -11.91 -3.56 20.0 -1 300.0 -11.9 -3.33 20.0 -1 300.0 -11.91 -3.1 20.0 -1 300.0 -11.94 -2.86 20.0 -1 300.0 -11.98 -2.63 20.0 -1 300.0 -12.04 -2.39 20.0 -1 300.0 -12.11 -2.14 20.0 -1 300.0 -12.2 -1.9 20.0 -1 300.0 -12.3 -1.67 20.0 -1 300.0 -12.41 -1.44 20.0 -1 300.0 -12.54 -1.2 20.0 -1 300.0 -12.68 -0.96 20.0 -1 300.0 -12.83 -0.73 20.0 -1 300.0 -12.99 -0.49 20.0 -1 300.0 -13.36 0.0 20.0 -1 300.0 -13.55 0.25 20.0 -1 300.0 -13.77 0.49 20.0 -1 300.0 -14.23 0.99 20.0 -1 300.0 -15.27 2.01 20.0 -1 300.0 -15.55 2.27 20.0 -1 300.0 -15.84 2.52 20.0 -1 300.0 -16.45 3.04 20.0 -1 300.0 -17.75 4.09 20.0 -1 300.0 -20.57 6.22 20.0 -1 300.0 -20.93 6.49 20.0 -1 300.0 -21.3 6.75 20.0 -1 300.0 -22.02 7.29 20.0 -1 300.0 -23.46 8.35 20.0 -1 300.0 -23.81 8.62 20.0 -1 300.0 -24.15 8.88 20.0 -1 300.0 -24.84 9.41 20.0 -1 300.0 -26.13 10.46 20.0 -1 300.0 -26.43 10.72 20.0 -1 300.0 -26.73 10.97 20.0 -1 300.0 -27.3 11.49 20.0 -1 300.0 -27.57 11.74 20.0 -1 300.0 -27.83 12.0 20.0 -1 300.0 -28.32 12.5 20.0 -1 300.0 -28.55 12.75 20.0 -1 300.0 -28.77 13.0 20.0 -1 300.0 -28.98 13.24 20.0 -1 300.0 -29.17 13.49 20.0 -1 300.0 -29.36 13.73 20.0 -1 300.0 -29.53 13.97 20.0 -1 300.0 -29.69 14.21 20.0 -1 300.0 -29.83 14.45 20.0 -1 300.0 -29.97 14.7 20.0 -1 300.0 -30.1 14.95 20.0 -1 300.0 -30.21 15.2 20.0 -1 300.0 -30.31 15.45 20.0 -1 300.0 -30.39 15.69 20.0 -1 300.0 -30.45 15.94 20.0 -1 300.0 -30.49 16.18 20.0 -1 300.0 -30.52 16.41 20.0 -1 300.0 -30.53 16.64 20.0 -1 300.0 -30.53 16.87 20.0 -1 300.0 -30.5 17.1 20.0 -1 300.0 -30.47 17.33 20.0 -1 300.0 -30.41 17.55 20.0 -1 300.0 -30.34 17.77 20.0 -1 300.0 -30.25 17.98 20.0 -1 300.0 -30.14 18.19 20.0 -1 300.0 -30.02 18.4 20.0 -1 300.0 -29.88 18.6 20.0 -1 300.0 -29.73 18.8 20.0 -1 300.0 -29.56 19.0 20.0 -1 300.0 -29.38 19.2 20.0 -1 300.0 -29.18 19.39 20.0 -1 300.0 -28.96 19.57 20.0 -1 300.0 -28.73 19.76 20.0 -1 300.0 -28.49 19.93 20.0 -1 300.0 -28.23 20.11 20.0 -1 300.0 -27.96 20.28 20.0 -1 300.0 -27.68 20.45 20.0 -1 300.0 -27.39 20.61 20.0 -1 300.0 -27.08 20.77 20.0 -1 300.0 -26.43 21.08 20.0 -1 300.0 -26.1 21.23 20.0 -1 300.0 -25.75 21.37 20.0 -1 300.0 -25.02 21.65 20.0 -1 300.0 -24.65 21.78 20.0 -1 300.0 -24.27 21.91 20.0 -1 300.0 -23.49 22.15 20.0 -1 300.0 -23.09 22.26 20.0 -1 300.0 -22.69 22.38 20.0 -1 300.0 -21.88 22.58 20.0 -1 300.0 -21.47 22.68 20.0 -1 300.0 -21.05 22.77 20.0 -1 300.0 -20.22 22.95 20.0 -1 300.0 -19.81 23.03 20.0 -1 300.0 -19.4 23.11 20.0 -1 300.0 -18.57 23.25 20.0 -1 300.0 -18.17 23.31 20.0 -1 300.0 -17.77 23.37 20.0 -1 300.0 -16.98 23.48 20.0 -1 300.0 -16.59 23.52 20.0 -1 300.0 -16.21 23.57 20.0 -1 300.0 -15.84 23.61 20.0 -1 300.0 -15.47 23.64 20.0 -1 300.0 -15.12 23.67 20.0 -1 300.0 -14.77 23.7 20.0 -1 300.0 -14.43 23.72 20.0 -1 300.0 -14.1 23.74 20.0 -1 300.0 -13.79 23.75 20.0 -1 300.0 -13.49 23.76 20.0 -1 300.0 -13.2 23.77 20.0 -1 300.0 -12.92 23.77 20.0 -1 300.0 -12.66 23.77 20.0 -1 300.0 -12.4 23.77 20.0 -1 300.0 -12.16 23.76 20.0 -1 300.0 -11.94 23.75 20.0 -1 300.0 -11.72 23.73 20.0 -1 300.0 -11.53 23.71 20.0 -1 300.0 -11.34 23.69 20.0 -1 300.0 -11.17 23.66 20.0 -1 300.0 -11.02 23.63 20.0 -1 300.0 -10.88 23.6 20.0 -1 300.0 -10.75 23.56 20.0 -1 300.0 -10.64 23.52 20.0 -1 300.0 -10.55 23.48 20.0 -1 300.0 -10.47 23.43 20.0 -1 300.0 -10.41 23.39 20.0 -1 300.0 -10.37 23.33 20.0 -1 300.0 -10.34 23.28 20.0 -1 300.0 -10.32 23.22 20.0 -1 300.0 -10.33 23.16 20.0 -1 300.0 -10.34 23.1 20.0 -1 300.0 -10.38 23.03 20.0 -1 300.0 -10.43 22.96 20.0 -1 300.0 -10.5 22.89 20.0 -1 300.0 -10.58 22.82 20.0 -1 300.0 -10.68 22.74 20.0 -1 300.0 -10.79 22.66 20.0 -1 300.0 -10.92 22.58 20.0 -1 300.0 -11.06 22.49 20.0 -1 300.0 -11.22 22.41 20.0 -1 300.0 -11.39 22.32 20.0 -1 300.0 -11.77 22.14 20.0 -1 300.0 -11.98 22.04 20.0 -1 300.0 -12.21 21.95 20.0 -1 300.0 -12.7 21.75 20.0 -1 300.0 -12.96 21.64 20.0 -1 300.0 -13.23 21.54 20.0 -1 300.0 -13.81 21.33 20.0 -1 300.0 -15.07 20.89 20.0 -1 300.0 -15.4 20.78 20.0 -1 300.0 -15.74 20.67 20.0 -1 300.0 -16.44 20.44 20.0 -1 300.0 -17.9 19.98 20.0 -1 300.0 -20.87 19.04 20.0 -1 300.0 -21.21 18.93 20.0 -1 300.0 -21.55 18.82 20.0 -1 300.0 -22.21 18.6 20.0 -1 300.0 -23.47 18.17 20.0 -1 300.0 -23.77 18.07 20.0 -1 300.0 -24.07 17.96 20.0 -1 300.0 -24.63 17.76 20.0 -1 300.0 -25.65 17.36 20.0 -1 300.0 -25.88 17.27 20.0 -1 300.0 -26.1 17.17 20.0 -1 300.0 -26.51 16.98 20.0 -1 300.0 -26.7 16.89 20.0 -1 300.0 -26.87 16.8 20.0 -1 300.0 -27.18 16.63 20.0 -1 300.0 -27.32 16.55 20.0 -1 300.0 -27.45 16.46 20.0 -1 300.0 -27.56 16.39 20.0 -1 300.0 -27.66 16.31 20.0 -1 300.0 -27.74 16.23 20.0 -1 300.0 -27.82 16.16 20.0 -1 300.0 -27.87 16.08 20.0 -1 300.0 -27.92 16.01 20.0 -1 300.0 -27.95 15.95 20.0 -1 300.0 -27.96 15.88 20.0 -1 300.0 -27.96 15.82 20.0 -1 300.0 -27.95 15.76 20.0 -1 300.0 -27.93 15.7 20.0 -1 300.0 -27.89 15.64 20.0 -1 300.0 -27.83 15.59 20.0 -1 300.0 -27.76 15.54 20.0 -1 300.0 -27.68 15.49 20.0 -1 300.0 -27.59 15.44 20.0 -1 300.0 -27.48 15.4 20.0 -1 300.0 -27.35 15.36 20.0 -1 300.0 -27.21 15.32 20.0 -1 300.0 -27.06 15.29 20.0 -1 300.0 -26.9 15.25 20.0 -1 300.0 -26.72 15.22 20.0 -1 300.0 -26.53 15.2 20.0 -1 300.0 -26.33 15.17 20.0 -1 300.0 -26.12 15.15 20.0 -1 300.0 -25.89 15.14 20.0 -1 300.0 -25.65 15.12 20.0 -1 300.0 -25.41 15.11 20.0 -1 300.0 -25.14 15.1 20.0 -1 300.0 -24.88 15.1 20.0 -1 300.0 -24.59 15.1 20.0 -1 300.0 -24.3 15.1 20.0 -1 300.0 -24.0 15.1 20.0 -1 300.0 -23.69 15.11 20.0 -1 300.0 -23.38 15.12 20.0 -1 300.0 -23.05 15.13 20.0 -1 300.0 -22.72 15.15 20.0 -1 300.0 -22.38 15.17 20.0 -1 300.0 -22.0 15.2 20.0 -1 300.0 -21.61 15.23 20.0 -1 300.0 -21.22 15.26 20.0 -1 300.0 -20.82 15.3 20.0 -1 300.0 -20.42 15.34 20.0 -1 300.0 -20.01 15.38 20.0 -1 300.0 -19.18 15.49 20.0 -1 300.0 -18.76 15.55 20.0 -1 300.0 -18.34 15.61 20.0 -1 300.0 -17.49 15.74 20.0 -1 300.0 -17.07 15.82 20.0 -1 300.0 -16.64 15.9 20.0 -1 300.0 -15.8 16.06 20.0 -1 300.0 -15.38 16.15 20.0 -1 300.0 -14.97 16.25 20.0 -1 300.0 -14.15 16.45 20.0 -1 300.0 -13.75 16.55 20.0 -1 300.0 -13.35 16.66 20.0 -1 300.0 -12.58 16.89 20.0 -1 300.0 -12.21 17.02 20.0 -1 300.0 -11.84 17.14 20.0 -1 300.0 -11.14 17.41 20.0 -1 300.0 -10.8 17.54 20.0 -1 300.0 -10.48 17.68 20.0 -1 300.0 -9.86 17.98 20.0 -1 300.0 -9.57 18.13 20.0 -1 300.0 -9.29 18.28 20.0 -1 300.0 -9.02 18.44 20.0 -1 300.0 -8.77 18.6 20.0 -1 300.0 -8.53 18.77 20.0 -1 300.0 -8.3 18.94 20.0 -1 300.0 -8.09 19.11 20.0 -1 300.0 -7.9 19.29 20.0 -1 300.0 -7.72 19.47 20.0 -1 300.0 -7.55 19.65 20.0 -1 300.0 -7.4 19.84 20.0 -1 300.0 -7.27 20.03 20.0 -1 300.0 -7.15 20.22 20.0 -1 300.0 -7.05 20.42 20.0 -1 300.0 -6.96 20.62 20.0 -1 300.0 -6.89 20.82 20.0 -1 300.0 -6.84 21.02 20.0 -1 300.0 -6.81 21.23 20.0 -1 300.0 -6.79 21.44 20.0 -1 300.0 -6.78 21.65 20.0 -1 300.0 -6.8 21.87 20.0 -1 300.0 -6.83 22.09 20.0 -1 300.0 -6.87 22.31 20.0 -1 300.0 -6.93 22.53 20.0 -1 300.0 -7.01 22.76 20.0 -1 300.0 -7.1 22.99 20.0 -1 300.0 -7.21 23.22 20.0 -1 300.0 -7.34 23.45 20.0 -1 300.0 -7.48 23.68 20.0 -1 300.0 -7.63 23.92 20.0 -1 300.0 -7.98 24.4 20.0 -1 300.0 -8.16 24.63 20.0 -1 300.0 -8.36 24.86 20.0 -1 300.0 -8.78 25.32 20.0 -1 300.0 -9.75 26.25 20.0 -1 300.0 -10.02 26.49 20.0 -1 300.0 -10.29 26.73 20.0 -1 300.0 -10.86 27.2 20.0 -1 300.0 -12.09 28.17 20.0 -1 300.0 -12.41 28.41 20.0 -1 300.0 -12.73 28.66 20.0 -1 300.0 -13.39 29.14 20.0 -1 300.0 -14.75 30.12 20.0 -1 300.0 -17.46 32.08 20.0 -1 300.0 -17.79 32.32 20.0 -1 300.0 -18.11 32.56 20.0 -1 300.0 -18.74 33.04 20.0 -1 300.0 -19.93 33.99 20.0 -1 300.0 -20.21 34.23 20.0 -1 300.0 -20.48 34.46 20.0 -1 300.0 -21.0 34.93 20.0 -1 300.0 -21.24 35.16 20.0 -1 300.0 -21.47 35.39 20.0 -1 300.0 -21.91 35.84 20.0 -1 300.0 -22.11 36.06 20.0 -1 300.0 -22.3 36.28 20.0 -1 300.0 -22.48 36.51 20.0 -1 300.0 -22.65 36.72 20.0 -1 300.0 -22.8 36.94 20.0 -1 300.0 -22.94 37.16 20.0 -1 300.0 -23.07 37.37 20.0 -1 300.0 -23.18 37.58 20.0 -1 300.0 -23.29 37.79 20.0 -1 300.0 -23.37 37.99 20.0 -1 300.0 -23.45 38.2 20.0 -1 300.0 -23.51 38.4 20.0 -1 300.0 -23.55 38.6 20.0 -1 300.0 -23.59 38.8 20.0 -1 300.0 -23.6 38.99 20.0 -1 300.0 -23.61 39.18 20.0 -1 300.0 -23.59 39.39 20.0 -1 300.0 -23.56 39.59 20.0 -1 300.0 -23.52 39.79 20.0 -1 300.0 -23.45 39.98 20.0 -1 300.0 -23.37 40.17 20.0 -1 300.0 -23.27 40.36 20.0 -1 300.0 -23.16 40.55 20.0 -1 300.0 -23.03 40.73 20.0 -1 300.0 -22.88 40.91 20.0 -1 300.0 -22.72 41.09 20.0 -1 300.0 -22.54 41.26 20.0 -1 300.0 -22.34 41.42 20.0 -1 300.0 -22.13 41.59 20.0 -1 300.0 -21.91 41.75 20.0 -1 300.0 -21.67 41.91 20.0 -1 300.0 -21.41 42.06 20.0 -1 300.0 -21.14 42.21 20.0 -1 300.0 -20.86 42.35 20.0 -1 300.0 -20.57 42.49 20.0 -1 300.0 -20.26 42.63 20.0 -1 300.0 -19.94 42.76 20.0 -1 300.0 -19.6 42.89 20.0 -1 300.0 -18.91 43.14 20.0 -1 300.0 -18.54 43.25 20.0 -1 300.0 -18.17 43.37 20.0 -1 300.0 -17.79 43.47 20.0 -1 300.0 -17.39 43.58 20.0 -1 300.0 -17.0 43.68 20.0 -1 300.0 -16.59 43.77 20.0 -1 300.0 -15.76 43.95 20.0 -1 300.0 -15.34 44.03 20.0 -1 300.0 -14.91 44.11 20.0 -1 300.0 -14.48 44.18 20.0 -1 300.0 -14.04 44.25 20.0 -1 300.0 -13.61 44.32 20.0 -1 300.0 -13.17 44.38 20.0 -1 300.0 -12.29 44.49 20.0 -1 300.0 -11.85 44.53 20.0 -1 300.0 -11.41 44.58 20.0 -1 300.0 -10.98 44.62 20.0 -1 300.0 -10.55 44.65 20.0 -1 300.0 -10.12 44.68 20.0 -1 300.0 -9.69 44.7 20.0 -1 300.0 -9.27 44.73 20.0 -1 300.0 -8.86 44.74 20.0 -1 300.0 -8.45 44.76 20.0 -1 300.0 -8.04 44.76 20.0 -1 300.0 -7.65 44.77 20.0 -1 300.0 -7.26 44.77 20.0 -1 300.0 -6.88 44.76 20.0 -1 300.0 -6.52 44.75 20.0 -1 300.0 -6.16 44.74 20.0 -1 300.0 -5.81 44.72 20.0 -1 300.0 -5.47 44.7 20.0 -1 300.0 -5.14 44.68 20.0 -1 300.0 -4.83 44.65 20.0 -1 300.0 -4.53 44.61 20.0 -1 300.0 -4.24 44.58 20.0 -1 300.0 -3.96 44.53 20.0 -1 300.0 -3.7 44.49 20.0 -1 300.0 -3.46 44.44 20.0 -1 300.0 -3.23 44.39 20.0 -1 300.0 -3.01 44.33 20.0 -1 300.0 -2.81 44.27 20.0 -1 300.0 -2.63 44.21 20.0 -1 300.0 -2.46 44.14 20.0 -1 300.0 -2.31 44.07 20.0 -1 300.0 -2.17 44.0 20.0 -1 300.0 -2.04 43.92 20.0 -1 300.0 -1.94 43.84 20.0 -1 300.0 -1.85 43.76 20.0 -1 300.0 -1.77 43.67 20.0 -1 300.0 -1.72 43.59 20.0 -1 300.0 -1.67 43.49 20.0 -1 300.0 -1.65 43.4 20.0 -1 300.0 -1.64 43.3 20.0 -1 300.0 -1.65 43.2 20.0 -1 300.0 -1.67 43.09 20.0 -1 300.0 -1.71 42.99 20.0 -1 300.0 -1.76 42.88 20.0 -1 300.0 -1.83 42.77 20.0 -1 300.0 -1.92 42.65 20.0 -1 300.0 -2.02 42.53 20.0 -1 300.0 -2.13 42.41 20.0 -1 300.0 -2.27 42.29 20.0 -1 300.0 -2.41 42.17 20.0 -1 300.0 -2.57 42.04 20.0 -1 300.0 -2.93 41.78 20.0 -1 300.0 -3.13 41.65 20.0 -1 300.0 -3.35 41.51 20.0 -1 300.0 -3.81 41.23 20.0 -1 300.0 -4.06 41.09 20.0 -1 300.0 -4.32 40.95 20.0 -1 300.0 -4.87 40.66 20.0 -1 300.0 -6.08 40.07 20.0 -1 300.0 -8.79 38.84 20.0 -1 300.0 -9.14 38.68 20.0 -1 300.0 -9.49 38.53 20.0 -1 300.0 -10.21 38.21 20.0 -1 300.0 -11.61 37.58 20.0 -1 300.0 -14.21 36.34 20.0 -1 300.0 -14.49 36.2 20.0 -1 300.0 -14.76 36.06 20.0 -1 300.0 -15.26 35.78 20.0 -1 300.0 -15.5 35.65 20.0 -1 300.0 -15.73 35.51 20.0 -1 300.0 -16.16 35.24 20.0 -1 300.0 -16.36 35.11 20.0 -1 300.0 -16.55 34.98 20.0 -1 300.0 -16.73 34.84 20.0 -1 300.0 -16.89 34.72 20.0 -1 300.0 -17.05 34.59 20.0 -1 300.0 -17.19 34.47 20.0 -1 300.0 -17.32 34.34 20.0 -1 300.0 -17.43 34.22 20.0 -1 300.0 -17.54 34.1 20.0 -1 300.0 -17.63 33.98 20.0 -1 300.0 -17.7 33.87 20.0 -1 300.0 -17.76 33.75 20.0 -1 300.0 -17.81 33.64 20.0 -1 300.0 -17.85 33.53 20.0 -1 300.0 -17.87 33.42 20.0 -1 300.0 -17.88 33.31 20.0 -1 300.0 -17.87 33.21 20.0 -1 300.0 -17.84 33.11 20.0 -1 300.0 -17.81 33.01 20.0 -1 300.0 -17.76 32.91 20.0 -1 300.0 -17.7 32.82 20.0 -1 300.0 -17.62 32.73 20.0 -1 300.0 -17.52 32.64 20.0 -1 300.0 -17.42 32.55 20.0 -1 300.0 -17.3 32.47 20.0 -1 300.0 -17.16 32.39 20.0 -1 300.0 -17.01 32.31 20.0 -1 300.0 -16.85 32.23 20.0 -1 300.0 -16.68 32.16 20.0 -1 300.0 -16.49 32.09 20.0 -1 300.0 -16.29 32.02 20.0 -1 300.0 -16.07 31.96 20.0 -1 300.0 -15.85 31.89 20.0 -1 300.0 -15.61 31.84 20.0 -1 300.0 -15.36 31.78 20.0 -1 300.0 -15.1 31.73 20.0 -1 300.0 -14.83 31.68 20.0 -1 300.0 -14.54 31.63 20.0 -1 300.0 -14.25 31.59 20.0 -1 300.0 -13.95 31.55 20.0 -1 300.0 -13.63 31.51 20.0 -1 300.0 -13.31 31.48 20.0 -1 300.0 -12.98 31.44 20.0 -1 300.0 -12.64 31.42 20.0 -1 300.0 -12.29 31.39 20.0 -1 300.0 -11.93 31.37 20.0 -1 300.0 -11.57 31.35 20.0 -1 300.0 -11.2 31.34 20.0 -1 300.0 -10.82 31.33 20.0 -1 300.0 -10.44 31.32 20.0 -1 300.0 -10.06 31.31 20.0 -1 300.0 -9.67 31.31 20.0 -1 300.0 -9.27 31.32 20.0 -1 300.0 -8.87 31.32 20.0 -1 300.0 -8.47 31.33 20.0 -1 300.0 -8.07 31.34 20.0 -1 300.0 -7.63 31.36 20.0 -1 300.0 -7.19 31.38 20.0 -1 300.0 -6.75 31.4 20.0 -1 300.0 -6.3 31.43 20.0 -1 300.0 -5.86 31.47 20.0 -1 300.0 -5.42 31.5 20.0 -1 300.0 -4.98 31.54 20.0 -1 300.0 -4.55 31.59 20.0 -1 300.0 -4.11 31.64 20.0 -1 300.0 -3.68 31.69 20.0 -1 300.0 -3.26 31.75 20.0 -1 300.0 -2.84 31.81 20.0 -1 300.0 -2.43 31.87 20.0 -1 300.0 -2.02 31.94 20.0 -1 300.0 -1.23 32.09 20.0 -1 300.0 -0.85 32.17 20.0 -1 300.0 -0.47 32.26 20.0 -1 300.0 -0.11 32.34 20.0 -1 300.0 0.24 32.43 20.0 -1 300.0 0.59 32.53 20.0 -1 300.0 0.92 32.63 20.0 -1 300.0 1.55 32.84 20.0 -1 300.0 1.84 32.95 20.0 -1 300.0 2.12 33.06 20.0 -1 300.0 2.39 33.18 20.0 -1 300.0 2.65 33.3 20.0 -1 300.0 2.89 33.42 20.0 -1 300.0 3.11 33.55 20.0 -1 300.0 3.32 33.68 20.0 -1 300.0 3.52 33.81 20.0 -1 300.0 3.7 33.95 20.0 -1 300.0 3.86 34.09 20.0 -1 300.0 4.01 34.24 20.0 -1 300.0 4.14 34.38 20.0 -1 300.0 4.26 34.53 20.0 -1 300.0 4.36 34.69 20.0 -1 300.0 4.44 34.84 20.0 -1 300.0 4.5 35.0 20.0 -1 300.0 4.55 35.16 20.0 -1 300.0 4.59 35.33 20.0 -1 300.0 4.6 35.49 20.0 -1 300.0 4.6 35.66 20.0 -1 300.0 4.58 35.83 20.0 -1 300.0 4.55 36.01 20.0 -1 300.0 4.5 36.19 20.0 -1 300.0 4.43 36.36 20.0 -1 300.0 4.35 36.55 20.0 -1 300.0 4.25 36.73 20.0 -1 300.0 4.14 36.92 20.0 -1 300.0 4.01 37.1 20.0 -1 300.0 3.87 37.29 20.0 -1 300.0 3.71 37.49 20.0 -1 300.0 3.36 37.88 20.0 -1 300.0 3.16 38.07 20.0 -1 300.0 2.94 38.27 20.0 -1 300.0 2.48 38.67 20.0 -1 300.0 1.43 39.5 20.0 -1 300.0 1.16 39.69 20.0 -1 300.0 0.88 39.88 20.0 -1 300.0 0.3 40.28 20.0 -1 300.0 -0.93 41.07 20.0 -1 300.0 -3.54 42.67 20.0 -1 300.0 -3.87 42.87 20.0 -1 300.0 -4.2 43.07 20.0 -1 300.0 -4.86 43.46 20.0 -1 300.0 -6.14 44.25 20.0 -1 300.0 -6.44 44.45 20.0 -1 300.0 -6.75 44.64 20.0 -1 300.0 -7.34 45.03 20.0 -1 300.0 -8.43 45.79 20.0 -1 300.0 -8.68 45.98 20.0 -1 300.0 -8.93 46.16 20.0 -1 300.0 -9.38 46.53 20.0 -1 300.0 -9.6 46.71 20.0 -1 300.0 -9.8 46.89 20.0 -1 300.0 -10.17 47.24 20.0 -1 300.0 -10.34 47.41 20.0 -1 300.0 -10.49 47.59 20.0 -1 300.0 -10.64 47.76 20.0 -1 300.0 -10.77 47.92 20.0 -1 300.0 -10.88 48.09 20.0 -1 300.0 -10.99 48.26 20.0 -1 300.0 -11.08 48.42 20.0 -1 300.0 -11.15 48.58 20.0 -1 300.0 -11.22 48.73 20.0 -1 300.0 -11.27 48.89 20.0 -1 300.0 -11.3 49.04 20.0 -1 300.0 -11.32 49.19 20.0 -1 300.0 -11.33 49.34 20.0 -1 300.0 -11.32 49.48 20.0 -1 300.0 -11.3 49.62 20.0 -1 300.0 -11.26 49.76 20.0 -1 300.0 -11.21 49.9 20.0 -1 300.0 -11.14 50.03 20.0 -1 300.0 -11.06 50.16 20.0 -1 300.0 -10.96 50.29 20.0 -1 300.0 -10.85 50.42 20.0 -1 300.0 -10.73 50.54 20.0 -1 300.0 -10.59 50.66 20.0 -1 300.0 -10.44 50.77 20.0 -1 300.0 -10.28 50.89 20.0 -1 300.0 -10.1 50.99 20.0 -1 300.0 -9.91 51.1 20.0 -1 300.0 -9.71 51.2 20.0 -1 300.0 -9.5 51.3 20.0 -1 300.0 -9.27 51.39 20.0 -1 300.0 -8.78 51.57 20.0 -1 300.0 -8.52 51.66 20.0 -1 300.0 -8.25 51.74 20.0 -1 300.0 -7.97 51.82 20.0 -1 300.0 -7.67 51.9 20.0 -1 300.0 -7.37 51.97 20.0 -1 300.0 -7.06 52.04 20.0 -1 300.0 -6.41 52.16 20.0 -1 300.0 -6.07 52.22 20.0 -1 300.0 -5.72 52.28 20.0 -1 300.0 -5.37 52.33 20.0 -1 300.0 -5.01 52.38 20.0 -1 300.0 -4.64 52.42 20.0 -1 300.0 -4.26 52.46 20.0 -1 300.0 -3.89 52.5 20.0 -1 300.0 -3.5 52.53 20.0 -1 300.0 -3.11 52.56 20.0 -1 300.0 -2.72 52.59 20.0 -1 300.0 -2.32 52.61 20.0 -1 300.0 -1.92 52.63 20.0 -1 300.0 -1.52 52.65 20.0 -1 300.0 -1.12 52.66 20.0 -1 300.0 -0.71 52.67 20.0 -1 300.0 -0.3 52.67 20.0 -1 300.0 0.1 52.67 20.0 -1 300.0 0.51 52.67 20.0 -1 300.0 0.92 52.66 20.0 -1 300.0 1.32 52.65 20.0 -1 300.0 1.72 52.64 20.0 -1 300.0 2.13 52.62 20.0 -1 300.0 2.52 52.6 20.0 -1 300.0 2.92 52.58 20.0 -1 300.0 3.31 52.55 20.0 -1 300.0 3.7 52.52 20.0 -1 300.0 4.08 52.48 20.0 -1 300.0 4.46 52.44 20.0 -1 300.0 4.83 52.4 20.0 -1 300.0 5.19 52.35 20.0 -1 300.0 5.55 52.3 20.0 -1 300.0 5.9 52.25 20.0 -1 300.0 6.24 52.19 20.0 -1 300.0 6.58 52.13 20.0 -1 300.0 6.9 52.07 20.0 -1 300.0 7.22 52.0 20.0 -1 300.0 7.53 51.93 20.0 -1 300.0 7.82 51.86 20.0 -1 300.0 8.39 51.7 20.0 -1 300.0 8.66 51.62 20.0 -1 300.0 8.91 51.53 20.0 -1 300.0 9.15 51.44 20.0 -1 300.0 9.39 51.35 20.0 -1 300.0 9.61 51.25 20.0 -1 300.0 9.81 51.15 20.0 -1 300.0 10.01 51.05 20.0 -1 300.0 10.19 50.94 20.0 -1 300.0 10.37 50.82 20.0 -1 300.0 10.54 50.7 20.0 -1 300.0 10.69 50.57 20.0 -1 300.0 10.83 50.44 20.0 -1 300.0 10.95 50.31 20.0 -1 300.0 11.05 50.17 20.0 -1 300.0 11.14 50.04 20.0 -1 300.0 11.21 49.89 20.0 -1 300.0 11.26 49.75 20.0 -1 300.0 11.3 49.6 20.0 -1 300.0 11.32 49.45 20.0 -1 300.0 11.33 49.29 20.0 -1 300.0 11.32 49.14 20.0 -1 300.0 11.29 48.98 20.0 -1 300.0 11.24 48.81 20.0 -1 300.0 11.19 48.65 20.0 -1 300.0 11.11 48.48 20.0 -1 300.0 11.02 48.31 20.0 -1 300.0 10.91 48.13 20.0 -1 300.0 10.79 47.96 20.0 -1 300.0 10.65 47.78 20.0 -1 300.0 10.5 47.6 20.0 -1 300.0 10.16 47.23 20.0 -1 300.0 9.97 47.04 20.0 -1 300.0 9.76 46.85 20.0 -1 300.0 9.31 46.47 20.0 -1 300.0 8.28 45.68 20.0 -1 300.0 8.0 45.48 20.0 -1 300.0 7.71 45.28 20.0 -1 300.0 7.1 44.87 20.0 -1 300.0 5.8 44.04 20.0 -1 300.0 3.01 42.35 20.0 -1 300.0 2.66 42.14 20.0 -1 300.0 2.31 41.92 20.0 -1 300.0 1.62 41.5 20.0 -1 300.0 0.27 40.65 20.0 -1 300.0 -0.05 40.44 20.0 -1 300.0 -0.36 40.23 20.0 -1 300.0 -0.97 39.82 20.0 -1 300.0 -2.09 38.99 20.0 -1 300.0 -2.32 38.8 20.0 -1 300.0 -2.55 38.62 20.0 -1 300.0 -2.97 38.24 20.0 -1 300.0 -3.17 38.06 20.0 -1 300.0 -3.35 37.88 20.0 -1 300.0 -3.69 37.52 20.0 -1 300.0 -3.84 37.34 20.0 -1 300.0 -3.97 37.16 20.0 -1 300.0 -4.1 36.99 20.0 -1 300.0 -4.21 36.81 20.0 -1 300.0 -4.3 36.64 20.0 -1 300.0 -4.39 36.47 20.0 -1 300.0 -4.46 36.3 20.0 -1 300.0 -4.51 36.14 20.0 -1 300.0 -4.56 35.98 20.0 -1 300.0 -4.59 35.81 20.0 -1 300.0 -4.6 35.66 20.0 -1 300.0 -4.6 35.5 20.0 -1 300.0 -4.59 35.34 20.0 -1 300.0 -4.56 35.19 20.0 -1 300.0 -4.52 35.04 20.0 -1 300.0 -4.46 34.89 20.0 -1 300.0 -4.39 34.75 20.0 -1 300.0 -4.31 34.6 20.0 -1 300.0 -4.21 34.47 20.0 -1 300.0 -4.09 34.33 20.0 -1 300.0 -3.97 34.19 20.0 -1 300.0 -3.83 34.06 20.0 -1 300.0 -3.67 33.93 20.0 -1 300.0 -3.5 33.8 20.0 -1 300.0 -3.32 33.68 20.0 -1 300.0 -3.13 33.56 20.0 -1 300.0 -2.92 33.44 20.0 -1 300.0 -2.7 33.32 20.0 -1 300.0 -2.47 33.21 20.0 -1 300.0 -2.22 33.1 20.0 -1 300.0 -1.7 32.89 20.0 -1 300.0 -1.42 32.79 20.0 -1 300.0 -1.13 32.7 20.0 -1 300.0 -0.83 32.6 20.0 -1 300.0 -0.52 32.51 20.0 -1 300.0 -0.2 32.42 20.0 -1 300.0 0.13 32.34 20.0 -1 300.0 0.81 32.18 20.0 -1 300.0 1.17 32.1 20.0 -1 300.0 1.53 32.03 20.0 -1 300.0 1.9 31.96 20.0 -1 300.0 2.27 31.9 20.0 -1 300.0 2.65 31.84 20.0 -1 300.0 3.04 31.78 20.0 -1 300.0 3.82 31.67 20.0 -1 300.0 4.22 31.63 20.0 -1 300.0 4.62 31.58 20.0 -1 300.0 5.03 31.54 20.0 -1 300.0 5.43 31.5 20.0 -1 300.0 5.84 31.47 20.0 -1 300.0 6.25 31.44 20.0 -1 300.0 6.66 31.41 20.0 -1 300.0 7.07 31.39 20.0 -1 300.0 7.51 31.36 20.0 -1 300.0 7.96 31.34 20.0 -1 300.0 8.4 31.33 20.0 -1 300.0 8.84 31.32 20.0 -1 300.0 9.27 31.32 20.0 -1 300.0 9.7 31.31 20.0 -1 300.0 10.12 31.32 20.0 -1 300.0 10.54 31.32 20.0 -1 300.0 10.96 31.33 20.0 -1 300.0 11.36 31.34 20.0 -1 300.0 11.76 31.36 20.0 -1 300.0 12.15 31.38 20.0 -1 300.0 12.53 31.41 20.0 -1 300.0 12.91 31.44 20.0 -1 300.0 13.27 31.47 20.0 -1 300.0 13.62 31.51 20.0 -1 300.0 13.96 31.55 20.0 -1 300.0 14.29 31.59 20.0 -1 300.0 14.61 31.64 20.0 -1 300.0 14.92 31.69 20.0 -1 300.0 15.21 31.75 20.0 -1 300.0 15.49 31.81 20.0 -1 300.0 15.75 31.87 20.0 -1 300.0 16.0 31.94 20.0 -1 300.0 16.24 32.01 20.0 -1 300.0 16.46 32.08 20.0 -1 300.0 16.67 32.16 20.0 -1 300.0 16.86 32.23 20.0 -1 300.0 17.03 32.32 20.0 -1 300.0 17.19 32.4 20.0 -1 300.0 17.33 32.49 20.0 -1 300.0 17.46 32.59 20.0 -1 300.0 17.57 32.68 20.0 -1 300.0 17.66 32.78 20.0 -1 300.0 17.74 32.88 20.0 -1 300.0 17.8 32.99 20.0 -1 300.0 17.84 33.09 20.0 -1 300.0 17.87 33.2 20.0 -1 300.0 17.88 33.32 20.0 -1 300.0 17.87 33.43 20.0 -1 300.0 17.84 33.55 20.0 -1 300.0 17.8 33.67 20.0 -1 300.0 17.74 33.79 20.0 -1 300.0 17.67 33.92 20.0 -1 300.0 17.58 34.05 20.0 -1 300.0 17.47 34.17 20.0 -1 300.0 17.35 34.31 20.0 -1 300.0 17.21 34.44 20.0 -1 300.0 17.06 34.58 20.0 -1 300.0 16.9 34.72 20.0 -1 300.0 16.52 35.0 20.0 -1 300.0 16.31 35.14 20.0 -1 300.0 16.09 35.28 20.0 -1 300.0 15.61 35.58 20.0 -1 300.0 15.36 35.73 20.0 -1 300.0 15.09 35.88 20.0 -1 300.0 14.52 36.18 20.0 -1 300.0 13.28 36.81 20.0 -1 300.0 12.96 36.96 20.0 -1 300.0 12.63 37.12 20.0 -1 300.0 11.95 37.43 20.0 -1 300.0 10.56 38.05 20.0 -1 300.0 7.75 39.3 20.0 -1 300.0 7.4 39.46 20.0 -1 300.0 7.07 39.61 20.0 -1 300.0 6.41 39.91 20.0 -1 300.0 5.17 40.51 20.0 -1 300.0 4.88 40.66 20.0 -1 300.0 4.6 40.8 20.0 -1 300.0 4.07 41.09 20.0 -1 300.0 3.83 41.23 20.0 -1 300.0 3.59 41.37 20.0 -1 300.0 3.15 41.64 20.0 -1 300.0 2.95 41.77 20.0 -1 300.0 2.76 41.9 20.0 -1 300.0 2.58 42.03 20.0 -1 300.0 2.42 42.16 20.0 -1 300.0 2.28 42.28 20.0 -1 300.0 2.15 42.4 20.0 -1 300.0 2.03 42.52 20.0 -1 300.0 1.93 42.64 20.0 -1 300.0 1.84 42.75 20.0 -1 300.0 1.77 42.87 20.0 -1 300.0 1.71 42.98 20.0 -1 300.0 1.67 43.08 20.0 -1 300.0 1.65 43.19 20.0 -1 300.0 1.64 43.29 20.0 -1 300.0 1.65 43.39 20.0 -1 300.0 1.67 43.48 20.0 -1 300.0 1.71 43.58 20.0 -1 300.0 1.76 43.66 20.0 -1 300.0 1.84 43.75 20.0 -1 300.0 1.93 43.84 20.0 -1 300.0 2.03 43.91 20.0 -1 300.0 2.15 43.99 20.0 -1 300.0 2.29 44.06 20.0 -1 300.0 2.44 44.13 20.0 -1 300.0 2.6 44.2 20.0 -1 300.0 2.79 44.27 20.0 -1 300.0 2.98 44.32 20.0 -1 300.0 3.19 44.38 20.0 -1 300.0 3.42 44.43 20.0 -1 300.0 3.66 44.48 20.0 -1 300.0 3.92 44.53 20.0 -1 300.0 4.18 44.57 20.0 -1 300.0 4.44 44.6 20.0 -1 300.0 4.71 44.63 20.0 -1 300.0 5.0 44.66 20.0 -1 300.0 5.29 44.69 20.0 -1 300.0 5.59 44.71 20.0 -1 300.0 5.9 44.73 20.0 -1 300.0 6.22 44.74 20.0 -1 300.0 6.55 44.75 20.0 -1 300.0 6.89 44.76 20.0 -1 300.0 7.24 44.77 20.0 -1 300.0 7.59 44.77 20.0 -1 300.0 7.95 44.76 20.0 -1 300.0 8.31 44.76 20.0 -1 300.0 8.68 44.75 20.0 -1 300.0 9.06 44.73 20.0 -1 300.0 9.44 44.72 20.0 -1 300.0 9.83 44.7 20.0 -1 300.0 10.22 44.67 20.0 -1 300.0 10.61 44.64 20.0 -1 300.0 11.0 44.61 20.0 -1 300.0 11.4 44.58 20.0 -1 300.0 11.8 44.54 20.0 -1 300.0 12.6 44.45 20.0 -1 300.0 13.0 44.4 20.0 -1 300.0 13.4 44.35 20.0 -1 300.0 13.8 44.29 20.0 -1 300.0 14.2 44.23 20.0 -1 300.0 14.6 44.16 20.0 -1 300.0 14.99 44.1 20.0 -1 300.0 15.77 43.95 20.0 -1 300.0 16.15 43.87 20.0 -1 300.0 16.52 43.79 20.0 -1 300.0 17.26 43.61 20.0 -1 300.0 17.62 43.52 20.0 -1 300.0 17.98 43.42 20.0 -1 300.0 18.66 43.22 20.0 -1 300.0 18.99 43.11 20.0 -1 300.0 19.31 43.0 20.0 -1 300.0 19.63 42.88 20.0 -1 300.0 19.93 42.77 20.0 -1 300.0 20.22 42.65 20.0 -1 300.0 20.51 42.52 20.0 -1 300.0 21.04 42.26 20.0 -1 300.0 21.29 42.13 20.0 -1 300.0 21.53 41.99 20.0 -1 300.0 21.76 41.85 20.0 -1 300.0 21.97 41.7 20.0 -1 300.0 22.18 41.56 20.0 -1 300.0 22.37 41.41 20.0 -1 300.0 22.54 41.25 20.0 -1 300.0 22.71 41.1 20.0 -1 300.0 22.86 40.94 20.0 -1 300.0 23.0 40.77 20.0 -1 300.0 23.12 40.61 20.0 -1 300.0 23.23 40.44 20.0 -1 300.0 23.32 40.27 20.0 -1 300.0 23.41 40.09 20.0 -1 300.0 23.48 39.92 20.0 -1 300.0 23.53 39.74 20.0 -1 300.0 23.57 39.54 20.0 -1 300.0 23.6 39.34 20.0 -1 300.0 23.61 39.14 20.0 -1 300.0 23.6 38.93 20.0 -1 300.0 23.57 38.72 20.0 -1 300.0 23.53 38.51 20.0 -1 300.0 23.48 38.29 20.0 -1 300.0 23.4 38.08 20.0 -1 300.0 23.32 37.85 20.0 -1 300.0 23.21 37.63 20.0 -1 300.0 23.09 37.41 20.0 -1 300.0 22.95 37.18 20.0 -1 300.0 22.8 36.95 20.0 -1 300.0 22.64 36.72 20.0 -1 300.0 22.27 36.24 20.0 -1 300.0 22.06 36.01 20.0 -1 300.0 21.84 35.77 20.0 -1 300.0 21.36 35.28 20.0 -1 300.0 20.27 34.28 20.0 -1 300.0 19.98 34.03 20.0 -1 300.0 19.67 33.78 20.0 -1 300.0 19.03 33.27 20.0 -1 300.0 17.67 32.23 20.0 -1 300.0 17.32 31.97 20.0 -1 300.0 16.96 31.71 20.0 -1 300.0 16.24 31.19 20.0 -1 300.0 14.77 30.14 20.0 -1 300.0 14.4 29.88 20.0 -1 300.0 14.04 29.61 20.0 -1 300.0 13.32 29.09 20.0 -1 300.0 11.92 28.04 20.0 -1 300.0 11.59 27.78 20.0 -1 300.0 11.26 27.52 20.0 -1 300.0 10.63 27.01 20.0 -1 300.0 10.32 26.75 20.0 -1 300.0 10.03 26.5 20.0 -1 300.0 9.47 25.99 20.0 -1 300.0 9.2 25.74 20.0 -1 300.0 8.95 25.49 20.0 -1 300.0 8.48 24.99 20.0 -1 300.0 8.27 24.75 20.0 -1 300.0 8.06 24.5 20.0 -1 300.0 7.7 24.02 20.0 -1 300.0 7.55 23.8 20.0 -1 300.0 7.41 23.58 20.0 -1 300.0 7.29 23.36 20.0 -1 300.0 7.18 23.14 20.0 -1 300.0 7.08 22.93 20.0 -1 300.0 7.0 22.71 20.0 -1 300.0 6.92 22.5 20.0 -1 300.0 6.87 22.3 20.0 -1 300.0 6.83 22.09 20.0 -1 300.0 6.8 21.88 20.0 -1 300.0 6.78 21.68 20.0 -1 300.0 6.79 21.48 20.0 -1 300.0 6.8 21.29 20.0 -1 300.0 6.83 21.09 20.0 -1 300.0 6.87 20.9 20.0 -1 300.0 6.93 20.71 20.0 -1 300.0 7.0 20.52 20.0 -1 300.0 7.09 20.34 20.0 -1 300.0 7.19 20.15 20.0 -1 300.0 7.31 19.98 20.0 -1 300.0 7.43 19.8 20.0 -1 300.0 7.58 19.63 20.0 -1 300.0 7.73 19.45 20.0 -1 300.0 7.9 19.29 20.0 -1 300.0 8.09 19.12 20.0 -1 300.0 8.28 18.96 20.0 -1 300.0 8.49 18.8 20.0 -1 300.0 8.71 18.64 20.0 -1 300.0 8.94 18.49 20.0 -1 300.0 9.19 18.34 20.0 -1 300.0 9.71 18.05 20.0 -1 300.0 9.99 17.91 20.0 -1 300.0 10.28 17.77 20.0 -1 300.0 10.88 17.51 20.0 -1 300.0 11.2 17.38 20.0 -1 300.0 11.53 17.26 20.0 -1 300.0 12.2 17.02 20.0 -1 300.0 12.55 16.91 20.0 -1 300.0 12.91 16.8 20.0 -1 300.0 13.64 16.58 20.0 -1 300.0 14.01 16.48 20.0 -1 300.0 14.39 16.39 20.0 -1 300.0 15.16 16.2 20.0 -1 300.0 15.55 16.12 20.0 -1 300.0 15.94 16.04 20.0 -1 300.0 16.73 15.88 20.0 -1 300.0 17.13 15.81 20.0 -1 300.0 17.52 15.74 20.0 -1 300.0 18.32 15.61 20.0 -1 300.0 18.71 15.55 20.0 -1 300.0 19.1 15.5 20.0 -1 300.0 19.49 15.45 20.0 -1 300.0 19.88 15.4 20.0 -1 300.0 20.26 15.36 20.0 -1 300.0 20.64 15.32 20.0 -1 300.0 21.02 15.28 20.0 -1 300.0 21.39 15.24 20.0 -1 300.0 21.74 15.21 20.0 -1 300.0 22.09 15.19 20.0 -1 300.0 22.44 15.17 20.0 -1 300.0 22.78 15.15 20.0 -1 300.0 23.11 15.13 20.0 -1 300.0 23.43 15.12 20.0 -1 300.0 23.75 15.11 20.0 -1 300.0 24.05 15.1 20.0 -1 300.0 24.35 15.1 20.0 -1 300.0 24.64 15.1 20.0 -1 300.0 24.91 15.1 20.0 -1 300.0 25.18 15.1 20.0 -1 300.0 25.44 15.11 20.0 -1 300.0 25.68 15.12 20.0 -1 300.0 25.92 15.14 20.0 -1 300.0 26.14 15.16 20.0 -1 300.0 26.35 15.18 20.0 -1 300.0 26.55 15.2 20.0 -1 300.0 26.74 15.23 20.0 -1 300.0 26.91 15.26 20.0 -1 300.0 27.08 15.29 20.0 -1 300.0 27.23 15.32 20.0 -1 300.0 27.36 15.36 20.0 -1 300.0 27.48 15.4 20.0 -1 300.0 27.59 15.45 20.0 -1 300.0 27.69 15.49 20.0 -1 300.0 27.77 15.54 20.0 -1 300.0 27.84 15.59 20.0 -1 300.0 27.89 15.64 20.0 -1 300.0 27.93 15.7 20.0 -1 300.0 27.95 15.76 20.0 -1 300.0 27.96 15.82 20.0 -1 300.0 27.96 15.88 20.0 -1 300.0 27.95 15.95 20.0 -1 300.0 27.92 16.01 20.0 -1 300.0 27.87 16.08 20.0 -1 300.0 27.82 16.16 20.0 -1 300.0 27.74 16.23 20.0 -1 300.0 27.66 16.3 20.0 -1 300.0 27.56 16.38 20.0 -1 300.0 27.45 16.46 20.0 -1 300.0 27.33 16.54 20.0 -1 300.0 27.04 16.71 20.0 -1 300.0 26.88 16.8 20.0 -1 300.0 26.71 16.89 20.0 -1 300.0 26.33 17.07 20.0 -1 300.0 26.12 17.16 20.0 -1 300.0 25.9 17.26 20.0 -1 300.0 25.43 17.45 20.0 -1 300.0 24.39 17.85 20.0 -1 300.0 21.93 18.69 20.0 -1 300.0 21.57 18.81 20.0 -1 300.0 21.21 18.93 20.0 -1 300.0 20.47 19.16 20.0 -1 300.0 18.98 19.64 20.0 -1 300.0 16.04 20.57 20.0 -1 300.0 15.69 20.69 20.0 -1 300.0 15.35 20.8 20.0 -1 300.0 14.68 21.02 20.0 -1 300.0 13.46 21.46 20.0 -1 300.0 13.18 21.56 20.0 -1 300.0 12.9 21.67 20.0 -1 300.0 12.4 21.87 20.0 -1 300.0 12.16 21.97 20.0 -1 300.0 11.94 22.06 20.0 -1 300.0 11.53 22.25 20.0 -1 300.0 11.35 22.34 20.0 -1 300.0 11.18 22.43 20.0 -1 300.0 11.02 22.52 20.0 -1 300.0 10.88 22.6 20.0 -1 300.0 10.76 22.68 20.0 -1 300.0 10.65 22.76 20.0 -1 300.0 10.55 22.84 20.0 -1 300.0 10.48 22.91 20.0 -1 300.0 10.41 22.98 20.0 -1 300.0 10.37 23.05 20.0 -1 300.0 10.34 23.12 20.0 -1 300.0 10.32 23.18 20.0 -1 300.0 10.32 23.24 20.0 -1 300.0 10.34 23.3 20.0 -1 300.0 10.38 23.35 20.0 -1 300.0 10.43 23.4 20.0 -1 300.0 10.5 23.45 20.0 -1 300.0 10.58 23.5 20.0 -1 300.0 10.68 23.54 20.0 -1 300.0 10.79 23.58 20.0 -1 300.0 10.93 23.61 20.0 -1 300.0 11.07 23.64 20.0 -1 300.0 11.23 23.67 20.0 -1 300.0 11.41 23.7 20.0 -1 300.0 11.6 23.72 20.0 -1 300.0 11.81 23.74 20.0 -1 300.0 12.03 23.75 20.0 -1 300.0 12.26 23.76 20.0 -1 300.0 12.51 23.77 20.0 -1 300.0 12.77 23.77 20.0 -1 300.0 13.04 23.77 20.0 -1 300.0 13.32 23.77 20.0 -1 300.0 13.6 23.76 20.0 -1 300.0 13.89 23.75 20.0 -1 300.0 14.18 23.73 20.0 -1 300.0 14.49 23.72 20.0 -1 300.0 14.8 23.7 20.0 -1 300.0 15.12 23.67 20.0 -1 300.0 15.45 23.64 20.0 -1 300.0 15.78 23.61 20.0 -1 300.0 16.13 23.58 20.0 -1 300.0 16.48 23.54 20.0 -1 300.0 16.83 23.5 20.0 -1 300.0 17.19 23.45 20.0 -1 300.0 17.55 23.4 20.0 -1 300.0 17.92 23.35 20.0 -1 300.0 18.67 23.23 20.0 -1 300.0 19.05 23.17 20.0 -1 300.0 19.42 23.1 20.0 -1 300.0 20.19 22.96 20.0 -1 300.0 20.57 22.88 20.0 -1 300.0 20.95 22.8 20.0 -1 300.0 21.71 22.62 20.0 -1 300.0 22.09 22.53 20.0 -1 300.0 22.47 22.43 20.0 -1 300.0 23.21 22.23 20.0 -1 300.0 23.57 22.13 20.0 -1 300.0 23.93 22.02 20.0 -1 300.0 24.64 21.78 20.0 -1 300.0 24.98 21.66 20.0 -1 300.0 25.32 21.54 20.0 -1 300.0 25.98 21.28 20.0 -1 300.0 26.29 21.14 20.0 -1 300.0 26.6 21.01 20.0 -1 300.0 27.19 20.72 20.0 -1 300.0 27.46 20.57 20.0 -1 300.0 27.73 20.42 20.0 -1 300.0 27.99 20.26 20.0 -1 300.0 28.24 20.11 20.0 -1 300.0 28.48 19.94 20.0 -1 300.0 28.7 19.78 20.0 -1 300.0 29.12 19.44 20.0 -1 300.0 29.3 19.27 20.0 -1 300.0 29.48 19.09 20.0 -1 300.0 29.64 18.91 20.0 -1 300.0 29.79 18.72 20.0 -1 300.0 29.93 18.54 20.0 -1 300.0 30.05 18.35 20.0 -1 300.0 30.16 18.16 20.0 -1 300.0 30.26 17.96 20.0 -1 300.0 30.34 17.76 20.0 -1 300.0 30.41 17.56 20.0 -1 300.0 30.46 17.36 20.0 -1 300.0 30.5 17.15 20.0 -1 300.0 30.52 16.94 20.0 -1 300.0 30.53 16.73 20.0 -1 300.0 30.53 16.52 20.0 -1 300.0 30.51 16.3 20.0 -1 300.0 30.47 16.07 20.0 -1 300.0 30.42 15.83 20.0 -1 300.0 30.35 15.58 20.0 -1 300.0 30.27 15.34 20.0 -1 300.0 30.16 15.09 20.0 -1 300.0 30.05 14.84 20.0 -1 300.0 29.91 14.59 20.0 -1 300.0 29.76 14.33 20.0 -1 300.0 29.6 14.07 20.0 -1 300.0 29.42 13.81 20.0 -1 300.0 29.01 13.29 20.0 -1 300.0 28.79 13.02 20.0 -1 300.0 28.55 12.75 20.0 -1 300.0 28.04 12.21 20.0 -1 300.0 27.77 11.94 20.0 -1 300.0 27.48 11.66 20.0 -1 300.0 26.88 11.11 20.0 -1 300.0 25.55 9.98 20.0 -1 300.0 22.57 7.69 20.0 -1 300.0 22.18 7.41 20.0 -1 300.0 21.79 7.12 20.0 -1 300.0 21.0 6.54 20.0 -1 300.0 19.44 5.38 20.0 -1 300.0 19.06 5.09 20.0 -1 300.0 18.68 4.81 20.0 -1 300.0 17.93 4.23 20.0 -1 300.0 16.51 3.1 20.0 -1 300.0 16.18 2.81 20.0 -1 300.0 15.85 2.53 20.0 -1 300.0 15.23 1.97 20.0 -1 300.0 14.93 1.7 20.0 -1 300.0 14.65 1.42 20.0 -1 300.0 14.12 0.88 20.0 -1 300.0 13.87 0.61 20.0 -1 300.0 13.63 0.34 20.0 -1 300.0 13.41 0.07 20.0 -1 300.0 13.2 -0.19 20.0 -1 300.0 13.01 -0.46 20.0 -1 300.0 12.83 -0.72 20.0 -1 300.0 12.67 -0.98 20.0 -1 300.0 12.52 -1.23 20.0 -1 300.0 12.39 -1.47 20.0 -1 300.0 12.28 -1.7 20.0 -1 300.0 12.19 -1.94 20.0 -1 300.0 12.11 -2.17 20.0 -1 300.0 12.04 -2.4 20.0 -1 300.0 11.98 -2.62 20.0 -1 300.0 11.94 -2.84 20.0 -1 300.0 11.92 -3.06 20.0 -1 300.0 11.9 -3.28 20.0 -1 300.0 11.91 -3.5 20.0 -1 300.0 11.93 -3.71 20.0 -1 300.0 11.96 -3.92 20.0 -1 300.0 12.01 -4.13 20.0 -1 300.0 12.07 -4.34 20.0 -1 300.0 12.14 -4.54 20.0 -1 300.0 12.23 -4.74 20.0 -1 300.0 12.34 -4.94 20.0 -1 300.0 12.45 -5.13 20.0 -1 300.0 12.58 -5.32 20.0 -1 300.0 12.73 -5.51 20.0 -1 300.0 12.89 -5.7 20.0 -1 300.0 13.06 -5.88 20.0 -1 300.0 13.24 -6.05 20.0 -1 300.0 13.44 -6.23 20.0 -1 300.0 13.65 -6.4 20.0 -1 300.0 13.87 -6.57 20.0 -1 300.0 14.1 -6.74 20.0 -1 300.0 14.35 -6.9 20.0 -1 300.0 14.6 -7.06 20.0 -1 300.0 14.86 -7.22 20.0 -1 300.0 15.42 -7.52 20.0 -1 300.0 15.72 -7.66 20.0 -1 300.0 16.02 -7.81 20.0 -1 300.0 16.65 -8.08 20.0 -1 300.0 16.98 -8.21 20.0 -1 300.0 17.31 -8.34 20.0 -1 300.0 17.99 -8.59 20.0 -1 300.0 18.34 -8.7 20.0 -1 300.0 18.7 -8.82 20.0 -1 300.0 19.42 -9.04 20.0 -1 300.0 20.9 -9.43 20.0 -1 300.0 21.28 -9.52 20.0 -1 300.0 21.65 -9.6 20.0 -1 300.0 22.4 -9.76 20.0 -1 300.0 22.77 -9.83 20.0 -1 300.0 23.14 -9.9 20.0 -1 300.0 23.87 -10.03 20.0 -1 300.0 24.23 -10.09 20.0 -1 300.0 24.58 -10.15 20.0 -1 300.0 24.94 -10.2 20.0 -1 300.0 25.28 -10.25 20.0 -1 300.0 25.62 -10.29 20.0 -1 300.0 25.96 -10.34 20.0 -1 300.0 26.6 -10.41 20.0 -1 300.0 26.91 -10.44 20.0 -1 300.0 27.21 -10.46 20.0 -1 300.0 27.5 -10.49 20.0 -1 300.0 27.78 -10.51 20.0 -1 300.0 28.05 -10.53 20.0 -1 300.0 28.31 -10.54 20.0 -1 300.0 28.57 -10.55 20.0 -1 300.0 28.81 -10.56 20.0 -1 300.0 29.04 -10.56 20.0 -1 300.0 29.26 -10.56 20.0 -1 300.0 29.47 -10.56 20.0 -1 300.0 29.66 -10.56 20.0 -1 300.0 29.85 -10.55 20.0 -1 300.0 30.02 -10.54 20.0 -1 300.0 30.18 -10.52 20.0 -1 300.0 30.33 -10.5 20.0 -1 300.0 30.46 -10.48 20.0 -1 300.0 30.58 -10.46 20.0 -1 300.0 30.69 -10.44 20.0 -1 300.0 30.78 -10.41 20.0 -1 300.0 30.86 -10.37 20.0 -1 300.0 30.93 -10.34 20.0 -1 300.0 30.98 -10.3 20.0 -1 300.0 31.02 -10.26 20.0 -1 300.0 31.05 -10.22 20.0 -1 300.0 31.06 -10.18 20.0 -1 300.0 31.05 -10.13 20.0 -1 300.0 31.04 -10.08 20.0 -1 300.0 31.01 -10.03 20.0 -1 300.0 30.96 -9.97 20.0 -1 300.0 30.9 -9.91 20.0 -1 300.0 30.83 -9.86 20.0 -1 300.0 30.74 -9.79 20.0 -1 300.0 30.64 -9.73 20.0 -1 300.0 30.52 -9.66 20.0 -1 300.0 30.4 -9.6 20.0 -1 300.0 30.25 -9.53 20.0 -1 300.0 30.1 -9.46 20.0 -1 300.0 29.75 -9.31 20.0 -1 300.0 29.56 -9.23 20.0 -1 300.0 29.36 -9.15 20.0 -1 300.0 28.92 -8.99 20.0 -1 300.0 27.9 -8.64 20.0 -1 300.0 27.62 -8.55 20.0 -1 300.0 27.34 -8.46 20.0 -1 300.0 26.73 -8.28 20.0 -1 300.0 25.44 -7.9 20.0 -1 300.0 22.59 -7.1 20.0 -1 300.0 22.19 -6.99 20.0 -1 300.0 21.79 -6.88 20.0 -1 300.0 20.98 -6.66 20.0 -1 300.0 19.37 -6.22 20.0 -1 300.0 18.98 -6.11 20.0 -1 300.0 18.58 -6.0 20.0 -1 300.0 17.81 -5.78 20.0 -1 300.0 16.35 -5.36 20.0 -1 300.0 16.0 -5.26 20.0 -1 300.0 15.66 -5.16 20.0 -1 300.0 15.02 -4.95 20.0 -1 300.0 14.71 -4.86 20.0 -1 300.0 14.41 -4.76 20.0 -1 300.0 13.85 -4.57 20.0 -1 300.0 13.59 -4.48 20.0 -1 300.0 13.34 -4.39 20.0 -1 300.0 12.88 -4.21 20.0 -1 300.0 12.68 -4.13 20.0 -1 300.0 12.48 -4.04 20.0 -1 300.0 12.14 -3.89 20.0 -1 300.0 11.99 -3.81 20.0 -1 300.0 11.86 -3.74 20.0 -1 300.0 11.74 -3.67 20.0 -1 300.0 11.64 -3.6 20.0 -1 300.0 11.55 -3.53 20.0 -1 300.0 11.49 -3.47 20.0 -1 300.0 11.43 -3.41 20.0 -1 300.0 11.4 -3.35 20.0 -1 300.0 11.38 -3.29 20.0 -1 300.0 11.37 -3.24 20.0 -1 300.0 11.39 -3.19 20.0 -1 300.0 11.41 -3.15 20.0 -1 300.0 11.46 -3.1 20.0 -1 300.0 11.52 -3.06 20.0 -1 300.0 11.6 -3.02 20.0 -1 300.0 11.69 -2.99 20.0 -1 300.0 11.8 -2.96 20.0 -1 300.0 11.93 -2.93 20.0 -1 300.0 12.07 -2.91 20.0 -1 300.0 12.22 -2.89 20.0 -1 300.0 12.39 -2.87 20.0 -1 300.0 12.58 -2.86 20.0 -1 300.0 12.78 -2.85 20.0 -1 300.0 12.99 -2.84 20.0 -1 300.0 13.21 -2.84 20.0 -1 300.0 13.45 -2.84 20.0 -1 300.0 13.7 -2.84 20.0 -1 300.0 13.97 -2.85 20.0 -1 300.0 14.24 -2.86 20.0 -1 300.0 14.53 -2.88 20.0 -1 300.0 14.82 -2.9 20.0 -1 300.0 15.13 -2.92 20.0 -1 300.0 15.43 -2.95 20.0 -1 300.0 15.73 -2.98 20.0 -1 300.0 16.04 -3.01 20.0 -1 300.0 16.35 -3.04 20.0 -1 300.0 16.68 -3.08 20.0 -1 300.0 17.0 -3.12 20.0 -1 300.0 17.68 -3.22 20.0 -1 300.0 18.02 -3.27 20.0 -1 300.0 18.37 -3.33 20.0 -1 300.0 19.07 -3.45 20.0 -1 300.0 19.43 -3.52 20.0 -1 300.0 19.78 -3.59 20.0 -1 300.0 20.5 -3.74 20.0 -1 300.0 20.86 -3.82 20.0 -1 300.0 21.21 -3.91 20.0 -1 300.0 21.93 -4.09 20.0 -1 300.0 22.28 -4.18 20.0 -1 300.0 22.63 -4.28 20.0 -1 300.0 23.31 -4.49 20.0 -1 300.0 23.65 -4.6 20.0 -1 300.0 23.98 -4.71 20.0 -1 300.0 24.63 -4.95 20.0 -1 300.0 24.95 -5.07 20.0 -1 300.0 25.25 -5.2 20.0 -1 300.0 25.85 -5.46 20.0 -1 300.0 26.13 -5.6 20.0 -1 300.0 26.4 -5.74 20.0 -1 300.0 26.67 -5.88 20.0 -1 300.0 26.93 -6.03 20.0 -1 300.0 27.17 -6.18 20.0 -1 300.0 27.41 -6.33 20.0 -1 300.0 27.84 -6.65 20.0 -1 300.0 28.04 -6.81 20.0 -1 300.0 28.23 -6.98 20.0 -1 300.0 28.41 -7.15 20.0 -1 300.0 28.57 -7.32 20.0 -1 300.0 28.73 -7.5 20.0 -1 300.0 28.86 -7.67 20.0 -1 300.0 28.99 -7.86 20.0 -1 300.0 29.1 -8.04 20.0 -1 300.0 29.2 -8.23 20.0 -1 300.0 29.28 -8.42 20.0 -1 300.0 29.35 -8.61 20.0 -1 300.0 29.41 -8.8 20.0 -1 300.0 29.45 -9.0 20.0 -1 300.0 29.48 -9.2 20.0 -1 300.0 29.49 -9.41 20.0 -1 300.0 29.49 -9.61 20.0 -1 300.0 29.48 -9.82 20.0 -1 300.0 29.45 -10.03 20.0 -1 300.0 29.4 -10.24 20.0 -1 300.0 29.34 -10.46 20.0 -1 300.0 29.27 -10.68 20.0 -1 300.0 29.18 -10.9 20.0 -1 300.0 29.08 -11.12 20.0 -1 300.0 28.96 -11.34 20.0 -1 300.0 28.82 -11.59 20.0 -1 300.0 28.67 -11.84 20.0 -1 300.0 28.49 -12.09 20.0 -1 300.0 28.3 -12.34 20.0 -1 300.0 28.1 -12.59 20.0 -1 300.0 27.88 -12.85 20.0 -1 300.0 27.4 -13.37 20.0 -1 300.0 27.14 -13.63 20.0 -1 300.0 26.87 -13.9 20.0 -1 300.0 26.28 -14.43 20.0 -1 300.0 24.97 -15.51 20.0 -1 300.0 24.61 -15.79 20.0 -1 300.0 24.25 -16.06 20.0 -1 300.0 23.5 -16.62 20.0 -1 300.0 21.92 -17.73 20.0 -1 300.0 18.57 -19.98 20.0 -1 300.0 18.15 -20.27 20.0 -1 300.0 17.73 -20.55 20.0 -1 300.0 16.9 -21.11 20.0 -1 300.0 15.29 -22.22 20.0 -1 300.0 14.9 -22.5 20.0 -1 300.0 14.52 -22.77 20.0 -1 300.0 13.78 -23.32 20.0 -1 300.0 12.41 -24.4 20.0 -1 300.0 12.1 -24.67 20.0 -1 300.0 11.79 -24.93 20.0 -1 300.0 11.22 -25.45 20.0 -1 300.0 10.96 -25.71 20.0 -1 300.0 10.71 -25.97 20.0 -1 300.0 10.25 -26.48 20.0 -1 300.0 10.04 -26.73 20.0 -1 300.0 9.85 -26.97 20.0 -1 300.0 9.67 -27.22 20.0 -1 300.0 9.51 -27.46 20.0 -1 300.0 9.36 -27.7 20.0 -1 300.0 9.23 -27.94 20.0 -1 300.0 9.12 -28.18 20.0 -1 300.0 9.02 -28.41 20.0 -1 300.0 8.94 -28.63 20.0 -1 300.0 8.87 -28.86 20.0 -1 300.0 8.83 -29.07 20.0 -1 300.0 8.8 -29.29 20.0 -1 300.0 8.78 -29.5 20.0 -1 300.0 8.78 -29.72 20.0 -1 300.0 8.8 -29.92 20.0 -1 300.0 8.83 -30.13 20.0 -1 300.0 8.88 -30.33 20.0 -1 300.0 8.95 -30.53 20.0 -1 300.0 9.03 -30.72 20.0 -1 300.0 9.13 -30.91 20.0 -1 300.0 9.24 -31.1 20.0 -1 300.0 9.36 -31.29 20.0 -1 300.0 9.51 -31.47 20.0 -1 300.0 9.66 -31.64 20.0 -1 300.0 9.83 -31.82 20.0 -1 300.0 10.02 -31.99 20.0 -1 300.0 10.21 -32.16 20.0 -1 300.0 10.43 -32.32 20.0 -1 300.0 10.65 -32.48 20.0 -1 300.0 10.88 -32.63 20.0 -1 300.0 11.39 -32.93 20.0 -1 300.0 11.66 -33.08 20.0 -1 300.0 11.95 -33.22 20.0 -1 300.0 12.54 -33.48 20.0 -1 300.0 12.85 -33.61 20.0 -1 300.0 13.16 -33.73 20.0 -1 300.0 13.82 -33.97 20.0 -1 300.0 14.16 -34.08 20.0 -1 300.0 14.5 -34.19 20.0 -1 300.0 15.21 -34.39 20.0 -1 300.0 15.57 -34.49 20.0 -1 300.0 15.93 -34.58 20.0 -1 300.0 16.66 -34.75 20.0 -1 300.0 17.03 -34.83 20.0 -1 300.0 17.4 -34.9 20.0 -1 300.0 17.77 -34.97 20.0 -1 300.0 18.13 -35.04 20.0 -1 300.0 18.5 -35.1 20.0 -1 300.0 18.86 -35.16 20.0 -1 300.0 19.59 -35.26 20.0 -1 300.0 19.94 -35.3 20.0 -1 300.0 20.29 -35.35 20.0 -1 300.0 20.63 -35.38 20.0 -1 300.0 20.97 -35.42 20.0 -1 300.0 21.3 -35.44 20.0 -1 300.0 21.63 -35.47 20.0 -1 300.0 21.95 -35.49 20.0 -1 300.0 22.26 -35.51 20.0 -1 300.0 22.56 -35.52 20.0 -1 300.0 22.85 -35.53 20.0 -1 300.0 23.13 -35.53 20.0 -1 300.0 23.4 -35.53 20.0 -1 300.0 23.66 -35.53 20.0 -1 300.0 23.9 -35.52 20.0 -1 300.0 24.14 -35.51 20.0 -1 300.0 24.36 -35.5 20.0 -1 300.0 24.56 -35.48 20.0 -1 300.0 24.75 -35.46 20.0 -1 300.0 24.92 -35.44 20.0 -1 300.0 25.08 -35.41 20.0 -1 300.0 25.23 -35.38 20.0 -1 300.0 25.36 -35.34 20.0 -1 300.0 25.49 -35.31 20.0 -1 300.0 25.6 -35.27 20.0 -1 300.0 25.69 -35.23 20.0 -1 300.0 25.78 -35.18 20.0 -1 300.0 25.85 -35.13 20.0 -1 300.0 25.9 -35.08 20.0 -1 300.0 25.94 -35.03 20.0 -1 300.0 25.97 -34.97 20.0 -1 300.0 25.99 -34.91 20.0 -1 300.0 25.99 -34.85 20.0 -1 300.0 25.97 -34.78 20.0 -1 300.0 25.94 -34.72 20.0 -1 300.0 25.9 -34.65 20.0 -1 300.0 25.84 -34.58 20.0 -1 300.0 25.77 -34.5 20.0 -1 300.0 25.68 -34.42 20.0 -1 300.0 25.59 -34.34 20.0 -1 300.0 25.47 -34.26 20.0 -1 300.0 25.34 -34.17 20.0 -1 300.0 25.2 -34.09 20.0 -1 300.0 24.88 -33.91 20.0 -1 300.0 24.7 -33.81 20.0 -1 300.0 24.51 -33.72 20.0 -1 300.0 24.09 -33.52 20.0 -1 300.0 23.86 -33.42 20.0 -1 300.0 23.61 -33.32 20.0 -1 300.0 23.09 -33.11 20.0 -1 300.0 21.93 -32.67 20.0 -1 300.0 19.2 -31.74 20.0 -1 300.0 12.95 -29.75 20.0 -1 300.0 12.53 -29.61 20.0 -1 300.0 12.12 -29.48 20.0 -1 300.0 11.3 -29.21 20.0 -1 300.0 9.75 -28.68 20.0 -1 300.0 9.38 -28.55 20.0 -1 300.0 9.03 -28.42 20.0 -1 300.0 8.34 -28.17 20.0 -1 300.0 7.1 -27.68 20.0 -1 300.0 6.83 -27.56 20.0 -1 300.0 6.56 -27.44 20.0 -1 300.0 6.07 -27.21 20.0 -1 300.0 5.85 -27.1 20.0 -1 300.0 5.64 -26.99 20.0 -1 300.0 5.27 -26.78 20.0 -1 300.0 5.11 -26.68 20.0 -1 300.0 4.96 -26.58 20.0 -1 300.0 4.83 -26.48 20.0 -1 300.0 4.72 -26.38 20.0 -1 300.0 4.62 -26.29 20.0 -1 300.0 4.54 -26.2 20.0 -1 300.0 4.48 -26.11 20.0 -1 300.0 4.43 -26.03 20.0 -1 300.0 4.4 -25.94 20.0 -1 300.0 4.38 -25.86 20.0 -1 300.0 4.38 -25.79 20.0 -1 300.0 4.4 -25.71 20.0 -1 300.0 4.44 -25.64 20.0 -1 300.0 4.49 -25.58 20.0 -1 300.0 4.56 -25.51 20.0 -1 300.0 4.64 -25.45 20.0 -1 300.0 4.74 -25.39 20.0 -1 300.0 4.85 -25.34 20.0 -1 300.0 4.98 -25.29 20.0 -1 300.0 5.13 -25.24 20.0 -1 300.0 5.29 -25.19 20.0 -1 300.0 5.46 -25.15 20.0 -1 300.0 5.65 -25.11 20.0 -1 300.0 5.85 -25.08 20.0 -1 300.0 6.06 -25.05 20.0 -1 300.0 6.29 -25.02 20.0 -1 300.0 6.53 -25.0 20.0 -1 300.0 6.78 -24.98 20.0 -1 300.0 7.04 -24.96 20.0 -1 300.0 7.31 -24.95 20.0 -1 300.0 7.6 -24.94 20.0 -1 300.0 7.89 -24.94 20.0 -1 300.0 8.19 -24.94 20.0 -1 300.0 8.5 -24.94 20.0 -1 300.0 8.82 -24.95 20.0 -1 300.0 9.15 -24.96 20.0 -1 300.0 9.48 -24.98 20.0 -1 300.0 9.82 -24.99 20.0 -1 300.0 10.16 -25.02 20.0 -1 300.0 10.51 -25.04 20.0 -1 300.0 10.84 -25.07 20.0 -1 300.0 11.17 -25.1 20.0 -1 300.0 11.51 -25.14 20.0 -1 300.0 11.84 -25.18 20.0 -1 300.0 12.18 -25.22 20.0 -1 300.0 12.52 -25.27 20.0 -1 300.0 13.2 -25.37 20.0 -1 300.0 13.53 -25.43 20.0 -1 300.0 13.87 -25.49 20.0 -1 300.0 14.2 -25.55 20.0 -1 300.0 14.54 -25.62 20.0 -1 300.0 14.86 -25.69 20.0 -1 300.0 15.19 -25.76 20.0 -1 300.0 15.82 -25.92 20.0 -1 300.0 16.13 -26.0 20.0 -1 300.0 16.44 -26.09 20.0 -1 300.0 16.74 -26.18 20.0 -1 300.0 17.03 -26.28 20.0 -1 300.0 17.31 -26.38 20.0 -1 300.0 17.59 -26.48 20.0 -1 300.0 18.11 -26.69 20.0 -1 300.0 18.36 -26.8 20.0 -1 300.0 18.6 -26.91 20.0 -1 300.0 18.83 -27.03 20.0 -1 300.0 19.05 -27.15 20.0 -1 300.0 19.26 -27.28 20.0 -1 300.0 19.46 -27.4 20.0 -1 300.0 19.64 -27.53 20.0 -1 300.0 19.82 -27.67 20.0 -1 300.0 19.98 -27.8 20.0 -1 300.0 20.13 -27.94 20.0 -1 300.0 20.26 -28.09 20.0 -1 300.0 20.39 -28.23 20.0 -1 300.0 20.5 -28.38 20.0 -1 300.0 20.59 -28.53 20.0 -1 300.0 20.68 -28.68 20.0 -1 300.0 20.75 -28.84 20.0 -1 300.0 20.8 -29.0 20.0 -1 300.0 20.84 -29.16 20.0 -1 300.0 20.87 -29.33 20.0 -1 300.0 20.88 -29.49 20.0 -1 300.0 20.88 -29.66 20.0 -1 300.0 20.86 -29.84 20.0 -1 300.0 20.83 -30.01 20.0 -1 300.0 20.78 -30.19 20.0 -1 300.0 20.72 -30.37 20.0 -1 300.0 20.64 -30.55 20.0 -1 300.0 20.56 -30.73 20.0 -1 300.0 20.45 -30.92 20.0 -1 300.0 20.33 -31.11 20.0 -1 300.0 20.2 -31.3 20.0 -1 300.0 20.05 -31.49 20.0 -1 300.0 19.89 -31.69 20.0 -1 300.0 19.72 -31.89 20.0 -1 300.0 19.53 -32.08 20.0 -1 300.0 19.12 -32.49 20.0 -1 300.0 18.89 -32.69 20.0 -1 300.0 18.66 -32.9 20.0 -1 300.0 18.14 -33.31 20.0 -1 300.0 17.87 -33.52 20.0 -1 300.0 17.59 -33.72 20.0 -1 300.0 17.01 -34.14 20.0 -1 300.0 15.72 -34.99 20.0 -1 300.0 12.8 -36.73 20.0 -1 300.0 12.41 -36.95 20.0 -1 300.0 12.02 -37.17 20.0 -1 300.0 11.22 -37.61 20.0 -1 300.0 9.62 -38.49 20.0 -1 300.0 6.46 -40.24 20.0 -1 300.0 6.07 -40.45 20.0 -1 300.0 5.7 -40.67 20.0 -1 300.0 4.96 -41.1 20.0 -1 300.0 3.57 -41.94 20.0 -1 300.0 3.24 -42.15 20.0 -1 300.0 2.92 -42.36 20.0 -1 300.0 2.3 -42.77 20.0 -1 300.0 1.19 -43.57 20.0 -1 300.0 0.94 -43.76 20.0 -1 300.0 0.71 -43.96 20.0 -1 300.0 0.26 -44.34 20.0 -1 300.0 0.06 -44.53 20.0 -1 300.0 -0.13 -44.72 20.0 -1 300.0 -0.47 -45.09 20.0 -1 300.0 -0.62 -45.27 20.0 -1 300.0 -0.76 -45.44 20.0 -1 300.0 -0.88 -45.62 20.0 -1 300.0 -0.99 -45.79 20.0 -1 300.0 -1.09 -45.97 20.0 -1 300.0 -1.17 -46.13 20.0 -1 300.0 -1.24 -46.3 20.0 -1 300.0 -1.3 -46.47 20.0 -1 300.0 -1.34 -46.64 20.0 -1 300.0 -1.37 -46.81 20.0 -1 300.0 -1.38 -46.98 20.0 -1 300.0 -1.38 -47.15 20.0 -1 300.0 -1.36 -47.31 20.0 -1 300.0 -1.32 -47.47 20.0 -1 300.0 -1.27 -47.62 20.0 -1 300.0 -1.2 -47.77 20.0 -1 300.0 -1.11 -47.92 20.0 -1 300.0 -1.01 -48.07 20.0 -1 300.0 -0.9 -48.21 20.0 -1 300.0 -0.77 -48.35 20.0 -1 300.0 -0.63 -48.48 20.0 -1 300.0 -0.47 -48.61 20.0 -1 300.0 -0.29 -48.74 20.0 -1 300.0 -0.11 -48.86 20.0 -1 300.0 0.09 -48.98 20.0 -1 300.0 0.3 -49.1 20.0 -1 300.0 0.53 -49.21 20.0 -1 300.0 0.77 -49.31 20.0 -1 300.0 1.01 -49.42 20.0 -1 300.0 1.27 -49.52 20.0 -1 300.0 1.82 -49.7 20.0 -1 300.0 2.11 -49.79 20.0 -1 300.0 2.41 -49.88 20.0 -1 300.0 2.71 -49.95 20.0 -1 300.0 3.03 -50.03 20.0 -1 300.0 3.35 -50.1 20.0 -1 300.0 3.67 -50.17 20.0 -1 300.0 4.0 -50.23 20.0 -1 300.0 4.34 -50.29 20.0 -1 300.0 4.68 -50.34 20.0 -1 300.0 5.03 -50.39 20.0 -1 300.0 5.38 -50.44 20.0 -1 300.0 5.73 -50.48 20.0 -1 300.0 6.08 -50.51 20.0 -1 300.0 6.43 -50.55 20.0 -1 300.0 6.79 -50.57 20.0 -1 300.0 7.14 -50.6 20.0 -1 300.0 7.49 -50.62 20.0 -1 300.0 7.84 -50.63 20.0 -1 300.0 8.19 -50.64 20.0 -1 300.0 8.54 -50.65 20.0 -1 300.0 8.88 -50.65 20.0 -1 300.0 9.22 -50.65 20.0 -1 300.0 9.55 -50.65 20.0 -1 300.0 9.88 -50.63 20.0 -1 300.0 10.2 -50.62 20.0 -1 300.0 10.52 -50.6 20.0 -1 300.0 10.82 -50.58 20.0 -1 300.0 11.12 -50.55 20.0 -1 300.0 11.41 -50.52 20.0 -1 300.0 11.69 -50.49 20.0 -1 300.0 11.96 -50.45 20.0 -1 300.0 12.22 -50.4 20.0 -1 300.0 12.47 -50.36 20.0 -1 300.0 12.71 -50.3 20.0 -1 300.0 12.94 -50.25 20.0 -1 300.0 13.15 -50.19 20.0 -1 300.0 13.36 -50.13 20.0 -1 300.0 13.55 -50.06 20.0 -1 300.0 13.72 -49.99 20.0 -1 300.0 13.88 -49.92 20.0 -1 300.0 14.02 -49.84 20.0 -1 300.0 14.14 -49.77 20.0 -1 300.0 14.26 -49.69 20.0 -1 300.0 14.36 -49.6 20.0 -1 300.0 14.44 -49.52 20.0 -1 300.0 14.51 -49.43 20.0 -1 300.0 14.57 -49.34 20.0 -1 300.0 14.62 -49.24 20.0 -1 300.0 14.64 -49.15 20.0 -1 300.0 14.66 -49.05 20.0 -1 300.0 14.66 -48.94 20.0 -1 300.0 14.65 -48.84 20.0 -1 300.0 14.63 -48.73 20.0 -1 300.0 14.58 -48.62 20.0 -1 300.0 14.53 -48.5 20.0 -1 300.0 14.46 -48.39 20.0 -1 300.0 14.38 -48.27 20.0 -1 300.0 14.28 -48.15 20.0 -1 300.0 14.17 -48.02 20.0 -1 300.0 14.04 -47.9 20.0 -1 300.0 13.9 -47.77 20.0 -1 300.0 13.75 -47.63 20.0 -1 300.0 13.4 -47.37 20.0 -1 300.0 13.21 -47.23 20.0 -1 300.0 13.0 -47.09 20.0 -1 300.0 12.55 -46.8 20.0 -1 300.0 11.5 -46.21 20.0 -1 300.0 11.21 -46.06 20.0 -1 300.0 10.92 -45.9 20.0 -1 300.0 10.29 -45.59 20.0 -1 300.0 8.92 -44.95 20.0 -1 300.0 5.87 -43.61 20.0 -1 300.0 5.47 -43.44 20.0 -1 300.0 5.06 -43.27 20.0 -1 300.0 4.25 -42.93 20.0 -1 300.0 2.6 -42.24 20.0 -1 300.0 -0.6 -40.87 20.0 -1 300.0 -1.02 -40.68 20.0 -1 300.0 -1.44 -40.49 20.0 -1 300.0 -2.26 -40.12 20.0 -1 300.0 -3.76 -39.38 20.0 -1 300.0 -4.11 -39.2 20.0 -1 300.0 -4.45 -39.02 20.0 -1 300.0 -5.08 -38.66 20.0 -1 300.0 -5.38 -38.49 20.0 -1 300.0 -5.66 -38.32 20.0 -1 300.0 -6.18 -37.98 20.0 -1 300.0 -6.42 -37.81 20.0 -1 300.0 -6.64 -37.65 20.0 -1 300.0 -6.84 -37.48 20.0 -1 300.0 -7.03 -37.32 20.0 -1 300.0 -7.2 -37.16 20.0 -1 300.0 -7.35 -37.01 20.0 -1 300.0 -7.49 -36.86 20.0 -1 300.0 -7.61 -36.71 20.0 -1 300.0 -7.71 -36.56 20.0 -1 300.0 -7.79 -36.41 20.0 -1 300.0 -7.86 -36.27 20.0 -1 300.0 -7.9 -36.13 20.0 -1 300.0 -7.93 -36.0 20.0 -1 300.0 -7.95 -35.86 20.0 -1 300.0 -7.94 -35.73 20.0 -1 300.0 -7.92 -35.61 20.0 -1 300.0 -7.88 -35.48 20.0 -1 300.0 -7.82 -35.36 20.0 -1 300.0 -7.74 -35.25 20.0 -1 300.0 -7.65 -35.13 20.0 -1 300.0 -7.54 -35.02 20.0 -1 300.0 -7.42 -34.92 20.0 -1 300.0 -7.28 -34.81 20.0 -1 300.0 -7.12 -34.72 20.0 -1 300.0 -6.95 -34.62 20.0 -1 300.0 -6.76 -34.53 20.0 -1 300.0 -6.56 -34.44 20.0 -1 300.0 -6.34 -34.36 20.0 -1 300.0 -6.12 -34.28 20.0 -1 300.0 -5.87 -34.2 20.0 -1 300.0 -5.62 -34.13 20.0 -1 300.0 -5.35 -34.06 20.0 -1 300.0 -5.08 -33.99 20.0 -1 300.0 -4.79 -33.93 20.0 -1 300.0 -4.49 -33.88 20.0 -1 300.0 -4.18 -33.82 20.0 -1 300.0 -3.86 -33.77 20.0 -1 300.0 -3.54 -33.73 20.0 -1 300.0 -3.21 -33.69 20.0 -1 300.0 -2.87 -33.66 20.0 -1 300.0 -2.52 -33.62 20.0 -1 300.0 -2.17 -33.6 20.0 -1 300.0 -1.82 -33.57 20.0 -1 300.0 -1.46 -33.55 20.0 -1 300.0 -1.1 -33.54 20.0 -1 300.0 -0.73 -33.53 20.0 -1 300.0 -0.37 -33.52 20.0 -1 300.0 0.0 -33.52 20.0 -0 300.0 0.0 -33.52 6.0 -0 300.0 37.56 12.33 6.0 -1 300.0 37.56 12.33 -1.0 -1 300.0 37.56 0.88 -1.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 49.01 12.33 -1.0 -1 300.0 37.56 12.33 -1.0 -0 300.0 37.56 12.33 6.0 -0 300.0 37.56 0.88 6.0 -1 300.0 37.56 0.88 -1.0 -1 300.0 37.56 -10.57 -1.0 -1 300.0 49.01 -10.57 -1.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 37.56 0.88 -1.0 -0 300.0 37.56 0.88 6.0 -0 300.0 49.01 12.33 6.0 -1 300.0 49.01 12.33 -1.0 -1 300.0 52.08 15.01 -1.0 -0 300.0 52.08 15.01 6.0 -0 300.0 49.01 0.88 6.0 -1 300.0 49.01 0.88 -1.0 -1 300.0 52.08 6.21 -1.0 -1 300.0 52.08 15.01 -1.0 -1 300.0 43.29 15.01 -1.0 -1 300.0 37.56 12.33 -1.0 -0 300.0 37.56 12.33 6.0 -0 300.0 49.01 -10.57 6.0 -1 300.0 49.01 -10.57 -1.0 -1 300.0 52.08 -2.58 -1.0 -1 300.0 52.08 6.21 -1.0 -1 300.0 49.01 0.88 -1.0 -0 300.0 49.01 0.88 6.0 -0 300.0 49.01 0.88 20.0 -0 300.0 0.0 0.0 20.0 -0 300.0 0.0 0.0 20.0 diff --git a/test/matlab/matlab_convert.py b/test/matlab/matlab_convert.py deleted file mode 100755 index cf750acf7..000000000 --- a/test/matlab/matlab_convert.py +++ /dev/null @@ -1,270 +0,0 @@ -#!/usr/bin/env python -"""\ -The MIT License (MIT) - -Copyright (c) 2014 Sungeun K. Jeon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. ----------------------------------------------------------------------------------------- -""" -"""\ -G-code preprocessor for the grbl_sim.m MATLAB script. Parses the g-code program to a -specific file format for the MATLAB script to use. Based on PreGrbl by @chamnit. - -How to use: When running this python script, it will process the g-code program under -the filename "test.gcode" (may be changed below) and produces a file called "matlab.gcode" -that the grbl_sim.m MATLAB script will search for and execute. -""" - -import re -from math import * -from copy import * - -# -= SETTINGS =- -filein = 'test.gcode' # Input file name -fileout = 'matlab.gcode' # Output file name -ndigits_in = 4 # inch significant digits after '.' -ndigits_mm = 2 # mm significant digits after '.' -# mm_per_arc_segment = 0.38 # mm per arc segment -arc_tolerance = 0.00005*25.4 -n_arc_correction = 20 -inch2mm = 25.4 # inch to mm conversion scalar -verbose = False # Verbose flag to show all progress -remove_unsupported = True # Removal flag for all unsupported statements - -# Initialize parser state -gc = { 'current_xyz' : [0,0,0], - 'feed_rate' : 0, # F0 - 'motion_mode' : 'SEEK', # G00 - 'plane_axis' : [0,1,2], # G17 - 'inches_mode' : False, # G21 - 'inverse_feedrate_mode' : False, # G94 - 'absolute_mode' : True} # G90 - -def unit_conv(val) : # Converts value to mm - if gc['inches_mode'] : val *= inch2mm - return(val) - -def fout_conv(val) : # Returns converted value as rounded string for output file. - if gc['inches_mode'] : return( str(round(val/inch2mm,ndigits_in)) ) - else : return( str(round(val,ndigits_mm)) ) - -# Open g-code file -fin = open(filein,'r'); -fout = open(fileout,'w'); - -# Iterate through g-code file -l_count = 0 -for line in fin: - l_count += 1 # Iterate line counter - - # Strip comments/spaces/tabs/new line and capitalize. Comment MSG not supported. - block = re.sub('\s|\(.*?\)','',line).upper() - block = re.sub('\\\\','',block) # Strip \ block delete character - block = re.sub('%','',block) # Strip % program start/stop character - - if len(block) == 0 : # Ignore empty blocks - - print "Skipping: " + line.strip() - - else : # Process valid g-code clean block. Assumes no block delete characters or comments - - g_cmd = re.findall(r'[^0-9\.\-]+',block) # Extract block command characters - g_num = re.findall(r'[0-9\.\-]+',block) # Extract block numbers - - # G-code block error checks - # if len(g_cmd) != len(g_num) : print block; raise Exception('Invalid block. Unbalanced word and values.') - if 'N' in g_cmd : - if g_cmd[0]!='N': raise Exception('Line number must be first command in line.') - if g_cmd.count('N') > 1: raise Exception('More than one line number in block.') - g_cmd = g_cmd[1:] # Remove line number word - g_num = g_num[1:] - # Block item repeat checks? (0<=n'M'<5, G/M modal groups) - - # Initialize block state - blk = { 'next_action' : 'DEFAULT', - 'absolute_override' : False, - 'target_xyz' : deepcopy(gc['current_xyz']), - 'offset_ijk' : [0,0,0], - 'radius_mode' : False, - 'unsupported': [] } - - # Pass 1 - for cmd,num in zip(g_cmd,g_num) : - fnum = float(num) - inum = int(fnum) - if cmd is 'G' : - if inum is 0 : gc['motion_mode'] = 'SEEK' - elif inum is 1 : gc['motion_mode'] = 'LINEAR' - elif inum is 2 : gc['motion_mode'] = 'CW_ARC' - elif inum is 3 : gc['motion_mode'] = 'CCW_ARC' - elif inum is 4 : blk['next_action'] = 'DWELL' - elif inum is 17 : gc['plane_axis'] = [0,1,2] # Select XY Plane - elif inum is 18 : gc['plane_axis'] = [0,2,1] # Select XZ Plane - elif inum is 19 : gc['plane_axis'] = [1,2,0] # Select YZ Plane - elif inum is 20 : gc['inches_mode'] = True - elif inum is 21 : gc['inches_mode'] = False - elif inum in [28,30] : blk['next_action'] = 'GO_HOME' - elif inum is 53 : blk['absolute_override'] = True - elif inum is 54 : pass - elif inum is 80 : gc['motion_mode'] = 'MOTION_CANCEL' - elif inum is 90 : gc['absolute_mode'] = True - elif inum is 91 : gc['absolute_mode'] = False - elif inum is 92 : blk['next_action'] = 'SET_OFFSET' - elif inum is 93 : gc['inverse_feedrate_mode'] = True - elif inum is 94 : gc['inverse_feedrate_mode'] = False - else : - print 'Unsupported command ' + cmd + num + ' on line ' + str(l_count) - if remove_unsupported : blk['unsupported'].append(zip(g_cmd,g_num).index((cmd,num))) - elif cmd is 'M' : - if inum in [0,1] : pass # Program Pause - elif inum in [2,30,60] : pass # Program Completed - elif inum is 3 : pass # Spindle Direction 1 - elif inum is 4 : pass # Spindle Direction -1 - elif inum is 5 : pass # Spindle Direction 0 - else : - print 'Unsupported command ' + cmd + num + ' on line ' + str(l_count) - if remove_unsupported : blk['unsupported'].append(zip(g_cmd,g_num).index((cmd,num))) - elif cmd is 'T' : pass # Tool Number - - # Pass 2 - for cmd,num in zip(g_cmd,g_num) : - fnum = float(num) - if cmd is 'F' : gc['feed_rate'] = unit_conv(fnum) # Feed Rate - elif cmd in ['I','J','K'] : blk['offset_ijk'][ord(cmd)-ord('I')] = unit_conv(fnum) # Arc Center Offset - elif cmd is 'N' : pass - elif cmd is 'P' : p = fnum # Misc value parameter - elif cmd is 'R' : r = unit_conv(fnum); blk['radius_mode'] = True # Arc Radius Mode - elif cmd is 'S' : pass # Spindle Speed - elif cmd in ['X','Y','Z'] : # Target Coordinates - if (gc['absolute_mode'] | blk['absolute_override']) : - blk['target_xyz'][ord(cmd)-ord('X')] = unit_conv(fnum) - else : - blk['target_xyz'][ord(cmd)-ord('X')] += unit_conv(fnum) - - # Execute actions - if blk['next_action'] is 'GO_HOME' : - gc['current_xyz'] = deepcopy(blk['target_xyz']) # Update position - elif blk['next_action'] is 'SET_OFFSET' : - pass - elif blk['next_action'] is 'DWELL' : - if p < 0 : raise Exception('Dwell time negative.') - else : # 'DEFAULT' - if gc['motion_mode'] is 'SEEK' : - fout.write('0 '+fout_conv(gc['feed_rate'])) - fout.write(' '+fout_conv(blk['target_xyz'][0])) - fout.write(' '+fout_conv(blk['target_xyz'][1])) - fout.write(' '+fout_conv(blk['target_xyz'][2])) - fout.write('\n') - gc['current_xyz'] = deepcopy(blk['target_xyz']) # Update position - elif gc['motion_mode'] is 'LINEAR' : - fout.write('1 '+fout_conv(gc['feed_rate'])) - fout.write(' '+fout_conv(blk['target_xyz'][0])) - fout.write(' '+fout_conv(blk['target_xyz'][1])) - fout.write(' '+fout_conv(blk['target_xyz'][2])) - fout.write('\n') - gc['current_xyz'] = deepcopy(blk['target_xyz']) # Update position - elif gc['motion_mode'] in ['CW_ARC','CCW_ARC'] : - axis = gc['plane_axis'] - - # Convert radius mode to ijk mode - if blk['radius_mode'] : - x = blk['target_xyz'][axis[0]]-gc['current_xyz'][axis[0]] - y = blk['target_xyz'][axis[1]]-gc['current_xyz'][axis[1]] - if not (x==0 and y==0) : raise Exception('Same target and current XYZ not allowed in arc radius mode.') - h_x2_div_d = -sqrt(4 * r*r - x*x - y*y)/hypot(x,y) - if isnan(h_x2_div_d) : raise Exception('Floating point error in arc conversion') - if gc['motion_mode'] is 'CCW_ARC' : h_x2_div_d = -h_x2_div_d - if r < 0 : h_x2_div_d = -h_x2_div_d - blk['offset_ijk'][axis[0]] = (x-(y*h_x2_div_d))/2; - blk['offset_ijk'][axis[1]] = (y+(x*h_x2_div_d))/2; - else : - radius = sqrt(blk['offset_ijk'][axis[0]]**2+blk['offset_ijk'][axis[1]]**2) - - center_axis0 = gc['current_xyz'][axis[0]]+blk['offset_ijk'][axis[0]] - center_axis1 = gc['current_xyz'][axis[1]]+blk['offset_ijk'][axis[1]] - linear_travel = blk['target_xyz'][axis[2]]-gc['current_xyz'][axis[2]] - r_axis0 = -blk['offset_ijk'][axis[0]] - r_axis1 = -blk['offset_ijk'][axis[1]] - rt_axis0 = blk['target_xyz'][axis[0]] - center_axis0; - rt_axis1 = blk['target_xyz'][axis[1]] - center_axis1; - clockwise_sign = 1 - if gc['motion_mode'] is 'CW_ARC' : clockwise_sign = -1 - - angular_travel = atan2(r_axis0*rt_axis1-r_axis1*rt_axis0, r_axis0*rt_axis0+r_axis1*rt_axis1) - if gc['motion_mode'] is 'CW_ARC' : - if angular_travel >= 0 : - angular_travel -= 2*pi - else : - if angular_travel <= 0 : - angular_travel += 2*pi - - millimeters_of_travel = sqrt((angular_travel*radius)**2 + abs(linear_travel)**2) - - mm_per_arc_segment = sqrt(4*(2*radius*arc_tolerance-arc_tolerance**2)) - segments = int(millimeters_of_travel/mm_per_arc_segment) - print segments - print l_count - theta_per_segment = angular_travel/segments - linear_per_segment = linear_travel/segments - cos_T = 1-0.5*theta_per_segment*theta_per_segment - sin_T = theta_per_segment-theta_per_segment**3/6 - print(fout_conv(mm_per_arc_segment)) - print theta_per_segment*180/pi - - arc_target = [0,0,0] - arc_target[axis[2]] = gc['current_xyz'][axis[2]] - - count = 0 - for i in range(1,segments+1) : - if i < segments : - if count < n_arc_correction : - r_axisi = r_axis0*sin_T + r_axis1*cos_T - r_axis0 = r_axis0*cos_T - r_axis1*sin_T - r_axis1 = deepcopy(r_axisi) - count += 1 - else : - cos_Ti = cos((i-1)*theta_per_segment) - sin_Ti = sin((i-1)*theta_per_segment) - print n_arc_correction*(r_axis0 -( -blk['offset_ijk'][axis[0]]*cos_Ti + blk['offset_ijk'][axis[1]]*sin_Ti)) - print n_arc_correction*(r_axis1 -( -blk['offset_ijk'][axis[0]]*sin_Ti - blk['offset_ijk'][axis[1]]*cos_Ti)) - cos_Ti = cos(i*theta_per_segment) - sin_Ti = sin(i*theta_per_segment) - r_axis0 = -blk['offset_ijk'][axis[0]]*cos_Ti + blk['offset_ijk'][axis[1]]*sin_Ti - r_axis1 = -blk['offset_ijk'][axis[0]]*sin_Ti - blk['offset_ijk'][axis[1]]*cos_Ti - count = 0 - arc_target[axis[0]] = center_axis0 + r_axis0 - arc_target[axis[1]] = center_axis1 + r_axis1 - arc_target[axis[2]] += linear_per_segment - else : - arc_target = deepcopy(blk['target_xyz']) # Last segment at target_xyz - # Write only changed variables. - fout.write('1 '+fout_conv(gc['feed_rate'])) - fout.write(' '+fout_conv(arc_target[0])) - fout.write(' '+fout_conv(arc_target[1])) - fout.write(' '+fout_conv(arc_target[2])) - fout.write('\n') - gc['current_xyz'] = deepcopy(arc_target) # Update position - - -print 'Done!' - -# Close files -fin.close() -fout.close() \ No newline at end of file diff --git a/test/matlab/test.gcode b/test/matlab/test.gcode deleted file mode 100644 index 3d9d56cd7..000000000 --- a/test/matlab/test.gcode +++ /dev/null @@ -1,2363 +0,0 @@ -(Braid.NC Test Program) -T1M6 -G17G21 -G0X0Y0 -G0Z6.000 -G0X37.560Y12.327Z6.000 -G1Z-1.000 F300 -G1Y0.876 -X49.011 -Y12.327 -X37.560 -G0Z6.000 -G0Y0.876 -G1Z-1.000 -G1Y-10.575 -X49.011 -Y0.876 -X37.560 -G0Z6.000 -G0X49.011Y12.327 -G1Z-1.000 -G1X52.084Y15.011 -G0Z6.000 -G0X49.011Y0.876 -G1Z-1.000 -G1X52.084Y6.213 -Y15.011 -X43.286 -X37.560Y12.327 -G0Z6.000 -G0X49.011Y-10.575 -G1Z-1.000 -G1X52.084Y-2.585 -Y6.213 -X49.011Y0.876 -G0Z6.000 -G0Z20.000 -G0X0.000Y0.000 -G1X-7.098Y-39.876 -X-10.296Y-38.118 -X-10.698Y-37.897 -X-11.099Y-37.676 -X-11.894Y-37.235 -X-13.448Y-36.356 -X-13.825Y-36.137 -X-14.197Y-35.919 -X-14.923Y-35.485 -X-16.288Y-34.625 -X-16.636Y-34.395 -X-16.973Y-34.165 -X-17.613Y-33.711 -X-17.915Y-33.486 -X-18.204Y-33.262 -X-18.743Y-32.821 -X-18.992Y-32.602 -X-19.227Y-32.386 -X-19.447Y-32.171 -X-19.652Y-31.959 -X-19.843Y-31.749 -X-20.017Y-31.540 -X-20.176Y-31.335 -X-20.320Y-31.131 -X-20.447Y-30.930 -X-20.558Y-30.731 -X-20.653Y-30.535 -X-20.731Y-30.341 -X-20.793Y-30.150 -X-20.838Y-29.961 -X-20.867Y-29.776 -X-20.879Y-29.593 -X-20.875Y-29.413 -X-20.854Y-29.236 -X-20.817Y-29.062 -X-20.764Y-28.891 -X-20.695Y-28.723 -X-20.610Y-28.559 -X-20.510Y-28.397 -X-20.394Y-28.239 -X-20.263Y-28.084 -X-20.117Y-27.932 -X-19.957Y-27.784 -X-19.782Y-27.639 -X-19.594Y-27.498 -X-19.392Y-27.360 -X-19.177Y-27.226 -X-18.950Y-27.095 -X-18.710Y-26.968 -X-18.459Y-26.845 -X-18.197Y-26.725 -X-17.924Y-26.609 -X-17.641Y-26.497 -X-17.349Y-26.389 -X-16.737Y-26.183 -X-16.419Y-26.086 -X-16.094Y-25.993 -X-15.763Y-25.904 -X-15.426Y-25.818 -X-15.083Y-25.737 -X-14.736Y-25.660 -X-14.030Y-25.516 -X-13.672Y-25.451 -X-13.313Y-25.389 -X-12.953Y-25.332 -X-12.591Y-25.278 -X-12.230Y-25.228 -X-11.870Y-25.182 -X-11.511Y-25.140 -X-11.155Y-25.103 -X-10.824Y-25.071 -X-10.497Y-25.043 -X-10.173Y-25.018 -X-9.853Y-24.996 -X-9.538Y-24.978 -X-9.228Y-24.964 -X-8.924Y-24.952 -X-8.625Y-24.944 -X-8.334Y-24.940 -X-8.049Y-24.939 -X-7.772Y-24.941 -X-7.504Y-24.946 -X-7.243Y-24.955 -X-6.992Y-24.967 -X-6.750Y-24.982 -X-6.518Y-25.000 -X-6.295Y-25.022 -X-6.084Y-25.047 -X-5.883Y-25.075 -X-5.694Y-25.106 -X-5.517Y-25.140 -X-5.351Y-25.177 -X-5.197Y-25.217 -X-5.057Y-25.260 -X-4.928Y-25.306 -X-4.813Y-25.355 -X-4.711Y-25.407 -X-4.623Y-25.461 -X-4.548Y-25.518 -X-4.487Y-25.578 -X-4.439Y-25.641 -X-4.406Y-25.707 -X-4.387Y-25.775 -X-4.382Y-25.845 -X-4.392Y-25.918 -X-4.416Y-25.994 -X-4.454Y-26.072 -X-4.506Y-26.152 -X-4.572Y-26.235 -X-4.653Y-26.320 -X-4.748Y-26.407 -X-4.857Y-26.496 -X-4.980Y-26.588 -X-5.117Y-26.681 -X-5.267Y-26.777 -X-5.431Y-26.874 -X-5.798Y-27.074 -X-6.001Y-27.177 -X-6.216Y-27.282 -X-6.683Y-27.496 -X-7.755Y-27.942 -X-8.049Y-28.057 -X-8.353Y-28.173 -X-8.990Y-28.409 -X-10.362Y-28.891 -X-10.753Y-29.024 -X-11.151Y-29.158 -X-11.968Y-29.428 -X-13.658Y-29.973 -X-17.113Y-31.067 -X-17.538Y-31.202 -X-17.959Y-31.337 -X-18.788Y-31.604 -X-20.370Y-32.127 -X-20.746Y-32.255 -X-21.113Y-32.382 -X-21.817Y-32.631 -X-23.093Y-33.111 -X-23.381Y-33.226 -X-23.656Y-33.339 -X-24.164Y-33.560 -X-24.397Y-33.667 -X-24.615Y-33.772 -X-25.005Y-33.974 -X-25.177Y-34.072 -X-25.332Y-34.167 -X-25.472Y-34.259 -X-25.595Y-34.349 -X-25.701Y-34.436 -X-25.791Y-34.520 -X-25.864Y-34.601 -X-25.920Y-34.679 -X-25.960Y-34.754 -X-25.982Y-34.826 -X-25.987Y-34.895 -X-25.976Y-34.961 -X-25.948Y-35.023 -X-25.903Y-35.082 -X-25.841Y-35.138 -X-25.763Y-35.190 -X-25.669Y-35.239 -X-25.559Y-35.284 -X-25.433Y-35.325 -X-25.291Y-35.363 -X-25.134Y-35.397 -X-24.963Y-35.428 -X-24.777Y-35.455 -X-24.577Y-35.477 -X-24.367Y-35.496 -X-24.144Y-35.511 -X-23.909Y-35.522 -X-23.661Y-35.529 -X-23.403Y-35.532 -X-23.133Y-35.532 -X-22.853Y-35.527 -X-22.563Y-35.519 -X-22.263Y-35.506 -X-21.955Y-35.490 -X-21.638Y-35.470 -X-21.313Y-35.445 -X-20.981Y-35.416 -X-20.643Y-35.384 -X-20.299Y-35.347 -X-19.949Y-35.306 -X-19.595Y-35.261 -X-19.237Y-35.212 -X-18.875Y-35.158 -X-18.511Y-35.101 -X-18.145Y-35.039 -X-17.777Y-34.973 -X-17.041Y-34.829 -X-16.673Y-34.751 -X-16.306Y-34.668 -X-15.580Y-34.491 -X-15.222Y-34.396 -X-14.867Y-34.297 -X-14.172Y-34.086 -X-13.833Y-33.975 -X-13.501Y-33.859 -X-13.176Y-33.740 -X-12.858Y-33.616 -X-12.548Y-33.488 -X-12.248Y-33.357 -X-11.675Y-33.082 -X-11.404Y-32.938 -X-11.144Y-32.791 -X-10.896Y-32.639 -X-10.659Y-32.484 -X-10.435Y-32.326 -X-10.223Y-32.163 -X-10.025Y-31.997 -X-9.840Y-31.827 -X-9.669Y-31.653 -X-9.512Y-31.476 -X-9.370Y-31.295 -X-9.242Y-31.111 -X-9.130Y-30.923 -X-9.033Y-30.732 -X-8.951Y-30.538 -X-8.885Y-30.340 -X-8.835Y-30.139 -X-8.801Y-29.934 -X-8.782Y-29.727 -X-8.780Y-29.517 -X-8.794Y-29.303 -X-8.825Y-29.087 -X-8.871Y-28.867 -X-8.934Y-28.645 -X-9.006Y-28.435 -X-9.093Y-28.223 -X-9.194Y-28.008 -X-9.308Y-27.792 -X-9.435Y-27.573 -X-9.577Y-27.352 -X-9.898Y-26.903 -X-10.078Y-26.676 -X-10.271Y-26.446 -X-10.693Y-25.982 -X-10.922Y-25.748 -X-11.162Y-25.511 -X-11.675Y-25.034 -X-11.948Y-24.793 -X-12.230Y-24.550 -X-12.824Y-24.061 -X-14.114Y-23.068 -X-17.000Y-21.038 -X-17.380Y-20.782 -X-17.762Y-20.525 -X-18.532Y-20.010 -X-20.077Y-18.979 -X-20.462Y-18.721 -X-20.845Y-18.464 -X-21.602Y-17.949 -X-23.072Y-16.925 -X-23.427Y-16.671 -X-23.776Y-16.417 -X-24.454Y-15.911 -X-25.717Y-14.911 -X-26.011Y-14.664 -X-26.295Y-14.418 -X-26.833Y-13.930 -X-27.086Y-13.688 -X-27.328Y-13.447 -X-27.777Y-12.971 -X-28.000Y-12.715 -X-28.209Y-12.461 -X-28.404Y-12.210 -X-28.583Y-11.961 -X-28.746Y-11.713 -X-28.894Y-11.469 -X-29.026Y-11.226 -X-29.142Y-10.986 -X-29.242Y-10.749 -X-29.325Y-10.514 -X-29.391Y-10.281 -X-29.441Y-10.052 -X-29.475Y-9.825 -X-29.491Y-9.601 -X-29.491Y-9.380 -X-29.475Y-9.162 -X-29.441Y-8.947 -X-29.391Y-8.735 -X-29.325Y-8.526 -X-29.242Y-8.320 -X-29.144Y-8.118 -X-29.029Y-7.919 -X-28.899Y-7.723 -X-28.753Y-7.531 -X-28.592Y-7.342 -X-28.416Y-7.156 -X-28.226Y-6.974 -X-28.022Y-6.796 -X-27.804Y-6.621 -X-27.572Y-6.450 -X-27.071Y-6.119 -X-26.802Y-5.959 -X-26.522Y-5.803 -X-25.929Y-5.502 -X-25.617Y-5.358 -X-25.296Y-5.217 -X-24.628Y-4.948 -X-24.283Y-4.819 -X-23.930Y-4.694 -X-23.207Y-4.457 -X-22.838Y-4.344 -X-22.465Y-4.236 -X-21.707Y-4.031 -X-21.325Y-3.935 -X-20.941Y-3.842 -X-20.170Y-3.670 -X-19.786Y-3.590 -X-19.402Y-3.515 -X-18.642Y-3.375 -X-18.266Y-3.312 -X-17.894Y-3.252 -X-17.527Y-3.197 -X-17.164Y-3.145 -X-16.808Y-3.098 -X-16.459Y-3.055 -X-16.116Y-3.015 -X-15.781Y-2.980 -X-15.477Y-2.951 -X-15.179Y-2.925 -X-14.891Y-2.902 -X-14.611Y-2.883 -X-14.340Y-2.867 -X-14.078Y-2.855 -X-13.827Y-2.845 -X-13.586Y-2.839 -X-13.355Y-2.837 -X-13.136Y-2.837 -X-12.929Y-2.841 -X-12.733Y-2.848 -X-12.549Y-2.858 -X-12.378Y-2.871 -X-12.220Y-2.888 -X-12.074Y-2.907 -X-11.942Y-2.929 -X-11.823Y-2.955 -X-11.717Y-2.983 -X-11.626Y-3.014 -X-11.548Y-3.048 -X-11.484Y-3.084 -X-11.435Y-3.124 -X-11.400Y-3.166 -X-11.379Y-3.210 -X-11.372Y-3.258 -X-11.380Y-3.308 -X-11.403Y-3.360 -X-11.440Y-3.415 -X-11.491Y-3.472 -X-11.556Y-3.532 -X-11.636Y-3.594 -X-11.729Y-3.658 -X-11.837Y-3.724 -X-11.959Y-3.793 -X-12.094Y-3.863 -X-12.242Y-3.936 -X-12.404Y-4.010 -X-12.767Y-4.165 -X-12.967Y-4.245 -X-13.179Y-4.327 -X-13.639Y-4.495 -X-14.691Y-4.850 -X-14.979Y-4.942 -X-15.277Y-5.036 -X-15.897Y-5.225 -X-17.230Y-5.617 -X-20.146Y-6.431 -X-20.516Y-6.532 -X-20.887Y-6.634 -X-21.630Y-6.837 -X-23.106Y-7.241 -X-25.895Y-8.028 -X-26.218Y-8.123 -X-26.535Y-8.218 -X-27.145Y-8.403 -X-28.260Y-8.760 -X-28.514Y-8.846 -X-28.759Y-8.930 -X-29.214Y-9.095 -X-29.425Y-9.175 -X-29.624Y-9.253 -X-29.986Y-9.404 -X-30.149Y-9.477 -X-30.298Y-9.548 -X-30.435Y-9.617 -X-30.559Y-9.684 -X-30.669Y-9.749 -X-30.766Y-9.812 -X-30.849Y-9.872 -X-30.918Y-9.931 -X-30.974Y-9.987 -X-31.016Y-10.041 -X-31.043Y-10.092 -X-31.057Y-10.141 -X-31.057Y-10.188 -X-31.043Y-10.232 -X-31.015Y-10.273 -X-30.972Y-10.312 -X-30.916Y-10.349 -X-30.847Y-10.382 -X-30.763Y-10.413 -X-30.666Y-10.441 -X-30.556Y-10.466 -X-30.432Y-10.489 -X-30.295Y-10.508 -X-30.146Y-10.525 -X-29.984Y-10.539 -X-29.809Y-10.549 -X-29.622Y-10.557 -X-29.424Y-10.562 -X-29.214Y-10.563 -X-28.992Y-10.562 -X-28.760Y-10.557 -X-28.517Y-10.549 -X-28.242Y-10.537 -X-27.955Y-10.521 -X-27.657Y-10.501 -X-27.349Y-10.477 -X-27.031Y-10.450 -X-26.703Y-10.418 -X-26.366Y-10.383 -X-26.021Y-10.343 -X-25.668Y-10.300 -X-25.308Y-10.253 -X-24.568Y-10.146 -X-24.191Y-10.086 -X-23.808Y-10.023 -X-23.032Y-9.883 -X-22.640Y-9.807 -X-22.245Y-9.728 -X-21.453Y-9.556 -X-21.057Y-9.463 -X-20.662Y-9.367 -X-19.876Y-9.162 -X-19.487Y-9.054 -X-19.101Y-8.941 -X-18.343Y-8.704 -X-17.972Y-8.579 -X-17.606Y-8.450 -X-16.896Y-8.180 -X-16.552Y-8.040 -X-16.217Y-7.895 -X-15.574Y-7.594 -X-15.268Y-7.438 -X-14.972Y-7.277 -X-14.414Y-6.946 -X-14.153Y-6.774 -X-13.905Y-6.599 -X-13.669Y-6.420 -X-13.447Y-6.237 -X-13.239Y-6.051 -X-13.044Y-5.862 -X-12.864Y-5.669 -X-12.699Y-5.472 -X-12.549Y-5.272 -X-12.414Y-5.069 -X-12.294Y-4.862 -X-12.190Y-4.652 -X-12.102Y-4.439 -X-12.030Y-4.223 -X-11.975Y-4.003 -X-11.935Y-3.781 -X-11.911Y-3.555 -X-11.904Y-3.327 -X-11.914Y-3.096 -X-11.939Y-2.862 -X-11.981Y-2.625 -X-12.038Y-2.386 -X-12.112Y-2.144 -X-12.202Y-1.899 -X-12.300Y-1.669 -X-12.412Y-1.436 -X-12.537Y-1.201 -X-12.675Y-0.965 -X-12.826Y-0.726 -X-12.990Y-0.486 -X-13.355Y0.001 -X-13.555Y0.246 -X-13.768Y0.494 -X-14.226Y0.993 -X-15.266Y2.009 -X-15.550Y2.266 -X-15.842Y2.524 -X-16.451Y3.043 -X-17.752Y4.093 -X-20.572Y6.219 -X-20.935Y6.486 -X-21.298Y6.753 -X-22.024Y7.287 -X-23.456Y8.353 -X-23.807Y8.618 -X-24.154Y8.883 -X-24.835Y9.411 -X-26.125Y10.458 -X-26.431Y10.717 -X-26.728Y10.975 -X-27.297Y11.489 -X-27.568Y11.744 -X-27.830Y11.997 -X-28.322Y12.500 -X-28.552Y12.749 -X-28.771Y12.997 -X-28.978Y13.243 -X-29.174Y13.487 -X-29.357Y13.729 -X-29.528Y13.970 -X-29.686Y14.209 -X-29.831Y14.446 -X-29.974Y14.700 -X-30.101Y14.953 -X-30.212Y15.202 -X-30.307Y15.449 -X-30.385Y15.694 -X-30.447Y15.936 -X-30.492Y16.175 -X-30.521Y16.411 -X-30.532Y16.644 -X-30.527Y16.874 -X-30.505Y17.102 -X-30.466Y17.326 -X-30.411Y17.547 -X-30.338Y17.765 -X-30.249Y17.980 -X-30.144Y18.191 -X-30.022Y18.399 -X-29.884Y18.603 -X-29.730Y18.805 -X-29.561Y19.002 -X-29.376Y19.196 -X-29.176Y19.386 -X-28.962Y19.573 -X-28.733Y19.756 -X-28.490Y19.935 -X-28.233Y20.111 -X-27.964Y20.282 -X-27.681Y20.450 -X-27.386Y20.614 -X-27.080Y20.774 -X-26.434Y21.081 -X-26.096Y21.229 -X-25.748Y21.373 -X-25.025Y21.648 -X-24.652Y21.780 -X-24.272Y21.907 -X-23.493Y22.149 -X-23.095Y22.264 -X-22.693Y22.375 -X-21.877Y22.583 -X-21.466Y22.681 -X-21.053Y22.775 -X-20.223Y22.949 -X-19.809Y23.030 -X-19.396Y23.107 -X-18.575Y23.247 -X-18.169Y23.311 -X-17.767Y23.371 -X-16.977Y23.478 -X-16.591Y23.525 -X-16.211Y23.568 -X-15.838Y23.606 -X-15.473Y23.641 -X-15.116Y23.671 -X-14.769Y23.698 -X-14.430Y23.720 -X-14.102Y23.739 -X-13.791Y23.753 -X-13.490Y23.763 -X-13.200Y23.769 -X-12.922Y23.772 -X-12.657Y23.771 -X-12.404Y23.766 -X-12.164Y23.758 -X-11.937Y23.746 -X-11.724Y23.730 -X-11.525Y23.711 -X-11.340Y23.688 -X-11.171Y23.662 -X-11.016Y23.633 -X-10.876Y23.600 -X-10.752Y23.564 -X-10.643Y23.524 -X-10.549Y23.481 -X-10.472Y23.435 -X-10.411Y23.386 -X-10.365Y23.334 -X-10.336Y23.279 -X-10.323Y23.221 -X-10.326Y23.161 -X-10.344Y23.097 -X-10.379Y23.030 -X-10.430Y22.961 -X-10.497Y22.889 -X-10.579Y22.815 -X-10.676Y22.738 -X-10.789Y22.659 -X-10.917Y22.577 -X-11.060Y22.493 -X-11.217Y22.407 -X-11.389Y22.318 -X-11.773Y22.135 -X-11.985Y22.041 -X-12.210Y21.945 -X-12.697Y21.747 -X-12.958Y21.645 -X-13.230Y21.542 -X-13.806Y21.331 -X-15.066Y20.894 -X-15.401Y20.782 -X-15.742Y20.670 -X-16.442Y20.441 -X-17.896Y19.977 -X-20.868Y19.035 -X-21.208Y18.926 -X-21.545Y18.817 -X-22.208Y18.600 -X-23.472Y18.173 -X-23.772Y18.068 -X-24.066Y17.964 -X-24.629Y17.759 -X-25.650Y17.361 -X-25.881Y17.265 -X-26.101Y17.170 -X-26.509Y16.984 -X-26.696Y16.893 -X-26.871Y16.804 -X-27.184Y16.631 -X-27.322Y16.547 -X-27.447Y16.465 -X-27.559Y16.385 -X-27.658Y16.306 -X-27.743Y16.230 -X-27.815Y16.156 -X-27.873Y16.084 -X-27.917Y16.014 -X-27.947Y15.946 -X-27.963Y15.880 -X-27.965Y15.817 -X-27.953Y15.756 -X-27.927Y15.697 -X-27.887Y15.641 -X-27.832Y15.588 -X-27.764Y15.537 -X-27.681Y15.488 -X-27.585Y15.442 -X-27.475Y15.399 -X-27.351Y15.358 -X-27.214Y15.321 -X-27.063Y15.286 -X-26.899Y15.253 -X-26.723Y15.224 -X-26.533Y15.198 -X-26.332Y15.174 -X-26.118Y15.154 -X-25.892Y15.136 -X-25.654Y15.122 -X-25.405Y15.110 -X-25.145Y15.102 -X-24.875Y15.097 -X-24.594Y15.095 -X-24.304Y15.096 -X-24.004Y15.100 -X-23.694Y15.107 -X-23.377Y15.118 -X-23.051Y15.132 -X-22.717Y15.149 -X-22.376Y15.170 -X-21.998Y15.196 -X-21.613Y15.226 -X-21.221Y15.260 -X-20.822Y15.298 -X-20.418Y15.340 -X-20.010Y15.385 -X-19.180Y15.489 -X-18.761Y15.547 -X-18.339Y15.609 -X-17.492Y15.744 -X-17.067Y15.818 -X-16.644Y15.896 -X-15.800Y16.064 -X-15.382Y16.154 -X-14.967Y16.248 -X-14.150Y16.448 -X-13.749Y16.554 -X-13.354Y16.664 -X-12.583Y16.895 -X-12.209Y17.017 -X-11.844Y17.142 -X-11.140Y17.405 -X-10.803Y17.542 -X-10.477Y17.683 -X-9.858Y17.975 -X-9.566Y18.127 -X-9.287Y18.283 -X-9.021Y18.442 -X-8.768Y18.604 -X-8.529Y18.771 -X-8.305Y18.940 -X-8.094Y19.113 -X-7.899Y19.290 -X-7.718Y19.470 -X-7.553Y19.653 -X-7.403Y19.839 -X-7.270Y20.029 -X-7.152Y20.221 -X-7.050Y20.417 -X-6.965Y20.616 -X-6.895Y20.818 -X-6.843Y21.023 -X-6.806Y21.230 -X-6.787Y21.441 -X-6.783Y21.654 -X-6.796Y21.870 -X-6.826Y22.088 -X-6.872Y22.309 -X-6.933Y22.532 -X-7.011Y22.758 -X-7.104Y22.986 -X-7.213Y23.217 -X-7.338Y23.449 -X-7.477Y23.684 -X-7.631Y23.921 -X-7.982Y24.401 -X-8.165Y24.627 -X-8.360Y24.855 -X-8.782Y25.315 -X-9.751Y26.251 -X-10.017Y26.488 -X-10.291Y26.726 -X-10.863Y27.204 -X-12.089Y28.170 -X-12.409Y28.413 -X-12.734Y28.657 -X-13.395Y29.145 -X-14.749Y30.124 -X-17.457Y32.077 -X-17.785Y32.320 -X-18.108Y32.561 -X-18.740Y33.042 -X-19.930Y33.994 -X-20.210Y34.229 -X-20.481Y34.463 -X-20.997Y34.927 -X-21.240Y35.157 -X-21.474Y35.386 -X-21.910Y35.838 -X-22.111Y36.062 -X-22.302Y36.284 -X-22.480Y36.505 -X-22.646Y36.723 -X-22.800Y36.940 -X-22.941Y37.155 -X-23.069Y37.367 -X-23.183Y37.578 -X-23.285Y37.786 -X-23.373Y37.993 -X-23.447Y38.197 -X-23.507Y38.398 -X-23.553Y38.598 -X-23.585Y38.795 -X-23.602Y38.989 -X-23.606Y39.181 -X-23.593Y39.386 -X-23.563Y39.588 -X-23.516Y39.787 -X-23.452Y39.983 -X-23.372Y40.175 -X-23.274Y40.364 -X-23.160Y40.550 -X-23.029Y40.732 -X-22.882Y40.910 -X-22.719Y41.086 -X-22.539Y41.257 -X-22.344Y41.425 -X-22.134Y41.589 -X-21.908Y41.749 -X-21.668Y41.906 -X-21.413Y42.059 -X-21.144Y42.208 -X-20.862Y42.353 -X-20.566Y42.494 -X-20.257Y42.631 -X-19.937Y42.763 -X-19.604Y42.892 -X-18.906Y43.138 -X-18.542Y43.254 -X-18.168Y43.366 -X-17.785Y43.474 -X-17.394Y43.578 -X-16.995Y43.678 -X-16.589Y43.773 -X-15.758Y43.950 -X-15.335Y44.033 -X-14.908Y44.111 -X-14.476Y44.184 -X-14.042Y44.253 -X-13.606Y44.318 -X-13.168Y44.379 -X-12.289Y44.486 -X-11.851Y44.534 -X-11.414Y44.576 -X-10.978Y44.615 -X-10.546Y44.649 -X-10.116Y44.679 -X-9.691Y44.704 -X-9.271Y44.726 -X-8.856Y44.742 -X-8.447Y44.755 -X-8.044Y44.763 -X-7.650Y44.767 -X-7.263Y44.766 -X-6.885Y44.762 -X-6.516Y44.753 -X-6.157Y44.740 -X-5.808Y44.723 -X-5.471Y44.702 -X-5.145Y44.676 -X-4.830Y44.647 -X-4.529Y44.613 -X-4.240Y44.576 -X-3.965Y44.535 -X-3.703Y44.489 -X-3.456Y44.440 -X-3.227Y44.388 -X-3.013Y44.332 -X-2.813Y44.273 -X-2.629Y44.210 -X-2.459Y44.144 -X-2.305Y44.074 -X-2.167Y44.001 -X-2.044Y43.925 -X-1.938Y43.845 -X-1.847Y43.762 -X-1.773Y43.675 -X-1.715Y43.586 -X-1.673Y43.494 -X-1.647Y43.398 -X-1.638Y43.299 -X-1.645Y43.198 -X-1.667Y43.094 -X-1.706Y42.987 -X-1.761Y42.877 -X-1.832Y42.765 -X-1.918Y42.650 -X-2.019Y42.532 -X-2.135Y42.412 -X-2.267Y42.290 -X-2.412Y42.166 -X-2.572Y42.039 -X-2.934Y41.779 -X-3.134Y41.646 -X-3.347Y41.511 -X-3.810Y41.235 -X-4.059Y41.095 -X-4.319Y40.953 -X-4.869Y40.664 -X-6.076Y40.071 -X-8.785Y38.840 -X-9.139Y38.683 -X-9.494Y38.526 -X-10.205Y38.212 -X-11.612Y37.583 -X-14.215Y36.343 -X-14.490Y36.201 -X-14.756Y36.061 -X-15.263Y35.782 -X-15.503Y35.645 -X-15.734Y35.508 -X-16.165Y35.239 -X-16.365Y35.106 -X-16.553Y34.975 -X-16.730Y34.845 -X-16.895Y34.717 -X-17.049Y34.590 -X-17.190Y34.465 -X-17.318Y34.341 -X-17.434Y34.219 -X-17.537Y34.099 -X-17.626Y33.981 -X-17.702Y33.865 -X-17.764Y33.751 -X-17.813Y33.639 -X-17.847Y33.528 -X-17.868Y33.420 -X-17.875Y33.315 -X-17.867Y33.211 -X-17.845Y33.110 -X-17.809Y33.011 -X-17.759Y32.914 -X-17.695Y32.820 -X-17.616Y32.728 -X-17.523Y32.639 -X-17.417Y32.552 -X-17.296Y32.468 -X-17.162Y32.387 -X-17.014Y32.308 -X-16.852Y32.232 -X-16.677Y32.159 -X-16.489Y32.089 -X-16.288Y32.021 -X-16.075Y31.956 -X-15.849Y31.895 -X-15.611Y31.836 -X-15.361Y31.780 -X-15.099Y31.727 -X-14.827Y31.677 -X-14.543Y31.631 -X-14.250Y31.587 -X-13.946Y31.547 -X-13.632Y31.509 -X-13.309Y31.475 -X-12.977Y31.444 -X-12.637Y31.417 -X-12.289Y31.392 -X-11.933Y31.371 -X-11.570Y31.353 -X-11.201Y31.338 -X-10.825Y31.327 -X-10.444Y31.319 -X-10.058Y31.314 -X-9.667Y31.313 -X-9.273Y31.315 -X-8.874Y31.320 -X-8.473Y31.329 -X-8.069Y31.341 -X-7.630Y31.358 -X-7.188Y31.379 -X-6.746Y31.404 -X-6.303Y31.433 -X-5.861Y31.466 -X-5.421Y31.503 -X-4.982Y31.544 -X-4.546Y31.589 -X-4.113Y31.638 -X-3.684Y31.691 -X-3.260Y31.748 -X-2.841Y31.809 -X-2.428Y31.873 -X-2.021Y31.942 -X-1.231Y32.091 -X-0.848Y32.171 -X-0.475Y32.255 -X-0.110Y32.343 -X0.243Y32.434 -X0.587Y32.530 -X0.919Y32.629 -X1.547Y32.838 -X1.842Y32.948 -X2.124Y33.061 -X2.392Y33.178 -X2.647Y33.299 -X2.887Y33.423 -X3.112Y33.550 -X3.323Y33.681 -X3.518Y33.815 -X3.698Y33.952 -X3.862Y34.092 -X4.010Y34.236 -X4.142Y34.383 -X4.257Y34.533 -X4.356Y34.685 -X4.439Y34.841 -X4.505Y35.000 -X4.554Y35.161 -X4.586Y35.325 -X4.602Y35.492 -X4.602Y35.662 -X4.584Y35.834 -X4.551Y36.008 -X4.501Y36.185 -X4.435Y36.364 -X4.353Y36.546 -X4.255Y36.730 -X4.142Y36.916 -X4.014Y37.104 -X3.871Y37.294 -X3.713Y37.486 -X3.356Y37.876 -X3.157Y38.073 -X2.944Y38.272 -X2.483Y38.675 -X1.425Y39.496 -X1.155Y39.690 -X0.877Y39.885 -X0.300Y40.277 -X-0.925Y41.070 -X-3.540Y42.667 -X-3.871Y42.867 -X-4.202Y43.066 -X-4.858Y43.463 -X-6.136Y44.252 -X-6.444Y44.447 -X-6.748Y44.642 -X-7.337Y45.028 -X-8.430Y45.788 -X-8.682Y45.975 -X-8.926Y46.161 -X-9.383Y46.527 -X-9.596Y46.708 -X-9.799Y46.887 -X-10.170Y47.241 -X-10.337Y47.415 -X-10.493Y47.587 -X-10.636Y47.757 -X-10.766Y47.925 -X-10.884Y48.091 -X-10.988Y48.255 -X-11.078Y48.416 -X-11.155Y48.576 -X-11.218Y48.733 -X-11.267Y48.888 -X-11.301Y49.040 -X-11.322Y49.190 -X-11.328Y49.337 -X-11.319Y49.482 -X-11.296Y49.624 -X-11.259Y49.763 -X-11.207Y49.900 -X-11.140Y50.033 -X-11.059Y50.164 -X-10.963Y50.293 -X-10.853Y50.418 -X-10.729Y50.540 -X-10.591Y50.659 -X-10.439Y50.775 -X-10.276Y50.886 -X-10.100Y50.994 -X-9.912Y51.098 -X-9.710Y51.200 -X-9.496Y51.298 -X-9.270Y51.394 -X-8.783Y51.574 -X-8.522Y51.660 -X-8.250Y51.742 -X-7.968Y51.821 -X-7.675Y51.897 -X-7.372Y51.969 -X-7.059Y52.038 -X-6.407Y52.165 -X-6.068Y52.223 -X-5.722Y52.278 -X-5.368Y52.330 -X-5.006Y52.378 -X-4.639Y52.422 -X-4.265Y52.463 -X-3.886Y52.500 -X-3.501Y52.533 -X-3.112Y52.563 -X-2.719Y52.590 -X-2.322Y52.613 -X-1.923Y52.632 -X-1.521Y52.647 -X-1.116Y52.659 -X-0.711Y52.667 -X-0.304Y52.672 -X0.103Y52.673 -X0.510Y52.670 -X0.916Y52.664 -X1.321Y52.654 -X1.724Y52.640 -X2.125Y52.623 -X2.524Y52.602 -X2.919Y52.577 -X3.310Y52.549 -X3.696Y52.517 -X4.078Y52.481 -X4.455Y52.442 -X4.826Y52.400 -X5.190Y52.354 -X5.548Y52.304 -X5.898Y52.251 -X6.241Y52.194 -X6.576Y52.134 -X6.902Y52.070 -X7.219Y52.003 -X7.526Y51.933 -X7.824Y51.859 -X8.389Y51.701 -X8.656Y51.617 -X8.911Y51.530 -X9.154Y51.439 -X9.386Y51.346 -X9.606Y51.249 -X9.814Y51.149 -X10.009Y51.046 -X10.191Y50.939 -X10.374Y50.821 -X10.541Y50.698 -X10.693Y50.573 -X10.829Y50.444 -X10.948Y50.311 -X11.052Y50.175 -X11.139Y50.036 -X11.209Y49.894 -X11.263Y49.748 -X11.301Y49.600 -X11.323Y49.448 -X11.327Y49.293 -X11.316Y49.136 -X11.288Y48.975 -X11.245Y48.812 -X11.185Y48.646 -X11.109Y48.478 -X11.018Y48.307 -X10.912Y48.133 -X10.790Y47.957 -X10.654Y47.779 -X10.503Y47.598 -X10.159Y47.230 -X9.967Y47.043 -X9.762Y46.854 -X9.314Y46.470 -X8.282Y45.681 -X7.999Y45.480 -X7.707Y45.278 -X7.098Y44.870 -X5.798Y44.041 -X3.014Y42.350 -X2.662Y42.138 -X2.311Y41.925 -X1.617Y41.500 -X0.273Y40.654 -X-0.049Y40.444 -X-0.365Y40.234 -X-0.975Y39.817 -X-2.088Y38.994 -X-2.324Y38.805 -X-2.551Y38.617 -X-2.974Y38.245 -X-3.170Y38.061 -X-3.354Y37.878 -X-3.687Y37.516 -X-3.836Y37.338 -X-3.972Y37.162 -X-4.096Y36.987 -X-4.206Y36.813 -X-4.304Y36.642 -X-4.388Y36.473 -X-4.459Y36.305 -X-4.515Y36.139 -X-4.558Y35.976 -X-4.587Y35.815 -X-4.602Y35.655 -X-4.603Y35.498 -X-4.589Y35.343 -X-4.561Y35.191 -X-4.519Y35.041 -X-4.462Y34.893 -X-4.391Y34.748 -X-4.306Y34.605 -X-4.207Y34.465 -X-4.094Y34.327 -X-3.967Y34.192 -X-3.826Y34.060 -X-3.671Y33.930 -X-3.503Y33.803 -X-3.321Y33.679 -X-3.126Y33.558 -X-2.919Y33.440 -X-2.698Y33.324 -X-2.466Y33.212 -X-2.221Y33.102 -X-1.697Y32.893 -X-1.418Y32.792 -X-1.128Y32.695 -X-0.828Y32.601 -X-0.518Y32.510 -X-0.198Y32.422 -X0.131Y32.338 -X0.814Y32.178 -X1.168Y32.104 -X1.529Y32.032 -X1.897Y31.964 -X2.271Y31.899 -X2.651Y31.838 -X3.037Y31.780 -X3.822Y31.674 -X4.221Y31.626 -X4.622Y31.581 -X5.027Y31.540 -X5.434Y31.502 -X5.842Y31.468 -X6.252Y31.437 -X6.662Y31.410 -X7.072Y31.386 -X7.515Y31.363 -X7.957Y31.345 -X8.398Y31.331 -X8.835Y31.321 -X9.269Y31.315 -X9.699Y31.313 -X10.123Y31.315 -X10.543Y31.321 -X10.956Y31.330 -X11.362Y31.344 -X11.761Y31.362 -X12.152Y31.383 -X12.534Y31.409 -X12.907Y31.438 -X13.269Y31.471 -X13.622Y31.508 -X13.963Y31.549 -X14.293Y31.593 -X14.611Y31.641 -X14.916Y31.693 -X15.209Y31.749 -X15.487Y31.808 -X15.753Y31.870 -X16.003Y31.936 -X16.240Y32.006 -X16.461Y32.079 -X16.667Y32.155 -X16.858Y32.235 -X17.033Y32.318 -X17.191Y32.404 -X17.334Y32.493 -X17.460Y32.586 -X17.570Y32.681 -X17.662Y32.780 -X17.739Y32.881 -X17.798Y32.986 -X17.840Y33.093 -X17.866Y33.203 -X17.875Y33.316 -X17.867Y33.431 -X17.842Y33.549 -X17.801Y33.670 -X17.743Y33.793 -X17.669Y33.918 -X17.579Y34.045 -X17.473Y34.175 -X17.352Y34.307 -X17.215Y34.441 -X17.063Y34.577 -X16.897Y34.715 -X16.522Y34.997 -X16.314Y35.140 -X16.093Y35.285 -X15.614Y35.580 -X15.357Y35.729 -X15.089Y35.879 -X14.522Y36.184 -X13.280Y36.806 -X12.957Y36.960 -X12.628Y37.115 -X11.954Y37.427 -X10.561Y38.054 -X7.746Y39.303 -X7.404Y39.457 -X7.067Y39.611 -X6.409Y39.915 -X5.172Y40.511 -X4.883Y40.657 -X4.603Y40.802 -X4.074Y41.087 -X3.825Y41.227 -X3.588Y41.365 -X3.148Y41.636 -X2.947Y41.769 -X2.760Y41.900 -X2.585Y42.029 -X2.425Y42.156 -X2.278Y42.280 -X2.146Y42.402 -X2.028Y42.522 -X1.926Y42.639 -X1.839Y42.754 -X1.767Y42.866 -X1.711Y42.976 -X1.671Y43.083 -X1.646Y43.187 -X1.638Y43.289 -X1.645Y43.387 -X1.669Y43.483 -X1.709Y43.576 -X1.765Y43.665 -X1.838Y43.752 -X1.926Y43.835 -X2.030Y43.915 -X2.150Y43.992 -X2.286Y44.065 -X2.438Y44.135 -X2.605Y44.202 -X2.787Y44.265 -X2.984Y44.324 -X3.195Y44.380 -X3.421Y44.433 -X3.661Y44.481 -X3.915Y44.526 -X4.182Y44.568 -X4.443Y44.603 -X4.714Y44.635 -X4.996Y44.663 -X5.289Y44.688 -X5.591Y44.710 -X5.902Y44.728 -X6.223Y44.743 -X6.552Y44.754 -X6.890Y44.762 -X7.235Y44.766 -X7.587Y44.767 -X7.946Y44.764 -X8.311Y44.758 -X8.683Y44.748 -X9.059Y44.735 -X9.440Y44.717 -X9.826Y44.697 -X10.216Y44.672 -X10.608Y44.644 -X11.004Y44.613 -X11.401Y44.578 -X11.800Y44.539 -X12.602Y44.450 -X13.003Y44.400 -X13.403Y44.347 -X13.803Y44.289 -X14.201Y44.229 -X14.596Y44.164 -X14.990Y44.096 -X15.766Y43.949 -X16.148Y43.870 -X16.525Y43.787 -X17.263Y43.611 -X17.623Y43.518 -X17.976Y43.421 -X18.661Y43.217 -X18.991Y43.109 -X19.313Y42.999 -X19.626Y42.884 -X19.929Y42.767 -X20.223Y42.645 -X20.506Y42.521 -X21.041Y42.262 -X21.292Y42.127 -X21.531Y41.990 -X21.758Y41.849 -X21.974Y41.704 -X22.176Y41.557 -X22.366Y41.407 -X22.544Y41.253 -X22.708Y41.097 -X22.859Y40.937 -X22.996Y40.775 -X23.119Y40.609 -X23.229Y40.441 -X23.325Y40.269 -X23.407Y40.095 -X23.475Y39.919 -X23.529Y39.739 -X23.571Y39.541 -X23.597Y39.341 -X23.606Y39.137 -X23.599Y38.930 -X23.575Y38.721 -X23.534Y38.508 -X23.477Y38.293 -X23.404Y38.075 -X23.315Y37.855 -X23.211Y37.632 -X23.091Y37.406 -X22.955Y37.178 -X22.805Y36.948 -X22.640Y36.716 -X22.268Y36.244 -X22.061Y36.005 -X21.841Y35.765 -X21.364Y35.278 -X20.274Y34.284 -X19.975Y34.031 -X19.668Y33.778 -X19.029Y33.267 -X17.670Y32.234 -X17.316Y31.974 -X16.959Y31.713 -X16.236Y31.190 -X14.771Y30.140 -X14.405Y29.877 -X14.040Y29.614 -X13.319Y29.089 -X11.923Y28.043 -X11.588Y27.783 -X11.260Y27.524 -X10.626Y27.008 -X10.322Y26.752 -X10.027Y26.497 -X9.467Y25.990 -X9.203Y25.738 -X8.951Y25.488 -X8.482Y24.992 -X8.266Y24.747 -X8.064Y24.503 -X7.700Y24.021 -X7.550Y23.799 -X7.412Y23.578 -X7.288Y23.359 -X7.177Y23.143 -X7.079Y22.928 -X6.995Y22.715 -X6.925Y22.504 -X6.868Y22.295 -X6.826Y22.089 -X6.798Y21.884 -X6.784Y21.682 -X6.785Y21.483 -X6.800Y21.285 -X6.829Y21.091 -X6.873Y20.898 -X6.931Y20.708 -X7.003Y20.521 -X7.090Y20.336 -X7.191Y20.154 -X7.306Y19.975 -X7.434Y19.799 -X7.577Y19.625 -X7.733Y19.454 -X7.903Y19.286 -X8.085Y19.121 -X8.281Y18.959 -X8.489Y18.800 -X8.710Y18.644 -X8.943Y18.491 -X9.188Y18.341 -X9.711Y18.051 -X9.989Y17.910 -X10.278Y17.773 -X10.884Y17.508 -X11.201Y17.381 -X11.527Y17.257 -X12.203Y17.019 -X12.552Y16.905 -X12.908Y16.795 -X13.639Y16.584 -X14.012Y16.484 -X14.390Y16.387 -X15.159Y16.204 -X15.548Y16.118 -X15.940Y16.035 -X16.729Y15.880 -X17.126Y15.808 -X17.522Y15.739 -X18.315Y15.612 -X18.709Y15.554 -X19.102Y15.499 -X19.492Y15.448 -X19.879Y15.401 -X20.263Y15.357 -X20.642Y15.316 -X21.017Y15.279 -X21.387Y15.245 -X21.744Y15.215 -X22.095Y15.189 -X22.440Y15.166 -X22.778Y15.146 -X23.109Y15.129 -X23.431Y15.116 -X23.746Y15.106 -X24.052Y15.099 -X24.349Y15.095 -X24.636Y15.095 -X24.914Y15.097 -X25.181Y15.103 -X25.438Y15.112 -X25.684Y15.123 -X25.919Y15.138 -X26.142Y15.156 -X26.354Y15.177 -X26.553Y15.200 -X26.740Y15.227 -X26.914Y15.256 -X27.076Y15.288 -X27.225Y15.323 -X27.360Y15.361 -X27.482Y15.402 -X27.591Y15.445 -X27.686Y15.491 -X27.767Y15.539 -X27.835Y15.590 -X27.888Y15.643 -X27.928Y15.699 -X27.954Y15.757 -X27.965Y15.818 -X27.963Y15.881 -X27.947Y15.946 -X27.917Y16.014 -X27.873Y16.083 -X27.816Y16.155 -X27.744Y16.229 -X27.660Y16.305 -X27.562Y16.382 -X27.451Y16.462 -X27.327Y16.544 -X27.042Y16.712 -X26.881Y16.799 -X26.707Y16.887 -X26.326Y17.069 -X26.118Y17.162 -X25.900Y17.256 -X25.433Y17.449 -X24.385Y17.849 -X21.934Y18.690 -X21.575Y18.807 -X21.212Y18.925 -X20.474Y19.161 -X18.977Y19.635 -X16.040Y20.572 -X15.691Y20.686 -X15.348Y20.800 -X14.684Y21.024 -X13.458Y21.457 -X13.176Y21.562 -X12.904Y21.666 -X12.396Y21.868 -X12.159Y21.966 -X11.936Y22.063 -X11.528Y22.250 -X11.345Y22.340 -X11.176Y22.429 -X11.022Y22.515 -X10.882Y22.599 -X10.757Y22.681 -X10.648Y22.760 -X10.554Y22.836 -X10.476Y22.910 -X10.413Y22.982 -X10.367Y23.051 -X10.337Y23.117 -X10.323Y23.180 -X10.325Y23.240 -X10.344Y23.298 -X10.379Y23.352 -X10.430Y23.403 -X10.497Y23.452 -X10.580Y23.497 -X10.680Y23.538 -X10.795Y23.577 -X10.926Y23.612 -X11.072Y23.644 -X11.233Y23.673 -X11.410Y23.698 -X11.601Y23.719 -X11.807Y23.737 -X12.027Y23.751 -X12.260Y23.762 -X12.507Y23.769 -X12.767Y23.772 -X13.040Y23.771 -X13.325Y23.767 -X13.601Y23.760 -X13.887Y23.749 -X14.182Y23.734 -X14.486Y23.717 -X14.799Y23.696 -X15.120Y23.671 -X15.448Y23.643 -X15.784Y23.612 -X16.126Y23.577 -X16.475Y23.538 -X16.829Y23.496 -X17.188Y23.450 -X17.552Y23.401 -X17.921Y23.348 -X18.667Y23.232 -X19.045Y23.169 -X19.424Y23.102 -X20.187Y22.957 -X20.569Y22.879 -X20.951Y22.797 -X21.712Y22.623 -X22.090Y22.531 -X22.466Y22.435 -X23.208Y22.232 -X23.574Y22.125 -X23.935Y22.015 -X24.641Y21.784 -X24.985Y21.663 -X25.323Y21.538 -X25.977Y21.279 -X26.292Y21.144 -X26.599Y21.006 -X27.186Y20.719 -X27.465Y20.571 -X27.734Y20.419 -X27.993Y20.264 -X28.241Y20.106 -X28.477Y19.944 -X28.702Y19.779 -X29.116Y19.440 -X29.305Y19.266 -X29.481Y19.088 -X29.644Y18.908 -X29.794Y18.724 -X29.930Y18.538 -X30.053Y18.349 -X30.162Y18.156 -X30.258Y17.961 -X30.339Y17.763 -X30.406Y17.563 -X30.459Y17.359 -X30.498Y17.153 -X30.522Y16.944 -X30.532Y16.733 -X30.528Y16.519 -X30.510Y16.303 -X30.474Y16.066 -X30.421Y15.826 -X30.352Y15.583 -X30.266Y15.337 -X30.164Y15.089 -X30.046Y14.839 -X29.912Y14.586 -X29.762Y14.330 -X29.597Y14.073 -X29.417Y13.813 -X29.014Y13.287 -X28.791Y13.021 -X28.555Y12.753 -X28.044Y12.211 -X27.769Y11.938 -X27.483Y11.663 -X26.879Y11.109 -X25.553Y9.985 -X22.573Y7.693 -X22.183Y7.405 -X21.791Y7.116 -X21.005Y6.537 -X19.442Y5.382 -X19.058Y5.094 -X18.678Y4.806 -X17.931Y4.232 -X16.513Y3.095 -X16.178Y2.813 -X15.852Y2.532 -X15.229Y1.974 -X14.933Y1.697 -X14.649Y1.422 -X14.115Y0.876 -X13.867Y0.606 -X13.632Y0.337 -X13.411Y0.071 -X13.204Y-0.194 -X13.010Y-0.457 -X12.832Y-0.717 -X12.668Y-0.976 -X12.520Y-1.232 -X12.395Y-1.469 -X12.284Y-1.703 -X12.188Y-1.936 -X12.105Y-2.167 -X12.036Y-2.395 -X11.982Y-2.621 -X11.942Y-2.844 -X11.916Y-3.065 -X11.905Y-3.284 -X11.908Y-3.500 -X11.926Y-3.713 -X11.959Y-3.924 -X12.005Y-4.132 -X12.067Y-4.338 -X12.142Y-4.540 -X12.232Y-4.740 -X12.336Y-4.937 -X12.453Y-5.131 -X12.584Y-5.322 -X12.729Y-5.510 -X12.887Y-5.695 -X13.059Y-5.877 -X13.243Y-6.055 -X13.439Y-6.231 -X13.648Y-6.403 -X13.869Y-6.572 -X14.101Y-6.738 -X14.345Y-6.901 -X14.599Y-7.060 -X14.864Y-7.216 -X15.423Y-7.518 -X15.717Y-7.664 -X16.020Y-7.806 -X16.650Y-8.080 -X16.976Y-8.212 -X17.309Y-8.340 -X17.994Y-8.586 -X18.344Y-8.704 -X18.700Y-8.818 -X19.423Y-9.035 -X20.902Y-9.426 -X21.276Y-9.515 -X21.650Y-9.600 -X22.396Y-9.759 -X22.767Y-9.833 -X23.137Y-9.903 -X23.868Y-10.033 -X24.228Y-10.092 -X24.584Y-10.148 -X24.936Y-10.200 -X25.282Y-10.249 -X25.622Y-10.294 -X25.956Y-10.336 -X26.604Y-10.408 -X26.910Y-10.438 -X27.208Y-10.465 -X27.498Y-10.489 -X27.779Y-10.509 -X28.051Y-10.527 -X28.313Y-10.540 -X28.565Y-10.551 -X28.807Y-10.558 -X29.038Y-10.562 -X29.258Y-10.563 -X29.466Y-10.561 -X29.663Y-10.556 -X29.848Y-10.547 -X30.020Y-10.536 -X30.180Y-10.522 -X30.327Y-10.504 -X30.462Y-10.484 -X30.583Y-10.461 -X30.690Y-10.435 -X30.784Y-10.406 -X30.865Y-10.374 -X30.932Y-10.340 -X30.984Y-10.303 -X31.023Y-10.263 -X31.048Y-10.221 -X31.058Y-10.176 -X31.055Y-10.128 -X31.037Y-10.078 -X31.006Y-10.026 -X30.960Y-9.971 -X30.900Y-9.914 -X30.827Y-9.855 -X30.739Y-9.794 -X30.638Y-9.730 -X30.524Y-9.664 -X30.396Y-9.596 -X30.255Y-9.527 -X30.100Y-9.455 -X29.754Y-9.306 -X29.562Y-9.228 -X29.359Y-9.149 -X28.917Y-8.986 -X27.902Y-8.642 -X27.624Y-8.553 -X27.336Y-8.462 -X26.734Y-8.278 -X25.440Y-7.896 -X22.592Y-7.100 -X22.191Y-6.990 -X21.787Y-6.879 -X20.978Y-6.659 -X19.371Y-6.218 -X18.976Y-6.109 -X18.584Y-6.000 -X17.814Y-5.783 -X16.349Y-5.360 -X16.002Y-5.257 -X15.664Y-5.155 -X15.016Y-4.954 -X14.708Y-4.856 -X14.410Y-4.759 -X13.850Y-4.569 -X13.589Y-4.477 -X13.340Y-4.387 -X12.883Y-4.212 -X12.675Y-4.127 -X12.482Y-4.045 -X12.140Y-3.886 -X11.991Y-3.810 -X11.859Y-3.737 -X11.741Y-3.665 -X11.640Y-3.597 -X11.555Y-3.531 -X11.486Y-3.467 -X11.433Y-3.406 -X11.397Y-3.348 -X11.377Y-3.293 -X11.373Y-3.241 -X11.386Y-3.191 -X11.415Y-3.145 -X11.460Y-3.101 -X11.522Y-3.061 -X11.600Y-3.024 -X11.694Y-2.990 -X11.803Y-2.959 -X11.928Y-2.932 -X12.068Y-2.908 -X12.223Y-2.887 -X12.393Y-2.870 -X12.578Y-2.856 -X12.776Y-2.846 -X12.989Y-2.840 -X13.214Y-2.837 -X13.453Y-2.838 -X13.704Y-2.842 -X13.967Y-2.850 -X14.242Y-2.862 -X14.527Y-2.878 -X14.824Y-2.897 -X15.130Y-2.921 -X15.425Y-2.946 -X15.727Y-2.975 -X16.037Y-3.007 -X16.353Y-3.042 -X16.676Y-3.081 -X17.005Y-3.124 -X17.678Y-3.219 -X18.021Y-3.272 -X18.368Y-3.329 -X19.071Y-3.452 -X19.426Y-3.519 -X19.783Y-3.590 -X20.499Y-3.742 -X20.857Y-3.823 -X21.214Y-3.908 -X21.925Y-4.088 -X22.277Y-4.183 -X22.626Y-4.282 -X23.314Y-4.491 -X23.652Y-4.600 -X23.984Y-4.713 -X24.632Y-4.949 -X24.947Y-5.073 -X25.254Y-5.199 -X25.846Y-5.463 -X26.129Y-5.600 -X26.404Y-5.740 -X26.669Y-5.884 -X26.925Y-6.031 -X27.170Y-6.181 -X27.405Y-6.334 -X27.842Y-6.650 -X28.043Y-6.813 -X28.232Y-6.979 -X28.409Y-7.149 -X28.573Y-7.321 -X28.725Y-7.496 -X28.863Y-7.674 -X28.989Y-7.855 -X29.101Y-8.039 -X29.199Y-8.226 -X29.283Y-8.416 -X29.353Y-8.609 -X29.409Y-8.804 -X29.451Y-9.002 -X29.479Y-9.203 -X29.492Y-9.406 -X29.491Y-9.612 -X29.475Y-9.820 -X29.445Y-10.031 -X29.401Y-10.244 -X29.342Y-10.459 -X29.269Y-10.677 -X29.181Y-10.897 -X29.080Y-11.119 -X28.964Y-11.344 -X28.823Y-11.589 -X28.666Y-11.837 -X28.493Y-12.087 -X28.305Y-12.340 -X28.102Y-12.594 -X27.883Y-12.851 -X27.403Y-13.370 -X27.142Y-13.632 -X26.868Y-13.897 -X26.281Y-14.430 -X24.969Y-15.514 -X24.615Y-15.788 -X24.252Y-16.064 -X23.501Y-16.617 -X21.917Y-17.734 -X18.570Y-19.985 -X18.148Y-20.266 -X17.729Y-20.547 -X16.897Y-21.108 -X15.285Y-22.222 -X14.896Y-22.498 -X14.515Y-22.774 -X13.775Y-23.321 -X12.409Y-24.400 -X12.095Y-24.666 -X11.792Y-24.930 -X11.223Y-25.453 -X10.958Y-25.712 -X10.707Y-25.968 -X10.246Y-26.475 -X10.038Y-26.725 -X9.845Y-26.973 -X9.667Y-27.218 -X9.505Y-27.461 -X9.359Y-27.702 -X9.229Y-27.940 -X9.115Y-28.175 -X9.017Y-28.407 -X8.938Y-28.632 -X8.874Y-28.855 -X8.827Y-29.074 -X8.796Y-29.291 -X8.781Y-29.505 -X8.782Y-29.716 -X8.799Y-29.923 -X8.833Y-30.128 -X8.882Y-30.329 -X8.947Y-30.527 -X9.028Y-30.722 -X9.125Y-30.914 -X9.236Y-31.102 -X9.363Y-31.286 -X9.505Y-31.467 -X9.661Y-31.645 -X9.832Y-31.819 -X10.016Y-31.989 -X10.214Y-32.155 -X10.425Y-32.318 -X10.649Y-32.477 -X10.885Y-32.633 -X11.393Y-32.932 -X11.664Y-33.076 -X11.945Y-33.215 -X12.536Y-33.483 -X12.846Y-33.611 -X13.163Y-33.735 -X13.821Y-33.971 -X14.160Y-34.082 -X14.504Y-34.190 -X15.209Y-34.393 -X15.568Y-34.488 -X15.930Y-34.579 -X16.661Y-34.748 -X17.029Y-34.827 -X17.397Y-34.901 -X17.766Y-34.971 -X18.134Y-35.037 -X18.501Y-35.099 -X18.865Y-35.157 -X19.585Y-35.260 -X19.940Y-35.305 -X20.290Y-35.346 -X20.634Y-35.383 -X20.973Y-35.416 -X21.305Y-35.444 -X21.630Y-35.469 -X21.947Y-35.490 -X22.256Y-35.506 -X22.556Y-35.519 -X22.847Y-35.527 -X23.128Y-35.532 -X23.398Y-35.532 -X23.657Y-35.529 -X23.904Y-35.522 -X24.140Y-35.511 -X24.363Y-35.496 -X24.559Y-35.479 -X24.745Y-35.459 -X24.918Y-35.435 -X25.079Y-35.408 -X25.228Y-35.378 -X25.364Y-35.345 -X25.487Y-35.309 -X25.597Y-35.269 -X25.694Y-35.227 -X25.777Y-35.182 -X25.847Y-35.133 -X25.902Y-35.082 -X25.944Y-35.028 -X25.972Y-34.972 -X25.986Y-34.912 -X25.986Y-34.850 -X25.971Y-34.785 -X25.942Y-34.717 -X25.899Y-34.647 -X25.842Y-34.575 -X25.771Y-34.499 -X25.685Y-34.422 -X25.586Y-34.342 -X25.472Y-34.260 -X25.345Y-34.175 -X25.204Y-34.088 -X24.883Y-33.909 -X24.702Y-33.815 -X24.509Y-33.720 -X24.085Y-33.525 -X23.855Y-33.424 -X23.613Y-33.321 -X23.095Y-33.112 -X21.933Y-32.673 -X19.198Y-31.738 -X12.952Y-29.747 -X12.533Y-29.612 -X12.117Y-29.477 -X11.302Y-29.208 -X9.752Y-28.680 -X9.384Y-28.550 -X9.026Y-28.422 -X8.340Y-28.168 -X7.104Y-27.677 -X6.826Y-27.559 -X6.561Y-27.442 -X6.073Y-27.213 -X5.850Y-27.102 -X5.643Y-26.992 -X5.272Y-26.780 -X5.111Y-26.677 -X4.965Y-26.577 -X4.835Y-26.479 -X4.721Y-26.383 -X4.623Y-26.290 -X4.542Y-26.199 -X4.478Y-26.112 -X4.430Y-26.026 -X4.398Y-25.944 -X4.384Y-25.865 -X4.385Y-25.788 -X4.403Y-25.714 -X4.438Y-25.644 -X4.489Y-25.576 -X4.556Y-25.512 -X4.639Y-25.450 -X4.738Y-25.392 -X4.852Y-25.337 -X4.981Y-25.286 -X5.126Y-25.238 -X5.285Y-25.193 -X5.458Y-25.152 -X5.646Y-25.115 -X5.847Y-25.080 -X6.061Y-25.050 -X6.287Y-25.023 -X6.527Y-25.000 -X6.777Y-24.980 -X7.040Y-24.964 -X7.313Y-24.952 -X7.596Y-24.944 -X7.889Y-24.939 -X8.191Y-24.939 -X8.502Y-24.942 -X8.820Y-24.949 -X9.146Y-24.960 -X9.478Y-24.975 -X9.817Y-24.994 -X10.161Y-25.017 -X10.510Y-25.044 -X10.839Y-25.072 -X11.171Y-25.104 -X11.506Y-25.140 -X11.842Y-25.179 -X12.180Y-25.221 -X12.519Y-25.267 -X13.196Y-25.370 -X13.534Y-25.427 -X13.870Y-25.487 -X14.204Y-25.550 -X14.535Y-25.617 -X14.864Y-25.688 -X15.188Y-25.762 -X15.824Y-25.920 -X16.134Y-26.004 -X16.438Y-26.092 -X16.736Y-26.183 -X17.027Y-26.277 -X17.311Y-26.375 -X17.587Y-26.476 -X18.113Y-26.689 -X18.362Y-26.800 -X18.602Y-26.914 -X18.832Y-27.032 -X19.052Y-27.152 -X19.260Y-27.276 -X19.457Y-27.403 -X19.643Y-27.534 -X19.817Y-27.667 -X19.979Y-27.803 -X20.128Y-27.943 -X20.264Y-28.085 -X20.387Y-28.230 -X20.497Y-28.379 -X20.594Y-28.530 -X20.676Y-28.684 -X20.745Y-28.840 -X20.800Y-29.000 -X20.841Y-29.162 -X20.867Y-29.327 -X20.879Y-29.494 -X20.876Y-29.664 -X20.859Y-29.837 -X20.828Y-30.012 -X20.781Y-30.189 -X20.721Y-30.369 -X20.645Y-30.551 -X20.556Y-30.735 -X20.452Y-30.922 -X20.333Y-31.110 -X20.201Y-31.301 -X20.055Y-31.494 -X19.894Y-31.688 -X19.721Y-31.885 -X19.533Y-32.084 -X19.120Y-32.486 -X18.893Y-32.690 -X18.655Y-32.896 -X18.142Y-33.311 -X17.874Y-33.517 -X17.595Y-33.724 -X17.007Y-34.142 -X15.720Y-34.991 -X12.798Y-36.727 -X12.410Y-36.947 -X12.018Y-37.167 -X11.225Y-37.607 -X9.621Y-38.487 -X6.455Y-40.236 -X6.074Y-40.452 -X5.697Y-40.668 -X4.960Y-41.096 -X3.566Y-41.941 -X3.237Y-42.149 -X2.916Y-42.356 -X2.302Y-42.766 -X1.194Y-43.568 -X0.944Y-43.764 -X0.706Y-43.959 -X0.264Y-44.342 -X0.062Y-44.531 -X-0.128Y-44.718 -X-0.469Y-45.085 -X-0.620Y-45.266 -X-0.758Y-45.444 -X-0.882Y-45.620 -X-0.993Y-45.794 -X-1.090Y-45.965 -X-1.173Y-46.134 -X-1.243Y-46.301 -X-1.298Y-46.465 -X-1.342Y-46.640 -X-1.371Y-46.812 -X-1.382Y-46.980 -X-1.378Y-47.146 -X-1.357Y-47.308 -X-1.320Y-47.467 -X-1.267Y-47.622 -X-1.198Y-47.775 -X-1.114Y-47.923 -X-1.014Y-48.068 -X-0.899Y-48.210 -X-0.769Y-48.348 -X-0.625Y-48.482 -X-0.466Y-48.612 -X-0.293Y-48.739 -X-0.107Y-48.862 -X0.093Y-48.981 -X0.305Y-49.097 -X0.530Y-49.208 -X0.766Y-49.315 -X1.014Y-49.419 -X1.273Y-49.518 -X1.822Y-49.705 -X2.110Y-49.792 -X2.407Y-49.875 -X2.713Y-49.954 -X3.026Y-50.029 -X3.346Y-50.100 -X3.672Y-50.166 -X4.004Y-50.229 -X4.341Y-50.287 -X4.683Y-50.340 -X5.028Y-50.390 -X5.376Y-50.435 -X5.727Y-50.476 -X6.080Y-50.513 -X6.433Y-50.545 -X6.787Y-50.573 -X7.141Y-50.597 -X7.494Y-50.617 -X7.845Y-50.632 -X8.194Y-50.643 -X8.540Y-50.650 -X8.882Y-50.652 -X9.220Y-50.651 -X9.553Y-50.645 -X9.881Y-50.635 -X10.202Y-50.620 -X10.516Y-50.602 -X10.823Y-50.579 -X11.122Y-50.552 -X11.412Y-50.521 -X11.693Y-50.486 -X11.964Y-50.447 -X12.225Y-50.404 -X12.475Y-50.356 -X12.714Y-50.305 -X12.941Y-50.250 -X13.155Y-50.191 -X13.357Y-50.128 -X13.546Y-50.061 -X13.721Y-49.990 -X13.882Y-49.916 -X14.020Y-49.843 -X14.144Y-49.767 -X14.256Y-49.688 -X14.355Y-49.605 -X14.441Y-49.520 -X14.513Y-49.431 -X14.571Y-49.340 -X14.615Y-49.245 -X14.645Y-49.148 -X14.662Y-49.048 -X14.664Y-48.944 -X14.651Y-48.838 -X14.625Y-48.730 -X14.584Y-48.618 -X14.529Y-48.504 -X14.459Y-48.387 -X14.376Y-48.268 -X14.278Y-48.146 -X14.166Y-48.022 -X14.040Y-47.896 -X13.900Y-47.767 -X13.747Y-47.635 -X13.399Y-47.366 -X13.206Y-47.228 -X12.999Y-47.088 -X12.548Y-46.803 -X11.504Y-46.209 -X11.215Y-46.057 -X10.916Y-45.902 -X10.287Y-45.589 -X8.923Y-44.948 -X5.870Y-43.614 -X5.468Y-43.444 -X5.063Y-43.274 -X4.246Y-42.931 -X2.603Y-42.244 -X-0.599Y-40.871 -X-1.025Y-40.682 -X-1.444Y-40.493 -X-2.257Y-40.118 -X-3.764Y-39.380 -X-4.113Y-39.199 -X-4.450Y-39.019 -X-5.084Y-38.665 -X-5.380Y-38.490 -X-5.662Y-38.317 -X-6.181Y-37.977 -X-6.417Y-37.810 -X-6.637Y-37.645 -X-6.841Y-37.483 -X-7.028Y-37.322 -X-7.199Y-37.165 -X-7.352Y-37.009 -X-7.488Y-36.856 -X-7.607Y-36.706 -X-7.708Y-36.559 -X-7.791Y-36.414 -X-7.856Y-36.272 -X-7.904Y-36.133 -X-7.934Y-35.997 -X-7.946Y-35.864 -X-7.941Y-35.734 -X-7.918Y-35.608 -X-7.877Y-35.484 -X-7.819Y-35.364 -X-7.744Y-35.247 -X-7.652Y-35.134 -X-7.543Y-35.024 -X-7.418Y-34.918 -X-7.277Y-34.815 -X-7.121Y-34.716 -X-6.949Y-34.620 -X-6.762Y-34.528 -X-6.560Y-34.440 -X-6.345Y-34.356 -X-6.116Y-34.276 -X-5.874Y-34.199 -X-5.620Y-34.127 -X-5.353Y-34.058 -X-5.076Y-33.993 -X-4.787Y-33.933 -X-4.489Y-33.876 -X-4.181Y-33.824 -X-3.864Y-33.775 -X-3.539Y-33.731 -X-3.207Y-33.691 -X-2.867Y-33.655 -X-2.522Y-33.623 -X-2.172Y-33.596 -X-1.817Y-33.572 -X-1.458Y-33.553 -X-1.096Y-33.538 -X-0.732Y-33.528 -X-0.366Y-33.521 -X0.000Y-33.519 -G0Z6.000 -G0X37.560Y12.327Z6.000 -G1Z-1.000 -G1Y0.876 -X49.011 -Y12.327 -X37.560 -G0Z6.000 -G0Y0.876 -G1Z-1.000 -G1Y-10.575 -X49.011 -Y0.876 -X37.560 -G0Z6.000 -G0X49.011Y12.327 -G1Z-1.000 -G1X52.084Y15.011 -G0Z6.000 -G0X49.011Y0.876 -G1Z-1.000 -G1X52.084Y6.213 -Y15.011 -X43.286 -X37.560Y12.327 -G0Z6.000 -G0X49.011Y-10.575 -G1Z-1.000 -G1X52.084Y-2.585 -Y6.213 -X49.011Y0.876 -G0Z6.000 -G0Z20.000 -G0X0.000Y0.000 -M30 diff --git a/test/settings/kikigey89.settings b/test/settings/kikigey89.settings deleted file mode 100644 index e367d5011..000000000 --- a/test/settings/kikigey89.settings +++ /dev/null @@ -1,31 +0,0 @@ -(Machine settings provided by @kikigey89) -$0=87.489 (x, step/mm) -$1=87.489 (y, step/mm) -$2=1280.000 (z, step/mm) -$3=1000.000 (x max rate, mm/min) -$4=1000.000 (y max rate, mm/min) -$5=500.000 (z max rate, mm/min) -$6=10.000 (x accel, mm/sec^2) -$7=10.000 (y accel, mm/sec^2) -$8=10.000 (z accel, mm/sec^2) -$9=211.000 (x max travel, mm) -$10=335.000 (y max travel, mm) -$11=70.000 (z max travel, mm) -$12=20 (step pulse, usec) -$13=160 (step port invert mask:10100000) -$14=160 (dir port invert mask:10100000) -$15=50 (step idle delay, msec) -$16=0.010 (junction deviation, mm) -$17=0.002 (arc tolerance, mm) -$19=0 (report inches, bool) -$20=1 (auto start, bool) -$21=0 (invert step enable, bool) -$22=0 (invert limit pins, bool) -$23=0 (soft limits, bool) -$24=0 (hard limits, bool) -$25=0 (homing cycle, bool) -$26=0 (homing dir invert mask:00000000) -$27=50.000 (homing feed, mm/min) -$28=500.000 (homing seek, mm/min) -$29=10 (homing debounce, msec) -$30=3.000 (homing pull-off, mm) \ No newline at end of file diff --git a/test/test.py b/test/test.py deleted file mode 100644 index 41c845c82..000000000 --- a/test/test.py +++ /dev/null @@ -1,25 +0,0 @@ -import random -import serial -import time -ser = serial.Serial('/dev/tty.usbmodem24111', 115200, timeout=0.001) -time.sleep(1) -outstanding = 0 -data = '' -while True: - time.sleep(0.1) - data += ser.read() - pos = data.find('\n') - if pos == -1: - line = '' - else: - line = data[0:pos + 1] - data = data[pos + 1:] - if line == '' and outstanding < 3: - while outstanding < 3: - ser.write("G0 Z%0.3f\n" % (0.01 * (random.random() - 0.5))) - #ser.write("M3\n") - outstanding += 1 - continue - if line == 'ok\r\n': - outstanding -= 1 - print outstanding, repr(line.rstrip()) \ No newline at end of file