mini refactoring and cleanup

This commit is contained in:
oxmox 2023-02-12 13:40:41 +01:00
parent 9700ada079
commit 07033c9d13
2 changed files with 53 additions and 95 deletions

View file

@ -7,7 +7,6 @@
#include <SDL.h>
#include "dp_common.h"
#include "log.h"
void dp_sdl_fatal(const char *const msg)
{
@ -15,13 +14,17 @@ void dp_sdl_fatal(const char *const msg)
abort();
}
static const size_t NumDooms = 3;
int doom_controller_loop(nng_socket pubSock, nng_socket subSock, SDL_Window *window, SDL_Renderer *renderer)
struct ControllerContext
{
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
nng_socket pub;
nng_socket sub;
SDL_Window *window;
SDL_Renderer *renderer;
};
int doom_controller_loop(ControllerContext *ctx)
{
static constexpr ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
bool done = false;
@ -34,8 +37,13 @@ int doom_controller_loop(nng_socket pubSock, nng_socket subSock, SDL_Window *win
if (event.type == SDL_QUIT)
done = true;
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))
if (event.type == SDL_WINDOWEVENT
&& event.window.event == SDL_WINDOWEVENT_CLOSE
&& event.window.windowID == SDL_GetWindowID(ctx->window))
{
done = true;
}
}
// Start the Dear ImGui frame
@ -43,15 +51,13 @@ int doom_controller_loop(nng_socket pubSock, nng_socket subSock, SDL_Window *win
ImGui_ImplSDL2_NewFrame();
ImGui::NewFrame();
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// Rendering
ImGui::Render();
SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255));
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(ctx->renderer,
(u8)(clear_color.x * 255), (u8)(clear_color.y * 255), (u8)(clear_color.z * 255), (u8)(clear_color.w * 255));
SDL_RenderClear(ctx->renderer);
ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData());
SDL_RenderPresent(renderer);
SDL_RenderPresent(ctx->renderer);
}
return 0;
@ -64,11 +70,6 @@ int main(int argc, char *argv[])
log_info("doompanning ctrl starting");
dp_nng_init_limits(1, 1, 1);
auto pubSock = make_ctrl_pub(CtrlUrl);
auto subSock = make_ctrl_sub(DoomUrl);
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER))
dp_sdl_fatal("SDL_Init");
@ -92,65 +93,23 @@ int main(int argc, char *argv[])
ImGui_ImplSDL2_InitForSDLRenderer(window, renderer);
ImGui_ImplSDLRenderer_Init(renderer);
int ret = doom_controller_loop(pubSock, subSock, window, renderer);
dp_nng_init_limits(1, 1, 1);
auto pubSock = make_ctrl_pub(CtrlUrl);
auto subSock = make_ctrl_sub(DoomUrl);
ControllerContext ctx
{
pubSock,
subSock,
window,
renderer
};
int ret = doom_controller_loop(&ctx);
nng_close(pubSock);
nng_close(subSock);
return ret;
}
// doomctrl test code
#if 0
size_t readyCount = 0;
log_debug("ctrl waiting for hello from dooms");
while (readyCount < numDooms)
{
char *buf = nullptr;
size_t sz = 0;
if (auto res = nng_recv(subSock, &buf, &sz, NNG_FLAG_ALLOC))
dp_nng_fatal("run_ctrl/sub/go", res);
log_debug("ctrl received %zu bytes from a doom", sz);
nng_free(buf, sz);
++readyCount;
}
log_debug("ctrl is unleashing dooms");
if (auto res = nng_send(pubSock, (void *)&readyCount, sizeof(readyCount), 0))
dp_nng_fatal("run_ctrl/pub/unleash", res);
#endif
// doomsim test code
#if 0
while (true) // FIXME: ctrl code does not work this way
{
log_debug("doom%zu sending hello", id);
if (auto res = nng_send(pubSock, (void *)&id, sizeof(id), 0))
dp_nng_fatal("run_doom/pub/hello", res);
{
char *buf = nullptr;
size_t sz = 0;
log_debug("doom%zu waiting for unleash", id);
auto res = nng_recv(subSock, &buf, &sz, NNG_FLAG_ALLOC | NNG_FLAG_NONBLOCK);
if (res == NNG_EAGAIN)
{
usleep(10 * 1000);
continue;
}
else if (res)
dp_nng_fatal("run_doom/sub/go", res);
log_debug("doom%zu unleashed by %zu bytes!", id, sz);
nng_free(buf, sz);
break;
}
}
#endif
}

View file

@ -6,7 +6,6 @@
#include <nng/protocol/pubsub0/pub.h>
#include <nng/protocol/pubsub0/sub.h>
#include "dp_common.h"
#include "log.h"
enum DP_DoomState
{
@ -25,7 +24,7 @@ static const char *const DP_DoomState_Strings[DP_DS_COUNT] =
#define doomstate_str(s) DP_DoomState_Strings[s]
struct DoomContext;
typedef struct DoomContext DoomContext;
#define DEF_DOOM_STATE_FUNC(fn) int fn(DoomContext *ctx)
@ -113,29 +112,20 @@ DEF_DOOM_STATE_FUNC(do_doom_running)
return 0;
}
int doom_loop(nng_socket pubSock, nng_socket subSock, doomid_t doomId)
int doom_loop(DoomContext *ctx)
{
log_debug("doom#%zu started", doomId);
DoomContext ctx
{
pubSock,
subSock,
doomId,
DP_DS_Ready,
do_doom_ready,
};
log_debug("doom#%zu started", ctx->id);
int res = 0;
while (ctx.state != DP_DS_Quit && res == 0)
while (ctx->state != DP_DS_Quit && res == 0)
{
DP_DoomState prevState = ctx.state;
res = ctx.f(&ctx);
if (prevState != ctx.state)
DP_DoomState prevState = ctx->state;
res = ctx->f(ctx);
if (prevState != ctx->state)
{
log_info("transition %s -> %s",
doomstate_str(prevState), doomstate_str(ctx.state));
doomstate_str(prevState), doomstate_str(ctx->state));
}
}
@ -167,7 +157,16 @@ int main(int argc, char *argv[])
auto pubSock = make_doom_pub(DoomUrl);
auto subSock = make_doom_sub(CtrlUrl);
int ret = doom_loop(pubSock, subSock, *doomId);
DoomContext ctx
{
pubSock,
subSock,
*doomId,
DP_DS_Ready,
do_doom_ready,
};
int ret = doom_loop(&ctx);
nng_close(pubSock);
nng_close(subSock);