private void startCooldown(
      IoModule ioModule,
      ParamManager paramManager,
      List<ZoneState> zones,
      List<BeltState> beltStates,
      List<RailState> railStates,
      double cooldownTemp,
      Config config,
      List<Integer> nodes) {
    if (ioModule.getOutput(Can.OutputIO.IOM_HEAT_CONTACTOR) == 1) {
      // Turn off heat contactor and disable alarms
      paramManager.setAlarms(ALARM_DISABLED);
      CanComm.sendCmdSetpoint(
          Can.BoardType.BOARD_TYPE_IOM.getStartNum(),
          0,
          Can.CmdSetpoint.SETPOINT_HEAT_CONTACTOR,
          0);
      log.info("Delayed Cooldown -- Heat Contactor Off...");
    }

    // gray out heat zones on GUI
    for (ZoneState zone : zones) {
      zone.setTopHeaterFlag(Equip.HeaterFlag.OFF);
      paramManager.zeroHeaterSetpoint(true, zone);
      zone.setTopColor(GRAY);
      if (zone.isHeatZone()) {
        zone.setBottomHeaterFlag(Equip.HeaterFlag.OFF);
        paramManager.zeroHeaterSetpoint(false, zone);
        zone.setBottomColor(GRAY);
      }
    }
    // gray out belts on GUI
    for (BeltState beltState : beltStates) {
      beltState.setColor(GRAY);
    }
    // gray out rails on GUI
    for (RailState railState : railStates) {
      railState.setColor(GRAY);
    }

    // test if zone heaters are above cooldown temperature
    boolean belowTemp = true;
    for (ZoneState zone : zones) {
      if (zone.getTopTemp() > cooldownTemp) {
        belowTemp = false;
        break;
      }
      if (zone.getBottomTemp() > cooldownTemp && zone.isHeatZone()) {
        belowTemp = false;
        break;
      }
    }
    if (belowTemp) {
      // complete cooldown after all zones less than cooldown temp
      if (OvenState.getInstance().getLightTower() == LightTowerState.COOLDOWN.getTower()) {
        CanComm.setLightTower(Equip.LightTowerState.TOWER_OFF.getTower());
      }
      // set all belts to speed of zero
      for (int i = 0; i < config.getNumBelts(); i++) {
        BeltState beltState = beltStates.get(i);
        paramManager.zeroBeltSetpoint(beltState);
      }
      // turn off fan contactor
      CanComm.sendCmdSetpoint(
          Can.BoardType.BOARD_TYPE_IOM.getStartNum(), 0, Can.CmdSetpoint.SETPOINT_FAN_CONTACTOR, 0);
      CanComm.sendSystemState(
          SystemState.SYSTEM_STATE_OVEN_OFF, Can.OpId.OPER_SET.ordinal(), nodes);
      log.info("Cooldown complete - Fan Contactor Off...");
    }
  }