From 92cad39abfbb3cd57a03dcc7aaad7d12950a4e53 Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Tue, 12 Mar 2019 16:26:13 +0100 Subject: [PATCH] MEX fixes, build moberg_tool --- Makefile | 7 +++++-- adaptors/matlab/.gitignore | 1 + adaptors/matlab/Makefile.mex | 10 +++++----- adaptors/matlab/analogin.c | 5 +++-- adaptors/matlab/analogout.c | 9 +++++++-- adaptors/matlab/digitalin.c | 7 ++++++- adaptors/matlab/digitalout.c | 9 +++++++-- adaptors/matlab/encoderin.c | 7 ++++++- moberg.spec.template | 3 +++ moberg_tool.c | 29 +++++++++++++++++++++++++++++ 10 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 adaptors/matlab/.gitignore create mode 100644 moberg_tool.c diff --git a/Makefile b/Makefile index e934c54..d7c9a68 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ LIBRARIES=libmoberg.so MOBERG_VERSION=$(shell git describe --tags | sed -e 's/^v//;s/-/_/g' ) -CCFLAGS+=-Wall -Werror -I$(shell pwd) -g +CCFLAGS+=-Wall -Werror -I$(shell pwd) -O3 -g LDFLAGS+=-L$(shell pwd)/build/ -lmoberg PLUGINS:=$(wildcard plugins/*) ADAPTORS:=$(wildcard adaptors/*) @@ -8,7 +8,7 @@ export CCFLAGS LDFLAGS LDFLAGS_parse_config=-ldl #-export-dynamic -all: $(LIBRARIES:%=build/%) $(PLUGINS) $(ADAPTORS) +all: $(LIBRARIES:%=build/%) build/moberg $(PLUGINS) $(ADAPTORS) echo $(PLUGINS) echo $(CCFLAGS) @@ -16,6 +16,9 @@ build/libmoberg.so: Makefile | build $(CC) -o $@ $(CCFLAGS) -shared -fPIC -I. \ $(filter %.o,$^) -lxdg-basedir -ldl +build/moberg: moberg_tool.c Makefile | build + $(CC) -o $@ $(CCFLAGS) $< -L../build -lmoberg + build/lib build: mkdir -p $@ diff --git a/adaptors/matlab/.gitignore b/adaptors/matlab/.gitignore new file mode 100644 index 0000000..71e1b42 --- /dev/null +++ b/adaptors/matlab/.gitignore @@ -0,0 +1 @@ +*.mex* \ No newline at end of file diff --git a/adaptors/matlab/Makefile.mex b/adaptors/matlab/Makefile.mex index 322bed3..9a0767a 100644 --- a/adaptors/matlab/Makefile.mex +++ b/adaptors/matlab/Makefile.mex @@ -8,11 +8,11 @@ TARGETS=realtimer \ encoderin EXTRAFLAGS_realtimer= -EXTRAFLAGS_analogin=-lmoberg4simulink -EXTRAFLAGS_analogout=-lmoberg4simulink -EXTRAFLAGS_digitalin=-lmoberg4simulink -EXTRAFLAGS_digitalout=-lmoberg4simulink -EXTRAFLAGS_encoderin=-lmoberg4simulink +EXTRAFLAGS_analogin=-lmoberg4simulink -lmoberg +EXTRAFLAGS_analogout=-lmoberg4simulink -lmoberg +EXTRAFLAGS_digitalin=-lmoberg4simulink -lmoberg +EXTRAFLAGS_digitalout=-lmoberg4simulink -lmoberg +EXTRAFLAGS_encoderin=-lmoberg4simulink -lmoberg all: $(TARGETS:%=%.$(SUFFIX)) diff --git a/adaptors/matlab/analogin.c b/adaptors/matlab/analogin.c index 32ae342..6d26726 100644 --- a/adaptors/matlab/analogin.c +++ b/adaptors/matlab/analogin.c @@ -132,11 +132,12 @@ static void mdlOutputs(SimStruct *S, int_T tid) { int i; real_T *y = ssGetOutputPortRealSignal(S, 1); - + for (i = 0 ; i < ssGetNumPWork(S) ; i++) { struct moberg_analog_in *ain = (struct moberg_analog_in*)pwork[i]; - if (! ain->read(ain->context, &y[i])) { + if (! moberg_OK(ain->read(ain->context, &y[i]))) { static char error[256]; + double *channel = mxGetPr(ssGetSFcnParam(S,1)); sprintf(error, "Failed to read analogin #%d", (int)channel[i]); ssSetErrorStatus(S, error); } diff --git a/adaptors/matlab/analogout.c b/adaptors/matlab/analogout.c index ba1b091..a1d5909 100644 --- a/adaptors/matlab/analogout.c +++ b/adaptors/matlab/analogout.c @@ -131,12 +131,17 @@ static void mdlOutputs(SimStruct *S, int_T tid) y[0] = *up[0]+1; } { - InputRealPtrsType up = ssGetInputPortRealSignalPtrs(S,1); int i; + InputRealPtrsType up = ssGetInputPortRealSignalPtrs(S,1); for (i = 0 ; i < ssGetNumPWork(S) ; i++) { struct moberg_analog_out *aout = (struct moberg_analog_out*)pwork[i]; - aout->write(aout->context, *up[i]); + if (! moberg_OK(aout->write(aout->context, *up[i]))) { + static char error[256]; + double *channel = mxGetPr(ssGetSFcnParam(S,1)); + sprintf(error, "Failed to write analogout #%d", (int)channel[i]); + ssSetErrorStatus(S, error); + } } } } diff --git a/adaptors/matlab/digitalin.c b/adaptors/matlab/digitalin.c index 55674db..e8c2b6d 100644 --- a/adaptors/matlab/digitalin.c +++ b/adaptors/matlab/digitalin.c @@ -137,7 +137,12 @@ static void mdlOutputs(SimStruct *S, int_T tid) for (i = 0 ; i < ssGetNumPWork(S) ; i++) { struct moberg_digital_in *din = (struct moberg_digital_in*)pwork[i]; int value; - din->read(din->context, &value); + if (! moberg_OK(din->read(din->context, &value))) { + static char error[256]; + double *channel = mxGetPr(ssGetSFcnParam(S,1)); + sprintf(error, "Failed to read digitalin #%d", (int)channel[i]); + ssSetErrorStatus(S, error); + } y[i] = value; } } diff --git a/adaptors/matlab/digitalout.c b/adaptors/matlab/digitalout.c index 801573b..97d9a8b 100644 --- a/adaptors/matlab/digitalout.c +++ b/adaptors/matlab/digitalout.c @@ -131,12 +131,17 @@ static void mdlOutputs(SimStruct *S, int_T tid) y[0] = *up[0]+1; } { - InputRealPtrsType up = ssGetInputPortRealSignalPtrs(S,1); int i; + InputRealPtrsType up = ssGetInputPortRealSignalPtrs(S,1); for (i = 0 ; i < ssGetNumPWork(S) ; i++) { struct moberg_digital_out *dout = (struct moberg_digital_out*)pwork[i]; - dout->write(dout->context, *up[i]); + if (! moberg_OK(dout->write(dout->context, *up[i]))) { + static char error[256]; + double *channel = mxGetPr(ssGetSFcnParam(S,1)); + sprintf(error, "Failed to write digitalout #%d", (int)channel[i]); + ssSetErrorStatus(S, error); + } } } } diff --git a/adaptors/matlab/encoderin.c b/adaptors/matlab/encoderin.c index 9a7be54..2c4c0ec 100644 --- a/adaptors/matlab/encoderin.c +++ b/adaptors/matlab/encoderin.c @@ -136,7 +136,12 @@ static void mdlOutputs(SimStruct *S, int_T tid) for (i = 0 ; i < ssGetNumPWork(S) ; i++) { struct moberg_encoder_in *ein = (struct moberg_encoder_in*)pwork[i]; long value; - ein->read(ein->context, &value); + if (! moberg_OK(ein->read(ein->context, &value))) { + static char error[256]; + double *channel = mxGetPr(ssGetSFcnParam(S,1)); + sprintf(error, "Failed to read encoderin #%d", (int)channel[i]); + ssSetErrorStatus(S, error); + } y[i] = value; } } diff --git a/moberg.spec.template b/moberg.spec.template index e4f9f55..7498e16 100644 --- a/moberg.spec.template +++ b/moberg.spec.template @@ -61,6 +61,8 @@ rm -rf ${RPM_BUILD_ROOT} mkdir -p ${RPM_BUILD_ROOT}%{_libdir} cp build/libmoberg*.so ${RPM_BUILD_ROOT}%{_libdir} +mkdir -p ${RPM_BUILD_ROOT}%{_sbindir} +cp build/moberg ${RPM_BUILD_ROOT}%{_sbindir} mkdir -p ${RPM_BUILD_ROOT}%{_includedir} cp moberg.h ${RPM_BUILD_ROOT}%{_includedir} @@ -89,6 +91,7 @@ cp adaptors/matlab/Makefile.mex ${RPM_BUILD_ROOT}/opt/matlab/src/moberg/Makefile %{_includedir}/moberg.h %{_libdir}/libmoberg.so %{_libdir}/libmoberg_serial2002.so +%{_sbindir}/moberg %files comedi %defattr(-,root,root,-) diff --git a/moberg_tool.c b/moberg_tool.c new file mode 100644 index 0000000..11a6b0c --- /dev/null +++ b/moberg_tool.c @@ -0,0 +1,29 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <moberg.h> + +void usage(char *prog) { + fprintf(stderr, "%s [ --start | --stop | -h | --help ]\n", prog); +} + +int main(int argc, char *argv[]) +{ + + if (argc == 2 && strcmp(argv[1], "--start") == 0) { + struct moberg *moberg = moberg_new(NULL); + moberg_start(moberg, stdout); + moberg_free(moberg); + } else if (argc == 2 && strcmp(argv[1], "--stop") == 0) { + struct moberg *moberg = moberg_new(NULL); + moberg_stop(moberg, stdout); + moberg_free(moberg); + } else if (argc == 2 && strcmp(argv[1], "-h") == 0) { + usage(argv[0]); + } else if (argc == 2 && strcmp(argv[1], "--help") == 0) { + usage(argv[0]); + } else { + usage(argv[0]); + exit(1); + } +} -- GitLab