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>
This commit is contained in:
@@ -0,0 +1,421 @@
|
||||
/*<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;
|
||||
}
|
||||
|
||||
a.MCBreadcrumbsLink:link
|
||||
{
|
||||
text-decoration: none;
|
||||
color: #6b8e23;
|
||||
}
|
||||
|
||||
a.MCBreadcrumbsLink:visited
|
||||
{
|
||||
text-decoration: none;
|
||||
color: #a9a9a9;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
a.MiniTOC1
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
a:link
|
||||
{
|
||||
color: #6b8e23;
|
||||
text-decoration: none;
|
||||
font-size: 9pt;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
a:visited
|
||||
{
|
||||
text-decoration: none;
|
||||
color: #808080;
|
||||
font-style: italic;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
p.Zwischenueberschrift
|
||||
{
|
||||
font-weight: bold;
|
||||
color: #696969;
|
||||
}
|
||||
|
||||
p.marginalie
|
||||
{
|
||||
left: 5px;
|
||||
position: absolute;
|
||||
font-size: 8pt;
|
||||
width: 95px;
|
||||
}
|
||||
|
||||
p.Notice
|
||||
{
|
||||
font-family: Verdana;
|
||||
font-size: 8pt;
|
||||
background-color: #0066ff;
|
||||
color: #ffffff;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
p.Advice
|
||||
{
|
||||
color: #ffffff;
|
||||
font-family: Verdana;
|
||||
font-size: 8pt;
|
||||
background-color: #6bbc33;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
p.Caution
|
||||
{
|
||||
font-family: Verdana;
|
||||
font-size: 8pt;
|
||||
background-color: #fff60c;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
p.Warning
|
||||
{
|
||||
font-family: Verdana;
|
||||
font-size: 8pt;
|
||||
background-color: #ff9900;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
p.Danger
|
||||
{
|
||||
color: #ffffff;
|
||||
font-family: Verdana;
|
||||
font-size: 8pt;
|
||||
background-color: #ea2b03;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
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: 5px;
|
||||
}
|
||||
|
||||
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;
|
||||
padding: 5px;
|
||||
border-bottom-color: #c0c0c0;
|
||||
}
|
||||
|
||||
p.WhatsNew
|
||||
{
|
||||
font-variant: small-caps;
|
||||
font-family: Verdana;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
p.CODEetc
|
||||
{
|
||||
font-family: 'Courier New';
|
||||
font-size: 9pt;
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
span.CODEetc
|
||||
{
|
||||
color: #808080;
|
||||
font-family: 'Courier New';
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
span.WhatsNew
|
||||
{
|
||||
font-variant: small-caps;
|
||||
font-family: Verdana;
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
span.Header
|
||||
{
|
||||
font-weight: bold;
|
||||
vertical-align: 10px;
|
||||
}
|
||||
|
||||
span.Font8pt
|
||||
{
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
p.Beispiel
|
||||
{
|
||||
font-size: 8pt;
|
||||
letter-spacing: 1px;
|
||||
padding: 5px;
|
||||
border-bottom: solid 1px;
|
||||
border-top: solid 1px;
|
||||
background-color: #fdf5e6;
|
||||
border-bottom-color: #c0c0c0;
|
||||
border-top-color: #c0c0c0;
|
||||
font-family: Verdana;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user