Building a linux/Pi library to call via FFI

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
29 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Building a linux/Pi library to call via FFI

timrowledge
I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation…
especially on unix.

I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn’t be rocket science stuff!

So far I can
a) compile the C file (well duh)
b) link it as a shared library
c) install it in /usr/local/lib (next to another library that I can use from FFI already, so I know the path gets looked at)
d) set the permissions to match the working library
e) use from a simple C program to prove it works

However, all I get from squeak is an error that the external module is not found. I’ll take a look with a debug vm but I’d  be very happy to hear that I’m forgetting some trivial flag or incantation that can short-circuit the ‘fun’ of using gdb.

Here is the code and makefile -
https://copy.com/DGDbpJM4wnHQrDUG

What I’ve been doing to build & try is
make clean
make
sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1
sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so
sudo ldconfig
gcc -Wall -o testing testing.c -lmadwickIMU
./testing

‘testing’ seem to do the right thing. Going into squeak (cog/spur/pi) and trying a method like -
invSqrt: floatval
#<cdecl: float ‘invSqrt’ (float) module: ‘madgwickIMU’>
^self externalCallFailed
- just gives me the not found module error.

I’ve restarted squeak after building the lib, I’ve opened a new terminal after building the lib (just in case there’s some stupid path-exporting nonsense I don’t understand etc) and I’ve made sure to smile only on the left side. What on earth am I forgetting?

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Useful Latin Phrases:- Braccae illae virides cum subucula rosea et tunica Caledonia-quam elenganter concinnatur! = Those green pants go so well with that pink shirt and the plaid jacket!



cbc
Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

cbc
Hmm.  Maybe try creating the class method:

moduleName
   ^'madgwickIMU'

(assuming you haven't already).


-cbc



On Wed, Sep 9, 2015 at 11:17 AM, tim Rowledge <[hidden email]> wrote:
I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation…
especially on unix.

I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn’t be rocket science stuff!

So far I can
a) compile the C file (well duh)
b) link it as a shared library
c) install it in /usr/local/lib (next to another library that I can use from FFI already, so I know the path gets looked at)
d) set the permissions to match the working library
e) use from a simple C program to prove it works

However, all I get from squeak is an error that the external module is not found. I’ll take a look with a debug vm but I’d  be very happy to hear that I’m forgetting some trivial flag or incantation that can short-circuit the ‘fun’ of using gdb.

Here is the code and makefile -
https://copy.com/DGDbpJM4wnHQrDUG

What I’ve been doing to build & try is
make clean
make
sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1
sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so
sudo ldconfig
gcc -Wall -o testing testing.c -lmadwickIMU
./testing

‘testing’ seem to do the right thing. Going into squeak (cog/spur/pi) and trying a method like -
invSqrt: floatval
#<cdecl: float ‘invSqrt’ (float) module: ‘madgwickIMU’>
^self externalCallFailed
- just gives me the not found module error.

I’ve restarted squeak after building the lib, I’ve opened a new terminal after building the lib (just in case there’s some stupid path-exporting nonsense I don’t understand etc) and I’ve made sure to smile only on the left side. What on earth am I forgetting?

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Useful Latin Phrases:- Braccae illae virides cum subucula rosea et tunica Caledonia-quam elenganter concinnatur! = Those green pants go so well with that pink shirt and the plaid jacket!






Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 09-09-2015, at 11:33 AM, Chris Cunningham <[hidden email]> wrote:

> Hmm.  Maybe try creating the class method:
>
> moduleName
>    ^'madgwickIMU'
>
> (assuming you haven't already).

Ah, but that would be for a plugin, whereas this is a simple C library. Or *should* be, if I got it right.


tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: XER: Exclusive ERror



cbc
Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

cbc


On Wed, Sep 9, 2015 at 11:40 AM, tim Rowledge <[hidden email]> wrote:

On 09-09-2015, at 11:33 AM, Chris Cunningham <[hidden email]> wrote:

> Hmm.  Maybe try creating the class method:
>
> moduleName
>    ^'madgwickIMU'
>
> (assuming you haven't already).

Ah, but that would be for a plugin, whereas this is a simple C library. Or *should* be, if I got it right.

ok.  Does FFI know to prepend the lib and postpend the .so in Unix for you?  I'm curious.

-cbc 

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: XER: Exclusive ERror






Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 09-09-2015, at 11:44 AM, Chris Cunningham <[hidden email]> wrote:
> ok.  Does FFI know to prepend the lib and postpend the .so in Unix for you?  I'm curious.

Well, it does for other libraries; for example calling libwiringPi.so you use #<cdecl: void ‘foo’ (int) module: ‘wiringPi’>

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: SNARF: System Normalize And Reset Flags



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

Nicolai Hess
How do you start squeak ?
Is there a squeak shell script that may modify the library lookup path?

you could try to start squeak with
LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH squeak



2015-09-09 20:55 GMT+02:00 tim Rowledge <[hidden email]>:

On 09-09-2015, at 11:44 AM, Chris Cunningham <[hidden email]> wrote:
> ok.  Does FFI know to prepend the lib and postpend the .so in Unix for you?  I'm curious.

Well, it does for other libraries; for example calling libwiringPi.so you use #<cdecl: void ‘foo’ (int) module: ‘wiringPi’>

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: SNARF: System Normalize And Reset Flags






Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 09-09-2015, at 12:26 PM, Nicolai Hess <[hidden email]> wrote:

> How do you start squeak ?
> Is there a squeak shell script that may modify the library lookup path?
>
> you could try to start squeak with
> LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH squeak

OK, tried that to no avail; but the wiringPi library in the same directory works :-) What fun, eh?

ldconfig -p | grep mad shows ‘libmadgwickIMU.so (libc6,hard-float) => /usr/local/lib.libmadgwickIMU.so

Into the joys of gdb right now, just starting to (attempt to) load the lib. I wonder if it’ll be friendly?

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
In the long run, every program becomes rococco, and then rubble.



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

Chris Cunnington-4
In reply to this post by timrowledge
I think you may have typed "W" one to many times in this Makefile and you're adding them where they don't belong. I detect a rogue W in the name madgwick.

@$(CC) -shared -Wl,-soname,libmadgwickIMU.so -o lib--------->w<---------madgwickIMU.so.$(VERSION) -lm $(OBJ)

Also, when I compile on this Ubuntu 15.04 I get an error. [1] 

FWIW,
Chris 

[1]

$ make
[Compile] MadgwickAHRS.c
MadgwickAHRS.c: In function ‘invSqrt’:
MadgwickAHRS.c:218:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  long i = *(long*)&y;
  ^
MadgwickAHRS.c:220:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
  y = *(float*)&i;
  ^
[Link (Dynamic)]




On Wed, Sep 9, 2015 at 2:55 PM, tim Rowledge <[hidden email]> wrote:

On 09-09-2015, at 11:44 AM, Chris Cunningham <[hidden email]> wrote:
> ok.  Does FFI know to prepend the lib and postpend the .so in Unix for you?  I'm curious.

Well, it does for other libraries; for example calling libwiringPi.so you use #<cdecl: void ‘foo’ (int) module: ‘wiringPi’>

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: SNARF: System Normalize And Reset Flags






Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 09-09-2015, at 12:55 PM, Chris Cunnington <[hidden email]> wrote:

> I think you may have typed "W" one to many times in this Makefile and you're adding them where they don't belong. I detect a rogue W in the name madgwick.

Ah, just for a moment there I thought you’d spotted the dumb mistake. But I was ‘correcting’ that in the install stuff and fixing the makefile etc resulted in exactly the same result. Sigh.


tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
It is easier to change the specification to fit the program than vice versa.



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

Ken G. Brown
In reply to this post by timrowledge
>
> On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote:
>
> sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1
> sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so
                                                                                                        ^
Is there a reason for the madwick instead of madgwick?

Ken


> On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote:
>
> I’m trying - and so far failing - to do what should surely be a very simple thing. This isn’t a new situation…
> especially on unix.
>
> I have a single C file with just two functions. I have a matching H file. I want to make them into a dynamic library that I can call via FFI. This really shouldn’t be rocket science stuff!
>
> So far I can
> a) compile the C file (well duh)
> b) link it as a shared library
> c) install it in /usr/local/lib (next to another library that I can use from FFI already, so I know the path gets looked at)
> d) set the permissions to match the working library
> e) use from a simple C program to prove it works
>
> However, all I get from squeak is an error that the external module is not found. I’ll take a look with a debug vm but I’d  be very happy to hear that I’m forgetting some trivial flag or incantation that can short-circuit the ‘fun’ of using gdb.
>
> Here is the code and makefile -
> https://copy.com/DGDbpJM4wnHQrDUG
>
> What I’ve been doing to build & try is
> make clean
> make
> sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1
> sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so
> sudo ldconfig
> gcc -Wall -o testing testing.c -lmadwickIMU
> ./testing
>
> ‘testing’ seem to do the right thing. Going into squeak (cog/spur/pi) and trying a method like -
> invSqrt: floatval
> #<cdecl: float ‘invSqrt’ (float) module: ‘madgwickIMU’>
> ^self externalCallFailed
> - just gives me the not found module error.
>
> I’ve restarted squeak after building the lib, I’ve opened a new terminal after building the lib (just in case there’s some stupid path-exporting nonsense I don’t understand etc) and I’ve made sure to smile only on the left side. What on earth am I forgetting?
>
> tim
> --
> tim Rowledge; [hidden email]; http://www.rowledge.org/tim
> Useful Latin Phrases:- Braccae illae virides cum subucula rosea et tunica Caledonia-quam elenganter concinnatur! = Those green pants go so well with that pink shirt and the plaid jacket!
>
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 09-09-2015, at 2:07 PM, Ken G. Brown <[hidden email]> wrote:

>>
>> On Sep 9, 2015, at 12:17, tim Rowledge <[hidden email]> wrote:
>>
>> sudo install -m 0755 libmadgwickIMU..s0.1 /usr/local/lib/libmadgwickIMU.so.1
>> sudo ln -sf /usr/local/lib/libmadgwickIMU.so.1 /usr/local/lib/libmadwickIMU.so
> ^
> Is there a reason for the madwick instead of madgwick?

Sigh; yes, a stupid typo when writing the email. Not in the ‘actual’ commandline. Now I’m running dbg through loading te wiringpi library that it *does* find ok, to see where it thinks it finds it. This is getting really a bit daft.


tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
The substance "Hey Y'all, watch this!" is known by the state of California to be hazardous to your health.




Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge
So after too much annoyance I finally found the stupid problem. It’s an object lesson in ‘stupid things OSs do to people’.

I’m sure somebody somewhere thought it was a good idea to scatter libraries  around the place and then make it possible for applications to not know about all of them. The result is that you end up with shell scripts that try to work out what the library paths are and set environment variables and/or pass arguments along, often to yet another script. Eventually you get to some code in the application that has to look up something involving all this cruft and just have to hope it was all done reasonably well.

And of course, no two *nix versions actually agree on what the paths should be. What a concept!

Thus my situation today; a library lives in /usr/local/lib and I naively make another library and sit it next to that. After all, the first library works ok, right? No problem. But the damn scripts don’t actually do anything with this path, as I discovered after a tedious pair of debugging runs when the *working* library didn’t work. I happened upon looking at all the places where the module loading code seemed to peek. And lo! A link from one such place to the %$^ing /usr/local/lib/libwiringPi.so file. Sigh. Make a link for my new library and it actually loads. Mind you, it returns a Character instead of a Float, so something else is happening now.

I still can’t work out how that link got there. I still can’t work out how the ldconfig cache-thingy doesn’t let the library load. I still can’t work out why RISC OS isn’t the normal OS. Thanks for the assorted suggestions!

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Useful random insult:- Ready to check in at the HaHa Hilton.



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

David T. Lewis
In reply to this post by timrowledge
On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
> I?m trying - and so far failing - to do what should surely be a very simple
> thing. This isn?t a new situation?  especially on unix.
>
> I have a single C file with just two functions. I have a matching H file.
> I want to make them into a dynamic library that I can call via FFI. This
> really shouldn?t be rocket science stuff!

<OT>
I assume there is some good reason that you would not do an end run
around all that rocket science and just write a plugin? After all, you
are the person who wrote the excellent early papers on how to extend the
VM with plugins, and most of what little I know of VMs came from reading
your early work on the topic.

I would hate to be the one to deny a masochist his private pleasures, but
really, why not not just do it the easy way?
</OT>

Dave


Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

Chris Cunnington-4
http://sdmeta.gforge.inria.fr/FreeBooks/CollectiveNBlueBook/greenberg.pdf

Write it in Smalltalk:

#reverseInPlaceFrom:to:

| temp |
0 to: to - from // 2 do:
    [:index | temp ← self at: from + index.
    self at: from + index put: (self at: to-index).
    self at: to-index put: temp]

Re-write it as Slang:

#primReverseFromto

self export: true.
self var: #rcvr declareC: 'int *rcvr'.
to ← interpreterProxy stackIntegerValue: 0. from ← interpreterProxy stackIntegerValue: 1.
rcvrOop ← interpreterProxy stackObjectValue: 2.
rcvr ← self cCoerce: (interpreterProxy firstIndexableField: rcvrOop) to: 'int *'.
interpreterProxy success: (from >= 1 and: [from+1 <= to]). interpreterProxy success: (to <= (interpreterProxy stSizeOf: rcvrOop)).
interpreterProxy failed ifTrue: [^nil].
rcvr ← rcvr - 1. "adjust for 1-based indexing."
0 to: to-from/2 do:
    [:index | t ← rcvr at: from + index.
    rcvr at: from + index put: (rcvr at: to-index).
    rcvr at: to-index put: t].
interpreterProxy pop: 3 thenPush: rcvrOop

Or subclass the long lost TestCodeGenerator to do it for you!

Chris

For those of you watching at home, the article above has the HelloWorld of plugins. Igor changed is slightly for a lecture in 2011 to make a plugin called TheUniversalAnswer. It returns 42.

#answerSeventeen

self export: true.
interpreterProxy
     pop: 1
     thenPush: (interpreterProxy integerObjectOf: 17)

All you need now is a compiling rig with two VMs and two images.
The VM you start your VMMaker image with. The VM you compile from the VMMaker source you just generated.
And the pristine target image you start with the VM you just compiled to prove it works.

Your spiral into plugin compiling madness starts with this handy script:

http://lists.squeakfoundation.org/pipermail/squeak-dev/2012-October/166038.html





On 2015-09-09 9:53 PM, David T. Lewis wrote:
On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
I?m trying - and so far failing - to do what should surely be a very simple
thing. This isn?t a new situation?  especially on unix.

I have a single C file with just two functions. I have a matching H file.
I want to make them into a dynamic library that I can call via FFI. This
really shouldn?t be rocket science stuff!
<OT>
I assume there is some good reason that you would not do an end run
around all that rocket science and just write a plugin? After all, you
are the person who wrote the excellent early papers on how to extend the
VM with plugins, and most of what little I know of VMs came from reading
your early work on the topic.

I would hate to be the one to deny a masochist his private pleasures, but
really, why not not just do it the easy way?
</OT>

Dave





Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge
In reply to this post by David T. Lewis

On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote:

> On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
>> I?m trying - and so far failing - to do what should surely be a very simple
>> thing. This isn?t a new situation?  especially on unix.
>>
>> I have a single C file with just two functions. I have a matching H file.
>> I want to make them into a dynamic library that I can call via FFI. This
>> really shouldn?t be rocket science stuff!
>
> <OT>
> I assume there is some good reason that you would not do an end run
> around all that rocket science and just write a plugin?

Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea.

But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn’t seem quite right.

tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Useful random insult:- Not enough sense to come in out of the rain.



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

Eliot Miranda-2


On Thu, Sep 10, 2015 at 10:29 AM, tim Rowledge <[hidden email]> wrote:

On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote:

> On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
>> I?m trying - and so far failing - to do what should surely be a very simple
>> thing. This isn?t a new situation?  especially on unix.
>>
>> I have a single C file with just two functions. I have a matching H file.
>> I want to make them into a dynamic library that I can call via FFI. This
>> really shouldn?t be rocket science stuff!
>
> <OT>
> I assume there is some good reason that you would not do an end run
> around all that rocket science and just write a plugin?

Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea.

But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn’t seem quite right.

I'm sure this can be fixed.  Have you talked to Doug McPherson?

_,,,^..^,,,_
best, Eliot


Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

timrowledge

On 10-09-2015, at 12:33 PM, Eliot Miranda <[hidden email]> wrote:
> But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn’t seem quite right.
>
> I'm sure this can be fixed.  Have you talked to Doug McPherson?

Yup.

And after much head-scratching because I’ve completely forgotten how plugin building works, I finally have a plugin that takes 9 float values, does unspeakable things to them and spits out a four float quaternion answer. On a Pi2 it test at ~ 8 micro-sec per call, which isn’t bad for 270+ floating point operations including 150 divides. The next fun is feeding live IMU data to it and finding away to display something meaningful as a result.


tim
--
tim Rowledge; [hidden email]; http://www.rowledge.org/tim
Strange OpCodes: BOMB: Burn Out Memory Banks



Reply | Threaded
Open this post in threaded view
|

Re: Building a linux/Pi library to call via FFI

David T. Lewis
On Thu, Sep 10, 2015 at 06:55:55PM -0700, tim Rowledge wrote:

>
> On 10-09-2015, at 12:33 PM, Eliot Miranda <[hidden email]> wrote:
> > But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn?t seem quite right.
> >
> > I'm sure this can be fixed.  Have you talked to Doug McPherson?
>
> Yup.
>
> And after much head-scratching because I?ve completely forgotten how plugin building works, I finally have a plugin that takes 9 float values, does unspeakable things to them and spits out a four float quaternion answer. On a Pi2 it test at ~ 8 micro-sec per call, which isn?t bad for 270+ floating point operations including 150 divides. The next fun is feeding live IMU data to it and finding away to display something meaningful as a result.
>

Can you send a copy of your plugin as a fileout, change set, or mcz?

I am expecting that you have one primitive with 9 double precision
Float objects as parameters that are coerced to single precision floats
and passed as parameters to MadgwickAHRSupdate(), which deposits
the results into the q0, q1, q2, and q3 variables, which are coerced
back to double precision Float objects and pushed back to the image
as the result. Is that right?

Thanks,
Dave
 

Reply | Threaded
Open this post in threaded view
|

MadgwickAHRS plugin and support code (was: Building a linux/Pi library to call via FFI)

David T. Lewis
In reply to this post by timrowledge
On Thu, Sep 10, 2015 at 10:29:24AM -0700, tim Rowledge wrote:

>
> On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote:
>
> > On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
> >> I?m trying - and so far failing - to do what should surely be a very simple
> >> thing. This isn?t a new situation?  especially on unix.
> >>
> >> I have a single C file with just two functions. I have a matching H file.
> >> I want to make them into a dynamic library that I can call via FFI. This
> >> really shouldn?t be rocket science stuff!
> >
> > <OT>
> > I assume there is some good reason that you would not do an end run
> > around all that rocket science and just write a plugin?
>
> Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea.
>
> But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn?t seem quite right.
>

I don't know what got into me, but I brewed up a nice pot of coffee this
morning and ended up with http://squeaksource.com/MadgwickAHRS/

This is a plugin, accessor class, and unit tests that claim to demonstrate
that the plugin works.

I used FloatArray for parameter passing, on the theory that users of the
plugin may be doing float (not double) arithmetic, so it may be more
efficient to pass values in that manner.

It works with 32/64 bit image and host, and the plugin builds without complaint
(trunk with Ian's Cmake build) if you put the library source files
MadgwickAHRS.c and MadgwickAHRS.h in platforms/Cross/plugins/MadgwickAHRS/

The MadgwickAHRS library is licensed GPL, so it would be best to link
the plugin dynamically to e.g. /usr/local/iib/libwmadgwickIMU.so.1
rather than static link to the C code as I have done so far. If there
is any interest in the plugin, I'll see if I can figure out the linker
magic.

See class MadgwickAHRSTest for examples.

Repository is at http://www.squeaksource.com/MadgwickAHRS

Tim, I added you as developer on the squeaksource.com repository in case you
want to make use of this.

Dave


Reply | Threaded
Open this post in threaded view
|

Re: MadgwickAHRS plugin and support code (was: Building a linux/Pi library to call via FFI)

Chris Cunnington-4

Cool. I'm going to try this out.

Chris

On Sep 12, 2015 7:47 PM, "David T. Lewis" <[hidden email]> wrote:
On Thu, Sep 10, 2015 at 10:29:24AM -0700, tim Rowledge wrote:
>
> On 09-09-2015, at 6:53 PM, David T. Lewis <[hidden email]> wrote:
>
> > On Wed, Sep 09, 2015 at 11:17:08AM -0700, tim Rowledge wrote:
> >> I?m trying - and so far failing - to do what should surely be a very simple
> >> thing. This isn?t a new situation?  especially on unix.
> >>
> >> I have a single C file with just two functions. I have a matching H file.
> >> I want to make them into a dynamic library that I can call via FFI. This
> >> really shouldn?t be rocket science stuff!
> >
> > <OT>
> > I assume there is some good reason that you would not do an end run
> > around all that rocket science and just write a plugin?
>
> Well I *did* originally point out that there was probably a really stupid mistake in my process and that is pretty much it. In my defence I was in the midst of FFI-ing to multiple external libraries for assorted Pi add-on doohickeys and getting somewhat inured to the idea.
>
> But I think I may re-do it as a plugin today, not least because it seems that the ARM ffi interface has a problem with returning floats; they come back as Character null. I may not be a great IEEE floating point standard expert but that doesn?t seem quite right.
>

I don't know what got into me, but I brewed up a nice pot of coffee this
morning and ended up with http://squeaksource.com/MadgwickAHRS/

This is a plugin, accessor class, and unit tests that claim to demonstrate
that the plugin works.

I used FloatArray for parameter passing, on the theory that users of the
plugin may be doing float (not double) arithmetic, so it may be more
efficient to pass values in that manner.

It works with 32/64 bit image and host, and the plugin builds without complaint
(trunk with Ian's Cmake build) if you put the library source files
MadgwickAHRS.c and MadgwickAHRS.h in platforms/Cross/plugins/MadgwickAHRS/

The MadgwickAHRS library is licensed GPL, so it would be best to link
the plugin dynamically to e.g. /usr/local/iib/libwmadgwickIMU.so.1
rather than static link to the C code as I have done so far. If there
is any interest in the plugin, I'll see if I can figure out the linker
magic.

See class MadgwickAHRSTest for examples.

Repository is at http://www.squeaksource.com/MadgwickAHRS

Tim, I added you as developer on the squeaksource.com repository in case you
want to make use of this.

Dave




12