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>
6.3 KiB
6.3 KiB
Phase 1 Completion Summary - Backend Enhancements
Completed Tasks
1. ✅ Action Categories Endpoint
Endpoint: GET /api/v1/configuration/action-categories
Response Format:
{
"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:
{
"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
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
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
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
// 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
- C:\DEV\COPILOT\geutebruck-api\src\api\routers\configuration.py
- Added 15 new action templates
- Enhanced existing templates with metadata
- Added
/action-categoriesendpoint - Total action count: 30 → 45
Next Steps (Phase 2 & 3)
Phase 2: Flutter UI Components
- Create ActionPickerDialog with two-pane layout
- Implement category dropdown + action list
- Build dynamic parameter fields based on templates
- Add description display at bottom
- Add caption and delay execution fields
Phase 3: DataTable Main View
- Replace card-based list with DataTable
- Show multiple output actions as columns
- Add row selection
- Implement Add/Edit/Remove buttons
Phase 4: Full Integration
- Wire up ActionPickerDialog to mapping editor
- Implement output action reordering
- Add validation for required fields
- 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 includesoutput_action_names/action-types- Still works, now includes enhanced metadata- New
/action-categoriesendpoint 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.