Hello,

I have a question regarding the programming concept of Tinyos.

Looking into the example RadioCountToLedsC I found that basically a state machine was realized. It is a bit hard to see because the machine is distributed over a number of callback (event handler) functions.

I tried to draw the state machine and came up with the following diagram. Maybe it is not complete but I think it is very clear what the application is doing. I wonder if it isn't it possible to extract the behaviour and put it into an own function i.e. a state handler.

<<inline: machine.png>>





The RadioCountToLedsC looks then similar to the following code:

module RadioCountToLedsC @safe() {
  uses {
   ....
  }

  implementation {

        enum States{
                Idle,
                Booted,
                 AMIdle,
                AMSending
        };
        
        enum Events{
                evBooted,
                evStartDone,
                evTimerFired,
                evSendDone,
                evReceiveOK,
                evNoEvent
                
        };

        void stateHandler(uint8_t evt){
                switch(state){
                
                case Idle:
                        if(evt==evBooted){
                                call AMControl.start();
                                state=Booted;
                        }
                        break;
                
                case Booted:
                        if(evt==evStartDone){
                                call MilliTimer.startPeriodic(250);
                                state=AMIdle;
                        }
                        break;
                        
                        
                        case AMIdle:
                                if(evt==evTimerFired){
                                        sendMessage();
                                        
                                        if(sndRetVal==0){
                                          state=AMSending;
                                        }else{
                                        }
                                }else if(evt==evReceiveOK){
                                        receiveMessage();
                                }
                        break;
                        
                        case AMSending:
                                if(evt==evSendDone){
                                        state=AMIdle;
                                }
                        break;
                }
        }


  event void Boot.booted() {
        stateHandler( evBooted);
  }

  event void AMControl.startDone(error_t err) {
        stateHandler(evStartDone);
  }

  event void AMControl.stopDone(error_t err) {
    // do nothing
  }

  event void MilliTimer.fired() {
        stateHandler(evTimerFired);
  }

event message_t* Receive.receive(message_t* bufPtr, void* payload, uint8_t len) {
    dbg("RadioCountToLedsC", "Received packet of length %hhu.\n", len);
    if (len == sizeof(radio_count_msg_t)) {
        rcm = (radio_count_msg_t*)payload;
        stateHandler(evReceiveOK);
      }
      return bufPtr;
  }

  event void AMSend.sendDone(message_t* bufPtr, error_t error) {
    if (&packet == bufPtr) {
        stateHandler(evSendDone);
        }
    }

}


I want to know if the example above is correct regarding event processing modell
of if I missed something?

Peter


--
Peter Mueller
[email protected]



_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to