#define OPEN_COIL() HIGH(GPIO_SSC_DOUT)
i = 0;
- byte_t rx[sizeof(UsbCommand)]; // Storage for usb_read call in loop
for(;;) {
//wait until SSC_CLK goes HIGH
while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
- // Craig Young - Adding a usb_read() here to avoid abort on empty UsbCommand
- // My OS X client does this preventing simulation.
- // Performance hit should be non-existent since the read is only performed if usb_poll is true
- if(BUTTON_PRESS() || (usb_poll() && usb_read(rx,sizeof(UsbCommand)))) {
+ if(BUTTON_PRESS() || (usb_poll_validate_length() )) {
DbpString("Stopped");
return;
}
return (pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank);\r
}\r
\r
+/**\r
+ In github PR #129, some users appears to get a false positive from\r
+ usb_poll, which returns true, but the usb_read operation\r
+ still returns 0.\r
+ This check is basically the same as above, but also checks\r
+ that the length available to read is non-zero, thus hopefully fixes the\r
+ bug.\r
+**/\r
+bool usb_poll_validate_length()\r
+{\r
+\r
+ if (!usb_check()) return false;\r
+ if (!(pUdp->UDP_CSR[AT91C_EP_OUT] & btReceiveBank)) return false;\r
+ return (pUdp->UDP_CSR[AT91C_EP_OUT] >> 16) > 0;\r
+}\r
+\r
//*----------------------------------------------------------------------------\r
//* \fn usb_read\r
//* \brief Read available data from Endpoint OUT\r
void usb_enable();\r
bool usb_check();\r
bool usb_poll();\r
+bool usb_poll_validate_length();\r
uint32_t usb_read(byte_t* data, size_t len);\r
uint32_t usb_write(const byte_t* data, const size_t len);\r
\r