add: Script for shutting down and restarting the robot controller
This commit is contained in:
Executable
+123
@@ -0,0 +1,123 @@
|
||||
package backgroundTask;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.kuka.common.ThreadUtil;
|
||||
import com.kuka.roboticsAPI.applicationModel.tasks.RoboticsAPIBackgroundTask;
|
||||
import com.kuka.roboticsAPI.controllerModel.Controller;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.IUserKey;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.IUserKeyBar;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.IUserKeyListener;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.UserKeyAlignment;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.UserKeyEvent;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.UserKeyLED;
|
||||
import com.kuka.roboticsAPI.uiModel.userKeys.UserKeyLEDSize;
|
||||
import com.kuka.task.ITaskLogger;
|
||||
|
||||
/**
|
||||
* Background task: управление питанием контроллера KUKA через кнопки SmartPAD.
|
||||
*
|
||||
* Панель "System" содержит две safety-critical кнопки:
|
||||
* [0] REBOOT — запускает D:\Programmes\reboot.cmd
|
||||
* [1] SHUTDOWN — запускает D:\Programmes\shutdown.cmd
|
||||
*
|
||||
* Защита реализована через setCriticalText():
|
||||
* - 1-е нажатие, smartHMI показывает окно "Critical operation" с текстом предупреждения
|
||||
* - Кнопка деактивируется на ~5 с
|
||||
* - 2-е нажатие в течение 5 с, onKeyEvent(KeyDown) выполняется и скрипт запускается
|
||||
* - Нет нажатия / тап вне окна, окно закрывается, кнопка сбрасывается
|
||||
*/
|
||||
public class RobotPowerControl extends RoboticsAPIBackgroundTask {
|
||||
|
||||
@Inject
|
||||
private Controller kUKA_Sunrise_Cabinet;
|
||||
|
||||
@Inject
|
||||
private ITaskLogger logger;
|
||||
|
||||
private static final String REBOOT_SCRIPT = "D:\\Programme\\reboot.cmd";
|
||||
private static final String SHUTDOWN_SCRIPT = "D:\\Programme\\shutdown.cmd";
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
// инициализация не требуется
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
IUserKeyBar powerBar = getApplicationUI().createUserKeyBar("System");
|
||||
|
||||
// Кнопка REBOOT
|
||||
IUserKeyListener rebootListener = new IUserKeyListener() {
|
||||
@Override
|
||||
public void onKeyEvent(IUserKey key, UserKeyEvent event) {
|
||||
if (event == UserKeyEvent.KeyDown) {
|
||||
// Подтверждение через setCriticalText уже получено
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Yellow, UserKeyLEDSize.Small);
|
||||
boolean success = executeScript(REBOOT_SCRIPT);
|
||||
if (!success) {
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Red, UserKeyLEDSize.Small);
|
||||
ThreadUtil.milliSleep(2000);
|
||||
}
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Grey, UserKeyLEDSize.Small);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//Кнопка SHUTDOWN
|
||||
IUserKeyListener shutdownListener = new IUserKeyListener() {
|
||||
@Override
|
||||
public void onKeyEvent(IUserKey key, UserKeyEvent event) {
|
||||
if (event == UserKeyEvent.KeyDown) {
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Yellow, UserKeyLEDSize.Small);
|
||||
boolean success = executeScript(SHUTDOWN_SCRIPT);
|
||||
if (!success) {
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Red, UserKeyLEDSize.Small);
|
||||
ThreadUtil.milliSleep(2000);
|
||||
}
|
||||
key.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Grey, UserKeyLEDSize.Small);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//Регистрация и настройка кнопок
|
||||
IUserKey rebootKey = powerBar.addUserKey(0, rebootListener, true);
|
||||
rebootKey.setText(UserKeyAlignment.TopLeft, "REBOOT");
|
||||
rebootKey.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Grey, UserKeyLEDSize.Small);
|
||||
rebootKey.setCriticalText("Controller will REBOOT! Press again to confirm.");
|
||||
|
||||
IUserKey shutdownKey = powerBar.addUserKey(1, shutdownListener, true);
|
||||
shutdownKey.setText(UserKeyAlignment.TopLeft, "SHUTDOWN");
|
||||
shutdownKey.setLED(UserKeyAlignment.BottomMiddle, UserKeyLED.Grey, UserKeyLEDSize.Small);
|
||||
shutdownKey.setCriticalText("Controller will SHUTDOWN! Press again to confirm.");
|
||||
|
||||
powerBar.publish();
|
||||
|
||||
// Держим задачу живой
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
ThreadUtil.milliSleep(500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Запускает .cmd-скрипт через cmd.exe.
|
||||
* Не ждём завершения (waitFor не вызывается): контроллер уйдёт
|
||||
* в reboot/shutdown сам, ожидание привело бы к зависанию задачи.
|
||||
*
|
||||
* @param scriptPath абсолютный путь к .cmd файлу
|
||||
* @return true если процесс запущен успешно, false при IOException
|
||||
*/
|
||||
private boolean executeScript(String scriptPath) {
|
||||
try {
|
||||
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", scriptPath);
|
||||
pb.redirectErrorStream(true);
|
||||
pb.start();
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
logger.error("Failed to execute: " + scriptPath + " | " + e.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user