Arduino question?
Bruce Labitt
bruce.labitt at myfairpoint.net
Fri May 3 19:34:54 EDT 2019
Hi Paul,
It seems this is a variant of header hell that I am stewing in... At
the moment the project is not up on github, as I was under some sort of
delusion that this might eventually have some commercial value. I'm not
so sure about that, but I have put a lot of effort into it so far...
Arduino, does indeed do some funky stuff. If I could figure it out, I'd
probably just write my own scripts to have things compile in the order I
want. A makefile isn't hard. I just don't know all the crazy locations
where Arduino stuff is stashed. Suppose I could poke about.
Thanks for the tip on going through the #ifndef's. It's got to be in
that neighborhood. I put in the #ifndef stuff to prevent multiple
inclusions, which Arduino 1.8.9 IDE does not seem to like, the compiler
squawked at me when I tried to do that. What is puzzling me is that
even if I put the include #include "RunningMedian.h" in the file, I get
"nearly" the same error, if I comment out the include.
WITH include:
#include "moreutils.h"
*#include "RunningMedian.h"*
home/bruce/Arduino/adcdmafftM4bruce/adcdmafft/adcdmafftm4/moreutils.ino:
In function 'void doMedian(float*, float*, int)':
moreutils:14:3: error: 'RunningMedian' was not declared in this scope
RunningMedian samples = RunningMedian(medianlength);
^
moreutils:14:17: error: expected ';' before 'samples'
RunningMedian samples = RunningMedian(medianlength);
^
moreutils:16:5: error: 'samples' was not declared in this scope
samples.add(abuf[i]);
^
exit status 1
'RunningMedian' was not declared in this scope
WITHOUT include:
#include "moreutils.h"
/home/bruce/Arduino/adcdmafftM4bruce/adcdmafft/adcdmafftm4/moreutils.ino:
In function 'void doMedian(float*, float*, int)':
moreutils:14:3: error: 'RunningMedian' was not declared in this scope
RunningMedian samples = RunningMedian(medianlength);
^
moreutils:14:17: error: expected ';' before 'samples'
RunningMedian samples = RunningMedian(medianlength);
^
moreutils:16:5: error: 'samples' was not declared in this scope
samples.add(abuf[i]);
^
exit status 1
'RunningMedian' was not declared in this scope
In both cases, the top of the file states #include moreutils.h. And
inside of moreutils.h there is:
#ifndef RunningMedian_h
#define RunningMedian_h
#include "RunningMedian.h"
...
#endif
It's got to be simple, it's got to be simple,... Wish I could see it
what it was...
I think, I'll come up on Monday. I haven't been to the Manchester Maker
Space before.
-Bruce
On 5/3/19 6:50 PM, Paul Beaudet wrote:
> The compiler is basically telling you the library is not imported or
> has yet to be imported for whatever reason.
>
> The Arduinoy parts of the compilation process do some weird things
> behind the scenes to reorder the code before compiling so that it
> actually makes sense. Done with extra .ino files not named the same as
> the project and functions after the main loop in said project_name.ino
> file. Its possible for an Arduino developer/tinkerer to declare a
> function after the two primary loops that use those exact functions
> before actual deceleration because of this behavior. Which breaks some
> expectations of hardened engineers I think. All in the interest of
> catering to new people that would probably be frustrated by a strict
> order of operation. If this behaviour rearranges library functions
> before the "#include <mylibrary.h>", that might give an unexpected
> result, but that doesn't seem to be what's going on here. Under the
> hood strict order of operations still exist. Arduino does ultimately
> use the gcc compiler, though maybe its configured for that switcharoo
> magic, I didn't write the code, I've just fallen into the traps.
>
> Extra .ino files in the same folder will be arranged before your main
> .ino file, but it could be right before setup. Not sure, its been a
> while since I've been regularly working with the Arduino, I could be
> wrong. The .h file should be a bit more obvious as to where its
> included. Bit more explicit
>
> Do you have a github link to your current project state Bruce?
>
> I'm looking back at an older project of mine, it looks like I was
> doing something similar in this one
> https://github.com/PaulBeaudet/SimpleBotSocketIo/blob/master/SimpleBotSocketIo.ino
> I declared a timer library in a .h file then declared and instance of
> it in the .ino fille. We demoed that bot at the mini makerfaire in
> dover, I'm assuming it compiled and that should be something that's doable
>
> I think you may want to inspect your #ifndef statement a bit more
> closely to be sure the RunningMedian data type (library import) is
> actually being instantiated after that pre-compilation logic runs its
> course. Why do you need to prevent multiple instances from being
> called? #import should only call one instance, right? Also, spelling,
> that's normally my issue.. haha
>
> If you are still having trouble after spending more time with it, feel
> free to stop by the Manchester Makerspace Monday during open house
> (6pm-8pm). I'll likely be in giving tours, I can take a look with you
> when tours simmer down.
>
> Cheers,
> Paul Beaudet
>
> On Fri, May 3, 2019 at 4:57 PM Bruce Labitt
> <bruce.labitt at myfairpoint.net <mailto:bruce.labitt at myfairpoint.net>>
> wrote:
>
> Can I ask an Arduino/C/C++ question here? If not, where is a decent
> place to ask? Full code is just under 50KB (unzipped).
>
> It's a "Variable was not declared in this scope" problem.
> Basically, I'm
> in over my head at the moment. I'm not a good structured
> programmer -
> so let's get that out of the way. I'm a hack, in the worst sense...
>
> Everything was working... when I had a huge file. I then decided,
> wow,
> this is a mess, lets break this up a bit into modules, so that it is
> more supportable and debug-able (for myself). If anyone is remotely
> interested, it is a homebrew radar based chronograph. I've got
> most of
> the pieces working (or at least it worked before I recently busted
> things). The 100KHz sampling using DMA, the ping pong floating
> point 1K
> FFT's running in 'real' time, and some display stuff. Separately, I
> have a live update of a tft screen (320x240) running with the FFT
> output. I'm running on an ARM M4F processor, but using the Arduino
> IDE. The Arduino way of doing things is a little confusing to me,
> to be
> honest. It hides a lot of things.
>
> Ok, here is the error.
>
> /home/bruce/Arduino/adcdmafftM4bruce/adcdmafft/adcdmafftm4/moreutils.ino:
>
> In function 'void doMedian(float*, float*, int)':
> moreutils:14:3: error: 'RunningMedian' was not declared in this scope
> RunningMedian samples = RunningMedian(medianlength);
> ^
> moreutils:14:17: error: expected ';' before 'samples'
> RunningMedian samples = RunningMedian(medianlength);
> ^
> moreutils:16:5: error: 'samples' was not declared in this scope
> samples.add(abuf[i]);
> ^
> exit status 1
> 'RunningMedian' was not declared in this scope
>
> The code in moreutils.ino is:
>
> // additional processing
> #include "moreutils.h"
>
> void doMedian( float abuf[], float runmed[], int medianlength) { //
> needs work!
>
> RunningMedian samples = RunningMedian(medianlength);
> for (int i=0; i< FFT_SIZE/2; i++) {
> samples.add(abuf[i]);
> if (i>medianlength-1) {
> runmed[i-medianlength] = samples.getMedian();
> // don't put value until the circ buffer is filled
> }
> }
> for (int i= (FFT_SIZE/2 -medianlength-7); i< (FFT_SIZE/2); i++) {
> runmed[i] = runmed[FFT_SIZE/4]; // hack for now
> // at tail end of median there are some bizarre numbers. root
> cause has not been
> // determined, so we just fill the last samples from
> 'something close'
> }
> }
>
> Inside of moreutils.h, is #include RunningMedian.h with an
> #ifndef/#define/#include statement, to prevent multiple includes
> of the
> same file (RunningMedian.h).
>
> I'm really kind of confused as to where I need to do the declaration.
>
> In
> https://github.com/RobTillaart/Arduino/blob/master/libraries/RunningMedian/examples/RunningMedian/RunningMedian.ino
>
> the declaration is simply done prior to setup. Snippet below
>
> #include <RunningMedian.h>
>
> RunningMedian samples = RunningMedian(5);
>
> RunningMedian samples2 = RunningMedian(9);
>
> void setup() {
>
> ...
>
> }
>
> void loop() {
>
> use samples here...
>
> }
>
> I'm sure this is trivial for most of you - but I'm both perplexed and
> stuck. If one of you kind souls could help me, I'd greatly
> appreciate
> it. I'd even travel to see someone if that would work out better.
>
> TIA, Bruce
>
> _______________________________________________
> gnhlug-discuss mailing list
> gnhlug-discuss at mail.gnhlug.org <mailto:gnhlug-discuss at mail.gnhlug.org>
> http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.gnhlug.org/pipermail/gnhlug-discuss/attachments/20190503/691e60c5/attachment-0001.html
More information about the gnhlug-discuss
mailing list