Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new library for communicating with other programs via Lua #1080

Merged
merged 2 commits into from
Mar 13, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 149 additions & 0 deletions Assets/Lua/UnitTests/TestCommunication_All.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end

function get_baseline()
i = 100
client.reboot_core()
t = os.clock()

while i > 0 do
emu.frameadvance()
i = i - 1
end
baseline = os.clock() - t
print('Baseline: ' .. round(baseline, 3) .. " secs")
return baseline
end

function test_mmf()
i = 100
client.reboot_core()
t = os.clock()
while i > 0 do
emu.frameadvance()
comm.mmfScreenshot()
i = i - 1
end
print('Memory mapped files: ' .. round((os.clock() - t - baseline), 3) .. " secs")
end

function test_http()
print("Testing HTTP server")
client.reboot_core()
i = 100
t = os.clock()

while i > 0 do
emu.frameadvance()
comm.httpTestGet()
i = i - 1
end
print('HTTP get: ' .. round((os.clock() - t - baseline), 3) .. " secs")

client.reboot_core()
i = 100
t = os.clock()

while i > 0 do
emu.frameadvance()
comm.httpPostScreenshot()
i = i - 1
end
print('HTTP post: ' .. round((os.clock() - t - baseline), 3) .. " secs")

end

function test_socket()

i = 100
client.reboot_core()
t = os.clock()
while i > 0 do
emu.frameadvance()
comm.socketServerScreenShot()
i = i - 1
end
print('Socket server: ' .. round((os.clock() - t - baseline), 3) .. " secs")
end

function test_socketresponse()
best_time = -100
timeouts = {1, 2, 3, 4, 5, 10, 20, 25, 50, 100, 250, 500, 1000}
comm.socketServerSetTimeout(1000)
resp = comm.socketServerScreenShotResponse()
for t, timeout in ipairs(timeouts) do
comm.socketServerSetTimeout(timeout)
client.reboot_core()
print("Trying to find minimal timeout for Socket server")
i = 100
t = os.clock()
while i > 0 do
emu.frameadvance()
resp = comm.socketServerScreenShotResponse()
if resp ~= 'ack' then
i = -100
print(resp)
print("Failed to a get a proper response")
end
i = i - 1
end
if i > -100 then
print("Best timeout: " .. timeout .. " msecs")
print("Best time: " .. round((os.clock() - t - baseline), 3) .. " secs")
break
end
end

end

function test_http_response()
err = false
print("Testing HTTP server response")
client.reboot_core()
i = 100

while i > 0 do
emu.frameadvance()
resp = comm.httpTestGet()
if resp ~= "<html><body><h1>hi!</h1></body></html>" then
print("Failed to get correct HTTP get response")
print(resp)
i = 0
err = true
end
i = i - 1
end
if not err then
print("HTTP GET looks fine: No errors occurred")
end

client.reboot_core()
i = 100
err = false
while i > 0 do
emu.frameadvance()
resp = comm.httpPostScreenshot()
if resp ~= "<html><body>OK</body></html>" then
print("Failed to get correct HTTP post response")
print(resp)
i = 0
err = true
end
i = i - 1
end
if not err then
print("HTTP POST looks fine: No errors occurred")
end
end

baseline = get_baseline()
test_socket()
test_mmf()
test_http()
print("#####################")
test_http_response()
test_socketresponse()
print()

91 changes: 91 additions & 0 deletions Assets/Lua/UnitTests/TestCommunication_Simple.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
print("##########################################################")
getUrl = comm.httpGetGetUrl()
print("GET URL: " .. getUrl)

postUrl = comm.httpGetPostUrl()
print("POST URL: " .. postUrl)

print("\nChecking GET URL change")
error = false
comm.httpSetGetUrl('a')
if (getUrl ~= comm.httpGetGetUrl()) then
comm.httpSetGetUrl(getUrl)
error = (getUrl ~= comm.httpGetGetUrl())
else
error = true
end

if error == false then
print("Get URL was successfully changed")
else
print("Error while changing Get URL")
end


print("\nChecking POST URL change")
error = false
comm.httpSetPostUrl('a')
if (postUrl ~= comm.httpGetPostUrl()) then
comm.httpSetPostUrl(postUrl)
error = (postUrl ~= comm.httpGetPostUrl())
else
error = true
end

if error == false then
print("Post URL was successfully changed")
else
print("Error while changing Post URL")
end

print("\nChecking GET request")
getResponse = comm.httpGet("http://tasvideos.org/BizHawk.html")
if string.find(getResponse, "Bizhawk") then
print("GET seems to work")
else
print("Either the Bizhawk site is down or the GET does not work")
end

print("\nChecking memory mapped filed")

size = comm.mmfScreenshot()
if size > 0 then
print("Memory mapped file was successfully written")
else
print("Failed to write memory mapped file")
end

mmf_filename = comm.mmfGetFilename()
print("MMF filename: " .. mmf_filename)
comm.mmfSetFilename("deleteme.tmp")
error = false
if (mmf_filename ~= comm.mmfGetFilename()) then
comm.mmfSetFilename(mmf_filename)
error = (mmf_filename ~= comm.mmfGetFilename())
else
error = true
end
if error == false then
print("MMF filename successfully changed")
else
print("MMF filename change failed")
end

print("Writing to MMF")

message = "ABC"
resp_n = tonumber(comm.mmfWrite(mmf_filename, message))
if (resp_n ~= string.len(message)) then
print("Failed to write to MMF")
else
resp = comm.mmfRead(mmf_filename, string.len(message))
if (resp ~= message) then
print("Failed to read from MMF")
else
print("MMF read and read OK")
end
end


print("\nTests finished")
print("Please run TestCommunication_All.lua with the supplied Python server for a more comprehensive test")
57 changes: 52 additions & 5 deletions BizHawk.Client.EmuHawk/ArgParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,14 @@ class ArgParser
public bool luaConsole = false;
public int socket_port = 9999;
public string socket_ip = null;
public string mmf_filename = null;
public string URL_get = null;
public string URL_post = null;

public void ParseArguments(string[] args)

public void parseArguments(string[] args)

{
for (int i = 0; i<args.Length; i++)
for (int i = 0; i < args.Length; i++)
{
// For some reason sometimes visual studio will pass this to us on the commandline. it makes no sense.
if (args[i] == ">")
Expand Down Expand Up @@ -62,8 +65,8 @@ public void parseArguments(string[] args)
}
else if (arg.StartsWith("--dump-frames="))
{
var list = arg.Substring(arg.IndexOf('=') + 1);
var items = list.Split(',');
string list = arg.Substring(arg.IndexOf('=') + 1);
string[] items = list.Split(',');
_currAviWriterFrameList = new HashSet<int>();
foreach (string item in items)
{
Expand Down Expand Up @@ -110,11 +113,55 @@ public void parseArguments(string[] args)
{
socket_ip = arg.Substring(arg.IndexOf('=') + 1);
}
else if (arg.StartsWith("--mmf="))
{
mmf_filename = args[i].Substring(args[i].IndexOf('=') + 1);
}
else if (arg.StartsWith("--url_get="))
{
URL_get = args[i].Substring(args[i].IndexOf('=') + 1);
}
else if (arg.StartsWith("--url_post="))
{
URL_post = args[i].Substring(args[i].IndexOf('=') + 1);
}
else
{
cmdRom = args[i];
}
}
////initialize HTTP communication
if (URL_get != null || URL_post != null)
{
if (URL_get != null)
{
GlobalWin.httpCommunication.initialized = true;
GlobalWin.httpCommunication.SetGetUrl(URL_get);
}
if (URL_post != null)
{
GlobalWin.httpCommunication.initialized = true;
GlobalWin.httpCommunication.SetPostUrl(URL_post);
}
}
//inititalize socket server
if (socket_ip != null && socket_port > -1)
{
GlobalWin.socketServer.initialized = true;
GlobalWin.socketServer.SetIp(socket_ip, socket_port);
}
else if (socket_ip != null)
{
GlobalWin.socketServer.initialized = true;
GlobalWin.socketServer.SetIp(socket_ip);
}

//initialize mapped memory files
if (mmf_filename != null)
{
GlobalWin.memoryMappedFiles.initialized = true;
GlobalWin.memoryMappedFiles.SetFilename(mmf_filename);
}
}
}
}
15 changes: 14 additions & 1 deletion BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
Expand Down Expand Up @@ -92,6 +91,7 @@
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.DirectoryServices" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Numerics" />
<Reference Include="System.Xaml" />
<Reference Include="System.Xml.Linq">
Expand Down Expand Up @@ -193,6 +193,7 @@
<Compile Include="BizBoxInfoControl.Designer.cs">
<DependentUpon>BizBoxInfoControl.cs</DependentUpon>
</Compile>
<Compile Include="Communication.cs" />
<Compile Include="config\AnalogRangeConfig.cs">
<SubType>Component</SubType>
</Compile>
Expand Down Expand Up @@ -870,6 +871,7 @@
<Compile Include="tools\HexEditor\NewHexEditor.Designer.cs">
<DependentUpon>NewHexEditor.cs</DependentUpon>
</Compile>
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Communication.cs" />
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Client.cs" />
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Console.cs" />
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.cs" />
Expand Down Expand Up @@ -2153,6 +2155,17 @@
<ItemGroup>
<Folder Include="config\Saturn\" />
</ItemGroup>
<ItemGroup>
<COMReference Include="WinHttp">
<Guid>{662901FC-6951-4854-9EB2-D9A2570F2B2E}</Guid>
<VersionMajor>5</VersionMajor>
<VersionMinor>1</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
Expand Down
Loading