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