From 017bbe7d7d235097ae0ff51a3c9efbbe8398198a Mon Sep 17 00:00:00 2001
From: Fredrik Bagge Carlson <cont-frb@ulund.org>
Date: Sun, 20 Aug 2017 20:45:29 +0200
Subject: [PATCH] Draft interface and BallAndBeam implementation

---
 README.md           |   6 +-----
 c/Makefile          |  15 ++++++++++++++
 c/comedi_bridge.c   |  38 +++++++++++++++++++++++++++++++++++
 c/comedi_bridge.o   | Bin 0 -> 3096 bytes
 c/comedi_bridge.so  | Bin 0 -> 8576 bytes
 src/LabProcesses.jl |  48 +++++++++++++++++++++++++++++++++++++++++++-
 6 files changed, 101 insertions(+), 6 deletions(-)
 create mode 100644 c/Makefile
 create mode 100644 c/comedi_bridge.c
 create mode 100644 c/comedi_bridge.o
 create mode 100644 c/comedi_bridge.so

diff --git a/README.md b/README.md
index 58ac930..1c9641c 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,3 @@
 # LabProcesses
 
-[![Build Status](https://travis-ci.org/baggepinnen/LabProcesses.jl.svg?branch=master)](https://travis-ci.org/baggepinnen/LabProcesses.jl)
-
-[![Coverage Status](https://coveralls.io/repos/baggepinnen/LabProcesses.jl/badge.svg?branch=master&service=github)](https://coveralls.io/github/baggepinnen/LabProcesses.jl?branch=master)
-
-[![codecov.io](http://codecov.io/github/baggepinnen/LabProcesses.jl/coverage.svg?branch=master)](http://codecov.io/github/baggepinnen/LabProcesses.jl?branch=master)
+Under development /Bagge
diff --git a/c/Makefile b/c/Makefile
new file mode 100644
index 0000000..2983d11
--- /dev/null
+++ b/c/Makefile
@@ -0,0 +1,15 @@
+CC=gcc 
+
+CFLAGS=-c -Wall -fPIC
+
+SOURCES=comedi_bridge.c 
+OBJECTS=$(SOURCES:.c=.o)
+
+.c.o:
+	$(CC) $(CFLAGS) $< -o $@ 
+
+lib: $(OBJECTS)
+	$(CC) -shared -fPIC -lcomedi -lm -o comedi_bridge.so $(OBJECTS)
+
+clean:
+	rm *.o *.so
diff --git a/c/comedi_bridge.c b/c/comedi_bridge.c
new file mode 100644
index 0000000..c03c2f5
--- /dev/null
+++ b/c/comedi_bridge.c
@@ -0,0 +1,38 @@
+#include <stdio.h>      /* for printf() */
+#include <comedilib.h>
+
+int range = 0;
+int aref = AREF_GROUND;
+comedi_t *it;
+
+int comedi_write(int comediNbr, int subdev, int chan, int writeValue) {
+	static int retval;
+	retval = comedi_data_write(it, subdev, chan, range, aref, writeValue);
+    return retval;
+}
+
+int comedi_read(int comediNbr, int subdev, int chan) {
+	lsampl_t data;
+	comedi_data_read(it, subdev, chan, range, aref, &data);
+    return data;
+}
+
+int comedi_start(int comediNbr) {
+	it = comedi_open("/dev/comedi0");
+		if(it == NULL)
+	{
+		comedi_perror("comedi_open_error");
+		return -1;
+	}
+	return 0;
+}
+
+void comedi_stop(int comediNbr) {
+	// Ad-hoc. Should be updated:
+	comedi_data_write(it, 1, 0, range, aref, 32767);
+	comedi_data_write(it, 1, 1, range, aref, 32767);
+	comedi_close(it);
+}
+
+
+
diff --git a/c/comedi_bridge.o b/c/comedi_bridge.o
new file mode 100644
index 0000000000000000000000000000000000000000..d35413629f28007e9b35f9d6f1179b0624e5eff1
GIT binary patch
literal 3096
zcmb<-^>JfjWMqH=Mg}_u1P><4z;J^D!FB*M9T<2SxEMk`I-hzpzY*xH{nJ_cqcikN
zr|*Yu-wz($tRO|*433=#;Ox%h-JxH)OMgHGJV3H1JAZm~9)AH++zHVFCQlxQ8m!P+
z`=+z>MQ7*}s4kEuR3o2sm%e~XdUP{*^!ons>_jrQ+w~9JG>|hrdTl|rfvxoDJOtC(
zDF9=2GkCNfC>2Ilx8wi+|NmdJ?f_{-H4Ns@&Vx|x-3$mbyBQpJ{;y|XaO^zMd2ts=
z^FC16!aR)7L0B_LA2!V(A49`$!pXx74EialW%|kaxv43c1`H57KEEI}FFv)XD8Gn-
z!QI)}N<qWjFH}>(OwU-)P{GK+(9F=t$WTEeC^bdFBe4V`u4||Xaxa4jm}FpJtO{aa
ztPo(7=3(cUz{tQL!vMh`=|~Xa$S2Uo<jl*)6vD&K0g<x-i8C-T_<?A+yeC{f1|-hF
zz~Bp_;qo4E`5KTo0|Ub>5Dk}~3YG^6VZ)$sVqy6BADbLA)|Ab_z|6pmO*sQI0}F<@
zAOiyfBLfQqEIS~pU}gZPT?{?U4D1+UAOU8$DIgvKGc&LuI8c@>0|SE~l6zqGDnrF#
zd>E|(7XS1g=1v%`&A`AQgcJ_oxMN^ouwY<d5P;f+Oo8GKn|K1$9GHHPI*`5`9Ol$Q
z)h`Drg2g!l149=M_0w>OFM*o#1!@jBZ7?t}Y`~!&mIsoGGE>r1^^zHiQcKDbbM%Z2
z4J;Xo67$ki84`<9(-<;KU@FUtGD}h!;@y4xog97Q{oUMxT|?qS9G!ez<6%lt5=#=}
zA?l!6tSB`x1w|HFptvNl2yQ$mGs09BKr$uNjN+2~0+>v4PJVGJ$cs`Sf`NfSi-CcG
zn}LDh52z&i|Np-lk~kNVxH*zI50bb$R2-B(_>siHd5?jCfr)_uoVq~rAf>?|0*iPq
zR2<zsl}O^q?g7OwND8DL**)_>f>1j_c?#yQtx$20dqBAWCJrt=q3VT^+<yeB9^L$N
zIK=Nl#bM@iLivxNG|2y;G7n}i6R1GJ68^kM;>iA$KoUpxuLV>bWIl5E+e5`c?njPa
zFC=kf^Fxuuk<BlKilduf0~H6EkF35ODh^UFh7_I(&~N~S4+ulK43Ih>l1@P4uzU|H
z2S92-Vjv95-whx^X!-$(!}2SGUU6k^Nn#R%UU5kggwBAmic)hD^-5AJN*MG&IgCLs
zskoRyuP7hFNzTvBP0cG|(96p&N!4@r3)L+yNleaW&;x5r&4^DcO3Vf48K~71QJ`=D
z1raC>A{zt?hdz)bk^~x;K^mG?Vd`N@7eK3s0#Kkp^E5~=tbCS$Dg@<kkT`nHbPgm4
zRf9~S3+pg2fNK|Y{THALL1_V5KPVj_^9{lE93;Mx#bNs8kp-b@k%cUwVg|^93=9nK
zq4w*di9?0qHIoxmKbkTI8ECkni^KH8#KWQb(UmJe1!lk$LTOm|L%9q=IO0zLst}g$
zL3tJ=1i~P_u=oR&Y3N}Ok}rTNOayU|FuMCee5g~AR538@fC_3rX;3_Z$_J>i3^4ma
U<r+5oA3!5|FN&$4HVvu(09Cv3>;M1&

literal 0
HcmV?d00001

diff --git a/c/comedi_bridge.so b/c/comedi_bridge.so
new file mode 100644
index 0000000000000000000000000000000000000000..8cce1524f394bbcf45466c8fe974f9e0c4b76ae1
GIT binary patch
literal 8576
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

literal 0
HcmV?d00001

diff --git a/src/LabProcesses.jl b/src/LabProcesses.jl
index 0ede134..1c963b0 100644
--- a/src/LabProcesses.jl
+++ b/src/LabProcesses.jl
@@ -1,5 +1,51 @@
 module LabProcesses
 
-# package code goes here
+# Interface specification ===================================================================
+abstract type AbstractProcess end
+abstract type PhycicalProcess  <: AbstractProcess end
+abstract type SimulatedProcess <: AbstractProcess end
+
+num_outputs(p::AbstractProcess) = p.ny
+num_inputs(p::AbstractProcess)  = p.nu
+outputrange(p::AbstractProcess) = error("Function not implemented for $(typeof(p))")
+inputrange(p::AbstractProcess)  = error("Function not implemented for $(typeof(p))")
+isstable(p::AbstractProcess)    = error("Function not implemented for $(typeof(p))")
+sampletime(p::AbstractProcess)  = error("Function not implemented for $(typeof(p))")
+
+control(p::AbstractProcess, u)  = error("Function not implemented for $(typeof(p))")
+measure(p::AbstractProcess)     = error("Function not implemented for $(typeof(p))")
+
+
+# Interface implementation Ball And Beam ====================================================
+
+struct BallAndBeam <: PhysicalProcess
+    h::Float64
+end
+
+struct BallAndBeamSimulator <: SimulatedProcess
+    h::Float64
+end
+
+const BallAndBeamType = Union{BallAndBeam, BallAndBeamSimulator}
+num_outputs(p::BallAndBeamType) = 2
+num_inputs(p::BallAndBeamType)  = 1
+outputrange(p::BallAndBeamType) = [(-10,10)]
+inputrange(p::BallAndBeamType)  = [(-10,10)]
+isstable(p::BallAndBeamType)    = false
+sampletime(p::BallAndBeamType)  = p.h
+
+control(p::BallAndBeam, u)  = ccall((:comedi_write, comedipath),Int32,
+                                        (Int32,Int32,Int32,Int32),0,1,1,num2io(u[1]))
+measure(p::BallAndBeam)     = io2num(ccall((:comedi_read,comedipath), Int32,
+                                        (Int32,Int32,Int32), 0,0,0))
+
+const comedipath = "../c/comedi_bridge.so"
+const conversion = 65535/20
+io2num(x) = x/conversion -10            # Converts from io to float
+num2io(x) = round(Int32,x*100 + 2050)   # Converts from regular number to io
+
+control(p::BallAndBeamSimulator, u)  = error("Not yet implemented")
+measure(p::BallAndBeamSimulator)     = error("Not yet implemented")
+
 
 end # module
-- 
GitLab