yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
mesen_socket_client.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_MESEN_MESEN_SOCKET_CLIENT_H_
2#define YAZE_APP_EMU_MESEN_MESEN_SOCKET_CLIENT_H_
3
4#include <atomic>
5#include <cstdint>
6#include <functional>
7#include <memory>
8#include <mutex>
9#include <string>
10#include <thread>
11#include <unordered_map>
12#include <vector>
13
14#include "absl/status/status.h"
15#include "absl/status/statusor.h"
17
18namespace yaze {
19namespace emu {
20namespace mesen {
21
25struct CpuState {
26 uint16_t A;
27 uint16_t X;
28 uint16_t Y;
29 uint16_t SP;
30 uint16_t D; // Direct page
31 uint32_t PC;
32 uint8_t K; // Program bank
33 uint8_t DBR; // Data bank
34 uint8_t P; // Processor status
36};
37
41struct MesenState {
42 bool running;
43 bool paused;
45 uint64_t frame;
46 double fps;
48};
49
53struct LinkState {
54 uint16_t x;
55 uint16_t y;
56 uint8_t layer;
57 uint8_t direction; // 0=up, 2=down, 4=left, 6=right
58 uint8_t state;
59 uint8_t pose;
60};
61
65struct GameItems {
67 uint8_t max_health;
68 uint8_t magic;
69 uint16_t rupees;
70 uint8_t bombs;
71 uint8_t arrows;
72};
73
77struct GameMode {
78 uint8_t mode;
79 uint8_t submode;
80 bool indoors;
81 uint16_t room_id; // Valid when indoors
82 uint8_t overworld_area; // Valid when !indoors
83};
84
93
97struct SpriteInfo {
98 int slot;
99 uint8_t type;
100 uint8_t state;
101 uint16_t x;
102 uint16_t y;
103 uint8_t health;
104 uint8_t subtype;
105};
106
110enum class BreakpointType {
111 kExecute,
112 kRead,
113 kWrite,
115};
116
121 std::string type; // "breakpoint_hit", "frame_complete", etc.
122 std::string raw_json; // Full event payload
123 uint32_t address; // For breakpoint events
124 uint64_t frame; // Frame number when event occurred
125};
126
127using EventCallback = std::function<void(const MesenEvent&)>;
128using EventListenerId = uint64_t;
129
137 public:
140
141 // Disable copy
144
145 // ──────────────────────────────────────────────────────────────────────────
146 // Connection Management
147 // ──────────────────────────────────────────────────────────────────────────
148
153 absl::Status Connect();
154
159 absl::Status Connect(const std::string& socket_path);
160
164 void Disconnect();
165
169 bool IsConnected() const;
170
174 const std::string& GetSocketPath() const { return socket_path_; }
175
179 static std::vector<std::string> ListAvailableSockets();
180
181 // ──────────────────────────────────────────────────────────────────────────
182 // Control Commands
183 // ──────────────────────────────────────────────────────────────────────────
184
188 absl::Status Ping();
189
193 absl::StatusOr<MesenState> GetState();
194
198 absl::Status Pause();
199
203 absl::Status Resume();
204
208 absl::Status Reset();
209
213 absl::Status Frame();
214
220 absl::Status Step(int count = 1, const std::string& mode = "into");
221
222 // ──────────────────────────────────────────────────────────────────────────
223 // Input Commands
224 // ──────────────────────────────────────────────────────────────────────────
225
231 absl::Status SetButton(emu::input::SnesButton button, bool pressed);
232
236 absl::Status SetButtons(const emu::input::ControllerState& state);
237
238 // ──────────────────────────────────────────────────────────────────────────
239 // Memory Access
240 // ──────────────────────────────────────────────────────────────────────────
241
245 absl::StatusOr<uint8_t> ReadByte(uint32_t addr);
246
250 absl::StatusOr<uint16_t> ReadWord(uint32_t addr);
251
255 absl::StatusOr<std::vector<uint8_t>> ReadBlock(uint32_t addr, size_t len);
256
260 absl::Status WriteByte(uint32_t addr, uint8_t value);
261
265 absl::Status WriteWord(uint32_t addr, uint16_t value);
266
270 absl::Status WriteBlock(uint32_t addr, const std::vector<uint8_t>& data);
271
272 // ──────────────────────────────────────────────────────────────────────────
273 // Debugging Commands
274 // ──────────────────────────────────────────────────────────────────────────
275
279 absl::StatusOr<CpuState> GetCpuState();
280
284 absl::StatusOr<std::string> Disassemble(uint32_t addr, int count = 10);
285
290 absl::StatusOr<int> AddBreakpoint(uint32_t addr, BreakpointType type,
291 const std::string& condition = "");
292
296 absl::Status RemoveBreakpoint(int id);
297
301 absl::Status ClearBreakpoints();
302
306 absl::StatusOr<std::string> GetTrace(int count = 20);
307
308 // ──────────────────────────────────────────────────────────────────────────
309 // ALTTP-Specific Commands
310 // ──────────────────────────────────────────────────────────────────────────
311
315 absl::StatusOr<GameState> GetGameState();
316
321 absl::StatusOr<std::vector<SpriteInfo>> GetSprites(bool all = false);
322
326 absl::Status SetCollisionOverlay(bool enable, const std::string& colmap = "A");
327
328 // ──────────────────────────────────────────────────────────────────────────
329 // Save State Commands
330 // ──────────────────────────────────────────────────────────────────────────
331
335 absl::Status SaveState(int slot);
336
340 absl::Status LoadState(int slot);
341
346 absl::StatusOr<std::string> Screenshot();
347
348 // ──────────────────────────────────────────────────────────────────────────
349 // Event Subscription
350 // ──────────────────────────────────────────────────────────────────────────
351
356 absl::Status Subscribe(const std::vector<std::string>& events);
357
361 absl::Status Unsubscribe();
362
366 void SetEventCallback(EventCallback callback);
367
373
378
379 // ──────────────────────────────────────────────────────────────────────────
380 // Low-Level Commands
381 // ──────────────────────────────────────────────────────────────────────────
382
386 absl::StatusOr<std::string> SendCommand(const std::string& json);
387
388 private:
392 static std::vector<std::string> FindSocketPaths();
393
397 absl::StatusOr<std::string> ParseResponse(const std::string& response);
398
402 absl::StatusOr<std::string> SendCommandOnSocket(int fd,
403 const std::string& json,
404 bool update_connection_state);
405
409 void EventLoop();
410
411 int socket_fd_ = -1;
413 std::string socket_path_;
414 std::atomic<bool> connected_{false};
415 std::mutex command_mutex_;
417
418 // Event handling
420 std::unordered_map<EventListenerId, EventCallback> event_listeners_;
422 std::thread event_thread_;
423 std::atomic<bool> event_thread_running_{false};
425
426 // Input state
428};
429
430} // namespace mesen
431} // namespace emu
432} // namespace yaze
433
434#endif // YAZE_APP_EMU_MESEN_MESEN_SOCKET_CLIENT_H_
Unix socket client for Mesen2-OoS fork.
absl::Status ClearBreakpoints()
Clear all breakpoints.
absl::Status WriteWord(uint32_t addr, uint16_t value)
Write a 16-bit word to memory.
absl::StatusOr< uint8_t > ReadByte(uint32_t addr)
Read a single byte from memory.
void RemoveEventListener(EventListenerId id)
Remove a previously added event listener.
absl::Status Step(int count=1, const std::string &mode="into")
Step N CPU instructions (default 1)
void EventLoop()
Event listening thread function.
void SetEventCallback(EventCallback callback)
Set callback for received events.
absl::Status Ping()
Ping Mesen2 to check connectivity.
absl::Status Resume()
Resume emulation.
absl::StatusOr< CpuState > GetCpuState()
Get CPU register state.
absl::StatusOr< std::string > Screenshot()
Take a screenshot.
absl::StatusOr< std::string > ParseResponse(const std::string &response)
Parse JSON response for success/error.
const std::string & GetSocketPath() const
Get the current socket path.
absl::Status LoadState(int slot)
Load state from slot.
std::unordered_map< EventListenerId, EventCallback > event_listeners_
absl::StatusOr< uint16_t > ReadWord(uint32_t addr)
Read a 16-bit word from memory.
absl::StatusOr< int > AddBreakpoint(uint32_t addr, BreakpointType type, const std::string &condition="")
Add a breakpoint.
emu::input::ControllerState current_input_
MesenSocketClient(const MesenSocketClient &)=delete
static std::vector< std::string > ListAvailableSockets()
List available Mesen2 sockets on the system.
absl::Status SetButtons(const emu::input::ControllerState &state)
Set all buttons at once.
MesenSocketClient & operator=(const MesenSocketClient &)=delete
absl::StatusOr< std::string > GetTrace(int count=20)
Get execution trace log.
absl::StatusOr< GameState > GetGameState()
Get comprehensive ALTTP game state.
absl::Status SetButton(emu::input::SnesButton button, bool pressed)
Set controller button state.
absl::StatusOr< MesenState > GetState()
Get current emulation state.
absl::Status Frame()
Run exactly one frame.
absl::Status SetCollisionOverlay(bool enable, const std::string &colmap="A")
Enable/disable collision overlay.
bool IsConnected() const
Check if connected to Mesen2.
absl::StatusOr< std::string > SendCommand(const std::string &json)
Send a raw JSON command and get raw response.
EventListenerId AddEventListener(EventCallback callback)
Add an event listener without replacing existing listeners.
absl::StatusOr< std::vector< SpriteInfo > > GetSprites(bool all=false)
Get active sprites.
absl::Status RemoveBreakpoint(int id)
Remove a breakpoint by ID.
absl::Status Unsubscribe()
Unsubscribe from events.
absl::StatusOr< std::string > SendCommandOnSocket(int fd, const std::string &json, bool update_connection_state)
Send a command using a specific socket descriptor.
absl::Status Subscribe(const std::vector< std::string > &events)
Subscribe to events.
absl::StatusOr< std::string > Disassemble(uint32_t addr, int count=10)
Disassemble instructions at address.
absl::Status Pause()
Pause emulation.
absl::Status Reset()
Reset the console.
absl::Status SaveState(int slot)
Save state to slot.
void Disconnect()
Disconnect from Mesen2.
static std::vector< std::string > FindSocketPaths()
Find available Mesen2 socket paths.
absl::Status WriteByte(uint32_t addr, uint8_t value)
Write a single byte to memory.
absl::StatusOr< std::vector< uint8_t > > ReadBlock(uint32_t addr, size_t len)
Read a block of bytes from memory.
absl::Status Connect()
Auto-discover and connect to first available Mesen2 socket.
absl::Status WriteBlock(uint32_t addr, const std::vector< uint8_t > &data)
Write a block of bytes to memory.
SnesButton
SNES controller button mapping (platform-agnostic)
std::function< void(const MesenEvent &)> EventCallback
BreakpointType
Breakpoint types.
Controller state (16-bit SNES controller format)
CPU register state from Mesen2.
ALTTP health/items state.
Complete ALTTP game state from GAMESTATE command.
Event from Mesen2 subscription.
Emulation state from Mesen2.
Sprite information from SPRITES command.