WaitFor(Particle.connected, 10000) is not timing out

I have a prototype that has been working well for sometime - last night I just noticed that during a ‘wakeup from standby’ function that calls WaitFor(Particle.connected, 10000) it has got stuck on this function and the timeout has not, well, timed-out. The LED is flashing cyan, the application had gone through checking the wifi connection. Is there a reason for this application blocking/not timing out? Is there a better/more reliable way to wait for a cloud connection for a period then move on?

@armor, showing some code would be helpful. What system mode did you specify? Is system threading enabled?


These are set at the start of the program.


Here is the code that stuck on the waitFor.

if (opMode == connected)
    if (!Particle.connected()) Particle.connect();
    waitFor(Particle.connected, 10000);
    if (Particle.connected()) connectedOnce = true;

I know from the progress bar that the code got stuck after the 60% - LED was flashing cyan.

I’ve seen this, as well. I was running solid for 22 days before my last reboot - but not even a day after I reflashed due to another issue, I hit this flashing cyan, and the waitFor timeout never forced a reboot:

    wifiCheck = false;
    if (!Particle.connected())

      if (waitFor(Particle.connected, 10000)) {
        Particle.publish("app/reconnect", "Reconnected to the Cloud after a hang!", 3600, PRIVATE);
      } else {
        //Timeout... Lets reset.

@legoguy Did you manage to work through this? I’ve also got a WaitFor loop which won’t kick out. Not sure what alternatives there are or whether I’ve got something wrong in my code…

if (waitFor(WiFi.ready, 10000)) {               //wait for 10 seconds to confirm whether the photon is connected to the wifi, if not sleep. 
        if (waitFor(Particle.connected, 10000)) { //wait for 10 seconds to confirm whether the photon is connected to the cloud, if not sleep. 
        voltage = lipo.getVoltage();	        // returns a voltage value (e.g. 3.93)
        soc = lipo.getSOC();                    // returns the estimated state of charge (e.g. 79%)

Looking forward to hearing results.

@neal_tommy, if you are running in SEMI_AUTOMATIC mode, you can simply call Particle.connect(), then do if(waitFor(Particle.connected(), 10000). Using this form with the if() will fail if there is a timeout so do you have an else as well?

@peekay123, I didn’t realise that we had to have the Particle in SEMI_AUTOMATIC mode for this? I changed some code and seem to have a work around in AUTOMATIC mode so will let the Particle run a few days and then see from there.
Thanks for the note.

1 Like


I haven’t seen a reply from @jvanier about this other than in 0.5.0 a change was made after his investigation to kick out of the wifi chip stack after 60 seconds. I have stopped using waitfor and instead set a unsigned long variable with mills() and then keep checking check until the required timeout period. This always works. If you are in SEMI_AUTOMATIC mode be aware that you should only call Particle.connect() once - @mdma made a cryptic comment about this a month or so back - it seemed to have solved the issues I had.