void usbToUartService() { uint8 signals; // Data while(usbComRxAvailable() && uart1TxAvailable()) { uart1TxSendByte(usbComRxReceiveByte()); } while(uart1RxAvailable() && usbComTxAvailable()) { usbComTxSendByte(uart1RxReceiveByte()); } // Control lines controlled by computer. P1_0 = !(usbComRxControlSignals() & ACM_CONTROL_LINE_DTR); P1_1 = !(usbComRxControlSignals() & ACM_CONTROL_LINE_RTS); P1DIR |= (1<<0) | (1<<1); // Control lines controlled by device. signals = 0; if (!P1_2){ signals |= ACM_SERIAL_STATE_TX_CARRIER; } // TX Carrier = DSR if (!P1_3){ signals |= ACM_SERIAL_STATE_RX_CARRIER; } // RX Carrier = CD usbComTxControlSignals(signals); }
/** Checks for new bytes available on the USB virtual COM port * and processes all that are available. */ void processBytesFromUsb() { uint8 bytesLeft = usbComRxAvailable(); while(bytesLeft && usbComTxAvailable() >= sizeof(response)) { processByte(usbComRxReceiveByte()); bytesLeft--; } }
void receiveCommands() { if (usbComRxAvailable() && usbComTxAvailable() >= 64) { uint8 XDATA response[64]; uint8 responseLength; uint8 byte, rand; byte = usbComRxReceiveByte(); // By default, echo back the byte that was send. response[0] = byte; responseLength = 1; // By default, stop blinking the yellow LED because it will // affect the sequence of random numbers reported to the COM port. blinkYellow = 0; switch(byte) { case 'Y': blinkYellow = 1; break; case 's': randomSeedFromSerialNumber(); break; case 'a': randomSeedFromAdc(); break; case '0': randomSeed(0,0); break; case '1': randomSeed(0xFF, 0xFF); break; case '8': randomSeed(0x80, 0x03); break; case 'r': rand = randomNumber(); // Wait for the NEXT random number to finish so we can read RNDH and RNDL. while(ADCCON1 & 0x0C); response[responseLength++] = ','; response[responseLength++] = nibbleToAscii(rand >> 4); response[responseLength++] = nibbleToAscii(rand); response[responseLength++] = ','; response[responseLength++] = (rand & 0x80) ? '1' : '0'; response[responseLength++] = (rand & 0x40) ? '1' : '0'; response[responseLength++] = (rand & 0x20) ? '1' : '0'; response[responseLength++] = (rand & 0x10) ? '1' : '0'; response[responseLength++] = (rand & 0x08) ? '1' : '0'; response[responseLength++] = (rand & 0x04) ? '1' : '0'; response[responseLength++] = (rand & 0x02) ? '1' : '0'; response[responseLength++] = (rand & 0x01) ? '1' : '0'; response[responseLength++] = ','; response[responseLength++] = nibbleToAscii(RNDH >> 4); response[responseLength++] = nibbleToAscii(RNDH); response[responseLength++] = nibbleToAscii(RNDL >> 4); response[responseLength++] = nibbleToAscii(RNDL); response[responseLength++] = '\r'; response[responseLength++] = '\n'; break; default: response[0] = '?'; break; } usbComTxSend(response, responseLength); }
void usbToUartService() { uint8 signals; // Data while(usbComRxAvailable() && !spi0MasterBusy()) { spi0MasterSendByte(usbComRxReceiveByte()); } while(!spi0MasterBusy() && usbComTxAvailable()) { usbComTxSendByte(spi0MasterReceiveByte()); } ioTxSignals(usbComRxControlSignals()); // Need to switch bits 0 and 1 so that DTR pairs up with DSR. signals = ioRxSignals(); usbComTxControlSignals( ((signals & 1) ? 2 : 0) | ((signals & 2) ? 1 : 0)); // TODO: report framing, parity, and overrun errors to the USB host here }
void usbToRadioService() { uint8 signals; // Data while(usbComRxAvailable() && radioComTxAvailable()) { radioComTxSendByte(usbComRxReceiveByte()); } while(radioComRxAvailable() && usbComTxAvailable()) { usbComTxSendByte(radioComRxReceiveByte()); } // Control Signals radioComTxControlSignals(usbComRxControlSignals() & 3); // Need to switch bits 0 and 1 so that DTR pairs up with DSR. signals = radioComRxControlSignals(); usbComTxControlSignals( ((signals & 1) ? 2 : 0) | ((signals & 2) ? 1 : 0)); }
void main() { int8 SPI_SEND = 0; int8 prev_send = 0; systemInit(); setDigitalOutput(param_arduino_DTR_pin, LOW); ioTxSignals(0); usbInit(); spi0MasterInit(); spi0MasterSetFrequency(38400); // uart1Init(); // uart1SetBaudRate(param_baud_rate); if (param_serial_mode != SERIAL_MODE_USB_SPI) { radioComRxEnforceOrdering = 1; radioComInit(); } // Set up P1_5 to be the radio's TX debug signal. //P1DIR |= (1<<5); //IOCFG0 = 0b011011; // P1_5 = PA_PD (TX mode) while(1) { updateSerialMode(); boardService(); updateLeds(); //errorService(); if(!spi0MasterBusy() && SPI_SEND != prev_send){ spi0MasterSendByte(SPI_SEND); prev_send = SPI_SEND; } if (param_serial_mode != SERIAL_MODE_USB_SPI) { radioComTxService(); } usbComService(); // switch(currentSerialMode) // { // case SERIAL_MODE_USB_RADIO: usbToRadioService(); break; // case SERIAL_MODE_SPI_RADIO: uartToRadioService(); break; // case SERIAL_MODE_USB_SPI: usbToUartService(); break; // } switch(usbComRxReceiveByte()){ case 0: // STOP SPI_SEND += 15; SPI_SEND = (SPI_SEND%255); break; case 1: // Initialize SPI_SEND -= 15; SPI_SEND = (SPI_SEND%255); break; } } }