Files
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

560 lines
6.9 KiB
CSS

/*<meta />*/
body
{
font-family: Arial;
font-size: 10pt;
padding-right: 25px;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 25px;
}
h1
{
font-weight: bold;
font-size: 20pt;
}
h2
{
font-weight: bold;
font-size: 18pt;
}
h3
{
font-weight: bold;
font-size: 14.0pt;
}
h4
{
font-weight: bold;
font-size: 14pt;
font-style: italic;
}
h5
{
font-weight: bold;
font-size: 12pt;
}
h6
{
font-weight: bold;
font-size: 12pt;
font-style: italic;
}
p
{
margin-top: 0pt;
margin-bottom: 0pt;
font-size: 10pt;
}
ol,
ul
{
margin-top: 0px;
margin-bottom: 0px;
}
img
{
border: none;
max-width: 600px;
}
a.Popup
{
}
MadCap|expandingHead
{
font-style: italic;
font-weight: normal;
cursor: hand;
text-decoration: none;
color: #006600;
}
MadCap|expandingBody
{
color: #777777;
font-style: italic;
}
MadCap|dropDownHotspot
{
cursor: hand;
font-style: italic;
text-decoration: none;
color: #006600;
}
MadCap|breadcrumbsProxy
{
color: #696969;
font-size: 8pt;
font-family: Verdana;
mc-breadcrumbs-prefix: '| ';
border-bottom-color: #a9a9a9;
}
MadCap|miniTocProxy
{
color: #696969;
font-family: Verdana;
font-size: 8pt;
border-top-width: 0px;
mc-toc-depth: 4;
margin-top: 2px;
padding-left: 10px;
padding-top: 5px;
}
a.MiniTOC1
{
}
a.MiniTOC2
{
}
p.MiniTOC1
{
color: #a9a9a9;
font-family: Verdana;
font-size: 8pt;
font-weight: normal;
}
p.MiniTOC2
{
color: #a9a9a9;
font-size: 8pt;
font-family: Verdana;
font-weight: normal;
}
a.MiniTOC3
{
}
p.MiniTOC3
{
color: #a9a9a9;
font-family: Verdana;
font-size: 8pt;
font-weight: normal;
}
p.MiniTOC3
{
color: #a9a9a9;
font-size: 8pt;
font-family: Verdana;
font-weight: normal;
}
MadCap|xref
{
text-decoration: none;
color: #6b8e23;
font-size: 8pt;
mc-format: ' >> {paratext}';
}
img.marginalie
{
position: absolute;
left: 5px;
}
table
{
font-size: 8pt;
font-family: Verdana;
}
td
{
font-size: 8pt;
font-family: Verdana;
vertical-align: top;
}
tr
{
font-size: 8pt;
font-family: Verdana;
mc-table-style: url('Styles.css');
}
p.Verdana8pt
{
font-family: Verdana;
font-size: 8pt;
}
p.Zwischenueberschrift
{
font-weight: bold;
color: #696969;
}
p.marginalie
{
left: 5px;
position: absolute;
width: 95px;
font-family: Verdana;
font-size: 8pt;
}
p.Notice
{
font-size: 8pt;
color: #ffffff;
background-color: #0066ff;
padding: 1px;
font-family: Verdana;
letter-spacing: 1px;
}
p.Advice
{
color: #ffffff;
font-family: Verdana;
font-size: 8pt;
background-color: #6bbc33;
padding: 1px;
letter-spacing: 1px;
}
p.Caution
{
font-family: Verdana;
font-size: 8pt;
background-color: #fff60c;
padding: 1px;
letter-spacing: 1px;
}
p.Warning
{
font-size: 8pt;
background-color: #ff9900;
padding: 1px;
color: #ffffff;
font-family: Verdana;
letter-spacing: 1px;
}
p.Danger
{
color: #ffffff;
font-family: Verdana;
font-size: 8pt;
background-color: #ea2b03;
padding: 1px;
letter-spacing: 1px;
}
p.GutZuWissen
{
font-family: Verdana;
font-size: 8pt;
background-color: #ddedfe;
border-bottom: solid 1px;
border-bottom-color: #000000;
border-top: solid 1px;
border-top-color: #000000;
letter-spacing: 1px;
padding: 10px;
}
p.Uebrigens
{
font-family: Verdana;
font-size: 8pt;
background-color: #ccffcc;
letter-spacing: 1px;
border-bottom: solid 1px;
border-top: solid 1px;
border-top-color: #c0c0c0;
border-bottom-color: #c0c0c0;
padding: 10px;
}
p.CODEetc
{
font-family: 'Courier New';
font-size: 9pt;
color: #808080;
}
span.CODEetc
{
font-family: 'Courier New';
font-size: 9pt;
color: #696969;
}
span.Diverse
{
font-family: Verdana;
letter-spacing: 1px;
font-size: 10pt;
}
span.Header
{
font-weight: bold;
vertical-align: 10px;
}
span.Font8pt
{
font-size: 8pt;
}
p.Beispiel
{
font-size: 8pt;
letter-spacing: 1px;
border-bottom: solid 1px;
border-top: solid 1px;
background-color: #fdf5e6;
border-bottom-color: #c0c0c0;
border-top-color: #c0c0c0;
font-family: Verdana;
padding: 10px;
}
@media print
{
body
{
padding-left: 25px;
}
p.Notice
{
background-color: #0066ff;
}
p.Advice
{
background-color: #6bbc03;
}
p.Caution
{
background-color: #fff60c;
}
p.Danger
{
background-color: #ea2b03;
}
p.Warning
{
background-color: #ff9900;
}
p.marginalie
{
font-family: Verdana;
letter-spacing: 2px;
left: 0px;
width: 0px;
font-size: 10pt;
display: inherit;
}
p.Seitenumbruch
{
page-break-after: always;
}
a:visited
{
font-size: 9pt;
}
}
p.NoticePrint
{
font-family: Verdana;
font-size: 8pt;
background-color: #cce0ff;
padding: 10px;
}
p.AdvicePrint
{
font-family: Verdana;
font-size: 8pt;
background-color: #e1f2d6;
padding: 10px;
}
p.CautionPrint
{
font-family: Verdana;
font-size: 8pt;
background-color: #fffdce;
padding: 10px;
}
p.DangerPrint
{
font-family: Verdana;
font-size: 8pt;
background-color: #fbd5cd;
padding: 10px;
}
p.WarningPrint
{
font-family: Verdana;
font-size: 8pt;
background-color: #ffebcc;
padding: 10px;
}
p.BeispielHeader
{
letter-spacing: 2px;
font-family: Verdana;
}
p.GutZuWissenHeader
{
letter-spacing: 2px;
font-family: Verdana;
}
p.UebrigensHeader
{
letter-spacing: 2px;
font-family: Verdana;
}
@media non-print
{
p.marginalie
{
font-size: 8pt;
}
a:link
{
font-family: Verdana;
font-size: 8pt;
}
a:visited
{
font-family: Verdana;
font-size: 8pt;
}
}
img.padding600
{
padding-bottom: 10px;
padding-top: 10px;
}
a.MCBreadcrumbsLink:link
{
text-decoration: none;
color: #6b8e23;
font-size: 8pt;
}
a.MCBreadcrumbsLink:visited
{
text-decoration: none;
color: #a9a9a9;
font-size: 8pt;
}
a.MiniTOC1:link
{
color: #a9a9a9;
font-size: 8pt;
font-family: Verdana;
text-decoration: none;
font-weight: normal;
}
a.MiniTOC1:visited
{
color: #a9a9a9;
font-family: Verdana;
font-size: 8pt;
text-decoration: none;
font-weight: normal;
}
a.MiniTOC2:link
{
color: #a9a9a9;
font-size: 8pt;
font-family: Verdana;
text-decoration: none;
font-weight: normal;
}
a.MiniTOC2:visited
{
color: #a9a9a9;
font-family: Verdana;
font-size: 8pt;
text-decoration: none;
font-weight: normal;
}
a.MiniTOC3:link
{
color: #a9a9a9;
font-size: 8pt;
font-family: Verdana;
text-decoration: none;
font-weight: normal;
}
a.MiniTOC3:visited
{
color: #a9a9a9;
font-family: Verdana;
font-size: 8pt;
text-decoration: none;
font-weight: normal;
}
a:link
{
color: #6b8e23;
text-decoration: none;
font-size: 9pt;
}
a:visited
{
text-decoration: none;
color: #808080;
}