|
|
|
|
|
|
|
|
|
|
|
|
|
|
void USBSerial::tx_data(const Transfer_t *transfer) |
|
|
void USBSerial::tx_data(const Transfer_t *transfer) |
|
|
{ |
|
|
{ |
|
|
if (transfer->buffer == tx1) { |
|
|
|
|
|
|
|
|
uint32_t mask; |
|
|
|
|
|
uint8_t *p = (uint8_t *)transfer->buffer; |
|
|
|
|
|
if (p == tx1) { |
|
|
println("tx1:"); |
|
|
println("tx1:"); |
|
|
txstate &= 0xFE; |
|
|
|
|
|
} else if (transfer->buffer == tx2) { |
|
|
|
|
|
|
|
|
mask = 1; |
|
|
|
|
|
//txstate &= 0xFE; |
|
|
|
|
|
} else if (p == tx2) { |
|
|
println("tx2:"); |
|
|
println("tx2:"); |
|
|
txstate &= 0xFD; |
|
|
|
|
|
|
|
|
mask = 2; |
|
|
|
|
|
//txstate &= 0xFD; |
|
|
|
|
|
} else { |
|
|
|
|
|
return; // should never happen |
|
|
|
|
|
} |
|
|
|
|
|
// check how much more data remains in the transmit buffer |
|
|
|
|
|
uint32_t head = txhead; |
|
|
|
|
|
uint32_t tail = txtail; |
|
|
|
|
|
uint32_t count; |
|
|
|
|
|
if (head >= tail) { |
|
|
|
|
|
count = head - tail; |
|
|
|
|
|
} else { |
|
|
|
|
|
count = txsize + head - tail; |
|
|
|
|
|
} |
|
|
|
|
|
uint32_t packetsize = tx2 - tx1; |
|
|
|
|
|
if (count < packetsize) { |
|
|
|
|
|
// not enough data in buffer to fill a full packet |
|
|
|
|
|
txstate &= ~mask; |
|
|
|
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
// immediately transmit another full packet, if we have enough data |
|
|
|
|
|
println("TX:moar data!!!!"); |
|
|
|
|
|
if (++tail >= txsize) tail = 0; |
|
|
|
|
|
uint32_t n = txsize - tail; |
|
|
|
|
|
if (n > packetsize) n = packetsize; |
|
|
|
|
|
memcpy(p, txbuf + tail, n); |
|
|
|
|
|
if (n >= packetsize) { |
|
|
|
|
|
tail += n - 1; |
|
|
|
|
|
if (tail >= txsize) tail = 0; |
|
|
|
|
|
} else { |
|
|
|
|
|
uint32_t len = packetsize - n; |
|
|
|
|
|
memcpy(p + n, txbuf, len); |
|
|
|
|
|
tail = len - 1; |
|
|
|
|
|
} |
|
|
|
|
|
txtail = tail; |
|
|
|
|
|
queue_Data_Transfer(txpipe, p, packetsize, this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|