/**
 * @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
}
Exemple #2
0
/**
 * @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
}
Exemple #4
0
/**
 * @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
	}
}
Exemple #6
0
/**
 * @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
}