public void run() {
   started = System.currentTimeMillis();
   while (keepWaiting && !currentStatus.equals(ProcessStatus.ALL_OK)) {
     delay(10); // in seconds
     if (!currentStatus.equals(ProcessStatus.ALL_OK)
         && (System.currentTimeMillis() - started) > (cleaningDelay * 1000)) // Expired
     {
       // Next status level.
       log("Your cleaning delay (" + cleaningDelay + ") has expired. Going to the next level");
       log(" >>>>>>>>>> Level is " + currentStatus + ", GOING TO THE NEXT LEVEL >>>>>> ");
       switch (currentStatus.level()) {
         case SENT_TO_CAPTAIN:
           {
             log(">>>>>>>>>>>>> SENDING MESSAGE TO OWNER >>>>>");
             started = System.currentTimeMillis(); // Re-initialize the loop
             currentStatus = ProcessStatus.MESSAGE_SENT_TO_OWNER;
             String[] mess = {
               "Your boat, " + boatName + ", has oil in its bilge",
               "The power supply of the bilge pump has been shut off",
               "This oil should be cleaned.",
               "Reply to this message by sending CLEAN when done"
             };
             //  String mess = "Your boat, " + boatName + ", has oil in its bilge.";
             sendSMS(phoneNumber_2, mess);
           }
           break;
         case SENT_TO_OWNER:
           {
             log(">>>>>>>>>>>>> SENDING MESSAGE TO AUTHORITIES >>>>>");
             started = System.currentTimeMillis(); // Re-initialize the loop
             currentStatus = ProcessStatus.MESSAGE_SENT_TO_AUTHORITIES;
             String[] mess = {
               "The vessel " + boatName + " has oil in its bilge",
               "The power supply of the bilge pump has been shut off",
               "This oil should be cleaned.",
               "Reply to this message by sending CLEAN when the bilge has been cleaned."
             };
             //  String mess = "The vessel " + boatName + " has oil in its bilge."};
             sendSMS(phoneNumber_3, mess);
           }
           break;
         default:
           log(">>>>>>>>>>>>> FULL RESET NEEDED >>>>>");
           keepWaiting = false; // Full reset needed.
           break;
       }
     }
   }
   log("  >>> " + this.getClass().getName() + " completed.");
 }
  /**
   * -----+-oo- ^ | ^ | | | Dist To Surface | | v | -+---------------- RSH | Oil Thickness |
   * -+---------------- | | ^ | | | Water Thickness v | v =====+================ RSH: RangeSensor
   * Height
   */
  private static void businessLogic(double waterThickness, double oilThickness) {
    //  log(">>> In BusinessLogic (" + waterLevel + ", " + oilLevel + ")");

    //  currentWaterLevel   = Math.round(waterLevel);
    oilThicknessValues.add(oilThickness);

    //  double smoothedOilValue = -1D;

    //  System.out.println("Business Logic - Water:" + waterLevel + ", oil:" + oilLevel);
    if (oilThicknessValues.size() >= windowWidth) {
      while (oilThicknessValues.size() > windowWidth) oilThicknessValues.remove(0);
      currentOilThickness = smoothOilThickness();
    }
    if (oilThicknessValues.size() >= windowWidth && currentOilThickness > 0) {
      //    log("Oil thick:" + oilThickness + ", Water:" + waterLevel);
      if (waterThickness <= 0.1 && currentOilThickness > 0.25) {
        log(
            "       >>>>>>>>>>>>>>>>>>>>>>>>>> Shutting OFF !!!! <<<<<<<<<<<<<<<<<<<<< W:"
                + waterThickness
                + ", O:"
                + currentOilThickness);
        // Switch the relay off?
        RelayManager.RelayState status = rm.getStatus("00");
        // log("Relay is:" + status);
        if (RelayManager.RelayState.ON.equals(status)) {
          log("Turning relay off!");
          try {
            rm.set("00", RelayManager.RelayState.OFF);
          } catch (Exception ex) {
            System.err.println(ex.toString());
          }
        }
        if (currentStatus.equals(ProcessStatus.ALL_OK)) {
          log("Oil thick:" + currentOilThickness + ", Water:" + waterThickness + " ");
          // Make a call
          String[] mess = {
            "Oil in the bilge of " + boatName + ": " + DF23.format(currentOilThickness) + " cm.",
            "Please reply CLEAN to this message when done with it."
          };
          //  String mess = "First warning to " + boatName;

          displayAppMess(
              " >>>>>>>>>> CALLING "
                  + phoneNumber_1); // + "Mess is a " + mess.getClass().getName() + "\n" + mess);
          sendSMS(phoneNumber_1, mess);
          currentStatus = ProcessStatus.MESSAGE_SENT_TO_CAPTAIN;
          WaitForCleanThread wfct = new WaitForCleanThread();
          wfct.start();
        }
      } else {
        System.out.println("                            ");
        System.out.println("                            ");
      }
    }
  }