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>
553 lines
6.8 KiB
CSS
553 lines
6.8 KiB
CSS
/*<meta />*/
|
|
|
|
.MCTopicBody
|
|
{
|
|
margin: 8px;
|
|
font-family: Arial;
|
|
font-size: 10pt;
|
|
margin-left: 5px;
|
|
margin-right: 5px;
|
|
}
|
|
|
|
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.MCBreadcrumbsLink:link
|
|
{
|
|
text-decoration: none;
|
|
color: #6b8e23;
|
|
font-size: 8pt;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
a:visited
|
|
{
|
|
text-decoration: none;
|
|
color: #808080;
|
|
}
|
|
|
|
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
|
|
{
|
|
color: #808080;
|
|
font-family: 'Courier New';
|
|
font-size: 9pt;
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|