summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2017-07-04 14:42:32 -0400
committer arbee <rb6502@users.noreply.github.com>2017-07-04 14:42:32 -0400
commit8a494cbeacb56927ae1a5df7d3ec3b450a98fe41 (patch)
treea8ca73e865d384a8ae330a663f87eef2a816df4f
parentd9530078dd00827d605b94ae5d21e5f785544f90 (diff)
output: Fleshed out network output provider so it has the same capability as legacy Win32.
Clients: - Connect to TCP port 8000 - Messages will be of the form "verb = value\1"; if your client is busy when MAME is spamming, you may get multiple messages glued together by \1 separators. (\1 was chosen because it's neutral on Win32/Mac/Linux). - You will get a "hello = 1" message upon connection to MAME, and a "mamerun = 0" message when MAME shuts down. - You may send "send_id = n" to MAME to get IDs where n=0 means ROM set name of current game, 1-? = output node names - MAME will reply "req_id = string\1"; this is currently the only case where a string will be returned instead of an integer value. - A working example POSIX client will be released soon.
-rw-r--r--src/osd/modules/output/network.cpp75
1 files changed, 69 insertions, 6 deletions
diff --git a/src/osd/modules/output/network.cpp b/src/osd/modules/output/network.cpp
index 63ab96e499d..aa88320b6b2 100644
--- a/src/osd/modules/output/network.cpp
+++ b/src/osd/modules/output/network.cpp
@@ -10,6 +10,9 @@
#include "output_module.h"
#include "modules/osdmodule.h"
+#include "modules/lib/osdobj_common.h"
+
+#include "emu.h"
#include <thread>
#include <set>
@@ -36,9 +39,13 @@ public:
{
}
- void start()
+ void start(running_machine &machine)
{
+ m_machine = &machine;
m_clients->insert(shared_from_this());
+ // now send "hello = 1" to the newly connected client
+ std::strncpy(m_data, "hello = 1\1", max_length);
+ do_write(10);
do_read();
}
@@ -49,6 +56,47 @@ private:
do_write(msg.size());
}
+ void handle_message(char *msg)
+ {
+ char verb[1024];
+ int value;
+
+ //printf("handle_message: got [%s]\n", msg);
+
+ std::uint32_t ch = 0;
+ while (msg[ch] != ' ')
+ {
+ ch++;
+ }
+ msg[ch] = '\0';
+ ch++;
+ std::strncpy(verb, msg, sizeof(verb)-1);
+ printf("verb = [%s], ", verb);
+
+ while (msg[ch] != ' ')
+ {
+ ch++;
+ }
+
+ ch++;
+ value = atoi(&msg[ch]);
+ printf("value = %d\n", value);
+
+ if (!std::strcmp(verb, "send_id"))
+ {
+ if (value == 0)
+ {
+ std::snprintf(m_data, max_length, "req_id = %s\1", machine().system().name);
+ }
+ else
+ {
+ std::snprintf(m_data, max_length, "req_id = %s\1", machine().output().id_to_name(value));
+ }
+
+ do_write(std::strlen(m_data));
+ }
+ }
+
void do_read()
{
auto self(shared_from_this());
@@ -57,6 +105,11 @@ private:
{
if (!ec)
{
+ if (length > 0)
+ {
+ m_input_m_data[length] = '\0';
+ handle_message(m_input_m_data);
+ }
do_read();
}
else
@@ -69,7 +122,8 @@ private:
void do_write(std::size_t length)
{
auto self(shared_from_this());
- asio::async_write(m_socket, asio::buffer(m_data, length),
+ printf("do_write: [%d: %s]\n", (int)length, m_data);
+ asio::async_write(m_socket, asio::buffer(m_data, length),
[this, self](std::error_code ec, std::size_t /*length*/)
{
if (ec)
@@ -79,19 +133,23 @@ private:
});
}
+ running_machine &machine() const { return *m_machine; }
+
asio::ip::tcp::socket m_socket;
enum { max_length = 1024 };
char m_data[max_length];
char m_input_m_data[max_length];
client_set *m_clients;
+ running_machine *m_machine;
};
class output_network_server
{
public:
- output_network_server(asio::io_context& io_context, short port) :
+ output_network_server(asio::io_context& io_context, short port, running_machine &machine) :
m_acceptor(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port))
{
+ m_machine = &machine;
do_accept();
}
@@ -109,15 +167,18 @@ private:
{
if (!ec)
{
- std::make_shared<output_session>(std::move(socket),&m_clients)->start();
+ std::make_shared<output_session>(std::move(socket),&m_clients)->start(machine());
}
do_accept();
});
}
+ running_machine &machine() const { return *m_machine; }
+
asio::ip::tcp::acceptor m_acceptor;
client_set m_clients;
+ running_machine *m_machine;
};
@@ -143,6 +204,8 @@ public:
virtual void exit() override
{
+ // tell clients MAME is shutting down
+ notify("mamerun", 0);
m_io_context->stop();
m_working_thread.join();
delete m_server;
@@ -154,7 +217,7 @@ public:
virtual void notify(const char *outname, int32_t value) override
{
static char buf[256];
- sprintf(buf, "%s = %d\n", ((outname==nullptr) ? "none" : outname), value);
+ sprintf(buf, "%s = %d\1", ((outname==nullptr) ? "none" : outname), value);
m_server->deliver_to_all(buf);
}
@@ -162,7 +225,7 @@ public:
void process_output()
{
m_io_context = new asio::io_context();
- m_server = new output_network_server(*m_io_context, 8000);
+ m_server = new output_network_server(*m_io_context, 8000, machine());
m_io_context->run();
}