Giter VIP home page Giter VIP logo

Comments (10)

dwilches avatar dwilches commented on August 24, 2024

Hi Jakub,

Indeed, that behaviour is expected because of the execution order of MonoBehaviours' functions:

  1. When a game is finishing it invokes the OnDisable method of the GameObject that controls the COM port, and then the COM port is closed.
  2. Then, Unity invokes the OnApplicationQuit method, but by then the COM port is already closed, so your message will never arrive at the other side.

Check here the order of execution of the functions: https://docs.unity3d.com/Manual/ExecutionOrder.html

Now, there are some solutions:

  1. If you can guarantee the OnDisable of other of the scripts of that GameObject gets invoked before the SerialController.OnDisable then you can send your custom message from there (be sure of adding a delay after sending the message).
  2. I will modify the library to include a "tear-down" function, as I think yours will be a pretty common use-case.

Do you want to try with the first option in the meantime? I can add the new functionality later on the weekend.

from ardity.

jakubgondek avatar jakubgondek commented on August 24, 2024

Thanks for fast response. I'll start with OnDisable solution. But how can I add a delay and be sure that the app will wait until it closes? Is adding a coroutine with WaitForSeconds(1); in OnDisable enough?

from ardity.

jakubgondek avatar jakubgondek commented on August 24, 2024

It turns out you cannot place coroutines in OnDisable, and the fact that I'm using Robotlegs Sharp doesn't help either. I'll wait for your "tear-down" implementation, unless you have any other advices for me :)

from ardity.

dwilches avatar dwilches commented on August 24, 2024

Hi,
I am at this moment making the last tests for the library to ensure the tear-down works correctly (so far, it does).

It seems weekend arrived earlier than expected 😃

from ardity.

dwilches avatar dwilches commented on August 24, 2024

Alright, the feature is finished.

Could you give it a try and let me know if it works well for you too?
I put in the README another sample Arduino program, the one I used for testing this feature.
Also, there is a new scene called "DemoSceneUserPoll_ReadWrite_TearDown" where I use the tear-down functionality.
The Unity package was also updated with this change.

from ardity.

jakubgondek avatar jakubgondek commented on August 24, 2024

It works with the device in your supplied test scene. I'll have time to check it in my applilcation tomorrow.

from ardity.

dwilches avatar dwilches commented on August 24, 2024

Hello.
Did it work?

from ardity.

jakubgondek avatar jakubgondek commented on August 24, 2024

Sorry for not writing you back. I'm in the middle of a project and it's a little hot in here :) Your teardown method worked for me. Since I'm a fresh C#/Unity programmer i was wondering what's the diffrence between calling:
void OnDisable() { SendSerialMessage("@REL#0@"); ...

and

void OnDisable() { if (userDefinedTearDownFunction != null) userDefinedTearDownFunction(); ...
and userDefinedTearDownFunction calling SendSerialMessage("@REL#0@"); on SerialController? Do delegates hold the execution stack or something?

from ardity.

dwilches avatar dwilches commented on August 24, 2024

For this to work:

void OnDisable() { SendSerialMessage("@REL#0@");

you must modify the SerialController file, which is not a good idea with 3rd-party libraries as you will have trouble when upgrading to a new version. Other than that, the lines behave exactly in the same way.

Now, if you meant putting:

void OnDisable() { SendSerialMessage("@REL#0@");

in a different file, then it won't necessarily work as it depends on which OnDisable gets executed first. If SerialController's execute first then by the time the OnDisable of your class gets executed, the COM port is already closed.

from ardity.

dwilches avatar dwilches commented on August 24, 2024

And about you last question, no, delegates don't hold the execution stack or anything like that, they are plain function pointers.

I guess your question is why it works now, check at the SerialThread class, it has an additional change there that was needed so the tear-down worked:

image

Now, the OnDisable puts something in the "out-queue", and the thread ensures that it doesn't exit while there is something in that queue, so you can think of the queue being the one that holds down the execution of the other OnDisable's.

from ardity.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.