mirror of https://github.com/ARMmbed/mbed-os.git
add readable(), writeable() and settings changed callback to USBSerial
parent
5aad98af4b
commit
d3ca818905
|
@ -52,6 +52,7 @@ bool USBCDC::USBCallback_request(void) {
|
||||||
break;
|
break;
|
||||||
case CDC_SET_LINE_CODING:
|
case CDC_SET_LINE_CODING:
|
||||||
transfer->remaining = 7;
|
transfer->remaining = 7;
|
||||||
|
transfer->notify = true;
|
||||||
success = true;
|
success = true;
|
||||||
terminal_connected = true;
|
terminal_connected = true;
|
||||||
break;
|
break;
|
||||||
|
@ -67,6 +68,31 @@ bool USBCDC::USBCallback_request(void) {
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void USBCDC::USBCallback_requestCompleted(uint8_t *buf, uint32_t length) {
|
||||||
|
// Request of setting line coding has 7 bytes
|
||||||
|
if (length != 7) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONTROL_TRANSFER * transfer = getTransferPtr();
|
||||||
|
|
||||||
|
/* Process class-specific requests */
|
||||||
|
if (transfer->setup.bmRequestType.Type == CLASS_TYPE) {
|
||||||
|
if (transfer->setup.bRequest == CDC_SET_LINE_CODING) {
|
||||||
|
if (memcmp(cdc_line_coding, buf, 7)) {
|
||||||
|
memcpy(cdc_line_coding, buf, 7);
|
||||||
|
|
||||||
|
int baud = buf[0] + (buf[1] << 8)
|
||||||
|
+ (buf[2] << 16) + (buf[3] << 24);
|
||||||
|
int stop = buf[4];
|
||||||
|
int bits = buf[6];
|
||||||
|
int parity = buf[5];
|
||||||
|
|
||||||
|
lineCodingChanged(baud, bits, parity, stop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Called in ISR context
|
// Called in ISR context
|
||||||
// Set configuration. Return false if the
|
// Set configuration. Return false if the
|
||||||
|
|
|
@ -99,9 +99,21 @@ protected:
|
||||||
* @returns true if successful
|
* @returns true if successful
|
||||||
*/
|
*/
|
||||||
bool readEP_NB(uint8_t * buffer, uint32_t * size);
|
bool readEP_NB(uint8_t * buffer, uint32_t * size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called by USBCallback_requestCompleted when CDC line coding is changed
|
||||||
|
* Warning: Called in ISR
|
||||||
|
*
|
||||||
|
* @param baud The baud rate
|
||||||
|
* @param bits The number of bits in a word (5-8)
|
||||||
|
* @param parity The parity
|
||||||
|
* @param stop The number of stop bits (1 or 2)
|
||||||
|
*/
|
||||||
|
virtual void lineCodingChanged(int baud, int bits, int parity, int stop) {};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool USBCallback_request();
|
virtual bool USBCallback_request();
|
||||||
|
virtual void USBCallback_requestCompleted(uint8_t *buf, uint32_t length);
|
||||||
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
virtual bool USBCallback_setConfiguration(uint8_t configuration);
|
||||||
volatile bool terminal_connected;
|
volatile bool terminal_connected;
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,9 @@ public:
|
||||||
* @param product_release Your preoduct_release (default: 0x0001)
|
* @param product_release Your preoduct_release (default: 0x0001)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001): USBCDC(vendor_id, product_id, product_release), buf(128){ };
|
USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001): USBCDC(vendor_id, product_id, product_release), buf(128){
|
||||||
|
settingsChangedCallback = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -79,6 +81,22 @@ public:
|
||||||
* @returns the number of bytes available
|
* @returns the number of bytes available
|
||||||
*/
|
*/
|
||||||
uint8_t available();
|
uint8_t available();
|
||||||
|
|
||||||
|
/** Determine if there is a character available to read
|
||||||
|
*
|
||||||
|
* @returns
|
||||||
|
* 1 if there is a character available to read,
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int readable() { return available() ? 1 : 0; }
|
||||||
|
|
||||||
|
/** Determine if there is space available to write a character
|
||||||
|
*
|
||||||
|
* @returns
|
||||||
|
* 1 if there is space to write a character,
|
||||||
|
* 0 otherwise
|
||||||
|
*/
|
||||||
|
int writeable() { return 1; } // always return 1, for write operation is blocking
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a block of data.
|
* Write a block of data.
|
||||||
|
@ -110,19 +128,33 @@ public:
|
||||||
*
|
*
|
||||||
* @param fptr function pointer
|
* @param fptr function pointer
|
||||||
*/
|
*/
|
||||||
void attach(void (*fn)(void)) {
|
void attach(void (*fptr)(void)) {
|
||||||
if(fn != NULL) {
|
if(fptr != NULL) {
|
||||||
rx.attach(fn);
|
rx.attach(fptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attach a callback to call when serial's settings are changed.
|
||||||
|
*
|
||||||
|
* @param fptr function pointer
|
||||||
|
*/
|
||||||
|
void attach(void (*fptr)(int baud, int bits, int parity, int stop)) {
|
||||||
|
settingsChangedCallback = fptr;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool EP2_OUT_callback();
|
virtual bool EP2_OUT_callback();
|
||||||
|
virtual void lineCodingChanged(int baud, int bits, int parity, int stop){
|
||||||
|
if (settingsChangedCallback) {
|
||||||
|
settingsChangedCallback(baud, bits, parity, stop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FunctionPointer rx;
|
FunctionPointer rx;
|
||||||
CircBuffer<uint8_t> buf;
|
CircBuffer<uint8_t> buf;
|
||||||
|
void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue