From 33c7d0edae0c4281694c2a10a0be67ea423da0c7 Mon Sep 17 00:00:00 2001 From: Teo-CD Date: Fri, 15 Dec 2023 21:31:34 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Arduino:=20Use=20400kHz=20clock=20fo=20I?= =?UTF-8?q?=C2=B2C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The EEPROM in the cartridges support 'Fast I²C' at 400kHz. Testing it out, it seems to work fine despite the high pull-ups, so update the Arduino code to enjoy the 4x speed-up ! --- Arduino/SendCart/SendCart.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/Arduino/SendCart/SendCart.ino b/Arduino/SendCart/SendCart.ino index a98aa6d..0b3639a 100644 --- a/Arduino/SendCart/SendCart.ino +++ b/Arduino/SendCart/SendCart.ino @@ -23,6 +23,7 @@ void setup() { Serial.begin(115200); pinMode(LED_BUILTIN, OUTPUT); Wire.begin(); + Wire.setClock(400000); } void loop() { From 87a72e3e3e531d055bc067d5814a6be0487f68b2 Mon Sep 17 00:00:00 2001 From: Teo-CD Date: Fri, 15 Dec 2023 22:07:46 +0000 Subject: [PATCH 2/2] Unity: Add delay after serial connection The Arduino will block if sent data too quickly after connection. Add a new coroutine to force waiting for 1s+ and update the UI accordingly. Update some comments throughout. --- Assets/Scripts/Arduino_Com.cs | 41 ++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/Assets/Scripts/Arduino_Com.cs b/Assets/Scripts/Arduino_Com.cs index c5f1bad..16c941d 100644 --- a/Assets/Scripts/Arduino_Com.cs +++ b/Assets/Scripts/Arduino_Com.cs @@ -14,6 +14,7 @@ public class Arduino_Com : MonoBehaviour { Déconnecté, Connecté, + Connexion, Lecture, Écriture, Invalide @@ -68,11 +69,21 @@ public class Arduino_Com : MonoBehaviour return sum; } + // Core communication function. + // Receives all the data from the cartridge and writes it out to the png file. + // As the computer will probably read the serial data faster than the Arduino + // /and/ the transfer is quite slow (lots of bits, low baudrate), make this a + // coroutine. + // This prevents the whole application freezing up why waiting for data and + // allow presenting visual feedback. private IEnumerator ReceiveSerialData() { do { + // We could use an event instead but as Unity is lagging behind .NET versions, + // it wouldn't be cross-platform. yield return new WaitUntil(() => _serial.BytesToRead >= 1); + // Read all available data, up to the PageSize. _readBytes += _serial.Read(_pageBuffer, _readBytes, PageSize - _readBytes); @@ -104,6 +115,7 @@ public class Arduino_Com : MonoBehaviour _readBytes = 0; } } while (_currentPage < PageCount); + // We are done receiving the cart, we don't expect more data to be received so the coroutine can return. _currentPage = 0; _state = ArduinoState.Connecté; @@ -222,14 +234,7 @@ public class Arduino_Com : MonoBehaviour return; } - // TODO: Wait ~2s for Arduino startup - _arduinoControlButton.text = "Déconnecter"; - - _cartLoadButton.SetEnabled(true); - // _cartWriteButton.SetEnabled(true); TODO: Not implemented - _arduinoSerialPort.SetEnabled(false); - - _state = ArduinoState.Connecté; + StartCoroutine(DoSerialConnection()); } } @@ -244,4 +249,24 @@ public class Arduino_Com : MonoBehaviour _state = SerialPort.GetPortNames().Contains(newPort.newValue) ? ArduinoState.Déconnecté : ArduinoState.Invalide; _arduinoControlButton.SetEnabled(_state != ArduinoState.Invalide); } + + // Update UI during connection and when ready, prevent interacting too quickly. + IEnumerator DoSerialConnection() + { + _arduinoControlButton.text = "Connexion..."; + _arduinoControlButton.SetEnabled(false); + _arduinoSerialPort.SetEnabled(false); + _state = ArduinoState.Connexion; + + // Delay enabling transfers because the Arduino is slow to set-up the serial. + yield return new WaitForSeconds(1.5f); + + _arduinoControlButton.text = "Déconnecter"; + _arduinoControlButton.SetEnabled(true); + + _cartLoadButton.SetEnabled(true); + // _cartWriteButton.SetEnabled(true); TODO: Not implemented + + _state = ArduinoState.Connecté; + } }