31 Commits

Author SHA1 Message Date
Szymon Porwolik
d63c0fbfdf v0.3.6
MySQL database structure change - shall be less redundant.
2019-02-25 13:17:33 +01:00
Szymon Porwolik
f49734560e Formated code , updated MySQL structure 2019-02-25 00:00:43 +01:00
Szymon Porwolik
5d3f7148bb Added Stats [WIP], new approach for issue #1 , Added logins, Added category decoding. 2019-02-24 23:24:24 +01:00
Szymon Porwolik
2629295f93 Merge branch 'master' of https://github.com/szporwolik/perun 2019-02-24 21:19:04 +01:00
Szymon Porwolik
a6ad17dbe1 Fixed issue with "blinking" SRS status when no clients connected to server. 2019-02-24 21:18:44 +01:00
simpo
b7022c22c1 Update README.md 2019-02-24 20:27:50 +01:00
Szymon Porwolik
907d8d01d6 Added weather and coalition export. 2019-02-24 20:27:17 +01:00
Szymon Porwolik
fc82c43072 Fixed issue #1 testing required. 2019-02-24 19:53:43 +01:00
Szymon Porwolik
37b6f3419e Merge branch 'master' of https://github.com/szporwolik/perun 2019-02-24 19:28:14 +01:00
Szymon Porwolik
b96affd4fd Build and publication update - app will now deploy to remote FTP and generate one click installer. 2019-02-24 19:28:00 +01:00
simpo
8d733f83ab Update README.md
Added VS OneClick http addres for quick deployment.
2019-02-24 19:24:12 +01:00
Szymon Porwolik
58cc8a7b39 Updated MySQL scheme to match latest changes in Lua 2019-02-24 17:34:31 +01:00
Szymon Porwolik
e09926aa80 Fixed and upgraded event handlers.
System will store DCS server time for events and chat logs.
2019-02-24 17:17:44 +01:00
Szymon Porwolik
13969a95cc Merge branch 'master' of https://github.com/szporwolik/perun 2019-02-24 00:17:55 +01:00
Szymon Porwolik
5c9fa4e284 v0.3.2 2019-02-24 00:17:20 +01:00
Szymon Porwolik
3512f7f5cf - motd will not be logged to chat log
- mission data will be added to json
2019-02-24 00:15:08 +01:00
simpo
6847a1e262 Update README.md 2019-02-23 23:41:49 +01:00
simpo
c917d0ef04 Update README.md 2019-02-23 22:44:04 +01:00
simpo
784ad9947f Update README.md 2019-02-23 22:19:42 +01:00
simpo
91c629ed81 Update README.md 2019-02-23 22:16:29 +01:00
Szymon Porwolik
5d415812fa Added SQL to create MySQL database. 2019-02-23 22:05:08 +01:00
Szymon Porwolik
f127b4c06b 3.0.0 2019-02-23 21:45:12 +01:00
Szymon Porwolik
cc30d305d5 Exeption handling 2019-02-23 18:29:55 +01:00
Szymon Porwolik
02eebc5f1e First working version 2019-02-23 17:47:38 +01:00
Szymon Porwolik
a2da2e39fc Major update - first working version 2019-02-23 03:12:12 +01:00
Szymon Porwolik
f646eb4057 Added DCS Hook 2019-02-22 18:02:57 +01:00
simpo
3b4127ba91 Update README.md 2019-02-22 12:30:30 +01:00
simpo
a538213ed0 Update README.md 2019-02-22 12:29:47 +01:00
simpo
86be1e5140 Update README.md 2019-02-22 12:27:40 +01:00
simpo
b15ea79c93 Update README.md 2019-02-22 12:18:40 +01:00
simpo
b67529c596 Update README.md 2019-02-22 11:53:19 +01:00
19 changed files with 2383 additions and 112 deletions

380
01_DCS/Hooks/Perun.lua Normal file
View File

@@ -0,0 +1,380 @@
-- Perun for DCS World https://github.com/szporwolik/perun -> DCS Hook component
-- Initial init
local Perun = {}
package.path = package.path..";"..lfs.currentdir().."/LuaSocket/?.lua"
package.cpath = package.cpath..";"..lfs.currentdir().."/LuaSocket/?.dll"
-- ########### SETTINGS ###########
Perun.RefreshStatus = 15 -- base refresh rate in seconds to send status update (values lower than 60 may affect performance!)
Perun.RefreshMission = 60 -- refresh rate in seconds to send mission information (values lower than 60 may affect performance!)
Perun.JsonLocation = "Scripts\\Json\\perun_export.json" -- relatve do user's SaveGames DCS folder
Perun.UDPTargetPort = 48620 -- UDP port to send data to
Perun.MOTD_L1 = "Witamy na serwerze Gildia.org !" -- Message send to players connecting the server - Line 1
Perun.MOTD_L2 = "Wymagamy obecnosci na 255Mhz (DCS SRS)" -- Message send to players connecting the server - Line 2
-- ########### END OF SETTINGS ###########
-- Variable init
Perun.Version = "v0.3.6"
Perun.StatusData = {}
Perun.SlotsData = {}
Perun.MissionData = {}
Perun.VersionData = {}
Perun.MissionHash=""
Perun.lastSentStatus =0
Perun.lastSentMission =0
Perun.JsonLocation = lfs.writedir() .. Perun.JsonLocation
Perun.socket = require("socket")
Perun.UDP = assert(Perun.socket.udp())
Perun.UDP:settimeout(0)
Perun.UDP:setsockname("*", 48621)
Perun.UDP:setpeername("127.0.0.1",Perun.UDPTargetPort)
-- Function definition
Perun.GetCategory = function(id)
-- via https://pastebin.com/GUAXrd2U
local _killed_target_category = DCS.getUnitTypeAttribute(id, "category")
if _killed_target_category == nil then
local _killed_target_cat_check_ship = DCS.getUnitTypeAttribute(id, "DeckLevel")
local _killed_target_cat_check_plane = DCS.getUnitTypeAttribute(id, "WingSpan")
if _killed_target_cat_check_ship ~= nil and _killed_target_cat_check_plane == nil then
_killed_target_category = "Ships"
elseif _killed_target_cat_check_ship == nil and _killed_target_cat_check_plane ~= nil then
_killed_target_category = "Planes"
else
_killed_target_category = "Helicopters"
end
end
return _killed_target_category
end
Perun.SideID2Name = function(id)
-- Helper function
local sides = {
[0] = 'SPECTATOR',
[1] = 'RED',
[2] = 'BLUE',
}
return sides[id]
end
Perun.AddLog = function(text)
-- Adds logs to DCS.log file
net.log("Perun : ".. text)
end
Perun.UpdateJson = function()
-- Updates main json file
TempData={}
TempData["1"]=Perun.VersionData
TempData["2"]=Perun.StatusData
TempData["3"]=Perun.SlotsData
TempData["4"]=Perun.MissionData
TempData["debug"]=net.get_player_list()
io.open(Perun.JsonLocation,"w"):close()
perun_export = io.open(Perun.JsonLocation, "w")
perun_export:write(net.lua2json(TempData) .. "\n")
perun_export:close()
end
Perun.Send = function(data_id, data_package)
-- Sends data package
TempData={}
TempData["type"]=data_id
TempData["payload"]=data_package
temp=net.lua2json(TempData)
Perun.UDP:send(temp)
Perun.AddLog("Packet send")
end
Perun.UpdateStatusPart = function(part_id, data_package)
-- Helper for status update container
Perun.StatusData[part_id] = data_package
end
Perun.UpdateVersion = function()
-- Main function for debug/version information
-- Update Mission data
Perun.VersionData['v_dcs_hook']=Perun.Version
-- Send
Perun.Send(1,Perun.VersionData)
end
Perun.UpdateStatus = function()
-- Main function for status updates
-- Update all subsections
-- 1 - Mission
temp={}
temp['name']=DCS.getMissionName()
temp['modeltime']=DCS.getModelTime()
temp['realtime']=DCS.getRealTime()
temp['pause']=DCS.getPause()
temp['multiplayer']=DCS.isMultiplayer()
temp['theatre'] = Perun.MissionData['mission']['theatre']
temp['weather'] = Perun.MissionData['mission']['weather']
Perun.UpdateStatusPart("mission",temp)
-- 2 - Players
_temp = net.get_player_list()
_temp2={}
for _, i in pairs(_temp) do
_temp2[i]=net.get_player_info(i)
end
Perun.UpdateStatusPart("players",_temp2)
-- Send
Perun.Send(2,Perun.StatusData)
end
Perun.UpdateSlots = function()
-- Main function for slot
-- Update slots data
Perun.SlotsData['coalitions']=DCS.getAvailableCoalitions()
Perun.SlotsData['slots']={}
for j, i in pairs(Perun.SlotsData['coalitions']) do
Perun.SlotsData['slots'][j]=DCS.getAvailableSlots(j)
end
-- Send
Perun.Send(3,Perun.SlotsData)
end
Perun.UpdateMission = function()
-- Main function for mission information updates
-- Update Mission data
Perun.MissionData=DCS.getCurrentMission()
-- Send
-- Perun.Send(4,Perun.MissionData)
end
Perun.LogChat = function(playerID,msg,all)
-- Log chat messages
data={}
data['player']= net.get_player_info(playerID, "name")
data['msg']=msg
data['all']=all
data['ucid']=net.get_player_info(playerID, 'ucid')
data['datetime']=os.date('%Y-%m-%d %H:%M:%S')
data['missionhash']=Perun.MissionHash
Perun.Send(50,data)
end
Perun.LogEvent = function(log_type,log_content)
-- Log chat messages
data={}
data['log_type']= log_type
data['log_content']=log_content
data['log_datetime']=os.date('%Y-%m-%d %H:%M:%S')
data['log_missionhash']=Perun.MissionHash
Perun.Send(51,data)
end
Perun.LogStats = function(playerID)
-- Log player status
-- TBD : not working at the moment WIP
p_stats={}
p_stats['PS_CAR']=net.get_stat(playerID,2)
p_stats['PS_PLANE']=net.get_stat(playerID,3)
p_stats['PS_SHIP']=net.get_stat(playerID,4)
p_stats['PS_SCORE']=net.get_stat(playerID,5)
p_stats['PS_LAND']=net.get_stat(playerID,6)
p_stats['PS_PING']=net.get_stat(playerID,0)
p_stats['PS_CRASH']=net.get_stat(playerID,1)
p_stats['PS_EJECT']=net.get_stat(playerID,7)
p_stats['debug']="ok"
data={}
data['stat_data']=p_stats
data['stat_ucid']=net.get_player_info(playerID, 'ucid')
data['stat_datetime']=os.date('%Y-%m-%d %H:%M:%S')
data['stat_missionhash']=Perun.MissionHash
Perun.Send(52,data)
end
Perun.LogLogin = function(playerID)
-- Player logged in
data={}
data['login_ucid']=net.get_player_info(playerID, 'ucid')
data['login_ipaddr']=net.get_player_info(playerID, 'ipaddr')
data['login_name']=net.get_player_info(playerID, 'name')
data['login_datetime']=os.date('%Y-%m-%d %H:%M:%S')
Perun.Send(53,data)
end
--- Event callbacks
Perun.onSimulationStart = function()
Perun.MissionHash=DCS.getMissionName( ).."@"..os.date('%Y%m%d_%H%M%S');
Perun.LogEvent("SimStart","Mission" .. Perun.MissionHash .. " started");
end
Perun.onSimulationStop = function()
Perun.LogEvent("SimStop","Mission" .. Perun.MissionHash .. " finished");
end
Perun.onPlayerDisconnect= function(id, err_code)
Perun.LogEvent("disconnect", "Player " .. net.get_player_info(id, "name") .. " disconnected; " .. err_code);
end
Perun.onSimulationFrame = function()
local _now = DCS.getRealTime()
-- Send status update
if _now > Perun.lastSentStatus + Perun.RefreshStatus then
Perun.lastSentStatus = _now
Perun.UpdateStatus()
Perun.UpdateJson()
end
-- Send mission update
if _now > Perun.lastSentMission + Perun.RefreshMission then
Perun.lastSentMission = _now
Perun.UpdateSlots()
Perun.UpdateMission()
Perun.UpdateJson()
end
end
Perun.onMissionLoadEnd = function()
Perun.UpdateMission()
Perun.UpdateSlots()
Perun.UpdateVersion()
Perun.UpdateJson()
end
Perun.onPlayerStart = function (id)
net.send_chat(Perun.MOTD_L1, id);
net.send_chat(Perun.MOTD_L2, id);
end
Perun.onPlayerTrySendChat = function (playerID, msg, all)
if msg~=Perun.MOTD_L1 and msg~=Perun.MOTD_L2 then
Perun.LogChat(playerID,msg,all)
end
return msg
end
Perun.onGameEvent = function (eventName,arg1,arg2,arg3,arg4,arg5,arg6,arg7)
if eventName == "friendly_fire" then
--"friendly_fire", playerID, weaponName, victimPlayerID
Perun.LogEvent(eventName,Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name").." killed friendy " .. net.get_player_info(arg3, "name") .. " using " .. arg2);
Perun.LogStats(arg1);
elseif eventName == "mission_end" then
--"mission_end", winner, msg
Perun.LogEvent(eventName,"Mission finished, winner " .. arg1 .. " message: " .. arg2);
elseif eventName == "kill" then
--"kill", killerPlayerID, killerUnitType, killerSide, victimPlayerID, victimUnitType, victimSide, weaponName
if net.get_player_info(arg4, "name") ~= nil then
_temp = " player ".. net.get_player_info(arg4, "name") .." ";
Perun.LogStats(arg4);
else
_temp = " AI ";
end
if net.get_player_info(arg1, "name") ~= nil then
_temp2 = " player ".. net.get_player_info(arg1, "name") .." ";
Perun.LogStats(arg1);
else
_temp2 = " AI ";
end
Perun.LogEvent(eventName,Perun.SideID2Name(arg3) .. _temp2 .. " in " .. arg2 .. " killed " .. Perun.SideID2Name(arg6) .. _temp .. " in " .. arg5 .. " using " .. arg7 .. " [".. Perun.GetCategory(arg5).."]");
elseif eventName == "self_kill" then
--"self_kill", playerID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " killed himself");
Perun.LogStats(arg1);
elseif eventName == "change_slot" then
--"change_slot", playerID, slotID, prevSide
if DCS.getUnitType(arg2) ~= nil and DCS.getUnitType(arg2) ~= "" then
_temp = DCS.getUnitType(arg2);
else
_temp = "SPECTATOR";
end
Perun.LogEvent(eventName,Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " changed slot to " .. _temp);
Perun.LogStats(arg1);
elseif eventName == "connect" then
--"connect", playerID, name
Perun.LogLogin(arg1);
Perun.LogEvent(eventName,"Player "..net.get_player_info(arg1, "name") .. " connected");
elseif eventName == "disconnect" then
--"disconnect", playerID, name, playerSide, reason_code
Perun.LogEvent(eventName, Perun.SideID2Name(arg3) .. " player " ..net.get_player_info(arg1, "name") .. " disconnected");
Perun.LogStats(arg1);
elseif eventName == "crash" then
--"crash", playerID, unit_missionID
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " crashed in " .. DCS.getUnitType(arg2));
Perun.LogStats(arg1);
elseif eventName == "eject" then
--"eject", playerID, unit_missionID
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " ejected " .. DCS.getUnitType(arg2));
Perun.LogStats(arg1);
elseif eventName == "takeoff" then
--"takeoff", playerID, unit_missionID, airdromeName
if arg3 then
_temp = " from " .. arg3;
else
_temp = "";
end
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " took off in ".. DCS.getUnitType(arg2) .. _temp);
Perun.LogStats(arg1);
elseif eventName == "landing" then
--"landing", playerID, unit_missionID, airdromeName
if arg3 then
_temp = " at " .. arg3;
else
_temp ="";
end
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " landed in " .. DCS.getUnitType(arg2).. _temp);
Perun.LogStats(arg1);
elseif eventName == "pilot_death" then
--"pilot_death", playerID, unit_missionID
Perun.LogEvent(eventName, Perun.SideID2Name( net.get_player_info(arg1, "side")) .. " player " .. net.get_player_info(arg1, "name") .. " in " .. DCS.getUnitType(arg2) .. " died");
Perun.LogStats(arg1);
else
Perun.LogEvent(eventName,"Unknown event type");
end
end
-- Finalize and set callbacks
DCS.setUserCallbacks(Perun)
net.log("Loaded - Perun - VladMordock - " .. Perun.Version )

View File

@@ -1,6 +1,69 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="Perun_v1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
<section name="Perun.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<userSettings>
<Perun_v1.Properties.Settings>
<setting name="MYSQL_Server" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_User" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_Password" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_DB" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_SRS_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_USE" serializeAs="String">
<value>False</value>
</setting>
<setting name="OTHER_SRS_USE" serializeAs="String">
<value>False</value>
</setting>
<setting name="MYSQL_Port" serializeAs="String">
<value>3306</value>
</setting>
</Perun_v1.Properties.Settings>
<Perun.Properties.Settings>
<setting name="MYSQL_Server" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_User" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_Password" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_DB" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_SRS_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_USE" serializeAs="String">
<value>False</value>
</setting>
<setting name="OTHER_SRS_USE" serializeAs="String">
<value>False</value>
</setting>
</Perun.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -7,11 +7,37 @@
<ProjectGuid>{5A710507-92E9-4664-9B91-918B8B82F107}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>Perun_v1</RootNamespace>
<AssemblyName>Perun_v1</AssemblyName>
<AssemblyName>Perun</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<IsWebBootstrapper>true</IsWebBootstrapper>
<PublishUrl>ftp://s18.mydevil.net/perun/</PublishUrl>
<Install>true</Install>
<InstallFrom>Web</InstallFrom>
<UpdateEnabled>true</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<InstallUrl>http://share.porwolik.com/ftp/perun/</InstallUrl>
<SupportUrl>https://github.com/szporwolik/perun</SupportUrl>
<ErrorReportUrl>https://github.com/szporwolik/perun</ErrorReportUrl>
<TargetCulture>en</TargetCulture>
<ProductName>Perun for DCS World</ProductName>
<PublisherName>szporwolik</PublisherName>
<SuiteName>Perun</SuiteName>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>Perun.htm</WebPage>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>0.3.6.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@@ -31,10 +57,54 @@
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<DocumentationFile>
</DocumentationFile>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>perun_logo.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>2ACE4C8C2C325A04CA5986B1CD76744B4B03755D</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>
</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>true</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>false</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<TargetZone>LocalIntranet</TargetZone>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="Google.Protobuf, Version=3.5.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.15.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Configuration.Install" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing.Design" />
<Reference Include="System.Management" />
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
@@ -65,7 +135,11 @@
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Perun_v1_TemporaryKey.pfx" />
<None Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -79,5 +153,23 @@
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 i x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="perun_logo.ico" />
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -1,22 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Perun_v1
{
static class Program
{
/// <summary>
/// Główny punkt wejścia dla aplikacji.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
void Application_ApplicationExit(object sender, EventArgs e)
{
Properties.Settings.Default.Save();
}
Application.Run(new form_Main());
}
}
}

View File

@@ -1,15 +1,16 @@
using System.Reflection;
using System.Resources;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Ogólne informacje o zestawie są kontrolowane poprzez następujący
// zestaw atrybutów. Zmień wartości tych atrybutów, aby zmodyfikować informacje
// powiązane z zestawem.
[assembly: AssemblyTitle("Perun_v1")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyTitle("Perun for DCS World")]
[assembly: AssemblyDescription("https://github.com/szporwolik/perun")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Perun_v1")]
[assembly: AssemblyCompany("Szymon Porwolik")]
[assembly: AssemblyProduct("Perun for DCS World")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@@ -32,5 +33,7 @@ using System.Runtime.InteropServices;
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
// przy użyciu symbolu „*”, tak jak pokazano poniżej:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyVersion("0.3.6.0")]
[assembly: AssemblyFileVersion("0.3.6.0")]
[assembly: NeutralResourcesLanguage("en")]

View File

@@ -1,69 +1,61 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Ten kod został wygenerowany przez narzędzie.
// Wersja środowiska uruchomieniowego: 4.0.30319.42000
// Wersja wykonawcza:4.0.30319.42000
//
// Modyfikacje tego pliku mogą spowodować niewłaściwe zachowanie i zostaną utracone
// w przypadku ponownego wygenerowania kodu.
// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli
// kod zostanie ponownie wygenerowany.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Perun_v1.Properties
{
namespace Perun_v1.Properties {
using System;
/// <summary>
/// Silnie typizowana klasa zasobów do wyszukiwania zlokalizowanych ciągów itd.
/// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd.
/// </summary>
// Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder
// przez narzędzie, takie jak ResGen lub Visual Studio.
// Aby dodać lub usunąć składowe, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen
// z opcją /str lub ponownie skompiluj projekt programu VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
// Aby dodać lub usunąć składową, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen
// z opcją /str lub ponownie utwórz projekt VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
internal Resources() {
}
/// <summary>
/// Zwraca buforowane wystąpienie składnika ResourceManager używane przez tę klasę.
/// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Perun_v1.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich
/// przypadków przeszukiwania zasobów za pomocą tej silnie typizowanej klasy zasobów.
/// przypadków przeszukiwania zasobów za pomocą tej klasy zasobów wymagającej zdefiniowania typu.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set
{
set {
resourceCulture = value;
}
}

View File

@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
@@ -68,9 +69,10 @@
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
@@ -85,9 +87,10 @@
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
@@ -109,9 +112,9 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,30 +1,134 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
// Ten kod został wygenerowany przez narzędzie.
// Wersja wykonawcza:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli
// kod zostanie ponownie wygenerowany.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Perun_v1.Properties
{
namespace Perun_v1.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string MYSQL_Server {
get {
return ((string)(this["MYSQL_Server"]));
}
set {
this["MYSQL_Server"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string MYSQL_User {
get {
return ((string)(this["MYSQL_User"]));
}
set {
this["MYSQL_User"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string MYSQL_Password {
get {
return ((string)(this["MYSQL_Password"]));
}
set {
this["MYSQL_Password"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string MYSQL_DB {
get {
return ((string)(this["MYSQL_DB"]));
}
set {
this["MYSQL_DB"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string OTHER_LOTATC_FILE {
get {
return ((string)(this["OTHER_LOTATC_FILE"]));
}
set {
this["OTHER_LOTATC_FILE"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string OTHER_SRS_FILE {
get {
return ((string)(this["OTHER_SRS_FILE"]));
}
set {
this["OTHER_SRS_FILE"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool OTHER_LOTATC_USE {
get {
return ((bool)(this["OTHER_LOTATC_USE"]));
}
set {
this["OTHER_LOTATC_USE"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool OTHER_SRS_USE {
get {
return ((bool)(this["OTHER_SRS_USE"]));
}
set {
this["OTHER_SRS_USE"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("3306")]
public string MYSQL_Port {
get {
return ((string)(this["MYSQL_Port"]));
}
set {
this["MYSQL_Port"] = value;
}
}
}
}

View File

@@ -1,7 +1,33 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Perun_v1.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="MYSQL_Server" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MYSQL_User" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MYSQL_Password" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MYSQL_DB" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="OTHER_LOTATC_FILE" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="OTHER_SRS_FILE" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="OTHER_LOTATC_USE" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="OTHER_SRS_USE" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="MYSQL_Port" Type="System.String" Scope="User">
<Value Profile="(Default)">3306</Value>
</Setting>
</Settings>
</SettingsFile>

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- Opcje manifestu Kontroli konta użytkownika
Jeśli chcesz zmienić poziom Kontroli konta użytkownika systemu Windows, zastąp
węzeł requestedExecutionLevel jednym z następujących.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Określenie elementu requestedExecutionLevel spowoduje wyłączenie wirtualizacji plików i rejestru.
Usuń ten element, jeśli aplikacja wymaga wirtualizacji w celu zachowania
zgodności z poprzednimi wersjami.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
<applicationRequestMinimum>
<defaultAssemblyRequest permissionSetReference="Custom" />
<PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
</applicationRequestMinimum>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Lista wersji systemu Windows, na których ta aplikacja została przetestowana
i dla których została zaprojektowana. Odkomentuj odpowiednie elementy, a system Windows
automatycznie wybierze najbardziej zgodne środowisko. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Wskazuje, że aplikacja rozpoznaje wartości DPI i nie będzie automatycznie skalowana przez system Windows przy dużych
wartościach DPI. Aplikacje korzystające z technologii Windows Presentation Foundation (WPF) automatycznie rozpoznają wartości DPI i nie potrzebują
tej opcji. Aplikacje korzystające z technologii Windows Forms przeznaczone dla platformy .NET Framework 4.6, które korzystają z tej opcji, powinny
ustawić także wartość „true” dla parametru „EnableWindowsFormsHighDpiAutoResizing” w pliku app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Włącz motywy dla typowych formantów systemu Windows i okien dialogowych (system Windows XP i nowsze) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

View File

@@ -28,46 +28,361 @@
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(form_Main));
this.con_List_Received = new System.Windows.Forms.ListBox();
this.con_Button_DEBUG = new System.Windows.Forms.Button();
this.con_Button_Listen_ON = new System.Windows.Forms.Button();
this.con_Button_Listen_OFF = new System.Windows.Forms.Button();
this.con_GroupBox_1 = new System.Windows.Forms.GroupBox();
this.tim_1000ms = new System.Windows.Forms.Timer(this.components);
this.con_GroupBox_2 = new System.Windows.Forms.GroupBox();
this.label6 = new System.Windows.Forms.Label();
this.con_txt_mysql_port = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.con_txt_mysql_username = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.con_txt_mysql_database = new System.Windows.Forms.TextBox();
this.con_txt_mysql_server = new System.Windows.Forms.TextBox();
this.con_txt_mysql_password = new System.Windows.Forms.MaskedTextBox();
this.con_GroupBox_3 = new System.Windows.Forms.GroupBox();
this.con_txt_3rd_lotatc = new System.Windows.Forms.MaskedTextBox();
this.con_txt_3rd_srs = new System.Windows.Forms.MaskedTextBox();
this.con_check_3rd_lotatc = new System.Windows.Forms.CheckBox();
this.con_check_3rd_srs = new System.Windows.Forms.CheckBox();
this.con_Button_Quit = new System.Windows.Forms.Button();
this.con_lab_github = new System.Windows.Forms.LinkLabel();
this.label5 = new System.Windows.Forms.Label();
this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components);
this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog();
this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog();
this.tim_10000ms = new System.Windows.Forms.Timer(this.components);
this.con_GroupBox_1.SuspendLayout();
this.con_GroupBox_2.SuspendLayout();
this.con_GroupBox_3.SuspendLayout();
this.SuspendLayout();
//
// con_List_Received
//
this.con_List_Received.Enabled = false;
this.con_List_Received.FormattingEnabled = true;
this.con_List_Received.Location = new System.Drawing.Point(12, 12);
this.con_List_Received.Items.AddRange(new object[] {
"Loading",
"Loading",
"Loading",
"Loading",
"Loading",
"Loading",
"Loading",
"Loading",
"Loading",
"Loading"});
this.con_List_Received.Location = new System.Drawing.Point(6, 19);
this.con_List_Received.Name = "con_List_Received";
this.con_List_Received.Size = new System.Drawing.Size(594, 550);
this.con_List_Received.Size = new System.Drawing.Size(307, 134);
this.con_List_Received.TabIndex = 0;
//
// con_Button_DEBUG
// con_Button_Listen_ON
//
this.con_Button_DEBUG.Location = new System.Drawing.Point(612, 21);
this.con_Button_DEBUG.Name = "con_Button_DEBUG";
this.con_Button_DEBUG.Size = new System.Drawing.Size(80, 48);
this.con_Button_DEBUG.TabIndex = 1;
this.con_Button_DEBUG.Text = "Debug";
this.con_Button_DEBUG.UseVisualStyleBackColor = true;
this.con_Button_DEBUG.Click += new System.EventHandler(this.con_Button_DEBUG_Click);
this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 434);
this.con_Button_Listen_ON.Name = "con_Button_Listen_ON";
this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39);
this.con_Button_Listen_ON.TabIndex = 2;
this.con_Button_Listen_ON.Text = "Connect";
this.con_Button_Listen_ON.UseVisualStyleBackColor = true;
this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click);
//
// con_Button_Listen_OFF
//
this.con_Button_Listen_OFF.Enabled = false;
this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 434);
this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF";
this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39);
this.con_Button_Listen_OFF.TabIndex = 3;
this.con_Button_Listen_OFF.Text = "Disconnect";
this.con_Button_Listen_OFF.UseVisualStyleBackColor = true;
this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click);
//
// con_GroupBox_1
//
this.con_GroupBox_1.Controls.Add(this.con_List_Received);
this.con_GroupBox_1.Location = new System.Drawing.Point(12, 261);
this.con_GroupBox_1.Name = "con_GroupBox_1";
this.con_GroupBox_1.Size = new System.Drawing.Size(324, 167);
this.con_GroupBox_1.TabIndex = 4;
this.con_GroupBox_1.TabStop = false;
this.con_GroupBox_1.Text = "UDP log";
//
// tim_1000ms
//
this.tim_1000ms.Interval = 1000;
this.tim_1000ms.Tick += new System.EventHandler(this.timer1_Tick);
//
// con_GroupBox_2
//
this.con_GroupBox_2.Controls.Add(this.label6);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_port);
this.con_GroupBox_2.Controls.Add(this.label4);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username);
this.con_GroupBox_2.Controls.Add(this.label3);
this.con_GroupBox_2.Controls.Add(this.label2);
this.con_GroupBox_2.Controls.Add(this.label1);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password);
this.con_GroupBox_2.Location = new System.Drawing.Point(12, 27);
this.con_GroupBox_2.Name = "con_GroupBox_2";
this.con_GroupBox_2.Size = new System.Drawing.Size(324, 154);
this.con_GroupBox_2.TabIndex = 5;
this.con_GroupBox_2.TabStop = false;
this.con_GroupBox_2.Text = "MySQL";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(41, 48);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(59, 13);
this.label6.TabIndex = 9;
this.label6.Text = "Server port";
//
// con_txt_mysql_port
//
this.con_txt_mysql_port.Location = new System.Drawing.Point(106, 45);
this.con_txt_mysql_port.Name = "con_txt_mysql_port";
this.con_txt_mysql_port.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_port.TabIndex = 8;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(45, 100);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(55, 13);
this.label4.TabIndex = 7;
this.label4.Text = "Username";
//
// con_txt_mysql_username
//
this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 97);
this.con_txt_mysql_username.Name = "con_txt_mysql_username";
this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_username.TabIndex = 6;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(47, 126);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 5;
this.label3.Text = "Password";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(47, 74);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(53, 13);
this.label2.TabIndex = 4;
this.label2.Text = "Database";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(22, 22);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(78, 13);
this.label1.TabIndex = 3;
this.label1.Text = "Server address";
//
// con_txt_mysql_database
//
this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 71);
this.con_txt_mysql_database.Name = "con_txt_mysql_database";
this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_database.TabIndex = 2;
//
// con_txt_mysql_server
//
this.con_txt_mysql_server.Location = new System.Drawing.Point(106, 19);
this.con_txt_mysql_server.Name = "con_txt_mysql_server";
this.con_txt_mysql_server.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_server.TabIndex = 1;
//
// con_txt_mysql_password
//
this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 123);
this.con_txt_mysql_password.Name = "con_txt_mysql_password";
this.con_txt_mysql_password.PasswordChar = '*';
this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_password.TabIndex = 0;
//
// con_GroupBox_3
//
this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_lotatc);
this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs);
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc);
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs);
this.con_GroupBox_3.Location = new System.Drawing.Point(12, 187);
this.con_GroupBox_3.Name = "con_GroupBox_3";
this.con_GroupBox_3.Size = new System.Drawing.Size(324, 68);
this.con_GroupBox_3.TabIndex = 6;
this.con_GroupBox_3.TabStop = false;
this.con_GroupBox_3.Text = "3rd Party";
//
// con_txt_3rd_lotatc
//
this.con_txt_3rd_lotatc.Location = new System.Drawing.Point(123, 39);
this.con_txt_3rd_lotatc.Name = "con_txt_3rd_lotatc";
this.con_txt_3rd_lotatc.Size = new System.Drawing.Size(190, 20);
this.con_txt_3rd_lotatc.TabIndex = 4;
this.con_txt_3rd_lotatc.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_lotatc_Click);
//
// con_txt_3rd_srs
//
this.con_txt_3rd_srs.Location = new System.Drawing.Point(123, 16);
this.con_txt_3rd_srs.Name = "con_txt_3rd_srs";
this.con_txt_3rd_srs.Size = new System.Drawing.Size(190, 20);
this.con_txt_3rd_srs.TabIndex = 3;
this.con_txt_3rd_srs.MouseClick += new System.Windows.Forms.MouseEventHandler(this.con_txt_3rd_srs_Click);
//
// con_check_3rd_lotatc
//
this.con_check_3rd_lotatc.AutoSize = true;
this.con_check_3rd_lotatc.Location = new System.Drawing.Point(6, 42);
this.con_check_3rd_lotatc.Name = "con_check_3rd_lotatc";
this.con_check_3rd_lotatc.Size = new System.Drawing.Size(100, 17);
this.con_check_3rd_lotatc.TabIndex = 1;
this.con_check_3rd_lotatc.Text = "LotATC json file";
this.con_check_3rd_lotatc.UseVisualStyleBackColor = true;
//
// con_check_3rd_srs
//
this.con_check_3rd_srs.AutoSize = true;
this.con_check_3rd_srs.Location = new System.Drawing.Point(6, 19);
this.con_check_3rd_srs.Name = "con_check_3rd_srs";
this.con_check_3rd_srs.Size = new System.Drawing.Size(111, 17);
this.con_check_3rd_srs.TabIndex = 0;
this.con_check_3rd_srs.Text = "DCS SRS json file";
this.con_check_3rd_srs.UseVisualStyleBackColor = true;
//
// con_Button_Quit
//
this.con_Button_Quit.Location = new System.Drawing.Point(250, 434);
this.con_Button_Quit.Name = "con_Button_Quit";
this.con_Button_Quit.Size = new System.Drawing.Size(86, 39);
this.con_Button_Quit.TabIndex = 7;
this.con_Button_Quit.Text = "Quit";
this.con_Button_Quit.UseVisualStyleBackColor = true;
this.con_Button_Quit.Click += new System.EventHandler(this.con_Button_Quit_Click);
//
// con_lab_github
//
this.con_lab_github.AutoSize = true;
this.con_lab_github.Location = new System.Drawing.Point(141, 9);
this.con_lab_github.Name = "con_lab_github";
this.con_lab_github.Size = new System.Drawing.Size(181, 13);
this.con_lab_github.TabIndex = 8;
this.con_lab_github.TabStop = true;
this.con_lab_github.Text = "https://github.com/szporwolik/perun";
this.con_lab_github.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.con_lab_github_LinkClicked);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(15, 9);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(120, 13);
this.label5.TabIndex = 9;
this.label5.Text = "Manual and bugtracker:";
//
// trayIconMain
//
this.trayIconMain.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
this.trayIconMain.BalloonTipText = "Perun";
this.trayIconMain.BalloonTipTitle = "Perun for DCS World";
this.trayIconMain.Icon = ((System.Drawing.Icon)(resources.GetObject("trayIconMain.Icon")));
this.trayIconMain.Text = "Perun for DCS World";
this.trayIconMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
this.trayIconMain.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.trayIconMain_MouseDoubleClick);
//
// openFileDialog_SRS
//
this.openFileDialog_SRS.FileName = "openFileDialog1";
//
// openFileDialog_LotATC
//
this.openFileDialog_LotATC.FileName = "openFileDialog1";
//
// tim_10000ms
//
this.tim_10000ms.Interval = 30000;
this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick);
//
// form_Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(738, 567);
this.Controls.Add(this.con_Button_DEBUG);
this.Controls.Add(this.con_List_Received);
this.ClientSize = new System.Drawing.Size(349, 483);
this.Controls.Add(this.label5);
this.Controls.Add(this.con_lab_github);
this.Controls.Add(this.con_Button_Quit);
this.Controls.Add(this.con_GroupBox_3);
this.Controls.Add(this.con_GroupBox_2);
this.Controls.Add(this.con_GroupBox_1);
this.Controls.Add(this.con_Button_Listen_OFF);
this.Controls.Add(this.con_Button_Listen_ON);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "form_Main";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Perun for DCS World";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing);
this.Load += new System.EventHandler(this.form_Main_Load);
this.con_GroupBox_1.ResumeLayout(false);
this.con_GroupBox_2.ResumeLayout(false);
this.con_GroupBox_2.PerformLayout();
this.con_GroupBox_3.ResumeLayout(false);
this.con_GroupBox_3.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ListBox con_List_Received;
private System.Windows.Forms.Button con_Button_DEBUG;
private System.Windows.Forms.Button con_Button_Listen_ON;
private System.Windows.Forms.Button con_Button_Listen_OFF;
private System.Windows.Forms.GroupBox con_GroupBox_1;
private System.Windows.Forms.Timer tim_1000ms;
private System.Windows.Forms.GroupBox con_GroupBox_2;
private System.Windows.Forms.GroupBox con_GroupBox_3;
private System.Windows.Forms.TextBox con_txt_mysql_database;
private System.Windows.Forms.TextBox con_txt_mysql_server;
private System.Windows.Forms.MaskedTextBox con_txt_mysql_password;
private System.Windows.Forms.Button con_Button_Quit;
private System.Windows.Forms.MaskedTextBox con_txt_3rd_lotatc;
private System.Windows.Forms.MaskedTextBox con_txt_3rd_srs;
private System.Windows.Forms.CheckBox con_check_3rd_lotatc;
private System.Windows.Forms.CheckBox con_check_3rd_srs;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox con_txt_mysql_username;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.LinkLabel con_lab_github;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.NotifyIcon trayIconMain;
private System.Windows.Forms.OpenFileDialog openFileDialog_SRS;
private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC;
private System.Windows.Forms.Timer tim_10000ms;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox con_txt_mysql_port;
}
}

View File

@@ -1,29 +1,493 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Perun_v1
{
public partial class form_Main : Form
{
public form_Main()
// Variable definitions
public Thread thread_UDPListener; // Seperate thread for UDP
public class_UDPListener UDPListener; // Helper class for UDP comunication
public string[] LogHistory = new string[10]; // Log history for GUI
public string[] SendBuffer = new string[10]; // Mysql send buffer
public bool LetMeOut = false; // Helper to handle system tray
public string MySql_connStr; // MySQL connection string
public string publishVersion = "DEBUG"; // Helper for pulling version definition
public static void LogHistoryAdd(ref string[] LogHistory, string Comment)
{
InitializeComponent();
// Add to log history and rotate
for (int i = 0; i < LogHistory.Length - 1; i++)
{
LogHistory[i] = LogHistory[i + 1];
}
LogHistory[9] = DateTime.Now.ToString("HH:mm:ss") + " > " + Comment;
}
private void con_Button_DEBUG_Click(object sender, EventArgs e)
public void SendToMySql(string raw_udp_frame)
{
con_List_Received.Items.Add("test");
// Main function to send data to mysql
dynamic udp_frame = JsonConvert.DeserializeObject(raw_udp_frame);
// Cut raw data to type and paylod for proper mysql insert
string type = udp_frame.type;
string payload = "";
string sql = "";
// Modify specific
if (type == "1") // Inject app version information
{
udp_frame.payload["v_win"] = "v" + publishVersion;
}
// Specific SQL
if (type == "50")
{
// Add entry to chat log
sql = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) VALUES ('" + udp_frame.payload.ucid + "') ON DUPLICATE KEY UPDATE pe_DataPlayers_updated=CURRENT_TIMESTAMP(),pe_DataPlayers_lastname='"+ udp_frame.payload.player + "';";
sql = sql + "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`) VALUES ('" + udp_frame.payload.missionhash + "') ON DUPLICATE KEY UPDATE pe_DataMissionHashes_datetime=CURRENT_TIMESTAMP();";
sql = sql+ "INSERT INTO `pe_LogChat` (`pe_LogChat_id`,`pe_LogChat_datetime`, `pe_LogChat_playerid`, `pe_LogChat_msg`, `pe_LogChat_all`,`pe_LogChat_missionhash_id`) VALUES (NULL,'" + udp_frame.payload.datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '"+ udp_frame.payload.ucid + "'), '" + udp_frame.payload.msg + "', '" + udp_frame.payload.all + "',(SELECT pe_DataMissionHashes_id FROM pe_DataMissionHashes WHERE pe_DataMissionHashes_hash = '" + udp_frame.payload.missionhash + "'));";
}
else if (type == "51")
{
// Add entry to event log
sql = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`) VALUES ('" + udp_frame.payload.log_missionhash + "') ON DUPLICATE KEY UPDATE pe_DataMissionHashes_datetime=CURRENT_TIMESTAMP();";
sql = sql + "INSERT INTO `pe_LogEvent` (`pe_LogEvent_id`, `pe_LogEvent_datetime`, `pe_LogEvent_type`, `pe_LogEvent_content`,`pe_LogEvent_missionhash_id`) VALUES ( NULL, '" + udp_frame.payload.log_datetime + "', '" + udp_frame.payload.log_type + "', '" + udp_frame.payload.log_content + "', (SELECT pe_DataMissionHashes_id FROM pe_DataMissionHashes WHERE pe_DataMissionHashes_hash = '" + udp_frame.payload.log_missionhash + "'));";
}
else if (type == "52")
{
// Update user stats
payload = JsonConvert.SerializeObject(udp_frame.payload.stat_data);
sql = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`) VALUES ('" + udp_frame.payload.stat_missionhash + "') ON DUPLICATE KEY UPDATE pe_DataMissionHashes_datetime=CURRENT_TIMESTAMP();";
sql = sql + "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) VALUES ('" + udp_frame.payload.stat_ucid + "') ON DUPLICATE KEY UPDATE pe_DataPlayers_updated=CURRENT_TIMESTAMP();";
sql = sql+ "INSERT INTO `pe_LogStats` (`pe_LogStats_datetime`, `pe_LogStats_playerid`, `pe_LogStats_debug`,`pe_LogStats_missionhash_id`) VALUES ('" + udp_frame.payload.stat_datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + udp_frame.payload.stat_ucid + "'), JSON_QUOTE('" + payload + "'), (SELECT pe_DataMissionHashes_id FROM pe_DataMissionHashes WHERE pe_DataMissionHashes_hash = '" + udp_frame.payload.stat_missionhash + "')) ON DUPLICATE KEY UPDATE pe_LogStats_datetime='" + udp_frame.payload.stat_datetime + "',pe_LogStats_playerid = (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + udp_frame.payload.stat_ucid + "'), pe_LogStats_debug=JSON_QUOTE('" + payload + "'), pe_LogStats_missionhash_id=(SELECT pe_DataMissionHashes_id FROM pe_DataMissionHashes WHERE pe_DataMissionHashes_hash = '" + udp_frame.payload.stat_missionhash + "')";
}
else if (type == "53")
{
// User logged in to DCS server
payload = JsonConvert.SerializeObject(udp_frame.payload.stat_data);
sql = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_id`, `pe_DataPlayers_ucid`, `pe_DataPlayers_lastip`, `pe_DataPlayers_lastname`, `pe_DataPlayers_updated`) VALUES (NULL, '" + udp_frame.payload.login_ucid + "', '" + udp_frame.payload.login_ipaddr + "', '" + udp_frame.payload.login_name + "', '" + udp_frame.payload.login_datetime + "') ON DUPLICATE KEY UPDATE pe_DataPlayers_lastip='" + udp_frame.payload.login_ipaddr + "',pe_DataPlayers_lastname='" + udp_frame.payload.login_name + "',pe_DataPlayers_updated='" + udp_frame.payload.login_datetime + "';";
sql = sql + "INSERT INTO `pe_LogLogins` (`pe_LogLogins_datetime`, `pe_LogLogins_playerid`, `pe_LogLogins_name`, `pe_LogLogins_ip`) VALUES ('" + udp_frame.payload.login_datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + udp_frame.payload.login_ucid + "'), '" + udp_frame.payload.login_name + "', '" + udp_frame.payload.login_ipaddr + "');";
}
else
{
// General definition used for 1-10 packets
payload = JsonConvert.SerializeObject(udp_frame.payload);
sql = "INSERT INTO pe_DataRaw(pe_dataraw_type,pe_dataraw_payload) VALUES (" + type + ",JSON_QUOTE('" + payload + "')) ON DUPLICATE KEY UPDATE pe_dataraw_payload = JSON_QUOTE('" + payload + "')";
}
// Connect to mysql and execute sql
MySqlConnection conn = new MySqlConnection(MySql_connStr);
try
{
Console.WriteLine("Sending data to MySQL - Begin");
conn.Open();
MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr[0] + " -- " + rdr[1]);
}
rdr.Close();
LogHistoryAdd(ref LogHistory, "MySQL updated, package type: " + type);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
LogHistoryAdd(ref LogHistory, "ERROR MySQL: type " + type);
}
conn.Close();
Console.WriteLine("Sending data to MySQL - Done");
}
public class class_UDPListener
{
// Main class for UDP listener
int listenPort; // Port to listen at
public bool done; // Helper to exit main loop without killing thread
public UdpClient listener; // Listener object
public string[] LogHistory; // Log history for GUI
public string[] SendBuffer; // Mysql send buffer
public class_UDPListener(int port, ref string[] LogHistory, ref string[] SendBuffer)
{
// Create clas - NOTE that there is reference passing
this.listenPort = port;
this.LogHistory = LogHistory;
this.SendBuffer = SendBuffer;
}
public void StartListen()
{
// Start listening to UDP
this.done = false;
listener = new UdpClient(listenPort);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort);
string received_data;
byte[] receive_byte_array;
Console.WriteLine("UDP Listen start");
try
{
while (!done)
{
Console.WriteLine("UDP: Waiting for packet");
receive_byte_array = listener.Receive(ref groupEP);
received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length);
Console.WriteLine("Sender: {0} Payload: {1}", groupEP.ToString(), received_data);
// Add to log history and rotate
dynamic udp_frame = JsonConvert.DeserializeObject(received_data);
string type = udp_frame.type;
LogHistoryAdd(ref LogHistory, "UDP packet received, type: " + type);
// Add to mySQL send buffer and rotate
for (int i = 0; i < SendBuffer.Length - 1; i++)
{
SendBuffer[i] = SendBuffer[i + 1];
}
SendBuffer[9] = received_data;
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("UDP listen stop");
listener.Close();
}
}
public form_Main()
{
// Form init
InitializeComponent();
}
private void form_Main_Load(object sender, EventArgs e)
{
// Form loaded - fill controls with default values
LogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun loaded...";
// Load settings
con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB;
con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User;
con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password;
con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server;
con_txt_mysql_port.Text = Properties.Settings.Default.MYSQL_Port;
con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE;
con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE;
con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE;
con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE;
// Version to title header
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
System.Deployment.Application.ApplicationDeployment cd = System.Deployment.Application.ApplicationDeployment.CurrentDeployment;
publishVersion = cd.CurrentVersion.ToString();
}
this.Text = this.Text + " - v" + publishVersion;
}
private void con_Button_Listen_ON_Click(object sender, EventArgs e)
{
// Start listening
UDPListener = new class_UDPListener(48620, ref LogHistory, ref SendBuffer);
thread_UDPListener = new Thread(UDPListener.StartListen);
thread_UDPListener.Start();
// Update form controls
con_Button_Listen_ON.Enabled = false;
con_Button_Listen_OFF.Enabled = true;
con_txt_mysql_database.Enabled = false;
con_txt_mysql_username.Enabled = false;
con_txt_mysql_password.Enabled = false;
con_txt_mysql_server.Enabled = false;
con_txt_mysql_port.Enabled = false;
con_txt_3rd_lotatc.Enabled = false;
con_txt_3rd_srs.Enabled = false;
con_check_3rd_lotatc.Enabled = false;
con_check_3rd_srs.Enabled = false;
// Save settings
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text;
Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text;
Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text;
Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked;
Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked;
// Prepare connection string
MySql_connStr = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text;
// Start timmers
tim_1000ms.Enabled = true;
tim_10000ms.Enabled = true;
}
private void con_Button_Listen_OFF_Click(object sender, EventArgs e)
{
// Stop listening
UDPListener.listener.Close();
// Update form controls
con_Button_Listen_ON.Enabled = true;
con_Button_Listen_OFF.Enabled = false;
con_txt_mysql_database.Enabled = true;
con_txt_mysql_username.Enabled = true;
con_txt_mysql_password.Enabled = true;
con_txt_mysql_port.Enabled = true;
con_txt_mysql_server.Enabled = true;
con_txt_3rd_lotatc.Enabled = true;
con_txt_3rd_srs.Enabled = true;
con_check_3rd_lotatc.Enabled = true;
con_check_3rd_srs.Enabled = true;
// Stop timmers
tim_1000ms.Enabled = false;
tim_10000ms.Enabled = false;
}
private void timer1_Tick(object sender, EventArgs e)
{
// Main timer to sync GUI with background tasks and flush buffers
// Refresh Log Window
con_List_Received.Items.Clear();
foreach (string i in LogHistory)
{
if (i != null)
{
con_List_Received.Items.Add(i);
}
}
// Send buffer to MySQL
for (int i = 0; i < SendBuffer.Length - 1; i++)
{
if (SendBuffer[i] != null)
{
SendToMySql(SendBuffer[i]);
SendBuffer[i] = null;
}
}
}
private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
// Open default browser with link to Perun repo
ProcessStartInfo sInfo = new ProcessStartInfo("https://github.com/szporwolik/perun");
Process.Start(sInfo);
}
private void con_Button_Quit_Click(object sender, EventArgs e)
{
// Close app
DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{
// Save settings on exit
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text;
Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text;
Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text;
Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked;
Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked;
Properties.Settings.Default.Save();
LetMeOut = true;
this.Close();
}
else if (dialogResult == DialogResult.No)
{
//do nothing
}
}
private void form_Main_FormClosing(object sender, FormClosingEventArgs e)
{
// Minimize to try
if (e.CloseReason == CloseReason.UserClosing && !LetMeOut)
{
e.Cancel = true;
trayIconMain.Visible = true;
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
//this.Hide();
}
}
private void trayIconMain_MouseDoubleClick(object sender, MouseEventArgs e)
{
// Maximize from try
trayIconMain.Visible = false;
this.WindowState = FormWindowState.Normal;
this.ShowInTaskbar = true;
}
private void con_txt_3rd_srs_Click(object sender, MouseEventArgs e)
{
// Chose SRS Json file
if (openFileDialog_SRS.ShowDialog() == DialogResult.OK)
{
con_txt_3rd_srs.Text = openFileDialog_SRS.FileName;
con_check_3rd_srs.Checked = true;
}
else
{
con_txt_3rd_srs.Text = "";
con_check_3rd_srs.Checked = false;
}
}
private void con_txt_3rd_lotatc_Click(object sender, MouseEventArgs e)
{
// Chose LotATC Json file
if (openFileDialog_LotATC.ShowDialog() == DialogResult.OK)
{
con_txt_3rd_lotatc.Text = openFileDialog_LotATC.FileName;
con_check_3rd_lotatc.Checked = true;
}
else
{
con_txt_3rd_lotatc.Text = "";
con_check_3rd_lotatc.Checked = false;
}
}
private void tim_10000ms_Tick(object sender, EventArgs e)
{
// Main timer to send JSON files to MySQL
string strSRSJson = "";
string strLotATCJson = "";
bool SRSdefault = true;
bool LotATCdefault = true;
// Handle SRS
if (con_check_3rd_srs.Checked)
{
try
{
strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
dynamic raw_lotatc = JsonConvert.DeserializeObject(strSRSJson);
for (int i = 0; i < raw_lotatc.Count; i++)
{
if (raw_lotatc[i].RadioInfo != null)
{
int temp = raw_lotatc[i].RadioInfo.radios.Count - 1;
for (int j = temp; j >= 0; j--)
{
raw_lotatc[i].RadioInfo.radios[j].enc.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].encKey.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].encMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMax.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMin.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].modulation.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].volMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].expansion.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].channel.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].simul.Parent.Remove();
if (raw_lotatc[i].RadioInfo.radios[j].name == "No Radio")
{
raw_lotatc[i].RadioInfo.radios[j].Remove();
}
}
raw_lotatc[i].ClientChannelId.Parent.Remove();
raw_lotatc[i].RadioInfo.simultaneousTransmission.Parent.Remove();
}
}
if (raw_lotatc.Count > 0)
{
strSRSJson = JsonConvert.SerializeObject(raw_lotatc);
strSRSJson = "{'type':'100','payload':'" + strSRSJson + "'}";
}
else
{
strSRSJson = "{'type':'100','payload':{'ignore':'false'}}";
}
SRSdefault = false;
LogHistoryAdd(ref LogHistory, "SRS data loaded");
}
catch
{
LogHistoryAdd(ref LogHistory, "SRS data ERROR");
}
}
if (SRSdefault)
{
strSRSJson = "{'type':'100','payload':{'ignore':'true'}}";
}
SendToMySql(strSRSJson);
// Handle LotATC
if (con_check_3rd_lotatc.Checked)
{
try
{
strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
dynamic raw_srs = JsonConvert.DeserializeObject(strLotATCJson);
strLotATCJson = "{'type':'101','payload':'" + strLotATCJson + "'}";
LotATCdefault = false;
LogHistoryAdd(ref LogHistory, "LotATC data loaded");
}
catch
{
LogHistoryAdd(ref LogHistory, "LotATC data ERROR");
}
}
if (LotATCdefault)
{
strLotATCJson = "{'type':'101','payload':{'ignore':'true'}}";
}
SendToMySql(strLotATCJson);
}
}

View File

@@ -117,4 +117,586 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="tim_1000ms.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="trayIconMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>134, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="trayIconMain.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
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
7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA
AAAAAAAAAAAAAOzs7BTs7Oxx7Ozs6+zs7P/s7Oz/7Ozs/+zs7P/s7Ozg7OzsCQAAAAAAAAAAAAAAAOzs
7JXs7Oz/7Ozs/+zs7P/s7Oz/7OzsnOzs7AoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsWezs
7P/s7Oz/7Ozs/+zs7P/s7Ozn7OzsDAAAAAAAAAAAAAAAAOzs7HXs7Oz/7Ozs/+zs7P/s7Oz/7Ozsruzs
7A4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7BHs7Oy17Ozs/+zs7P/s7Oz/7Ozs/+zs
7HsAAAAAAAAAAAAAAADs7OwR7Ozs7uzs7P/s7Oz/7Ozs/+zs7P/s7Ow8AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAOzs7AHs7OzK7Ozs/+zs7P/s7Oz/7OzsXgAAAAAAAAAAAAAAAOzs7Bns7Ozz7Ozs/+zs
7P/s7Oz/7OzspOvr6wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6+vrA+zs
7K7s7Oz/7Ozs/+zs7P/s7Oz07OzsGwAAAAAAAAAAAAAAAOzs7G3s7Oz/7Ozs/+zs7P/s7OyqAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsN+zs7P/s7Oz/7Ozsxenp6QAAAAAAAAAAAAAA
AADs7Oyj7Ozs/+zs7P/s7Oz/7Ozs1+zs7AkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADs7OwL7Ozs3ezs7P/s7Oz/7Ozs/+zs7KQAAAAAAAAAAAAAAADs7OwE7Ozs1uzs
7P/s7Oz27OzsHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oyh7Ozs/uzs
7DIAAAAAAAAAAAAAAADs7Ow47Ozs/+zs7P/s7Oz/7Ozs/+zs7E8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7OzsNwAA
AAAAAAAAAAAAAOzs7Efs7Oz/7OzsgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA7OzsHOzs7JIAAAAAAAAAAAAAAADs7OwB7OzszOzs7P/s7Oz/7Ozs/+zs7OTj4+MAAAAAAAAA
AAAAAAAAAAAAAICAgAWAgICJgICA5YCAgOKAgIB/gICAAgAAAAAAAAAAAAAAAAAAAADt7e0C7Ozs6+zs
7P/s7Oz/7Ozs/+zs7Mr4+PgAAAAAAAAAAAAAAAAA7Ozsmuzs7AoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADm5uYAAAAAAAAAAAAAAAAA7OzsZezs7P/s7Oz/7Ozs/+zs
7P/s7OygAAAAAAAAAAAAAAAAAAAAAAAAAACAgICPgICA/4CAgP+AgID/gICA/4CAgIEAAAAAAAAAAAAA
AAAAAAAAAAAAAOzs7Krs7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsD+zs
7Ovs7Oz/7Ozs/+zs7P/s7Oz/7OzsfQAAAAAAAAAAAAAAAAAAAAAAAAAAgICA84CAgP+AgID/gICA/4CA
gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
//gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
//gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
//gf////////+B////8=
</value>
</data>
<metadata name="openFileDialog_SRS.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>257, 17</value>
</metadata>
<metadata name="openFileDialog_LotATC.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>397, 17</value>
</metadata>
<metadata name="tim_10000ms.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>563, 19</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAQD8AAAEAIAAgQQAAFgAAACgAAABAAAAAfgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGB
gQGAgICFgICA7YCAgPaAgICfgICACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgIB6gICA/4CAgP+AgID/gICA/4CAgKcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICA14CAgP+AgID/gICA/4CAgP+AgID8hISEAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs
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
7P/s7Oz/7OzsogAAAAAAAAAAAAAAAOzs7AXs7OzZ7Ozs/+zs7P/s7Oy2AAAAAAAAAAAAAAAAAAAAAOzs
7MHs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz77Ozshezs
7A8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Owj7OzsDgAAAAAAAAAAAAAAAAAAAADs7Oyn7Ozs/uzs
7Lvs7Ox47OzsVuzs7Evs7Oxn7Ozsnezs7Ozs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ow2AAAAAAAAAAAAAAAA7OzsSuzs7P/s7Oz67OzsJwAA
AAAAAAAAAAAAAOzs7Fns7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Ozz7OzsqOzs7G7s7OxW7OzsW+zs7Hjs7Oy57Ozs/ezs7IwAAAAAAAAAAAAA
AADs7Ow87Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsxubm5gAAAAAAAAAAAAAA
AADs7Oy17OzsjAAAAAAAAAAAAAAAAOzs7Ars7Ozi7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz57OzsJQAAAADs7OwD7Ozs0ezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7OxcAAAAAAAAAAAAAAAA7OzsJ+zs7A0AAAAAAAAAAAAAAADs7OyC7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7LQAAAAA7OzsbOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs5Ozs7AoAAAAAgICATYCAgLOAgIC7gICAZGRkZADs7Owi7Ozs9+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsSezs7Gvs7Ox+7OzsgOzs
7ILs7OyE7Ozsh+zs7Ins7OyL7Ozsjuzs7I/s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7OzslOzs
7JTs7OyV7Ozsluzs7Jbs7OyX7Ozsl+zs7Jjs7OyZ7Ozsmezs7Jrs7Ow7gICAVoCAgP+AgID/gICA/4CA
gP+AgICA7OzsN+zs7G3s7Oxv7Ozscezs7HTs7Ox27Ozseezs7Hvs7Ox97Ozsf+zs7IHs7OyE7Ozshuzs
7Ins7OyL7Ozsjezs7I7s7OyP7OzskOzs7JDs7OyR7Ozskuzs7JLs7OyT7Ozsk+zs7JTs7OyV7Ozslezs
7G4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICA
gMyAgID/gICA/4CAgP+AgID/gICA8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgIDegICA/4CAgP+AgID/gICA/4CAgP+RkZEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAl4CAgP+AgID/gICA/4CAgP+AgIC9AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7Oxw7Ozsm+zs
7Jrs7Oya7Ozsmezs7Jns7OyY7Ozsl+zs7Jfs7OyW7Ozsluzs7JXs7OyU7OzslOzs7JPs7OyS7Ozskuzs
7JHs7OyR7OzskOzs7I/s7OyP7Ozsjuzs7Ivs7OyJ7Ozsh+zs7IXs7OyD7OzsQoCAgAuAgICzgICA/4CA
gP+AgIDLgICAHezs7Dns7Oye7Ozsnuzs7J3s7Oyd7OzsnOzs7Jzs7Oyb7Ozsm+zs7Jrs7Oya7Ozsmezs
7Jns7OyY7OzsmOzs7Jfs7OyW7Ozsluzs7JXs7OyV7OzslOzs7JPs7OyT7Ozskuzs7JHs7OyR7OzskOzs
7JDs7Ox67OzsRezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs9ezs
7B4AAAAAAAAAAICAgBuAgIAjfX19AAAAAADs7OwI7Ozs3+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7OzsYAAAAADs7Oy07Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7H0AAAAAAAAAAAAAAADs7OwK7OzsHwAAAAAAAAAAAAAAAOzs7Ffs7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozsw+rq6gAAAAAA7OzsJ+zs7Pvs7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7N7s7OwIAAAAAAAAAAAAAAAA7Ozsg+zs7K0AAAAAAAAAAAAA
AADKysoA7Ozswezs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs++zs7CwAAAAAAAAAAAAA
AADs7OyS7Ozs+Ozs7Kns7Oxn7OzsPuzs7Drs7OxY7Ozsjuzs7Ofs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7OxSAAAAAAAAAAAAAAAA7OzsIOzs
7Pbs7Oz/7OzsQwAAAAAAAAAAAAAAAOzs7DDs7Oz+7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Ozx7Ozspuzs7Gzs7OxT7OzsWuzs7Hjs7Oy57Ozs/ezs
7IwAAAAAAAAAAAAAAAAAAAAA7OzsEOzs7BYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwF7Ozsaezs
7PPs7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oy8AAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADs7Owz7Ozs/+zs7P/s7Oz/7Ozs/+zs7EsAAAAAAAAAAAAAAADs7Owl7Ozs+ezs7P/s7Oz/7Ozs/+zs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/uzs7DEAAAAAAAAAAAAA
AADs7OxN7Ozs/+zs7P/s7Oz/7Ozs/+zs7DEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADs7OwD7Ozsxezs7P/s7Oz/7Ozs/+zs7LUAAAAAAAAAAAAAAAAAAAAA7OzstOzs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs
7P/s7OzB6urqAAAAAAAAAAAAAAAAAOzs7Lrs7Oz/7Ozs/+zs7P/s7OzB7OzsAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr6+sA7Ozsluzs7P/s7Oz/7Ozs/+zs7Pjs7OwlAAAAAAAA
AAAAAAAA7OzsTOzs7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7P3s7OzT7Ozstuzs7Ljs7OzU7Ozs/uzs
7P/s7Oz/7Ozs/+zs7P/s7Oz/7Ozs/+zs7FQAAAAAAAAAAAAAAADs7Owq7Ozs/Ozs7P/s7Oz/7Ozs/+zs
7JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs7OwO7Ozspuzs7P/s7Oz/7Ozs/+zs
7P/s7OyIAAAAAAAAAAAAAAAA7OzsBuzs7Nrs7Oz/7Ozs/+zs7P/s7Oz/7Ozs6Ozs7G3s7OwSAAAAAAAA
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
gP+AgIDjAAAAAAAAAAAAAAAAAAAAAAAAAADs7OyN7Ozs/+zs7P/s7Oz/7Ozs/+zs7Obs7OwLAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAOzs7ALs7OwI7OzsCOzs7Ajs7OwI7OzsCOzs7AQAAAAAAAAAAAAAAAAAAAAAAAAAAICA
gPaAgID/gICA/4CAgP+AgID/gICA5gAAAAAAAAAAAAAAAAAAAAAAAAAA7OzsBOzs7Ajs7OwI7OzsCOzs
7Ajs7OwI6+vrAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACAgICagICA/4CAgP+AgID/gICA/4CAgIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICACoCAgJeAgID0gICA8ICAgI6AgIAFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////4H///////
//gf////////+A///////4D4DwH/////wPgfA7////nA/B8Dn///+OB//gcf///wcD/8Dg////BwH/wO
D///4DgP8BwH///gOAPAHAf///gcAAA4H////BwAAHgf///8DgAAcD//+D4HAADgfB/wPgcAAOB8D/Ae
A4ABwHgP8B4DgAHAeA/wHgHAA4B4D/A+AeAHAHwP/HwA4AcAPj///ABwDgA////4AHAOAB////AAOBwA
D//PwAA4PAAD88AAABw4AAADgAAAHnAAAAEAAAAOcAAAAQAAAAQgAAAAAAAAAAAAAAD////4H///////
//gf////////+B////8AAAAAAAAAAAAAAAZgAAAAgAAADnAAAAGAAAAOeAAAAcAAABw4AAADz8AAPBwA
A/P/8AA4HAAP///4AHAOAB////wAcA4AP//4fADgBwA+P/A+AeAHgHwP8B4BwAOAeA/wHgPAAcB4D/Ae
A4ABwHgP8D4HAADgfA/4fgcAAOB8H//8DgAAcD////geAAB4H///+BwAADgf///gOAPAHAf//+A4D/Ac
B///4HAf+A4P///w8D/8Dg////jgf/4HH///+cD4Hgef////wPgfA/////+A+B8B/////4D4HwH/////
//gf////////+B////8=
</value>
</data>
</root>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Google.Protobuf" version="3.5.1" targetFramework="net461" />
<package id="MySql.Data" version="8.0.15" targetFramework="net461" />
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net461" />
</packages>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

135
03_MySQL/m1081_perun.sql Normal file
View File

@@ -0,0 +1,135 @@
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Baza danych: `m1081_perun`
--
CREATE DATABASE IF NOT EXISTS `m1081_perun` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `m1081_perun`;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataMissionHashes`
--
DROP TABLE IF EXISTS `pe_DataMissionHashes`;
CREATE TABLE IF NOT EXISTS `pe_DataMissionHashes` (
`pe_DataMissionHashes_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_DataMissionHashes_hash` varchar(150) NOT NULL,
`pe_DataMissionHashes_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pe_DataMissionHashes_id`),
UNIQUE KEY `UNIQUE_hash` (`pe_DataMissionHashes_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataPlayers`
--
DROP TABLE IF EXISTS `pe_DataPlayers`;
CREATE TABLE IF NOT EXISTS `pe_DataPlayers` (
`pe_DataPlayers_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_DataPlayers_ucid` varchar(150) NOT NULL,
`pe_DataPlayers_lastip` varchar(100) NOT NULL,
`pe_DataPlayers_lastname` varchar(150) NOT NULL,
`pe_DataPlayers_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`pe_DataPlayers_id`),
UNIQUE KEY `UNIQUE_UCID` (`pe_DataPlayers_ucid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataRaw`
--
DROP TABLE IF EXISTS `pe_DataRaw`;
CREATE TABLE IF NOT EXISTS `pe_DataRaw` (
`pe_dataraw_type` tinyint(4) NOT NULL AUTO_INCREMENT,
`pe_dataraw_payload` text NOT NULL,
`pe_dataraw_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pe_dataraw_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogChat`
--
DROP TABLE IF EXISTS `pe_LogChat`;
CREATE TABLE IF NOT EXISTS `pe_LogChat` (
`pe_LogChat_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_LogChat_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pe_LogChat_missionhash_id` bigint(20) DEFAULT NULL,
`pe_LogChat_playerid` varchar(100) NOT NULL,
`pe_LogChat_msg` text NOT NULL,
`pe_LogChat_all` varchar(10) NOT NULL,
PRIMARY KEY (`pe_LogChat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogEvent`
--
DROP TABLE IF EXISTS `pe_LogEvent`;
CREATE TABLE IF NOT EXISTS `pe_LogEvent` (
`pe_LogEvent_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_LogEvent_missionhash_id` bigint(20) DEFAULT NULL,
`pe_LogEvent_datetime` datetime DEFAULT CURRENT_TIMESTAMP,
`pe_LogEvent_type` varchar(100) NOT NULL,
`pe_LogEvent_content` text NOT NULL,
PRIMARY KEY (`pe_LogEvent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogLogins`
--
DROP TABLE IF EXISTS `pe_LogLogins`;
CREATE TABLE IF NOT EXISTS `pe_LogLogins` (
`pe_LogLogins_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_LogLogins_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pe_LogLogins_playerid` bigint(20) DEFAULT NULL,
`pe_LogLogins_name` varchar(150) NOT NULL,
`pe_LogLogins_ip` varchar(100) NOT NULL,
PRIMARY KEY (`pe_LogLogins_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogStats`
--
DROP TABLE IF EXISTS `pe_LogStats`;
CREATE TABLE IF NOT EXISTS `pe_LogStats` (
`pe_LogStats_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_LogStats_missionhash_id` bigint(20) DEFAULT NULL,
`pe_LogStats_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pe_LogStats_playerid` bigint(20) DEFAULT NULL,
`pe_LogStats_debug` text,
PRIMARY KEY (`pe_LogStats_id`),
UNIQUE KEY `UNIQUE_STATS_PER_MISSION_AND_UCID` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

View File

@@ -1,29 +1,55 @@
# Perun for DCS World
This toolset extracts data from DCS World server and export it to local json file and UDP port.
This toolset extracts data from DCS World server and sends information to the local Json file and UDP port.
## Getting Started
Provided windows app puts JSON data to MySQL database. Additionaly Perun windows app can be used to merge LotATC and DCS SRS data in one database making Perun for DCS World wannabe ultimate integration tool for the server admins.
You can use this toolkit with or without Windows app. Simple DCS export scripts will create JSON file which can be used for further processing.
However this software is intended to be used by experienced users - the output is data Json and MySQL; you will need to process/display it yourself.
![Perun in action](https://i.imgur.com/ougQMPq.png)
![Data flow](https://i.imgur.com/sHDQoLM.png)
### Prerequisites
JSON Export:
* DCS World stable or DCS World beta
Core:
* For JSON Export:
* DCS World stable or DCS World beta
* **(Optional)** For MySQL Export:
* MySQL server with read/write access
For UDP Export:
* Windows app which handles UDP readouts
For MySQL Export:
* MySQL server with read/write access
3rd party support:
* for [DCS SRS](https://github.com/ciribob/DCS-SimpleRadioStandalone/releases) integration location of the clients-list.json file will be required (by default: SRS Server folder), "Auto Export List" option has to be enabled - see [SRS documentation](https://github.com/ciribob/DCS-SimpleRadioStandalone/wiki)
* for [LotATC](https://www.lotatc.com/) you will need location of stats.json file and proper LotATC configuration with JSON data export enabled - see [LotATC documentation](https://www.lotatc.com/documentation/server_configuration.html)
### Installing
* Copy contents of DCS folder to you \Scripts folder (inside DCS folder in your Saved Games)
* Download latest [release](https://github.com/szporwolik/perun/releases), **optionaly** together with Win32 binary file for MySQL export - [DOWNLOAD](http://share.porwolik.com/ftp/perun/Perun.htm)
* Copy contents of [01_DCS](https://github.com/szporwolik/perun/tree/master/01_DCS) to your \Scripts folder (located inside DCS folder in your Saved Games)
* **optionaly** Create MySQL server using SQL script located in [03_MySQL](https://github.com/szporwolik/perun/tree/master/03_MySQL)
* **optionaly** Run the Win32 application
* set MySQL connection data
* point LotATC json file location
* point DCS SRS json file location
* click connect and leave the app running in the background
* Start DCS World and host multiplayer session
* by default the JSON is written into Scripts\Json folder located in your Saved Games DCS folder tree
* by default the UDP port 48620 is in use as target port
## Testing
TBD
## Data packets
* ID: 1, contains version information
* ID: 2, contains status data in the following sections
* mission - minimal information
* players - connected players
* ID: 3, available slots list and coalitions
* coalitions - available coalitions
* slots - available slots
* ID: 4, stores mission data **ONLY JSON FILE**
* ID: 50, chat event
* ID: 51, game event
* ID: 52, player stats
* ID: 53, player login to DCS server
* ID: 100, DCS SRS's client-list.json
* ID: 101, LotATC's stats.json
## Built With