TransmitResult internalSendPacket(const uint8_t *buff, const size_t &length, const uint32_t maxTimeoutUs, bool requestAck) { irq = false; const size_t toSendLength = MIN(length, RFM73_MAX_PACKET_LEN); sendPayload(buff, toSendLength, requestAck ? 1 : 0); TransmitResult result; uint32_t i = 0; uint8_t status = 0; bool readStatus = true; while (!irq && i++ < maxTimeoutUs) { delayMicroseconds(1); if (i >= 10 && i % 5 == 0) { if (checkStatusForMissingIRQ(status)) { readStatus = false; break; } } } if (readStatus) { status = readRegVal(RFM73_REG_STATUS); } if (status & RFM73_IRQ_STATUS_TX_DS) { result.status = Success; result.bytesSent = toSendLength; } else if (status & RFM73_IRQ_STATUS_MAX_RT) { result.status = MaxRT; result.bytesSent = 0; } else if (status & RFM73_IRQ_STATUS_TX_FULL) { result.status = FifoFull; result.bytesSent = 0; } if (i >= maxTimeoutUs) { result.status = Unknown; result.bytesSent = 0; } // Reset error flags writeRegVal(RFM73_CMD_WRITE_REG | RFM73_REG_STATUS, status); return result; }
TransmitResult_t RFM75_Transmit_bytes(const uint8_t *buff, const uint32_t *length, const uint32_t maxTimeoutUs, bool requestAck) { TransmitResult_t result; const uint32_t toSendLength = *length; uint32_t i=0; uint8_t status = 0; bool readStatus = true; sendPayload(buff, toSendLength, (uint8_t)requestAck); rxtx_interrupt = 0; while((rxtx_interrupt == 0) && (i < maxTimeoutUs)){ _delay_us(20); if(checkStatusForMissingIRQ(&status)){ readStatus=false; break; } i++; } rxtx_interrupt = 0; /* Clear the status interrupt */ writeRegVal(RFM7x_CMD_WRITE_REG | RFM7x_REG_STATUS, status); if (readStatus){ status = readRegVal(RFM7x_REG_STATUS); } if (status & RFM7x_IRQ_STATUS_TX_DS){ result.status = SUCCESS; result.bytesSent = toSendLength; } else if (status & RFM7x_IRQ_STATUS_MAX_RT){ result.status = MAXRT; result.bytesSent = 0; } else if (status & RFM7x_IRQ_STATUS_TX_FULL){ result.status = FIFOFULL; result.bytesSent = 0; } if (i >= maxTimeoutUs){ result.status = UNKNOWN; result.bytesSent = 0; } return result; }