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))); } }
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); } }
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; } }