feat: GeViScope SDK integration with C# Bridge and Flutter app
- Add GeViScope Bridge (C# .NET 8.0) on port 7720 - Full SDK wrapper for camera control, PTZ, actions/events - 17 REST API endpoints for GeViScope server interaction - Support for MCS (Media Channel Simulator) with 16 test channels - Real-time action/event streaming via PLC callbacks - Add GeViServer Bridge (C# .NET 8.0) on port 7710 - Integration with GeViSoft orchestration layer - Input/output control and event management - Update Python API with new routers - /api/geviscope/* - Proxy to GeViScope Bridge - /api/geviserver/* - Proxy to GeViServer Bridge - /api/excel/* - Excel import functionality - Add Flutter app GeViScope integration - GeViScopeRemoteDataSource with 17 API methods - GeViScopeBloc for state management - GeViScopeScreen with PTZ controls - App drawer navigation to GeViScope - Add SDK documentation (extracted from PDFs) - GeViScope SDK docs (7 parts + action reference) - GeViSoft SDK docs (12 chunks) - Add .mcp.json for Claude Code MCP server config Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
enum GeViScopeConnectionStatus {
|
||||
disconnected,
|
||||
connecting,
|
||||
connected,
|
||||
error,
|
||||
}
|
||||
|
||||
class MediaChannel {
|
||||
final int channelId;
|
||||
final int globalNumber;
|
||||
final String name;
|
||||
final String description;
|
||||
final bool isActive;
|
||||
|
||||
const MediaChannel({
|
||||
required this.channelId,
|
||||
required this.globalNumber,
|
||||
required this.name,
|
||||
required this.description,
|
||||
required this.isActive,
|
||||
});
|
||||
|
||||
factory MediaChannel.fromJson(Map<String, dynamic> json) {
|
||||
return MediaChannel(
|
||||
channelId: json['channelID'] ?? json['channelId'] ?? 0,
|
||||
globalNumber: json['globalNumber'] ?? 0,
|
||||
name: json['name'] ?? '',
|
||||
description: json['description'] ?? '',
|
||||
isActive: json['isActive'] ?? false,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class GeViScopeState extends Equatable {
|
||||
final GeViScopeConnectionStatus connectionStatus;
|
||||
final String? serverAddress;
|
||||
final String? username;
|
||||
final int channelCount;
|
||||
final List<MediaChannel> channels;
|
||||
final DateTime? connectedAt;
|
||||
final bool isLoading;
|
||||
final String? lastActionResult;
|
||||
final bool lastActionSuccess;
|
||||
final String? errorMessage;
|
||||
final List<String> messageLog;
|
||||
|
||||
const GeViScopeState({
|
||||
this.connectionStatus = GeViScopeConnectionStatus.disconnected,
|
||||
this.serverAddress,
|
||||
this.username,
|
||||
this.channelCount = 0,
|
||||
this.channels = const [],
|
||||
this.connectedAt,
|
||||
this.isLoading = false,
|
||||
this.lastActionResult,
|
||||
this.lastActionSuccess = false,
|
||||
this.errorMessage,
|
||||
this.messageLog = const [],
|
||||
});
|
||||
|
||||
bool get isConnected => connectionStatus == GeViScopeConnectionStatus.connected;
|
||||
|
||||
GeViScopeState copyWith({
|
||||
GeViScopeConnectionStatus? connectionStatus,
|
||||
String? serverAddress,
|
||||
String? username,
|
||||
int? channelCount,
|
||||
List<MediaChannel>? channels,
|
||||
DateTime? connectedAt,
|
||||
bool? isLoading,
|
||||
String? lastActionResult,
|
||||
bool? lastActionSuccess,
|
||||
String? errorMessage,
|
||||
List<String>? messageLog,
|
||||
bool clearServerAddress = false,
|
||||
bool clearUsername = false,
|
||||
bool clearConnectedAt = false,
|
||||
bool clearErrorMessage = false,
|
||||
bool clearLastActionResult = false,
|
||||
}) {
|
||||
return GeViScopeState(
|
||||
connectionStatus: connectionStatus ?? this.connectionStatus,
|
||||
serverAddress: clearServerAddress ? null : (serverAddress ?? this.serverAddress),
|
||||
username: clearUsername ? null : (username ?? this.username),
|
||||
channelCount: channelCount ?? this.channelCount,
|
||||
channels: channels ?? this.channels,
|
||||
connectedAt: clearConnectedAt ? null : (connectedAt ?? this.connectedAt),
|
||||
isLoading: isLoading ?? this.isLoading,
|
||||
lastActionResult: clearLastActionResult ? null : (lastActionResult ?? this.lastActionResult),
|
||||
lastActionSuccess: lastActionSuccess ?? this.lastActionSuccess,
|
||||
errorMessage: clearErrorMessage ? null : (errorMessage ?? this.errorMessage),
|
||||
messageLog: messageLog ?? this.messageLog,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
connectionStatus,
|
||||
serverAddress,
|
||||
username,
|
||||
channelCount,
|
||||
channels,
|
||||
connectedAt,
|
||||
isLoading,
|
||||
lastActionResult,
|
||||
lastActionSuccess,
|
||||
errorMessage,
|
||||
messageLog,
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user