void printErrorCb(TxStatusResponse& r, uintptr_t data) { Print *p = (Print*)data; if (!r.isSuccess()) { p->print(F("Error sending packet. Delivery status: ")); p->println(r.getStatus()); } }
void printResponseCb(TxStatusResponse& status, uintptr_t data) { Print *p = (Print*)data; p->println(F("TxStatusResponse received:")); printField(p, F(" FrameId: 0x"), status.getFrameId()); printField(p, F(" Status: 0x"), status.getStatus()); }
MACTransmissionStatus XBeeMACLayer::send(const uip_lladdr_t* lladdr_dest, uint8_t* data, uint16_t length, int *number_transmissions){ unsigned long send_start_time; unsigned int sending_time; uint8_t status; // Broadcast is expressed as an all-zeroes address (rimeaddr_null), we check to see if lladdr_dest is a broadcast address comparing it to rimeaddr_null. bool isNotBroadcast = !rimeaddr_cmp((rimeaddr_t*)lladdr_dest, &rimeaddr_null, UIP_LLADDR_LEN); // lladdr_dest != NULL if (isNotBroadcast){ // lladdr_dest is NOT a broadcast address if (UIP_LLADDR_LEN == UIP_802154_LONGADDR_LEN){ ((char*)(&dest))[3] = lladdr_dest->addr[0]; ((char*)(&dest))[2] = lladdr_dest->addr[1]; ((char*)(&dest))[1] = lladdr_dest->addr[2]; ((char*)(&dest))[0] = lladdr_dest->addr[3]; destAddr64.setMsb(dest); ((char*)(&dest))[3] = lladdr_dest->addr[4]; ((char*)(&dest))[2] = lladdr_dest->addr[5]; ((char*)(&dest))[1] = lladdr_dest->addr[6]; ((char*)(&dest))[0] = lladdr_dest->addr[7]; destAddr64.setLsb(dest); Tx64Request longReq(destAddr64, data, length); xbeeRequest = &longReq; }else{ ((char*)(&dest))[1] = lladdr_dest->addr[0]; ((char*)(&dest))[0] = lladdr_dest->addr[1]; Tx16Request shortReq(dest16, data, length); xbeeRequest = &shortReq; } }else{// lladdr_dest is a broadcast address, we send to broadcast Tx16Request shortReq(0xFFFF, data, length); xbeeRequest = &shortReq; } send_start_time = millis(); xbee.send(*xbeeRequest); // after sending a tx request, we expect a status response // wait up to 5 seconds for the status response for(int i=0; i<AT_RESPONSE_MAX_ATTEMPTS; ++i){ if (xbee.readPacket(5000)) { // got a response! // should be a znet tx status if (xbee.getResponse().getApiId() == TX_STATUS_RESPONSE) { xbee.getResponse().getTxStatusResponse(txStatus); // get the delivery status, the fifth byte switch (txStatus.getStatus()) { case XBEE_SEND_OK: *number_transmissions = getNumberOfTransmissions(); ++number_transmissions;//we have always one (the first one), plus the number of times that we had cca failure (collision) return MAC_TX_STATUS_OK; case XBEE_SEND_NO_ACK: return MAC_TX_STATUS_NO_ACK; case XBEE_SEND_COLLISION: *number_transmissions = getNumberOfTransmissions(); ++number_transmissions;//we have always one (the first one), plus the number of times that we had cca failure (collision) return MAC_TX_STATUS_COLLISION; case XBEE_SEND_PURGED: default: return MAC_TX_STATUS_ERR; } } } } return MAC_TX_STATUS_ERR; }