void CommPktTxComplete(SerialData * ser) {
	USART_TransmitMode(((CommInterface*)(ser->ref))->port, false); // leave transmit mode
	
	if (((CommInterface*)(ser->ref))->TransmitPacketComplete!=NULL) {
		((CommInterface*)(ser->ref))->TransmitPacketComplete(((CommInterface*)(ser->ref)));
	}
}
Пример #2
0
void USART_TXIntComplete(unsigned char port) {
    if (RingBufferBytesUsed(&USART_Table[port]->tx_buffer)==0) { // TX buffer empty, disable interrupts
        USART_UdeInterrupt_Disable(USART_Table[port]->port);
        USART_TransmitMode(USART_Table[port], false);
    }
    else {
        *(USART_Table[port]->port.DATA) = RingBufferGetByte(&USART_Table[port]->tx_buffer);
    }
}
Пример #3
0
unsigned short USART_Write(USART * serial, unsigned char * buf, unsigned short num_bytes) {
	unsigned short written;
	
	USART_UdeInterrupt_Disable(serial->port);
	
	written = RingBufferAdd(&serial->tx_buffer, buf, num_bytes);
	if (serial->use_rs485) { // assert if necessary
		*(serial->port.GPIO) |= serial->port.txen_pin_bm;
		USART_TransmitMode(serial, true);
		USART_TxdInterrupt_Enable(serial->port);
	}
	USART_UdeInterrupt_Enable(serial->port);
	return written;
}
bool CommSendPacket(CommInterface * inf, CommPacket * pkt) {
	unsigned char length = pkt->length;
	
	if (SerialTransferInProgress(&inf->serData)) {
		return false;
	}
	
	if (length > SERIAL_TRANSMIT_BUFFER_SIZE) // TODO: Dynamically size SerialProtocol.transmit_data so we don't have this mysterious 20 byte max packet size
		length = SERIAL_TRANSMIT_BUFFER_SIZE;
	
	memcpy((void*)inf->serData.transmit_data, (void*)pkt->data, length);
	
	USART_TransmitMode(inf->port, true);
	if (SerialTransmit(&inf->serData, pkt->target, length)==0) {
		return true;
	}
	else {
		sei();
		return false;
	}
}