Beispiel #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);
}
Beispiel #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--;
    }
}
Beispiel #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);
    }
Beispiel #4
0
void handleOneWire(void)
{
    int i;
    int newtemp = 0;
    int air_temp_c = 0;
    unsigned int decimals;

    if (getMs() > ds1820_time + 1000) {
        air_temp_c = read_DS1820();
        newtemp++;
        start_DS1820();
        ds1820_time = getMs();
    }

    if ((newtemp || respondstr) && usbComTxAvailable() >= 64)
    {
        const char *cp;
        uint8 XDATA response[64];
        uint8 responseLength = 0;

        decimals = (air_temp_c & 0xf) * 100;
        responseLength = sprintf(response, "%d.%02d", air_temp_c / 16, decimals / 16);
        response[responseLength++] = ',';
        for (i = 0; i < 8; i++) {
            response[responseLength++] = nibbleToAscii(DS1820_addr[i] >> 4);
            response[responseLength++] = nibbleToAscii(DS1820_addr[i]);
        }
        response[responseLength++] = ',';
        i = sizeof(response) - responseLength - 2;

        if (respondstr) {
            for (cp = respondstr; *respondstr && i--; respondstr++) {
                response[responseLength++] = *cp;
            }
        }
        respondstr = NULL;
        response[responseLength++] = '\r';
        response[responseLength++] = '\n';
        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 sendReportIfNeeded()
{
    static uint32 lastReport;
    uint8 i, bytesToSend;
    uint16 result[6];
    uint16 vddMillivolts;

    // Create reports.
    if (getMs() - lastReport >= param_report_period_ms && reportLength == 0)
    {
        lastReport = getMs();
        reportBytesSent = 0;

        vddMillivolts = adcReadVddMillivolts();
        adcSetMillivoltCalibration(vddMillivolts);

        for(i = 0; i < 6; i++)
        {
            result[i] = adcRead(i);
        }

        if (param_bar_graph)
        {
            printf("\x1B[0;0H");  // VT100 command for "go to 0,0"
            printBar("P0_0", result[0]);
            printBar("P0_1", result[1]);
            printBar("P0_2", result[2]);
            printBar("P0_3", result[3]);
            printBar("P0_4", result[4]);
            printBar("P0_5", result[5]);
            printf("VDD  %4d mV", vddMillivolts);
        }
        else
        {
            printf("A, %4d, %4d, %4d, %4d, %4d, %4d,\r\n",
                    adcConvertToMillivolts(result[0]),
                    adcConvertToMillivolts(result[1]),
                    adcConvertToMillivolts(result[2]),
                    adcConvertToMillivolts(result[3]),
                    adcConvertToMillivolts(result[4]),
                    adcConvertToMillivolts(result[5])
                    );
        }
    }

    // Send the report to USB in chunks.
    if (reportLength > 0)
    {
        bytesToSend = usbComTxAvailable();
        if (bytesToSend > reportLength - reportBytesSent)
        {
            // Send the last part of the report.
            usbComTxSend(report+reportBytesSent, reportLength - reportBytesSent);
            reportLength = 0;
        }
        else
        {
            usbComTxSend(report+reportBytesSent, bytesToSend);
            reportBytesSent += bytesToSend;
        }
    }

}