|
17 | 17 | #define TX (1)
|
18 | 18 | #endif
|
19 | 19 |
|
20 |
| -//#define HWLOOPBACK 1 |
21 |
| -//#define HALFDUPLEX 1 |
| 20 | +#define HWLOOPBACK 1 |
| 21 | +#define HALFDUPLEX 1 |
22 | 22 |
|
23 | 23 | #ifdef ESP32
|
24 |
| -constexpr int IUTBITRATE = 57600; |
| 24 | +constexpr int IUTBITRATE = 19200; |
25 | 25 | #else
|
26 |
| -constexpr int IUTBITRATE = 153600; |
| 26 | +constexpr int IUTBITRATE = 19200; |
27 | 27 | #endif
|
28 | 28 |
|
29 |
| -constexpr SoftwareSerialConfig swSerialConfig = SWSERIAL_8N1; |
| 29 | +#if defined(ESP8266) |
| 30 | +constexpr SoftwareSerialConfig swSerialConfig = SWSERIAL_8E1; |
| 31 | +constexpr SerialConfig hwSerialConfig = SERIAL_8E1; |
| 32 | +#elif defined(ESP32) |
| 33 | +constexpr SoftwareSerialConfig swSerialConfig = SWSERIAL_8E1; |
| 34 | +constexpr uint32_t hwSerialConfig = SERIAL_8E1; |
| 35 | +#else |
| 36 | +constexpr unsigned swSerialConfig = 3; |
| 37 | +#endif |
| 38 | +constexpr bool invert = false; |
30 | 39 |
|
31 | 40 | constexpr int BLOCKSIZE = 16; // use fractions of 256
|
32 | 41 |
|
33 |
| - |
34 | 42 | unsigned long start;
|
35 | 43 | String bitRateTxt("Effective data rate: ");
|
36 | 44 | int rxCount;
|
37 | 45 | int seqErrors;
|
38 | 46 | int expected;
|
39 | 47 | constexpr int ReportInterval = IUTBITRATE / 8;
|
40 | 48 |
|
41 |
| -#ifdef HWLOOPBACK |
42 | 49 | #if defined(ESP8266)
|
| 50 | +#if defined(HWLOOPBACK) |
43 | 51 | HardwareSerial& repeater(Serial);
|
44 | 52 | SoftwareSerial logger;
|
45 |
| -#elif defined(ESP32) |
46 |
| -HardwareSerial& repeater(Serial2); |
| 53 | +#else |
| 54 | +SoftwareSerial repeater; |
47 | 55 | HardwareSerial& logger(Serial);
|
48 | 56 | #endif
|
| 57 | +#elif defined(ESP32) |
| 58 | +#if defined(HWLOOPBACK) |
| 59 | +HardwareSerial& repeater(Serial2); |
49 | 60 | #else
|
50 | 61 | SoftwareSerial repeater;
|
| 62 | +#endif |
| 63 | +HardwareSerial& logger(Serial); |
| 64 | +#else |
| 65 | +SoftwareSerial repeater(14, 12); |
51 | 66 | HardwareSerial& logger(Serial);
|
52 | 67 | #endif
|
53 | 68 |
|
54 | 69 | void setup() {
|
55 |
| -#ifdef HWLOOPBACK |
56 | 70 | #if defined(ESP8266)
|
57 |
| - repeater.begin(IUTBITRATE); |
58 |
| - repeater.setRxBufferSize(2 * BLOCKSIZE); |
| 71 | +#if defined(HWLOOPBACK) |
| 72 | + repeater.begin(IUTBITRATE, hwSerialConfig, SERIAL_FULL, 1, invert); |
59 | 73 | repeater.swap();
|
60 |
| - logger.begin(9600, swSerialConfig, RX, TX); |
61 |
| -#elif defined(ESP32) |
62 |
| - repeater.begin(IUTBITRATE, SERIAL_8N1, D7, D8); |
63 | 74 | repeater.setRxBufferSize(2 * BLOCKSIZE);
|
| 75 | + logger.begin(9600, SWSERIAL_8N1, -1, TX); |
| 76 | +#else |
| 77 | + repeater.begin(IUTBITRATE, swSerialConfig, D7, D8, invert, 4 * BLOCKSIZE); |
| 78 | +#ifdef HALFDUPLEX |
| 79 | + repeater.enableIntTx(false); |
| 80 | +#endif |
64 | 81 | logger.begin(9600);
|
65 | 82 | #endif
|
66 |
| -#else |
67 |
| -#if defined(ESP8266) |
68 |
| - repeater.begin(IUTBITRATE, swSerialConfig, D7, D8, false, 2 * BLOCKSIZE); |
69 | 83 | #elif defined(ESP32)
|
70 |
| - repeater.begin(IUTBITRATE, swSerialConfig, D7, D8, false, 2 * BLOCKSIZE); |
71 |
| -#endif |
| 84 | +#if defined(HWLOOPBACK) |
| 85 | + repeater.begin(IUTBITRATE, hwSerialConfig, D7, D8, invert); |
| 86 | + repeater.setRxBufferSize(2 * BLOCKSIZE); |
| 87 | + logger.begin(9600); |
| 88 | +#else |
| 89 | + repeater.begin(IUTBITRATE, swSerialConfig, D7, D8, invert, 4 * BLOCKSIZE); |
72 | 90 | #ifdef HALFDUPLEX
|
73 | 91 | repeater.enableIntTx(false);
|
74 | 92 | #endif
|
75 | 93 | Serial.begin(9600);
|
76 | 94 | #endif
|
| 95 | +#else |
| 96 | + repeater.begin(IUTBITRATE); |
| 97 | + Serial.begin(9600); |
| 98 | +#endif |
77 | 99 |
|
78 | 100 | start = micros();
|
79 | 101 | rxCount = 0;
|
80 | 102 | seqErrors = 0;
|
| 103 | + expected = -1; |
| 104 | + |
| 105 | + logger.println("Repeater example for EspSoftwareSerial"); |
81 | 106 | }
|
82 | 107 |
|
83 | 108 | void loop() {
|
84 | 109 | #ifdef HALFDUPLEX
|
85 |
| - unsigned char block[BLOCKSIZE]; |
| 110 | + char block[BLOCKSIZE]; |
86 | 111 | #endif
|
87 | 112 | // starting deadline for the first bytes to come in
|
88 | 113 | uint32_t deadlineStart = ESP.getCycleCount();
|
89 | 114 | int inCnt = 0;
|
90 |
| - while ((ESP.getCycleCount() - deadlineStart) < (1000000 * 10 * BLOCKSIZE) / IUTBITRATE * 2 * ESP.getCpuFreqMHz()) { |
91 |
| - int avail = repeater.available(); |
92 |
| - for (int i = 0; i < avail; ++i) |
93 |
| - { |
94 |
| - int r = repeater.read(); |
95 |
| - if (r == -1) { logger.println("read() == -1"); } |
96 |
| - if (expected == -1) { expected = r; } |
97 |
| - else { |
98 |
| - expected = (expected + 1) % 256; |
99 |
| - } |
100 |
| - if (r != (expected & ((1 << (5 + swSerialConfig % 4)) - 1))) { |
101 |
| - ++seqErrors; |
102 |
| - expected = -1; |
103 |
| - } |
104 |
| - ++rxCount; |
| 115 | + while ((ESP.getCycleCount() - deadlineStart) < (1000000UL * 12 * BLOCKSIZE) / IUTBITRATE * 24 * ESP.getCpuFreqMHz()) { |
| 116 | + int avail = repeater.available(); |
| 117 | + for (int i = 0; i < avail; ++i) |
| 118 | + { |
| 119 | + int r = repeater.read(); |
| 120 | + if (r == -1) { logger.println("read() == -1"); } |
| 121 | + if (expected == -1) { expected = r; } |
| 122 | + else { |
| 123 | + expected = (expected + 1) % (1UL << (5 + swSerialConfig % 4)); |
| 124 | + } |
| 125 | + if (r != expected) { |
| 126 | + ++seqErrors; |
| 127 | + expected = -1; |
| 128 | + } |
| 129 | + ++rxCount; |
105 | 130 | #ifdef HALFDUPLEX
|
106 |
| - block[inCnt] = r; |
| 131 | + block[inCnt] = r; |
107 | 132 | #else
|
108 |
| - repeater.write(r); |
| 133 | + repeater.write(r); |
109 | 134 | #endif
|
110 |
| - } |
111 |
| - if (++inCnt >= BLOCKSIZE) { break; } |
112 |
| - // wait for more outstanding bytes to trickle in |
113 |
| - if (avail) deadlineStart = ESP.getCycleCount(); |
| 135 | + if (++inCnt >= BLOCKSIZE) { break; } |
| 136 | + } |
| 137 | + if (inCnt >= BLOCKSIZE) { break; } |
| 138 | + // wait for more outstanding bytes to trickle in |
| 139 | + if (avail) deadlineStart = ESP.getCycleCount(); |
114 | 140 | }
|
115 | 141 |
|
116 | 142 | #ifdef HALFDUPLEX
|
117 | 143 | repeater.write(block, inCnt);
|
118 | 144 | #endif
|
119 | 145 |
|
120 |
| - if (inCnt != 0 && inCnt != BLOCKSIZE) { |
121 |
| - logger.print("Got "); logger.print(inCnt); logger.println(" bytes during buffer interval"); |
122 |
| - } |
123 |
| - |
124 | 146 | if (rxCount >= ReportInterval) {
|
125 | 147 | auto end = micros();
|
126 | 148 | unsigned long interval = end - start;
|
|
0 commit comments