That is actually exactly what I ended up doing, but it wasn't really
suiting my needs, so I just re-organized my program so that it wasn't
necesary to run two different guys.  The problem I ran into is that
the ReceiveMsg[x] interface can't be invoked by more than one
componnet because even though it might only get used by one, it is
wired to both.  Normally if there were two people receiving the same
event, their return values woudl be ANDed for the true result value. 
This doesn't work here though, because the return type is a pointer
and you can't AND that.

There are probably work arounds but I chose to just rewrite my program
in a different way.  Just a note for anyone trying to do this...


On Wed, 9 Feb 2005 17:49:48 -0800 (PST), [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:
> Actually it won't work that way.
> Configuration file is static. Once you wire it, you wire it.
> you can not put "if" statement in conf.
>  TOS_LOCAL_ADDRESS need to be judged in StdControl.ini() in the wrapper
> module.
> I think I figure out the solution. Take CntToRfm & RfmToLeds for an exmaple.
> 
> configuration CntToRfm {
> }
> implementation {
>   components Main, Counter, IntToRfm, TimerC;
> 
>   Main.StdControl -> Counter.StdControl;
>   Main.StdControl -> IntToRfm.StdControl;
>   Counter.Timer -> TimerC.Timer[unique("Timer")];
>   Counter.IntOutput -> IntToRfm.IntOutput;
> }
> --------
> configuration RfmToLeds {
> }
> implementation {
>   components Main, RfmToInt, IntToLeds;
> 
>   Main.StdControl -> IntToLeds.StdControl;
>   Main.StdControl -> RfmToInt.StdControl;
>   RfmToInt.IntOutput -> IntToLeds.IntOutput;
> }
> ------
> above are original conf. files
> I changed them to:
> 
> configuration CntToRfm {
>     provides interface StdControl;
> }
> implementation {
>   components Counter, IntToRfm, TimerC;
> 
>   StdControl = Counter.StdControl;
>   StdControl = IntToRfm.StdControl;
>   Counter.Timer -> TimerC.Timer[unique("Timer")];
>   Counter.IntOutput -> IntToRfm.IntOutput;
> }
> -------
> configuration RfmToLeds {
>         provides interface StdControl;
> }
> implementation {
>   components RfmToInt, IntToLeds;
> 
>   StdControl = IntToLeds.StdControl;
>   StdControl = RfmToInt.StdControl;
>   RfmToInt.IntOutput -> IntToLeds.IntOutput;
> }
> -------
> In the wrapper conf. file, I put:
> 
> configuration Wrapper
> {}
> implementation
> { components Main, WrapperM, CntToRfm, RfmToLeds;
> Main.StdControl->WrapperM.StdControl;
> WrapperM.FstControl->CntToRfm.StdControl;
> WrapperM.SndControl->RfmToLeds.StdControl;
> }
> ----------
> The WrapperM module is the real place where different components are
> initialized at run time according to local_addr:
> 
> module WrapperM
> {provides
>         { interface StdControl;
> 
>         }
>      uses
>         {interface StdControl as FstControl;
>          interface StdControl as SndControl;
>         // interface StdControl as TrdControl;
>         }
> }
> implementation
> {
> 
>   command result_t StdControl.init()
>     {
> 
>                 dbg(DBG_USR1, "WrapperM initializing.\n");
>                      if (TOS_LOCAL_ADDRESS==0)
>                   return (call FstControl.init());
>                 else if ((TOS_LOCAL_ADDRESS==1))
>                   return (call SndControl.init());
>         //        else if ((TOS_LOCAL_ADDRESS==2))
>         //          return (call TrdControl.init());
>                 else
>                   {dbg(DBG_USR1, "local addr=%i, initializ nothing\n",
> TOS_LOCAL_ADDRESS);
>                   //return 0;
>                   }
> 
>      return SUCCESS;
>     }
> 
>    command result_t StdControl.start()
>     {
> 
>                 dbg(DBG_USR1, "WrapperM initializing.\n");
>                      if (TOS_LOCAL_ADDRESS==0)
>                   return (call FstControl.start());
>                 else if ((TOS_LOCAL_ADDRESS==1))
>                   return (call SndControl.start());
>         //        else if ((TOS_LOCAL_ADDRESS==2))
>         //          return (call TrdControl.start());
>                 else
>                   {dbg(DBG_USR1, "local addr=%i, initializ nothing\n",
> TOS_LOCAL_ADDRESS);
>                   //return 0;
>                   }
> 
>      return SUCCESS;
>     }
>        command result_t StdControl.stop()
>     {
> 
>                 dbg(DBG_USR1, "WrapperM initializing.\n");
>                      if (TOS_LOCAL_ADDRESS==0)
>                   return (call FstControl.stop());
>                 else if ((TOS_LOCAL_ADDRESS==1))
>                   return (call SndControl.stop());
>         //        else if ((TOS_LOCAL_ADDRESS==2))
>         //          return (call TrdControl.stop());
>                 else
>                   {dbg(DBG_USR1, "local addr=%i, initializ nothing\n",
> TOS_LOCAL_ADDRESS);
>                   //return 0;
>                   }
> 
>      return SUCCESS;
>     }
> }
> -------
> Because it is for 2 aplications simulation, so I commented out
> TOS_LOCAL_ADDRESS==2 part, which is for more applications.
> Just put new CntToRfm, RfmToLeds, Wrapper, WrapperM in one folder with
> "COMPONENT=Wrapper"in the makefile. It will do.
> Many thanks to Joe for the hint in previous post.
> comments are welcomed.
> 
> Happy Valentine!
> 
> Leo
> 
> > This is probably more of a style question than anythign else.  I am
> > curious if this makes sense.  I figured before spending a few hours
> > and trying to implement my project this way, i'd run it by the
> > experts.
> >
> > If I want to have 2(probably not more) components running in the same
> > TOSSIM simulation like stated above, would it make sense to make these
> > components basically autonomous in that they just need to be linked to
> > Main.StdControl.  I was thinking something like this:
> >
> >
> > file1:
> >
> > configuration Wrap{
> > }
> > implementation{
> >    components CHOICE1, CHOICE2;
> >
> >    if(TOS_LOCAL_ADDRESS == 0){
> >      Main.StdControl -> CHOICE1;
> >   }
> >   else{
> >      Main.StdControl-> CHOICE2;
> >   }
> > }
> >
> >
> > but then CHOICE1 and 2 would be configurations instead of Modules that
> > take care of all of their wirings to other Modules, and interfaces.
> > This way the wrapper file is clean, and the two separate components
> > can each do their own thing and there will be less confusion if they
> > need to provide or use interfaces.
> >
> > Does that make sense?
> >
> >
> >
> 
> _______________________________________________
> Tinyos-users mailing list
> [email protected]
> http://mail.Millennium.Berkeley.EDU/mailman/listinfo/tinyos-users
>
_______________________________________________
Tinyos-users mailing list
[email protected]
http://mail.Millennium.Berkeley.EDU/mailman/listinfo/tinyos-users

Reply via email to