35 uint32_t lastWaitUntilCommandAcceptMs = 0;
36 uint32_t lastRestartMs = 0;
43 Im920s(HardwareSerial& uart, uint16_t nodeNum, uint8_t busyPin)
55 Im920s(HardwareSerial& uart, uint16_t nodeNum)
78 operator bool()
const override {
return uart && not isTimeout(700); }
82 bool begin(uint8_t channel);
92 Serial.print(
"IM920s: OK ");
96 Serial.print(
"IM920s: NG ");
99 switch (getTransmitMode())
101 case TransmitMode::Send: Serial.print(
"SendMode ");
break;
102 case TransmitMode::Receive: Serial.print(
"ReceiveMode ");
break;
103 case TransmitMode::TwoWay: Serial.print(
"TwoWayMode ");
break;
104 case TransmitMode::Empty: Serial.print(
"Empty ");
break;
112 waitUntilCommandAccept();
113 uart.print(
"RDNN\r\n");
114 Serial.print(uart.readStringUntil(
'\n'));
127 return constrain(channel, 1, 29);
131 enum class TransmitMode
140 TransmitMode getTransmitMode()
const
146 return TransmitMode::TwoWay;
150 return TransmitMode::Send;
155 return TransmitMode::Receive;
159 return TransmitMode::Empty;
170 const int sendTimeMs = 4.56 + txNode->size * 0.08 + 1.00;
173 if (millis() - txNode->transmitMs < (
unsigned long)sendTimeMs)
183 Udon::BitPack(txNode->data, txNode->data + txNode->size, [
this](uint8_t data)
184 { uart.write(data); });
189 if (uart.readStringUntil(
'\n') ==
"OK\r")
191 txNode->transmitMs = millis();
200 constexpr int HeaderSize = 2 + 1 + 4 + 1 + 2 + 1;
203 constexpr int FooterSize = 1 + 1;
209 if (uart.available() < FrameSize)
215 for (
int i = 0; i < HeaderSize; ++i)
221 if (not
Udon::BitUnpack(rxNode->data, rxNode->data + rxNode->size, [
this]() -> uint8_t
222 { return uart.read(); }))
225 while (uart.available())
233 for (
int i = 0; i < FooterSize; ++i)
239 while (uart.available())
244 rxNode->transmitMs = millis();
273 bool isTimeout(uint32_t timeoutMs)
const
275 switch (getTransmitMode())
277 case TransmitMode::Send:
278 return millis() - txNode->transmitMs > timeoutMs;
279 case TransmitMode::Receive:
280 return millis() - rxNode->transmitMs > timeoutMs;
281 case TransmitMode::TwoWay:
282 return millis() - txNode->transmitMs > timeoutMs || millis() - rxNode->transmitMs > timeoutMs;
283 case TransmitMode::Empty:
290 void RestartOnTimeout()
292 if (not isTimeout(2000))
298 if (millis() - lastRestartMs > 2000)
300 waitUntilCommandAccept();
301 uart.print(
"SRST\r\n");
302 lastRestartMs = millis();
303 while (uart.available())
311 void waitUntilCommandAccept()
315 lastWaitUntilCommandAcceptMs = millis();
317 while (digitalRead(*busyPin))
319 delayMicroseconds(10);
321 if (millis() - lastWaitUntilCommandAcceptMs > 200)
333 while (uart.available())
347 pinMode(*busyPin, INPUT);
353 waitUntilCommandAccept();
354 uart.print(
"RDVR\r\n");
356 uart.readStringUntil(
' ');
357 uart.readStringUntil(
'.');
358 const int version = uart.readStringUntil(
'.').substring(0).toInt() * 100 + uart.readStringUntil(
'\n').substring(0).toInt();
360 int defaultChannel, defaultPower;
361 String defaultCharIOMode, defaultStatusOutputOnReceipt;
363 waitUntilCommandAccept();
364 uart.print(
"RPRM\r\n");
368 (void)uart.readStringUntil(
'\n');
369 (void)uart.readStringUntil(
'\n');
370 (void)uart.readStringUntil(
'\n');
371 defaultChannel = uart.readStringUntil(
'\n').substring(5).toInt();
372 defaultPower = uart.readStringUntil(
'\n').substring(5).toInt();
373 (void)uart.readStringUntil(
'\n');
374 (void)uart.readStringUntil(
'\n');
375 (void)uart.readStringUntil(
'\n');
376 (void)uart.readStringUntil(
'\n');
377 (void)uart.readStringUntil(
'\n');
378 (void)uart.readStringUntil(
'\n');
379 (void)uart.readStringUntil(
'\n');
380 (void)uart.readStringUntil(
'\n');
381 defaultCharIOMode = uart.readStringUntil(
'\n');
382 (void)uart.readStringUntil(
'\n');
383 (void)uart.readStringUntil(
'\n');
384 (void)uart.readStringUntil(
'\n');
385 (void)uart.readStringUntil(
'\n');
386 (void)uart.readStringUntil(
'\n');
387 (void)uart.readStringUntil(
'\n');
388 defaultStatusOutputOnReceipt = uart.readStringUntil(
'\n');
389 (void)uart.readStringUntil(
'\n');
394 (void)uart.readStringUntil(
'\n');
395 (void)uart.readStringUntil(
'\n');
396 (void)uart.readStringUntil(
'\n');
397 defaultChannel = uart.readStringUntil(
'\n').substring(5).toInt();
398 defaultPower = uart.readStringUntil(
'\n').substring(5).toInt();
399 (void)uart.readStringUntil(
'\n');
400 (void)uart.readStringUntil(
'\n');
401 (void)uart.readStringUntil(
'\n');
402 (void)uart.readStringUntil(
'\n');
403 (void)uart.readStringUntil(
'\n');
404 (void)uart.readStringUntil(
'\n');
405 (void)uart.readStringUntil(
'\n');
406 defaultCharIOMode = uart.readStringUntil(
'\n');
407 (void)uart.readStringUntil(
'\n');
408 (void)uart.readStringUntil(
'\n');
409 defaultStatusOutputOnReceipt = uart.readStringUntil(
'\n');
413 if (defaultChannel != channel || defaultPower != 2 || defaultCharIOMode !=
"ECIO\r" || defaultStatusOutputOnReceipt !=
"ERXI\r")
415 waitUntilCommandAccept();
416 uart.print(
"ENWR\r\n");
417 if (uart.readStringUntil(
'\n') !=
"OK\r")
423 if (defaultChannel != channel)
425 waitUntilCommandAccept();
427 if (uart.readStringUntil(
'\n') !=
"OK\r")
433 if (defaultPower != 2)
435 waitUntilCommandAccept();
437 if (uart.readStringUntil(
'\n') !=
"OK\r")
443 if (defaultCharIOMode !=
"ECIO\r")
445 waitUntilCommandAccept();
446 uart.print(
"ECIO\r\n");
447 if (uart.readStringUntil(
'\n') !=
"OK\r")
453 if (defaultStatusOutputOnReceipt !=
"ERXI\r")
455 waitUntilCommandAccept();
456 uart.print(
"ERXI\r\n");
457 if (uart.readStringUntil(
'\n') !=
"OK\r")
463 if (defaultChannel != channel || defaultPower != 2 || defaultCharIOMode !=
"ECIO\r" || defaultStatusOutputOnReceipt !=
"ERXI\r")
465 waitUntilCommandAccept();
466 uart.print(
"DSWR\r\n");
467 if (uart.readStringUntil(
'\n') !=
"OK\r")