Files
geutebruck/geutebruck-api/IMPLEMENTATION_PROGRESS.md
Administrator 14893e62a5 feat: Geutebruck GeViScope/GeViSoft Action Mapping System - MVP
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>
2025-12-31 18:10:54 +01:00

5.6 KiB

Implementation Progress Summary

Completed

1. Research & Discovery

  • Extracted 2403 HTML files from SDK CHM documentation
  • Analyzed SDK architecture and identified correct approach
  • Found that action mappings are stored as Alarms with associated Actions
  • Identified database query functions: GeViDBQ_CreateActionQuery, GeViDBQ_GetFirst, GeViDBQ_GetNext
  • Identified answer types: GeViDBA_ActionEntry with GeViActionData._ActionData

2. Code Implementation

  • Created AlarmQueryService.cs - Service for querying alarms and actions via SDK
  • Updated ActionMappingHandler.cs - Modified to use AlarmQueryService instead of in-memory storage
  • Documented complete solution approach in FINAL_SOLUTION.md

3. Key Findings

Action Mapping Structure:

  • Alarms = Containers for action mappings
  • Actions = Stored separately, linked to alarms via AlarmReference
  • AlarmRelation:
    • 1 = Start/Input action (trigger)
    • 2 = Follow/Output action (response)
  • ActionData._ActionData = Actual command string (e.g., "VMD_Start(101038)")

⏸️ Current Blocker

Callback Registration Issue

The SDK callback mechanism works differently than initially expected:

Errors encountered:

  1. GeViDatabase doesn't have OnNewGeViSA_FirstAlarm event
  2. GeViSQ_GetNextAlarm requires parameters (not found in docs)
  3. GeViDBQ_GetNext/GetFirst require handle parameters
  4. OnNewGeViDBA_ActionEntry event doesn't exist

Root cause: Need to understand the actual SDK callback/dispatcher system.

Files with compilation errors:

  • SDK/AlarmQueryService.cs - Lines 103-104, 124-125, 250, 273 (event registration)
  • Lines 151, 188 (GeViSQ_GetNextAlarm parameters)
  • Lines 234, 259 (GeViDBQ query handles)

🔄 Next Steps

1. Fix Callback Registration

Need to investigate:

  • Check C:\GEVISOFT\Examples\ for callback registration examples
  • Examine GeViDatabase.RegisterCallback() implementation
  • Look for event dispatcher or message handler pattern
  • Possible that answers come through a different mechanism (e.g., message queue)

2. Alternative Approach: Action Dispatcher

The SDK may use an Action Dispatcher pattern instead of direct events:

// Possible approach:
var dispatcher = new GeViActionDispatcher();
dispatcher.RegisterHandler<GeViDBA_ActionEntry>(HandleActionEntry);
_database.SetDispatcher(dispatcher);

3. Fix Query Handle Management

Database queries likely return handles that must be tracked:

// Create query and get handle
var query = new GeViDBQ_CreateActionQuery(alarmPK);
long queryHandle = await _database.SendQueryAsync(query);

// Use handle to navigate results
var getFirst = new GeViDBQ_GetFirst(queryHandle);
await _database.SendMessageAsync(getFirst);

4. Test & Verify

Once compilation succeeds:

  1. Build SDK Bridge
  2. Start services
  3. Test API endpoint /api/v1/action-mappings
  4. Verify live data from GeViServer appears
  5. Cross-reference with GeViSet to confirm accuracy

📁 Files Modified/Created

New Files:

  • SDK/AlarmQueryService.cs - Alarm/action query service (needs callback fixes)
  • FINAL_SOLUTION.md - Complete solution documentation
  • IMPLEMENTATION_PROGRESS.md - This file
  • docs/chm-extracted/ - 2403 HTML files extracted from CHM

Modified Files:

  • SDK/ActionMappingHandler.cs - Now uses AlarmQueryService (compiles successfully)
    • Added using System.Linq;
    • Injected AlarmQueryService
    • Updated EnumerateActionMappingsAsync() to query live data

Unchanged (working):

  • SDK/GeViDatabaseWrapper.cs - Connection management
  • Program.cs - Service initialization
  • Services/ActionMappingService.cs - gRPC service layer

🎯 Solution Benefits

Once implemented, this will: Access LIVE GeViSoft configuration (not separate database) Read action mappings that exist in GeViSet Use official SDK (no direct database access) Respect GeViServer's database locking Get same data GeViSet sees Potential for real-time updates via SDK events

📚 Reference Documentation

Key SDK Classes:

  • GeViSQ_GetFirstAlarm(activeOnly, enabledOnly) - Query first alarm
  • GeViSQ_GetNextAlarm(...) - Iterate alarms (parameters unknown)
  • GeViDBQ_CreateActionQuery(alarmPK) - Query actions for alarm
  • GeViDBQ_GetFirst(handle?) - Get first result (handle param unknown)
  • GeViDBQ_GetNext(handle?) - Get next result (handle param unknown)
  • GeViDBA_ActionEntry - Action answer with:
    • sActionData._ActionData (String) - Action command
    • sAlarmRelation (Int32) - 0=none, 1=input, 2=output
    • sAlarmReference (Int64) - FK to alarm

SDK Documentation:

  • Location: C:\GEVISOFT\Documentation\GeViSoft .NET SDK API Documentation.chm
  • Extracted: C:\DEV\COPILOT\geutebruck-api\docs\chm-extracted\
  • Examples: C:\GEVISOFT\Examples\ (should check these next)

💡 Recommendations

  1. Check SDK Examples: Look at C:\GEVISOFT\Examples\ for working callback examples
  2. Ask Geutebruck Support: If callback mechanism unclear, contact vendor
  3. Fallback Option: If SDK callbacks too complex, consider hybrid:
    • Use SDK for alarms list (GeViSQ_GetFirstAlarm/GetNextAlarm)
    • For now, accept read-only alarm metadata
    • Document limitation and revisit when SDK understanding improves

Time Spent

  • CHM extraction and documentation analysis: ~30 min
  • SDK research and finding correct approach: ~45 min
  • Implementation of AlarmQueryService: ~20 min
  • Debugging compilation issues: ~15 min
  • Total: ~1h 50min

Status

🟡 In Progress - Core logic implemented, needs callback system fixes to compile