이제 수신쪽을 만들도록 하겠습니다. 과정은 송신과 비슷 합니다. 적절한 인터페이스를 찾고 선언하고 적절히 command를 부르고 event를 구현해주고, 구성파일에 컴포넌트 선언,와이어링 해주면 끝입니다.

수신 받는쪽은 패킷의 Counter를 추출하여 자기의 LED를 변화 시킬 것입니다.

먼저 timer 이벤트안의 Leds.set을 삭제 합니다.

1. 무선 수신 기능을 제공 하는 인터페이스를 찾습니다.
Recive 인터페이스를 사용 할 것입니다. Packet을 조작 할 수 있는 기능도 같이 제공 합니다.

2. uses 인터페이스에 선언 해줍니다.
 uses interface Receive;

3. 변수와 초기화 코드를 적어 줍니다.
벌써 무선모듈등을  초기 화 했기때문에 필요 없습니다.

4. 제공 인터페이스의 기능을 사용하여 코드를 작성합니다.
Receive의 경우 부를 기능은 없습니다. 단지 이벤트만 작성 합니다.

5. 이벤트를 구현합니다.

event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len) {
  if (len == sizeof(BlinkToRadioMsg)) {
    BlinkToRadioMsg* btrpkt = (BlinkToRadioMsg*)payload;
    call Leds.set(btrpkt->counter);
  }
  return msg;
}

Recevie 이벤트를 구현합니다. 간단히 받은 메세지에서 길이를 점검하여 BlinkToRadioMsg와 일치 하면 msg에서 counter를 추출 하여 counter를 LED로 표현 합니다.단 return msg를 조심하시길 바랍니다. 꼭 돌려 줘야 합니다. msg는 이 이벤트를 발생시킨 모듈이 주인입니다.

좀더 정확한 동작을 원한다면 Receive 이벤트는 Task로 구현하세요( 수신버퍼에 복사하시면 되겟죠?)
그리고 태스크는 한개씩만 동작 하기때문에 변수 접근이 Task로만 이루어지면 크리티컬 세션이 필요 없습니다.

6. 구성파일에 수신 모듈을 추가 합니다.

components new AMReceiverC(AM_BLINKTORADIO);

앞에와 같이 AMReceiverC의 객체를 생성 합니다. AM_BLINKTORADIO는 AM type으로 송신과 같아야 합니다.

7. 와이어링 합니다.
  App.Receive -> AMReceiverC;

8. 프로그램을 테스트 합니다.
두개를 퓨징하여 LED를 보면 하나를끄면 멈추게 될것 입니다.

예제의 경우 apps/tutorials/BlinkToRadio에 소스가 있습니다. 참고 하세요.





, .