From 53ed82648036b91e8b0b10ac7caee50933a6d4a0 Mon Sep 17 00:00:00 2001 From: lixiaolong <702156524@qq.com> Date: Wed, 19 Aug 2026 15:00:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(llm):=20=E6=B7=BB=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E5=9B=BE=E7=89=87=E5=88=86=E6=9E=90=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E8=BE=B9=E7=BC=98=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E7=8A=B6=E6=80=81=E6=81=A2=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 IMAGE_ANALYZE 动作类型支持通用图片分析 - 实现图片分析操作服务支持单张及多图片分析 - 添加图片分析的提示词、参考图片和调优参数配置 - 集成 MinIO 服务上传功能支持唯一文件名生成 - 添加 FlowMediaParamResolver 支持 URL 数组解析 - 实现边缘系统恢复运行状态的新 API 接口 - 标记旧的安全状态恢复接口为已弃用 - 更新媒体分析操作服务支持详细的输出选项 - 添加图片分析相关的单元测试验证功能 --- .../controller/api/EdgeSystemController.java | 13 +- .../aima/support/AimaAnalysisVerdict.java | 3 +- .../aima/support/AimaAnalysisVerdictTest.java | 2 + .../client/service/EdgeSystemService.java | 7 + .../service/impl/EdgeSystemServiceImpl.java | 33 + .../src/main/java/cmvr/api/SafetyCommand.java | 2772 ++++++++++++++++- .../main/java/cmvr/api/SystemServiceGrpc.java | 74 + .../cmvr/api/SystemServiceOuterClass.java | 7 +- .../main/proto/cmvr/api/safety_command.proto | 18 + .../main/proto/cmvr/api/system_service.proto | 5 +- cmvr-iot-common/pom.xml | 7 + .../cmvr/common/core/minio/MinioService.java | 49 +- .../common/core/minio/MinioServiceTest.java | 45 + .../InspectionDetectionAlertServiceImpl.java | 5 +- .../java/com/cmvr/test/enums/ActionEnum.java | 1 + .../test/flow/builder/FlowModelBuilder.java | 26 + .../operator/FlowMediaParamResolver.java | 34 +- .../llm/LLMMediaAnalysisOperateService.java | 105 +- .../service/FlowActionExecutorService.java | 4 +- .../flow/builder/FlowModelBuilderTest.java | 34 + .../LLMMediaAnalysisOperateServiceTest.java | 84 +- .../service/impl/CorpusInfoServiceImpl.java | 8 +- .../impl/TtsSynthesizeTaskServiceImpl.java | 7 +- 23 files changed, 3250 insertions(+), 93 deletions(-) create mode 100644 cmvr-iot-common/src/test/java/com/cmvr/common/core/minio/MinioServiceTest.java create mode 100644 cmvr-iot-test/src/test/java/com/cmvr/test/flow/builder/FlowModelBuilderTest.java diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/EdgeSystemController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/EdgeSystemController.java index 62482aa..22da74b 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/EdgeSystemController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/EdgeSystemController.java @@ -63,7 +63,18 @@ public class EdgeSystemController extends BaseController { return success(JSON.toJSONString(edgeSystemService.getSafetyState(robotId))); } - @ApiOperation("Clear recoverable edge safety errors") + @ApiOperation("Restore edge operational state") + @PostMapping("/restoreOperationalState") + public AjaxResult restoreOperationalState(@RequestBody @Validated EdgeSafetyRecoveryVO request) { + return success(JSON.toJSONString(edgeSystemService.restoreOperationalState( + request.getRobotId(), request.getReason(), request.getTimeoutMs()))); + } + + /** + * @deprecated Use /restoreOperationalState. + */ + @Deprecated + @ApiOperation("[Deprecated] Clear recoverable edge safety errors") @PostMapping("/recoverSafetyState") public AjaxResult recoverSafetyState(@RequestBody @Validated EdgeSafetyRecoveryVO request) { return success(JSON.toJSONString(edgeSystemService.recoverSafetyState( diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/support/AimaAnalysisVerdict.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/support/AimaAnalysisVerdict.java index 65d8c8c..9fb3554 100644 --- a/cmvr-iot-aima/src/main/java/com/cmvr/aima/support/AimaAnalysisVerdict.java +++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/support/AimaAnalysisVerdict.java @@ -31,6 +31,7 @@ public final class AimaAnalysisVerdict { } private static boolean isAnalysisAction(ActionEnum action) { - return action == ActionEnum.AUDIO_EVENT_CLASSIFY || action == ActionEnum.VIDEO_ANALYZE; + return action == ActionEnum.AUDIO_EVENT_CLASSIFY + || action == ActionEnum.VIDEO_ANALYZE; } } diff --git a/cmvr-iot-aima/src/test/java/com/cmvr/aima/support/AimaAnalysisVerdictTest.java b/cmvr-iot-aima/src/test/java/com/cmvr/aima/support/AimaAnalysisVerdictTest.java index d0a085f..03b293a 100644 --- a/cmvr-iot-aima/src/test/java/com/cmvr/aima/support/AimaAnalysisVerdictTest.java +++ b/cmvr-iot-aima/src/test/java/com/cmvr/aima/support/AimaAnalysisVerdictTest.java @@ -20,6 +20,8 @@ public class AimaAnalysisVerdictTest { assertEquals(AimaAnalysisVerdict.NOT_PASSED, AimaAnalysisVerdict.resolve(ActionEnum.VIDEO_ANALYZE, new JSONObject().fluentPut("analysisStatus", "FAILED"))); + assertNull(AimaAnalysisVerdict.resolve(ActionEnum.IMAGE_ANALYZE, + new JSONObject().fluentPut("result", "12.6"))); assertNull(AimaAnalysisVerdict.resolve(ActionEnum.SLEEP, new JSONObject().fluentPut("passed", true))); } diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeSystemService.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeSystemService.java index 7dc4f5e..3448cd7 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeSystemService.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/EdgeSystemService.java @@ -30,6 +30,13 @@ public interface EdgeSystemService { SafetyCommand.GetSafetyStateCommand.Feedback getSafetyState(String robotId); + SafetyCommand.RestoreOperationalStateCommand.Feedback restoreOperationalState( + String robotId, String reason, Integer timeoutMs); + + /** + * @deprecated Use {@link #restoreOperationalState(String, String, Integer)}. + */ + @Deprecated SafetyCommand.RecoverSafetyStateCommand.Feedback recoverSafetyState( String robotId, String reason, Integer timeoutMs); diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeSystemServiceImpl.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeSystemServiceImpl.java index a512f35..c3051d5 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeSystemServiceImpl.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/impl/EdgeSystemServiceImpl.java @@ -135,6 +135,39 @@ public class EdgeSystemServiceImpl implements EdgeSystemService { } @Override + public SafetyCommand.RestoreOperationalStateCommand.Feedback restoreOperationalState( + String robotId, String reason, Integer timeoutMs) { + if (robotId == null || robotId.trim().isEmpty()) { + throw new GlobalException("机器人ID不能为空"); + } + SafetyCommand.RestoreOperationalStateCommand.Request request = + buildRestoreOperationalStateRequest(reason, timeoutMs); + SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient( + robotId.trim(), SystemServiceGrpc.SystemServiceBlockingStub.class); + SafetyCommand.RestoreOperationalStateCommand.Feedback feedback = stub + .withDeadlineAfter(request.getTimeoutMs() + 5000L, TimeUnit.MILLISECONDS) + .restoreOperationalState(request); + requireSuccessfulHeader(feedback == null || !feedback.hasHeader() ? null : feedback.getHeader(), + "恢复机器人运行状态"); + if (!isSuccessfulRecoveryResult(feedback.getResult())) { + throw new GlobalException("恢复机器人运行状态未完成: " + feedback.getResult().name()); + } + return feedback; + } + + private SafetyCommand.RestoreOperationalStateCommand.Request buildRestoreOperationalStateRequest( + String reason, Integer timeoutMs) { + int effectiveTimeoutMs = timeoutMs == null ? 15000 : Math.max(1000, Math.min(timeoutMs, 120000)); + return SafetyCommand.RestoreOperationalStateCommand.Request.newBuilder() + .setRecoveryId(UUID.randomUUID().toString()) + .setReason(reason == null || reason.trim().isEmpty() + ? "Platform manual operational state restore" : reason.trim()) + .setTimeoutMs(effectiveTimeoutMs) + .build(); + } + + @Override + @Deprecated public SafetyCommand.RecoverSafetyStateCommand.Feedback recoverSafetyState( String robotId, String reason, Integer timeoutMs) { SafetyCommand.GetSafetyStateCommand.Feedback current = getSafetyState(robotId); diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SafetyCommand.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SafetyCommand.java index 3de90c0..0614331 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SafetyCommand.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SafetyCommand.java @@ -16597,6 +16597,2649 @@ public final class SafetyCommand { } + public interface RestoreOperationalStateCommandOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RestoreOperationalStateCommand) + com.google.protobuf.MessageOrBuilder { + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand} + */ + public static final class RestoreOperationalStateCommand extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RestoreOperationalStateCommand) + RestoreOperationalStateCommandOrBuilder { + private static final long serialVersionUID = 0L; + // Use RestoreOperationalStateCommand.newBuilder() to construct. + private RestoreOperationalStateCommand(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RestoreOperationalStateCommand() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RestoreOperationalStateCommand(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Builder.class); + } + + public interface RequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RestoreOperationalStateCommand.Request) + com.google.protobuf.MessageOrBuilder { + + /** + * string recovery_id = 1; + * @return The recoveryId. + */ + java.lang.String getRecoveryId(); + /** + * string recovery_id = 1; + * @return The bytes for recoveryId. + */ + com.google.protobuf.ByteString + getRecoveryIdBytes(); + + /** + * string reason = 2; + * @return The reason. + */ + java.lang.String getReason(); + /** + * string reason = 2; + * @return The bytes for reason. + */ + com.google.protobuf.ByteString + getReasonBytes(); + + /** + * uint32 timeout_ms = 3; + * @return The timeoutMs. + */ + int getTimeoutMs(); + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand.Request} + */ + public static final class Request extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RestoreOperationalStateCommand.Request) + RequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use Request.newBuilder() to construct. + private Request(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Request() { + recoveryId_ = ""; + reason_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Request(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.Builder.class); + } + + public static final int RECOVERY_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object recoveryId_; + /** + * string recovery_id = 1; + * @return The recoveryId. + */ + @java.lang.Override + public java.lang.String getRecoveryId() { + java.lang.Object ref = recoveryId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + recoveryId_ = s; + return s; + } + } + /** + * string recovery_id = 1; + * @return The bytes for recoveryId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getRecoveryIdBytes() { + java.lang.Object ref = recoveryId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + recoveryId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REASON_FIELD_NUMBER = 2; + private volatile java.lang.Object reason_; + /** + * string reason = 2; + * @return The reason. + */ + @java.lang.Override + public java.lang.String getReason() { + java.lang.Object ref = reason_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + reason_ = s; + return s; + } + } + /** + * string reason = 2; + * @return The bytes for reason. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getReasonBytes() { + java.lang.Object ref = reason_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + reason_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TIMEOUT_MS_FIELD_NUMBER = 3; + private int timeoutMs_; + /** + * uint32 timeout_ms = 3; + * @return The timeoutMs. + */ + @java.lang.Override + public int getTimeoutMs() { + return timeoutMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recoveryId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, recoveryId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, reason_); + } + if (timeoutMs_ != 0) { + output.writeUInt32(3, timeoutMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recoveryId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, recoveryId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, reason_); + } + if (timeoutMs_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(3, timeoutMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request)) { + return super.equals(obj); + } + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request other = (cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request) obj; + + if (!getRecoveryId() + .equals(other.getRecoveryId())) return false; + if (!getReason() + .equals(other.getReason())) return false; + if (getTimeoutMs() + != other.getTimeoutMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + RECOVERY_ID_FIELD_NUMBER; + hash = (53 * hash) + getRecoveryId().hashCode(); + hash = (37 * hash) + REASON_FIELD_NUMBER; + hash = (53 * hash) + getReason().hashCode(); + hash = (37 * hash) + TIMEOUT_MS_FIELD_NUMBER; + hash = (53 * hash) + getTimeoutMs(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand.Request} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RestoreOperationalStateCommand.Request) + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.RequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Request_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.Builder.class); + } + + // Construct using cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + recoveryId_ = ""; + + reason_ = ""; + + timeoutMs_ = 0; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request getDefaultInstanceForType() { + return cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request build() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request buildPartial() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request result = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request(this); + result.recoveryId_ = recoveryId_; + result.reason_ = reason_; + result.timeoutMs_ = timeoutMs_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request) { + return mergeFrom((cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request other) { + if (other == cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.getDefaultInstance()) return this; + if (!other.getRecoveryId().isEmpty()) { + recoveryId_ = other.recoveryId_; + onChanged(); + } + if (!other.getReason().isEmpty()) { + reason_ = other.reason_; + onChanged(); + } + if (other.getTimeoutMs() != 0) { + setTimeoutMs(other.getTimeoutMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + recoveryId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 18: { + reason_ = input.readStringRequireUtf8(); + + break; + } // case 18 + case 24: { + timeoutMs_ = input.readUInt32(); + + break; + } // case 24 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object recoveryId_ = ""; + /** + * string recovery_id = 1; + * @return The recoveryId. + */ + public java.lang.String getRecoveryId() { + java.lang.Object ref = recoveryId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + recoveryId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string recovery_id = 1; + * @return The bytes for recoveryId. + */ + public com.google.protobuf.ByteString + getRecoveryIdBytes() { + java.lang.Object ref = recoveryId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + recoveryId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string recovery_id = 1; + * @param value The recoveryId to set. + * @return This builder for chaining. + */ + public Builder setRecoveryId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + recoveryId_ = value; + onChanged(); + return this; + } + /** + * string recovery_id = 1; + * @return This builder for chaining. + */ + public Builder clearRecoveryId() { + + recoveryId_ = getDefaultInstance().getRecoveryId(); + onChanged(); + return this; + } + /** + * string recovery_id = 1; + * @param value The bytes for recoveryId to set. + * @return This builder for chaining. + */ + public Builder setRecoveryIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + recoveryId_ = value; + onChanged(); + return this; + } + + private java.lang.Object reason_ = ""; + /** + * string reason = 2; + * @return The reason. + */ + public java.lang.String getReason() { + java.lang.Object ref = reason_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + reason_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string reason = 2; + * @return The bytes for reason. + */ + public com.google.protobuf.ByteString + getReasonBytes() { + java.lang.Object ref = reason_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + reason_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string reason = 2; + * @param value The reason to set. + * @return This builder for chaining. + */ + public Builder setReason( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + reason_ = value; + onChanged(); + return this; + } + /** + * string reason = 2; + * @return This builder for chaining. + */ + public Builder clearReason() { + + reason_ = getDefaultInstance().getReason(); + onChanged(); + return this; + } + /** + * string reason = 2; + * @param value The bytes for reason to set. + * @return This builder for chaining. + */ + public Builder setReasonBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + reason_ = value; + onChanged(); + return this; + } + + private int timeoutMs_ ; + /** + * uint32 timeout_ms = 3; + * @return The timeoutMs. + */ + @java.lang.Override + public int getTimeoutMs() { + return timeoutMs_; + } + /** + * uint32 timeout_ms = 3; + * @param value The timeoutMs to set. + * @return This builder for chaining. + */ + public Builder setTimeoutMs(int value) { + + timeoutMs_ = value; + onChanged(); + return this; + } + /** + * uint32 timeout_ms = 3; + * @return This builder for chaining. + */ + public Builder clearTimeoutMs() { + + timeoutMs_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RestoreOperationalStateCommand.Request) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RestoreOperationalStateCommand.Request) + private static final cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request(); + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Request parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface FeedbackOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RestoreOperationalStateCommand.Feedback) + com.google.protobuf.MessageOrBuilder { + + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + boolean hasHeader(); + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + cmvr.api.Common.CommandHeader.Feedback getHeader(); + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder(); + + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The enum numeric value on the wire for result. + */ + int getResultValue(); + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The result. + */ + cmvr.api.SafetyCommand.SafetyOperationResult getResult(); + + /** + * uint64 previous_safety_epoch = 3; + * @return The previousSafetyEpoch. + */ + long getPreviousSafetyEpoch(); + + /** + * uint64 current_safety_epoch = 4; + * @return The currentSafetyEpoch. + */ + long getCurrentSafetyEpoch(); + + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The enum numeric value on the wire for systemState. + */ + int getSystemStateValue(); + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The systemState. + */ + cmvr.api.SafetyCommand.SystemAdmissionState getSystemState(); + + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + java.util.List + getTargetsList(); + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + cmvr.api.SafetyCommand.SafetyOperationTargetResult getTargets(int index); + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + int getTargetsCount(); + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + java.util.List + getTargetsOrBuilderList(); + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder getTargetsOrBuilder( + int index); + + /** + * string recovery_id = 7; + * @return The recoveryId. + */ + java.lang.String getRecoveryId(); + /** + * string recovery_id = 7; + * @return The bytes for recoveryId. + */ + com.google.protobuf.ByteString + getRecoveryIdBytes(); + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand.Feedback} + */ + public static final class Feedback extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RestoreOperationalStateCommand.Feedback) + FeedbackOrBuilder { + private static final long serialVersionUID = 0L; + // Use Feedback.newBuilder() to construct. + private Feedback(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private Feedback() { + result_ = 0; + systemState_ = 0; + targets_ = java.util.Collections.emptyList(); + recoveryId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new Feedback(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.Builder.class); + } + + public static final int HEADER_FIELD_NUMBER = 1; + private cmvr.api.Common.CommandHeader.Feedback header_; + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + @java.lang.Override + public boolean hasHeader() { + return header_ != null; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.Feedback getHeader() { + return header_ == null ? cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder() { + return getHeader(); + } + + public static final int RESULT_FIELD_NUMBER = 2; + private int result_; + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The enum numeric value on the wire for result. + */ + @java.lang.Override public int getResultValue() { + return result_; + } + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The result. + */ + @java.lang.Override public cmvr.api.SafetyCommand.SafetyOperationResult getResult() { + @SuppressWarnings("deprecation") + cmvr.api.SafetyCommand.SafetyOperationResult result = cmvr.api.SafetyCommand.SafetyOperationResult.valueOf(result_); + return result == null ? cmvr.api.SafetyCommand.SafetyOperationResult.UNRECOGNIZED : result; + } + + public static final int PREVIOUS_SAFETY_EPOCH_FIELD_NUMBER = 3; + private long previousSafetyEpoch_; + /** + * uint64 previous_safety_epoch = 3; + * @return The previousSafetyEpoch. + */ + @java.lang.Override + public long getPreviousSafetyEpoch() { + return previousSafetyEpoch_; + } + + public static final int CURRENT_SAFETY_EPOCH_FIELD_NUMBER = 4; + private long currentSafetyEpoch_; + /** + * uint64 current_safety_epoch = 4; + * @return The currentSafetyEpoch. + */ + @java.lang.Override + public long getCurrentSafetyEpoch() { + return currentSafetyEpoch_; + } + + public static final int SYSTEM_STATE_FIELD_NUMBER = 5; + private int systemState_; + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The enum numeric value on the wire for systemState. + */ + @java.lang.Override public int getSystemStateValue() { + return systemState_; + } + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The systemState. + */ + @java.lang.Override public cmvr.api.SafetyCommand.SystemAdmissionState getSystemState() { + @SuppressWarnings("deprecation") + cmvr.api.SafetyCommand.SystemAdmissionState result = cmvr.api.SafetyCommand.SystemAdmissionState.valueOf(systemState_); + return result == null ? cmvr.api.SafetyCommand.SystemAdmissionState.UNRECOGNIZED : result; + } + + public static final int TARGETS_FIELD_NUMBER = 6; + private java.util.List targets_; + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + @java.lang.Override + public java.util.List getTargetsList() { + return targets_; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + @java.lang.Override + public java.util.List + getTargetsOrBuilderList() { + return targets_; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + @java.lang.Override + public int getTargetsCount() { + return targets_.size(); + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + @java.lang.Override + public cmvr.api.SafetyCommand.SafetyOperationTargetResult getTargets(int index) { + return targets_.get(index); + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + @java.lang.Override + public cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder getTargetsOrBuilder( + int index) { + return targets_.get(index); + } + + public static final int RECOVERY_ID_FIELD_NUMBER = 7; + private volatile java.lang.Object recoveryId_; + /** + * string recovery_id = 7; + * @return The recoveryId. + */ + @java.lang.Override + public java.lang.String getRecoveryId() { + java.lang.Object ref = recoveryId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + recoveryId_ = s; + return s; + } + } + /** + * string recovery_id = 7; + * @return The bytes for recoveryId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getRecoveryIdBytes() { + java.lang.Object ref = recoveryId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + recoveryId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (header_ != null) { + output.writeMessage(1, getHeader()); + } + if (result_ != cmvr.api.SafetyCommand.SafetyOperationResult.SAFETY_OPERATION_RESULT_UNSPECIFIED.getNumber()) { + output.writeEnum(2, result_); + } + if (previousSafetyEpoch_ != 0L) { + output.writeUInt64(3, previousSafetyEpoch_); + } + if (currentSafetyEpoch_ != 0L) { + output.writeUInt64(4, currentSafetyEpoch_); + } + if (systemState_ != cmvr.api.SafetyCommand.SystemAdmissionState.SYSTEM_ADMISSION_STATE_UNSPECIFIED.getNumber()) { + output.writeEnum(5, systemState_); + } + for (int i = 0; i < targets_.size(); i++) { + output.writeMessage(6, targets_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recoveryId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, recoveryId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (header_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getHeader()); + } + if (result_ != cmvr.api.SafetyCommand.SafetyOperationResult.SAFETY_OPERATION_RESULT_UNSPECIFIED.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(2, result_); + } + if (previousSafetyEpoch_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(3, previousSafetyEpoch_); + } + if (currentSafetyEpoch_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeUInt64Size(4, currentSafetyEpoch_); + } + if (systemState_ != cmvr.api.SafetyCommand.SystemAdmissionState.SYSTEM_ADMISSION_STATE_UNSPECIFIED.getNumber()) { + size += com.google.protobuf.CodedOutputStream + .computeEnumSize(5, systemState_); + } + for (int i = 0; i < targets_.size(); i++) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, targets_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(recoveryId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, recoveryId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback)) { + return super.equals(obj); + } + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback other = (cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback) obj; + + if (hasHeader() != other.hasHeader()) return false; + if (hasHeader()) { + if (!getHeader() + .equals(other.getHeader())) return false; + } + if (result_ != other.result_) return false; + if (getPreviousSafetyEpoch() + != other.getPreviousSafetyEpoch()) return false; + if (getCurrentSafetyEpoch() + != other.getCurrentSafetyEpoch()) return false; + if (systemState_ != other.systemState_) return false; + if (!getTargetsList() + .equals(other.getTargetsList())) return false; + if (!getRecoveryId() + .equals(other.getRecoveryId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasHeader()) { + hash = (37 * hash) + HEADER_FIELD_NUMBER; + hash = (53 * hash) + getHeader().hashCode(); + } + hash = (37 * hash) + RESULT_FIELD_NUMBER; + hash = (53 * hash) + result_; + hash = (37 * hash) + PREVIOUS_SAFETY_EPOCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getPreviousSafetyEpoch()); + hash = (37 * hash) + CURRENT_SAFETY_EPOCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCurrentSafetyEpoch()); + hash = (37 * hash) + SYSTEM_STATE_FIELD_NUMBER; + hash = (53 * hash) + systemState_; + if (getTargetsCount() > 0) { + hash = (37 * hash) + TARGETS_FIELD_NUMBER; + hash = (53 * hash) + getTargetsList().hashCode(); + } + hash = (37 * hash) + RECOVERY_ID_FIELD_NUMBER; + hash = (53 * hash) + getRecoveryId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand.Feedback} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RestoreOperationalStateCommand.Feedback) + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.FeedbackOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.Builder.class); + } + + // Construct using cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (headerBuilder_ == null) { + header_ = null; + } else { + header_ = null; + headerBuilder_ = null; + } + result_ = 0; + + previousSafetyEpoch_ = 0L; + + currentSafetyEpoch_ = 0L; + + systemState_ = 0; + + if (targetsBuilder_ == null) { + targets_ = java.util.Collections.emptyList(); + } else { + targets_ = null; + targetsBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + recoveryId_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback getDefaultInstanceForType() { + return cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback build() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback buildPartial() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback result = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback(this); + int from_bitField0_ = bitField0_; + if (headerBuilder_ == null) { + result.header_ = header_; + } else { + result.header_ = headerBuilder_.build(); + } + result.result_ = result_; + result.previousSafetyEpoch_ = previousSafetyEpoch_; + result.currentSafetyEpoch_ = currentSafetyEpoch_; + result.systemState_ = systemState_; + if (targetsBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + targets_ = java.util.Collections.unmodifiableList(targets_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.targets_ = targets_; + } else { + result.targets_ = targetsBuilder_.build(); + } + result.recoveryId_ = recoveryId_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback) { + return mergeFrom((cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback other) { + if (other == cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.getDefaultInstance()) return this; + if (other.hasHeader()) { + mergeHeader(other.getHeader()); + } + if (other.result_ != 0) { + setResultValue(other.getResultValue()); + } + if (other.getPreviousSafetyEpoch() != 0L) { + setPreviousSafetyEpoch(other.getPreviousSafetyEpoch()); + } + if (other.getCurrentSafetyEpoch() != 0L) { + setCurrentSafetyEpoch(other.getCurrentSafetyEpoch()); + } + if (other.systemState_ != 0) { + setSystemStateValue(other.getSystemStateValue()); + } + if (targetsBuilder_ == null) { + if (!other.targets_.isEmpty()) { + if (targets_.isEmpty()) { + targets_ = other.targets_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureTargetsIsMutable(); + targets_.addAll(other.targets_); + } + onChanged(); + } + } else { + if (!other.targets_.isEmpty()) { + if (targetsBuilder_.isEmpty()) { + targetsBuilder_.dispose(); + targetsBuilder_ = null; + targets_ = other.targets_; + bitField0_ = (bitField0_ & ~0x00000001); + targetsBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ? + getTargetsFieldBuilder() : null; + } else { + targetsBuilder_.addAllMessages(other.targets_); + } + } + } + if (!other.getRecoveryId().isEmpty()) { + recoveryId_ = other.recoveryId_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + input.readMessage( + getHeaderFieldBuilder().getBuilder(), + extensionRegistry); + + break; + } // case 10 + case 16: { + result_ = input.readEnum(); + + break; + } // case 16 + case 24: { + previousSafetyEpoch_ = input.readUInt64(); + + break; + } // case 24 + case 32: { + currentSafetyEpoch_ = input.readUInt64(); + + break; + } // case 32 + case 40: { + systemState_ = input.readEnum(); + + break; + } // case 40 + case 50: { + cmvr.api.SafetyCommand.SafetyOperationTargetResult m = + input.readMessage( + cmvr.api.SafetyCommand.SafetyOperationTargetResult.parser(), + extensionRegistry); + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + targets_.add(m); + } else { + targetsBuilder_.addMessage(m); + } + break; + } // case 50 + case 58: { + recoveryId_ = input.readStringRequireUtf8(); + + break; + } // case 58 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private cmvr.api.Common.CommandHeader.Feedback header_; + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder> headerBuilder_; + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + public boolean hasHeader() { + return headerBuilder_ != null || header_ != null; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + public cmvr.api.Common.CommandHeader.Feedback getHeader() { + if (headerBuilder_ == null) { + return header_ == null ? cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } else { + return headerBuilder_.getMessage(); + } + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder setHeader(cmvr.api.Common.CommandHeader.Feedback value) { + if (headerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + header_ = value; + onChanged(); + } else { + headerBuilder_.setMessage(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder setHeader( + cmvr.api.Common.CommandHeader.Feedback.Builder builderForValue) { + if (headerBuilder_ == null) { + header_ = builderForValue.build(); + onChanged(); + } else { + headerBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder mergeHeader(cmvr.api.Common.CommandHeader.Feedback value) { + if (headerBuilder_ == null) { + if (header_ != null) { + header_ = + cmvr.api.Common.CommandHeader.Feedback.newBuilder(header_).mergeFrom(value).buildPartial(); + } else { + header_ = value; + } + onChanged(); + } else { + headerBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder clearHeader() { + if (headerBuilder_ == null) { + header_ = null; + onChanged(); + } else { + header_ = null; + headerBuilder_ = null; + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public cmvr.api.Common.CommandHeader.Feedback.Builder getHeaderBuilder() { + + onChanged(); + return getHeaderFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder() { + if (headerBuilder_ != null) { + return headerBuilder_.getMessageOrBuilder(); + } else { + return header_ == null ? + cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder> + getHeaderFieldBuilder() { + if (headerBuilder_ == null) { + headerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder>( + getHeader(), + getParentForChildren(), + isClean()); + header_ = null; + } + return headerBuilder_; + } + + private int result_ = 0; + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The enum numeric value on the wire for result. + */ + @java.lang.Override public int getResultValue() { + return result_; + } + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @param value The enum numeric value on the wire for result to set. + * @return This builder for chaining. + */ + public Builder setResultValue(int value) { + + result_ = value; + onChanged(); + return this; + } + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return The result. + */ + @java.lang.Override + public cmvr.api.SafetyCommand.SafetyOperationResult getResult() { + @SuppressWarnings("deprecation") + cmvr.api.SafetyCommand.SafetyOperationResult result = cmvr.api.SafetyCommand.SafetyOperationResult.valueOf(result_); + return result == null ? cmvr.api.SafetyCommand.SafetyOperationResult.UNRECOGNIZED : result; + } + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @param value The result to set. + * @return This builder for chaining. + */ + public Builder setResult(cmvr.api.SafetyCommand.SafetyOperationResult value) { + if (value == null) { + throw new NullPointerException(); + } + + result_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .cmvr.api.SafetyOperationResult result = 2; + * @return This builder for chaining. + */ + public Builder clearResult() { + + result_ = 0; + onChanged(); + return this; + } + + private long previousSafetyEpoch_ ; + /** + * uint64 previous_safety_epoch = 3; + * @return The previousSafetyEpoch. + */ + @java.lang.Override + public long getPreviousSafetyEpoch() { + return previousSafetyEpoch_; + } + /** + * uint64 previous_safety_epoch = 3; + * @param value The previousSafetyEpoch to set. + * @return This builder for chaining. + */ + public Builder setPreviousSafetyEpoch(long value) { + + previousSafetyEpoch_ = value; + onChanged(); + return this; + } + /** + * uint64 previous_safety_epoch = 3; + * @return This builder for chaining. + */ + public Builder clearPreviousSafetyEpoch() { + + previousSafetyEpoch_ = 0L; + onChanged(); + return this; + } + + private long currentSafetyEpoch_ ; + /** + * uint64 current_safety_epoch = 4; + * @return The currentSafetyEpoch. + */ + @java.lang.Override + public long getCurrentSafetyEpoch() { + return currentSafetyEpoch_; + } + /** + * uint64 current_safety_epoch = 4; + * @param value The currentSafetyEpoch to set. + * @return This builder for chaining. + */ + public Builder setCurrentSafetyEpoch(long value) { + + currentSafetyEpoch_ = value; + onChanged(); + return this; + } + /** + * uint64 current_safety_epoch = 4; + * @return This builder for chaining. + */ + public Builder clearCurrentSafetyEpoch() { + + currentSafetyEpoch_ = 0L; + onChanged(); + return this; + } + + private int systemState_ = 0; + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The enum numeric value on the wire for systemState. + */ + @java.lang.Override public int getSystemStateValue() { + return systemState_; + } + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @param value The enum numeric value on the wire for systemState to set. + * @return This builder for chaining. + */ + public Builder setSystemStateValue(int value) { + + systemState_ = value; + onChanged(); + return this; + } + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return The systemState. + */ + @java.lang.Override + public cmvr.api.SafetyCommand.SystemAdmissionState getSystemState() { + @SuppressWarnings("deprecation") + cmvr.api.SafetyCommand.SystemAdmissionState result = cmvr.api.SafetyCommand.SystemAdmissionState.valueOf(systemState_); + return result == null ? cmvr.api.SafetyCommand.SystemAdmissionState.UNRECOGNIZED : result; + } + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @param value The systemState to set. + * @return This builder for chaining. + */ + public Builder setSystemState(cmvr.api.SafetyCommand.SystemAdmissionState value) { + if (value == null) { + throw new NullPointerException(); + } + + systemState_ = value.getNumber(); + onChanged(); + return this; + } + /** + * .cmvr.api.SystemAdmissionState system_state = 5; + * @return This builder for chaining. + */ + public Builder clearSystemState() { + + systemState_ = 0; + onChanged(); + return this; + } + + private java.util.List targets_ = + java.util.Collections.emptyList(); + private void ensureTargetsIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + targets_ = new java.util.ArrayList(targets_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + cmvr.api.SafetyCommand.SafetyOperationTargetResult, cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder, cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder> targetsBuilder_; + + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public java.util.List getTargetsList() { + if (targetsBuilder_ == null) { + return java.util.Collections.unmodifiableList(targets_); + } else { + return targetsBuilder_.getMessageList(); + } + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public int getTargetsCount() { + if (targetsBuilder_ == null) { + return targets_.size(); + } else { + return targetsBuilder_.getCount(); + } + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public cmvr.api.SafetyCommand.SafetyOperationTargetResult getTargets(int index) { + if (targetsBuilder_ == null) { + return targets_.get(index); + } else { + return targetsBuilder_.getMessage(index); + } + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder setTargets( + int index, cmvr.api.SafetyCommand.SafetyOperationTargetResult value) { + if (targetsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTargetsIsMutable(); + targets_.set(index, value); + onChanged(); + } else { + targetsBuilder_.setMessage(index, value); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder setTargets( + int index, cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder builderForValue) { + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + targets_.set(index, builderForValue.build()); + onChanged(); + } else { + targetsBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder addTargets(cmvr.api.SafetyCommand.SafetyOperationTargetResult value) { + if (targetsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTargetsIsMutable(); + targets_.add(value); + onChanged(); + } else { + targetsBuilder_.addMessage(value); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder addTargets( + int index, cmvr.api.SafetyCommand.SafetyOperationTargetResult value) { + if (targetsBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureTargetsIsMutable(); + targets_.add(index, value); + onChanged(); + } else { + targetsBuilder_.addMessage(index, value); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder addTargets( + cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder builderForValue) { + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + targets_.add(builderForValue.build()); + onChanged(); + } else { + targetsBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder addTargets( + int index, cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder builderForValue) { + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + targets_.add(index, builderForValue.build()); + onChanged(); + } else { + targetsBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder addAllTargets( + java.lang.Iterable values) { + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll( + values, targets_); + onChanged(); + } else { + targetsBuilder_.addAllMessages(values); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder clearTargets() { + if (targetsBuilder_ == null) { + targets_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + targetsBuilder_.clear(); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public Builder removeTargets(int index) { + if (targetsBuilder_ == null) { + ensureTargetsIsMutable(); + targets_.remove(index); + onChanged(); + } else { + targetsBuilder_.remove(index); + } + return this; + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder getTargetsBuilder( + int index) { + return getTargetsFieldBuilder().getBuilder(index); + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder getTargetsOrBuilder( + int index) { + if (targetsBuilder_ == null) { + return targets_.get(index); } else { + return targetsBuilder_.getMessageOrBuilder(index); + } + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public java.util.List + getTargetsOrBuilderList() { + if (targetsBuilder_ != null) { + return targetsBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(targets_); + } + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder addTargetsBuilder() { + return getTargetsFieldBuilder().addBuilder( + cmvr.api.SafetyCommand.SafetyOperationTargetResult.getDefaultInstance()); + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder addTargetsBuilder( + int index) { + return getTargetsFieldBuilder().addBuilder( + index, cmvr.api.SafetyCommand.SafetyOperationTargetResult.getDefaultInstance()); + } + /** + * repeated .cmvr.api.SafetyOperationTargetResult targets = 6; + */ + public java.util.List + getTargetsBuilderList() { + return getTargetsFieldBuilder().getBuilderList(); + } + private com.google.protobuf.RepeatedFieldBuilderV3< + cmvr.api.SafetyCommand.SafetyOperationTargetResult, cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder, cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder> + getTargetsFieldBuilder() { + if (targetsBuilder_ == null) { + targetsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3< + cmvr.api.SafetyCommand.SafetyOperationTargetResult, cmvr.api.SafetyCommand.SafetyOperationTargetResult.Builder, cmvr.api.SafetyCommand.SafetyOperationTargetResultOrBuilder>( + targets_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + targets_ = null; + } + return targetsBuilder_; + } + + private java.lang.Object recoveryId_ = ""; + /** + * string recovery_id = 7; + * @return The recoveryId. + */ + public java.lang.String getRecoveryId() { + java.lang.Object ref = recoveryId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + recoveryId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string recovery_id = 7; + * @return The bytes for recoveryId. + */ + public com.google.protobuf.ByteString + getRecoveryIdBytes() { + java.lang.Object ref = recoveryId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + recoveryId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string recovery_id = 7; + * @param value The recoveryId to set. + * @return This builder for chaining. + */ + public Builder setRecoveryId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + recoveryId_ = value; + onChanged(); + return this; + } + /** + * string recovery_id = 7; + * @return This builder for chaining. + */ + public Builder clearRecoveryId() { + + recoveryId_ = getDefaultInstance().getRecoveryId(); + onChanged(); + return this; + } + /** + * string recovery_id = 7; + * @param value The bytes for recoveryId to set. + * @return This builder for chaining. + */ + public Builder setRecoveryIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + recoveryId_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RestoreOperationalStateCommand.Feedback) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RestoreOperationalStateCommand.Feedback) + private static final cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback(); + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Feedback parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand)) { + return super.equals(obj); + } + cmvr.api.SafetyCommand.RestoreOperationalStateCommand other = (cmvr.api.SafetyCommand.RestoreOperationalStateCommand) obj; + + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.SafetyCommand.RestoreOperationalStateCommand prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RestoreOperationalStateCommand} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RestoreOperationalStateCommand) + cmvr.api.SafetyCommand.RestoreOperationalStateCommandOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.class, cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Builder.class); + } + + // Construct using cmvr.api.SafetyCommand.RestoreOperationalStateCommand.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.SafetyCommand.internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand getDefaultInstanceForType() { + return cmvr.api.SafetyCommand.RestoreOperationalStateCommand.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand build() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand buildPartial() { + cmvr.api.SafetyCommand.RestoreOperationalStateCommand result = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.SafetyCommand.RestoreOperationalStateCommand) { + return mergeFrom((cmvr.api.SafetyCommand.RestoreOperationalStateCommand)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.SafetyCommand.RestoreOperationalStateCommand other) { + if (other == cmvr.api.SafetyCommand.RestoreOperationalStateCommand.getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RestoreOperationalStateCommand) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RestoreOperationalStateCommand) + private static final cmvr.api.SafetyCommand.RestoreOperationalStateCommand DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.SafetyCommand.RestoreOperationalStateCommand(); + } + + public static cmvr.api.SafetyCommand.RestoreOperationalStateCommand getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RestoreOperationalStateCommand parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + private static final com.google.protobuf.Descriptors.Descriptor internal_static_cmvr_api_DeviceIdList_descriptor; private static final @@ -16662,6 +19305,21 @@ public final class SafetyCommand { private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_cmvr_api_RecoverSafetyStateCommand_Feedback_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RestoreOperationalStateCommand_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RestoreOperationalStateCommand_Request_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { @@ -16750,49 +19408,59 @@ public final class SafetyCommand { "ate\0226\n\007targets\030\006 \003(\0132%.cmvr.api.SafetyOp" + "erationTargetResult\022\023\n\013recovery_id\030\007 \001(\t" + "\"G\n\004Mode\022\024\n\020MODE_UNSPECIFIED\020\000\022\017\n\013VERIFY" + - "_ONLY\020\001\022\030\n\024CLEAR_SOFTWARE_LATCH\020\002*e\n\016Saf" + - "etyTriState\022\034\n\030SAFETY_TRI_STATE_UNKNOWN\020" + - "\000\022\032\n\026SAFETY_TRI_STATE_FALSE\020\001\022\031\n\025SAFETY_" + - "TRI_STATE_TRUE\020\002*\213\001\n\017SafetyCondition\022\034\n\030" + - "SAFETY_CONDITION_UNKNOWN\020\000\022\034\n\030SAFETY_CON" + - "DITION_NOMINAL\020\001\022\037\n\033SAFETY_CONDITION_RES" + - "TRICTED\020\002\022\033\n\027SAFETY_CONDITION_UNSAFE\020\003*\236" + - "\002\n\024SystemAdmissionState\022&\n\"SYSTEM_ADMISS" + - "ION_STATE_UNSPECIFIED\020\000\022#\n\037SYSTEM_ADMISS" + - "ION_STATE_STARTING\020\001\022\037\n\033SYSTEM_ADMISSION" + - "_STATE_OPEN\020\002\022#\n\037SYSTEM_ADMISSION_STATE_" + - "STOPPING\020\003\022\"\n\036SYSTEM_ADMISSION_STATE_LAT" + - "CHED\020\004\022%\n!SYSTEM_ADMISSION_STATE_RECOVER" + - "ING\020\005\022(\n$SYSTEM_ADMISSION_STATE_SHUTTING" + - "_DOWN\020\006*\234\002\n\024DeviceAdmissionState\022&\n\"DEVI" + - "CE_ADMISSION_STATE_UNSPECIFIED\020\000\022$\n DEVI" + - "CE_ADMISSION_STATE_OBSERVING\020\001\022\037\n\033DEVICE" + - "_ADMISSION_STATE_OPEN\020\002\022\"\n\036DEVICE_ADMISS" + - "ION_STATE_BLOCKED\020\003\022&\n\"DEVICE_ADMISSION_" + - "STATE_QUARANTINED\020\004\022%\n!DEVICE_ADMISSION_" + - "STATE_RECOVERING\020\005\022\"\n\036DEVICE_ADMISSION_S" + - "TATE_REMOVED\020\006*|\n\022SafetyBlockerScope\022$\n " + - "SAFETY_BLOCKER_SCOPE_UNSPECIFIED\020\000\022\037\n\033SA" + - "FETY_BLOCKER_SCOPE_DEVICE\020\001\022\037\n\033SAFETY_BL" + - "OCKER_SCOPE_SYSTEM\020\002*\243\002\n\031SafetyRecoveryR" + - "equirement\022+\n\'SAFETY_RECOVERY_REQUIREMEN" + - "T_UNSPECIFIED\020\000\022,\n(SAFETY_RECOVERY_REQUI" + - "REMENT_REFRESH_ONLY\020\001\0224\n0SAFETY_RECOVERY" + - "_REQUIREMENT_CLEAR_SOFTWARE_LATCH\020\002\0229\n5S" + - "AFETY_RECOVERY_REQUIREMENT_HARDWARE_RELE" + - "ASE_REQUIRED\020\003\022:\n6SAFETY_RECOVERY_REQUIR" + - "EMENT_MANUAL_INSPECTION_REQUIRED\020\004*\232\003\n\025S" + - "afetyOperationResult\022\'\n#SAFETY_OPERATION" + - "_RESULT_UNSPECIFIED\020\000\022%\n!SAFETY_OPERATIO" + - "N_RESULT_SUCCEEDED\020\001\022%\n!SAFETY_OPERATION" + - "_RESULT_RECOVERED\020\002\0226\n2SAFETY_OPERATION_" + - "RESULT_VERIFIED_BUT_STILL_BLOCKED\020\003\022+\n\'S" + - "AFETY_OPERATION_RESULT_BLOCKER_REMAINS\020\004" + - "\022*\n&SAFETY_OPERATION_RESULT_EPOCH_MISMAT" + - "CH\020\005\022.\n*SAFETY_OPERATION_RESULT_NOTHING_" + - "TO_RECOVER\020\006\022%\n!SAFETY_OPERATION_RESULT_" + - "TIMED_OUT\020\007\022\"\n\036SAFETY_OPERATION_RESULT_F" + - "AILED\020\010b\006proto3" + "_ONLY\020\001\022\030\n\024CLEAR_SOFTWARE_LATCH\020\002\"\224\003\n\036Re" + + "storeOperationalStateCommand\032B\n\007Request\022" + + "\023\n\013recovery_id\030\001 \001(\t\022\016\n\006reason\030\002 \001(\t\022\022\n\n" + + "timeout_ms\030\003 \001(\r\032\255\002\n\010Feedback\0220\n\006header\030" + + "\001 \001(\0132 .cmvr.api.CommandHeader.Feedback\022" + + "/\n\006result\030\002 \001(\0162\037.cmvr.api.SafetyOperati" + + "onResult\022\035\n\025previous_safety_epoch\030\003 \001(\004\022" + + "\034\n\024current_safety_epoch\030\004 \001(\004\0224\n\014system_" + + "state\030\005 \001(\0162\036.cmvr.api.SystemAdmissionSt" + + "ate\0226\n\007targets\030\006 \003(\0132%.cmvr.api.SafetyOp" + + "erationTargetResult\022\023\n\013recovery_id\030\007 \001(\t" + + "*e\n\016SafetyTriState\022\034\n\030SAFETY_TRI_STATE_U" + + "NKNOWN\020\000\022\032\n\026SAFETY_TRI_STATE_FALSE\020\001\022\031\n\025" + + "SAFETY_TRI_STATE_TRUE\020\002*\213\001\n\017SafetyCondit" + + "ion\022\034\n\030SAFETY_CONDITION_UNKNOWN\020\000\022\034\n\030SAF" + + "ETY_CONDITION_NOMINAL\020\001\022\037\n\033SAFETY_CONDIT" + + "ION_RESTRICTED\020\002\022\033\n\027SAFETY_CONDITION_UNS" + + "AFE\020\003*\236\002\n\024SystemAdmissionState\022&\n\"SYSTEM" + + "_ADMISSION_STATE_UNSPECIFIED\020\000\022#\n\037SYSTEM" + + "_ADMISSION_STATE_STARTING\020\001\022\037\n\033SYSTEM_AD" + + "MISSION_STATE_OPEN\020\002\022#\n\037SYSTEM_ADMISSION" + + "_STATE_STOPPING\020\003\022\"\n\036SYSTEM_ADMISSION_ST" + + "ATE_LATCHED\020\004\022%\n!SYSTEM_ADMISSION_STATE_" + + "RECOVERING\020\005\022(\n$SYSTEM_ADMISSION_STATE_S" + + "HUTTING_DOWN\020\006*\234\002\n\024DeviceAdmissionState\022" + + "&\n\"DEVICE_ADMISSION_STATE_UNSPECIFIED\020\000\022" + + "$\n DEVICE_ADMISSION_STATE_OBSERVING\020\001\022\037\n" + + "\033DEVICE_ADMISSION_STATE_OPEN\020\002\022\"\n\036DEVICE" + + "_ADMISSION_STATE_BLOCKED\020\003\022&\n\"DEVICE_ADM" + + "ISSION_STATE_QUARANTINED\020\004\022%\n!DEVICE_ADM" + + "ISSION_STATE_RECOVERING\020\005\022\"\n\036DEVICE_ADMI" + + "SSION_STATE_REMOVED\020\006*|\n\022SafetyBlockerSc" + + "ope\022$\n SAFETY_BLOCKER_SCOPE_UNSPECIFIED\020" + + "\000\022\037\n\033SAFETY_BLOCKER_SCOPE_DEVICE\020\001\022\037\n\033SA" + + "FETY_BLOCKER_SCOPE_SYSTEM\020\002*\243\002\n\031SafetyRe" + + "coveryRequirement\022+\n\'SAFETY_RECOVERY_REQ" + + "UIREMENT_UNSPECIFIED\020\000\022,\n(SAFETY_RECOVER" + + "Y_REQUIREMENT_REFRESH_ONLY\020\001\0224\n0SAFETY_R" + + "ECOVERY_REQUIREMENT_CLEAR_SOFTWARE_LATCH" + + "\020\002\0229\n5SAFETY_RECOVERY_REQUIREMENT_HARDWA" + + "RE_RELEASE_REQUIRED\020\003\022:\n6SAFETY_RECOVERY" + + "_REQUIREMENT_MANUAL_INSPECTION_REQUIRED\020" + + "\004*\232\003\n\025SafetyOperationResult\022\'\n#SAFETY_OP" + + "ERATION_RESULT_UNSPECIFIED\020\000\022%\n!SAFETY_O" + + "PERATION_RESULT_SUCCEEDED\020\001\022%\n!SAFETY_OP" + + "ERATION_RESULT_RECOVERED\020\002\0226\n2SAFETY_OPE" + + "RATION_RESULT_VERIFIED_BUT_STILL_BLOCKED" + + "\020\003\022+\n\'SAFETY_OPERATION_RESULT_BLOCKER_RE" + + "MAINS\020\004\022*\n&SAFETY_OPERATION_RESULT_EPOCH" + + "_MISMATCH\020\005\022.\n*SAFETY_OPERATION_RESULT_N" + + "OTHING_TO_RECOVER\020\006\022%\n!SAFETY_OPERATION_" + + "RESULT_TIMED_OUT\020\007\022\"\n\036SAFETY_OPERATION_R" + + "ESULT_FAILED\020\010b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -16877,6 +19545,24 @@ public final class SafetyCommand { com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_cmvr_api_RecoverSafetyStateCommand_Feedback_descriptor, new java.lang.String[] { "Header", "Result", "PreviousSafetyEpoch", "CurrentSafetyEpoch", "SystemState", "Targets", "RecoveryId", }); + internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_cmvr_api_RestoreOperationalStateCommand_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor, + new java.lang.String[] { }); + internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor = + internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor.getNestedTypes().get(0); + internal_static_cmvr_api_RestoreOperationalStateCommand_Request_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RestoreOperationalStateCommand_Request_descriptor, + new java.lang.String[] { "RecoveryId", "Reason", "TimeoutMs", }); + internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor = + internal_static_cmvr_api_RestoreOperationalStateCommand_descriptor.getNestedTypes().get(1); + internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RestoreOperationalStateCommand_Feedback_descriptor, + new java.lang.String[] { "Header", "Result", "PreviousSafetyEpoch", "CurrentSafetyEpoch", "SystemState", "Targets", "RecoveryId", }); cmvr.api.Common.getDescriptor(); } diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceGrpc.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceGrpc.java index e76b364..b484b72 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceGrpc.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceGrpc.java @@ -263,6 +263,37 @@ public final class SystemServiceGrpc { return getRecoverSafetyStateMethod; } + private static volatile io.grpc.MethodDescriptor getRestoreOperationalStateMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "RestoreOperationalState", + requestType = cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.class, + responseType = cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor getRestoreOperationalStateMethod() { + io.grpc.MethodDescriptor getRestoreOperationalStateMethod; + if ((getRestoreOperationalStateMethod = SystemServiceGrpc.getRestoreOperationalStateMethod) == null) { + synchronized (SystemServiceGrpc.class) { + if ((getRestoreOperationalStateMethod = SystemServiceGrpc.getRestoreOperationalStateMethod) == null) { + SystemServiceGrpc.getRestoreOperationalStateMethod = getRestoreOperationalStateMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "RestoreOperationalState")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback.getDefaultInstance())) + .setSchemaDescriptor(new SystemServiceMethodDescriptorSupplier("RestoreOperationalState")) + .build(); + } + } + } + return getRestoreOperationalStateMethod; + } + /** * Creates a new async stub that supports all call types for the service */ @@ -367,6 +398,13 @@ public final class SystemServiceGrpc { io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRecoverSafetyStateMethod(), responseObserver); } + /** + */ + public void restoreOperationalState(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getRestoreOperationalStateMethod(), responseObserver); + } + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) .addMethod( @@ -425,6 +463,13 @@ public final class SystemServiceGrpc { cmvr.api.SafetyCommand.RecoverSafetyStateCommand.Request, cmvr.api.SafetyCommand.RecoverSafetyStateCommand.Feedback>( this, METHODID_RECOVER_SAFETY_STATE))) + .addMethod( + getRestoreOperationalStateMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request, + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback>( + this, METHODID_RESTORE_OPERATIONAL_STATE))) .build(); } } @@ -506,6 +551,14 @@ public final class SystemServiceGrpc { io.grpc.stub.ClientCalls.asyncUnaryCall( getChannel().newCall(getRecoverSafetyStateMethod(), getCallOptions()), request, responseObserver); } + + /** + */ + public void restoreOperationalState(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getRestoreOperationalStateMethod(), getCallOptions()), request, responseObserver); + } } /** @@ -577,6 +630,13 @@ public final class SystemServiceGrpc { return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getRecoverSafetyStateMethod(), getCallOptions(), request); } + + /** + */ + public cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Feedback restoreOperationalState(cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getRestoreOperationalStateMethod(), getCallOptions(), request); + } } /** @@ -656,6 +716,14 @@ public final class SystemServiceGrpc { return io.grpc.stub.ClientCalls.futureUnaryCall( getChannel().newCall(getRecoverSafetyStateMethod(), getCallOptions()), request); } + + /** + */ + public com.google.common.util.concurrent.ListenableFuture restoreOperationalState( + cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getRestoreOperationalStateMethod(), getCallOptions()), request); + } } private static final int METHODID_GET_SYSTEM_INFO = 0; @@ -666,6 +734,7 @@ public final class SystemServiceGrpc { private static final int METHODID_EXECUTE_ACTION_QUEUE = 5; private static final int METHODID_GET_SAFETY_STATE = 6; private static final int METHODID_RECOVER_SAFETY_STATE = 7; + private static final int METHODID_RESTORE_OPERATIONAL_STATE = 8; private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -716,6 +785,10 @@ public final class SystemServiceGrpc { serviceImpl.recoverSafetyState((cmvr.api.SafetyCommand.RecoverSafetyStateCommand.Request) request, (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_RESTORE_OPERATIONAL_STATE: + serviceImpl.restoreOperationalState((cmvr.api.SafetyCommand.RestoreOperationalStateCommand.Request) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; default: throw new AssertionError(); } @@ -785,6 +858,7 @@ public final class SystemServiceGrpc { .addMethod(getExecuteActionQueueMethod()) .addMethod(getGetSafetyStateMethod()) .addMethod(getRecoverSafetyStateMethod()) + .addMethod(getRestoreOperationalStateMethod()) .build(); } } diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceOuterClass.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceOuterClass.java index 97d9b5d..b293e50 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceOuterClass.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/SystemServiceOuterClass.java @@ -25,7 +25,7 @@ public final class SystemServiceOuterClass { java.lang.String[] descriptorData = { "\n\035cmvr/api/system_service.proto\022\010cmvr.ap" + "i\032\035cmvr/api/system_command.proto\032\035cmvr/a" + - "pi/safety_command.proto2\263\006\n\rSystemServic" + + "pi/safety_command.proto2\266\007\n\rSystemServic" + "e\022b\n\rGetSystemInfo\022&.cmvr.api.GetSystemI" + "nfoCommand.Request\032\'.cmvr.api.GetSystemI" + "nfoCommand.Feedback\"\000\022h\n\017GetSystemStatus" + @@ -46,7 +46,10 @@ public final class SystemServiceOuterClass { "Feedback\"\000\022q\n\022RecoverSafetyState\022+.cmvr." + "api.RecoverSafetyStateCommand.Request\032,." + "cmvr.api.RecoverSafetyStateCommand.Feedb" + - "ack\"\000b\006proto3" + "ack\"\000\022\200\001\n\027RestoreOperationalState\0220.cmvr" + + ".api.RestoreOperationalStateCommand.Requ" + + "est\0321.cmvr.api.RestoreOperationalStateCo" + + "mmand.Feedback\"\000b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/safety_command.proto b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/safety_command.proto index b227f84..4e5b774 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/safety_command.proto +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/safety_command.proto @@ -184,3 +184,21 @@ message RecoverSafetyStateCommand { string recovery_id = 7; } } + +message RestoreOperationalStateCommand { + message Request { + string recovery_id = 1; + string reason = 2; + uint32 timeout_ms = 3; + } + + message Feedback { + CommandHeader.Feedback header = 1; + SafetyOperationResult result = 2; + uint64 previous_safety_epoch = 3; + uint64 current_safety_epoch = 4; + SystemAdmissionState system_state = 5; + repeated SafetyOperationTargetResult targets = 6; + string recovery_id = 7; + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/system_service.proto b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/system_service.proto index 4426773..8fbac6a 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/system_service.proto +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/system_service.proto @@ -18,5 +18,8 @@ service SystemService { rpc ExecuteActionQueue(ActionQueueCommand.Request) returns (ActionQueueCommand.Feedback) {} rpc GetSafetyState(GetSafetyStateCommand.Request) returns (GetSafetyStateCommand.Feedback) {} - rpc RecoverSafetyState(RecoverSafetyStateCommand.Request) returns (RecoverSafetyStateCommand.Feedback) {} + rpc RecoverSafetyState(RecoverSafetyStateCommand.Request) returns (RecoverSafetyStateCommand.Feedback) { + option deprecated = true; + } + rpc RestoreOperationalState(RestoreOperationalStateCommand.Request) returns (RestoreOperationalStateCommand.Feedback) {} } diff --git a/cmvr-iot-common/pom.xml b/cmvr-iot-common/pom.xml index 402119e..b9c3f1d 100644 --- a/cmvr-iot-common/pom.xml +++ b/cmvr-iot-common/pom.xml @@ -156,6 +156,13 @@ ${swagger.annotations.version} + + junit + junit + 4.13.2 + test + + diff --git a/cmvr-iot-common/src/main/java/com/cmvr/common/core/minio/MinioService.java b/cmvr-iot-common/src/main/java/com/cmvr/common/core/minio/MinioService.java index bd560f9..68a4e82 100644 --- a/cmvr-iot-common/src/main/java/com/cmvr/common/core/minio/MinioService.java +++ b/cmvr-iot-common/src/main/java/com/cmvr/common/core/minio/MinioService.java @@ -25,6 +25,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.UUID; @Slf4j @Component @@ -96,16 +97,12 @@ public class MinioService { if (StringUtils.isBlank(originalFilename)) { throw new RuntimeException(); } - String fileName = System.currentTimeMillis() + ""; - if (originalFilename.lastIndexOf(".") >= 0) { - fileName += originalFilename.substring(originalFilename.lastIndexOf(".")); - } + String fileName = buildUniqueFileName(originalFilename); String objectName = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + "/" + fileName; try { InputStream stream = new ByteArrayInputStream(file.getBytes()); PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(path + "/" + objectName) .stream(stream, file.getSize(), -1).contentType(file.getContentType()).build(); - //文件名称相同会覆盖 minioClient.putObject(objectArgs); } catch (Exception e) { log.error("上传图片失败,", e); @@ -121,11 +118,7 @@ public class MinioService { throw new RuntimeException("文件名为空"); } - // 生成文件名,使用当前时间戳 - String fileName = System.currentTimeMillis() + ""; - if (originalFilename.lastIndexOf(".") >= 0) { - fileName += originalFilename.substring(originalFilename.lastIndexOf(".")); - } + String fileName = buildUniqueFileName(originalFilename); // 构建文件在 MinIO 中的路径 String objectName = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + "/" + fileName; @@ -178,13 +171,12 @@ public class MinioService { */ public String upload(String bucketName, String path, String name, byte[] fileByte, String contentType) { - String fileName = System.currentTimeMillis() + name.substring(name.lastIndexOf(".")); + String fileName = buildUniqueFileName(name); String objectName = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + "/" + fileName; try { InputStream stream = new ByteArrayInputStream(fileByte); PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(path + "/" + objectName) .stream(stream, fileByte.length, -1).contentType(contentType).build(); - //文件名称相同会覆盖 minioClient.putObject(objectArgs); } catch (Exception e) { log.error("上传文件失败,", e); @@ -193,6 +185,30 @@ public class MinioService { return objectName; } + /** + * Generates a collision-resistant object file name while retaining the source extension. + */ + static String buildUniqueFileName(String originalFilename) { + String extension = ""; + if (StringUtils.isNotBlank(originalFilename)) { + int separatorIndex = Math.max(originalFilename.lastIndexOf('/'), originalFilename.lastIndexOf('\\')); + int extensionIndex = originalFilename.lastIndexOf('.'); + if (extensionIndex > separatorIndex) { + extension = originalFilename.substring(extensionIndex); + } + } + String uuid = UUID.randomUUID().toString().replace("-", ""); + return System.currentTimeMillis() + "-" + uuid + extension; + } + + static String buildUniqueObjectName(String objectName) { + String normalized = StringUtils.defaultString(objectName).replace('\\', '/'); + int separatorIndex = normalized.lastIndexOf('/'); + String directory = separatorIndex >= 0 ? normalized.substring(0, separatorIndex + 1) : ""; + String originalFilename = separatorIndex >= 0 ? normalized.substring(separatorIndex + 1) : normalized; + return directory + buildUniqueFileName(originalFilename); + } + /** * 删除 @@ -265,21 +281,24 @@ public class MinioService { * @param inputStream 输入流 * @param size 文件大小 * @param contentType 内容类型 + * @return 实际写入的唯一对象名称 */ - public void uploadStream(String bucketName, String objectName, InputStream inputStream, long size, String contentType) { + public String uploadStream(String bucketName, String objectName, InputStream inputStream, long size, String contentType) { + String uniqueObjectName = buildUniqueObjectName(objectName); try { Map extraHeaders = new HashMap<>(); extraHeaders.put("x-amz-acl", "public-read"); PutObjectArgs objectArgs = PutObjectArgs.builder() .bucket(bucketName) - .object(objectName) + .object(uniqueObjectName) .stream(inputStream, size, -1) .extraHeaders(extraHeaders) .contentType(contentType) .build(); minioClient.putObject(objectArgs); + return uniqueObjectName; } catch (Exception e) { - log.error("上传文件流失败, objectName: {}", objectName, e); + log.error("上传文件流失败, objectName: {}", uniqueObjectName, e); throw new RuntimeException("上传文件流失败", e); } } diff --git a/cmvr-iot-common/src/test/java/com/cmvr/common/core/minio/MinioServiceTest.java b/cmvr-iot-common/src/test/java/com/cmvr/common/core/minio/MinioServiceTest.java new file mode 100644 index 0000000..80d1c02 --- /dev/null +++ b/cmvr-iot-common/src/test/java/com/cmvr/common/core/minio/MinioServiceTest.java @@ -0,0 +1,45 @@ +package com.cmvr.common.core.minio; + +import org.junit.Test; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class MinioServiceTest { + + @Test + public void generatesUniqueNamesUnderConcurrency() { + int count = 10_000; + Set names = ConcurrentHashMap.newKeySet(); + + IntStream.range(0, count).parallel() + .mapToObj(index -> MinioService.buildUniqueFileName("recording.mp4")) + .forEach(names::add); + + assertEquals(count, names.size()); + assertTrue(names.stream().allMatch(name -> + name.matches("\\d{13}-[0-9a-f]{32}\\.mp4"))); + } + + @Test + public void retainsExtensionAndSupportsExtensionlessNames() { + String imageName = MinioService.buildUniqueFileName("folder/archive/photo.JPG"); + String extensionlessName = MinioService.buildUniqueFileName("README"); + + assertTrue(imageName.endsWith(".JPG")); + assertFalse(extensionlessName.contains(".")); + } + + @Test + public void retainsObjectDirectoryWhenGeneratingStreamUploadName() { + String objectName = MinioService.buildUniqueObjectName("inspection/alerts/source.jpg"); + + assertTrue(objectName.matches( + "inspection/alerts/\\d{13}-[0-9a-f]{32}\\.jpg")); + } +} diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionDetectionAlertServiceImpl.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionDetectionAlertServiceImpl.java index 30bdbc5..5b19b82 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionDetectionAlertServiceImpl.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionDetectionAlertServiceImpl.java @@ -293,10 +293,11 @@ public class InspectionDetectionAlertServiceImpl implements IInspectionDetection String extension = extensionFor(image.getMediaType()); String datePath = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); - String objectName = IMAGE_OBJECT_PREFIX + "/" + datePath + "/" + alertId + extension; + String requestedObjectName = IMAGE_OBJECT_PREFIX + "/" + datePath + "/" + alertId + extension; try (ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes)) { - minioService.uploadStream(minioProperties.getBucketName(), objectName, inputStream, + String objectName = minioService.uploadStream( + minioProperties.getBucketName(), requestedObjectName, inputStream, imageBytes.length, image.getMediaType()); return new StoredImage(objectName, buildMinioUrl(objectName)); } diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java index 83fde61..5703299 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/enums/ActionEnum.java @@ -90,6 +90,7 @@ public enum ActionEnum { GET_CURRENT_PAGE("LLM", "GET_CURRENT_PAGE", "获取当前页面名称"), AUDIO_EVENT_CLASSIFY("LLM", "AUDIO_EVENT_CLASSIFY", "声音类型检测"), VIDEO_ANALYZE("LLM", "VIDEO_ANALYZE", "视频智能分析"), + IMAGE_ANALYZE("LLM", "IMAGE_ANALYZE", "通用图片分析"), // 触控交互 TI_PATH_SEARCH("EDGE", "TI_PATH_SEARCH", "路径搜索"), diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java index 701c7b9..f67f76e 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/builder/FlowModelBuilder.java @@ -178,6 +178,10 @@ public class FlowModelBuilder { // 设置动作类型 String actionStr = props.getString("action"); + if (isLegacyImageAnalysisNode(nodeJson, props)) { + actionStr = ActionEnum.IMAGE_ANALYZE.getAction(); + props.put("action", actionStr); + } ActionEnum action = ActionEnum.fromAction(actionStr); if (ObjUtil.isEmpty(action)) { throw new IllegalArgumentException("无法识别的action:" + actionStr); @@ -205,6 +209,28 @@ public class FlowModelBuilder { return wrapper; } + /** + * Early image-analysis nodes could retain TOUCH_COORDINATES metadata while already + * carrying the new component type and profile. Normalize those persisted graphs at runtime. + */ + private static boolean isLegacyImageAnalysisNode(JSONObject nodeJson, JSONObject props) { + if (!"imageAnalysis".equalsIgnoreCase(nodeJson.getString("type"))) { + return false; + } + JSONArray params = props.getJSONArray("nodeParams"); + if (params == null) { + return false; + } + for (int i = 0; i < params.size(); i++) { + JSONObject param = params.getJSONObject(i); + if ("profileCode".equals(param.getString("name")) + && "common.image_analysis.v1".equals(param.getString("input"))) { + return true; + } + } + return false; + } + /** * 解析分支条件逻辑 */ diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/FlowMediaParamResolver.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/FlowMediaParamResolver.java index a6e693f..9cf7740 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/FlowMediaParamResolver.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/FlowMediaParamResolver.java @@ -1,5 +1,7 @@ package com.cmvr.test.flow.runtime.operator; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.apache.commons.lang3.StringUtils; @@ -21,17 +23,29 @@ public final class FlowMediaParamResolver { public static List urls(JSONObject params, String name) { Object value = params == null ? null : params.get(name); if (value instanceof List values) { - List urls = new ArrayList<>(); - for (Object item : values) { - String url = normalizeUrl(item); - if (url != null && !"null".equalsIgnoreCase(url)) { - urls.add(url); - } - } - return urls; + return normalizeUrls(values); } - String url = normalizeUrl(value); - return url == null ? Collections.emptyList() : List.of(url); + String text = normalizeUrl(value); + if (text != null && text.startsWith("[") && text.endsWith("]")) { + try { + JSONArray values = JSON.parseArray(text); + return normalizeUrls(values); + } catch (Exception ignored) { + // Keep treating malformed JSON as a scalar so validation can report it upstream. + } + } + return text == null ? Collections.emptyList() : List.of(text); + } + + private static List normalizeUrls(List values) { + List urls = new ArrayList<>(); + for (Object item : values) { + String url = normalizeUrl(item); + if (url != null && !"null".equalsIgnoreCase(url)) { + urls.add(url); + } + } + return urls; } private static String normalizeUrl(Object value) { diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateService.java index 7bf2587..dec41d0 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateService.java @@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -19,27 +20,33 @@ import java.util.UUID; public class LLMMediaAnalysisOperateService implements LLMOperateService { private static final Set VIDEO_ANALYSIS_MODES = Set.of("AUTO", "FAST", "ACCURATE"); - private final MediaAnalysisClient mediaAnalysisClient; @Override public boolean supports(ActionEnum action) { - return action == ActionEnum.AUDIO_EVENT_CLASSIFY || action == ActionEnum.VIDEO_ANALYZE; + return action == ActionEnum.AUDIO_EVENT_CLASSIFY + || action == ActionEnum.VIDEO_ANALYZE + || action == ActionEnum.IMAGE_ANALYZE; } @Override public TaskNodeExecuteResult execute(TaskNodeExecuteMessage message) { JSONObject input = message.getInputParams(); boolean audio = message.getAction() == ActionEnum.AUDIO_EVENT_CLASSIFY; - String mediaParam = audio ? "audioUrl" : "videoUrl"; + boolean image = message.getAction() == ActionEnum.IMAGE_ANALYZE; + String mediaParam = audio ? "audioUrl" : (image ? "imageUrl" : "videoUrl"); + List mediaUrls = FlowMediaParamResolver.urls(input, mediaParam); String mediaUrl = FlowMediaParamResolver.lastUrl(input, mediaParam); String profileCode = StringUtils.trimToNull(input.getString("profileCode")); if (StringUtils.isBlank(mediaUrl)) { - throw new GlobalException("{}不能为空", audio ? "音频地址" : "视频地址"); + throw new GlobalException("{}不能为空", audio ? "音频地址" : (image ? "图片地址" : "视频地址")); } if (profileCode == null) { throw new GlobalException("分析场景不能为空"); } + if (image && mediaUrls.size() > 12) { + throw new GlobalException("图片分析一次最多支持12张图片"); + } JSONObject context = new JSONObject(); context.put("taskId", message.getTaskId()); @@ -58,7 +65,7 @@ public class LLMMediaAnalysisOperateService implements LLMOperateService { options.put("expectedLabel", expectedLabel); options.put("expectedLabelName", StringUtils.defaultIfBlank(expectedLabelName, expectedLabel)); } - } else { + } else if (!image) { options.put("instruction", StringUtils.defaultString(input.getString("instruction"))); String analysisMode = StringUtils.defaultIfBlank(input.getString("analysisMode"), "AUTO") .trim().toUpperCase(); @@ -67,17 +74,42 @@ public class LLMMediaAnalysisOperateService implements LLMOperateService { } options.put("analysisMode", analysisMode); options.put("decisionPolicy", "FAIL_CLOSED"); + options.put("detailedOutput", Boolean.TRUE.equals(input.getBoolean("detailedOutput"))); JSONObject tuning = buildVideoTuning(input.getJSONObject("analysisTuning")); if (!tuning.isEmpty()) { options.put("tuning", tuning); } + } else { + String analysisMode = StringUtils.defaultIfBlank(input.getString("analysisMode"), "AUTO") + .trim().toUpperCase(); + if (!VIDEO_ANALYSIS_MODES.contains(analysisMode)) { + throw new GlobalException("图片分析模式无效: {}", analysisMode); + } + String prompt = resolveImagePrompt(input); + if (StringUtils.isBlank(prompt)) { + throw new GlobalException("图片分析提示词不能为空"); + } + options.put("prompt", prompt); + options.put("analysisMode", analysisMode); + String referenceImageUrl = FlowMediaParamResolver.lastUrl(input, "referenceImageUrl"); + if (StringUtils.isNotBlank(referenceImageUrl)) { + options.put("referenceImageUrl", referenceImageUrl); + } + JSONObject tuning = buildImageTuning(input.getJSONObject("analysisTuning")); + if (!tuning.isEmpty()) { + options.put("tuning", tuning); + } } JSONObject request = new JSONObject(); request.put("requestId", buildRequestId(message)); - request.put("analysisType", audio ? "AUDIO_CLASSIFICATION" : "VIDEO_ANALYSIS"); + request.put("analysisType", audio ? "AUDIO_CLASSIFICATION" + : (image ? "IMAGE_ANALYSIS" : "VIDEO_ANALYSIS")); request.put("profileCode", profileCode); request.put("mediaUrl", mediaUrl); + if (image) { + request.put("mediaUrls", mediaUrls); + } request.put("options", options); request.put("context", context); @@ -94,6 +126,9 @@ public class LLMMediaAnalysisOperateService implements LLMOperateService { output.put("analysisModel", response.getJSONObject("model")); output.put("analysisTimingMs", response.getLong("timingMs")); output.put("mediaUrl", mediaUrl); + if (image) { + output.put("mediaUrls", mediaUrls); + } if (audio) { applyAudioVerdict(output, expectedLabel, expectedLabelName); } @@ -127,20 +162,72 @@ public class LLMMediaAnalysisOperateService implements LLMOperateService { if (source == null || source.isEmpty()) { return tuning; } - Integer maxFrames = source.getInteger("maxFrames"); + Double sampleFps = source.getDouble("sampleFps"); Integer maxWidth = source.getInteger("maxWidth"); Double confidenceThreshold = source.getDouble("confidenceThreshold"); Boolean fallbackToAccurate = source.getBoolean("fallbackToAccurate"); - validateRange("抽帧数量", maxFrames, 2, 16); + validateRange("采样帧率", sampleFps, 0.25D, 6D); validateRange("图片宽度", maxWidth, 640, 1280); validateRange("通过置信度", confidenceThreshold, 0.5D, 0.95D); - if (maxFrames != null) tuning.put("maxFrames", maxFrames); + if (sampleFps != null) tuning.put("sampleFps", sampleFps); if (maxWidth != null) tuning.put("maxWidth", maxWidth); if (confidenceThreshold != null) tuning.put("confidenceThreshold", confidenceThreshold); if (fallbackToAccurate != null) tuning.put("fallbackToAccurate", fallbackToAccurate); return tuning; } + private JSONObject buildImageTuning(JSONObject source) { + JSONObject tuning = new JSONObject(); + if (source == null || source.isEmpty()) { + return tuning; + } + Integer maxWidth = source.getInteger("maxWidth"); + Integer maxImages = source.getInteger("maxImages"); + Integer maxOutputTokens = source.getInteger("maxOutputTokens"); + validateRange("图片宽度", maxWidth, 640, 1600); + validateRange("图片数量", maxImages, 1, 12); + validateRange("最大输出长度", maxOutputTokens, 32, 4096); + if (maxWidth != null) tuning.put("maxWidth", maxWidth); + if (maxImages != null) tuning.put("maxImages", maxImages); + if (maxOutputTokens != null) tuning.put("maxOutputTokens", maxOutputTokens); + return tuning; + } + + private String resolveImagePrompt(JSONObject input) { + String prompt = StringUtils.trimToNull(input.getString("prompt")); + if (prompt != null) { + return prompt; + } + + // Old image-analysis nodes stored a fixed task type, target and pass criterion. + // Convert those fields into one neutral prompt so saved workflows remain runnable + // without retaining the old pass/fail semantics. + String target = StringUtils.trimToNull(input.getString("targetDescription")); + String instruction = StringUtils.trimToNull(input.getString("instruction")); + String taskType = StringUtils.trimToEmpty(input.getString("taskType")).toUpperCase(); + StringBuilder legacyPrompt = new StringBuilder(); + if (target != null) { + legacyPrompt.append(target); + } + if (instruction != null) { + if (!legacyPrompt.isEmpty()) { + legacyPrompt.append('\n'); + } + legacyPrompt.append(instruction); + } + if ("ICON_TEMPLATE_LOCATE".equals(taskType)) { + if (!legacyPrompt.isEmpty()) { + legacyPrompt.append('\n'); + } + legacyPrompt.append("最后一张图片是参考小图,请在其他图片中查找对应目标。"); + } + if (!legacyPrompt.isEmpty()) { + legacyPrompt.append('\n'); + } + legacyPrompt.append("只返回分析结果,不输出通过、未通过或置信度。"); + return StringUtils.trimToEmpty(legacyPrompt.toString()); + } + private void validateRange(String name, Number value, double minimum, double maximum) { if (value != null && (value.doubleValue() < minimum || value.doubleValue() > maximum)) { throw new GlobalException("{}必须在{}到{}之间", name, minimum, maximum); diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java index 1315339..b9308a2 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/FlowActionExecutorService.java @@ -327,7 +327,9 @@ public class FlowActionExecutorService { private String executeLLMAction(ActionEnum action, FlowActionRequestVO req) { log.info("LLM 执行动作: {}", action); - if (action == ActionEnum.AUDIO_EVENT_CLASSIFY || action == ActionEnum.VIDEO_ANALYZE) { + if (action == ActionEnum.AUDIO_EVENT_CLASSIFY + || action == ActionEnum.VIDEO_ANALYZE + || action == ActionEnum.IMAGE_ANALYZE) { for (LLMOperateService service : llmOperateServices) { if (service.supports(action)) { return resultToString(service.execute(buildSingleNodeMessage(action, req.getPayload()))); diff --git a/cmvr-iot-test/src/test/java/com/cmvr/test/flow/builder/FlowModelBuilderTest.java b/cmvr-iot-test/src/test/java/com/cmvr/test/flow/builder/FlowModelBuilderTest.java new file mode 100644 index 0000000..401978f --- /dev/null +++ b/cmvr-iot-test/src/test/java/com/cmvr/test/flow/builder/FlowModelBuilderTest.java @@ -0,0 +1,34 @@ +package com.cmvr.test.flow.builder; + +import com.cmvr.test.enums.ActionEnum; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class FlowModelBuilderTest { + + @Test + public void normalizesEarlyImageAnalysisNodeWithTouchAction() { + String flow = """ + { + "nodes": [{ + "id": "image-1", + "type": "imageAnalysis", + "properties": { + "name": "图片智能分析", + "action": "TOUCH_COORDINATES", + "nodeParams": [ + {"name":"profileCode","type":"input","input":"common.image_analysis.v1"}, + {"name":"imageUrl","type":"input","input":["http://minio/image.jpg"]} + ] + } + }], + "edges": [] + } + """; + + FlowGraph graph = FlowModelBuilder.buildExecutableGraph(flow); + + assertEquals(ActionEnum.IMAGE_ANALYZE, graph.getNodeMap().get("image-1").getAction()); + } +} diff --git a/cmvr-iot-test/src/test/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateServiceTest.java b/cmvr-iot-test/src/test/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateServiceTest.java index 9a1f8b6..d8ae807 100644 --- a/cmvr-iot-test/src/test/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateServiceTest.java +++ b/cmvr-iot-test/src/test/java/com/cmvr/test/flow/runtime/operator/llm/LLMMediaAnalysisOperateServiceTest.java @@ -12,6 +12,7 @@ import org.junit.Test; import java.util.concurrent.atomic.AtomicReference; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class LLMMediaAnalysisOperateServiceTest { @@ -95,8 +96,9 @@ public class LLMMediaAnalysisOperateServiceTest { .fluentPut("profileCode", "aima.power_video.v1") .fluentPut("videoUrl", "https://files.example/video.mp4") .fluentPut("analysisMode", "FAST") + .fluentPut("detailedOutput", true) .fluentPut("analysisTuning", new JSONObject() - .fluentPut("maxFrames", 8) + .fluentPut("sampleFps", 2D) .fluentPut("maxWidth", 960) .fluentPut("confidenceThreshold", 0.8D) .fluentPut("fallbackToAccurate", false)) @@ -110,8 +112,10 @@ public class LLMMediaAnalysisOperateServiceTest { assertEquals("FAST", captured.get().getJSONObject("options").getString("analysisMode")); assertEquals("FAIL_CLOSED", captured.get().getJSONObject("options").getString("decisionPolicy")); + assertEquals(true, + captured.get().getJSONObject("options").getBooleanValue("detailedOutput")); JSONObject tuning = captured.get().getJSONObject("options").getJSONObject("tuning"); - assertEquals(8, tuning.getIntValue("maxFrames")); + assertEquals(2D, tuning.getDoubleValue("sampleFps"), 0.0001D); assertEquals(960, tuning.getIntValue("maxWidth")); assertEquals(0.8D, tuning.getDoubleValue("confidenceThreshold"), 0.0001D); assertEquals(false, tuning.getBooleanValue("fallbackToAccurate")); @@ -124,11 +128,85 @@ public class LLMMediaAnalysisOperateServiceTest { .fluentPut("profileCode", "aima.power_video.v1") .fluentPut("videoUrl", "https://files.example/video.mp4") .fluentPut("analysisMode", "FAST") - .fluentPut("analysisTuning", new JSONObject().fluentPut("maxFrames", 30)); + .fluentPut("analysisTuning", new JSONObject().fluentPut("sampleFps", 6.5D)); service.execute(message(ActionEnum.VIDEO_ANALYZE, input)); } + @Test + public void forwardsMultipleImagesAndReferenceImage() { + AtomicReference captured = new AtomicReference<>(); + MediaAnalysisClient client = request -> { + captured.set(request); + return new JSONObject() + .fluentPut("status", "SUCCEEDED") + .fluentPut("analysisType", "IMAGE_ANALYSIS") + .fluentPut("profileCode", "common.image_analysis.v1") + .fluentPut("result", new JSONObject() + .fluentPut("result", new JSONObject().fluentPut("x", 120).fluentPut("y", 80)) + .fluentPut("resultText", "{\"x\":120,\"y\":80}")); + }; + LLMMediaAnalysisOperateService service = new LLMMediaAnalysisOperateService(client); + JSONObject input = new JSONObject() + .fluentPut("profileCode", "common.image_analysis.v1") + .fluentPut("imageUrl", new JSONArray() + .fluentAdd("https://files.example/scene-1.jpg") + .fluentAdd("https://files.example/scene-2.jpg")) + .fluentPut("referenceImageUrl", "https://files.example/icon.jpg") + .fluentPut("prompt", "最后一张图片是参考图,输出匹配图标的中心坐标 JSON") + .fluentPut("analysisMode", "ACCURATE") + .fluentPut("analysisTuning", new JSONObject() + .fluentPut("maxWidth", 1280) + .fluentPut("maxImages", 8) + .fluentPut("maxOutputTokens", 256)); + + TaskNodeExecuteResult result = service.execute(message(ActionEnum.IMAGE_ANALYZE, input)); + + assertTrue(result.isSuccess()); + assertEquals("IMAGE_ANALYSIS", captured.get().getString("analysisType")); + assertEquals(2, captured.get().getJSONArray("mediaUrls").size()); + JSONObject options = captured.get().getJSONObject("options"); + assertEquals("最后一张图片是参考图,输出匹配图标的中心坐标 JSON", options.getString("prompt")); + assertEquals("https://files.example/icon.jpg", options.getString("referenceImageUrl")); + assertEquals(8, options.getJSONObject("tuning").getIntValue("maxImages")); + assertEquals(256, options.getJSONObject("tuning").getIntValue("maxOutputTokens")); + assertEquals(2, result.getOutputParams().getJSONArray("mediaUrls").size()); + assertNull(result.getOutputParams().get("passed")); + } + + @Test + public void restoresStaticImageUrlArraySerializedByLegacyFlowParamModel() { + AtomicReference captured = new AtomicReference<>(); + MediaAnalysisClient client = request -> { + captured.set(request); + return new JSONObject() + .fluentPut("status", "SUCCEEDED") + .fluentPut("analysisType", "IMAGE_ANALYSIS") + .fluentPut("profileCode", "common.image_analysis.v1") + .fluentPut("result", new JSONObject() + .fluentPut("result", "图片正常") + .fluentPut("resultText", "图片正常")); + }; + LLMMediaAnalysisOperateService service = new LLMMediaAnalysisOperateService(client); + JSONObject input = new JSONObject() + .fluentPut("profileCode", "common.image_analysis.v1") + .fluentPut("taskType", "GENERAL_INSPECTION") + .fluentPut("imageUrl", "[\"http://192.168.28.10:9000/cmvr-iot/path%2Fimage.jpg\"]") + .fluentPut("targetDescription", "检查图片") + .fluentPut("instruction", "满足要求则通过") + .fluentPut("analysisTuning", "{\"maxWidth\":1120,\"confidenceThreshold\":0.7,\"maxImages\":12}"); + + service.execute(message(ActionEnum.IMAGE_ANALYZE, input)); + + assertEquals("http://192.168.28.10:9000/cmvr-iot/path%2Fimage.jpg", + captured.get().getString("mediaUrl")); + assertEquals(1, captured.get().getJSONArray("mediaUrls").size()); + assertEquals(1120, captured.get().getJSONObject("options") + .getJSONObject("tuning").getIntValue("maxWidth")); + assertTrue(captured.get().getJSONObject("options").getString("prompt").contains("检查图片")); + assertTrue(captured.get().getJSONObject("options").getString("prompt").contains("满足要求则通过")); + } + private TaskNodeExecuteMessage message(ActionEnum action, JSONObject input) { TaskNodeExecuteMessage message = new TaskNodeExecuteMessage(); message.setAction(action); diff --git a/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/CorpusInfoServiceImpl.java b/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/CorpusInfoServiceImpl.java index af4112e..efc7f60 100644 --- a/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/CorpusInfoServiceImpl.java +++ b/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/CorpusInfoServiceImpl.java @@ -153,8 +153,12 @@ public class CorpusInfoServiceImpl implements ICorpusInfoService { } try { - String objectName = "corpus/" + DateUtils.datePath() + "/" + corpusId + "_" + System.currentTimeMillis() + ".wav"; - minioService.upload("cmvr-iot", "corpus/" + DateUtils.datePath(), file); + String uploadPath = "corpus/" + DateUtils.datePath(); + String uploadedObjectName = minioService.upload("cmvr-iot", uploadPath, file); + if (StringUtils.isEmpty(uploadedObjectName)) { + throw new RuntimeException("上传音频失败"); + } + String objectName = uploadPath + "/" + uploadedObjectName; corpus.setAudioFilePath(objectName); corpus.setFileSize(file.getSize()); diff --git a/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/TtsSynthesizeTaskServiceImpl.java b/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/TtsSynthesizeTaskServiceImpl.java index deaa8a2..b08f39e 100644 --- a/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/TtsSynthesizeTaskServiceImpl.java +++ b/cmvr-iot-tts/src/main/java/com/cmvr/tts/service/impl/TtsSynthesizeTaskServiceImpl.java @@ -285,11 +285,12 @@ public class TtsSynthesizeTaskServiceImpl implements ITtsSynthesizeTaskService { if (audioBytes != null && audioBytes.length > 0) { // 上传音频到Minio - String objectName = "tts/" + DateUtils.datePath() + "/" + task.getTaskCode() + ".wav"; + String requestedObjectName = "tts/" + DateUtils.datePath() + "/" + task.getTaskCode() + ".wav"; ByteArrayInputStream inputStream = new ByteArrayInputStream(audioBytes); - + // 使用MinioService上传 - minioService.uploadStream(bucketName, objectName, inputStream, audioBytes.length, "audio/wav"); + String objectName = minioService.uploadStream( + bucketName, requestedObjectName, inputStream, audioBytes.length, "audio/wav"); // 更新任务状态 task.setStatus("2");