# EMC motion control code

MODULE = emcmot

# We always have to optimize because of some weirdness with io.h
OPTIMIZE=1


ifdef IGNORE_SPLIT_READS
LOCAL_CFLAGS+=-DIGNORE_SPLIT_READS
endif

ifeq ($(PLAT), java)

SRCS =
HEADERS =
BINS =
OBJS =

else

EMCSTEPMOT_C=emcstepmot.c
EMCSTEPMOT_O=emcstepmot.o
STEPPERMOD_O=steppermod.o
PUMA560_O=puma560.o

ifeq (rtlinux, $(findstring rtlinux, $(PLAT)))
BUILD_REALTIMEONLY=1
endif

ifeq (rtai, $(PLAT))
BUILD_REALTIMEONLY=1
EMCSTEPMOT_C=
EMCSTEPMOT_O=
STEPPERMOD_O=
PUMA560_O=
endif

ifdef BUILD_REALTIMEONLY

SRCS = \
	cubic.c \
	tc.c \
	tp.c \
	pid.c \
	stg.c stg2.c \
	extstgmot.c \
	emcmot.c \
	$(EMCSTEPMOT_C) \
	emcmotglb.c \
	trivkins.c \
	genhexkins.c \
	lukaskins.c \
	puma560kins.c \
	mmxavg.c \
	extsmmot.c \
	extsmdromot.c \
	emcmotlog.c \
	emcmotutil.c \
	dro.c \
	ppmc_dac.c \
	ppmc_encoder.c \
	ppmc_aio.c \
	ppmc_dio.c \
	ppmc_internal.c \
	extppmcmot.c \
	stgmembs.c \
	newstg.c \
	vti.c \
	siemens.c


HEADERS = \
	cubic.h \
	tc.h \
	tp.h \
	pid.h \
	stg.h stg2.h \
	emcmot.h \
	emcmotcfg.h \
	emcmotglb.h \
	mmxavg.h \
	emcmotlog.h \
	genhexkins.h \
	puma560kins.h \
	dro.h \
	ppmc.h \
	stgdefs.h \
	locsysio.h \
	locdefs.h \
	newstg.h \
	vti.h \
	siemens.h

BINS = \

ifneq (rtlinux_09J, $(PLAT))

OBJS = \
	cubic.o \
	tc.o \
	tp.o \
	pid.o \
	stg.o stg2.o \
	stg8.o \
	extstgmot.o \
	emcmot.o \
	emcsimmot.o \
	$(EMCSTEPMOT_O) \
	emcfreqmot.o \
	stgmod.o stg2mod.o newstgmod.o \
	stg8mod.o \
	$(STEPPERMOD_O) \
	freqmod.o \
	smdromod.o \
	emcmotglb.o \
	trivkins.o \
	genhexkins.o \
	lukaskins.o \
	puma560kins.o \
	mmxavg.o \
	extsmmot.o \
	extsmdromot.o \
	emcmotlog.o \
	emcmotutil.o \
	minitetra.o \
	lukasmod.o \
	$(PUMA560_O) \
	dro.o \
	simmod.o \
	ppmc_dac.o \
	ppmc_encoder.o \
	ppmc_dac8.o \
	ppmc_encoder8.o \
	ppmc_aio.o \
	ppmc_dio.o \
	ppmc_internal.o \
	extppmcmot.o \
	ppmcmod.o \
	ppmcmod8.o \
	stgmembs.o \
	newstg.o \
	vti.o vtimod.o \
	siemens.o siemensmod.o

else

OBJS = \
	cubic.o \
	tc.o \
	tp.o \
	pid.o \
	stg.o stg2.o \
	stg8.o \
	extstgmot.o \
	emcmot.o \
	$(EMCSTEPMOT_O) \
	emcfreqmot.o \
	stgmod.o stg2mod.o newstgmod.o \
	stg8mod.o \
	$(STEPPERMOD_O) \
	freqmod.o \
	smdromod.o \
	emcmotglb.o \
	trivkins.o \
	genhexkins.o \
	lukaskins.o \
	puma560kins.o \
	mmxavg.o \
	extsmmot.o \
	extsmdromot.o \
	emcmotlog.o \
	emcmotutil.o \
	minitetra.o \
	lukasmod.o \
	$(PUMA560_O) \
	dro.o \
	ppmc_dac.o \
	ppmc_encoder.o \
	ppmc_dac8.o \
	ppmc_encoder8.o \
	ppmc_aio.o \
	ppmc_dio.o \
	ppmc_internal.o \
	extppmcmot.o \
	ppmcmod.o \
	ppmcmod8.o \
	stgmembs.o \
	newstg.o

endif


else

SRCS = \
	cubic.c \
	tc.c \
	tp.c \
	pid.c \
	stg.c stg2.c \
	stgdiag.c \
	extstgmot.c \
	$(EMCSTEPMOT_C) \
	emcmot.c \
	emcmotglb.c \
	trivkins.c \
	genhexkins.c \
	lukaskins.c \
	puma560kins.c \
	usrmotintf.c \
	usrmot.c \
	lsutil.c \
	testlsutil.c \
	mmxavg.c \
	extsmmot.c \
	extsmdromot.c \
	emcmotlog.c \
	emcmotutil.c \
	testtp.c \
	dro.c \
	ppmc_dac.c \
	ppmc_encoder.c \
	ppmcdiag.c \
	ppmc_aio.c \
	ppmc_dio.c \
	ppmc_internal.c \
	extppmcmot.c \
	newstg.c \
	stgmembs.c \
	vti.c \
	siemens.c


HEADERS = \
	cubic.h \
	tc.h \
	tp.h \
	pid.h \
	stg.h stg2.h \
	emcmot.h \
	emcmotcfg.h \
	emcmotglb.h \
	usrmotintf.h \
	lsutil.h \
	mmxavg.h \
	emcmotlog.h \
	genhexkins.h \
	puma560kins.h \
	dro.h \
	ppmc.h \
	newstg.h \
	stgdefs.h \
	locsysio.h \
	vti.h \
	siemens.h

ifndef USE_TEST_CENTER

BINS = \
	stgmot stg2mot \
	emcmotsim \
	genhexsim \
	lukassim \
	usrmot \
	testlsutil \
	testmmxavg \
	newstgdiag \
	stg2diag \
	testtp \
	drotest \
	ppmcdiag

else

BINS = \
	stgmot stg2mot \
	emcmotsim \
	usrmot \
	testlsutil \
	testmmxavg \
	newstgdiag \
	stg2diag \
	testtp \
	drotest \
	emcmotsim.tc \
	usrmot.tc \
	testlsutil.tc \
	testmmxavg.tc \
	stgdiag.tc \
	testtp.tc \
	ppmcdiag

endif

OBJS = \
	cubic.o \
	tc.o \
	tp.o \
	pid.o \
	stg.o stg2.o \
	stg8.o \
	stgdiag.o \
	extstgmot.o \
	emcmotglb.o \
	trivkins.o \
	genhexkins.o \
	lukaskins.o \
	puma560kins.o \
	usrmotintf.o \
	usrmot.o \
	lsutil.o \
	testlsutil.o \
	mmxavg.o \
	testmmxavg.o \
	extsmmot.o \
	extsmdromot.o \
	emcmotlog.o \
	emcmotutil.o \
	testtp.o \
	emcsimmot.o \
	dro.o \
	ppmc_dac.o \
	ppmc_encoder.o \
	ppmcdiag.o \
	ppmc_aio.o \
	ppmc_dio.o \
	ppmc_internal.o \
	extppmcmot.o \
	stgmembs.o \
	newstg.o

#	ppmc_dac8.o
#	ppmc_encoder8.o
# 	emcstepmot.o emcfreqmot.o \

endif

endif

# get all the platform and application definitions
include ../Makefile.inc

ifdef BUILD_REALTIMEONLY

# 8-axis Servo To Go Board, which requires STG_8_AXES flag
$(DEVP_LIB_DIR)/stg8.o: stg.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSTG_8_AXES \
	-o $@ )

# stepper motor version, which requires STEPPER_MOTORS flag
ifneq (rtai, $(PLAT))
$(DEVP_LIB_DIR)/emcstepmot.o: emcstepmot.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSTEPPER_MOTORS \
	-o $@ )

endif

# stepper motor version of segment queue, which requires STEPPER_MOTORS flag
$(DEVP_LIB_DIR)/emcstepsegmot.o: emcsegmot.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSTEPPER_MOTORS \
	-o $@ )

# frequency stepper motor version
$(DEVP_LIB_DIR)/emcfreqmot.o: emcmot.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSTEPPER_MOTORS \
	-o $@ )

# 4-axis PPMC
$(DEVP_LIB_DIR)/ppmc_encoder.o: ppmc_encoder.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-o $@ )

# 8-axis PPMC, which requires PPMC_8_AXES flag
$(DEVP_LIB_DIR)/ppmc_encoder8.o: ppmc_encoder.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DPPMC_8_AXES \
	-o $@ )

# 4-axis PPMC
$(DEVP_LIB_DIR)/ppmc_dac.o: ppmc_dac.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-o $@ )

# 8-axis PPMC, which requires PPMC_8_AXES flag
$(DEVP_LIB_DIR)/ppmc_dac8.o: ppmc_dac.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DPPMC_8_AXES \
	-o $@ )

# 8-axis Vigilant Technologies Inc. card, which requires VTI_8_AXES flag
$(DEVP_LIB_DIR)/vti.o: vti.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DVTI_8_AXES \
	-o $@ )

# 3-axis Siemens card by h@yty.net
$(DEVP_LIB_DIR)/siemens.o: siemens.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSIEMENS_3_AXES \
	-o $@ )

# For rtlinux module linking, try either


RT_MODULE_LIBCM_LINK_FLAG =  -S -O3  smallmath.o

# Servo To Go motion control
$(DEVP_LIB_DIR)/stgmod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

newstgmod : $(DEVP_LIB_DIR)/newstgmod.o
.PHONY: newstgmod


$(DEVP_LIB_DIR)/newstgmod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/newstg.o \
	$(DEVP_LIB_DIR)/stgmembs.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Servo To Go motion control
$(DEVP_LIB_DIR)/stg2mod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg2.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Servo To Go motion control, 8 axes
$(DEVP_LIB_DIR)/stg8mod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg8.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Vigilant Technologies Inc. motion control
$(DEVP_LIB_DIR)vtimod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extvtimot.o \
	$(DEVP_LIB_DIR)/vti.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Siemens 3-axis motor controller
$(DEVP_LIB_DIR)siemensmod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extsiemensmot.o \
	$(DEVP_LIB_DIR)/siemens.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# NIST stepper motor test stand
ifneq ($(PLAT),rtai)

$(DEVP_LIB_DIR)/steppermod.o: \
	$(DEVP_LIB_DIR)/emcstepmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/extppt.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

endif

# frequency stepping
$(DEVP_LIB_DIR)/freqmod.o: \
	$(DEVP_LIB_DIR)/emcfreqmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/extppt.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# frequency stepping
$(DEVP_LIB_DIR)/smdromod.o: \
	$(DEVP_LIB_DIR)/emcfreqmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extsmdromot.o \
	$(DEVP_LIB_DIR)/dro.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Parallel Port motion control (4 axes)
$(DEVP_LIB_DIR)/ppmcmod.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extppmcmot.o \
	$(DEVP_LIB_DIR)/ppmc_encoder.o \
	$(DEVP_LIB_DIR)/ppmc_dac.o \
	$(DEVP_LIB_DIR)/ppmc_aio.o \
	$(DEVP_LIB_DIR)/ppmc_dio.o \
	$(DEVP_LIB_DIR)/ppmc_internal.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Parallel Port motion control (8 axes)
$(DEVP_LIB_DIR)/ppmcmod8.o: \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extppmcmot.o \
	$(DEVP_LIB_DIR)/ppmc_encoder8.o \
	$(DEVP_LIB_DIR)/ppmc_dac8.o \
	$(DEVP_LIB_DIR)/ppmc_aio.o \
	$(DEVP_LIB_DIR)/ppmc_dio.o \
	$(DEVP_LIB_DIR)/ppmc_internal.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# servo segment module
$(DEVP_LIB_DIR)/stgsegmod.o: \
	$(DEVP_LIB_DIR)/emcsegmot.o \
	$(DEVP_LIB_DIR)/segmentqueue.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# segmot stepper motor
$(DEVP_LIB_DIR)/steppersegmod.o: \
	$(DEVP_LIB_DIR)/emcstepsegmot.o \
	$(DEVP_LIB_DIR)/segmentqueue.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Mini-Tetra, stepper motors with hexapod kinematics
$(DEVP_LIB_DIR)/minitetra.o: \
	$(DEVP_LIB_DIR)/emcfreqmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/genhexkins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Lukas du Plessis' planar parallel machine
$(DEVP_LIB_DIR)/lukasmod.o: \
	$(DEVP_LIB_DIR)/emcfreqmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/lukaskins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

# Puma 560, using steppers for simulation
ifneq ($(PLAT),rtai)

$(DEVP_LIB_DIR)/puma560.o: \
	$(DEVP_LIB_DIR)/emcstepmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/puma560kins.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/extsmmot.o \
	$(DEVP_LIB_DIR)/parport.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static \
	$^ \
	$(RCS_PLATLIB)/libpm.a \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@

endif

# Real-time simulator
$(DEVP_LIB_DIR)/simmod.o:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcsimmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	ld -r -static  $^ \
	$(RCS_LINK_FLAG) \
	$(RT_MODULE_LIBCM_LINK_FLAG) \
	-o $@
else

# 8-axis Servo To Go Board, which requires STG_8_AXES flag
$(DEVP_LIB_DIR)/stg8.o : stg.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-DSTG_8_AXES \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-o $@ )

endif

$(DEVP_BIN_DIR)/usrmot:	\
	$(DEVP_LIB_DIR)/usrmotintf.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/usrmot.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/getinput.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_BIN_DIR)/testlsutil:	\
	$(DEVP_LIB_DIR)/testlsutil.o \
	$(DEVP_LIB_DIR)/lsutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_LIB_DIR)/testmmxavg.o: \
	mmxavg.c
	( $(COMPILER_SETUP); \
	$(CC) -c -DMAIN $(LOCAL_CFLAGS) $(CFLAGS) $^ \
	-o $@ )

$(DEVP_BIN_DIR)/testmmxavg: \
	$(DEVP_LIB_DIR)/testmmxavg.o \
	$(DEVP_LIB_DIR)/mmxavg.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_BIN_DIR)/testtp: \
	$(DEVP_LIB_DIR)/testtp.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )


# Non-realtime STG. This is not real-time but actually writes to IO
# using the STG external interface
$(DEVP_BIN_DIR)/stgmot:	\
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# Non-realtime STG. This is not real-time but actually writes to IO
# using the STG external interface, for the new boards
$(DEVP_BIN_DIR)/stg2mot:	\
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg2.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# Non-realtime motion, as above, using the segment queue code
$(DEVP_BIN_DIR)/emcsegmot:	\
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg.o \
	$(DEVP_LIB_DIR)/emcsegmot.o \
	$(DEVP_LIB_DIR)/segmentqueue.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface
$(DEVP_BIN_DIR)/emcmotsim:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcsimmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )


# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface
$(DEVP_BIN_DIR)/genhexsim:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/genhexkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# test code for hexapod kinematics
$(DEVP_BIN_DIR)/genhextest: genhexkins.c
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $(CPLUSPLUSFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DMAIN \
	$(RCS_LINK_FLAG) \
	$(CPLUSPLUSLINK) -lm \
	$< -o $@ )

genhextest: $(DEVP_BIN_DIR)/genhextest
.PHONY: genhextest

# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface
$(DEVP_BIN_DIR)/lukassim:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/lukaskins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface


# The segmentqueue version
$(DEVP_BIN_DIR)/emcsegmotsim:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcsegmot.o \
	$(DEVP_LIB_DIR)/segmentqueue.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# STG diagnostics program


newstgdiag : $(DEVP_BIN_DIR)/newstgdiag
.PHONY:newstgdiag

$(DEVP_BIN_DIR)/newstgdiag:	\
	$(DEVP_LIB_DIR)/stgdiag.o \
	$(DEVP_LIB_DIR)/newstg.o \
	$(DEVP_LIB_DIR)/stgmembs.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) \
	-o $@ )

$(DEVP_BIN_DIR)/stg2diag:	\
	$(DEVP_LIB_DIR)/stgdiag.o \
	$(DEVP_LIB_DIR)/stg2.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) \
	-o $@ )

# DRO diagnostics program
$(DEVP_BIN_DIR)/drotest:	\
	dro.c
	( $(COMPILER_SETUP); \
	$(CC) $(LOCAL_CFLAGS) $(CFLAGS) -O2 $^ \
	-DMAIN \
	$(CLINK) \
	-o $@ )

# ppmc diagnostics program
$(DEVP_BIN_DIR)/ppmcdiag.o:	\
	ppmcdiag.c
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) \
	-o $@ )

$(DEVP_BIN_DIR)/ppmcdiag:	\
	$(DEVP_LIB_DIR)/ppmcdiag.o \
	$(DEVP_LIB_DIR)/ppmc_internal.o \
	$(DEVP_LIB_DIR)/ppmc_aio.o \
	$(DEVP_LIB_DIR)/ppmc_dio.o \
	$(DEVP_LIB_DIR)/ppmc_dac.o \
	$(DEVP_LIB_DIR)/ppmc_encoder.o \
	$(DEVP_LIB_DIR)/extppmcmot.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS) $^ \
	$(CLINK) \
	-o $@ )

drotest: $(DEVP_BIN_DIR)/drotest
.PHONY: drotest

$(DEVP_BIN_DIR)/usrmot.tc:	\
	$(DEVP_LIB_DIR)/usrmotintf.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/usrmot.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/getinput.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_BIN_DIR)/testlsutil.tc:	\
	$(DEVP_LIB_DIR)/testlsutil.o \
	$(DEVP_LIB_DIR)/lsutil.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_BIN_DIR)/testmmxavg.tc: \
	$(DEVP_LIB_DIR)/testmmxavg.o \
	$(DEVP_LIB_DIR)/mmxavg.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(CLINK) -lm \
	-o $@ )

$(DEVP_BIN_DIR)/testtp.tc: \
	$(DEVP_LIB_DIR)/testtp.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )

# Non-RealTime Motion: This is not real-time but actually writes to IO
# uses the STG external interface
$(DEVP_BIN_DIR)/stgmot.tc:	\
	$(DEVP_LIB_DIR)/extstgmot.o \
	$(DEVP_LIB_DIR)/stg.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(RCS_LINK_FLAG) \
	$(CLINK) -lm \
	-o $@ )


emcmotsim.tc: $(DEVP_BIN_DIR)/emcmotsim.tc

.PHONY: emcmotsim.tc

# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface
$(DEVP_BIN_DIR)/emcmotsim.tc:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcmot.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS)  $^ \
	$(RCS_LINK_FLAG) $(CLINK) $(CPLUSPLUSLINK) \
	-o $@ )

# This version does not write to IO nor is it Real-Time.
# uses the simulated external interface
# The segmentqueue version
$(DEVP_BIN_DIR)/emcsegmotsim.tc:	\
	$(DEVP_LIB_DIR)/extsimmot.o \
	$(DEVP_LIB_DIR)/extsimdio.o \
	$(DEVP_LIB_DIR)/extsimaio.o \
	$(DEVP_LIB_DIR)/simmot.o \
	$(DEVP_LIB_DIR)/simdio.o \
	$(DEVP_LIB_DIR)/simaio.o \
	$(DEVP_LIB_DIR)/simbase.o \
	$(DEVP_LIB_DIR)/emcsegmot.o \
	$(DEVP_LIB_DIR)/segmentqueue.o \
	$(DEVP_LIB_DIR)/emcmotglb.o \
	$(DEVP_LIB_DIR)/emcglb.o \
	$(DEVP_LIB_DIR)/trivkins.o \
	$(DEVP_LIB_DIR)/amplifier.o \
	$(DEVP_LIB_DIR)/dcmotor2.o \
	$(DEVP_LIB_DIR)/encoder.o \
	$(DEVP_LIB_DIR)/pid.o \
	$(DEVP_LIB_DIR)/cubic.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o \
	$(DEVP_LIB_DIR)/mmxavg.o \
	$(DEVP_LIB_DIR)/emcmotlog.o \
	$(DEVP_LIB_DIR)/emcmotutil.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS)  $^ \
	$(RCS_LINK_FLAG) $(CLINK) $(CPLUSPLUSLINK) \
	-o $@ )

usrmot: $(DEVP_BIN_DIR)/usrmot
stgmod: $(DEVP_LIB_DIR)/stgmod.o $(DEVP_LIB_DIR)/stg8mod.o
stg2mot: $(DEVP_BIN_DIR)/stg2mot
stg2mod: $(DEVP_LIB_DIR)/stg2mod.o
emcmotsim: $(DEVP_BIN_DIR)/emcmotsim
segstepper: $(DEVP_LIB_DIR)/steppersegmod.o
stepper: $(DEVP_LIB_DIR)/steppermod.o
freq: $(DEVP_LIB_DIR)/freqmod.o
minitetra: $(DEVP_LIB_DIR)/minitetra.o
puma560: $(DEVP_LIB_DIR)/puma560.o
dro: $(DEVP_BIN_DIR)/drotest
smdromod: $(DEVP_LIB_DIR)/smdromod.o
lukasmod: $(DEVP_LIB_DIR)/lukasmod.o

.PHONY: usrmot stgmod stg2mod stg2mot emcmotsim segstepper stepper freq minitetra puma560 dro smdromod lukasmod

# STG diagnostics program
$(DEVP_BIN_DIR)/stgdiag.tc:	\
	$(DEVP_LIB_DIR)/stgdiag.o \
	$(DEVP_LIB_DIR)/stg.o
	( $(COMPILER_SETUP); \
	proof $(CPLUSPLUS) $^ \
	$(CLINK) \
	-o $@ )

simmod: $(DEVP_LIB_DIR)/simmod.o

.PHONY: simmod

$(DEVP_LIB_DIR)/emcfreqmot.o: $(DEVP_LIB_DIR)/emcmot.o
$(DEVP_LIB_DIR)/emcsimmot.o: $(DEVP_LIB_DIR)/emcmot.o


# simulated  motor version
$(DEVP_LIB_DIR)/emcsimmot.o: emcmot.c
	( $(COMPILER_SETUP); \
	$(CC) $< -c $(LOCAL_CFLAGS) $(CFLAGS) \
	-I$(DEVP_INCLUDE_DIR) -I$(RELEASE_INCLUDE_DIR) -I$(RCS_INCLUDE) \
	-DSIMULATED_MOTORS \
	-o $@ )

emcsimmot.o:$(DEVP_LIB_DIR)/emcsimmot.o

.PHONY: emcsimmot.o


$(DEVP_BIN_DIR)/tptester:	\
	$(DEVP_LIB_DIR)/tptester.o \
	$(DEVP_LIB_DIR)/tp.o \
	$(DEVP_LIB_DIR)/tc.o
	( $(COMPILER_SETUP); \
	$(CPLUSPLUS)  $^ \
	$(RCS_LINK_FLAG) $(CLINK) $(CPLUSPLUSLINK) \
	-o $@ )

testtp: $(DEVP_BIN_DIR)/testtp

.PHONY: testtp

