Refactor to a control api.

master
Zed A. Shaw 3 weeks ago
parent 735758f9cd
commit a5214f942e
  1. 1
      meson.build
  2. 3
      src/bezos_ctl.cpp
  3. 29
      src/control.cpp
  4. 23
      src/control.hpp
  5. 34
      src/main.cpp

@ -95,6 +95,7 @@ sources = [
'src/slides_ui.cpp', 'src/slides_ui.cpp',
'src/parser.cpp', 'src/parser.cpp',
'src/backend.cpp', 'src/backend.cpp',
'src/control.cpp',
] ]
tests = [ tests = [

@ -3,6 +3,7 @@
#include <SFML/Network/UdpSocket.hpp> #include <SFML/Network/UdpSocket.hpp>
#include <memory> #include <memory>
#include <unistd.h> #include <unistd.h>
#include "control.hpp"
using namespace std::chrono_literals; using namespace std::chrono_literals;
@ -18,7 +19,7 @@ struct Options {
void request_focus(Options& options) { void request_focus(Options& options) {
fmt::println("Moving control window front: port={}", options.port); fmt::println("Moving control window front: port={}", options.port);
sf::UdpSocket sock; sf::UdpSocket sock;
uint32_t cmd = 2; uint32_t cmd = uint32_t(CtrlCommand::FOCUS);
auto localhost = sf::IpAddress::getLocalAddress(); auto localhost = sf::IpAddress::getLocalAddress();
auto result = sock.send(&cmd, sizeof cmd, *localhost, options.port); auto result = sock.send(&cmd, sizeof cmd, *localhost, options.port);
} }

@ -0,0 +1,29 @@
#include "control.hpp"
#include "constants.hpp"
#include <fmt/core.h>
#include <optional>
#include <SFML/Window/Mouse.hpp>
void CtrlSocket::listen() {
auto status = $socket.bind(port);
if(status == sf::Socket::Status::Error) {
fmt::println("Error binding UDP port {}", port);
}
$socket.setBlocking(false);
fmt::println("Focus listener on port {}", port);
}
CtrlCommand CtrlSocket::receive() {
uint32_t cmd = uint32_t(CtrlCommand::NONE);
size_t received = 0;
std::optional<sf::IpAddress> sender;
if($socket.receive(&cmd, sizeof cmd, received, sender, port) == sf::Socket::Status::Done) {
fmt::println("sender {} sent {}", sender->toString(), cmd);
}
return static_cast<CtrlCommand>(cmd);
}

@ -0,0 +1,23 @@
#pragma once
#include <SFML/Network/UdpSocket.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
enum class CtrlCommand {
FOCUS,
FULL_SCREEN,
MOVE_LEFT,
MOVE_RIGHT,
NEXT_SLIDE,
PREV_SLIDE,
QUIT,
NONE
};
struct CtrlSocket {
unsigned short port=9898;
sf::UdpSocket $socket{};
void listen();
CtrlCommand receive();
};

@ -9,9 +9,9 @@
#include <filesystem> #include <filesystem>
#include <chrono> #include <chrono>
#include <SFML/System/Clock.hpp> #include <SFML/System/Clock.hpp>
#include <SFML/Network/UdpSocket.hpp>
#include <memory> #include <memory>
#include <unistd.h> #include <unistd.h>
#include "control.hpp"
using namespace std::chrono_literals; using namespace std::chrono_literals;
@ -73,22 +73,6 @@ void print_usage() {
fmt::println("USAGE: bezos [-p PORT] [-hf] -d deck.md"); fmt::println("USAGE: bezos [-p PORT] [-hf] -d deck.md");
} }
std::optional<sf::UdpSocket> listen_control(Options& opts) {
sf::UdpSocket socket;
auto status = socket.bind(opts.port);
if(status == sf::Socket::Status::Error) {
fmt::println("Failed to bind port");
return std::nullopt;
}
socket.setBlocking(false);
fmt::println("Focus listener on port {}", opts.port);
return socket;
}
Options parse_options(int argc, char* argv[]) { Options parse_options(int argc, char* argv[]) {
int opt = 0; int opt = 0;
Options result; Options result;
@ -130,12 +114,6 @@ int main(int argc, char *argv[]) {
return 1; return 1;
} }
auto control = listen_control(options);
if(control == std::nullopt) {
fmt::println("Error binding UDP port {}", options.port);
}
auto& modes = sf::VideoMode::getFullscreenModes(); auto& modes = sf::VideoMode::getFullscreenModes();
auto screen_mode = std::find_if(modes.begin(), modes.end(), [=](const auto& a) -> bool { auto screen_mode = std::find_if(modes.begin(), modes.end(), [=](const auto& a) -> bool {
return a.size.x == WINDOW_WIDTH && a.size.y == WINDOW_HEIGHT; return a.size.x == WINDOW_WIDTH && a.size.y == WINDOW_HEIGHT;
@ -163,18 +141,16 @@ int main(int argc, char *argv[]) {
control_ui.init(); control_ui.init();
control_ui.full_screen(false); control_ui.full_screen(false);
dbc::check(control_ui.$status != nullptr, "bad ptr"); CtrlSocket ctrl_sock{options.port};
ctrl_sock.listen();
ChangeDetector slides_reloader{options.deck_file}; ChangeDetector slides_reloader{options.deck_file};
ChangeDetector layout_reloader{slides->$deck->config["layouts"]}; ChangeDetector layout_reloader{slides->$deck->config["layouts"]};
while(controller.isOpen()) { while(controller.isOpen()) {
uint32_t cmd = 0; auto command = ctrl_sock.receive();
std::size_t received = 0;
std::optional<sf::IpAddress> sender;
if(control->receive(&cmd, sizeof cmd, received, sender, options.port) == sf::Socket::Status::Done) { if(command == CtrlCommand::FOCUS) {
fmt::println("sender {} sent {}", sender->toString(), cmd);
sf::Mouse::setPosition({WINDOW_WIDTH - 100, WINDOW_HEIGHT - 100}, presenter); sf::Mouse::setPosition({WINDOW_WIDTH - 100, WINDOW_HEIGHT - 100}, presenter);
} }

Loading…
Cancel
Save