From 30b2c01798c0369b6fd8e030845b6f6782b27a46 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Mon, 19 Jan 2026 08:23:23 +0900 Subject: [PATCH 01/12] deps: Update deps to zig master --- build.zig.zon | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index d07f1a9e..694e36d6 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -2,7 +2,7 @@ .name = .mmc_cli, .version = "0.16.0", .fingerprint = 0x392c74984291bf14, - .minimum_zig_version = "0.15.1", + .minimum_zig_version = "0.16.0-dev.2193+fc517bd01", .dependencies = .{ .json5 = .{ .url = "https://github.com/mochalins/json5.zig/archive/2ef1032.tar.gz", @@ -17,16 +17,16 @@ .hash = "zignet-0.2.0-BAu-r4GpAACnu7GCkbPHa4F6lQaq5wypMWqr0z0BM9nO", }, .chrono = .{ - .url = "https://github.com/pmotionf/chrono/archive/31e31b0.tar.gz", - .hash = "chrono-0.1.0-uVd76I_AAwCMh8lYH9E-5ia0tI-tda4Q2FjFoIdE2dYG", + .url = "https://github.com/aaumar25/chrono/archive/11b2a9b.tar.gz", + .hash = "chrono-0.1.0-uVd76ObCAwBL5hB9wCVWZLus9iLTKvINA_GYw_Lmkfid", }, .mmc_api = .{ - .url = "https://github.com/pmotionf/mmc-api/archive/907e011.tar.gz", - .hash = "mmc_api-1.2.0-P5raR2hzCwCUZ73y6Bl6QSWtoUeXric6xPMyUsU3_jDS", + .url = "https://github.com/pmotionf/mmc-api/archive/8fcf069.tar.gz", + .hash = "mmc_api-0.0.0-P5raR8DdOgBmx-t8_lU6fEcosMFSLiKAfi9JVGhz08vP", }, .soem = .{ - .url = "https://github.com/pmotionf/SOEM/archive/6dff3f5.tar.gz", - .hash = "soem-1.4.0-hMH6QwH7DQDhU4QpnIidSZbzZlVoljUcay_9RIbl4jPj", + .url = "https://github.com/aaumar25/SOEM/archive/195fbdd.tar.gz", + .hash = "soem-1.4.0-hMH6Q-37DQBvevB5XrCFluc-BgwBSzKqK7by3hn-Vss0", .lazy = true, }, .tracy = .{ From df92d1ea1e7d859dbbb9918770e4f5ef9d3591a8 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Mon, 19 Jan 2026 11:28:56 +0900 Subject: [PATCH 02/12] refactor: Upgrade impl to zig master refactor: All commands require io param refactor: Store global `environ` variable --- src/Config.zig | 4 +- src/Prompt.zig | 70 +++--- src/command.zig | 231 +++++++++--------- src/io.zig | 48 ++-- src/main.zig | 29 ++- src/modules/mes07.zig | 18 +- src/modules/mmc_client.zig | 6 +- .../mmc_client/commands/assert_hall.zig | 2 +- .../mmc_client/commands/assert_location.zig | 2 +- .../mmc_client/commands/auto_initialize.zig | 2 +- .../mmc_client/commands/axis_carrier.zig | 2 +- src/modules/mmc_client/commands/calibrate.zig | 2 +- .../mmc_client/commands/carrier_axis.zig | 2 +- .../mmc_client/commands/carrier_id.zig | 2 +- .../mmc_client/commands/carrier_location.zig | 2 +- .../commands/clear_carrier_info.zig | 2 +- .../mmc_client/commands/clear_errors.zig | 2 +- src/modules/mmc_client/commands/connect.zig | 8 +- .../mmc_client/commands/disconnect.zig | 2 +- .../mmc_client/commands/get_acceleration.zig | 2 +- src/modules/mmc_client/commands/get_speed.zig | 2 +- .../mmc_client/commands/hall_status.zig | 2 +- src/modules/mmc_client/commands/isolate.zig | 2 +- src/modules/mmc_client/commands/log.zig | 20 +- src/modules/mmc_client/commands/move.zig | 2 +- src/modules/mmc_client/commands/pause.zig | 2 +- .../mmc_client/commands/print_axis_info.zig | 4 +- .../commands/print_carrier_info.zig | 4 +- .../mmc_client/commands/print_driver_info.zig | 4 +- src/modules/mmc_client/commands/pull.zig | 2 +- src/modules/mmc_client/commands/push.zig | 2 +- .../mmc_client/commands/release_carrier.zig | 2 +- .../mmc_client/commands/reset_system.zig | 2 +- src/modules/mmc_client/commands/resume.zig | 2 +- .../mmc_client/commands/server_version.zig | 2 +- .../mmc_client/commands/set_acceleration.zig | 2 +- .../mmc_client/commands/set_carrier_id.zig | 2 +- .../mmc_client/commands/set_line_zero.zig | 2 +- src/modules/mmc_client/commands/set_speed.zig | 2 +- .../mmc_client/commands/show_errors.zig | 4 +- src/modules/mmc_client/commands/stop.zig | 2 +- src/modules/mmc_client/commands/stop_pull.zig | 2 +- src/modules/mmc_client/commands/stop_push.zig | 2 +- src/modules/mmc_client/commands/wait.zig | 6 +- src/modules/mmc_client/log.zig | 13 +- src/modules/return_demo2.zig | 14 +- 46 files changed, 281 insertions(+), 262 deletions(-) diff --git a/src/Config.zig b/src/Config.zig index 719eb247..e92fa4c0 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -32,13 +32,13 @@ const Parse = struct { modules: []ModuleConfig, }; -pub fn parse(allocator: std.mem.Allocator, f: std.fs.File) !Config { +pub fn parse(allocator: std.mem.Allocator, io: std.Io, f: std.Io.File) !Config { var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); defer arena.deinit(); const a = arena.allocator(); var f_reader_buf: [4096]u8 = undefined; - var f_reader = f.reader(&f_reader_buf); + var f_reader = f.reader(io, &f_reader_buf); var reader: json5.Reader = .init(a, &f_reader.interface); const _result = try json5.parseFromTokenSource( diff --git a/src/Prompt.zig b/src/Prompt.zig index 7ea65f9f..7771549e 100644 --- a/src/Prompt.zig +++ b/src/Prompt.zig @@ -5,12 +5,12 @@ const builtin = @import("builtin"); const std = @import("std"); const command = @import("command.zig"); -const io = @import("io.zig"); +const mmc_io = @import("io.zig"); const Complete = @import("Prompt/Complete.zig"); const History = @import("Prompt/History.zig"); -pub const max_input_size = std.fs.max_path_bytes + 512; +pub const max_input_size = std.Io.Dir.max_path_bytes + 512; /// Flag to hide prompt and ignore user input. disable: std.atomic.Value(bool) = .init(false), @@ -36,12 +36,12 @@ selected_command: []const u8 = &.{}, /// Prompt handler thread callback. Input must be set to non-canonical mode /// prior to spawning this thread. Only one prompt handler thread may be /// running at a time. -pub fn handler(ctx: *Prompt) void { +pub fn handler(ctx: *Prompt, io: std.Io) void { ctx.history.clear(); ctx.clear(); var stdout_buf: [4096]u8 = undefined; - var stdout = std.fs.File.stdout().writer(&stdout_buf); + var stdout = std.Io.File.stdout().writer(io, &stdout_buf); var prev_disable: bool = true; main: while (!ctx.close.load(.monotonic)) { @@ -53,7 +53,7 @@ pub fn handler(ctx: *Prompt) void { // Print prompt once on enable. if (prev_disable) { - std.Thread.sleep(std.time.ns_per_ms * 10); + io.sleep(.fromMilliseconds(10), .real) catch continue :main; stdout.interface.writeAll( "Enter command (HELP for usage):\n", ) catch continue :main; @@ -61,7 +61,7 @@ pub fn handler(ctx: *Prompt) void { } prev_disable = false; - if (io.event.poll() catch continue :main == 0) { + if (mmc_io.event.poll() catch continue :main == 0) { continue :main; } @@ -70,7 +70,7 @@ pub fn handler(ctx: *Prompt) void { // keep the completion selection. var keep_complete_selection: bool = false; - const event = io.event.read(.{}) catch continue :main; + const event = mmc_io.event.read(io, .{}) catch continue :main; parse: switch (event) { .key => |key_event| { switch (key_event.value) { @@ -161,7 +161,7 @@ pub fn handler(ctx: *Prompt) void { // Print newline at end of prompt before // command start. ctx.cursor.moveEnd(); - io.cursor.moveColumn( + mmc_io.cursor.moveColumn( &stdout.interface, ctx.cursor.visible + 1, ) catch continue :main; @@ -331,7 +331,7 @@ pub fn handler(ctx: *Prompt) void { .windows => { var buf: [max_input_size]u8 = undefined; - const paste = io.clipboard.get( + const paste = mmc_io.clipboard.get( &buf, ) catch {}; ctx.insertString(paste); @@ -405,7 +405,7 @@ pub fn handler(ctx: *Prompt) void { // Underline fragment if it has just been completed. if (ctx.complete_partial_start) |cvs| { if (cvs == start and ctx.complete_selection != null) { - io.style.set( + mmc_io.style.set( &stdout.interface, .{ .underline = true }, ) catch continue :main; @@ -414,19 +414,19 @@ pub fn handler(ctx: *Prompt) void { const fragment = ctx.input[start..i]; // Parsing the first fragment if (std.mem.count(u8, ctx.input[0..i], " ") == 0) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .red }, }) catch continue :main; for (command.registry.keys()) |key| { if (std.ascii.eqlIgnoreCase(key, fragment)) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .green }, }) catch continue :main; ctx.selected_command = key; break; } } - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(fragment) catch continue :main; } else { @@ -438,10 +438,10 @@ pub fn handler(ctx: *Prompt) void { var_entry.key_ptr.*, fragment, )) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .magenta }, }) catch continue :main; - defer io.style.reset( + defer mmc_io.style.reset( &stdout.interface, ) catch {}; stdout.interface.writeAll(fragment) catch @@ -450,10 +450,10 @@ pub fn handler(ctx: *Prompt) void { } } else validation: { if (ctx.selected_command.len == 0) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .red }, }) catch continue :main; - defer io.style.reset( + defer mmc_io.style.reset( &stdout.interface, ) catch {}; stdout.interface.writeAll(fragment) catch @@ -462,10 +462,10 @@ pub fn handler(ctx: *Prompt) void { } const selected_command = command.registry.getPtr(ctx.selected_command) orelse { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .red }, }) catch continue :main; - defer io.style.reset( + defer mmc_io.style.reset( &stdout.interface, ) catch {}; stdout.interface.writeAll(fragment) catch @@ -482,10 +482,10 @@ pub fn handler(ctx: *Prompt) void { // Parameter start at index 1 on command input const param_idx = fragment_id - 1; if (param_idx >= selected_command.parameters.len) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .red }, }) catch continue :main; - defer io.style.reset( + defer mmc_io.style.reset( &stdout.interface, ) catch {}; stdout.interface.writeAll(fragment) catch @@ -498,10 +498,10 @@ pub fn handler(ctx: *Prompt) void { stdout.interface.writeAll(fragment) catch continue :main; } else { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .red }, }) catch continue :main; - defer io.style.reset( + defer mmc_io.style.reset( &stdout.interface, ) catch {}; stdout.interface.writeAll(fragment) catch @@ -519,10 +519,10 @@ pub fn handler(ctx: *Prompt) void { if (ctx.complete.prefix.len > completed_len) { const suggestion = ctx.complete.prefix[completed_len..]; - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .lut = .grayscale(12) }, }) catch continue :main; - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(suggestion) catch continue :main; } @@ -538,7 +538,7 @@ pub fn handler(ctx: *Prompt) void { // Underline fragment if it has just been completed. if (ctx.complete_partial_start) |cvs| { if (cvs == start and ctx.complete_selection != null) { - io.style.set( + mmc_io.style.set( &stdout.interface, .{ .underline = true }, ) catch continue :main; @@ -549,11 +549,11 @@ pub fn handler(ctx: *Prompt) void { if (std.mem.count(u8, ctx.input, " ") == 0) { for (command.registry.keys()) |key| { if (std.ascii.eqlIgnoreCase(key, fragment)) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .green }, }) catch continue :main; ctx.selected_command = key; - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(fragment) catch continue :main; break; @@ -571,10 +571,10 @@ pub fn handler(ctx: *Prompt) void { var_entry.key_ptr.*, fragment, )) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .named = .magenta }, }) catch continue :main; - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(fragment) catch continue :main; break; @@ -592,10 +592,10 @@ pub fn handler(ctx: *Prompt) void { if (ctx.complete.prefix.len > completed_len) { const suggestion = ctx.complete.prefix[completed_len..]; - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .lut = .grayscale(12) }, }) catch continue :main; - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(suggestion) catch continue :main; } @@ -607,17 +607,17 @@ pub fn handler(ctx: *Prompt) void { if (ctx.history.selection) |*selection| { const hist_item = selection.slice(); if (hist_item.len > ctx.input.len) { - io.style.set(&stdout.interface, .{ + mmc_io.style.set(&stdout.interface, .{ .fg = .{ .lut = .grayscale(12) }, .underline = true, }) catch continue :main; - defer io.style.reset(&stdout.interface) catch {}; + defer mmc_io.style.reset(&stdout.interface) catch {}; stdout.interface.writeAll(hist_item[ctx.input.len..]) catch continue :main; } } - io.cursor.moveColumn(&stdout.interface, ctx.cursor.visible + 1) catch + mmc_io.cursor.moveColumn(&stdout.interface, ctx.cursor.visible + 1) catch continue :main; } } diff --git a/src/command.zig b/src/command.zig index d40f1afa..601059cb 100644 --- a/src/command.zig +++ b/src/command.zig @@ -189,7 +189,7 @@ var command_queue_lock: std.Thread.RwLock = undefined; var command_queue: std.DoublyLinkedList = undefined; var timer: ?std.time.Timer = null; -var log_file: ?std.fs.File = null; +var log_file: ?std.Io.File = null; const CommandString = struct { str: []u8, @@ -212,7 +212,7 @@ pub const Command = union(enum) { short_description: []const u8, /// Long description of command. long_description: []const u8, - execute: *const fn ([][]const u8) anyerror!void, + execute: *const fn (std.Io, [][]const u8) anyerror!void, pub const Parameter = struct { name: []const u8, @@ -235,44 +235,37 @@ pub const Command = union(enum) { parameters += @typeInfo(Kind).@"enum".fields.len; } } - var result: std.builtin.Type.Enum = .{ - .fields = &.{}, - .decls = &.{}, - .is_exhaustive = true, - .tag_type = std.math.IntFittingRange(0, parameters), - }; - var tag_value = 0; - result.fields = result.fields ++ .{ - std.builtin.Type.EnumField{ - .value = tag_value, - .name = "none", - }, - }; - tag_value += 1; + const TagInt = std.math.IntFittingRange(0, parameters); + comptime var field_names: []const []const u8 = &.{}; + field_names = field_names ++ .{"none"}; + // command.zig command parameter validation. if (@hasDecl(This, "Parameter")) { const ti = @typeInfo(This.Parameter.Kind).@"enum"; inline for (ti.fields) |field| { - result.fields = result.fields ++ .{std.builtin.Type.EnumField{ - .value = tag_value, - .name = field.name, - }}; - tag_value += 1; + field_names = field_names ++ .{field.name}; } } inline for (@typeInfo(Config.Module).@"enum".fields) |field| { const module: type = comptime @field(This, field.name); - if (@typeInfo(module) == .@"struct" and @hasDecl(module, "Parameter")) { + if (@typeInfo(module) == .@"struct" and + @hasDecl(module, "Parameter")) + { const ti = @typeInfo(module.Parameter.Kind).@"enum"; inline for (ti.fields) |kind_field| { - result.fields = result.fields ++ .{std.builtin.Type.EnumField{ - .value = tag_value, - .name = field.name ++ "_" ++ kind_field.name, - }}; - tag_value += 1; + field_names = field_names ++ + .{std.fmt.comptimePrint( + "{s}_{s}", + .{ field.name, kind_field.name }, + )}; } } } - return @Type(.{ .@"enum" = result }); + comptime var field_values: [field_names.len]TagInt = + undefined; + for (field_names, 0..) |_, tag_value| { + field_values[tag_value] = tag_value; + } + return @Enum(TagInt, .exhaustive, field_names, &field_values); } pub fn isValid(self: @This(), input: []const u8) bool { @@ -311,10 +304,12 @@ pub fn logFn( ) void { const level_txt = comptime message_level.asText(); const prefix2 = if (scope == .default) ": " else "(" ++ @tagName(scope) ++ "): "; + var threaded: std.Io.Threaded = .init_single_threaded; + const io = threaded.io(); if (log_file) |f| { var writer_buf: [4096]u8 = undefined; - var writer = f.writer(&writer_buf); + var writer = f.writer(io, &writer_buf); writer.interface.print( level_txt ++ prefix2 ++ format ++ "\n", args, @@ -323,16 +318,13 @@ pub fn logFn( } var stderr_buf: [4096]u8 = undefined; - var stderr = std.fs.File.stderr().writer(&stderr_buf); - - std.debug.lockStdErr(); - defer std.debug.unlockStdErr(); + var stderr = std.debug.lockStderr(&stderr_buf); + defer std.debug.unlockStderr(); nosuspend { - stderr.interface.print( + stderr.file_writer.interface.print( level_txt ++ prefix2 ++ format ++ "\n", args, ) catch return; - stderr.interface.flush() catch return; } } @@ -600,7 +592,7 @@ pub fn enqueue(input: []const u8) !void { command_queue.append(&new_node.node); } -pub fn execute() !void { +pub fn execute(io: std.Io) !void { command_queue_lock.lock(); const node_opt = command_queue.popFirst(); command_queue_lock.unlock(); @@ -610,12 +602,12 @@ pub fn execute() !void { std.heap.smp_allocator.free(command_str.str); std.heap.smp_allocator.destroy(command_str); } - try parseAndRun(command_str.str); + try parseAndRun(io, command_str.str); } } -fn parseAndRun(input: []const u8) !void { - const trimmed = std.mem.trimLeft(u8, input, "\n\t \r"); +fn parseAndRun(io: std.Io, input: []const u8) !void { + const trimmed = std.mem.trimStart(u8, input, "\n\t \r"); std.log.info("Running command: {s}\n", .{trimmed}); if (trimmed.len == 0 or trimmed[0] == '#') { return; @@ -679,13 +671,13 @@ fn parseAndRun(input: []const u8) !void { } } if (token_iterator.peek() != null) return error.UnexpectedParameter; - try command.execute(params); + try command.execute(io, params); } var arena: std.heap.ArenaAllocator = undefined; var allocator: std.mem.Allocator = undefined; -fn help(params: [][]const u8) !void { +fn help(_: std.Io, params: [][]const u8) !void { if (params[0].len > 0) { var command: *Command.Executable = undefined; var command_buf: [32]u8 = undefined; @@ -762,17 +754,17 @@ fn help(params: [][]const u8) !void { } } -fn version(_: [][]const u8) !void { +fn version(_: std.Io, _: [][]const u8) !void { // TODO: Figure out better way to get version from `build.zig.zon`. std.log.info("CLI Version: {s}\n", .{build.version}); } -fn set(params: [][]const u8) !void { +fn set(_: std.Io, params: [][]const u8) !void { if (std.ascii.isDigit(params[0][0])) return error.InvalidParameter; try variables.put(params[0], params[1]); } -fn get(params: [][]const u8) !void { +fn get(_: std.Io, params: [][]const u8) !void { if (variables.get(params[0])) |value| { std.log.info("Variable \"{s}\": {s}\n", .{ params[0], @@ -781,7 +773,7 @@ fn get(params: [][]const u8) !void { } else return error.UndefinedVariable; } -fn printVariables(_: [][]const u8) !void { +fn printVariables(_: std.Io, _: [][]const u8) !void { var variables_it = variables.iterator(); while (variables_it.next()) |entry| { try checkCommandInterrupt(); @@ -789,13 +781,13 @@ fn printVariables(_: [][]const u8) !void { } } -fn tableReset(_: [][]const u8) !void { +fn tableReset(_: std.Io, _: [][]const u8) !void { table.clearRows(); // Should be impossible to fail with an empty header. table.setHeader(&.{}) catch unreachable; } -fn tableSetColumns(params: [][]const u8) !void { +fn tableSetColumns(_: std.Io, params: [][]const u8) !void { const all_variables = params[0]; var names = std.mem.splitScalar(u8, all_variables, ','); var names_count: usize = 0; @@ -807,32 +799,32 @@ fn tableSetColumns(params: [][]const u8) !void { try table.setHeader(names_buf[0..names_count]); } -fn tableAddRow(_: [][]const u8) !void { +fn tableAddRow(_: std.Io, _: [][]const u8) !void { try table.addRow(); } -fn tableSave(params: [][]const u8) !void { +fn tableSave(io: std.Io, params: [][]const u8) !void { const path = params[0]; - var f = try std.fs.cwd().createFile(path, .{ .truncate = true }); - defer f.close(); + var f = try std.Io.Dir.cwd().createFile(io, path, .{ .truncate = true }); + defer f.close(io); + var file_buffer: [4096]u8 = undefined; + var writer = f.writer(io, &file_buffer); for (table.header) |col| { - try f.writeAll(col); - try f.writeAll(","); + try writer.interface.print("{s},", .{col}); } - try f.writeAll("\n"); + try writer.interface.writeByte('\n'); for (table.rows.items) |row| { for (row) |val| { - try f.writeAll(val); - try f.writeAll(","); + try writer.interface.print("{s},", .{val}); } - try f.writeAll("\n"); + try writer.interface.writeByte('\n'); } } -fn timerStart(_: [][]const u8) !void { +fn timerStart(_: std.Io, _: [][]const u8) !void { if (timer) |*t| { t.reset(); } else { @@ -840,7 +832,7 @@ fn timerStart(_: [][]const u8) !void { } } -fn timerRead(_: [][]const u8) !void { +fn timerRead(_: std.Io, _: [][]const u8) !void { if (timer) |*t| { var timer_value: f64 = @floatFromInt(t.read()); timer_value = timer_value / std.time.ns_per_s; @@ -851,11 +843,11 @@ fn timerRead(_: [][]const u8) !void { } } -fn file(params: [][]const u8) !void { - var f = try std.fs.cwd().openFile(params[0], .{}); - defer f.close(); - var reader_buf: [std.fs.max_path_bytes + 512]u8 = undefined; - var reader = f.reader(&reader_buf); +fn file(io: std.Io, params: [][]const u8) !void { + var f = try std.Io.Dir.cwd().openFile(io, params[0], .{}); + defer f.close(io); + var reader_buf: [std.Io.Dir.max_path_bytes + 512]u8 = undefined; + var reader = f.reader(io, &reader_buf); while (true) { const _line = reader.interface.takeDelimiter('\n') catch |e| { switch (e) { @@ -864,9 +856,9 @@ fn file(params: [][]const u8) !void { } } orelse break; try checkCommandInterrupt(); - const line = std.mem.trimLeft( + const line = std.mem.trimStart( u8, - std.mem.trimRight(u8, _line, "\r"), + std.mem.trimEnd(u8, _line, "\r"), "\n\t ", ); if (line.len == 0 or line[0] == '#') continue; @@ -895,72 +887,73 @@ fn deinitModules() void { } } -fn loadConfig(params: [][]const u8) !void { +fn loadConfig(io: std.Io, params: [][]const u8) !void { // De-initialize any previously initialized modules. deinitModules(); - + const environ_map = main.environ_map; // Load config file. const config_file = if (params[0].len > 0) - std.fs.cwd().openFile(params[0], .{}) catch - try std.fs.openFileAbsolute(params[0], .{}) + std.Io.Dir.cwd().openFile(io, params[0], .{}) catch + try std.Io.Dir.openFileAbsolute(io, params[0], .{}) else - std.fs.cwd().openFile("config.json5", .{}) catch exe_local: { - var exe_dir_buf: [std.fs.max_path_bytes]u8 = undefined; - const exe_dir_path = std.fs.selfExeDirPath(&exe_dir_buf) catch + std.Io.Dir.cwd().openFile(io, "config.json5", .{}) catch exe_local: { + var exe_dir_buf: [std.Io.Dir.max_path_bytes]u8 = undefined; + const n = std.process.executableDirPath(io, &exe_dir_buf) catch break :exe_local error.FileNotFound; - var exe_dir = std.fs.cwd().openDir(exe_dir_path, .{}) catch + var exe_dir = std.Io.Dir.cwd().openDir(io, exe_dir_buf[0..n], .{}) catch break :exe_local error.FileNotFound; - defer exe_dir.close(); - break :exe_local exe_dir.openFile("config.json5", .{}); + defer exe_dir.close(io); + break :exe_local exe_dir.openFile(io, "config.json5", .{}); } catch config_local: { var config_dir = switch (comptime builtin.os.tag) { .windows => b: { - var path_buf: [std.fs.max_path_bytes]u8 = undefined; - var fba = std.heap.FixedBufferAllocator.init(&path_buf); - const fba_alloc = fba.allocator(); - const home_path = try std.process.getEnvVarOwned( - fba_alloc, - "USERPROFILE", - ); + const home_path = environ_map.get("USERPROFILE") orelse + return error.FileNotFound; - var home_dir = try std.fs.cwd().openDir(home_path, .{}); - defer home_dir.close(); - var config_root = try home_dir.openDir(".config", .{}); + var home_dir = try std.Io.Dir.cwd().openDir( + io, + home_path, + .{}, + ); + defer home_dir.close(io); + var config_root = try home_dir.openDir(io, ".config", .{}); defer config_root.close(); break :b try config_root.openDir("mmc-cli", .{}); }, .linux => b: { - var path_buf: [std.fs.max_path_bytes]u8 = undefined; - var fba = std.heap.FixedBufferAllocator.init(&path_buf); - const fba_alloc = fba.allocator(); - const config_path = std.process.getEnvVarOwned( - fba_alloc, - "XDG_CONFIG_HOME", - ) catch ""; + const config_path = + environ_map.get("XDG_CONFIG_HOME") orelse ""; if (config_path.len > 0) { - break :b try std.fs.cwd().openDir(config_path, .{}); + break :b try std.Io.Dir.cwd().openDir( + io, + config_path, + .{}, + ); } - const home_path = try std.process.getEnvVarOwned( - fba_alloc, - "HOME", + const home_path = environ_map.get("HOME") orelse + return error.FileNotFound; + var home_dir = try std.Io.Dir.cwd().openDir( + io, + home_path, + .{}, ); - var home_dir = try std.fs.cwd().openDir(home_path, .{}); - defer home_dir.close(); - var config_root = try home_dir.openDir(".config", .{}); - defer config_root.close(); - break :b try config_root.openDir("mmc-cli", .{}); + defer home_dir.close(io); + var config_root = try home_dir.openDir(io, ".config", .{}); + defer config_root.close(io); + break :b try config_root.openDir(io, "mmc-cli", .{}); }, else => return error.UnsupportedOs, }; break :config_local try config_dir.openFile( + io, "config.json5", .{}, ); }; var m_arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); const m_allocator = m_arena.allocator(); - var conf = try Config.parse(m_allocator, config_file); + var conf = try Config.parse(m_allocator, io, config_file); // Initialize only the modules specified in config file. const fields = @typeInfo(Config.Module).@"enum".fields; @@ -985,7 +978,7 @@ fn loadConfig(params: [][]const u8) !void { m_arena.deinit(); } -fn wait(params: [][]const u8) !void { +fn wait(_: std.Io, params: [][]const u8) !void { const duration: u64 = try std.fmt.parseInt(u64, params[0], 0); var wait_timer = try std.time.Timer.start(); while (wait_timer.read() < duration * std.time.ns_per_ms) { @@ -993,13 +986,15 @@ fn wait(params: [][]const u8) !void { } } -fn setLog(params: [][]const u8) !void { +fn setLog(io: std.Io, params: [][]const u8) !void { const mode_str = params[0]; const path = params[1]; var buf: [512]u8 = undefined; const file_path = if (path.len > 0) path else p: { - var timestamp: u64 = @intCast(std.time.timestamp()); + const clock: std.Io.Clock = .real; + const timestamp_nano = try clock.now(io); + var timestamp: u64 = @intCast(timestamp_nano.toSeconds()); timestamp += std.time.s_per_hour * 9; const days_since_epoch: i32 = @intCast(timestamp / std.time.s_per_day); const ymd = @@ -1023,32 +1018,36 @@ fn setLog(params: [][]const u8) !void { if (std.ascii.eqlIgnoreCase("stop", mode_str)) { if (log_file) |f| { - f.close(); + f.close(io); } log_file = null; } else if (std.ascii.eqlIgnoreCase("append", mode_str)) { if (log_file) |f| { - f.close(); + f.close(io); } - log_file = try std.fs.cwd().createFile(file_path, .{ - .truncate = false, - }); + log_file = try std.Io.Dir.cwd().createFile( + io, + file_path, + .{ + .truncate = false, + }, + ); } else if (std.ascii.eqlIgnoreCase("replace", mode_str)) { if (log_file) |f| { - f.close(); + f.close(io); } - log_file = try std.fs.cwd().createFile(file_path, .{}); + log_file = try std.Io.Dir.cwd().createFile(io, file_path, .{}); } else { return error.InvalidSaveOutputMode; } } -fn clear(_: [][]const u8) !void { - var stdout = std.fs.File.stdout().writer(&.{}); +fn clear(io: std.Io, _: [][]const u8) !void { + var stdout = std.Io.File.stdout().writer(io, &.{}); try stdout.interface.writeAll("\x1bc"); } -fn exit(_: [][]const u8) !void { +fn exit(_: std.Io, _: [][]const u8) !void { main.exit.store(true, .monotonic); } diff --git a/src/io.zig b/src/io.zig index 4522f6be..8fc33313 100644 --- a/src/io.zig +++ b/src/io.zig @@ -10,7 +10,7 @@ var original_canonical_context: OriginalCanonicalContext = undefined; pub fn init() !void { switch (comptime builtin.os.tag) { .linux => { - const stdin = std.fs.File.stdin().handle; + const stdin = std.Io.File.stdin().handle; var attr = try std.posix.tcgetattr(stdin); original_canonical_context = attr; @@ -30,7 +30,7 @@ pub fn init() !void { try std.posix.tcsetattr(stdin, .NOW, attr); }, .windows => { - const stdin = std.fs.File.stdin().handle; + const stdin = std.Io.File.stdin().handle; if (IsValidCodePage(65001) == 0) { return error.Utf8CodePageNotInstalled; @@ -77,7 +77,7 @@ pub fn init() !void { pub fn deinit() void { switch (comptime builtin.os.tag) { .linux => { - const stdin = std.fs.File.stdin().handle; + const stdin = std.Io.File.stdin().handle; std.posix.tcsetattr( stdin, .NOW, @@ -85,7 +85,7 @@ pub fn deinit() void { ) catch {}; }, .windows => { - const stdin = std.fs.File.stdin().handle; + const stdin = std.Io.File.stdin().handle; _ = SetConsoleMode(stdin, original_canonical_context); }, else => @compileError("unsupported OS"), @@ -316,7 +316,7 @@ pub const event = struct { switch (comptime builtin.os.tag) { .linux => { var fds: [1]std.posix.pollfd = .{.{ - .fd = std.fs.File.stdin().handle, + .fd = std.Io.File.stdin().handle, .events = std.posix.POLL.IN, .revents = undefined, }}; @@ -325,7 +325,7 @@ pub const event = struct { .windows => { var num_events: u32 = undefined; if (GetNumberOfConsoleInputEvents( - std.fs.File.stdin().handle, + std.Io.File.stdin().handle, &num_events, ) == 0) { return std.os.windows.unexpectedError( @@ -338,18 +338,18 @@ pub const event = struct { } } - fn readByte() !u8 { + fn readByte(io: std.Io) !u8 { switch (comptime builtin.os.tag) { .linux => { var stdin_buf: [1]u8 = undefined; - var stdin = std.fs.File.stdin().reader(&stdin_buf); + var stdin = std.Io.File.stdin().reader(io, &stdin_buf); return stdin.interface.takeByte(); }, .windows => { var buf: [1]u8 = undefined; var chars_read: u32 = 0; if (ReadConsoleA( - std.fs.File.stdin().handle, + std.Io.File.stdin().handle, &buf, 1, &chars_read, @@ -370,14 +370,14 @@ pub const event = struct { switch (comptime builtin.target.os.tag) { .linux => { var fds: [1]std.posix.pollfd = .{.{ - .fd = std.fs.File.stdin().handle, + .fd = std.Io.File.stdin().handle, .events = std.posix.POLL.IN, .revents = undefined, }}; return try std.posix.poll(&fds, 0) > 0; }, .windows => { - const stdin_handle = std.fs.File.stdin().handle; + const stdin_handle = std.Io.File.stdin().handle; std.os.windows.WaitForSingleObject( stdin_handle, 0, @@ -395,7 +395,7 @@ pub const event = struct { } /// Read event from terminal input buffer. - pub fn read(options: struct { + pub fn read(io: std.Io, options: struct { /// Nanosecond timeout between bytes in a sequence. Null is instant /// timeout (no waiting), 0 is infinite timeout. sequence_timeout: ?u64 = std.time.ns_per_ms * 10, @@ -404,7 +404,7 @@ pub const event = struct { /// timeout (no waiting). escape_timeout: u64 = std.time.ns_per_ms * 10, }) !Event { - const byte = try readByte(); + const byte = try readByte(io); const utf8_seq_len = std.unicode.utf8ByteSequenceLength(byte) catch 0; var result: Event = .{ .key = undefined }; @@ -422,14 +422,14 @@ pub const event = struct { if (comptime builtin.os.tag == .windows) { result.key.value.codepoint.buffer[ result.key.value.codepoint.len - ] = try readByte(); + ] = try readByte(io); result.key.value.codepoint.len += 1; } else { if (options.sequence_timeout) |seq_timeout| { if (seq_timeout == 0) { result.key.value.codepoint.buffer[ result.key.value.codepoint.len - ] = try readByte(); + ] = try readByte(io); result.key.value.codepoint.len += 1; } else { timer.reset(); @@ -437,7 +437,7 @@ pub const event = struct { if (try pollByte()) { result.key.value.codepoint.buffer[ result.key.value.codepoint.len - ] = try readByte(); + ] = try readByte(io); result.key.value.codepoint.len += 1; break; } @@ -449,7 +449,7 @@ pub const event = struct { if (try pollByte()) { result.key.value.codepoint.buffer[ result.key.value.codepoint.len - ] = try readByte(); + ] = try readByte(io); result.key.value.codepoint.len += 1; } else { return error.IncompleteCodepoint; @@ -477,7 +477,7 @@ pub const event = struct { } // Check for '[' after escape byte - const next = try readByte(); + const next = try readByte(io); if (next == '[') continue :parse '\x9B'; var seq_buf: [escape_sequences.max_len]u8 = undefined; @@ -491,7 +491,7 @@ pub const event = struct { if (options.sequence_timeout) |seq_timeout| { if (seq_timeout == 0) { while (seq.len < seq_buf.len) { - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (escape_sequences.get(seq)) |ev| { @@ -515,7 +515,7 @@ pub const event = struct { } else { return error.IncompleteEscapeSequence; } - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (escape_sequences.get(seq)) |ev| { @@ -535,7 +535,7 @@ pub const event = struct { if (!(try pollByte())) { return error.IncompleteEscapeSequence; } - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (escape_sequences.get(seq)) |ev| { @@ -558,7 +558,7 @@ pub const event = struct { if (options.sequence_timeout) |seq_timeout| { if (seq_timeout == 0) { while (seq.len < seq_buf.len) { - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (csi_sequences.get(seq)) |ev| { @@ -582,7 +582,7 @@ pub const event = struct { } else { return error.IncompleteCsiSequence; } - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (csi_sequences.get(seq)) |ev| { @@ -602,7 +602,7 @@ pub const event = struct { if (!(try pollByte())) { return error.IncompleteCsiSequence; } - seq_buf[seq.len] = try readByte(); + seq_buf[seq.len] = try readByte(io); seq.len += 1; // Eager match sequence if (csi_sequences.get(seq)) |ev| { diff --git a/src/main.zig b/src/main.zig index 87686a18..64015423 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2,10 +2,14 @@ const builtin = @import("builtin"); const std = @import("std"); const network = @import("network"); -const io = @import("io.zig"); +const mmc_io = @import("io.zig"); const command = @import("command.zig"); const Prompt = @import("Prompt.zig"); +// Environment variables to be used through the program, mainly locating +// configuration files. +pub var environ_map: *std.process.Environ.Map = undefined; + pub const std_options: std.Options = .{ .logFn = command.logFn, }; @@ -19,20 +23,25 @@ fn stopCommandWindows( ) callconv(.winapi) std.os.windows.BOOL { if (dwCtrlType == std.os.windows.CTRL_C_EVENT) { command.stop.store(true, .monotonic); - std.fs.File.stdin().sync() catch {}; + std.Io.File.stdin().sync() catch {}; } return 1; } -fn stopCommandLinux(_: c_int) callconv(.c) void { +fn stopCommandLinux(_: std.os.linux.SIG) callconv(.c) void { command.stop.store(true, .monotonic); } -pub fn main() !void { - try io.init(); - defer io.deinit(); +pub fn main(init: std.process.Init) !void { + environ_map = init.environ_map; + try mmc_io.init(); + defer mmc_io.deinit(); - var prompter = try std.Thread.spawn(.{}, Prompt.handler, .{&prompt}); + var prompter = try std.Thread.spawn( + .{}, + Prompt.handler, + .{ &prompt, init.io }, + ); prompter.detach(); defer prompt.close.store(true, .monotonic); @@ -87,9 +96,11 @@ pub fn main() !void { prompt.disable.store(true, .monotonic); } - command.execute() catch |e| { + command.execute(init.io) catch |e| { std.log.err("{t}", .{e}); - std.log.debug("{?f}", .{@errorReturnTrace()}); + if (@errorReturnTrace()) |stack_trace| { + std.debug.dumpStackTrace(stack_trace); + } command.queueClear(); continue :command_loop; }; diff --git a/src/modules/mes07.zig b/src/modules/mes07.zig index ad6afb57..7350ad13 100644 --- a/src/modules/mes07.zig +++ b/src/modules/mes07.zig @@ -73,7 +73,7 @@ pub fn deinit() void { } } -fn connect(params: [][]const u8) !void { +fn connect(io: std.Io, params: [][]const u8) !void { var adapter_buf: [128]u8 = .{0} ** 128; var adapter: []u8 = &.{}; if (params[0].len > 127) { @@ -181,11 +181,11 @@ fn connect(params: [][]const u8) !void { stop_processing.store(false, .monotonic); } read_laser_value.store(false, .monotonic); - const process_thread = try std.Thread.spawn(.{}, process, .{}); + const process_thread = try std.Thread.spawn(.{}, process, .{io}); process_thread.detach(); } -fn disconnect(_: [][]const u8) !void { +fn disconnect(_: std.Io, _: [][]const u8) !void { if (connection.len > 0) { while (processing.load(.monotonic)) { stop_processing.store(true, .monotonic); @@ -199,7 +199,7 @@ fn disconnect(_: [][]const u8) !void { } } -fn process() void { +fn process(io: std.Io) void { defer { processing.store(false, .monotonic); } @@ -209,7 +209,9 @@ fn process() void { _ = c.ec_send_processdata(); wkc = c.ec_receive_processdata(c.EC_TIMEOUTRET); while (wkc < expected_WKC) { - std.Thread.sleep(std.time.ns_per_us * 10); + // TODO: What to do with catch using io.sleep + io.sleep(.fromNanoseconds(std.time.ns_per_us * 10), .real) catch + unreachable; _ = c.ec_send_processdata(); wkc = c.ec_receive_processdata(c.EC_TIMEOUTRET); } @@ -228,11 +230,13 @@ fn process() void { const reading_fixed: i32 = result_fixed_ptr.*; laser_value.store(reading_fixed, .monotonic); read_laser_value.store(false, .monotonic); - std.Thread.sleep(std.time.ns_per_us * 10); + // TODO: What to do with catch using io.sleep + io.sleep(.fromNanoseconds(std.time.ns_per_us * 10), .real) catch + unreachable; } } -fn read(params: [][]const u8) !void { +fn read(_: std.Io, params: [][]const u8) !void { const save_var = params[0]; if (save_var.len > 0 and std.ascii.isDigit(save_var[0])) return error.InvalidParameter; diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index 8d287fc6..fe70c745 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -1760,10 +1760,12 @@ pub fn init(c: Config) !void { } pub fn deinit() void { - commands.disconnect.impl(&.{}) catch {}; + // TODO: Find a better way for passing io to disconnect + var single_threaded: std.Io.Threaded = .init_single_threaded; + commands.disconnect.impl(single_threaded.io(), &.{}) catch {}; parameter.deinit(); allocator.free(config.host); - if (debug_allocator.detectLeaks()) { + if (debug_allocator.detectLeaks() != 0) { std.log.debug("Leaks detected", .{}); } if (builtin.os.tag == .windows) std.os.windows.WSACleanup() catch return; diff --git a/src/modules/mmc_client/commands/assert_hall.zig b/src/modules/mmc_client/commands/assert_hall.zig index 08fe1eb9..be0fc235 100644 --- a/src/modules/mmc_client/commands/assert_hall.zig +++ b/src/modules/mmc_client/commands/assert_hall.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "assert_hall"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/assert_location.zig b/src/modules/mmc_client/commands/assert_location.zig index 1f3a4f08..0798e510 100644 --- a/src/modules/mmc_client/commands/assert_location.zig +++ b/src/modules/mmc_client/commands/assert_location.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "assert_location"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/auto_initialize.zig b/src/modules/mmc_client/commands/auto_initialize.zig index 19c7a016..dc7df1fc 100644 --- a/src/modules/mmc_client/commands/auto_initialize.zig +++ b/src/modules/mmc_client/commands/auto_initialize.zig @@ -5,7 +5,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "auto_initialize"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/axis_carrier.zig b/src/modules/mmc_client/commands/axis_carrier.zig index 9198a886..5c04c8be 100644 --- a/src/modules/mmc_client/commands/axis_carrier.zig +++ b/src/modules/mmc_client/commands/axis_carrier.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "axis_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/calibrate.zig b/src/modules/mmc_client/commands/calibrate.zig index 316cb99f..673dd53d 100644 --- a/src/modules/mmc_client/commands/calibrate.zig +++ b/src/modules/mmc_client/commands/calibrate.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "calibrate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/carrier_axis.zig b/src/modules/mmc_client/commands/carrier_axis.zig index 533441a3..f631504c 100644 --- a/src/modules/mmc_client/commands/carrier_axis.zig +++ b/src/modules/mmc_client/commands/carrier_axis.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_axis"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/carrier_id.zig b/src/modules/mmc_client/commands/carrier_id.zig index 1c5640e1..c2628bb5 100644 --- a/src/modules/mmc_client/commands/carrier_id.zig +++ b/src/modules/mmc_client/commands/carrier_id.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_id"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/carrier_location.zig b/src/modules/mmc_client/commands/carrier_location.zig index 96f616e2..b9d38b41 100644 --- a/src/modules/mmc_client/commands/carrier_location.zig +++ b/src/modules/mmc_client/commands/carrier_location.zig @@ -7,7 +7,7 @@ const api = @import("mmc-api"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_location"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/clear_carrier_info.zig b/src/modules/mmc_client/commands/clear_carrier_info.zig index c97889d0..84ebbed6 100644 --- a/src/modules/mmc_client/commands/clear_carrier_info.zig +++ b/src/modules/mmc_client/commands/clear_carrier_info.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "clear_carrier_info"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/clear_errors.zig b/src/modules/mmc_client/commands/clear_errors.zig index 7975227b..0baf0396 100644 --- a/src/modules/mmc_client/commands/clear_errors.zig +++ b/src/modules/mmc_client/commands/clear_errors.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "clear_errors"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index e3511add..e3a5e052 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -8,10 +8,10 @@ const api = @import("mmc-api"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "connect"); defer tracy_zone.end(); - if (client.sock) |_| disconnect.impl(&.{}) catch unreachable; + if (client.sock) |_| disconnect.impl(io, &.{}) catch unreachable; const endpoint: client.Config = if (params[0].len != 0) endpoint: { const last_delimiter_idx = @@ -97,7 +97,7 @@ pub fn impl(params: [][]const u8) !void { ); client.endpoint = try socket.getRemoteEndPoint(); client.sock = socket; - client.reader = socket.reader(&client.reader_buf); + client.reader = socket.reader(io, &client.reader_buf); client.writer = socket.writer(&client.writer_buf); errdefer { client.reader = undefined; @@ -289,7 +289,7 @@ pub fn impl(params: [][]const u8) !void { else => return error.InvalidResponse, }; std.log.info("Track configuration for {s}:", .{server.name}); - var stdout = std.fs.File.stdout().writer(&.{}); + var stdout = std.Io.File.stdout().writer(io, &.{}); for (client.lines) |line| { try stdout.interface.print( "\t {s} ({}) - {} {s} | {} {s}\n", diff --git a/src/modules/mmc_client/commands/disconnect.zig b/src/modules/mmc_client/commands/disconnect.zig index 694dd29c..2fbc586e 100644 --- a/src/modules/mmc_client/commands/disconnect.zig +++ b/src/modules/mmc_client/commands/disconnect.zig @@ -5,7 +5,7 @@ const tracy = @import("tracy"); /// Free all memory EXCEPT the endpoint, so that the client can reconnect to the /// latest server -pub fn impl(_: [][]const u8) error{ServerNotConnected}!void { +pub fn impl(_: std.Io, _: [][]const u8) error{ServerNotConnected}!void { const tracy_zone = tracy.traceNamed(@src(), "disconnect"); defer tracy_zone.end(); if (client.sock) |s| { diff --git a/src/modules/mmc_client/commands/get_acceleration.zig b/src/modules/mmc_client/commands/get_acceleration.zig index 8a0ac416..5dead0e7 100644 --- a/src/modules/mmc_client/commands/get_acceleration.zig +++ b/src/modules/mmc_client/commands/get_acceleration.zig @@ -6,7 +6,7 @@ const tracy = @import("tracy"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "get_acceleration"); defer tracy_zone.end(); const line_name: []const u8 = params[0]; diff --git a/src/modules/mmc_client/commands/get_speed.zig b/src/modules/mmc_client/commands/get_speed.zig index e971e9e0..ae4dc6f4 100644 --- a/src/modules/mmc_client/commands/get_speed.zig +++ b/src/modules/mmc_client/commands/get_speed.zig @@ -6,7 +6,7 @@ const tracy = @import("tracy"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "get_speed"); defer tracy_zone.end(); const line_name: []const u8 = params[0]; diff --git a/src/modules/mmc_client/commands/hall_status.zig b/src/modules/mmc_client/commands/hall_status.zig index e5c13193..c5b4a0b3 100644 --- a/src/modules/mmc_client/commands/hall_status.zig +++ b/src/modules/mmc_client/commands/hall_status.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "hall_status"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/isolate.zig b/src/modules/mmc_client/commands/isolate.zig index 9e9a7eec..c9706ef2 100644 --- a/src/modules/mmc_client/commands/isolate.zig +++ b/src/modules/mmc_client/commands/isolate.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "isolate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/log.zig b/src/modules/mmc_client/commands/log.zig index b4b678cf..f0173a4e 100644 --- a/src/modules/mmc_client/commands/log.zig +++ b/src/modules/mmc_client/commands/log.zig @@ -8,7 +8,7 @@ const zignet = @import("zignet"); const Kind = enum { all, axis, driver }; -pub fn add(params: [][]const u8) !void { +pub fn add(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "add_log"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -60,7 +60,7 @@ pub fn add(params: [][]const u8) !void { try modify(line, kind, range, true); } -pub fn start(params: [][]const u8) !void { +pub fn start(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "start_log"); defer tracy_zone.end(); if (client.log.executing.load(.monotonic) == true) @@ -73,7 +73,9 @@ pub fn start(params: [][]const u8) !void { break :p try client.allocator.dupe(u8, path); break :p try std.fmt.allocPrint(client.allocator, "{s}.csv", .{path}); } else p: { - var timestamp: u64 = @intCast(std.time.timestamp()); + const clock: std.Io.Clock = .real; + const timestamp_nano = try clock.now(io); + var timestamp: u64 = @intCast(timestamp_nano.toSeconds()); timestamp += std.time.s_per_hour * 9; const days_since_epoch: i32 = @intCast(timestamp / std.time.s_per_day); const ymd = @@ -100,18 +102,18 @@ pub fn start(params: [][]const u8) !void { const log_thread = try std.Thread.spawn( .{}, client.log.runner, - .{ duration, try client.allocator.dupe(u8, file_path) }, + .{ io, duration, try client.allocator.dupe(u8, file_path) }, ); log_thread.detach(); } -pub fn status(_: [][]const u8) !void { +pub fn status(io: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "status_log"); defer tracy_zone.end(); - try client.log_config.status(); + try client.log_config.status(io); } -pub fn remove(params: [][]const u8) !void { +pub fn remove(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "remove_log"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -163,7 +165,7 @@ pub fn remove(params: [][]const u8) !void { try modify(line, kind, range, false); } -pub fn stop(_: [][]const u8) !void { +pub fn stop(_: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop_log"); defer tracy_zone.end(); if (client.log.executing.load(.monotonic)) @@ -172,7 +174,7 @@ pub fn stop(_: [][]const u8) !void { return error.NoRunningLogging; } -pub fn cancel(_: [][]const u8) !void { +pub fn cancel(_: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "cancel_log"); defer tracy_zone.end(); if (client.log.executing.load(.monotonic)) diff --git a/src/modules/mmc_client/commands/move.zig b/src/modules/mmc_client/commands/move.zig index d253e9cd..3d4ca923 100644 --- a/src/modules/mmc_client/commands/move.zig +++ b/src/modules/mmc_client/commands/move.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "move_carrier"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/pause.zig b/src/modules/mmc_client/commands/pause.zig index 32cdac1a..4048f4eb 100644 --- a/src/modules/mmc_client/commands/pause.zig +++ b/src/modules/mmc_client/commands/pause.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "pause"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/print_axis_info.zig b/src/modules/mmc_client/commands/print_axis_info.zig index 0f702497..a061f8b9 100644 --- a/src/modules/mmc_client/commands/print_axis_info.zig +++ b/src/modules/mmc_client/commands/print_axis_info.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_axis_info"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -72,7 +72,7 @@ pub fn impl(params: [][]const u8) !void { if (axis_state.items.len != axis_errors.items.len) return error.InvalidResponse; var writer_buf: [4096]u8 = undefined; - var stdout = std.fs.File.stdout().writer(&writer_buf); + var stdout = std.Io.File.stdout().writer(io, &writer_buf); const writer = &stdout.interface; for (axis_state.items, axis_errors.items) |info, err| { _ = try client.nestedWrite( diff --git a/src/modules/mmc_client/commands/print_carrier_info.zig b/src/modules/mmc_client/commands/print_carrier_info.zig index cc42570e..727bfbe8 100644 --- a/src/modules/mmc_client/commands/print_carrier_info.zig +++ b/src/modules/mmc_client/commands/print_carrier_info.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_carrier_info"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -73,7 +73,7 @@ pub fn impl(params: [][]const u8) !void { const carriers = track.carrier_state; if (carriers.items.len == 0) return error.CarrierNotFound; var writer_buf: [4096]u8 = undefined; - var stdout = std.fs.File.stdout().writer(&writer_buf); + var stdout = std.Io.File.stdout().writer(io, &writer_buf); const writer = &stdout.interface; for (carriers.items) |carrier| { _ = try client.nestedWrite("Carrier state", carrier, 0, writer); diff --git a/src/modules/mmc_client/commands/print_driver_info.zig b/src/modules/mmc_client/commands/print_driver_info.zig index 9eb68a63..d578c7d9 100644 --- a/src/modules/mmc_client/commands/print_driver_info.zig +++ b/src/modules/mmc_client/commands/print_driver_info.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_driver_info"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -70,7 +70,7 @@ pub fn impl(params: [][]const u8) !void { const driver_errors = track.driver_errors; if (driver_state.items.len != driver_errors.items.len) return error.InvalidResponse; - var stdout = std.fs.File.stdout().writer(&.{}); + var stdout = std.Io.File.stdout().writer(io, &.{}); const writer = &stdout.interface; for (driver_state.items, driver_errors.items) |info, err| { _ = try client.nestedWrite( diff --git a/src/modules/mmc_client/commands/pull.zig b/src/modules/mmc_client/commands/pull.zig index 2a2a8d64..df99562f 100644 --- a/src/modules/mmc_client/commands/pull.zig +++ b/src/modules/mmc_client/commands/pull.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { if (client.sock == null) return error.ServerNotConnected; const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { diff --git a/src/modules/mmc_client/commands/push.zig b/src/modules/mmc_client/commands/push.zig index e8ebc4c1..7c9ab447 100644 --- a/src/modules/mmc_client/commands/push.zig +++ b/src/modules/mmc_client/commands/push.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { if (client.sock == null) return error.ServerNotConnected; const line_name = params[0]; const line_idx = try client.matchLine(line_name); diff --git a/src/modules/mmc_client/commands/release_carrier.zig b/src/modules/mmc_client/commands/release_carrier.zig index 8be56d42..24e857e9 100644 --- a/src/modules/mmc_client/commands/release_carrier.zig +++ b/src/modules/mmc_client/commands/release_carrier.zig @@ -5,7 +5,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "release_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/reset_system.zig b/src/modules/mmc_client/commands/reset_system.zig index 595db99d..58288e0d 100644 --- a/src/modules/mmc_client/commands/reset_system.zig +++ b/src/modules/mmc_client/commands/reset_system.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: [][]const u8) !void { +pub fn impl(_: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "reset_system"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/resume.zig b/src/modules/mmc_client/commands/resume.zig index e83d08d5..fbe84e17 100644 --- a/src/modules/mmc_client/commands/resume.zig +++ b/src/modules/mmc_client/commands/resume.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "resume"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/server_version.zig b/src/modules/mmc_client/commands/server_version.zig index 7825d830..989f273c 100644 --- a/src/modules/mmc_client/commands/server_version.zig +++ b/src/modules/mmc_client/commands/server_version.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: [][]const u8) !void { +pub fn impl(_: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "server_version"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/set_acceleration.zig b/src/modules/mmc_client/commands/set_acceleration.zig index e8f988aa..deddae3f 100644 --- a/src/modules/mmc_client/commands/set_acceleration.zig +++ b/src/modules/mmc_client/commands/set_acceleration.zig @@ -6,7 +6,7 @@ const tracy = @import("tracy"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_acceleration"); defer tracy_zone.end(); const line_name: []const u8 = params[0]; diff --git a/src/modules/mmc_client/commands/set_carrier_id.zig b/src/modules/mmc_client/commands/set_carrier_id.zig index 0a3c5c76..04faf8ec 100644 --- a/src/modules/mmc_client/commands/set_carrier_id.zig +++ b/src/modules/mmc_client/commands/set_carrier_id.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_carrier_id"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/set_line_zero.zig b/src/modules/mmc_client/commands/set_line_zero.zig index 1da12937..334d505a 100644 --- a/src/modules/mmc_client/commands/set_line_zero.zig +++ b/src/modules/mmc_client/commands/set_line_zero.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_line_zero"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/set_speed.zig b/src/modules/mmc_client/commands/set_speed.zig index b150788f..2568abd7 100644 --- a/src/modules/mmc_client/commands/set_speed.zig +++ b/src/modules/mmc_client/commands/set_speed.zig @@ -6,7 +6,7 @@ const tracy = @import("tracy"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_speed"); defer tracy_zone.end(); const line_name: []const u8 = params[0]; diff --git a/src/modules/mmc_client/commands/show_errors.zig b/src/modules/mmc_client/commands/show_errors.zig index 69422db4..a188f084 100644 --- a/src/modules/mmc_client/commands/show_errors.zig +++ b/src/modules/mmc_client/commands/show_errors.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "show_errors"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; @@ -76,7 +76,7 @@ pub fn impl(params: [][]const u8) !void { const axis_errors = track.axis_errors; const driver_errors = track.driver_errors; var writer_buf: [4096]u8 = undefined; - var stdout = std.fs.File.stdout().writer(&writer_buf); + var stdout = std.Io.File.stdout().writer(io, &writer_buf); const writer = &stdout.interface; for (axis_errors.items) |err| { const ti = @typeInfo(@TypeOf(err)).@"struct"; diff --git a/src/modules/mmc_client/commands/stop.zig b/src/modules/mmc_client/commands/stop.zig index 60808a30..b8bfa939 100644 --- a/src/modules/mmc_client/commands/stop.zig +++ b/src/modules/mmc_client/commands/stop.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop"); defer tracy_zone.end(); if (client.sock == null) return error.ServerNotConnected; diff --git a/src/modules/mmc_client/commands/stop_pull.zig b/src/modules/mmc_client/commands/stop_pull.zig index 77d7bd93..83386151 100644 --- a/src/modules/mmc_client/commands/stop_pull.zig +++ b/src/modules/mmc_client/commands/stop_pull.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop_pull"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/stop_push.zig b/src/modules/mmc_client/commands/stop_push.zig index ac621d0a..2a074107 100644 --- a/src/modules/mmc_client/commands/stop_push.zig +++ b/src/modules/mmc_client/commands/stop_push.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(params: [][]const u8) !void { +pub fn impl(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop_push"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/commands/wait.zig b/src/modules/mmc_client/commands/wait.zig index f884a8fc..6bec5660 100644 --- a/src/modules/mmc_client/commands/wait.zig +++ b/src/modules/mmc_client/commands/wait.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn isolate(params: [][]const u8) !void { +pub fn isolate(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_isolate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); @@ -37,7 +37,7 @@ pub fn isolate(params: [][]const u8) !void { ); } -pub fn moveCarrier(params: [][]const u8) !void { +pub fn moveCarrier(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_move_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); @@ -71,7 +71,7 @@ pub fn moveCarrier(params: [][]const u8) !void { ); } -pub fn axisEmpty(params: [][]const u8) !void { +pub fn axisEmpty(_: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_axis_empty"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index 6692fb1a..a39c3cdc 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -66,10 +66,10 @@ pub const Config = struct { return false; } - pub fn status(self: Config) !void { + pub fn status(self: Config, io: std.Io) !void { std.log.info("Logging configuration:", .{}); var stdout_buf: [4096]u8 = undefined; - var stdout = std.fs.File.stdout().writer(&stdout_buf); + var stdout = std.Io.File.stdout().writer(io, &stdout_buf); defer stdout.interface.flush() catch {}; for (self.lines) |line| { if (line.isInitialized() == false) continue; @@ -265,6 +265,7 @@ const Stream = struct { fn init( allocator: std.mem.Allocator, + io: std.Io, logging_size: usize, config: log.Config, lines: []client.Line, @@ -310,7 +311,7 @@ const Stream = struct { 3000, ); errdefer stream.socket.close(); - stream.reader = stream.socket.reader(&stream_writer_buf); + stream.reader = stream.socket.reader(io, &stream_writer_buf); stream.writer = stream.socket.writer(&stream_reader_buf); stream.config.lines = .empty; errdefer stream.config.lines.deinit(allocator); @@ -626,7 +627,7 @@ var stream_reader_buf: [4096]u8 = undefined; var file_reader_buf: [4096]u8 = undefined; var file_writer_buf: [4096]u8 = undefined; -pub fn runner(duration: f64, file_path: []const u8) !void { +pub fn runner(io: std.Io, duration: f64, file_path: []const u8) !void { defer client.allocator.free(file_path); // Validation steps if (client.log_config.isInitialized() == false) @@ -652,11 +653,11 @@ pub fn runner(duration: f64, file_path: []const u8) !void { ); defer stream.deinit(client.allocator); // Logging file setup. - const log_file = try std.fs.cwd().createFile(file_path, .{}); + const log_file = try std.Io.Dir.cwd().createFile(io, file_path, .{}); defer { log_file.close(); if (cancel.load(.monotonic)) - std.fs.cwd().deleteFile(file_path) catch {}; + std.Io.Dir.cwd().deleteFile(io, file_path) catch {}; } std.log.info("The registers will be logged to {s}.", .{file_path}); const log_time_start = std.time.microTimestamp(); diff --git a/src/modules/return_demo2.zig b/src/modules/return_demo2.zig index 9c517d4b..3fb1d10b 100644 --- a/src/modules/return_demo2.zig +++ b/src/modules/return_demo2.zig @@ -161,7 +161,7 @@ pub fn deinit() void { arena.deinit(); } -fn home(_: [][]const u8) !void { +fn home(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -211,7 +211,7 @@ fn home(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn raiseStartAxis(_: [][]const u8) !void { +fn raiseStartAxis(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -236,7 +236,7 @@ fn raiseStartAxis(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn lowerStartAxis(_: [][]const u8) !void { +fn lowerStartAxis(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -261,7 +261,7 @@ fn lowerStartAxis(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn raiseEndAxis(_: [][]const u8) !void { +fn raiseEndAxis(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -286,7 +286,7 @@ fn raiseEndAxis(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn lowerEndAxis(_: [][]const u8) !void { +fn lowerEndAxis(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -311,7 +311,7 @@ fn lowerEndAxis(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn beltMoveStart(_: [][]const u8) !void { +fn beltMoveStart(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { @@ -336,7 +336,7 @@ fn beltMoveStart(_: [][]const u8) !void { } else return error.ReturnSystemDisconnected; } -fn beltMoveEnd(_: [][]const u8) !void { +fn beltMoveEnd(_: std.Io, _: [][]const u8) !void { clients_lock.lockShared(); defer clients_lock.unlockShared(); if (clients.items.len > 0) { From 55cd54535ff96b89ca936f714d154b3fd20a8ed4 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Mon, 19 Jan 2026 11:32:05 +0900 Subject: [PATCH 03/12] ci: Update to zig master --- .github/workflows/release.yml | 8 ++++---- .github/workflows/test.yml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 659b3f74..51b48f39 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Release on: workflow_run: - workflows: ['Test'] + workflows: ["Test"] types: [completed] branches: - main @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [Linux] - runs-on: [ self-hosted, "${{ matrix.os }}" ] + runs-on: [self-hosted, "${{ matrix.os }}"] defaults: run: shell: bash @@ -35,12 +35,12 @@ jobs: - uses: mlugg/setup-zig@v2 with: - version: 0.15.2 + version: 0.16.0-dev.2193+fc517bd01 - uses: actions/github-script@v7 id: parse-version env: - SHA: '${{env.parentSHA}}' + SHA: "${{env.parentSHA}}" with: script: | const script = require('./.github/workflows/zig-version.js'); diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3e97c976..f8efcf9e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: [Linux, Windows] - runs-on: [ self-hosted, "${{ matrix.os }}" ] + runs-on: [self-hosted, "${{ matrix.os }}"] steps: - name: Log masks on Linux if: matrix.os == 'Linux' @@ -31,7 +31,7 @@ jobs: - uses: mlugg/setup-zig@v2 with: - version: 0.15.2 + version: 0.16.0-dev.2193+fc517bd01 - name: Run zig fmt if: matrix.os == 'Linux' From bf6cacd244cee5937e60f419322a024bb4e385c0 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Wed, 21 Jan 2026 15:49:39 +0900 Subject: [PATCH 04/12] deps: Remove zignet, use std library --- build.zig | 6 - build.zig.zon | 4 - src/command.zig | 2 +- src/modules/mmc_client.zig | 71 +++--- .../mmc_client/commands/assert_hall.zig | 26 ++- .../mmc_client/commands/assert_location.zig | 22 +- .../mmc_client/commands/auto_initialize.zig | 18 +- .../mmc_client/commands/axis_carrier.zig | 22 +- src/modules/mmc_client/commands/calibrate.zig | 18 +- .../mmc_client/commands/carrier_axis.zig | 22 +- .../mmc_client/commands/carrier_id.zig | 22 +- .../mmc_client/commands/carrier_location.zig | 22 +- .../commands/clear_carrier_info.zig | 18 +- .../mmc_client/commands/clear_errors.zig | 18 +- src/modules/mmc_client/commands/connect.zig | 219 +++++++++--------- .../mmc_client/commands/disconnect.zig | 36 ++- .../mmc_client/commands/hall_status.zig | 22 +- src/modules/mmc_client/commands/isolate.zig | 18 +- src/modules/mmc_client/commands/log.zig | 37 +-- src/modules/mmc_client/commands/move.zig | 18 +- src/modules/mmc_client/commands/pause.zig | 18 +- .../mmc_client/commands/print_axis_info.zig | 23 +- .../commands/print_carrier_info.zig | 23 +- .../mmc_client/commands/print_driver_info.zig | 20 +- src/modules/mmc_client/commands/pull.zig | 18 +- src/modules/mmc_client/commands/push.zig | 42 ++-- .../mmc_client/commands/release_carrier.zig | 18 +- .../mmc_client/commands/reset_system.zig | 48 ++-- src/modules/mmc_client/commands/resume.zig | 18 +- .../mmc_client/commands/server_version.zig | 22 +- .../mmc_client/commands/set_carrier_id.zig | 18 +- .../mmc_client/commands/set_line_zero.zig | 18 +- .../mmc_client/commands/show_errors.zig | 23 +- src/modules/mmc_client/commands/stop.zig | 18 +- src/modules/mmc_client/commands/stop_pull.zig | 18 +- src/modules/mmc_client/commands/stop_push.zig | 18 +- src/modules/mmc_client/commands/wait.zig | 49 ++-- src/modules/mmc_client/log.zig | 92 ++++---- 38 files changed, 623 insertions(+), 522 deletions(-) diff --git a/build.zig b/build.zig index 7b638c57..c8063558 100644 --- a/build.zig +++ b/build.zig @@ -86,11 +86,6 @@ pub fn build(b: *std.Build) !void { .optimize = optimize, }); - const zignet = b.dependency("zignet", .{ - .target = target, - .optimize = optimize, - }); - const build_zig_zon = b.createModule(.{ .root_source_file = b.path("build.zig.zon"), .target = target, @@ -103,7 +98,6 @@ pub fn build(b: *std.Build) !void { .{ .name = "mmc-api", .module = mmc_api.module("mmc-api") }, .{ .name = "network", .module = network_dep.module("network") }, .{ .name = "chrono", .module = chrono.module("chrono") }, - .{ .name = "zignet", .module = zignet.module("zignet") }, .{ .name = "tracy", .module = tracy_module }, }; const setup_options: SetupOptions = .{ diff --git a/build.zig.zon b/build.zig.zon index 694e36d6..498ded06 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -12,10 +12,6 @@ .url = "https://github.com/mochalins/network/archive/084fed7.tar.gz", .hash = "network-0.1.0-Pm-AgiMxAQCuaDrGAfSxVHeozUQ2gU3jINGLFxJ1Zpld", }, - .zignet = .{ - .url = "https://github.com/aaumar25/zignet/archive/ca7d172.tar.gz", - .hash = "zignet-0.2.0-BAu-r4GpAACnu7GCkbPHa4F6lQaq5wypMWqr0z0BM9nO", - }, .chrono = .{ .url = "https://github.com/aaumar25/chrono/archive/11b2a9b.tar.gz", .hash = "chrono-0.1.0-uVd76ObCAwBL5hB9wCVWZLus9iLTKvINA_GYw_Lmkfid", diff --git a/src/command.zig b/src/command.zig index 601059cb..6bafb0fd 100644 --- a/src/command.zig +++ b/src/command.zig @@ -917,7 +917,7 @@ fn loadConfig(io: std.Io, params: [][]const u8) !void { ); defer home_dir.close(io); var config_root = try home_dir.openDir(io, ".config", .{}); - defer config_root.close(); + defer config_root.close(io); break :b try config_root.openDir("mmc-cli", .{}); }, .linux => b: { diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index fe70c745..b042b5cb 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -8,7 +8,6 @@ const CircularBufferAlloc = const command = @import("../command.zig"); pub const Line = @import("mmc_client/Line.zig"); pub const log = @import("mmc_client/log.zig"); -pub const zignet = @import("zignet"); pub const api = @import("mmc-api"); const commands = struct { @@ -304,7 +303,7 @@ pub const Parameter = struct { /// Assert the parameter is a valid line name fn isValid(self: *@This(), input: []const u8) bool { // Invalidate if not connected to server. - if (builtin.is_test == false and sock == null) return false; + if (builtin.is_test == false and stream == null) return false; var it = std.mem.tokenizeSequence(u8, input, ","); while (it.next()) |item| { if (self.items.contains(item) == false) return false; @@ -617,10 +616,10 @@ pub var lines: []Line = &.{}; /// deinitialized if the client is disconnected. pub var log_config: log.Config = undefined; /// Currently connected socket. Nulled when disconnect. -pub var sock: ?zignet.Socket = null; +pub var stream: ?std.Io.net.Stream = null; /// Currently saved endpoint. The endpoint will be overwritten if the client /// is connected to a different server. Stays null before connected to a socket. -pub var endpoint: ?zignet.Endpoint = null; +pub var endpoint: ?std.Io.net.IpAddress = null; pub var allocator: std.mem.Allocator = undefined; @@ -632,14 +631,6 @@ pub const Config = struct { /// Store the configuration. pub var config: Config = undefined; -/// Reader buffer for network stream -pub var reader_buf: [4096]u8 = undefined; -/// Writer buffer for network stream -pub var writer_buf: [4096]u8 = undefined; - -pub var reader: zignet.Socket.Reader = undefined; -pub var writer: zignet.Socket.Writer = undefined; - var debug_allocator = std.heap.DebugAllocator(.{}){}; pub fn init(c: Config) !void { @@ -1779,24 +1770,28 @@ pub fn matchLine(name: []const u8) !usize { /// Track a command until it executed completely followed by removing that /// command from the server. -pub fn waitCommandReceived() !void { - if (sock == null) return error.ServerNotConnected; +pub fn waitCommandReceived(io: std.Io) !void { + const net = stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const command_id = b: { // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return reader.error_state orelse error.Unexpected; + return net_reader.err orelse error.Unexpected; }, } }; if (byte > 0) break; } const decoded: api.protobuf.mmc.Response = try .decode( - &reader.interface, + &net_reader.interface, allocator, ); break :b switch (decoded.body orelse return error.InvalidResponse) { @@ -1814,7 +1809,7 @@ pub fn waitCommandReceived() !void { else => return error.InvalidResponse, }; }; - defer removeCommand(command_id) catch {}; + defer removeCommand(io, command_id) catch {}; while (true) { const request: api.protobuf.mmc.Request = .{ .body = .{ @@ -1825,27 +1820,27 @@ pub fn waitCommandReceived() !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = try reader.interface.discardRemaining(); - _ = writer.interface.consumeAll(); + // Clear all buffer in net_reader and net_writer for safety. + _ = try net_reader.interface.discardRemaining(); + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&writer.interface, allocator); - try writer.interface.flush(); + try request.encode(&net_writer.interface, allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return reader.error_state orelse error.Unexpected; + return net_reader.err orelse error.Unexpected; }, } }; if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &reader.interface, + &net_reader.interface, allocator, ); defer decoded.deinit(allocator); @@ -1887,8 +1882,12 @@ pub fn waitCommandReceived() !void { } } -fn removeCommand(id: u32) !void { - if (sock == null) return error.ServerNotConnected; +fn removeCommand(io: std.Io, id: u32) !void { + const net = stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const request: api.protobuf.mmc.Request = .{ .body = .{ .command = .{ @@ -1898,27 +1897,27 @@ fn removeCommand(id: u32) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = try reader.interface.discardRemaining(); - _ = writer.interface.consumeAll(); + // Clear all buffer in net_reader and net_writer for safety. + _ = try net_reader.interface.discardRemaining(); + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&writer.interface, allocator); - try writer.interface.flush(); + try request.encode(&net_writer.interface, allocator); + try net_writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return reader.error_state orelse error.Unexpected; + return net_reader.err orelse error.Unexpected; }, } }; if (byte > 0) break; } const decoded: api.protobuf.mmc.Response = try .decode( - &reader.interface, + &net_reader.interface, allocator, ); const removed_id = switch (decoded.body orelse diff --git a/src/modules/mmc_client/commands/assert_hall.zig b/src/modules/mmc_client/commands/assert_hall.zig index be0fc235..feddcada 100644 --- a/src/modules/mmc_client/commands/assert_hall.zig +++ b/src/modules/mmc_client/commands/assert_hall.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "assert_hall"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -63,19 +67,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -85,11 +89,11 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { } while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -98,7 +102,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/assert_location.zig b/src/modules/mmc_client/commands/assert_location.zig index 0798e510..55c9d762 100644 --- a/src/modules/mmc_client/commands/assert_location.zig +++ b/src/modules/mmc_client/commands/assert_location.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "assert_location"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -49,19 +53,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -70,7 +74,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/auto_initialize.zig b/src/modules/mmc_client/commands/auto_initialize.zig index dc7df1fc..f9c7ab7c 100644 --- a/src/modules/mmc_client/commands/auto_initialize.zig +++ b/src/modules/mmc_client/commands/auto_initialize.zig @@ -5,11 +5,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "auto_initialize"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var init_lines: std.ArrayList( api.protobuf.mmc.command.Request.AutoInitialize.Line, ) = .empty; @@ -41,10 +45,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/axis_carrier.zig b/src/modules/mmc_client/commands/axis_carrier.zig index 5c04c8be..f44432f7 100644 --- a/src/modules/mmc_client/commands/axis_carrier.zig +++ b/src/modules/mmc_client/commands/axis_carrier.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "axis_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -45,19 +49,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -66,7 +70,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/calibrate.zig b/src/modules/mmc_client/commands/calibrate.zig index 673dd53d..fdeed18c 100644 --- a/src/modules/mmc_client/commands/calibrate.zig +++ b/src/modules/mmc_client/commands/calibrate.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "calibrate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -22,10 +26,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/carrier_axis.zig b/src/modules/mmc_client/commands/carrier_axis.zig index f631504c..89d9e048 100644 --- a/src/modules/mmc_client/commands/carrier_axis.zig +++ b/src/modules/mmc_client/commands/carrier_axis.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_axis"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -41,19 +45,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -62,7 +66,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/carrier_id.zig b/src/modules/mmc_client/commands/carrier_id.zig index c2628bb5..eed173be 100644 --- a/src/modules/mmc_client/commands/carrier_id.zig +++ b/src/modules/mmc_client/commands/carrier_id.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_id"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var line_name_iterator = std.mem.tokenizeSequence( u8, params[0], @@ -60,19 +64,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -81,7 +85,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/carrier_location.zig b/src/modules/mmc_client/commands/carrier_location.zig index b9d38b41..75098afe 100644 --- a/src/modules/mmc_client/commands/carrier_location.zig +++ b/src/modules/mmc_client/commands/carrier_location.zig @@ -7,11 +7,15 @@ const api = @import("mmc-api"); const Standard = client.Standard; const standard: Standard = .{}; -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_location"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -48,19 +52,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -69,7 +73,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/clear_carrier_info.zig b/src/modules/mmc_client/commands/clear_carrier_info.zig index 84ebbed6..5237ce35 100644 --- a/src/modules/mmc_client/commands/clear_carrier_info.zig +++ b/src/modules/mmc_client/commands/clear_carrier_info.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "clear_carrier_info"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -39,10 +43,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/clear_errors.zig b/src/modules/mmc_client/commands/clear_errors.zig index 0baf0396..0ecc2876 100644 --- a/src/modules/mmc_client/commands/clear_errors.zig +++ b/src/modules/mmc_client/commands/clear_errors.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "clear_errors"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -39,10 +43,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index e3a5e052..813b3377 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -11,108 +11,94 @@ const standard: Standard = .{}; pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "connect"); defer tracy_zone.end(); - if (client.sock) |_| disconnect.impl(io, &.{}) catch unreachable; - const endpoint: client.Config = - if (params[0].len != 0) endpoint: { - const last_delimiter_idx = - std.mem.lastIndexOf(u8, params[0], ":") orelse - return error.MissingPort; - // IPv6 address shall be provided with square brackets. In addition, - // Ipv6 address has at least 2 ":" characters, with the port - // separator makes it 3 characters. - if (std.mem.count(u8, params[0], ":") > 2 and - std.mem.eql(u8, "[", params[0][0..1]) and - std.mem.eql( - u8, - "]", - params[0][last_delimiter_idx - 1 .. last_delimiter_idx], - )) - { - // IPv6 address shall be provided with scope id. Required for - // local connection. - if (std.mem.count(u8, params[0], "%") == 0) - return error.MissingScopeId; + if (client.stream) |_| disconnect.impl(io, &.{}) catch unreachable; + // Parse endpoint + const endpoint: union(enum) { + hostname: std.Io.net.HostName, + ip_address: std.Io.net.IpAddress, + }, const port: u16 = endpoint: { + if (params[0].len != 0) { + const last_delimiter_idx = std.mem.lastIndexOf( + u8, + params[0], + ":", + ) orelse return error.MissingPort; + // Parse port + const port = std.fmt.parseInt( + u16, + params[0][last_delimiter_idx + 1 ..], + 0, + ) catch return error.InvalidPort; + // Resolve IP address + if (std.Io.net.IpAddress.resolve( + io, + params[0][0..last_delimiter_idx], + port, + )) |address| { + break :endpoint .{ .{ .ip_address = address }, port }; + } else |_| { + // Use the parameter as hostname break :endpoint .{ - .port = std.fmt.parseInt( - u16, - params[0][last_delimiter_idx + 1 ..], - 0, - ) catch return error.InvalidEndpoint, - .host = try client.allocator.dupe( - u8, - params[0][1 .. last_delimiter_idx - 1], - ), + .{ + .hostname = try .init(params[0][0..last_delimiter_idx]), + }, + port, }; } - // IPv4 address or hostname logic. + } else if (client.endpoint) |endpoint| { break :endpoint .{ - .port = std.fmt.parseInt( - u16, - params[0][last_delimiter_idx + 1 ..], - 0, - ) catch return error.InvalidEndpoint, - .host = try client.allocator.dupe( - u8, - params[0][0..last_delimiter_idx], - ), + .{ .ip_address = endpoint }, + endpoint.getPort(), }; - } else if (client.endpoint == null) .{ - .host = try client.allocator.dupe(u8, client.config.host), - .port = client.config.port, - } else .{ - .host = switch (client.endpoint.?.addr) { - .ipv4 => |ipv4| try std.fmt.allocPrint( - client.allocator, - "{f}", - .{ipv4}, - ), - .ipv6 => |ipv6| ipv6: { - const format = try std.fmt.allocPrint( - client.allocator, - "{f}", - .{ipv6}, - ); - defer client.allocator.free(format); - // Remove the square bracket from ipv6 - break :ipv6 try std.fmt.allocPrint( - client.allocator, - "{s}", - .{format[1 .. format.len - 1]}, - ); - }, - }, - .port = client.endpoint.?.port, - }; - defer client.allocator.free(endpoint.host); - std.log.info( - "Trying to connect to {s}:{d}", - .{ endpoint.host, endpoint.port }, - ); - const socket = try client.zignet.Socket.connectToHost( - client.allocator, - endpoint.host, - endpoint.port, - &command.checkCommandInterrupt, - 3000, - ); - client.endpoint = try socket.getRemoteEndPoint(); - client.sock = socket; - client.reader = socket.reader(io, &client.reader_buf); - client.writer = socket.writer(&client.writer_buf); + } else { + // Resolve IP address + if (std.Io.net.IpAddress.resolve( + io, + client.config.host, + client.config.port, + )) |address| { + break :endpoint .{ + .{ .ip_address = address }, + client.config.port, + }; + } else |_| { + // Use the parameter as hostname + break :endpoint .{ + .{ .hostname = try .init(client.config.host) }, + client.config.port, + }; + } + } + }; + // TODO: Interrupt if ctrl+c is pressed + const net = switch (endpoint) { + .hostname => |hostname| net: { + std.log.info( + "Trying to connect to {s}:{}", + .{ hostname.bytes, port }, + ); + break :net try hostname.connect(io, port, .{ .mode = .stream }); + }, + .ip_address => |address| net: { + std.log.info("Trying to connect to {f}", .{address}); + break :net try address.connect(io, .{ .mode = .stream }); + }, + }; + // Store net to global client + client.stream = net; + errdefer client.stream = null; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); errdefer { - client.reader = undefined; - client.writer = undefined; for (client.lines) |*line| { line.deinit(client.allocator); } client.allocator.free(client.lines); - client.sock = null; - socket.close(); + client.stream = null; + net.socket.close(io); } - std.log.info( - "Connected to {f}", - .{try socket.getRemoteEndPoint()}, - ); std.log.debug("Send API version request..", .{}); // Asserting that API version matched between client and server { @@ -122,19 +108,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -143,7 +129,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } const decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); const server_api_version = switch (decoded.body orelse @@ -161,13 +147,13 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, else => return error.InvalidResponse, }; - if (api.version.major != server_api_version.major or - api.version.minor > server_api_version.minor) + if (api.protobuf.version.major != server_api_version.major or + api.protobuf.version.minor > server_api_version.minor) { std.log.info( "Client API version: {f}, Server API version: {}.{}.{}", .{ - api.version, + api.protobuf.version, server_api_version.major, server_api_version.minor, server_api_version.patch, @@ -184,19 +170,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -205,7 +191,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -248,19 +234,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -269,7 +255,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -309,4 +295,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { // Initialize memory for logging configuration client.log_config = try client.log.Config.init(client.allocator, client.lines); + // Store the newly connected server as the new client endpoint. + std.log.info("Connected to {f}", .{net.socket.address}); + client.endpoint = net.socket.address; } diff --git a/src/modules/mmc_client/commands/disconnect.zig b/src/modules/mmc_client/commands/disconnect.zig index 2fbc586e..ce75d4c6 100644 --- a/src/modules/mmc_client/commands/disconnect.zig +++ b/src/modules/mmc_client/commands/disconnect.zig @@ -5,27 +5,21 @@ const tracy = @import("tracy"); /// Free all memory EXCEPT the endpoint, so that the client can reconnect to the /// latest server -pub fn impl(_: std.Io, _: [][]const u8) error{ServerNotConnected}!void { +pub fn impl(io: std.Io, _: [][]const u8) error{ServerNotConnected}!void { const tracy_zone = tracy.traceNamed(@src(), "disconnect"); defer tracy_zone.end(); - if (client.sock) |s| { - client.log.stop.store(true, .monotonic); - // Wait until the log finish storing log data and cleanup - while (client.log.executing.load(.monotonic)) {} - client.parameter.reset(); - client.log_config.deinit(client.allocator); - client.reader = undefined; - client.writer = undefined; - s.close(); - client.sock = null; - for (client.lines) |*line| { - line.deinit(client.allocator); - } - client.allocator.free(client.lines); - client.lines = &.{}; - std.log.info( - "Disconnected from {f}:{}", - .{ client.endpoint.?.addr, client.endpoint.?.port }, - ); - } else return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + client.log.stop.store(true, .monotonic); + // Wait until the log finish storing log data and cleanup + while (client.log.executing.load(.monotonic)) {} + client.parameter.reset(); + client.log_config.deinit(client.allocator); + net.close(io); + client.stream = null; + for (client.lines) |*line| { + line.deinit(client.allocator); + } + client.allocator.free(client.lines); + client.lines = &.{}; + std.log.info("Disconnected from {f}", .{client.endpoint.?}); } diff --git a/src/modules/mmc_client/commands/hall_status.zig b/src/modules/mmc_client/commands/hall_status.zig index c5b4a0b3..92be5f7c 100644 --- a/src/modules/mmc_client/commands/hall_status.zig +++ b/src/modules/mmc_client/commands/hall_status.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "hall_status"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: ?client.Filter = null; const line_idx = try client.matchLine(line_name); @@ -32,19 +36,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -53,7 +57,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/isolate.zig b/src/modules/mmc_client/commands/isolate.zig index c9706ef2..c07b3229 100644 --- a/src/modules/mmc_client/commands/isolate.zig +++ b/src/modules/mmc_client/commands/isolate.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "isolate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -81,10 +85,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/log.zig b/src/modules/mmc_client/commands/log.zig index f0173a4e..13132016 100644 --- a/src/modules/mmc_client/commands/log.zig +++ b/src/modules/mmc_client/commands/log.zig @@ -4,14 +4,13 @@ const command = @import("../../../command.zig"); const chrono = @import("chrono"); const tracy = @import("tracy"); const api = @import("mmc-api"); -const zignet = @import("zignet"); const Kind = enum { all, axis, driver }; -pub fn add(_: std.Io, params: [][]const u8) !void { +pub fn add(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "add_log"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; // Parsing line name const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -56,8 +55,8 @@ pub fn add(_: std.Io, params: [][]const u8) !void { // the only thing that can be done from this point is to always show the // logging configuration even if there is an error when trying to toggle // the driver flag for logging. - defer client.log_config.status() catch {}; - try modify(line, kind, range, true); + defer client.log_config.status(io) catch {}; + try modify(io, net, line, kind, range, true); } pub fn start(io: std.Io, params: [][]const u8) !void { @@ -113,10 +112,10 @@ pub fn status(io: std.Io, _: [][]const u8) !void { try client.log_config.status(io); } -pub fn remove(_: std.Io, params: [][]const u8) !void { +pub fn remove(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "remove_log"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; // Parsing line name const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -161,8 +160,8 @@ pub fn remove(_: std.Io, params: [][]const u8) !void { // the only thing that can be shown from this point is to always show the // logging configuration even if there is an error when trying to toggle // the driver flag for logging. - defer client.log_config.status() catch {}; - try modify(line, kind, range, false); + defer client.log_config.status(io) catch {}; + try modify(io, net, line, kind, range, false); } pub fn stop(_: std.Io, _: [][]const u8) !void { @@ -184,11 +183,17 @@ pub fn cancel(_: std.Io, _: [][]const u8) !void { } fn modify( + io: std.Io, + net: std.Io.net.Stream, line: client.Line, kind: Kind, range: client.log.Range, flag: bool, ) !void { + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); for (range.start..range.end + 1) |axis_id| { if (kind == .all or kind == .axis) client.log_config.lines[line.index].axes[axis_id - 1] = flag; @@ -214,19 +219,19 @@ fn modify( }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -235,7 +240,7 @@ fn modify( if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/move.zig b/src/modules/mmc_client/commands/move.zig index 3d4ca923..1adfa62d 100644 --- a/src/modules/mmc_client/commands/move.zig +++ b/src/modules/mmc_client/commands/move.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "move_carrier"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -63,12 +67,12 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } fn parseTarget( diff --git a/src/modules/mmc_client/commands/pause.zig b/src/modules/mmc_client/commands/pause.zig index 4048f4eb..5136a797 100644 --- a/src/modules/mmc_client/commands/pause.zig +++ b/src/modules/mmc_client/commands/pause.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "pause"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -26,10 +30,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/print_axis_info.zig b/src/modules/mmc_client/commands/print_axis_info.zig index a061f8b9..962b8eb3 100644 --- a/src/modules/mmc_client/commands/print_axis_info.zig +++ b/src/modules/mmc_client/commands/print_axis_info.zig @@ -7,7 +7,11 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_axis_info"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: client.Filter = try .parse(params[1]); const line_idx = try client.matchLine(line_name); @@ -27,19 +31,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -48,7 +52,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -71,8 +75,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const axis_errors = track.axis_errors; if (axis_state.items.len != axis_errors.items.len) return error.InvalidResponse; - var writer_buf: [4096]u8 = undefined; - var stdout = std.Io.File.stdout().writer(io, &writer_buf); + var stdout = std.Io.File.stdout().writer(io, &.{}); const writer = &stdout.interface; for (axis_state.items, axis_errors.items) |info, err| { _ = try client.nestedWrite( diff --git a/src/modules/mmc_client/commands/print_carrier_info.zig b/src/modules/mmc_client/commands/print_carrier_info.zig index 727bfbe8..2bdaf0a6 100644 --- a/src/modules/mmc_client/commands/print_carrier_info.zig +++ b/src/modules/mmc_client/commands/print_carrier_info.zig @@ -7,7 +7,11 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_carrier_info"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: ?client.Filter = if (params[1].len > 0) try .parse(params[1]) @@ -30,19 +34,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -51,7 +55,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -72,8 +76,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (track.line != line.id) return error.InvalidResponse; const carriers = track.carrier_state; if (carriers.items.len == 0) return error.CarrierNotFound; - var writer_buf: [4096]u8 = undefined; - var stdout = std.Io.File.stdout().writer(io, &writer_buf); + var stdout = std.Io.File.stdout().writer(io, &.{}); const writer = &stdout.interface; for (carriers.items) |carrier| { _ = try client.nestedWrite("Carrier state", carrier, 0, writer); diff --git a/src/modules/mmc_client/commands/print_driver_info.zig b/src/modules/mmc_client/commands/print_driver_info.zig index d578c7d9..8ce32125 100644 --- a/src/modules/mmc_client/commands/print_driver_info.zig +++ b/src/modules/mmc_client/commands/print_driver_info.zig @@ -7,7 +7,11 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_driver_info"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: client.Filter = try .parse(params[1]); const line_idx = try client.matchLine(line_name); @@ -27,19 +31,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -48,7 +52,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/pull.zig b/src/modules/mmc_client/commands/pull.zig index df99562f..435e096a 100644 --- a/src/modules/mmc_client/commands/pull.zig +++ b/src/modules/mmc_client/commands/pull.zig @@ -4,8 +4,12 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { - if (client.sock == null) return error.ServerNotConnected; +pub fn impl(io: std.Io, params: [][]const u8) !void { + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -98,10 +102,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/push.zig b/src/modules/mmc_client/commands/push.zig index 7c9ab447..21aa5b89 100644 --- a/src/modules/mmc_client/commands/push.zig +++ b/src/modules/mmc_client/commands/push.zig @@ -4,8 +4,12 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { - if (client.sock == null) return error.ServerNotConnected; +pub fn impl(io: std.Io, params: [][]const u8) !void { + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -79,19 +83,19 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -100,7 +104,7 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -161,12 +165,12 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } // Push command request { @@ -191,11 +195,11 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } } diff --git a/src/modules/mmc_client/commands/release_carrier.zig b/src/modules/mmc_client/commands/release_carrier.zig index 24e857e9..709c1710 100644 --- a/src/modules/mmc_client/commands/release_carrier.zig +++ b/src/modules/mmc_client/commands/release_carrier.zig @@ -5,11 +5,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "release_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -40,10 +44,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/reset_system.zig b/src/modules/mmc_client/commands/reset_system.zig index 58288e0d..93dc91ae 100644 --- a/src/modules/mmc_client/commands/reset_system.zig +++ b/src/modules/mmc_client/commands/reset_system.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, _: [][]const u8) !void { +pub fn impl(io: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "reset_system"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); for (client.lines) |line| { // Send deinitialize command { @@ -22,12 +26,12 @@ pub fn impl(_: std.Io, _: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } // Send clear errors command { @@ -41,12 +45,12 @@ pub fn impl(_: std.Io, _: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } // Send stop push command { @@ -60,12 +64,12 @@ pub fn impl(_: std.Io, _: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } // Send stop pull command { @@ -79,12 +83,12 @@ pub fn impl(_: std.Io, _: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } } } diff --git a/src/modules/mmc_client/commands/resume.zig b/src/modules/mmc_client/commands/resume.zig index fbe84e17..2f421ce7 100644 --- a/src/modules/mmc_client/commands/resume.zig +++ b/src/modules/mmc_client/commands/resume.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "resume"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -26,10 +30,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/server_version.zig b/src/modules/mmc_client/commands/server_version.zig index 989f273c..8382e9fd 100644 --- a/src/modules/mmc_client/commands/server_version.zig +++ b/src/modules/mmc_client/commands/server_version.zig @@ -4,29 +4,33 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, _: [][]const u8) !void { +pub fn impl(io: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "server_version"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const request: api.protobuf.mmc.Request = .{ .body = .{ .core = .{ .kind = .CORE_REQUEST_KIND_SERVER_INFO }, }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -35,7 +39,7 @@ pub fn impl(_: std.Io, _: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/set_carrier_id.zig b/src/modules/mmc_client/commands/set_carrier_id.zig index 04faf8ec..640ea058 100644 --- a/src/modules/mmc_client/commands/set_carrier_id.zig +++ b/src/modules/mmc_client/commands/set_carrier_id.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_carrier_id"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -53,10 +57,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/set_line_zero.zig b/src/modules/mmc_client/commands/set_line_zero.zig index 334d505a..4c84ea9b 100644 --- a/src/modules/mmc_client/commands/set_line_zero.zig +++ b/src/modules/mmc_client/commands/set_line_zero.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_line_zero"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -22,10 +26,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/show_errors.zig b/src/modules/mmc_client/commands/show_errors.zig index a188f084..1d0367a5 100644 --- a/src/modules/mmc_client/commands/show_errors.zig +++ b/src/modules/mmc_client/commands/show_errors.zig @@ -7,7 +7,11 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "show_errors"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -33,19 +37,19 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -54,7 +58,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -75,8 +79,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { if (track.line != line.id) return error.InvalidResponse; const axis_errors = track.axis_errors; const driver_errors = track.driver_errors; - var writer_buf: [4096]u8 = undefined; - var stdout = std.Io.File.stdout().writer(io, &writer_buf); + var stdout = std.Io.File.stdout().writer(io, &.{}); const writer = &stdout.interface; for (axis_errors.items) |err| { const ti = @typeInfo(@TypeOf(err)).@"struct"; diff --git a/src/modules/mmc_client/commands/stop.zig b/src/modules/mmc_client/commands/stop.zig index b8bfa939..55df08a7 100644 --- a/src/modules/mmc_client/commands/stop.zig +++ b/src/modules/mmc_client/commands/stop.zig @@ -4,10 +4,14 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop"); defer tracy_zone.end(); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -26,10 +30,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/stop_pull.zig b/src/modules/mmc_client/commands/stop_pull.zig index 83386151..1e33af62 100644 --- a/src/modules/mmc_client/commands/stop_pull.zig +++ b/src/modules/mmc_client/commands/stop_pull.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop_pull"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -42,10 +46,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/stop_push.zig b/src/modules/mmc_client/commands/stop_push.zig index 2a074107..887fc2ff 100644 --- a/src/modules/mmc_client/commands/stop_push.zig +++ b/src/modules/mmc_client/commands/stop_push.zig @@ -4,11 +4,15 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn impl(_: std.Io, params: [][]const u8) !void { +pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop_push"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -42,10 +46,10 @@ pub fn impl(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); - try client.waitCommandReceived(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); + try client.waitCommandReceived(io); } diff --git a/src/modules/mmc_client/commands/wait.zig b/src/modules/mmc_client/commands/wait.zig index 6bec5660..3b4565f8 100644 --- a/src/modules/mmc_client/commands/wait.zig +++ b/src/modules/mmc_client/commands/wait.zig @@ -4,7 +4,7 @@ const command = @import("../../../command.zig"); const tracy = @import("tracy"); const api = @import("mmc-api"); -pub fn isolate(_: std.Io, params: [][]const u8) !void { +pub fn isolate(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_isolate"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); @@ -30,6 +30,7 @@ pub fn isolate(_: std.Io, params: [][]const u8) !void { const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; try waitCarrierState( + io, line.id, carrier_id, .CARRIER_STATE_INITIALIZE_COMPLETED, @@ -37,7 +38,7 @@ pub fn isolate(_: std.Io, params: [][]const u8) !void { ); } -pub fn moveCarrier(_: std.Io, params: [][]const u8) !void { +pub fn moveCarrier(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_move_carrier"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); @@ -64,6 +65,7 @@ pub fn moveCarrier(_: std.Io, params: [][]const u8) !void { const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; try waitCarrierState( + io, line.id, carrier_id, .CARRIER_STATE_MOVE_COMPLETED, @@ -71,11 +73,15 @@ pub fn moveCarrier(_: std.Io, params: [][]const u8) !void { ); } -pub fn axisEmpty(_: std.Io, params: [][]const u8) !void { +pub fn axisEmpty(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "wait_axis_empty"); defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -121,19 +127,19 @@ pub fn axisEmpty(_: std.Io, params: [][]const u8) !void { }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -142,7 +148,7 @@ pub fn axisEmpty(_: std.Io, params: [][]const u8) !void { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); @@ -174,12 +180,17 @@ pub fn axisEmpty(_: std.Io, params: [][]const u8) !void { } fn waitCarrierState( + io: std.Io, line: u32, id: std.math.IntFittingRange(1, 1023), state: api.protobuf.mmc.info.Response.Track.Carrier.State.State, timeout: u64, ) !void { - if (client.sock == null) return error.ServerNotConnected; + const net = client.stream orelse return error.ServerNotConnected; + var reader_buf: [4096]u8 = undefined; + var writer_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + var net_writer = net.writer(io, &writer_buf); var ids = [1]u32{id}; var wait_timer = try std.time.Timer.start(); while (true) { @@ -202,19 +213,19 @@ fn waitCarrierState( }, }; // Clear all buffer in reader and writer for safety. - _ = client.reader.interface.discardRemaining() catch {}; - _ = client.writer.interface.consumeAll(); + _ = net_reader.interface.discardRemaining() catch {}; + _ = net_writer.interface.consumeAll(); // Send message - try request.encode(&client.writer.interface, client.allocator); - try client.writer.interface.flush(); + try request.encode(&net_writer.interface, client.allocator); + try net_writer.interface.flush(); // Receive response while (true) { try command.checkCommandInterrupt(); - const byte = client.reader.interface.peekByte() catch |e| { + const byte = net_reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return switch (client.reader.error_state orelse error.Unexpected) { + return switch (net_reader.err orelse error.Unexpected) { else => |err| err, }; }, @@ -223,7 +234,7 @@ fn waitCarrierState( if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &client.reader.interface, + &net_reader.interface, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index a39c3cdc..e18fa2e8 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -2,7 +2,6 @@ const log = @This(); const std = @import("std"); const api = @import("mmc-api"); -const zignet = @import("zignet"); const client = @import("../mmc_client.zig"); const command = @import("../../command.zig"); @@ -185,9 +184,7 @@ const Stream = struct { count: usize, /// Optimized logging configuration for requesting data. config: Stream.Config, - socket: zignet.Socket, - reader: zignet.Socket.Reader, - writer: zignet.Socket.Writer, + socket: std.Io.net.Stream, /// Store one iteration of data. const Data = struct { @@ -269,7 +266,7 @@ const Stream = struct { logging_size: usize, config: log.Config, lines: []client.Line, - endpoint: zignet.Endpoint, + endpoint: std.Io.net.IpAddress, ) !Stream { var stream: Stream = undefined; stream.data = try allocator.alloc(Stream.Data, logging_size); @@ -305,14 +302,10 @@ const Stream = struct { } stream.head = 0; stream.count = 0; - stream.socket = try zignet.Socket.connect( - endpoint, - &command.checkCommandInterrupt, - 3000, - ); - errdefer stream.socket.close(); - stream.reader = stream.socket.reader(io, &stream_writer_buf); - stream.writer = stream.socket.writer(&stream_reader_buf); + stream.socket = try endpoint.connect(io, .{ .mode = .stream }); + errdefer stream.socket.close(io); + var reader = stream.socket.reader(io, &stream_writer_buf); + var writer = stream.socket.writer(io, &stream_reader_buf); stream.config.lines = .empty; errdefer stream.config.lines.deinit(allocator); for (config.lines) |line| { @@ -348,19 +341,19 @@ const Stream = struct { }, }; // Clear all buffer in reader and writer for safety. - _ = try stream.reader.interface.discardRemaining(); - _ = stream.writer.interface.consumeAll(); + _ = try reader.interface.discardRemaining(); + _ = writer.interface.consumeAll(); // Send message - try request.encode(&stream.writer.interface, allocator); - try stream.writer.interface.flush(); + try request.encode(&writer.interface, allocator); + try writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = stream.reader.interface.peekByte() catch |e| { + const byte = reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return stream.reader.error_state orelse + return reader.err orelse error.Unexpected; }, } @@ -368,7 +361,7 @@ const Stream = struct { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &stream.reader.interface, + &reader.interface, allocator, ); defer decoded.deinit(allocator); @@ -436,7 +429,7 @@ const Stream = struct { return stream; } - fn deinit(stream: *Stream, allocator: std.mem.Allocator) void { + fn deinit(stream: *Stream, allocator: std.mem.Allocator, io: std.Io) void { for (stream.data) |*data| { for (data.lines) |*line| { allocator.free(line.axes); @@ -446,15 +439,18 @@ const Stream = struct { } allocator.free(stream.data); stream.config.lines.deinit(allocator); - stream.socket.close(); + stream.socket.close(io); } /// Get the data from the server based on the stream config. fn get( stream: *Stream, allocator: std.mem.Allocator, + io: std.Io, timestamp: f64, ) !void { + var reader = stream.socket.reader(io, &stream_writer_buf); + var writer = stream.socket.writer(io, &stream_reader_buf); const tail = (stream.head + stream.count) % stream.data.len; if (stream.count == stream.data.len) stream.head = (stream.head + 1) % stream.data.len @@ -492,19 +488,19 @@ const Stream = struct { }, }; // Clear all buffer in reader and writer for safety. - _ = try stream.reader.interface.discardRemaining(); - _ = stream.writer.interface.consumeAll(); + _ = try reader.interface.discardRemaining(); + _ = writer.interface.consumeAll(); // Send message - try request.encode(&stream.writer.interface, allocator); - try stream.writer.interface.flush(); + try request.encode(&writer.interface, allocator); + try writer.interface.flush(); // Receive message while (true) { try command.checkCommandInterrupt(); - const byte = stream.reader.interface.peekByte() catch |e| { + const byte = reader.interface.peekByte() catch |e| { switch (e) { std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { - return stream.reader.error_state orelse + return reader.err orelse error.Unexpected; }, } @@ -512,7 +508,7 @@ const Stream = struct { if (byte > 0) break; } var decoded: api.protobuf.mmc.Response = try .decode( - &stream.reader.interface, + &reader.interface, allocator, ); defer decoded.deinit(allocator); @@ -643,26 +639,28 @@ pub fn runner(io: std.Io, duration: f64, file_path: []const u8) !void { executing.store(true, .monotonic); defer executing.store(false, .monotonic); // Stream setup. - if (client.sock == null) return error.SocketNotConnected; + const net = client.stream orelse return error.ServerNotConnected; var stream: Stream = try .init( client.allocator, + io, @as(usize, @intFromFloat(logging_size_float)), client.log_config, client.lines, - client.endpoint orelse return error.MissingEndpoint, + net.socket.address, ); - defer stream.deinit(client.allocator); + defer stream.deinit(client.allocator, io); // Logging file setup. const log_file = try std.Io.Dir.cwd().createFile(io, file_path, .{}); defer { - log_file.close(); + log_file.close(io); if (cancel.load(.monotonic)) std.Io.Dir.cwd().deleteFile(io, file_path) catch {}; } std.log.info("The registers will be logged to {s}.", .{file_path}); - const log_time_start = std.time.microTimestamp(); - var timer = try std.time.Timer.start(); - var timestamp: f64 = 0; + // Used for logging timestamp/ + var log_time: std.time.Timer = try .start(); + // Act as delay to wait until the update rate. + var log_rate: std.time.Timer = try .start(); // Reset the stop and cancel bit before starting to log. stop.store(false, .monotonic); cancel.store(false, .monotonic); @@ -671,22 +669,22 @@ pub fn runner(io: std.Io, duration: f64, file_path: []const u8) !void { std.log.info("Logging is cancelled.", .{}); return; } - timestamp = @as( - f64, - @floatFromInt(std.time.microTimestamp() - log_time_start), - ) / std.time.us_per_s; - stream.get(client.allocator, timestamp) catch |e| { + const timestamp: f64 = + @as(f64, @floatFromInt(log_time.read())) / std.time.ns_per_s; + stream.get(client.allocator, io, timestamp) catch |e| { std.log.err("{t}", .{e}); - std.log.debug("{?f}", .{@errorReturnTrace()}); + if (@errorReturnTrace()) |stack_trace| { + std.debug.dumpStackTrace(stack_trace); + } break; }; // Wait to match the update rate. - while (timer.read() < update_rate * std.time.ns_per_ms) {} - timer.reset(); + while (log_rate.read() < update_rate * std.time.ns_per_ms) {} + log_rate.reset(); } std.log.info("Logging is stopped.", .{}); stop.store(false, .monotonic); - var log_writer = log_file.writer(&.{}); + var log_writer = log_file.writer(io, &.{}); // Write the headers of the data to the logging file. try log_writer.interface.print("timestamp,", .{}); for (client.log_config.lines) |line_config| { @@ -719,11 +717,13 @@ pub fn runner(io: std.Io, duration: f64, file_path: []const u8) !void { } } // Write the data to the logging file. + const final_timestamp = stream.data[stream.data.len - 1].timestamp; while (stream.count != 0) { const log_data = stream.data[stream.head]; stream.head = (stream.head + 1) % stream.data.len; stream.count -= 1; - if (timestamp - log_data.timestamp > duration) continue; + // Only write data for the last specified duration. + if (final_timestamp - log_data.timestamp > duration) continue; try log_writer.interface.writeByte('\n'); try log_writer.interface.print("{},", .{log_data.timestamp}); for (client.log_config.lines) |line_config| { From c18eba3823c633ee264ad5573d4a2f2c10922482 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 08:43:17 +0900 Subject: [PATCH 05/12] refactor: Use minimal init --- src/command.zig | 3 ++- src/main.zig | 28 +++++++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/command.zig b/src/command.zig index 6bafb0fd..bbbae096 100644 --- a/src/command.zig +++ b/src/command.zig @@ -890,7 +890,8 @@ fn deinitModules() void { fn loadConfig(io: std.Io, params: [][]const u8) !void { // De-initialize any previously initialized modules. deinitModules(); - const environ_map = main.environ_map; + var environ_map = try main.environ.createMap(allocator); + defer environ_map.deinit(); // Load config file. const config_file = if (params[0].len > 0) std.Io.Dir.cwd().openFile(io, params[0], .{}) catch diff --git a/src/main.zig b/src/main.zig index 64015423..883f1723 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6,9 +6,8 @@ const mmc_io = @import("io.zig"); const command = @import("command.zig"); const Prompt = @import("Prompt.zig"); -// Environment variables to be used through the program, mainly locating -// configuration files. -pub var environ_map: *std.process.Environ.Map = undefined; +// Environment variables to be used through the program. +pub var environ: std.process.Environ = undefined; pub const std_options: std.Options = .{ .logFn = command.logFn, @@ -32,15 +31,30 @@ fn stopCommandLinux(_: std.os.linux.SIG) callconv(.c) void { command.stop.store(true, .monotonic); } -pub fn main(init: std.process.Init) !void { - environ_map = init.environ_map; +pub fn main(init: std.process.Init.Minimal) !void { + var debug_allocator: std.heap.DebugAllocator(.{}) = .init; + defer switch (debug_allocator.deinit()) { + .leak => std.log.err("leak is detected", .{}), + .ok => {}, + }; + // This allocator is used in all threads. Both debug allocator and + // smp_allocator is safe to use in multi-thread. + const gpa = if (builtin.mode == .Debug) + debug_allocator.allocator() + else + std.heap.smp_allocator; + var threaded: std.Io.Threaded = .init(gpa, .{ .environ = init.environ }); + defer threaded.deinit(); + const io = threaded.io(); + environ = init.environ; + try mmc_io.init(); defer mmc_io.deinit(); var prompter = try std.Thread.spawn( .{}, Prompt.handler, - .{ &prompt, init.io }, + .{ &prompt, io }, ); prompter.detach(); defer prompt.close.store(true, .monotonic); @@ -96,7 +110,7 @@ pub fn main(init: std.process.Init) !void { prompt.disable.store(true, .monotonic); } - command.execute(init.io) catch |e| { + command.execute(io) catch |e| { std.log.err("{t}", .{e}); if (@errorReturnTrace()) |stack_trace| { std.debug.dumpStackTrace(stack_trace); From 08adceab1c7b0e99bf78b9c8cc5eae7ec3049a6f Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 09:09:52 +0900 Subject: [PATCH 06/12] refactor: Workaround zig protobuf decode --- src/modules/mmc_client.zig | 21 ++++++++--------- .../mmc_client/commands/assert_hall.zig | 6 ++--- .../mmc_client/commands/assert_location.zig | 6 ++--- .../mmc_client/commands/auto_initialize.zig | 5 ---- .../mmc_client/commands/axis_carrier.zig | 6 ++--- src/modules/mmc_client/commands/calibrate.zig | 5 ---- .../mmc_client/commands/carrier_axis.zig | 6 ++--- .../mmc_client/commands/carrier_id.zig | 6 ++--- .../mmc_client/commands/carrier_location.zig | 6 ++--- .../commands/clear_carrier_info.zig | 5 ---- .../mmc_client/commands/clear_errors.zig | 5 ---- src/modules/mmc_client/commands/connect.zig | 23 ++++++++----------- .../mmc_client/commands/hall_status.zig | 6 ++--- src/modules/mmc_client/commands/isolate.zig | 5 ---- src/modules/mmc_client/commands/log.zig | 7 +++--- src/modules/mmc_client/commands/move.zig | 5 ---- src/modules/mmc_client/commands/pause.zig | 5 ---- .../mmc_client/commands/print_axis_info.zig | 6 ++--- .../commands/print_carrier_info.zig | 6 ++--- .../mmc_client/commands/print_driver_info.zig | 6 ++--- src/modules/mmc_client/commands/pull.zig | 5 ---- src/modules/mmc_client/commands/push.zig | 13 +++-------- .../mmc_client/commands/release_carrier.zig | 5 ---- .../mmc_client/commands/reset_system.zig | 14 ----------- src/modules/mmc_client/commands/resume.zig | 5 ---- .../mmc_client/commands/server_version.zig | 6 ++--- .../mmc_client/commands/set_carrier_id.zig | 5 ---- .../mmc_client/commands/set_line_zero.zig | 5 ---- .../mmc_client/commands/show_errors.zig | 6 ++--- src/modules/mmc_client/commands/stop.zig | 5 ---- src/modules/mmc_client/commands/stop_pull.zig | 5 ---- src/modules/mmc_client/commands/stop_push.zig | 5 ---- src/modules/mmc_client/commands/wait.zig | 12 ++++------ src/modules/mmc_client/log.zig | 13 ++++------- 34 files changed, 59 insertions(+), 191 deletions(-) diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index b042b5cb..8a706946 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -1790,8 +1790,10 @@ pub fn waitCommandReceived(io: std.Io) !void { }; if (byte > 0) break; } - const decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); + var decoded: api.protobuf.mmc.Response = try .decode( + &proto_reader, allocator, ); break :b switch (decoded.body orelse return error.InvalidResponse) { @@ -1820,9 +1822,6 @@ pub fn waitCommandReceived(io: std.Io) !void { }, }, }; - // Clear all buffer in net_reader and net_writer for safety. - _ = try net_reader.interface.discardRemaining(); - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, allocator); try net_writer.interface.flush(); @@ -1839,8 +1838,10 @@ pub fn waitCommandReceived(io: std.Io) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, allocator, ); defer decoded.deinit(allocator); @@ -1897,9 +1898,6 @@ fn removeCommand(io: std.Io, id: u32) !void { }, }, }; - // Clear all buffer in net_reader and net_writer for safety. - _ = try net_reader.interface.discardRemaining(); - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, allocator); try net_writer.interface.flush(); @@ -1916,8 +1914,9 @@ fn removeCommand(io: std.Io, id: u32) !void { }; if (byte > 0) break; } - const decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); + var decoded: api.protobuf.mmc.Response = try .decode( + &proto_reader, allocator, ); const removed_id = switch (decoded.body orelse diff --git a/src/modules/mmc_client/commands/assert_hall.zig b/src/modules/mmc_client/commands/assert_hall.zig index feddcada..80b5f39d 100644 --- a/src/modules/mmc_client/commands/assert_hall.zig +++ b/src/modules/mmc_client/commands/assert_hall.zig @@ -66,9 +66,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -101,8 +98,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/assert_location.zig b/src/modules/mmc_client/commands/assert_location.zig index 55c9d762..79b32565 100644 --- a/src/modules/mmc_client/commands/assert_location.zig +++ b/src/modules/mmc_client/commands/assert_location.zig @@ -52,9 +52,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -73,8 +70,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/auto_initialize.zig b/src/modules/mmc_client/commands/auto_initialize.zig index f9c7ab7c..1387fc86 100644 --- a/src/modules/mmc_client/commands/auto_initialize.zig +++ b/src/modules/mmc_client/commands/auto_initialize.zig @@ -10,9 +10,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); var init_lines: std.ArrayList( api.protobuf.mmc.command.Request.AutoInitialize.Line, @@ -44,9 +42,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/axis_carrier.zig b/src/modules/mmc_client/commands/axis_carrier.zig index f44432f7..7a5d4be5 100644 --- a/src/modules/mmc_client/commands/axis_carrier.zig +++ b/src/modules/mmc_client/commands/axis_carrier.zig @@ -48,9 +48,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -69,8 +66,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/calibrate.zig b/src/modules/mmc_client/commands/calibrate.zig index fdeed18c..4164411e 100644 --- a/src/modules/mmc_client/commands/calibrate.zig +++ b/src/modules/mmc_client/commands/calibrate.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); @@ -25,9 +23,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/carrier_axis.zig b/src/modules/mmc_client/commands/carrier_axis.zig index 89d9e048..c6126146 100644 --- a/src/modules/mmc_client/commands/carrier_axis.zig +++ b/src/modules/mmc_client/commands/carrier_axis.zig @@ -44,9 +44,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -65,8 +62,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/carrier_id.zig b/src/modules/mmc_client/commands/carrier_id.zig index eed173be..cd6a7c85 100644 --- a/src/modules/mmc_client/commands/carrier_id.zig +++ b/src/modules/mmc_client/commands/carrier_id.zig @@ -63,9 +63,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -84,8 +81,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/carrier_location.zig b/src/modules/mmc_client/commands/carrier_location.zig index 75098afe..3034257c 100644 --- a/src/modules/mmc_client/commands/carrier_location.zig +++ b/src/modules/mmc_client/commands/carrier_location.zig @@ -51,9 +51,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -72,8 +69,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/clear_carrier_info.zig b/src/modules/mmc_client/commands/clear_carrier_info.zig index 5237ce35..7feef72d 100644 --- a/src/modules/mmc_client/commands/clear_carrier_info.zig +++ b/src/modules/mmc_client/commands/clear_carrier_info.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); @@ -42,9 +40,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/clear_errors.zig b/src/modules/mmc_client/commands/clear_errors.zig index 0ecc2876..5cc3b931 100644 --- a/src/modules/mmc_client/commands/clear_errors.zig +++ b/src/modules/mmc_client/commands/clear_errors.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); @@ -42,9 +40,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index 813b3377..0dea054b 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -107,9 +107,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_API_VERSION }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -128,8 +125,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } - const decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); + var decoded: api.protobuf.mmc.Response = try .decode( + &proto_reader, client.allocator, ); const server_api_version = switch (decoded.body orelse @@ -169,9 +168,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_TRACK_CONFIG }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -190,8 +186,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); @@ -233,9 +231,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_SERVER_INFO }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -254,8 +249,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/hall_status.zig b/src/modules/mmc_client/commands/hall_status.zig index 92be5f7c..22d4a5bd 100644 --- a/src/modules/mmc_client/commands/hall_status.zig +++ b/src/modules/mmc_client/commands/hall_status.zig @@ -35,9 +35,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -56,8 +53,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/isolate.zig b/src/modules/mmc_client/commands/isolate.zig index c07b3229..5f10fc0f 100644 --- a/src/modules/mmc_client/commands/isolate.zig +++ b/src/modules/mmc_client/commands/isolate.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { @@ -84,9 +82,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/log.zig b/src/modules/mmc_client/commands/log.zig index 13132016..652dc915 100644 --- a/src/modules/mmc_client/commands/log.zig +++ b/src/modules/mmc_client/commands/log.zig @@ -218,9 +218,6 @@ fn modify( }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -239,8 +236,10 @@ fn modify( }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/move.zig b/src/modules/mmc_client/commands/move.zig index 1adfa62d..8f2d84b4 100644 --- a/src/modules/mmc_client/commands/move.zig +++ b/src/modules/mmc_client/commands/move.zig @@ -8,9 +8,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "move_carrier"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -66,9 +64,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/pause.zig b/src/modules/mmc_client/commands/pause.zig index 5136a797..ae747980 100644 --- a/src/modules/mmc_client/commands/pause.zig +++ b/src/modules/mmc_client/commands/pause.zig @@ -8,9 +8,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "pause"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { @@ -29,9 +27,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/print_axis_info.zig b/src/modules/mmc_client/commands/print_axis_info.zig index 962b8eb3..313b5bd2 100644 --- a/src/modules/mmc_client/commands/print_axis_info.zig +++ b/src/modules/mmc_client/commands/print_axis_info.zig @@ -30,9 +30,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -51,8 +48,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/print_carrier_info.zig b/src/modules/mmc_client/commands/print_carrier_info.zig index 2bdaf0a6..fcddc597 100644 --- a/src/modules/mmc_client/commands/print_carrier_info.zig +++ b/src/modules/mmc_client/commands/print_carrier_info.zig @@ -33,9 +33,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -54,8 +51,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/print_driver_info.zig b/src/modules/mmc_client/commands/print_driver_info.zig index 8ce32125..ebdbf062 100644 --- a/src/modules/mmc_client/commands/print_driver_info.zig +++ b/src/modules/mmc_client/commands/print_driver_info.zig @@ -30,9 +30,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -51,8 +48,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/pull.zig b/src/modules/mmc_client/commands/pull.zig index 435e096a..53bd5c54 100644 --- a/src/modules/mmc_client/commands/pull.zig +++ b/src/modules/mmc_client/commands/pull.zig @@ -6,9 +6,7 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { @@ -101,9 +99,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/push.zig b/src/modules/mmc_client/commands/push.zig index 21aa5b89..52221074 100644 --- a/src/modules/mmc_client/commands/push.zig +++ b/src/modules/mmc_client/commands/push.zig @@ -82,9 +82,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -103,8 +100,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); @@ -164,9 +163,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -194,9 +190,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/release_carrier.zig b/src/modules/mmc_client/commands/release_carrier.zig index 709c1710..21d07379 100644 --- a/src/modules/mmc_client/commands/release_carrier.zig +++ b/src/modules/mmc_client/commands/release_carrier.zig @@ -10,9 +10,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); @@ -43,9 +41,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/reset_system.zig b/src/modules/mmc_client/commands/reset_system.zig index 93dc91ae..aaba20b6 100644 --- a/src/modules/mmc_client/commands/reset_system.zig +++ b/src/modules/mmc_client/commands/reset_system.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); for (client.lines) |line| { // Send deinitialize command @@ -25,9 +23,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -44,9 +39,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -63,9 +55,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -82,9 +71,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/resume.zig b/src/modules/mmc_client/commands/resume.zig index 2f421ce7..262fb422 100644 --- a/src/modules/mmc_client/commands/resume.zig +++ b/src/modules/mmc_client/commands/resume.zig @@ -8,9 +8,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "resume"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { @@ -29,9 +27,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/server_version.zig b/src/modules/mmc_client/commands/server_version.zig index 8382e9fd..3abf309e 100644 --- a/src/modules/mmc_client/commands/server_version.zig +++ b/src/modules/mmc_client/commands/server_version.zig @@ -17,9 +17,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_SERVER_INFO }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -38,8 +35,9 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/set_carrier_id.zig b/src/modules/mmc_client/commands/set_carrier_id.zig index 640ea058..7602eb1d 100644 --- a/src/modules/mmc_client/commands/set_carrier_id.zig +++ b/src/modules/mmc_client/commands/set_carrier_id.zig @@ -8,9 +8,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_carrier_id"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -56,9 +54,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/set_line_zero.zig b/src/modules/mmc_client/commands/set_line_zero.zig index 4c84ea9b..60a49e82 100644 --- a/src/modules/mmc_client/commands/set_line_zero.zig +++ b/src/modules/mmc_client/commands/set_line_zero.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); @@ -25,9 +23,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/show_errors.zig b/src/modules/mmc_client/commands/show_errors.zig index 1d0367a5..f8f9b809 100644 --- a/src/modules/mmc_client/commands/show_errors.zig +++ b/src/modules/mmc_client/commands/show_errors.zig @@ -36,9 +36,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -57,8 +54,9 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/commands/stop.zig b/src/modules/mmc_client/commands/stop.zig index 55df08a7..79973639 100644 --- a/src/modules/mmc_client/commands/stop.zig +++ b/src/modules/mmc_client/commands/stop.zig @@ -8,9 +8,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { @@ -29,9 +27,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/stop_pull.zig b/src/modules/mmc_client/commands/stop_pull.zig index 1e33af62..ea0507f7 100644 --- a/src/modules/mmc_client/commands/stop_pull.zig +++ b/src/modules/mmc_client/commands/stop_pull.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -45,9 +43,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/stop_push.zig b/src/modules/mmc_client/commands/stop_push.zig index 887fc2ff..2bdc059c 100644 --- a/src/modules/mmc_client/commands/stop_push.zig +++ b/src/modules/mmc_client/commands/stop_push.zig @@ -9,9 +9,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); @@ -45,9 +43,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); diff --git a/src/modules/mmc_client/commands/wait.zig b/src/modules/mmc_client/commands/wait.zig index 3b4565f8..4c68f135 100644 --- a/src/modules/mmc_client/commands/wait.zig +++ b/src/modules/mmc_client/commands/wait.zig @@ -126,9 +126,6 @@ pub fn axisEmpty(io: std.Io, params: [][]const u8) !void { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -147,8 +144,9 @@ pub fn axisEmpty(io: std.Io, params: [][]const u8) !void { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); @@ -212,9 +210,6 @@ fn waitCarrierState( }, }, }; - // Clear all buffer in reader and writer for safety. - _ = net_reader.interface.discardRemaining() catch {}; - _ = net_writer.interface.consumeAll(); // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); @@ -233,8 +228,9 @@ fn waitCarrierState( }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &net_reader.interface, + &proto_reader, client.allocator, ); defer decoded.deinit(client.allocator); diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index e18fa2e8..0e510de3 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -340,9 +340,6 @@ const Stream = struct { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = try reader.interface.discardRemaining(); - _ = writer.interface.consumeAll(); // Send message try request.encode(&writer.interface, allocator); try writer.interface.flush(); @@ -360,8 +357,10 @@ const Stream = struct { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = + .fixed(reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &reader.interface, + &proto_reader, allocator, ); defer decoded.deinit(allocator); @@ -487,9 +486,6 @@ const Stream = struct { }, }, }; - // Clear all buffer in reader and writer for safety. - _ = try reader.interface.discardRemaining(); - _ = writer.interface.consumeAll(); // Send message try request.encode(&writer.interface, allocator); try writer.interface.flush(); @@ -507,8 +503,9 @@ const Stream = struct { }; if (byte > 0) break; } + var proto_reader: std.Io.Reader = .fixed(reader.interface.buffered()); var decoded: api.protobuf.mmc.Response = try .decode( - &reader.interface, + &proto_reader, allocator, ); defer decoded.deinit(allocator); From 326bac65e78c3fdf976ee4334f102c2008b25048 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 11:29:31 +0900 Subject: [PATCH 07/12] refactor: `sendRequest()` `readResponse()` --- src/modules/mmc_client.zig | 109 ++++++++++-------- .../mmc_client/commands/assert_hall.zig | 47 +------- .../mmc_client/commands/assert_location.zig | 33 +----- .../mmc_client/commands/auto_initialize.zig | 8 +- .../mmc_client/commands/axis_carrier.zig | 33 +----- src/modules/mmc_client/commands/calibrate.zig | 8 +- .../mmc_client/commands/carrier_axis.zig | 33 +----- .../mmc_client/commands/carrier_id.zig | 33 +----- .../mmc_client/commands/carrier_location.zig | 33 +----- .../commands/clear_carrier_info.zig | 8 +- .../mmc_client/commands/clear_errors.zig | 8 +- src/modules/mmc_client/commands/connect.zig | 94 ++------------- .../mmc_client/commands/hall_status.zig | 33 +----- src/modules/mmc_client/commands/isolate.zig | 8 +- src/modules/mmc_client/commands/log.zig | 34 +----- src/modules/mmc_client/commands/move.zig | 8 +- src/modules/mmc_client/commands/pause.zig | 8 +- .../mmc_client/commands/print_axis_info.zig | 33 +----- .../commands/print_carrier_info.zig | 33 +----- .../mmc_client/commands/print_driver_info.zig | 33 +----- src/modules/mmc_client/commands/pull.zig | 8 +- src/modules/mmc_client/commands/push.zig | 46 ++------ .../mmc_client/commands/release_carrier.zig | 8 +- .../mmc_client/commands/reset_system.zig | 26 ++--- src/modules/mmc_client/commands/resume.zig | 8 +- .../mmc_client/commands/server_version.zig | 33 +----- .../mmc_client/commands/set_carrier_id.zig | 8 +- .../mmc_client/commands/set_line_zero.zig | 2 +- .../mmc_client/commands/show_errors.zig | 33 +----- src/modules/mmc_client/commands/stop.zig | 8 +- src/modules/mmc_client/commands/stop_pull.zig | 8 +- src/modules/mmc_client/commands/stop_push.zig | 8 +- src/modules/mmc_client/commands/wait.zig | 66 ++--------- src/modules/mmc_client/log.zig | 68 +++-------- 34 files changed, 192 insertions(+), 775 deletions(-) diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index 8a706946..0a489bec 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -1770,33 +1770,12 @@ pub fn matchLine(name: []const u8) !usize { /// Track a command until it executed completely followed by removing that /// command from the server. -pub fn waitCommandReceived(io: std.Io) !void { +pub fn waitCommandCompleted(io: std.Io) !void { const net = stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const command_id = b: { - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return net_reader.err orelse error.Unexpected; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - allocator, - ); - break :b switch (decoded.body orelse return error.InvalidResponse) { + var response = try readResponse(io, allocator, net); + defer response.deinit(allocator); + break :b switch (response.body orelse return error.InvalidResponse) { .request_error => |req_err| { return error_response.throwMmcError(req_err); }, @@ -1822,30 +1801,10 @@ pub fn waitCommandReceived(io: std.Io) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return net_reader.err orelse error.Unexpected; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - allocator, - ); - defer decoded.deinit(allocator); - var commands_resp = switch (decoded.body orelse + try sendRequest(io, allocator, net, request); + var response = try readResponse(io, allocator, net); + defer response.deinit(allocator); + var commands_resp = switch (response.body orelse return error.InvalidResponse) { .request_error => |req_err| { return error_response.throwMmcError(req_err); @@ -1915,11 +1874,11 @@ fn removeCommand(io: std.Io, id: u32) !void { if (byte > 0) break; } var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( + var response: api.protobuf.mmc.Response = try .decode( &proto_reader, allocator, ); - const removed_id = switch (decoded.body orelse + const removed_id = switch (response.body orelse return error.InvalidResponse) { .command => |command_resp| switch (command_resp.body orelse return error.InvalidResponse) { @@ -1937,6 +1896,54 @@ fn removeCommand(io: std.Io, id: u32) !void { std.log.debug("removed_id {}, id {}", .{ removed_id, id }); } +pub fn sendRequest( + io: std.Io, + gpa: std.mem.Allocator, + net: std.Io.net.Stream, + request: api.protobuf.mmc.Request, +) !void { + var writer_buf: [4096]u8 = undefined; + var net_writer = net.writer(io, &writer_buf); + try request.encode(&net_writer.interface, gpa); + try net_writer.interface.flush(); +} + +pub fn readResponse( + io: std.Io, + gpa: std.mem.Allocator, + net: std.Io.net.Stream, +) !api.protobuf.mmc.Response { + var reader_buf: [4096]u8 = undefined; + var net_reader = net.reader(io, &reader_buf); + while (true) { + // Read until the length is equal for consecutive peek. + try command.checkCommandInterrupt(); + const prev_buffered_len = net_reader.interface.bufferedLen(); + if (net_reader.interface.peekByte()) |_| { + if (prev_buffered_len == 0) continue; + if (net_reader.interface.bufferedLen() == prev_buffered_len) + break; + } else |e| { + switch (e) { + std.Io.Reader.Error.EndOfStream => { + std.log.err("{t}", .{e}); + continue; + }, + std.Io.Reader.Error.ReadFailed => { + return switch (net_reader.err orelse error.Unexpected) { + else => |err| err, + }; + }, + } + } + } + var proto_reader: std.Io.Reader = + .fixed(try net_reader.interface.take( + net_reader.interface.bufferedLen(), + )); + return try .decode(&proto_reader, gpa); +} + pub fn nestedWrite( name: []const u8, val: anytype, diff --git a/src/modules/mmc_client/commands/assert_hall.zig b/src/modules/mmc_client/commands/assert_hall.zig index 80b5f39d..aefabb3f 100644 --- a/src/modules/mmc_client/commands/assert_hall.zig +++ b/src/modules/mmc_client/commands/assert_hall.zig @@ -9,10 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -66,45 +62,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - var track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + var track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/assert_location.zig b/src/modules/mmc_client/commands/assert_location.zig index 79b32565..3c974ff3 100644 --- a/src/modules/mmc_client/commands/assert_location.zig +++ b/src/modules/mmc_client/commands/assert_location.zig @@ -9,10 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -52,31 +48,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/auto_initialize.zig b/src/modules/mmc_client/commands/auto_initialize.zig index 1387fc86..06efe83f 100644 --- a/src/modules/mmc_client/commands/auto_initialize.zig +++ b/src/modules/mmc_client/commands/auto_initialize.zig @@ -10,8 +10,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); var init_lines: std.ArrayList( api.protobuf.mmc.command.Request.AutoInitialize.Line, ) = .empty; @@ -42,8 +40,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/axis_carrier.zig b/src/modules/mmc_client/commands/axis_carrier.zig index 7a5d4be5..66e49020 100644 --- a/src/modules/mmc_client/commands/axis_carrier.zig +++ b/src/modules/mmc_client/commands/axis_carrier.zig @@ -9,10 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -48,31 +44,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/calibrate.zig b/src/modules/mmc_client/commands/calibrate.zig index 4164411e..5d2bbb06 100644 --- a/src/modules/mmc_client/commands/calibrate.zig +++ b/src/modules/mmc_client/commands/calibrate.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -23,8 +21,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/carrier_axis.zig b/src/modules/mmc_client/commands/carrier_axis.zig index c6126146..2cbd0006 100644 --- a/src/modules/mmc_client/commands/carrier_axis.zig +++ b/src/modules/mmc_client/commands/carrier_axis.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "carrier_axis"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -44,31 +40,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/carrier_id.zig b/src/modules/mmc_client/commands/carrier_id.zig index cd6a7c85..c939edeb 100644 --- a/src/modules/mmc_client/commands/carrier_id.zig +++ b/src/modules/mmc_client/commands/carrier_id.zig @@ -9,10 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); var line_name_iterator = std.mem.tokenizeSequence( u8, params[0], @@ -63,31 +59,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/carrier_location.zig b/src/modules/mmc_client/commands/carrier_location.zig index 3034257c..1822347b 100644 --- a/src/modules/mmc_client/commands/carrier_location.zig +++ b/src/modules/mmc_client/commands/carrier_location.zig @@ -12,10 +12,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var ids = [1]u32{try std.fmt.parseInt(u32, b: { const input = params[1]; @@ -51,31 +47,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/clear_carrier_info.zig b/src/modules/mmc_client/commands/clear_carrier_info.zig index 7feef72d..706aabe8 100644 --- a/src/modules/mmc_client/commands/clear_carrier_info.zig +++ b/src/modules/mmc_client/commands/clear_carrier_info.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -40,8 +38,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/clear_errors.zig b/src/modules/mmc_client/commands/clear_errors.zig index 5cc3b931..a6b896b7 100644 --- a/src/modules/mmc_client/commands/clear_errors.zig +++ b/src/modules/mmc_client/commands/clear_errors.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -40,8 +38,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index 0dea054b..bada18c6 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -86,11 +86,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }; // Store net to global client client.stream = net; - errdefer client.stream = null; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); errdefer { for (client.lines) |*line| { line.deinit(client.allocator); @@ -107,31 +102,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_API_VERSION }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - const server_api_version = switch (decoded.body orelse + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const server_api_version = switch (response.body orelse return error.InvalidResponse) { .core => |core_resp| switch (core_resp.body orelse return error.InvalidResponse) { @@ -168,32 +142,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_TRACK_CONFIG }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track_config = switch (decoded.body orelse + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track_config = switch (response.body orelse return error.InvalidResponse) { .core => |core_resp| switch (core_resp.body orelse return error.InvalidResponse) { @@ -231,32 +183,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { .core = .{ .kind = .CORE_REQUEST_KIND_SERVER_INFO }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const server = switch (decoded.body orelse + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const server = switch (response.body orelse return error.InvalidResponse) { .core => |core_resp| switch (core_resp.body orelse return error.InvalidResponse) { diff --git a/src/modules/mmc_client/commands/hall_status.zig b/src/modules/mmc_client/commands/hall_status.zig index 22d4a5bd..49816166 100644 --- a/src/modules/mmc_client/commands/hall_status.zig +++ b/src/modules/mmc_client/commands/hall_status.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "hall_status"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: ?client.Filter = null; const line_idx = try client.matchLine(line_name); @@ -35,31 +31,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/isolate.zig b/src/modules/mmc_client/commands/isolate.zig index 5f10fc0f..b47dad1c 100644 --- a/src/modules/mmc_client/commands/isolate.zig +++ b/src/modules/mmc_client/commands/isolate.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -82,8 +80,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/log.zig b/src/modules/mmc_client/commands/log.zig index 652dc915..73be045c 100644 --- a/src/modules/mmc_client/commands/log.zig +++ b/src/modules/mmc_client/commands/log.zig @@ -190,10 +190,6 @@ fn modify( range: client.log.Range, flag: bool, ) !void { - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); for (range.start..range.end + 1) |axis_id| { if (kind == .all or kind == .axis) client.log_config.lines[line.index].axes[axis_id - 1] = flag; @@ -218,32 +214,10 @@ fn modify( }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - var track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + var track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/move.zig b/src/modules/mmc_client/commands/move.zig index 8f2d84b4..6bfa0f01 100644 --- a/src/modules/mmc_client/commands/move.zig +++ b/src/modules/mmc_client/commands/move.zig @@ -8,8 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "move_carrier"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -64,10 +62,8 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } fn parseTarget( diff --git a/src/modules/mmc_client/commands/pause.zig b/src/modules/mmc_client/commands/pause.zig index ae747980..cc1b546b 100644 --- a/src/modules/mmc_client/commands/pause.zig +++ b/src/modules/mmc_client/commands/pause.zig @@ -8,8 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "pause"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -27,8 +25,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/print_axis_info.zig b/src/modules/mmc_client/commands/print_axis_info.zig index 313b5bd2..0d97e2e3 100644 --- a/src/modules/mmc_client/commands/print_axis_info.zig +++ b/src/modules/mmc_client/commands/print_axis_info.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_axis_info"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: client.Filter = try .parse(params[1]); const line_idx = try client.matchLine(line_name); @@ -30,31 +26,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/print_carrier_info.zig b/src/modules/mmc_client/commands/print_carrier_info.zig index fcddc597..21ac3ba3 100644 --- a/src/modules/mmc_client/commands/print_carrier_info.zig +++ b/src/modules/mmc_client/commands/print_carrier_info.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_carrier_info"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: ?client.Filter = if (params[1].len > 0) try .parse(params[1]) @@ -33,31 +29,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/print_driver_info.zig b/src/modules/mmc_client/commands/print_driver_info.zig index ebdbf062..a8fec7f1 100644 --- a/src/modules/mmc_client/commands/print_driver_info.zig +++ b/src/modules/mmc_client/commands/print_driver_info.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "print_driver_info"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; var filter: client.Filter = try .parse(params[1]); const line_idx = try client.matchLine(line_name); @@ -30,31 +26,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/pull.zig b/src/modules/mmc_client/commands/pull.zig index 53bd5c54..764087fa 100644 --- a/src/modules/mmc_client/commands/pull.zig +++ b/src/modules/mmc_client/commands/pull.zig @@ -6,8 +6,6 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -99,8 +97,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/push.zig b/src/modules/mmc_client/commands/push.zig index 52221074..591f29da 100644 --- a/src/modules/mmc_client/commands/push.zig +++ b/src/modules/mmc_client/commands/push.zig @@ -6,10 +6,6 @@ const api = @import("mmc-api"); pub fn impl(io: std.Io, params: [][]const u8) !void { const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -82,32 +78,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - var track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + var track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, @@ -163,10 +137,8 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } // Push command request { @@ -190,9 +162,7 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } } diff --git a/src/modules/mmc_client/commands/release_carrier.zig b/src/modules/mmc_client/commands/release_carrier.zig index 21d07379..d92251dd 100644 --- a/src/modules/mmc_client/commands/release_carrier.zig +++ b/src/modules/mmc_client/commands/release_carrier.zig @@ -10,8 +10,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -41,8 +39,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/reset_system.zig b/src/modules/mmc_client/commands/reset_system.zig index aaba20b6..2dae03f6 100644 --- a/src/modules/mmc_client/commands/reset_system.zig +++ b/src/modules/mmc_client/commands/reset_system.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); for (client.lines) |line| { // Send deinitialize command { @@ -23,10 +21,8 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } // Send clear errors command { @@ -39,10 +35,8 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } // Send stop push command { @@ -55,10 +49,8 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } // Send stop pull command { @@ -71,10 +63,8 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } } } diff --git a/src/modules/mmc_client/commands/resume.zig b/src/modules/mmc_client/commands/resume.zig index 262fb422..8b7088ec 100644 --- a/src/modules/mmc_client/commands/resume.zig +++ b/src/modules/mmc_client/commands/resume.zig @@ -8,8 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "resume"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -27,8 +25,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/server_version.zig b/src/modules/mmc_client/commands/server_version.zig index 3abf309e..f1a45409 100644 --- a/src/modules/mmc_client/commands/server_version.zig +++ b/src/modules/mmc_client/commands/server_version.zig @@ -8,40 +8,15 @@ pub fn impl(io: std.Io, _: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "server_version"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const request: api.protobuf.mmc.Request = .{ .body = .{ .core = .{ .kind = .CORE_REQUEST_KIND_SERVER_INFO }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const server = switch (decoded.body orelse + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const server = switch (response.body orelse return error.InvalidResponse) { .core => |core_resp| switch (core_resp.body orelse return error.InvalidResponse) { diff --git a/src/modules/mmc_client/commands/set_carrier_id.zig b/src/modules/mmc_client/commands/set_carrier_id.zig index 7602eb1d..623a5e04 100644 --- a/src/modules/mmc_client/commands/set_carrier_id.zig +++ b/src/modules/mmc_client/commands/set_carrier_id.zig @@ -8,8 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "set_carrier_id"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -54,8 +52,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/set_line_zero.zig b/src/modules/mmc_client/commands/set_line_zero.zig index 60a49e82..869765ed 100644 --- a/src/modules/mmc_client/commands/set_line_zero.zig +++ b/src/modules/mmc_client/commands/set_line_zero.zig @@ -26,5 +26,5 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { // Send message try request.encode(&net_writer.interface, client.allocator); try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/show_errors.zig b/src/modules/mmc_client/commands/show_errors.zig index f8f9b809..76cf5dab 100644 --- a/src/modules/mmc_client/commands/show_errors.zig +++ b/src/modules/mmc_client/commands/show_errors.zig @@ -8,10 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "show_errors"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name: []const u8 = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -36,31 +32,10 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - const track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/commands/stop.zig b/src/modules/mmc_client/commands/stop.zig index 79973639..2422c861 100644 --- a/src/modules/mmc_client/commands/stop.zig +++ b/src/modules/mmc_client/commands/stop.zig @@ -8,8 +8,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { const tracy_zone = tracy.traceNamed(@src(), "stop"); defer tracy_zone.end(); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); var ids: [1]u32 = .{0}; if (params[0].len > 0) { const line_name = params[0]; @@ -27,8 +25,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/stop_pull.zig b/src/modules/mmc_client/commands/stop_pull.zig index ea0507f7..dbfc254d 100644 --- a/src/modules/mmc_client/commands/stop_pull.zig +++ b/src/modules/mmc_client/commands/stop_pull.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -43,8 +41,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/stop_push.zig b/src/modules/mmc_client/commands/stop_push.zig index 2bdc059c..0fc0aa2d 100644 --- a/src/modules/mmc_client/commands/stop_push.zig +++ b/src/modules/mmc_client/commands/stop_push.zig @@ -9,8 +9,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var writer_buf: [4096]u8 = undefined; - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const line_idx = try client.matchLine(line_name); const line = client.lines[line_idx]; @@ -43,8 +41,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - try client.waitCommandReceived(io); + try client.sendRequest(io, client.allocator, net, request); + try client.waitCommandCompleted(io); } diff --git a/src/modules/mmc_client/commands/wait.zig b/src/modules/mmc_client/commands/wait.zig index 4c68f135..ab1711fe 100644 --- a/src/modules/mmc_client/commands/wait.zig +++ b/src/modules/mmc_client/commands/wait.zig @@ -78,10 +78,6 @@ pub fn axisEmpty(io: std.Io, params: [][]const u8) !void { defer tracy_zone.end(); errdefer client.log.stop.store(true, .monotonic); const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const line_name = params[0]; const axis_id = try std.fmt.parseInt(u32, buf: { const input = params[1]; @@ -126,31 +122,10 @@ pub fn axisEmpty(io: std.Io, params: [][]const u8) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - var track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + var track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, @@ -185,10 +160,6 @@ fn waitCarrierState( timeout: u64, ) !void { const net = client.stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); var ids = [1]u32{id}; var wait_timer = try std.time.Timer.start(); while (true) { @@ -210,31 +181,10 @@ fn waitCarrierState( }, }, }; - // Send message - try request.encode(&net_writer.interface, client.allocator); - try net_writer.interface.flush(); - // Receive response - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return switch (net_reader.err orelse error.Unexpected) { - else => |err| err, - }; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, - client.allocator, - ); - defer decoded.deinit(client.allocator); - var track = switch (decoded.body orelse return error.InvalidResponse) { + try client.sendRequest(io, client.allocator, net, request); + var response = try client.readResponse(io, client.allocator, net); + defer response.deinit(client.allocator); + var track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { .track => |track_resp| track_resp, diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index 0e510de3..ddd0be0e 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -304,8 +304,6 @@ const Stream = struct { stream.count = 0; stream.socket = try endpoint.connect(io, .{ .mode = .stream }); errdefer stream.socket.close(io); - var reader = stream.socket.reader(io, &stream_writer_buf); - var writer = stream.socket.writer(io, &stream_reader_buf); stream.config.lines = .empty; errdefer stream.config.lines.deinit(allocator); for (config.lines) |line| { @@ -340,31 +338,19 @@ const Stream = struct { }, }, }; - // Send message - try request.encode(&writer.interface, allocator); - try writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return reader.err orelse - error.Unexpected; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = - .fixed(reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, + try client.sendRequest( + io, + allocator, + stream.socket, + request, + ); + var response = try client.readResponse( + io, allocator, + stream.socket, ); - defer decoded.deinit(allocator); - const track = switch (decoded.body orelse + defer response.deinit(allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { @@ -448,8 +434,6 @@ const Stream = struct { io: std.Io, timestamp: f64, ) !void { - var reader = stream.socket.reader(io, &stream_writer_buf); - var writer = stream.socket.writer(io, &stream_reader_buf); const tail = (stream.head + stream.count) % stream.data.len; if (stream.count == stream.data.len) stream.head = (stream.head + 1) % stream.data.len @@ -486,30 +470,14 @@ const Stream = struct { }, }, }; - // Send message - try request.encode(&writer.interface, allocator); - try writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return reader.err orelse - error.Unexpected; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(reader.interface.buffered()); - var decoded: api.protobuf.mmc.Response = try .decode( - &proto_reader, + try client.sendRequest(io, allocator, stream.socket, request); + var response = try client.readResponse( + io, allocator, + stream.socket, ); - defer decoded.deinit(allocator); - const track = switch (decoded.body orelse + defer response.deinit(allocator); + const track = switch (response.body orelse return error.InvalidResponse) { .info => |info_resp| switch (info_resp.body orelse return error.InvalidResponse) { @@ -615,8 +583,6 @@ pub var stop = std.atomic.Value(bool).init(false); /// Stop the logging and do not save the log data to a file. pub var cancel = std.atomic.Value(bool).init(false); -var stream_writer_buf: [4096]u8 = undefined; -var stream_reader_buf: [4096]u8 = undefined; var file_reader_buf: [4096]u8 = undefined; var file_writer_buf: [4096]u8 = undefined; From e662b27e87a26963ca2459fec72dc32e5dd1db0d Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 15:06:27 +0900 Subject: [PATCH 08/12] fix: Remote endpoint upon connected --- src/modules/mmc_client/commands/connect.zig | 36 +++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index bada18c6..414c9bbc 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -222,7 +222,39 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { // Initialize memory for logging configuration client.log_config = try client.log.Config.init(client.allocator, client.lines); + const remote_endpoint = try getRemoteEndPoint(net); // Store the newly connected server as the new client endpoint. - std.log.info("Connected to {f}", .{net.socket.address}); - client.endpoint = net.socket.address; + std.log.info("Connected to {f}", .{remote_endpoint}); + client.endpoint = remote_endpoint; +} + +// Get the connected endpoint +pub fn getRemoteEndPoint( + stream: std.Io.net.Stream, +) (std.posix.GetSockNameError)!std.Io.net.IpAddress { + var sockaddr: std.posix.sockaddr.storage = undefined; + var sockaddr_len: std.posix.socklen_t = + @sizeOf(std.posix.sockaddr.storage); + const sockaddr_ptr: *std.posix.sockaddr = @ptrCast(&sockaddr); + try std.posix.getpeername(stream.socket.handle, sockaddr_ptr, &sockaddr_len); + if (sockaddr_ptr.family == std.posix.AF.INET) { + const value: *align(4) const std.posix.sockaddr.in = + @ptrCast(@alignCast(sockaddr_ptr)); + return .{ + .ip4 = .{ + .port = std.mem.bigToNative(u16, value.port), + .bytes = @bitCast(value.addr), + }, + }; + } else if (sockaddr_ptr.family == std.posix.AF.INET6) { + const value: *align(4) const std.posix.sockaddr.in6 = + @ptrCast(@alignCast(sockaddr_ptr)); + return .{ + .ip6 = .{ + .port = std.mem.bigToNative(u16, value.port), + .bytes = @bitCast(value.addr), + .interface = .{ .index = value.scope_id }, + }, + }; + } else return error.Unexpected; } From 9801671291d4c4b1b58f5c741fe7b6db6a66070c Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 15:18:26 +0900 Subject: [PATCH 09/12] ci: fix windows error --- src/command.zig | 2 +- src/main.zig | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/command.zig b/src/command.zig index bbbae096..4d005a1a 100644 --- a/src/command.zig +++ b/src/command.zig @@ -919,7 +919,7 @@ fn loadConfig(io: std.Io, params: [][]const u8) !void { defer home_dir.close(io); var config_root = try home_dir.openDir(io, ".config", .{}); defer config_root.close(io); - break :b try config_root.openDir("mmc-cli", .{}); + break :b try config_root.openDir(io, "mmc-cli", .{}); }, .linux => b: { const config_path = diff --git a/src/main.zig b/src/main.zig index 883f1723..97f0f356 100644 --- a/src/main.zig +++ b/src/main.zig @@ -9,6 +9,8 @@ const Prompt = @import("Prompt.zig"); // Environment variables to be used through the program. pub var environ: std.process.Environ = undefined; +var io: std.Io = undefined; + pub const std_options: std.Options = .{ .logFn = command.logFn, }; @@ -22,7 +24,7 @@ fn stopCommandWindows( ) callconv(.winapi) std.os.windows.BOOL { if (dwCtrlType == std.os.windows.CTRL_C_EVENT) { command.stop.store(true, .monotonic); - std.Io.File.stdin().sync() catch {}; + std.Io.File.stdin().sync(io) catch {}; } return 1; } @@ -45,7 +47,7 @@ pub fn main(init: std.process.Init.Minimal) !void { std.heap.smp_allocator; var threaded: std.Io.Threaded = .init(gpa, .{ .environ = init.environ }); defer threaded.deinit(); - const io = threaded.io(); + io = threaded.io(); environ = init.environ; try mmc_io.init(); From 742e470918145c3d8d4f63f3d52716418458faee Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 15:41:32 +0900 Subject: [PATCH 10/12] ci: `WSACleanup` handled by std --- src/io.zig | 1 - src/modules/mmc_client.zig | 1 - 2 files changed, 2 deletions(-) diff --git a/src/io.zig b/src/io.zig index 8fc33313..ddfca145 100644 --- a/src/io.zig +++ b/src/io.zig @@ -386,7 +386,6 @@ pub const event = struct { std.os.windows.GetLastError(), ), error.WaitAbandoned, error.WaitTimeOut => return false, - else => return e, }; return true; }, diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index 0a489bec..6b85c499 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -1759,7 +1759,6 @@ pub fn deinit() void { if (debug_allocator.detectLeaks() != 0) { std.log.debug("Leaks detected", .{}); } - if (builtin.os.tag == .windows) std.os.windows.WSACleanup() catch return; } pub fn matchLine(name: []const u8) !usize { From 75531376ea2bf2abad9f441b0a6131441e8fee90 Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Fri, 23 Jan 2026 15:50:34 +0900 Subject: [PATCH 11/12] cleanup: Remove unnecessary lines --- src/modules/mmc_client.zig | 37 +++------------------ src/modules/mmc_client/commands/connect.zig | 1 - src/modules/mmc_client/log.zig | 1 - 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/src/modules/mmc_client.zig b/src/modules/mmc_client.zig index 6b85c499..eda5d7da 100644 --- a/src/modules/mmc_client.zig +++ b/src/modules/mmc_client.zig @@ -161,7 +161,6 @@ pub const Parameter = struct { fn isValid(_: *@This(), input: []const u8) bool { const carrier = std.fmt.parseUnsigned(u32, input, 0) catch return false; - std.log.debug("valid: {}", .{carrier > 0 and carrier <= Line.max_axis}); if (carrier > 0 and carrier <= Line.max_axis) return true; return false; } @@ -1843,10 +1842,6 @@ pub fn waitCommandCompleted(io: std.Io) !void { fn removeCommand(io: std.Io, id: u32) !void { const net = stream orelse return error.ServerNotConnected; - var reader_buf: [4096]u8 = undefined; - var writer_buf: [4096]u8 = undefined; - var net_reader = net.reader(io, &reader_buf); - var net_writer = net.writer(io, &writer_buf); const request: api.protobuf.mmc.Request = .{ .body = .{ .command = .{ @@ -1856,28 +1851,10 @@ fn removeCommand(io: std.Io, id: u32) !void { }, }, }; - // Send message - try request.encode(&net_writer.interface, allocator); - try net_writer.interface.flush(); - // Receive message - while (true) { - try command.checkCommandInterrupt(); - const byte = net_reader.interface.peekByte() catch |e| { - switch (e) { - std.Io.Reader.Error.EndOfStream => continue, - std.Io.Reader.Error.ReadFailed => { - return net_reader.err orelse error.Unexpected; - }, - } - }; - if (byte > 0) break; - } - var proto_reader: std.Io.Reader = .fixed(net_reader.interface.buffered()); - var response: api.protobuf.mmc.Response = try .decode( - &proto_reader, - allocator, - ); - const removed_id = switch (response.body orelse + try sendRequest(io, allocator, net, request); + var response = try readResponse(io, allocator, net); + defer response.deinit(allocator); + _ = switch (response.body orelse return error.InvalidResponse) { .command => |command_resp| switch (command_resp.body orelse return error.InvalidResponse) { @@ -1892,7 +1869,6 @@ fn removeCommand(io: std.Io, id: u32) !void { }, else => return error.InvalidResponse, }; - std.log.debug("removed_id {}, id {}", .{ removed_id, id }); } pub fn sendRequest( @@ -1924,10 +1900,7 @@ pub fn readResponse( break; } else |e| { switch (e) { - std.Io.Reader.Error.EndOfStream => { - std.log.err("{t}", .{e}); - continue; - }, + std.Io.Reader.Error.EndOfStream => continue, std.Io.Reader.Error.ReadFailed => { return switch (net_reader.err orelse error.Unexpected) { else => |err| err, diff --git a/src/modules/mmc_client/commands/connect.zig b/src/modules/mmc_client/commands/connect.zig index 414c9bbc..0d624f3e 100644 --- a/src/modules/mmc_client/commands/connect.zig +++ b/src/modules/mmc_client/commands/connect.zig @@ -94,7 +94,6 @@ pub fn impl(io: std.Io, params: [][]const u8) !void { client.stream = null; net.socket.close(io); } - std.log.debug("Send API version request..", .{}); // Asserting that API version matched between client and server { const request: api.protobuf.mmc.Request = .{ diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index ddd0be0e..df3ed74a 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -498,7 +498,6 @@ const Stream = struct { // TODO: Optimize the storing to store directly to circular // buffer instead of making a copy first before calling // `writeItemOverwrite()` - // std.log.debug("{}", .{stream.data[tail].lines[0]}); data.lines[track.line - 1].id = track.line; for ( track.axis_state.items, From 9ab906be854afb76abd9222473d8e49f18ef437d Mon Sep 17 00:00:00 2001 From: aaumar25 Date: Mon, 26 Jan 2026 14:42:30 +0900 Subject: [PATCH 12/12] fix: mmc logging connect to wrong IP --- src/modules/mmc_client/log.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/mmc_client/log.zig b/src/modules/mmc_client/log.zig index df3ed74a..fac91812 100644 --- a/src/modules/mmc_client/log.zig +++ b/src/modules/mmc_client/log.zig @@ -601,14 +601,14 @@ pub fn runner(io: std.Io, duration: f64, file_path: []const u8) !void { executing.store(true, .monotonic); defer executing.store(false, .monotonic); // Stream setup. - const net = client.stream orelse return error.ServerNotConnected; + if (client.stream == null) return error.ServerNotConnected; var stream: Stream = try .init( client.allocator, io, @as(usize, @intFromFloat(logging_size_float)), client.log_config, client.lines, - net.socket.address, + client.endpoint.?, // Guaranteed to not null ); defer stream.deinit(client.allocator, io); // Logging file setup.