using System.Diagnostics; using System.IO; using Azaion.Common.DTO; using Azaion.Common.DTO.Config; using Azaion.Common.Extensions; using Newtonsoft.Json; using Serilog; using System.Windows; namespace Azaion.Common; public static class Constants { public const string CONFIG_PATH = "config.json"; public const string DEFAULT_API_URL = "https://api.azaion.com"; public const string AZAION_SUITE_EXE = "Azaion.Suite.exe"; public const int AI_TILE_SIZE_DEFAULT = 1280; #region ExternalClientsConfig private const string DEFAULT_ZMQ_LOADER_HOST = "127.0.0.1"; private const int DEFAULT_ZMQ_LOADER_PORT = 5025; private static readonly LoaderClientConfig DefaultLoaderClientConfig = new() { ZeroMqHost = DEFAULT_ZMQ_LOADER_HOST, ZeroMqPort = DEFAULT_ZMQ_LOADER_PORT, ApiUrl = DEFAULT_API_URL }; public const string EXTERNAL_LOADER_PATH = "azaion-loader.exe"; public const string EXTERNAL_INFERENCE_PATH = "azaion-inference.exe"; public const string EXTERNAL_GPS_DENIED_FOLDER = "gps-denied"; public static readonly string ExternalGpsDeniedPath = Path.Combine(EXTERNAL_GPS_DENIED_FOLDER, "image-matcher.exe"); public const string DEFAULT_ZMQ_INFERENCE_HOST = "127.0.0.1"; private const int DEFAULT_ZMQ_INFERENCE_PORT = 5227; private static readonly InferenceClientConfig DefaultInferenceClientConfig = new() { ZeroMqHost = DEFAULT_ZMQ_INFERENCE_HOST, ZeroMqPort = DEFAULT_ZMQ_INFERENCE_PORT, ApiUrl = DEFAULT_API_URL }; private const string DEFAULT_ZMQ_GPS_DENIED_HOST = "127.0.0.1"; private const int DEFAULT_ZMQ_GPS_DENIED_PORT = 5255; private const int DEFAULT_ZMQ_GPS_DENIED_PUBLISH_PORT = 5256; private static readonly GpsDeniedClientConfig DefaultGpsDeniedClientConfig = new() { ZeroMqHost = DEFAULT_ZMQ_GPS_DENIED_HOST, ZeroMqPort = DEFAULT_ZMQ_GPS_DENIED_PORT, ZeroMqReceiverPort = DEFAULT_ZMQ_GPS_DENIED_PUBLISH_PORT }; #endregion ExternalClientsConfig public const string CURRENT_USER_CACHE_KEY = "CurrentUser"; public const string JPG_EXT = ".jpg"; public const string TXT_EXT = ".txt"; #region DirectoriesConfig public const string DEFAULT_VIDEO_DIR = "video"; private const string DEFAULT_LABELS_DIR = "labels"; private const string DEFAULT_IMAGES_DIR = "images"; private const string DEFAULT_RESULTS_DIR = "results"; private const string DEFAULT_THUMBNAILS_DIR = "thumbnails"; private const string DEFAULT_GPS_SAT_DIRECTORY = "satellitesDir"; private const string DEFAULT_GPS_ROUTE_DIRECTORY = "routeDir"; #endregion #region AnnotatorConfig public static readonly List DefaultAnnotationClasses = [ new() { Id = 0, Name = "ArmorVehicle", ShortName = "Броня", Color = "#FF0000".ToColor(), MaxSizeM = 7 }, new() { Id = 1, Name = "Truck", ShortName = "Вантаж.", Color = "#00FF00".ToColor(), MaxSizeM = 8 }, new() { Id = 2, Name = "Vehicle", ShortName = "Машина", Color = "#0000FF".ToColor(), MaxSizeM = 7 }, new() { Id = 3, Name = "Artillery", ShortName = "Арта", Color = "#FFFF00".ToColor(), MaxSizeM = 14 }, new() { Id = 4, Name = "Shadow", ShortName = "Тінь", Color = "#FF00FF".ToColor(), MaxSizeM = 9 }, new() { Id = 5, Name = "Trenches", ShortName = "Окопи", Color = "#00FFFF".ToColor(), MaxSizeM = 10 }, new() { Id = 6, Name = "MilitaryMan", ShortName = "Військов", Color = "#188021".ToColor(), MaxSizeM = 2 }, new() { Id = 7, Name = "TyreTracks", ShortName = "Накати", Color = "#800000".ToColor(), MaxSizeM = 5 }, new() { Id = 8, Name = "AdditionArmoredTank",ShortName = "Танк.захист", Color = "#008000".ToColor(), MaxSizeM = 7 }, new() { Id = 9, Name = "Smoke", ShortName = "Дим", Color = "#000080".ToColor(), MaxSizeM = 8 }, new() { Id = 10, Name = "Plane", ShortName = "Літак", Color = "#000080".ToColor(), MaxSizeM = 12 }, new() { Id = 11, Name = "Moto", ShortName = "Мото", Color = "#808000".ToColor(), MaxSizeM = 3 }, new() { Id = 12, Name = "CamouflageNet", ShortName = "Сітка", Color = "#800080".ToColor(), MaxSizeM = 14 }, new() { Id = 13, Name = "CamouflageBranches", ShortName = "Гілки", Color = "#2f4f4f".ToColor(), MaxSizeM = 8 }, new() { Id = 14, Name = "Roof", ShortName = "Дах", Color = "#1e90ff".ToColor(), MaxSizeM = 15 }, new() { Id = 15, Name = "Building", ShortName = "Будівля", Color = "#ffb6c1".ToColor(), MaxSizeM = 20 }, new() { Id = 16, Name = "Caponier", ShortName = "Капонір", Color = "#ffb6c1".ToColor(), MaxSizeM = 10 }, new() { Id = 17, Name = "Ammo", ShortName = "БК", Color = "#33658a".ToColor(), MaxSizeM = 2 }, new() { Id = 18, Name = "Protect.Struct", ShortName = "Зуби.драк", Color = "#969647".ToColor(), MaxSizeM = 2 } ]; public static readonly List DefaultVideoFormats = [".mp4", ".mov", ".avi", ".ts", ".mkv"]; public static readonly List DefaultImageFormats = [".jpg", ".jpeg", ".png", ".bmp"]; private static readonly AnnotationConfig DefaultAnnotationConfig = new() { DetectionClasses = DefaultAnnotationClasses, AnnotationsDbFile = DEFAULT_ANNOTATIONS_DB_FILE }; #region UIConfig public const int DEFAULT_LEFT_PANEL_WIDTH = 200; public const int DEFAULT_RIGHT_PANEL_WIDTH = 200; #endregion UIConfig #region CameraConfig public const int DEFAULT_ALTITUDE = 400; public const decimal DEFAULT_CAMERA_FOCAL_LENGTH = 24m; public const decimal DEFAULT_CAMERA_SENSOR_WIDTH = 23.5m; public static readonly CameraConfig DefaultCameraConfig = new() { Altitude = DEFAULT_ALTITUDE, CameraFocalLength = DEFAULT_CAMERA_FOCAL_LENGTH, CameraSensorWidth = DEFAULT_CAMERA_SENSOR_WIDTH }; #endregion CameraConfig private const string DEFAULT_ANNOTATIONS_DB_FILE = "annotations.db"; # endregion AnnotatorConfig # region AIRecognitionConfig private static readonly AIRecognitionConfig DefaultAIRecognitionConfig = new() { FrameRecognitionSeconds = DEFAULT_FRAME_RECOGNITION_SECONDS, TrackingDistanceConfidence = TRACKING_DISTANCE_CONFIDENCE, TrackingProbabilityIncrease = TRACKING_PROBABILITY_INCREASE, TrackingIntersectionThreshold = TRACKING_INTERSECTION_THRESHOLD, BigImageTileOverlapPercent = DEFAULT_BIG_IMAGE_TILE_OVERLAP_PERCENT, FramePeriodRecognition = DEFAULT_FRAME_PERIOD_RECOGNITION }; private const double DEFAULT_FRAME_RECOGNITION_SECONDS = 2; private const double TRACKING_DISTANCE_CONFIDENCE = 0.15; private const double TRACKING_PROBABILITY_INCREASE = 15; private const double TRACKING_INTERSECTION_THRESHOLD = 0.8; private const int DEFAULT_BIG_IMAGE_TILE_OVERLAP_PERCENT = 20; private const int DEFAULT_FRAME_PERIOD_RECOGNITION = 4; # endregion AIRecognitionConfig # region GpsDeniedConfig private static readonly GpsDeniedConfig DefaultGpsDeniedConfig = new() { MinKeyPoints = 11 }; # endregion #region Thumbnails private static readonly Size DefaultThumbnailSize = new(240, 135); private static readonly ThumbnailConfig DefaultThumbnailConfig = new() { Size = DefaultThumbnailSize, Border = DEFAULT_THUMBNAIL_BORDER }; private const int DEFAULT_THUMBNAIL_BORDER = 10; public const string THUMBNAIL_PREFIX = "_thumb"; public const string RESULT_PREFIX = "_result"; #endregion public const string MQ_ANNOTATIONS_QUEUE = "azaion-annotations"; #region Database public const string ANNOTATIONS_TABLENAME = "annotations"; public const string ANNOTATIONS_QUEUE_TABLENAME = "annotations_queue"; public const string ADMIN_EMAIL = "admin@azaion.com"; public const string DETECTIONS_TABLENAME = "detections"; public const string MEDIAFILE_TABLENAME = "mediafiles"; #endregion #region Mode Captions public const string REGULAR_MODE_CAPTION = "Норма"; public const string WINTER_MODE_CAPTION = "Зима"; public const string NIGHT_MODE_CAPTION = "Ніч"; #endregion public const string SPLIT_SUFFIX = "!split!"; private static readonly InitConfig DefaultInitConfig = new() { LoaderClientConfig = DefaultLoaderClientConfig, InferenceClientConfig = DefaultInferenceClientConfig, GpsDeniedClientConfig = DefaultGpsDeniedClientConfig, DirectoriesConfig = new DirectoriesConfig { ApiResourcesDirectory = "" }, CameraConfig = DefaultCameraConfig }; public static readonly AppConfig FailsafeAppConfig = new() { AnnotationConfig = DefaultAnnotationConfig, UIConfig = new UIConfig { LeftPanelWidth = DEFAULT_LEFT_PANEL_WIDTH, RightPanelWidth = DEFAULT_RIGHT_PANEL_WIDTH, GenerateAnnotatedImage = false }, DirectoriesConfig = new DirectoriesConfig { VideosDirectory = DEFAULT_VIDEO_DIR, ImagesDirectory = DEFAULT_IMAGES_DIR, LabelsDirectory = DEFAULT_LABELS_DIR, ResultsDirectory = DEFAULT_RESULTS_DIR, ThumbnailsDirectory = DEFAULT_THUMBNAILS_DIR, GpsSatDirectory = DEFAULT_GPS_SAT_DIRECTORY, GpsRouteDirectory = DEFAULT_GPS_ROUTE_DIRECTORY }, ThumbnailConfig = DefaultThumbnailConfig, AIRecognitionConfig = DefaultAIRecognitionConfig, GpsDeniedConfig = DefaultGpsDeniedConfig, LoaderClientConfig = DefaultLoaderClientConfig, InferenceClientConfig = DefaultInferenceClientConfig, GpsDeniedClientConfig = DefaultGpsDeniedClientConfig, CameraConfig = DefaultCameraConfig }; public static InitConfig ReadInitConfig(ILogger logger) { try { if (!File.Exists(CONFIG_PATH)) throw new FileNotFoundException(CONFIG_PATH); var configStr = File.ReadAllText(CONFIG_PATH); var config = JsonConvert.DeserializeObject(configStr); return config ?? DefaultInitConfig; } catch (Exception e) { logger.Error(e, e.Message); return DefaultInitConfig; } } public static Version GetLocalVersion() { var localFileInfo = FileVersionInfo.GetVersionInfo(AZAION_SUITE_EXE); if (string.IsNullOrWhiteSpace(localFileInfo.ProductVersion)) throw new Exception($"Can't find {AZAION_SUITE_EXE} and its version"); return new Version(localFileInfo.FileVersion!); } }