/** * @brief Raw Frame Transmit * * Transmits a frame * Warning: no frame header or FCS is added * * @param frm array containing frame data * @param len length of the frame */ void zr_txFrame(uint8_t* frm, uint8_t len) { #ifdef ZRC_TXWAIT_BEFORE zr_waitTxDone(0xFFFF); #endif zr_txIsBusy = 1; radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); radio_send_frame(len, frm, 0); #ifdef ZRC_TXWAIT_AFTER zr_waitTxDone(0xFFFF); radio_set_state(STATE_RX); zr_txIsBusy = 0; #endif }
/** * @brief TX a Byte * * If "beginTrasmission" was used, then it writes into the transmit buffer for non-immediate mode * If "beginTrasmission" was not used, then it transmits the single byte immediately (slower for multiple bytes) * * @param c character to be sent */ void cMxRadio::write(uint8_t c) { if (usedBeginTransmission) { if (txTmpBufferLength < ZR_TXTMPBUFF_SIZE - 2) { txTmpBuffer[txTmpBufferLength] = c; txTmpBufferLength++; if (txTmpBufferLength >= ZR_TXTMPBUFF_SIZE - 2) { // buffer is now full // just send it all out so we have more room endTransmission(); beginTransmission(); } } } else { txTmpBuffer[HeadSize] = c; // set payload txTmpBuffer[HeadSize+1] = 0; // empty FCS txTmpBuffer[HeadSize+2] = 0; // empty FCS #ifdef ZR_TXWAIT_BEFORE waitTxDone(0xFFFF); #endif txIsBusy = 1; if (setautotx) radio_set_state(STATE_TXAUTO); else radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); radio_send_frame(10, txTmpBuffer, 0); #ifdef ZR_TXWAIT_AFTER waitTxDone(0xFFFF); if (setautorx) radio_set_state(STATE_RXAUTO); else radio_set_state(STATE_RX); txIsBusy = 0; #endif } }
/** * @brief Finalize Trasmission * * Finalize the payload and transmits it when ready * */ void zr_endTransmission() { zr_usedBeginTransmission = 0; // empty FCS field zr_txTmpBufferLength += 2; #ifdef ZRC_TXWAIT_BEFORE zr_waitTxDone(0xFFFF); #endif zr_txIsBusy = 1; radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); radio_send_frame(zr_txTmpBufferLength, zr_txTmpBuffer, 0); #ifdef ZRC_TXWAIT_AFTER zr_waitTxDone(0xFFFF); radio_set_state(STATE_RX); zr_txIsBusy = 0; #endif }
/** * @brief Raw Frame Transmit * * Transmits a frame * Warning: no frame header or FCS is added * * @param frm array containing frame data * @param len length of the frame */ void cMxRadio::txFrame(uint8_t* frm, uint8_t len) { #ifdef ZR_TXWAIT_BEFORE waitTxDone(0xFFFF); #endif txIsBusy = 1; if (setautotx) radio_set_state(STATE_TXAUTO); else radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); radio_send_frame(len, frm, 0); #ifdef ZR_TXWAIT_AFTER waitTxDone(0xFFFF); if (setautorx) radio_set_state(STATE_RXAUTO); else radio_set_state(STATE_RX); txIsBusy = 0; #endif }
/** * @brief TX a Byte * * If "beginTrasmission" was used, then it writes into the transmit buffer for non-immediate mode * If "beginTrasmission" was not used, then it transmits the single byte immediately (slower for multiple bytes) * * @param c character to be sent */ void zr_write(uint8_t c) { if (zr_usedBeginTransmission) { if (zr_txTmpBufferLength < ZRC_TXTMPBUFF_SIZE - 2) { zr_txTmpBuffer[zr_txTmpBufferLength] = c; zr_txTmpBufferLength++; if (zr_txTmpBufferLength >= ZRC_TXTMPBUFF_SIZE - 2) { // buffer is now full // just send it all out so we have more room zr_endTransmission(); zr_beginTransmission(); } } } else { zr_txTmpBuffer[7] = c; // set payload zr_txTmpBuffer[8] = 0; // empty FCS zr_txTmpBuffer[9] = 0; // empty FCS #ifdef ZRC_TXWAIT_BEFORE zr_waitTxDone(0xFFFF); #endif zr_txIsBusy = 1; radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); radio_send_frame(10, zr_txTmpBuffer, 0); #ifdef ZRC_TXWAIT_AFTER zr_waitTxDone(0xFFFF); radio_set_state(STATE_RX); zr_txIsBusy = 0; #endif } }
/** * @brief Finalize Trasmission * * Finalize the payload and transmits it when ready * */ void cMxRadio::endTransmission() { usedBeginTransmission = 0; // empty FCS field txTmpBufferLength += 2; #ifdef ZR_TXWAIT_BEFORE waitTxDone(0xFFFF); #endif txIsBusy = 1; if (setautotx) radio_set_state(STATE_TXAUTO); else radio_set_state(STATE_TX); ZR_RFTX_LED_ON(); //if broadcase ,cant need ack if(txTmpBuffer[5]==0xff && txTmpBuffer[5]==0xff) txTmpBuffer[0]=txTmpBuffer[0]&0xdf; else { if(!needack) txTmpBuffer[0] = 0x41; else txTmpBuffer[0] = 0x61; //ack required } radio_send_frame(txTmpBufferLength, txTmpBuffer, 0); #ifdef ZR_TXWAIT_AFTER waitTxDone(0xFFFF); if (setautorx) radio_set_state(STATE_RXAUTO); else radio_set_state(STATE_RX); txIsBusy = 0; #endif }