I changed one line of code in the file with path name: USBDeviceHT/targets/TARGET_Maxim
Fork of USBDeviceHT by
USBSerialBuffered/USBSerialBuffered.h@3:bddd92cd3a17, 2018-02-22 (annotated)
- Committer:
- Helmut Tschemernjak
- Date:
- Thu Feb 22 12:18:45 2018 +0100
- Revision:
- 3:bddd92cd3a17
- Child:
- 5:fb690c44c0b1
Added a buffered USB serial which allows to print on interrupts
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Helmut Tschemernjak | 3:bddd92cd3a17 | 1 | /* |
Helmut Tschemernjak | 3:bddd92cd3a17 | 2 | * $Id: bulkserial.h,v 1.3 2018/02/23 15:04:29 grimrath Exp $ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 3 | * This is an unpublished work copyright (c) 2018 HELIOS Software GmbH |
Helmut Tschemernjak | 3:bddd92cd3a17 | 4 | * 30827 Garbsen, Germany |
Helmut Tschemernjak | 3:bddd92cd3a17 | 5 | */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 6 | #ifndef __USBSERIALBUFFERED_H__ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 7 | #define __USBSERIALBUFFERED_H__ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 8 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 9 | #include "USBSerial.h" |
Helmut Tschemernjak | 3:bddd92cd3a17 | 10 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 11 | /** This class is a wrapper around @ref USBSerial such that sending |
Helmut Tschemernjak | 3:bddd92cd3a17 | 12 | * of serial data over USB is supported in (and outside) of interrupt context. |
Helmut Tschemernjak | 3:bddd92cd3a17 | 13 | * In addition it buffers characters (similiar to the I/O buffering of stdio) |
Helmut Tschemernjak | 3:bddd92cd3a17 | 14 | * before starting a USB data transmit. Silently discards data if the |
Helmut Tschemernjak | 3:bddd92cd3a17 | 15 | * @ref USBSerial object is not connected to the USB host. |
Helmut Tschemernjak | 3:bddd92cd3a17 | 16 | */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 17 | class USBSerialBuffered : public USBSerial { |
Helmut Tschemernjak | 3:bddd92cd3a17 | 18 | public: |
Helmut Tschemernjak | 3:bddd92cd3a17 | 19 | USBSerialBuffered(int MaxBuffSize = 128, uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 20 | ~USBSerialBuffered(); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 21 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 22 | /** sends internally queued but not yet sent data. Is blocking. Must not |
Helmut Tschemernjak | 3:bddd92cd3a17 | 23 | * be called from interrupt context. */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 24 | void flush(); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 25 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 26 | /** Writes a formatted string into an internal buffer for later sending. |
Helmut Tschemernjak | 3:bddd92cd3a17 | 27 | * with e.g. @ref flush . Explicitly designed to be called from interrupt |
Helmut Tschemernjak | 3:bddd92cd3a17 | 28 | * context. If the string does not fit into the internal buffer it is |
Helmut Tschemernjak | 3:bddd92cd3a17 | 29 | * silently truncated. */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 30 | int printf_irqsafe(const char *fmt, ...) __attribute__((format(printf,2,3))); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 31 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 32 | /** the varargs variant of printf_ */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 33 | int vprintf_irqsafe(const char *fmt, std::va_list ap); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 34 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 35 | protected: |
Helmut Tschemernjak | 3:bddd92cd3a17 | 36 | /** Called from @ref Stream::printf and other stdio-like methods from the base class @ref Stream . */ |
Helmut Tschemernjak | 3:bddd92cd3a17 | 37 | virtual int _putc(int c); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 38 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 39 | private: |
Helmut Tschemernjak | 3:bddd92cd3a17 | 40 | enum { |
Helmut Tschemernjak | 3:bddd92cd3a17 | 41 | CorkBuffSize = MAX_PACKET_SIZE_EPBULK, |
Helmut Tschemernjak | 3:bddd92cd3a17 | 42 | }; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 43 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 44 | static inline bool RunningInInterrupt() { |
Helmut Tschemernjak | 3:bddd92cd3a17 | 45 | return SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 46 | } |
Helmut Tschemernjak | 3:bddd92cd3a17 | 47 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 48 | int irqbuff_acquire(); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 49 | void irqbuff_release(int buffused); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 50 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 51 | void putc_normal(int c); |
Helmut Tschemernjak | 3:bddd92cd3a17 | 52 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 53 | private: |
Helmut Tschemernjak | 3:bddd92cd3a17 | 54 | int mFullBuffSize; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 55 | char *m_buff; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 56 | int m_irq_buffused; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 57 | }; |
Helmut Tschemernjak | 3:bddd92cd3a17 | 58 | |
Helmut Tschemernjak | 3:bddd92cd3a17 | 59 | #endif // __USBSERIALBUFFERED_H__ |