Open FFBoard
Open source force feedback firmware
CDCcomm.cpp
Go to the documentation of this file.
1/*
2 * CDCcomm.cpp
3 *
4 * Created on: 17.11.2021
5 * Author: Yannick
6 *
7 * Contains functions to interface a usb CDC port
8 */
9
10#include "CDCcomm.h"
11#include "tusb.h"
12
13// Flag to trigger another send call
14bool CDCcomm::usb_busy_retry = false;
15std::string CDCcomm::remainingStrs[CFG_TUD_CDC] = {""};
16std::string CDCcomm::tString;
18
20
21}
22
24
25}
26
27
31void CDCcomm::cdcFinished(uint8_t itf){
32 cdcSems[itf].Give();
33 if(CDCcomm::usb_busy_retry && CDCcomm::remainingStrs[itf].length() > 0){
34 cdcSend(&CDCcomm::remainingStrs[itf], itf); // Retry with remaining string
35 }
36 if(CDCcomm::remainingStrs[itf].capacity() > 512){
37 CDCcomm::remainingStrs[itf].shrink_to_fit(); // Prevent permanent increase of size if a long command was buffered
38 }
39}
40
44uint32_t CDCcomm::remainingData(uint8_t itf){
45 return CDCcomm::remainingStrs[itf].size();
46}
47
52 CDCcomm::remainingStrs[itf].clear();
53}
54
55bool CDCcomm::connected(uint8_t itf){
56 return tud_cdc_n_connected(itf);
57}
58
63uint16_t CDCcomm::cdcSend(std::string* reply,uint8_t itf){
64 if(!tud_ready() || reply->empty()){ // TODO check if connected when gui sets DTR
65 return 0;
66 }
67 cdcSems[itf].Take();
68 uint32_t bufferRemaining = tud_cdc_n_write_available(itf);
69 uint32_t cdc_sent = tud_cdc_n_write(itf,reply->c_str(), std::min<uint16_t>(reply->length(),bufferRemaining));
70 if(!usb_busy_retry) // We did not retransmit so flush now. otherwise TUD will flush if we were in the callback before
72
73 // If we can't write the whole reply copy remainder to send later
74 if(cdc_sent < reply->length()){
75 remainingStrs[itf] = reply->substr(cdc_sent);
76 usb_busy_retry = true;
77 remainingStrs[itf].shrink_to_fit();
78 }else{
79 usb_busy_retry = false;
80 remainingStrs[itf].clear();
81 }
82
83 return cdc_sent;
84}
uint32_t tud_cdc_n_write_flush(uint8_t itf)
Definition: cdc_device.c:187
bool tud_cdc_n_connected(uint8_t itf)
Definition: cdc_device.c:127
uint32_t tud_cdc_n_write_available(uint8_t itf)
Definition: cdc_device.c:215
uint32_t tud_cdc_n_write(uint8_t itf, void const *buffer, uint32_t bufsize)
Definition: cdc_device.c:171
virtual ~CDCcomm()
Definition: CDCcomm.cpp:23
static uint16_t cdcSend(std::string *reply, uint8_t itf)
Definition: CDCcomm.cpp:63
CDCcomm()
Definition: CDCcomm.cpp:19
static cpp_freertos::BinarySemaphore cdcSems[CFG_TUD_CDC]
Definition: CDCcomm.h:30
static void clearRemainingBuffer(uint8_t itf=0)
Definition: CDCcomm.cpp:51
static std::string remainingStrs[CFG_TUD_CDC]
Definition: CDCcomm.h:26
static void cdcFinished(uint8_t itf=0)
Definition: CDCcomm.cpp:31
static std::string tString
Definition: CDCcomm.h:27
static bool connected(uint8_t itf=0)
Definition: CDCcomm.cpp:55
static uint32_t remainingData(uint8_t itf=0)
Definition: CDCcomm.cpp:44
static bool usb_busy_retry
Definition: CDCcomm.h:25
bool Take(TickType_t Timeout=portMAX_DELAY)
Definition: csemaphore.cpp:46
static TU_ATTR_ALWAYS_INLINE bool tud_ready(void)
Definition: usbd.h:97