Takehisa Oneta
/
USB_Serial_Repeater
UART repeater for FRDM-KL25
UART repeater for FRDM-KL25
main.cpp@0:26f0a25e8be6, 2015-06-22 (annotated)
- Committer:
- ohneta
- Date:
- Mon Jun 22 02:57:55 2015 +0000
- Revision:
- 0:26f0a25e8be6
1st commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ohneta | 0:26f0a25e8be6 | 1 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 2 | /** |
ohneta | 0:26f0a25e8be6 | 3 | * FRDM-KL25Z用 |
ohneta | 0:26f0a25e8be6 | 4 | * UART -> USB Serial変換 |
ohneta | 0:26f0a25e8be6 | 5 | * |
ohneta | 0:26f0a25e8be6 | 6 | * UART : UART1 |
ohneta | 0:26f0a25e8be6 | 7 | * |
ohneta | 0:26f0a25e8be6 | 8 | * モード認識ポート : D0、D1、D2、D3 |
ohneta | 0:26f0a25e8be6 | 9 | * GND接続でON |
ohneta | 0:26f0a25e8be6 | 10 | * |
ohneta | 0:26f0a25e8be6 | 11 | * UART入力モード |
ohneta | 0:26f0a25e8be6 | 12 | * D0=OFF, D1=OFF : スルー |
ohneta | 0:26f0a25e8be6 | 13 | * D0=ON, D1=OFF : CR(0x0D, \r)を改行と認識する |
ohneta | 0:26f0a25e8be6 | 14 | * D0=OFF, D1=ON : LF(0x0A, \n)を改行と認識する |
ohneta | 0:26f0a25e8be6 | 15 | * D0=ON, D1=ON : CRとLFの両方とも改行と認識する |
ohneta | 0:26f0a25e8be6 | 16 | * |
ohneta | 0:26f0a25e8be6 | 17 | * USB Serial出力モード |
ohneta | 0:26f0a25e8be6 | 18 | * D2=OFF, D3=OFF : スルー |
ohneta | 0:26f0a25e8be6 | 19 | * D2=ON, D3=OFF : 改行ををCR(0x0D, \r)として出力する |
ohneta | 0:26f0a25e8be6 | 20 | * D2=OFF, D3=ON : 改行ををLF(0x0A, \n)として出力する |
ohneta | 0:26f0a25e8be6 | 21 | * D2=ON, D3=ON : 改行ををCR+LF(0x0D+0x0A, \r\n)として出力する |
ohneta | 0:26f0a25e8be6 | 22 | * |
ohneta | 0:26f0a25e8be6 | 23 | * 備考 |
ohneta | 0:26f0a25e8be6 | 24 | * USB Serialからの入力はスルー |
ohneta | 0:26f0a25e8be6 | 25 | * モード認識ポートの利用の利便性を考えてそれぞれのポートの隣のポートを意図的にGNDにしてある。 |
ohneta | 0:26f0a25e8be6 | 26 | */ |
ohneta | 0:26f0a25e8be6 | 27 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 28 | |
ohneta | 0:26f0a25e8be6 | 29 | #include "mbed.h" |
ohneta | 0:26f0a25e8be6 | 30 | #include "USBSerial.h" |
ohneta | 0:26f0a25e8be6 | 31 | |
ohneta | 0:26f0a25e8be6 | 32 | enum newline_mode { |
ohneta | 0:26f0a25e8be6 | 33 | nlmode_none = 0x00, // 処理しない |
ohneta | 0:26f0a25e8be6 | 34 | nlmode_cr = 0x01, // CRを出力 |
ohneta | 0:26f0a25e8be6 | 35 | nlmode_lf = 0x02, // LFを出力 |
ohneta | 0:26f0a25e8be6 | 36 | nlmode_crlf = 0x03, // CR+LFを出力 |
ohneta | 0:26f0a25e8be6 | 37 | }; |
ohneta | 0:26f0a25e8be6 | 38 | |
ohneta | 0:26f0a25e8be6 | 39 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 40 | DigitalOut myled1(LED1); |
ohneta | 0:26f0a25e8be6 | 41 | DigitalOut myled2(LED2); |
ohneta | 0:26f0a25e8be6 | 42 | DigitalOut myled3(LED3); |
ohneta | 0:26f0a25e8be6 | 43 | |
ohneta | 0:26f0a25e8be6 | 44 | DigitalOut nlInModeGnd0(PTC7); |
ohneta | 0:26f0a25e8be6 | 45 | DigitalOut nlInModeGnd1(PTC0); |
ohneta | 0:26f0a25e8be6 | 46 | DigitalOut nlOutModeGnd0(PTC3); |
ohneta | 0:26f0a25e8be6 | 47 | DigitalOut nlOutModeGnd1(PTC4); |
ohneta | 0:26f0a25e8be6 | 48 | |
ohneta | 0:26f0a25e8be6 | 49 | DigitalIn nlInModePin0(D0); |
ohneta | 0:26f0a25e8be6 | 50 | DigitalIn nlInModePin1(D1); |
ohneta | 0:26f0a25e8be6 | 51 | DigitalIn nlOutModePin0(D2); |
ohneta | 0:26f0a25e8be6 | 52 | DigitalIn nlOutModePin1(D3); |
ohneta | 0:26f0a25e8be6 | 53 | |
ohneta | 0:26f0a25e8be6 | 54 | |
ohneta | 0:26f0a25e8be6 | 55 | int inMode = nlmode_none; |
ohneta | 0:26f0a25e8be6 | 56 | int outMode = nlmode_none; |
ohneta | 0:26f0a25e8be6 | 57 | |
ohneta | 0:26f0a25e8be6 | 58 | USBSerial pc; |
ohneta | 0:26f0a25e8be6 | 59 | Serial uart(D14, D15); // tx, rx |
ohneta | 0:26f0a25e8be6 | 60 | Ticker flipper; |
ohneta | 0:26f0a25e8be6 | 61 | |
ohneta | 0:26f0a25e8be6 | 62 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 63 | /** |
ohneta | 0:26f0a25e8be6 | 64 | * |
ohneta | 0:26f0a25e8be6 | 65 | */ |
ohneta | 0:26f0a25e8be6 | 66 | void flip() |
ohneta | 0:26f0a25e8be6 | 67 | { |
ohneta | 0:26f0a25e8be6 | 68 | myled3 = !myled3; |
ohneta | 0:26f0a25e8be6 | 69 | } |
ohneta | 0:26f0a25e8be6 | 70 | |
ohneta | 0:26f0a25e8be6 | 71 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 72 | /** |
ohneta | 0:26f0a25e8be6 | 73 | * |
ohneta | 0:26f0a25e8be6 | 74 | */ |
ohneta | 0:26f0a25e8be6 | 75 | void checkNlMode() |
ohneta | 0:26f0a25e8be6 | 76 | { |
ohneta | 0:26f0a25e8be6 | 77 | int inModePin0 = !nlInModePin0; |
ohneta | 0:26f0a25e8be6 | 78 | int inModePin1 = !nlInModePin1; |
ohneta | 0:26f0a25e8be6 | 79 | int outModePin0 = !nlOutModePin0; |
ohneta | 0:26f0a25e8be6 | 80 | int outModePin1 = !nlOutModePin1; |
ohneta | 0:26f0a25e8be6 | 81 | |
ohneta | 0:26f0a25e8be6 | 82 | inMode = (inModePin1 << 1) | inModePin0; |
ohneta | 0:26f0a25e8be6 | 83 | outMode = (outModePin1 << 1) | outModePin0; |
ohneta | 0:26f0a25e8be6 | 84 | |
ohneta | 0:26f0a25e8be6 | 85 | #if 0 |
ohneta | 0:26f0a25e8be6 | 86 | static char* modeString[] = { "nlmode_none", "nlmode_cr", "nlmode_lf", "nlmode_crlf" }; |
ohneta | 0:26f0a25e8be6 | 87 | pc.printf("[MODE: %x %x %x %x] => %s %s", inModePin0, inModePin1, outModePin0, outModePin1, modeString[inMode], modeString[outMode]); |
ohneta | 0:26f0a25e8be6 | 88 | pc.printf("\r\n"); |
ohneta | 0:26f0a25e8be6 | 89 | wait(0.1); |
ohneta | 0:26f0a25e8be6 | 90 | #endif |
ohneta | 0:26f0a25e8be6 | 91 | } |
ohneta | 0:26f0a25e8be6 | 92 | |
ohneta | 0:26f0a25e8be6 | 93 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 94 | //--------------------------------------------------------- |
ohneta | 0:26f0a25e8be6 | 95 | /** |
ohneta | 0:26f0a25e8be6 | 96 | * |
ohneta | 0:26f0a25e8be6 | 97 | */ |
ohneta | 0:26f0a25e8be6 | 98 | int main() |
ohneta | 0:26f0a25e8be6 | 99 | { |
ohneta | 0:26f0a25e8be6 | 100 | myled1 = 1; myled2 = 1; myled3 = 1; wait(0.1); |
ohneta | 0:26f0a25e8be6 | 101 | myled1 = 0; myled2 = 0; myled3 = 0; wait(0.1); |
ohneta | 0:26f0a25e8be6 | 102 | myled1 = 1; myled2 = 1; myled3 = 1; wait(0.2); |
ohneta | 0:26f0a25e8be6 | 103 | myled1 = 0; myled2 = 0; myled3 = 0; wait(0.2); |
ohneta | 0:26f0a25e8be6 | 104 | myled1 = 1; myled2 = 1; myled3 = 1; wait(0.3); |
ohneta | 0:26f0a25e8be6 | 105 | myled1 = 0; myled2 = 0; myled3 = 0; wait(0.3); |
ohneta | 0:26f0a25e8be6 | 106 | myled1 = 1; myled2 = 1; myled3 = 1; wait(0.4); |
ohneta | 0:26f0a25e8be6 | 107 | myled1 = 0; myled2 = 0; myled3 = 0; wait(0.4); |
ohneta | 0:26f0a25e8be6 | 108 | |
ohneta | 0:26f0a25e8be6 | 109 | nlInModeGnd0 = 0; |
ohneta | 0:26f0a25e8be6 | 110 | nlInModeGnd1 = 0; |
ohneta | 0:26f0a25e8be6 | 111 | nlOutModeGnd0 = 0; |
ohneta | 0:26f0a25e8be6 | 112 | nlOutModeGnd1 = 0; |
ohneta | 0:26f0a25e8be6 | 113 | |
ohneta | 0:26f0a25e8be6 | 114 | flipper.attach(&flip, 0.5); |
ohneta | 0:26f0a25e8be6 | 115 | wait(2); |
ohneta | 0:26f0a25e8be6 | 116 | pc.printf("** serial repeater **\r\n"); |
ohneta | 0:26f0a25e8be6 | 117 | pc.printf("----------------\r\n"); |
ohneta | 0:26f0a25e8be6 | 118 | |
ohneta | 0:26f0a25e8be6 | 119 | bool nlFlag = false; |
ohneta | 0:26f0a25e8be6 | 120 | while(1) { |
ohneta | 0:26f0a25e8be6 | 121 | checkNlMode(); |
ohneta | 0:26f0a25e8be6 | 122 | nlFlag = false; |
ohneta | 0:26f0a25e8be6 | 123 | |
ohneta | 0:26f0a25e8be6 | 124 | if (pc.available() > 0) { |
ohneta | 0:26f0a25e8be6 | 125 | int c = pc.getc(); |
ohneta | 0:26f0a25e8be6 | 126 | uart.putc(c); |
ohneta | 0:26f0a25e8be6 | 127 | myled1 = !myled1; |
ohneta | 0:26f0a25e8be6 | 128 | } |
ohneta | 0:26f0a25e8be6 | 129 | |
ohneta | 0:26f0a25e8be6 | 130 | if(uart.readable()) { |
ohneta | 0:26f0a25e8be6 | 131 | int c = uart.getc(); |
ohneta | 0:26f0a25e8be6 | 132 | |
ohneta | 0:26f0a25e8be6 | 133 | if ((inMode == nlmode_cr) && (c == '\r')) { |
ohneta | 0:26f0a25e8be6 | 134 | nlFlag = true; |
ohneta | 0:26f0a25e8be6 | 135 | } |
ohneta | 0:26f0a25e8be6 | 136 | if ((inMode == nlmode_lf) && (c == '\n')) { |
ohneta | 0:26f0a25e8be6 | 137 | nlFlag = true; |
ohneta | 0:26f0a25e8be6 | 138 | } |
ohneta | 0:26f0a25e8be6 | 139 | // inModeには nlmode_crlfは存在しない -> cr/lfの両方を処理する |
ohneta | 0:26f0a25e8be6 | 140 | |
ohneta | 0:26f0a25e8be6 | 141 | if (nlFlag) { |
ohneta | 0:26f0a25e8be6 | 142 | if (outMode == nlmode_cr) { |
ohneta | 0:26f0a25e8be6 | 143 | pc.putc('\r'); // CR |
ohneta | 0:26f0a25e8be6 | 144 | } else if (outMode == nlmode_lf) { |
ohneta | 0:26f0a25e8be6 | 145 | pc.putc('\n'); // LF |
ohneta | 0:26f0a25e8be6 | 146 | } else if (outMode == nlmode_crlf) { |
ohneta | 0:26f0a25e8be6 | 147 | pc.putc('\r'); // CR |
ohneta | 0:26f0a25e8be6 | 148 | pc.putc('\n'); // LF |
ohneta | 0:26f0a25e8be6 | 149 | } |
ohneta | 0:26f0a25e8be6 | 150 | } else { |
ohneta | 0:26f0a25e8be6 | 151 | pc.putc(c); |
ohneta | 0:26f0a25e8be6 | 152 | } |
ohneta | 0:26f0a25e8be6 | 153 | myled2 = !myled2; |
ohneta | 0:26f0a25e8be6 | 154 | } |
ohneta | 0:26f0a25e8be6 | 155 | |
ohneta | 0:26f0a25e8be6 | 156 | } |
ohneta | 0:26f0a25e8be6 | 157 | } |
ohneta | 0:26f0a25e8be6 | 158 | //--------------------------------------------------------- |