Exemple #1
0
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);
}
Exemple #2
0
/** 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--;
    }
}
Exemple #3
0
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;
		}
    }
}