// Queue a character for transmission void jshTransmit(IOEventFlags device, unsigned char data) { #ifndef LINUX #ifdef USB if (device==EV_USBSERIAL && !jshIsUSBSERIALConnected()) { jshTransmitClearDevice(EV_USBSERIAL); // clear out stuff already waiting return; } #endif if (device==EV_NONE) return; unsigned char txHeadNext = (txHead+1)&TXBUFFERMASK; if (txHeadNext==txTail) { jsiSetBusy(BUSY_TRANSMIT, true); while (txHeadNext==txTail) { // wait for send to finish as buffer is about to overflow #ifdef USB // just in case USB was unplugged while we were waiting! if (!jshIsUSBSERIALConnected()) jshTransmitClearDevice(EV_USBSERIAL); #endif } jsiSetBusy(BUSY_TRANSMIT, false); } txBuffer[txHead].flags = device; txBuffer[txHead].data = (char)data; txHead = txHeadNext; jshUSARTKick(device); // set up interrupts if required #else // if PC, just put to stdout if (device==DEFAULT_CONSOLE_DEVICE) { fputc(data, stdout); fflush(stdout); } #endif }
/** * Queue a character for transmission. */ void jshTransmit( IOEventFlags device, //!< The device to be used for transmission. unsigned char data //!< The character to transmit. ) { if (device==EV_LOOPBACKA || device==EV_LOOPBACKB) { jshPushIOCharEvent(device==EV_LOOPBACKB ? EV_LOOPBACKA : EV_LOOPBACKB, (char)data); return; } #ifndef LINUX #ifdef USB if (device==EV_USBSERIAL && !jshIsUSBSERIALConnected()) { jshTransmitClearDevice(EV_USBSERIAL); // clear out stuff already waiting return; } #endif #else // if PC, just put to stdout if (device==DEFAULT_CONSOLE_DEVICE) { fputc(data, stdout); fflush(stdout); return; } #endif // If the device is EV_NONE then there is nowhere to send the data. if (device==EV_NONE) return; // The txHead global points to the current item in the txBuffer. Since we are adding a new // character, we increment the head pointer. If it has caught up with the tail, then that means // we have filled the array backing the list. What we do next is to wait for space to free up. unsigned char txHeadNext = (unsigned char)((txHead+1)&TXBUFFERMASK); if (txHeadNext==txTail) { jsiSetBusy(BUSY_TRANSMIT, true); bool wasConsoleLimbo = device==EV_LIMBO && jsiGetConsoleDevice()==EV_LIMBO; while (txHeadNext==txTail) { // wait for send to finish as buffer is about to overflow #ifdef USB // just in case USB was unplugged while we were waiting! if (!jshIsUSBSERIALConnected()) jshTransmitClearDevice(EV_USBSERIAL); #endif } if (wasConsoleLimbo && jsiGetConsoleDevice()!=EV_LIMBO) { /* It was 'Limbo', but now it's not - see jsiOneSecondAfterStartup. Basically we must have printed a bunch of stuff to LIMBO and blocked with our output buffer full. But then jsiOneSecondAfterStartup switches to the right console device and swaps everything we wrote over to that device too. Only we're now here, still writing to the old device when really we should be writing to the new one. */ device = jsiGetConsoleDevice(); } jsiSetBusy(BUSY_TRANSMIT, false); } // Save the device and data for the new character to be transmitted. txBuffer[txHead].flags = device; txBuffer[txHead].data = data; txHead = txHeadNext; jshUSARTKick(device); // set up interrupts if required }