embkernel
 All Classes Functions Variables Typedefs Groups Pages
LibRtosTraceUsb.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "LibRtosTraceUsb.hpp"
7 
8 LibRtosTraceUsb::LibRtosTraceUsb(int priority, size_t stackSize, uint8_t outEp, uint8_t inEp) :
9  mTask(priority, "RTOS_TRACE", stackSize, *this), mUsbRxStream(outEp, 128), mUsbTxStream(inEp, 128) {
10 }
11 
12 LibRtosTraceUsb::~LibRtosTraceUsb() {
13 }
14 
15 void LibRtosTraceUsb::run() {
16 #if RTOS_CFG_TRACE_BUFFER_SIZE
17  while (true) {
18  mUsbRxStream.skip(128, Rtos::convertMsToTick(1000));
19  mPktHandler.reset();
20  bool isConnected = false;
21  mTimer.set(Rtos::convertMsToTick(5000));
22  while (true) {
23  LibPktHandler::PKT* pkt;
24  LibPktHandler::RESULT result = mPktHandler.recvPkt(mUsbRxStream, &pkt, 4);
25  if (result == LibPktHandler::RES_SUCCESS) {
26  mTimer.set(Rtos::convertMsToTick(5000));
27  if(!isConnected) {
28  isConnected = true;
29  Rtos::clearTraceBuffer();
30  }
31  switch (pkt->hdr.cmd) {
32  case CMD_GET_TASK_NAME: {
33  RtosTask* task = (RtosTask*) ((uint32_t*) pkt->data)[0];
34  result = mPktHandler.sendPkt(mUsbTxStream, CMD_GET_TASK_NAME, strlen(task->getName()), task->getName(), Rtos::convertMsToTick(5000));
35  break;
36  }
37  case GET_CLOCK_FREQUENCY: {
38  uint32_t frequency = RTOS_CFG_CPU_FREQUENCY;
39  result =mPktHandler.sendPkt(mUsbTxStream, GET_CLOCK_FREQUENCY, 4, &frequency, Rtos::convertMsToTick(5000));
40  break;
41  }
42  case CMD_GET_TASK_STACK: {
43  RtosTask* task = (RtosTask*) ((uint32_t*) pkt->data)[0];
44  uint32_t param[3];
45  param[0] = (uint32_t) task;
46  param[1] = task->getStackSize();
47  param[2] = task->getFreeStackSize();
48  result = mPktHandler.sendPkt(mUsbTxStream, CMD_GET_TASK_STACK, sizeof(param), param, Rtos::convertMsToTick(5000));
49  break;
50  }
51  default:
52  break;
53  }
54  mPktHandler.freePkt(&pkt);
55  if(result != LibPktHandler::RES_SUCCESS ) {
56  break;
57  }
58  }
59  else if(mTimer.isEllapsed() && isConnected) {
60  break;
61  }
62 
63  if(isConnected) {
64  Rtos::TRACE_TAG* tag;
65  int count = Rtos::getTraceBuffer(&tag);
66  if (count > 0) {
67  result = mPktHandler.sendPkt(mUsbTxStream, CMD_SEND_TRACE_TAGS, count * sizeof(Rtos::TRACE_TAG), tag, Rtos::convertMsToTick(5000));
68  if(result != LibPktHandler::RES_SUCCESS ) {
69  break;
70  }
71  Rtos::releaseBuffer(count);
72  }
73  else if (count < 0) { //Buffer full error
74  mPktHandler.sendPkt(mUsbTxStream, CMD_BUFFER_FULL, 0, 0, Rtos::convertMsToTick(5000));
75  break;
76  }
77  }
78  }
79  }
80 #endif
81 }
82