summaryrefslogtreecommitdiff
path: root/protocol/usb_hid/USB_Host_Shield_2.0/examples/cdc_XR21B1411/XR_terminal/XR_terminal.ino
blob: 0173a08b509cf00dd1353a4df8b1bd4adb6a1acf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <cdc_XR21B1411.h>

// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class ACMAsyncOper : public CDCAsyncOper
{
public:
    uint8_t OnInit(ACM *pacm);
};

uint8_t ACMAsyncOper::OnInit(ACM *pacm)
{
    uint8_t rcode;
    // Set DTR = 1 RTS=1
    rcode = pacm->SetControlLineState(3);

    if (rcode)
    {
        ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
        return rcode;
    }

    LINE_CODING	lc;
    lc.dwDTERate	= 115200;
    lc.bCharFormat	= 0;
    lc.bParityType	= 0;
    lc.bDataBits	= 8;

    rcode = pacm->SetLineCoding(&lc);

    if (rcode)
        ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);

    return rcode;
}

USB     Usb;
ACMAsyncOper  AsyncOper;
XR21B1411     Acm(&Usb, &AsyncOper);

void setup() {
        Serial.begin( 115200 );
#if !defined(__MIPSEL__)
        while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
        Serial.println("\r\n\r\nStart");

        if (Usb.Init() == -1) Serial.println("OSCOKIRQ failed to assert");
}

void loop() {
        Usb.Task();
        if( Acm.isReady()) {
                uint8_t rcode;
                uint8_t  buf[1];
                uint16_t rcvd = 1;

                /* read keyboard */
                if(Serial.available()) {
                         uint8_t data = Serial.read();
                         /* send */
                         rcode = Acm.SndData(1, &data);
                         if (rcode)
                                 ErrorMessage<uint8_t>(PSTR("SndData"), rcode);
                 }
                
                /* read XR serial */
                rcode = Acm.RcvData(&rcvd, buf);
                if (rcode && rcode != hrNAK)
                        ErrorMessage<uint8_t>(PSTR("Ret"), rcode);

                if( rcvd ) { //more than zero bytes received
                        for(uint16_t i=0; i < rcvd; i++ ) {
                                Serial.print((char)buf[i]);
                        }
                }
        }
}