embkernel
 All Classes Functions Variables Typedefs Groups Pages
UsbTxStream.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of milkLib.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "UsbTxStream.hpp"
7 #include "UsbDevice.hpp"
8 #include "UsbMacros.hpp"
9 #include "RtosInclude.hpp"
10 
11 UsbTxStream::UsbTxStream(uint8_t ep, size_t size) :
12  mBuffer(size) {
13  mMaxTimeout = Rtos::TICK_INFINITE;
14  mEp = ep;
15  UsbDevice::registerInCallback(ep, this);
16 }
17 
18 UsbTxStream::~UsbTxStream() {
19 }
20 
21 int UsbTxStream::write(const void* buffer, int len, Rtos::TICK timeout) {
22  if (timeout > mMaxTimeout) {
23  timeout = mMaxTimeout;
24  }
25  uint8_t* src = (uint8_t*) buffer;
26  int left = len;
27  RtosTimer timer;
28  timer.set(timeout);
29  do {
30  int written = mBuffer.writeChunk(src, left, 10);
31  UsbDevice::notifyDataInReadyForEp(mEp);
32  src += written;
33  left -= written;
34  if (left <= 0) {
35  break;
36  }
37  } while (left > 0 && !timer.isEllapsed());
38  return (len - left);
39 }
40 
41 void UsbTxStream::onDataInFree(uint8_t ep, uint16_t len) {
42  uint8_t buffer[len];
43  len = mBuffer.read(buffer, len, 0);
44  if (len > 0) {
45  UsbDevice::writeBuffer(ep, buffer, len);
46  }
47 }