This MVP release provides a complete full-stack solution for managing action mappings in Geutebruck's GeViScope and GeViSoft video surveillance systems. ## Features ### Flutter Web Application (Port 8081) - Modern, responsive UI for managing action mappings - Action picker dialog with full parameter configuration - Support for both GSC (GeViScope) and G-Core server actions - Consistent UI for input and output actions with edit/delete capabilities - Real-time action mapping creation, editing, and deletion - Server categorization (GSC: prefix for GeViScope, G-Core: prefix for G-Core servers) ### FastAPI REST Backend (Port 8000) - RESTful API for action mapping CRUD operations - Action template service with comprehensive action catalog (247 actions) - Server management (G-Core and GeViScope servers) - Configuration tree reading and writing - JWT authentication with role-based access control - PostgreSQL database integration ### C# SDK Bridge (gRPC, Port 50051) - Native integration with GeViSoft SDK (GeViProcAPINET_4_0.dll) - Action mapping creation with correct binary format - Support for GSC and G-Core action types - Proper Camera parameter inclusion in action strings (fixes CrossSwitch bug) - Action ID lookup table with server-specific action IDs - Configuration reading/writing via SetupClient ## Bug Fixes - **CrossSwitch Bug**: GSC and G-Core actions now correctly display camera/PTZ head parameters in GeViSet - Action strings now include Camera parameter: `@ PanLeft (Comment: "", Camera: 101028)` - Proper filter flags and VideoInput=0 for action mappings - Correct action ID assignment (4198 for GSC, 9294 for G-Core PanLeft) ## Technical Stack - **Frontend**: Flutter Web, Dart, Dio HTTP client - **Backend**: Python FastAPI, PostgreSQL, Redis - **SDK Bridge**: C# .NET 8.0, gRPC, GeViSoft SDK - **Authentication**: JWT tokens - **Configuration**: GeViSoft .set files (binary format) ## Credentials - GeViSoft/GeViScope: username=sysadmin, password=masterkey - Default admin: username=admin, password=admin123 ## Deployment All services run on localhost: - Flutter Web: http://localhost:8081 - FastAPI: http://localhost:8000 - SDK Bridge gRPC: localhost:50051 - GeViServer: localhost (default port) Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
225 lines
6.3 KiB
Markdown
225 lines
6.3 KiB
Markdown
# Phase 1 Completion Summary - Backend Enhancements
|
|
|
|
## Completed Tasks
|
|
|
|
### 1. ✅ Action Categories Endpoint
|
|
**Endpoint:** `GET /api/v1/configuration/action-categories`
|
|
|
|
**Response Format:**
|
|
```json
|
|
{
|
|
"categories": {
|
|
"Camera Control": ["PanLeft", "PanRight", "PanStop", ...],
|
|
"Video Switching": ["CrossSwitch C -> M", "CrossSwitch OpCon -> Matrix"],
|
|
"System": ["SystemWarning", "SystemError", ...],
|
|
...
|
|
},
|
|
"total_categories": 10,
|
|
"total_actions": 45
|
|
}
|
|
```
|
|
|
|
**Categories Available:**
|
|
- **Camera Control** (22 actions) - Pan, Tilt, Zoom, Focus, Iris, Presets, Movement
|
|
- **System** (7 actions) - Warnings, Errors, Info, Video sync/contrast notifications
|
|
- **Viewer** (3 actions) - Live connections, disconnections
|
|
- **Events** (3 actions) - Start, Stop, Kill
|
|
- **Digital I/O** (2 actions) - Contact activation/deactivation
|
|
- **Recording** (2 actions) - Start/Stop recording
|
|
- **Video Switching** (2 actions) - CrossSwitch operations
|
|
- **Custom** (2 actions) - GSC and GNG custom actions
|
|
- **Alarms** (1 action) - Alarm recording
|
|
- **Input** (1 action) - Input contact triggers
|
|
|
|
### 2. ✅ Enhanced Action Templates
|
|
All action templates now include:
|
|
- **description** - Detailed description of what the action does
|
|
- **category** - Category for organization
|
|
- **required_caption** - Whether a caption field is required
|
|
- **supports_delay** - Whether delay execution is supported
|
|
- **parameter_types** (optional) - Data types for parameters
|
|
|
|
**Example Enhanced Template:**
|
|
```json
|
|
{
|
|
"action_name": "PanStop",
|
|
"parameters": ["GCoreServer", "PTZ head"],
|
|
"description": "Stop pan movement. The panning of the camera will be stopped.",
|
|
"category": "Camera Control",
|
|
"required_caption": true,
|
|
"supports_delay": true
|
|
}
|
|
```
|
|
|
|
### 3. ✅ Expanded Action Library
|
|
Increased from 30 to **45 actions** covering:
|
|
|
|
**Camera Control:**
|
|
- Basic: Pan, Tilt, Zoom, Focus, Iris operations
|
|
- Advanced: Move to absolute/relative position, Move by speed, Auto pan
|
|
- Presets: Save and recall preset positions
|
|
|
|
**System Actions:**
|
|
- SystemWarning, SystemError, SystemInfo
|
|
- VideoSyncFailure, VideoSyncOk
|
|
- VideoContrastAlarm, VideoContrastOk
|
|
|
|
**Video Actions:**
|
|
- ViewerConnectLive (with parameters)
|
|
- CrossSwitch operations
|
|
|
|
**Custom Actions:**
|
|
- GscCustomAction - for custom GSC commands
|
|
- GNGCustomAction - for custom GNG commands
|
|
|
|
**Input Actions:**
|
|
- InputContact - for digital input triggers
|
|
|
|
## API Endpoints Summary
|
|
|
|
| Endpoint | Method | Description |
|
|
|----------|--------|-------------|
|
|
| `/api/v1/configuration/action-types` | GET | Get all action templates |
|
|
| `/api/v1/configuration/action-types/{name}` | GET | Get specific action template |
|
|
| `/api/v1/configuration/action-categories` | GET | Get actions grouped by category |
|
|
|
|
## Testing Results
|
|
|
|
All endpoints tested and working:
|
|
- ✅ Categories endpoint returns 10 categories with 45 actions
|
|
- ✅ Action templates include enhanced metadata
|
|
- ✅ Descriptions match native GeViSet app
|
|
- ✅ Parameter types defined for form generation
|
|
|
|
## Usage for Flutter App
|
|
|
|
### 1. On App Startup - Load Categories
|
|
```dart
|
|
final response = await http.get(
|
|
Uri.parse('$apiUrl/action-categories'),
|
|
headers: {'Authorization': 'Bearer $token'},
|
|
);
|
|
|
|
final categories = jsonDecode(response.body)['categories'];
|
|
// categories = {
|
|
// "Camera Control": ["PanLeft", "PanRight", ...],
|
|
// "Video Switching": [...],
|
|
// ...
|
|
// }
|
|
```
|
|
|
|
### 2. Build Category Dropdown
|
|
```dart
|
|
DropdownButton<String>(
|
|
value: selectedCategory,
|
|
items: categories.keys.map((category) =>
|
|
DropdownMenuItem(value: category, child: Text(category))
|
|
).toList(),
|
|
onChanged: (category) {
|
|
setState(() {
|
|
selectedCategory = category;
|
|
// Load actions for this category
|
|
});
|
|
},
|
|
)
|
|
```
|
|
|
|
### 3. Display Actions in Category
|
|
```dart
|
|
ListView.builder(
|
|
itemCount: categories[selectedCategory].length,
|
|
itemBuilder: (context, index) {
|
|
final actionName = categories[selectedCategory][index];
|
|
return ListTile(
|
|
title: Text(actionName),
|
|
onTap: () => _selectAction(actionName),
|
|
);
|
|
},
|
|
)
|
|
```
|
|
|
|
### 4. Show Action Details
|
|
```dart
|
|
// Fetch full action template
|
|
final response = await http.get(
|
|
Uri.parse('$apiUrl/action-types/$actionName'),
|
|
headers: {'Authorization': 'Bearer $token'},
|
|
);
|
|
|
|
final template = jsonDecode(response.body);
|
|
|
|
// Show description
|
|
Text(template['description']);
|
|
|
|
// Generate parameter fields
|
|
for (var param in template['parameters']) {
|
|
TextField(
|
|
decoration: InputDecoration(labelText: param),
|
|
);
|
|
}
|
|
|
|
// Show caption field if required
|
|
if (template['required_caption'] == true) {
|
|
TextField(
|
|
decoration: InputDecoration(labelText: 'Caption (required)'),
|
|
);
|
|
}
|
|
|
|
// Show delay field if supported
|
|
if (template['supports_delay'] == true) {
|
|
TextField(
|
|
decoration: InputDecoration(
|
|
labelText: 'Delay execution',
|
|
suffixText: 'ms',
|
|
),
|
|
);
|
|
}
|
|
```
|
|
|
|
## Files Modified
|
|
|
|
1. **C:\DEV\COPILOT\geutebruck-api\src\api\routers\configuration.py**
|
|
- Added 15 new action templates
|
|
- Enhanced existing templates with metadata
|
|
- Added `/action-categories` endpoint
|
|
- Total action count: 30 → 45
|
|
|
|
## Next Steps (Phase 2 & 3)
|
|
|
|
### Phase 2: Flutter UI Components
|
|
1. Create ActionPickerDialog with two-pane layout
|
|
2. Implement category dropdown + action list
|
|
3. Build dynamic parameter fields based on templates
|
|
4. Add description display at bottom
|
|
5. Add caption and delay execution fields
|
|
|
|
### Phase 3: DataTable Main View
|
|
1. Replace card-based list with DataTable
|
|
2. Show multiple output actions as columns
|
|
3. Add row selection
|
|
4. Implement Add/Edit/Remove buttons
|
|
|
|
### Phase 4: Full Integration
|
|
1. Wire up ActionPickerDialog to mapping editor
|
|
2. Implement output action reordering
|
|
3. Add validation for required fields
|
|
4. Test full workflow: List → Edit → Pick Action → Set Parameters → Save
|
|
|
|
## Performance Notes
|
|
|
|
- All action templates loaded in-memory (45 templates = ~10KB)
|
|
- Categories computed on-demand (fast, <1ms)
|
|
- Action names sorted alphabetically within categories
|
|
- No database queries - all static data
|
|
|
|
## Backward Compatibility
|
|
|
|
✅ All existing endpoints remain unchanged:
|
|
- `/action-mappings` - Still works, now includes `output_action_names`
|
|
- `/action-types` - Still works, now includes enhanced metadata
|
|
- New `/action-categories` endpoint is additive
|
|
|
|
## Ready for Flutter Development
|
|
|
|
The backend is now ready for Flutter app Phase 2 development. All necessary data is available through clean REST APIs with proper authentication and authorization.
|