# GeViSoft SDK - Functions & Examples Summary **Document Version:** 2012_1.7 **Total Pages:** 113 **Total Examples Found:** 33 **Generated:** 2026-01-12 ## Table of Contents 1. [SDK Overview](#sdk-overview) 2. [Core Components](#core-components) 3. [API Functions & Methods](#api-functions--methods) 4. [Examples by Category](#examples-by-category) 5. [Testing Plan](#testing-plan) --- ## SDK Overview ### Supported Languages - **C++** (primary) - **Delphi** - **C# (.NET wrapper)** ### Main SDKs 1. **GeViProcAPI** - Flat C function calls for GeViServer communication 2. **GeViAPIClient** - Object-oriented abstraction layer over GeViProcAPI 3. **GscActions** - GeViScope action message handling ### Architecture - **Client-Server paradigm** - **GeViServer** - Backend server managing database - **GeViIO** - IO client handling peripheral connections - **GeViSet** - Configuration tool - **GeViAPITestClient** - Testing and debugging tool --- ## Core Components ### 1. Connection Management **Found in:** Chunks 2, 6, 7, 10, 11 #### Key Functions: - `GeViAPI_Database_Connect()` - Connect to GeViServer - `GeViAPI_Database_Disconnect()` - Disconnect from server - `GeViAPI_Database_Ping()` - Check connection status - Password encryption functions #### Example Implementations: 1. **Direct GeViProcAPI Connection** (Chunk 7, Pages 61-70) - Declare database handle - Encrypt password string - Create remote database object - Connect to database 2. **GeViAPIClient Connection** (Chunk 7, Pages 61-70) - Use higher-level abstraction - Simpler connection management 3. **Connection Monitoring** (Chunk 7, Pages 61-70) - Create separate monitoring thread - Send periodic pings - Auto-reconnect on failure - 10-second sleep intervals 4. **C# Connection** (Chunk 10, Pages 91-100) - Event-based connection handling - Database notification callbacks --- ### 2. Action Messages **Found in:** Chunks 3, 4, 7, 8, 10 #### Key Actions: ##### Video Control: - `CrossSwitch(IDVideoInput, IDVideoOutput, Switchmode)` - Route video signals - `ClearOutput(IDVideoOutput)` - Clear video output - Video routing and matrix control ##### Digital I/O: - `InputContact(ContactID, State)` - Digital input state - `OpenContact(ContactID)` - Open digital output - `CloseContact(ContactID)` - Close digital output ##### Timer Control: - `StartTimer(TimerID, TimerName)` - Start timer - `StopTimer(TimerID, TimerName)` - Stop timer ##### Event Control: - Event start/stop/kill operations - Event retriggering - AutoStop configuration ##### Alarm Control: - Alarm start/acknowledge/quit - Monitor group assignment - Priority-based alarm handling - Retrigger options #### Message Creation Methods: 1. **Direct Constructor** (Chunk 7, Pages 61-70) ```cpp CGeViMessage* gevimessage = new CActCustomAction(123, "HelloGeViSoft!"); ``` 2. **From ASCII String** (Chunk 7, Pages 61-70) ```cpp string buffer("CustomAction(123,\"Hello GeViSoft!\")"); CGeViMessage* gevimessage = CGeViMessage::ReadASCIIMessage( buffer.c_str(), buffer.size(), bytesRead); ``` 3. **ASCII Output** (Chunk 7, Pages 61-70) - Convert binary messages to ASCII representation 4. **C# Message Creation** (Chunk 10, Pages 91-100) ```csharp // Method 1: Instance creation GeViAct_CrossSwitch myAction = new GeViAct_CrossSwitch(7, 1, GeViTSwitchMode.sm_Normal); myDB.SendMessage(myAction); // Method 2: String-based myDB.SendMessage("CrossSwitch(7,1,0)"); ``` --- ### 3. GeViScope Integration **Found in:** Chunks 2, 8, 10, 11 #### Key Functions: - `CActGscAction` - GeViScope action wrapper - GeViScope server alias configuration - Bidirectional action passing #### Examples: 1. **Creating GeViScope Actions** (Chunk 8, Pages 71-80) ```cpp CGeViMessage* gevimessage = new CActGscAction( "YourGscServerName", GscAct_CreateCustomAction(1, L"HelloGeViScope!")); ``` 2. **Sending GeViScope Messages** (Chunk 8, Pages 71-80) - Use server alias from GeViSet configuration - See "ActionMessages -> Creating Action Messages -> Example 4" 3. **C# GeViScope Actions** (Chunk 10, Pages 91-100) ```csharp GscAct_CustomAction myGscAction = new GscAct_CustomAction(23, "HelloGeViScope!"); myDB.SendMessage("GEVISCOPE_ALIAS", myGscAction); ``` 4. **Receiving/Dispatching GeViScope Actions** (Chunk 11, Pages 101-110) - Use `GscActionDispatcher` class - Event-based dispatching - Register handlers for specific GeViScope actions - Embedded actions in `GscAction` wrapper **Configuration Required:** - GeViScope SDK installation - Connection configuration in GeViSet - Server alias setup --- ### 4. State Queries **Found in:** Chunks 8, 11 #### Query Types: - `CSQGetFirstVideoInput` - Get first video input channel - `CSQGetNextVideoInput` - Get next video input channel - `CSQGetFirstVideoOutput` - Get first video output channel - `CSQGetNextVideoOutput` - Get next video output channel - Digital I/O enumeration queries #### Usage Pattern (Chunk 8, Pages 71-80): 1. Create state query 2. Send query with `SendStateQuery(query, INFINITE)` 3. Receive `CStateAnswer` object 4. Process answer data 5. Iterate with "next" queries #### C# Implementation (Chunk 11, Pages 101-110): ```csharp GeViMessage myAnswer; GeViMessage myQuery = new GeViSQ_GetFirstVideoInput(true, true); myDB.SendQuery(myQuery, out myAnswer); if (myAnswer is GeViSA_VideoInputInfo) { // Process video input info } ``` **Timeout Control:** - Default: 3000ms - Use `INFINITE` for no timeout - C#: `SetQueryTimeoutInMs()` method --- ### 5. Database Queries **Found in:** Chunks 8, 9 #### Query Session Workflow: 1. **Create Action Query** (Chunk 9, Pages 81-90) ```cpp CDataBaseQuery* geviquery = new CDBQCreateActionQuery(0); CDataBaseAnswer* dbanswer = m_APIClient->SendDatabaseQuery(geviquery, INFINITE); ``` 2. **Get Query Handle** (Chunk 9, Pages 81-90) ```cpp if (dbanswer->m_AnswerCode == dbac_QueryHandle) { CDBQQueryHandle* handle = reinterpret_cast(dbanswer); } ``` 3. **Navigate Records** (Chunk 9, Pages 81-90) - `CDBQGetLast` - Get latest record - `CDBQGetNext` - Get next record - `CDBQGetPrev` - Get previous record - `CDBQGetFirst` - Get first record 4. **Filter Queries** (Chunk 9, Pages 81-90) - `CDBFTypeName` - Filter by action type name - `CDBFPK_GrtEqu` - Filter by primary key >= value - `CDBFPK_LowEqu` - Filter by primary key <= value - Filters use LIKE comparison: `dbc_LIKE` - Multiple filters can be combined (AND logic) 5. **Close Query Session** - Release query handle - Clean up resources #### Example: Retrieve Two Latest Actions (Chunk 9, Pages 81-90) - Create `CDBQCreateActionQuery` - Get handle from response - Send `CDBQGetLast` query - Extract primary key - Send `CDBQGetPrev` with handle and PK - Process results #### Example: Filtered Query (Chunk 9, Pages 81-90) - Filter for `CustomAction` types - With primary key between 500-600 - Send filters after obtaining handle - Iterate through filtered results --- ### 6. Event Configuration **Found in:** Chunks 4, 5 #### Event Options: | Option | Description | |--------|-------------| | Name | Event name for actions | | Description | Event description | | EventID | Event identifier | | Active | Must be checked to trigger | | Startby | Actions that trigger the event (OR logic) | | Onstart | Actions executed on start (AND logic) | | Onstop | Actions executed on stop (AND logic) | | Stopafter | Auto-stop timeout period | | Retriggerable | Allow event retriggering | #### Example: Video Routing Event (Chunk 4, Pages 31-40) **Scenario:** Digital input 3 triggers video routing - **Trigger:** `InputContact(3, true)` - Contact 3 closes - **On Start:** `CrossSwitch(3, 2, 0)` - Route input 3 to output 2 - **On Stop:** `ClearOutput(2)` - Clear output 2 - **Auto Stop:** After 5 seconds - **Retriggerable:** Yes --- ### 7. Timer Configuration **Found in:** Chunk 4 #### Timer Types: - **Periodical** - Regular intervals - **Periodical with embedded tick** - Two ticks per cycle #### Example: Beacon Light Timer (Chunk 4, Pages 31-40) **Scenario:** Toggle beacon at 1Hz - **Main Tick:** Every 1000ms → `CloseContact(2)` - Turn on - **Embedded Tick:** Every 500ms → `OpenContact(2)` - Turn off - **Control:** - Start: `StartTimer(1, "BeaconTimer")` - Stop: `StopTimer(1, "BeaconTimer")` **Timer Addressing:** - By Name: `StartTimer(0, "BeaconTimer")` - By ID: `StartTimer(1, "")` - Name takes precedence over ID --- ### 8. Alarm Configuration **Found in:** Chunks 5 #### Alarm Options: | Option | Description | |--------|-------------| | Name/Description | Alarm identification | | AlarmID | Numeric identifier | | Active | Enable/disable alarm | | Priority | 1 (high) to 10 (low) | | Monitor Group | Display target monitors | | Cameras | Video inputs to show | | Retriggerable | Allow retriggering | | Popup (Retrigger) | Show popup on retrigger | | Undo acknowledge (Retrigger) | Reset ack state on retrigger | | User specific (Retrigger) | Custom retrigger actions | #### Alarm Actions: - **Start by** - Actions that trigger alarm (OR) - **On start** - Actions on alarm start (AND) - **Acknowledge by** - Actions to acknowledge (OR) - **On acknowledge** - Actions on acknowledgment (AND) - **Quit by** - Actions to quit alarm (OR) - **On quit** - Actions on alarm quit (AND) #### Example: Parking Lot Alarm (Chunk 5, Pages 41-50) **Scenario:** Vehicle detection and barrier control 1. **Trigger:** `InputContact(1, true)` - Vehicle detected 2. **Acknowledge:** `InputContact(2, true)` - Operator button 3. **On Acknowledge:** `OpenContact(1)` - Open barrier 4. **Quit:** `InputContact(3, true)` - Vehicle passed 5. **On Quit:** `CloseContact(1)` - Close barrier 6. **Cameras:** Video inputs 4 and 7 7. **Monitor Group:** Outputs 1 and 2 --- ### 9. Callback & Notification Handling **Found in:** Chunks 6, 7, 8, 10 #### Callback Types: 1. **Database Notification Callback** (Chunk 8, Pages 71-80) - Triggered on server messages - `NFServer_NewMessage` - New message received - `NFServer_Disconnected` - Connection lost - `NFServer_GoingShutdown` - Server shutting down 2. **C# Event Handlers** (Chunk 10, Pages 91-100) - Event-based message dispatching - Register handlers for specific actions - Automatic action parsing #### Example: Receiving Messages (Chunk 8, Pages 71-80) ```cpp void DatabaseNotification(TServerNotification Notification, void* Params) { if (Notification == NFServer_NewMessage) { TMessageEntry* messageEntry = reinterpret_cast(Params); CGeViMessage* gevimessage = CGeViMessage::ReadBinMessage( messageEntry->Buffer, messageEntry->Length, noOfBytesRead); // Process message } } ``` #### C# Example: Action Events (Chunk 10, Pages 91-100) ```csharp // Register event handler myDB.ReceivedCrossSwitch += myDB_ReceivedCrossSwitch; // Handler method void myDB_ReceivedCrossSwitch(object sender, GeViAct_CrossSwitchEventArgs e) { // Process CrossSwitch action } ``` --- ## Examples by Category ### Connection Examples (6 examples) 1. **CPP_SimpleActionClient** (C++, VS2008/VS2010) - Basic connection/disconnection - Sending/receiving actions - Server notifications - Message conversion 2. **CPP_MonitoredConnectionClient** (C++, VS2008/VS2010) - Connection monitoring - Auto-reconnect on loss - Ping-based health checks 3. **CS_SimpleActionClient** (C#, VS2008/VS2010) - .NET connection handling - Event-based notifications 4. **CS_ConsoleClient** (C#, VS2008/VS2010) - Console-based client - User input parsing 5. **Delphi_SimpleActionClient** (Delphi, RAD Studio XE) - Delphi connection implementation 6. **Delphi_ConsoleClient** (Delphi, RAD Studio XE) - Delphi console client ### Video/IO Control Examples (3 examples) 1. **CrossSwitching Video** (Chunk 2, 3, Pages 11-30) - Select input and output - Route video signals - Use GeViAPI TestClient 2. **Virtual VX3 Matrix** (Chunk 2, Pages 11-20) - Configure virtual matrix - VirtualVX3 setup 3. **GeViScope Video Control** (Chunk 2, Pages 11-20) - Control GeViScope/GscView - Like analogue matrix ### Timer Examples (1 example) 1. **Beacon Timer** (Chunk 4, Pages 31-40) - Periodical with embedded tick - 1Hz toggle frequency - Digital output control ### Event Examples (1 example) 1. **Video Routing Event** (Chunk 4, Pages 31-40) - Digital input trigger - Auto-stop after 5 seconds - Retriggerable configuration ### Alarm Examples (1 example) 1. **Parking Lot Alarm** (Chunk 5, Pages 41-50) - Multi-stage alarm flow - Acknowledge/quit pattern - Monitor group routing - Camera assignment ### State Query Examples (4 examples) 1. **Enumerate Video Inputs** (Chunk 8, Pages 71-80, C++) - GetFirst/GetNext pattern - Active/enabled filtering - INFINITE timeout 2. **Enumerate Video Inputs** (Chunk 11, Pages 101-110, C#) - .NET implementation - Query timeout configuration - List building 3. **Enumerate Video Outputs** (Referenced, similar pattern) 4. **Enumerate Digital I/O** (Referenced, similar pattern) ### Database Query Examples (5 examples) 1. **Create Action Query** (Chunk 9, Pages 81-90) - Get query handle - Basic query session 2. **Retrieve Two Latest Actions** (Chunk 9, Pages 81-90) - GetLast/GetPrev navigation - Primary key extraction 3. **Filter by Action Type** (Chunk 9, Pages 81-90) - TypeName filter - LIKE comparison 4. **Filter by Primary Key Range** (Chunk 9, Pages 81-90) - PK_GrtEqu and PK_LowEqu - Range filtering 5. **Complex Filtered Query** (Chunk 9, Pages 81-90) - Multiple filters combined - CustomAction with PK 500-600 ### GeViScope Examples (4 examples) 1. **Create GeViScope Action** (Chunk 8, Pages 71-80, C++) - CActGscAction constructor - Server alias usage 2. **Send GeViScope Message** (Chunk 8, Pages 71-80) - Through GeViSoft connection 3. **Send GeViScope Action** (Chunk 10, Pages 91-100, C#) - .NET wrapper usage - GscAct_CustomAction 4. **Receive/Dispatch GeViScope Actions** (Chunk 11, Pages 101-110) - GscActionDispatcher - Event-based handling - Embedded action extraction ### Message Conversion Examples (3 examples) 1. **Binary to ASCII** (Chunk 7, Pages 61-70) - ReadASCIIMessage - ASCII representation 2. **ASCII to Binary** (Chunk 7, Pages 61-70) - Parse string messages - bytesRead tracking 3. **Direct Constructor** (Chunk 7, Pages 61-70) - Type-safe message creation - No parsing required --- ## Testing Plan ### Phase 1: Connection & Basic Communication **Duration:** Test 1-3 days #### Test Cases: 1. **TC-001: Connect to GeViServer** - Input: Server IP, username, password - Expected: Successful connection - Verify: Connection status indicator 2. **TC-002: Disconnect from GeViServer** - Pre-condition: Connected - Expected: Clean disconnection - Verify: Resources released 3. **TC-003: Connection Monitoring** - Action: Disconnect network - Expected: Auto-reconnect - Verify: Connection restored within 10s 4. **TC-004: Send Ping** - Action: Send ping command - Expected: Pong response - Verify: Latency measurement ### Phase 2: Video Control **Duration:** Test 2-4 days #### Test Cases: 5. **TC-005: Cross-Switch Video** - Input: VideoInput=7, VideoOutput=3 - Action: Send CrossSwitch(7, 3, 0) - Expected: Video routed - Verify: Output shows input 7 6. **TC-006: Clear Video Output** - Pre-condition: Video routed - Action: Send ClearOutput(3) - Expected: Output cleared - Verify: Output shows no video 7. **TC-007: Enumerate Video Inputs** - Action: GetFirstVideoInput, loop GetNextVideoInput - Expected: List of all inputs - Verify: Count matches configuration 8. **TC-008: Enumerate Video Outputs** - Action: GetFirstVideoOutput, loop GetNextVideoOutput - Expected: List of all outputs - Verify: Count matches configuration ### Phase 3: Digital I/O Control **Duration:** Test 1-2 days #### Test Cases: 9. **TC-009: Close Digital Output** - Input: ContactID=1 - Action: CloseContact(1) - Expected: Output closed - Verify: Physical contact state 10. **TC-010: Open Digital Output** - Input: ContactID=1 - Action: OpenContact(1) - Expected: Output opened - Verify: Physical contact state 11. **TC-011: Read Digital Input** - Action: Monitor InputContact events - Expected: Receive state changes - Verify: Event data matches hardware 12. **TC-012: Enumerate Digital I/O** - Action: Query all contacts - Expected: List of all contacts - Verify: Active/inactive states ### Phase 4: Timer Operations **Duration:** Test 1-2 days #### Test Cases: 13. **TC-013: Start Timer by Name** - Input: TimerName="BeaconTimer" - Action: StartTimer(0, "BeaconTimer") - Expected: Timer starts - Verify: Timer ticks received 14. **TC-014: Start Timer by ID** - Input: TimerID=1 - Action: StartTimer(1, "") - Expected: Timer starts - Verify: Timer events 15. **TC-015: Stop Timer** - Pre-condition: Timer running - Action: StopTimer(1, "BeaconTimer") - Expected: Timer stops - Verify: No more ticks 16. **TC-016: Beacon Timer (Embedded Tick)** - Configuration: MainTick=1000ms, EmbeddedTick=500ms - Expected: 1Hz toggle pattern - Verify: Digital output toggles ### Phase 5: Event Handling **Duration:** Test 2-3 days #### Test Cases: 17. **TC-017: Trigger Event by Digital Input** - Configuration: StartBy=InputContact(3, true) - Action: Close contact 3 - Expected: Event starts - Verify: OnStart actions execute 18. **TC-018: Event Auto-Stop** - Configuration: StopAfter=5 seconds - Expected: Event stops automatically - Verify: OnStop actions execute 19. **TC-019: Retrigger Event** - Configuration: Retriggerable=true - Action: Trigger again while running - Expected: Event restarts - Verify: Event counter resets 20. **TC-020: Video Routing Event** - Full scenario from documentation - Expected: Complete workflow - Verify: All actions execute ### Phase 6: Alarm Handling **Duration:** Test 2-3 days #### Test Cases: 21. **TC-021: Start Alarm** - Trigger: InputContact(1, true) - Expected: Alarm state active - Verify: OnStart actions execute 22. **TC-022: Acknowledge Alarm** - Action: InputContact(2, true) - Expected: Alarm acknowledged - Verify: OnAcknowledge actions execute 23. **TC-023: Quit Alarm** - Action: InputContact(3, true) - Expected: Alarm quit - Verify: OnQuit actions execute 24. **TC-024: Parking Lot Alarm (Full Scenario)** - Full workflow from documentation - Expected: Complete alarm lifecycle - Verify: All stages work correctly 25. **TC-025: Alarm Priority** - Configuration: Multiple alarms with different priorities - Expected: High priority displaces low - Verify: Monitor group shows correct alarm 26. **TC-026: Alarm Retriggering** - Configuration: Retriggerable=true - Action: Trigger again - Expected: Alarm restarted - Verify: Undo acknowledge if configured ### Phase 7: Database Queries **Duration:** Test 2-3 days #### Test Cases: 27. **TC-027: Create Action Query** - Action: Send CDBQCreateActionQuery - Expected: Query handle received - Verify: Handle != 0 28. **TC-028: Get Last Action** - Action: CDBQGetLast with handle - Expected: Latest action record - Verify: Primary key matches 29. **TC-029: Navigate Previous/Next** - Action: GetPrev, GetNext sequence - Expected: Sequential navigation - Verify: Record order 30. **TC-030: Filter by Action Type** - Filter: TypeName="CustomAction" - Expected: Only CustomAction records - Verify: All results are CustomAction 31. **TC-031: Filter by Primary Key Range** - Filter: PK >= 500 AND PK <= 600 - Expected: Records in range - Verify: All PKs between 500-600 32. **TC-032: Complex Multi-Filter Query** - Filters: TypeName + PK range - Expected: Combined filter results - Verify: Results match all criteria 33. **TC-033: Close Query Session** - Action: Release query handle - Expected: Resources freed - Verify: No memory leaks ### Phase 8: GeViScope Integration **Duration:** Test 2-3 days #### Test Cases: 34. **TC-034: Send GeViScope CustomAction** - Input: TypeID=123, Text="HelloGeViScope!" - Expected: Action sent to GeViScope - Verify: GeViScope receives action 35. **TC-035: Receive GeViScope Action** - Pre-condition: GeViScope sends action - Expected: Action received in GeViSoft - Verify: Correct parsing 36. **TC-036: Dispatch GeViScope Actions** - Configuration: Event handlers registered - Expected: Handlers called - Verify: Correct action types 37. **TC-037: GeViScope Server Alias** - Configuration: Multiple GeViScope servers - Action: Address by alias - Expected: Correct server receives - Verify: Alias routing works ### Phase 9: Message Conversion & Parsing **Duration:** Test 1-2 days #### Test Cases: 38. **TC-038: Binary to ASCII Conversion** - Input: Binary CGeViMessage - Expected: ASCII string output - Verify: Correct format 39. **TC-039: ASCII to Binary Conversion** - Input: "CrossSwitch(7,3,0)" - Expected: Binary CGeViMessage - Verify: Correct parsing 40. **TC-040: Direct Constructor Creation** - Action: new CActCrossSwitch(7, 3, 0) - Expected: Valid message - Verify: Type-safe construction ### Phase 10: Error Handling & Edge Cases **Duration:** Test 1-2 days #### Test Cases: 41. **TC-041: Invalid Connection Parameters** - Input: Wrong IP/password - Expected: Connection failure - Verify: Error message 42. **TC-042: Send Action While Disconnected** - Pre-condition: Not connected - Expected: Error or queue - Verify: Graceful handling 43. **TC-043: Query Timeout** - Action: Query with 1ms timeout - Expected: Timeout error - Verify: No deadlock 44. **TC-044: Invalid Action Parameters** - Input: CrossSwitch(-1, 999, 0) - Expected: Parameter validation - Verify: Error message 45. **TC-045: Server Shutdown During Operation** - Action: Stop GeViServer - Expected: NFServer_GoingShutdown - Verify: Graceful cleanup --- ## Implementation Status Tracking ### To Be Mapped Against Flutter App: - [ ] Connection management - [ ] Video control actions - [ ] Digital I/O control - [ ] Timer management - [ ] Event configuration - [ ] Alarm handling - [ ] State queries - [ ] Database queries - [ ] GeViScope integration - [ ] Message parsing - [ ] Callback handling - [ ] Error handling ### Priority Matrix: | Priority | Category | Reason | |----------|----------|--------| | P0 (Critical) | Connection Management | Foundation for all operations | | P0 (Critical) | Video Control | Core functionality | | P1 (High) | Digital I/O | Hardware integration | | P1 (High) | State Queries | System information | | P2 (Medium) | Events | Automation logic | | P2 (Medium) | Alarms | Alert handling | | P2 (Medium) | Timers | Scheduled operations | | P3 (Low) | Database Queries | Historical data | | P3 (Low) | GeViScope | Advanced integration | --- ## Notes ### Important Considerations: 1. **Thread Safety:** All callback handlers must be thread-safe 2. **Memory Management:** Call DeleteObject() on messages after use 3. **Timeouts:** Use INFINITE cautiously, prefer explicit timeouts 4. **Error Handling:** Always check answer codes before processing 5. **Query Sessions:** Close query handles to prevent resource leaks ### Configuration Prerequisites: - GeViServer must be running - GeViIO client configured for virtual or physical hardware - GeViSet configuration completed - For GeViScope: SDK installed and connection configured ### Development Tools: - **GeViAPITestClient** - Essential for testing and debugging - Use communication log to monitor action flow - Database Viewer tab for query testing - Video/DigIO tab for visual verification --- **Next Steps:** 1. Map each function to Flutter app implementation 2. Identify missing implementations 3. Prioritize implementation gaps 4. Execute test plan systematically 5. Document results and issues