# EMC controller parameters for a simulated machine.
# General note: Comments can either be preceded with a # or ; - either is
# acceptable, although # is in keeping with most linux config files.
# General section -------------------------------------------------------------

[EMC]
# make emcsrv not create tool rcs channels if not using iocontrol
TOOL_CHANNELS = 0
# Name of NML file to use, default is emc.nml
NML_FILE =              no-iotask.nml
# Version of this INI file
VERSION = 1.0
# Name of machine, for use with display, etc.
MACHINE =               py.ini
# Debug level, 0 means no messages. See src/emc/nml_int/emcglb.h for others
#DEBUG =               0x7FFFFFFF
#DEBUG =               0x7FFFDEFF  #no interp,oword
#DEBUG  =   	       0x00008000 # py only
#DEBUG  =   	       0x0000E000 # py + remap + Oword
#DEBUG  =   	       0x0000C000 # py + remap
#DEBUG  =   	       0x0000C100 # py + remap + Interpreter
#DEBUG  =   	       0x0000C140 # py + remap + Interpreter + NML msgs
DEBUG  =   	        0x0000C040 # py + remap + NML
#DEBUG  =   	       0x0003E100 # py + remap + Interpreter + oword + signals + namedparams
#DEBUG =                0x00008000
#DEBUG = 0 # 0x00000100
#    0x00000001 Ausgabe ungültige Meldungen
#    0x00000002 Ausgabe Konfigurations-Settings
#    0x00000004 Ausgabe Defaults
#    0x00000008 Ausgabe Version
#    0x00000010 Ausgabe Task Meldungen
#    0x00000020 Ausgabe IO-Points
#    0x00000040 Ausgabe NML-Messages
#    0x00000080 Ausgabe Zeit zur Beendigung einer Motorbewegung
#    0x00000100 Ausgabe Intepreter Debugging
#    0x00000200 Ausgabe RCS-Debugging
#    0x00000400 Ausgabe Roh-Bahn-Daten
#    0x00000800 Ausgabe Interpreter List
#define EMC_DEBUG_IOCONTROL         0x00001000
#define EMC_DEBUG_OWORD             0x00002000
#define EMC_DEBUG_REMAP             0x00004000
#define EMC_DEBUG_PYTHON            0x00008000
#define EMC_DEBUG_NAMEDPARAM        0x00010000
# EMC_DEBUG_GDBONSIGNAL flag 0x00020000
#    0x7FFFFFFF Ausgabe alle Debugging Messages
# Sections for display options ------------------------------------------------

[DISPLAY]
GLADEVCP=osubdemo-ns.ui
# Name of display program, e.g., xemc
DISPLAY =             axis
#OPEN_FILE=../../nc_files/m66test.ngc
#OPEN_FILE=/home/mah/emc2-tc/nc_files/arcspiral.ngc
#OPEN_FILE=/home/mah/emc2-tc/nc_files/taskcall.ngc
OPEN_FILE=./taskcall.ngc
# Cycle time, in seconds, that display will sleep between polls
CYCLE_TIME =            0.100
# Path to help file
HELP_FILE =             doc/help.txt
# Initial display setting for position, RELATIVE or MACHINE
POSITION_OFFSET =       RELATIVE
# Initial display setting for position, COMMANDED or ACTUAL
POSITION_FEEDBACK =     ACTUAL
# Highest value that will be allowed for feed override, 1.0 = 100%
MAX_FEED_OVERRIDE =     1.2
MAX_SPINDLE_OVERRIDE =  1.0
# Prefix to be used
#PROGRAM_PREFIX = /home/mah/emc2-tc/nc_files/
PROGRAM_PREFIX = ../../nc_files
# Introductory graphic
#INTRO_GRAPHIC = emc2.gif
INTRO_TIME = 0
#EDITOR = geany
INCREMENTS = 1 mm, .01 in, .1mm, 1 mil, .1 mil, 1/8000 in

[FILTER]
PROGRAM_EXTENSION = .png,.gif,.jpg Grayscale Depth Image
PROGRAM_EXTENSION = .py Python Script
png = image-to-gcode
gif = image-to-gcode
jpg = image-to-gcode
py = python3
# Task controller section -----------------------------------------------------

[RS274NGC]
#PRINT_CODES = 1
SUBROUTINE_PATH = ../../nc_files/remap_lib/common_nc_subs
#RS274NGC_STARTUP_CODE = G21
# this bombs - machine not on yet so no 'I/O' possible
#RS274NGC_STARTUP_CODE = M61Q3
# handler procedure called on aborts - to cleanup HAL pins etc
#ON_ABORT_COMMAND=o<on_abort>call
#LOG_FILE= py.log
LOG_LEVEL = 9
# File containing interpreter variables
PARAMETER_FILE =        sim_mm.var
# generalized  remapping
#------------------------
# currently only unused M- and G-codes may be activated as per below, except for the
# T,M6,M61,S and F codes.
# G: currently supported modal group: 1
# M:currently supported modal groups: 5,6,7,8,9,10
# for T,S,F remaps the modal group is fixed and any modalgroup= option is ignored
# An argument specification (keyword 'argspec') describes required and  permitted words,
# and preconditions for that code to execute.
#

# It consists of 0-n characters of the class [@A-KMNP-Za-kmnp-z^>] .
#
# parameter words:
#   an uppercase letter for each required parameter 'word'
#   a lowercase letter for each optional parameter 'word'
#
# Preconditions:
#   an '^' means: speed must be > 0
#   an '>' means: feed must be > 0
#
# if calling an NGC oword function (ngc=<funcname>), the parameters are passed
# as local named parameters which are already set when the function starts
# optional words are passed if set in the block, and may be tested for existence
# by # EXISTS(#<..>) .
#
# example:
# REMAP=M400  modalgroup=10 argspec=Px ngc=demosub
#
# executing 'M400 P2 X3' will result in the call
# o<demosub> call
#
# the demosub.ngc body might look as follows:
#-------------------------
# o<demosub> sub
#
# (debug, P=#<x>)   (note: P is required since it's uppercase in the argspec)
#
# (the x argspec is optional since its lowercase in the argspec. Use as follows:)
#

# o100 if [EXISTS[#<x>]]
#     (debug, X param set: #<x>)
# o100 endif
#
# o<demosub> endsub
# M2
#-------------------------
#
# Calling with traditional positioal parameter lists:
#
# To do so, add the '@' character to the argspec.
# In this case, the arguments (required or optional) will be passed tradional-style
# ini example:
# REMAP=M400  modalgroup=10 argspec=@XYp ngc=demosub
#
# executing 'M400 X2 Y3' will result in the call

# o<demosub> call [2] [3]
#
# executing 'M400 X2 Y3 P4' will result in the call

# o<demosub> call [2] [3] [4]
#
# NB: you lose the capability to distinguish more than one optional parameter word!
#
# if calling a Python function, the actual words present in the block as
# required or optional are passed in the words dictionary; no positional
# parameters are passed in this case.
#REMAP=F  python=blah deppert -aanix
REMAP=G88.1 modalgroup=1  argspec=xyzpqr  ngc=g881min
REMAP=G88.2 modalgroup=1  argspec=xyzpqr  ngc=g882min prolog=addlocals
#prolog=fooprolog epilog=fooepilog
#REMAP=G88.6 modalgroup=1  argspec=@XYZ   ngc=g886
#REMAP=G88.8 modalgroup=1  argspec=XYZ    python=m315
# cone cycle
# abcdefhijklpqrstuvwxyz
REMAP=G88.9 modalgroup=1  argspec=@XZIJKLPQRABC  ngc=rcone

# ( o<cone> call [X1][Z1][X2][Z2][step][feed][EngageZ][ClearAxial][ClearRadial][feedF][outflag])
# O<cone> sub
# (Startpoint)

# #<X1>		= [#1] X

# #<Z1>		= [#2] Z
# (Endpoint)

# #<X2>		= [#3] I

# #<Z2>		= [#4] J

# #<step>		= [#5] 	(Radial stepdown) K

# #<feed>		= [#6] 	(Roughing feed rate) L

# #<EngageZ>	= [#7] 	(Clearance to stock) P

# #<ClearAxial>	= [#8]	(Axial rest material for finishing) Q

# #<ClearRadial>	= [#9]	(Radial rest material for finishing) R

# #<feedF>	= [#10]	(Finishing feed rate) A

# #<outflag>	= [#11]	(Lead out move) B

# #<actX>		= [#3]	(Start position in X) C
#REMAP=M75   modalgroup=10 python=m250
#REMAP=M250  modalgroup=10 argspec=xyzpqr python=whoami prolog=fooprolog epilog=fooepilog
#REMAP=M251  modalgroup=6  argspec=xyzpqr python=whoami
#REMAP=M315  modalgroup=10 python=m315
REMAP=M400  modalgroup=10 prolog=introspect ngc=nestremap
REMAP=M401  modalgroup=10 prolog=introspect ngc=null_sub
REMAP=M402  modalgroup=10 argspec=p python=test_reschedule
REMAP=M403  modalgroup=10 argspec=p python=print_tool
REMAP=M404  modalgroup=10 argspec=PQ python=set_tool_zoffset
#REMAP=S  ngc=sdemo prolog=sprolog
#REMAP=F   ngc=null_sub # python=null_remap
#REMAP=S   python=null_remap
# see pythonsubs.py and nc_files/remap-subroutines
#REMAP=T argspec=T  prolog=prepare_prolog epilog=prepare_epilog ngc=prepare
#REMAP=M61  modalgroup=6  argspec=Q    python=set_tool_number
#REMAP=M6   modalgroup=6       prolog=change_prolog ngc=change epilog=change_epilog
# for a
REMAP=T   argspec=T      prolog=prepare_prolog ngc=rtdemo  epilog=prepare_epilog
REMAP=M6  modalgroup=6   prolog=change_prolog  ngc=rm6demo epilog=change_epilog
#REMAP=M61 modalgroup=6  prolog=change_prolog  ngc=rm6demo.ngc epilog=change_epilog
#REMAP=M61  modalgroup=6  argspec=Q    python=set_tool_number
# this needs work..
#RETAIN_G43=1
REMAP=M900 python=gen_backtrace  modalgroup=10
REMAP=M901 python=gdb_window 	 modalgroup=10
REMAP=M950 argspec=p python=symbols  modalgroup=10
# a plain .ngc sub call by M42:
#
#REMAP=M42 modalgroup=9  prolog=setup_m42 ngc=m42.ngc epilog=finish_m42
#
# semantics:
# if M42 is encountered, execute it in modal group 9.
# Fail if other group 9 codes are present in the current block.
# the setup_m42 prolog Python function will be called before executing 'o<m42> call'
# Then the O-word sub m42.ngc is executed.
# The finish_m42 epilog Python function will be executed after m42.ngc finishes.
#

[EMCMOT]
EMCMOT =              motmod
# Timeout for comm to emcmot, in seconds
COMM_TIMEOUT =          1.0
# BASE_PERIOD is unused in this configuration but specified in core_sim.hal
BASE_PERIOD  =               0
# Servo task period, in nano-seconds
SERVO_PERIOD =               1000000
# Hardware Abstraction Layer section --------------------------------------------------

[TASK]
# Name of task controller program, e.g., milltask
TASK =                  milltask
# Cycle time, in seconds, that task controller will sleep between polls
CYCLE_TIME =            0.001
# the Python plugins serves the interpreter as well as task

[HAL]
# The run script first uses halcmd to execute any HALFILE
# files, and then to execute any individual HALCMD commands.
#
# list of hal config files to run through halcmd
# files are executed in the order in which they appear
#HALFILE =                    core_sim_noio.hal
#HALFILE =                    core_sim.hal
POSTTASK_HALFILE =                    core_sim_test.hal
#HALFILE = axis_owordsub_manualtoolchange.hal
#HALFILE = simulated_home.hal
POSTTASK_HALFILE = simulated_home.hal
#HALFILE = gamepad.hal
# list of halcmd commands to execute
# commands are executed in the order in which they appear
#HALCMD =                    save neta
# Single file that is executed after the GUI has started.  Only supported by
# AXIS at this time (only AXIS creates a HAL component of its own)
#POSTGUI_HALFILE = test_postgui.hal
POSTGUI_HALFILE = v2_oword_gladevcp_postgui_noio.hal
HALUI = halui
# Trajectory planner section --------------------------------------------------

[HALUI]
#No Content

[TRAJ]
COORDINATES =           X Y Z
HOME =                  0 0 0
LINEAR_UNITS =          mm
ANGULAR_UNITS =         degree
DEFAULT_VELOCITY =      30.48
MAX_VELOCITY =          53.34
DEFAULT_ACCELERATION =  508
MAX_ACCELERATION =      508
POSITION_FILE = position_mm.txt
NO_FORCE_HOMING =       1
# Axes sections ---------------------------------------------------------------
# First axis

[EMCIO]
# Name of IO controller program, e.g., io
#  explicitly support the start-change protocol.
#  needs to be explicitly enabled for backwards compatibility.
#  NB: if the start-change pin isn't used it needs to be looped like below to
#  start-change-ack or an M6 will hang waiting for start-change-ack:
#  net start-change iocontrol.0.start-change  iocontrol.0.start-change-ack
#EMCIO = 		iov2 -support-start-change
# starting iov2 like so will create the start-change and start-change-ack pins
# but the start-change protocol remains disabled - start-change remains low and
# start-change-ack is ignored:
#EMCIO = 		iov2
# cycle time, in seconds
CYCLE_TIME =    0.100
# tool table file
#TOOL_TABLE =    sim_mm_test.tbl
TOOL_TABLE =    nstools.tbl
TOOL_CHANGE_POSITION = 0 0 50.8
#RANDOM_TOOLCHANGER = 1

[KINS]
KINEMATICS = trivkins
JOINTS = 3

[AXIS_X]
MIN_LIMIT = -254
MAX_LIMIT = 254
MAX_VELOCITY = 30.48
MAX_ACCELERATION = 508

[JOINT_0]
TYPE =                          LINEAR
HOME =                          0.000
MAX_VELOCITY =                  30.48
MAX_ACCELERATION =              508
BACKLASH = 0.000
INPUT_SCALE =                   157.48
OUTPUT_SCALE = 1.000
MIN_LIMIT =                     -254
MAX_LIMIT =                     254
FERROR = 1.27
MIN_FERROR = .254
HOME_OFFSET =                    0.0
HOME_SEARCH_VEL =                127
HOME_LATCH_VEL =                 25.4
HOME_USE_INDEX =                 NO
HOME_IGNORE_LIMITS =             NO
HOME_SEQUENCE = 1
HOME_IS_SHARED = 1
# Second axis

[AXIS_Y]
MIN_LIMIT = -254
MAX_LIMIT = 254
MAX_VELOCITY = 30.48
MAX_ACCELERATION = 508

[JOINT_1]
TYPE =                          LINEAR
HOME =                          0.000
MAX_VELOCITY =                  30.48
MAX_ACCELERATION =              508
BACKLASH = 0.000
INPUT_SCALE =                   157.48
OUTPUT_SCALE = 1.000
MIN_LIMIT =                     -254
MAX_LIMIT =                     254
FERROR = 1.27
MIN_FERROR = .254
HOME_OFFSET =                    0.0
HOME_SEARCH_VEL =                127
HOME_LATCH_VEL =                 25.4
HOME_USE_INDEX =                 NO
HOME_IGNORE_LIMITS =             NO
HOME_SEQUENCE = 1
# Third axis

[AXIS_Z]
MIN_LIMIT = -50.8
MAX_LIMIT = 101.6
MAX_VELOCITY = 30.48
MAX_ACCELERATION = 508

[JOINT_2]
TYPE =                          LINEAR
HOME =                          0.0
MAX_VELOCITY =                  30.48
MAX_ACCELERATION =              508
BACKLASH = 0.000
INPUT_SCALE =                   157.48
OUTPUT_SCALE = 1.000
MIN_LIMIT =                     -50.8
MAX_LIMIT =                     101.6
FERROR = 1.27
MIN_FERROR = .254
HOME_OFFSET =                    25.4
HOME_SEARCH_VEL =                127
HOME_LATCH_VEL =                 25.4
HOME_USE_INDEX =                 NO
HOME_IGNORE_LIMITS =             NO
HOME_SEQUENCE = 0
HOME_IS_SHARED = 1
# section for main IO controller parameters -----------------------------------

[PYTHON]
#PLUGIN_DIR=/home/mah/emc2-tc/configs/sim/pysubs
PLUGIN_DIR=./pysubs
# import the following Python modules
MODULE_BASENAME=plugins
# if this is set:
RELOAD_ON_CHANGE=1
# and the file specified in MODULE_BASENAME was changed, it will be reloaded before
# executing any Python calls
# This is handy for debugging because you dont need to restart EMC
# BUT it incurs a bit of overhead per call so you might want to turn
# it off in production mode
# the Python reload_on_change variable may be used to toggle this
# at runtime
#LOG_FILE= py.log
LOG_LEVEL = 3
# the python Task() instance variable
TASKVAR = pytask
# Part program interpreter section --------------------------------------------

[VARS]

# accessible in interp as #<_[section]name>
FOO = 47.11
X=3
Y=4
Z=5
TOOL_CHANGE_POSITION_X = 1
TOOL_CHANGE_POSITION_Y = 2
TOOL_CHANGE_POSITION_Z = 3
# Motion control section ------------------------------------------------------
