static void
ieee_serial_mcps(MAC_McpsDcfmInd_s *ev)
/* this funtion gets called on a MLME event from the main handler in
 * ieee802.c. Primarily after scan requests. */
{
    uint8_t i;

    if(!ieee_serial_open)
        return;

    switch(ev->u8Type)
    {
    case MAC_MCPS_IND_DATA:   /* new packet rx'd */
        uart0_writeb('z');
        uart0_writeb('b');
        uart0_writeb(0x86);
        uart0_writeb(asdataframe(ev).u8LinkQuality);
        uart0_writeb(asdataframe(ev).u8SduLength);

        /* data frame without fcs */
        for (i=0; i<asdataframe(ev).u8SduLength; i++)
            uart0_writeb(asdataframe(ev).au8Sdu[i]);
        break;
    case MAC_MCPS_DCFM_DATA:  /* deferred confirm of transmission */
        uart0_writeb('z');
        uart0_writeb('b');
        uart0_writeb(0x89);
        if (asdataind(ev).u8Status==MAC_ENUM_SUCCESS)
            uart0_writeb(SUCCESS);
        else
            uart0_writeb(ERR);
    case MAC_MCPS_DCFM_PURGE: /* deferred confirm of purge request */
    default:
        break;

    }
}
Exemple #2
0
static void
ieee_mcpspt(MAC_McpsDcfmInd_s *ev)
  /* packet input and output thread */
{
  rimeaddr_t rime;
  switch(ev->u8Type)
  {
    case MAC_MCPS_IND_DATA:
      GDB2_PUTS(",");
      /* new frame received */
      packetbuf_clear();
      packetbuf_copyfrom(asdataframe(ev).au8Sdu,
          asdataframe(ev).u8SduLength);
      packetbuf_set_datalen(asdataframe(ev).u8SduLength);
      packetbuf_set_addr(PACKETBUF_ADDR_SENDER,
          asrimeaddr(&asdataframe(ev).sSrcAddr.uAddr.sExt, &rime));

      if(asdataframe(ev).sDstAddr.u8AddrMode==LONG) {
        /* addressed frame */
        packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER,
            asrimeaddr(&asdataframe(ev).sDstAddr.uAddr.sExt, &rime));
      } else if(asdataframe(ev).sDstAddr.u8AddrMode==SHORT &&
         asdataframe(ev).sDstAddr.u16PanId==BROADCAST_PANID &&
         asdataframe(ev).sDstAddr.uAddr.u16Short==BROADCAST_ADDR) {
        /* broadcast frame */
        packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &rimeaddr_null);
      }

      /* update lqi stuff and call lqi callback */
      packetbuf_set_attr(PACKETBUF_ATTR_RSSI, asdataframe(ev).u8LinkQuality);

      if (asdataframe(ev).sSrcAddr.u8AddrMode == LONG && lqicb)
        lqicb(asrimeaddr(&asdataframe(ev).sSrcAddr.uAddr.sExt, &rime),
              asdataframe(ev).u8LinkQuality);
      else if (lqicb)
        lqicb(NULL, asdataframe(ev).u8LinkQuality);

#if USE_TS
      current_timestamp = asdataframe(ev).timestamp;
#endif

      //{
      //  static char buf[512];
      //  uint8_t i;
      //  uint16_t j;
      //  printf("delay:%d len:%d data:", (int32_t) (clock_hrtime()-asdataframe(ev).timestamp), asdataframe(ev).u8SduLength);
      //  for (i=0,j=0; i<asdataframe(ev).u8SduLength; i++)
      //    j+=snprintf(buf+j,sizeof(buf)-j,"0x%x ",asdataframe(ev).au8Sdu[i]);
      //  buf[j]='\n';

      //  puts(buf);
      //}

      /* call upper layer */
      NETSTACK_NETWORK.input();
      break;
    case MAC_MCPS_DCFM_DATA:
      mac_call_sent_callback(mac_cb, mac_cb_ptr, tx_status(&asdataind(ev)), 1);
      break;
    case MAC_MCPS_DCFM_PURGE:
    default:
      HAL_BREAKPOINT();
      break;
  }
}