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 -[](https://travis-ci.org/baggepinnen/LabProcesses.jl) - -[](https://coveralls.io/github/baggepinnen/LabProcesses.jl?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