From cdd0fa7758b964879ce0536e7b0aafd3211d81b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Fri, 4 Apr 2025 11:56:36 +0200 Subject: [PATCH] feat: main loop --- src/httpClient.zig | 25 ++++++---- src/main.zig | 117 ++++++++++++--------------------------------- src/platform.zig | 4 ++ 3 files changed, 50 insertions(+), 96 deletions(-) diff --git a/src/httpClient.zig b/src/httpClient.zig index 8d06163..eb3def6 100644 --- a/src/httpClient.zig +++ b/src/httpClient.zig @@ -40,14 +40,17 @@ pub const HttpRequest = struct { body: []const u8, headers: []const HttpHeader, }; + +pub const HttpResponse = struct {}; + pub const HttpHeader = struct { name: []const u8, value: []const u8, }; -pub const HttpContext = struct { client: *const Client, request: *const HttpRequest }; +pub const HttpContext = struct { client: *const Client, request: *const HttpRequest, response: ?*const HttpResponse = null, finished: bool = false }; -fn tcp_recv_callback(_: ?*anyopaque, pcb: ?*cNet.tcp_pcb, p1: ?*cNet.pbuf, _: cNet.err_t) callconv(.C) cNet.err_t { +fn tcp_recv_callback(context: ?*anyopaque, pcb: ?*cNet.tcp_pcb, p1: ?*cNet.pbuf, _: cNet.err_t) callconv(.C) cNet.err_t { print("asd2"); if (p1 == null) { print("asd3"); @@ -58,6 +61,10 @@ fn tcp_recv_callback(_: ?*anyopaque, pcb: ?*cNet.tcp_pcb, p1: ?*cNet.pbuf, _: cN _ = cNet.pbuf_free(p1); } print("asd4"); + const http_context: *HttpContext = @ptrCast(@alignCast(context)); + const response = http_context.client.allocator.create(HttpResponse) catch unreachable; + http_context.response = response; + http_context.finished = true; // std.debug.print("Received data: {s}\n", .{@ptrCast([*]const u8, p1.?.payload)}); return cNet.ERR_OK; } @@ -158,11 +165,9 @@ fn dns_callback(_: [*c]const u8, ipaddr: [*c]const cNet.struct_ip4_addr, context pub const Client = struct { allocator: std.mem.Allocator, - pub fn sendRequest(client: *const Client, request: *const HttpRequest) !void { + pub fn sendRequest(client: *const Client, request: *const HttpRequest) !?*const HttpResponse { print("Client.sendRequest"); - const asd: *const HttpContext = &.{ .client = client, .request = request }; - const context: *HttpContext = @constCast(asd); - print_usize(@intFromPtr(context)); + const context: HttpContext = .{ .client = client, .request = request }; cNet.cyw43_arch_lwip_begin(); var cached_address = cNet.ip_addr_t{}; @@ -203,14 +208,13 @@ pub const Client = struct { print(host_c_string); print_usize(host_string.len); print_usize(host_c_string.len); - print_usize(@intFromPtr(context)); if (context.request.url.host != null) { print("HOST"); } else { print("NOT HOST"); } print(context.request.url.scheme); - const result = cNet.dns_gethostbyname(@ptrCast(host_c_string), &cached_address, dns_callback, @ptrCast(@alignCast(context))); + const result = cNet.dns_gethostbyname(@ptrCast(host_c_string), &cached_address, dns_callback, @ptrCast(@alignCast(@constCast(&context)))); if (result == cNet.ERR_OK) { print("DNS resolution returned with OK"); @@ -222,9 +226,12 @@ pub const Client = struct { print("Calling cyw43_arch_lwip_end"); cNet.cyw43_arch_lwip_end(); print("Ending sendRequest..."); - while (true) { + while (!context.finished) { cNet.sleep_ms(2000); print("loop..."); } + + print("Request finished"); + return context.response; } }; diff --git a/src/main.zig b/src/main.zig index 80957bb..9cb434c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -21,7 +21,7 @@ fn print(text: []const u8) void { // Basically the pico_w blink sample export fn main() c_int { _ = p.stdio_init_all(); - p.sleep_ms(5000); + p.sleep_ms(2000); print("Starting ..."); p.gpio_init(BUTTON_PIN); @@ -29,97 +29,37 @@ export fn main() c_int { platform.init_arch(); - // platform.sleep_until_gpio_high(BUTTON_PIN); - - print("Connecting to wifi..."); - platform.connect_wifi(@embedFile("wifi.txt"), @embedFile("password.txt")); - print("Connected!"); - - main2() catch unreachable; - - // p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true); - // p.sleep_ms(200); - // p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, false); - // p.sleep_ms(200); - - // p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, false); while (true) { - // // printf("Switching to XOSC\n"); - // p.uart_default_tx_wait_blocking(); - // - // // Set the crystal oscillator as the dormant clock source, UART will be reconfigured from here - // // This is necessary before sending the pico into dormancy - // p.sleep_run_from_xosc(); - // - // // printf("Going dormant until GPIO %d goes edge high\n", WAKE_GPIO); - // p.uart_default_tx_wait_blocking(); - // - // // Go to sleep until we see a high edge on GPIO 10 - // p.sleep_goto_dormant_until_edge_high(BUTTON_PIN); - // - // p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, true); - // // Re-enabling clock sources and generators. - // p.sleep_power_up(); - // _ = p.stdio_init_all(); - // printf("Now awake for 10s\n"); - platform.set_cyw43_led(true); - p.sleep_ms(5000); + print("Going to sleep"); + platform.sleep_until_gpio_high(BUTTON_PIN); + + // Resuming from here after wake up + // platform.init_arch(); + p.gpio_init(BUTTON_PIN); + p.gpio_set_dir(BUTTON_PIN, GPIO_IN); + platform.set_cyw43_led(true); + + print("Connecting to wifi..."); + platform.connect_wifi(@embedFile("wifi.txt"), @embedFile("password.txt")); + print("Connected!"); + + send_doorbell_notification() catch unreachable; + + print("Disconnecting from wifi..."); + platform.disconnect_wifi(); + print("Disconnected!"); + + while (p.gpio_get(BUTTON_PIN)) { + print("Button is still pressed"); + p.sleep_ms(2000); + } - // while (p.gpio_get(BUTTON_PIN)) { - // p.sleep_ms(50); - // } platform.set_cyw43_led(false); - p.sleep_ms(2000); + p.sleep_ms(1000); } } -// fn tcp_recv_callback(_: ?*anyopaque, pcb: ?*c.tcp_pcb, p1: ?*c.pbuf, _: c.err_t) callconv(.C) c.err_t { -// if (p1 == null) { -// _ = c.tcp_close(pcb); -// return c.ERR_OK; -// } -// defer { -// _ = c.pbuf_free(p1); -// } -// // std.debug.print("Received data: {s}\n", .{@ptrCast([*]const u8, p1.?.payload)}); -// return c.ERR_OK; -// } -// -// fn send_http_request(pcb: ?*c.tcp_pcb) void { -// const request = "POST /todo-channel-name HTTP/1.1\r\nHost: ntfy.sh\r\nTitle: Csengo\r\nContent-Length: 6\r\n\r\nCsengo"; -// _ = c.tcp_write(pcb, request, request.len, c.TCP_WRITE_FLAG_COPY); -// _ = c.tcp_output(pcb); -// } -// -// fn tcp_connected_callback(_: ?*anyopaque, pcb: ?*c.tcp_pcb, err: c.err_t) callconv(.C) c.err_t { -// if (err != c.ERR_OK) { -// return err; -// } -// // std.debug.print("Connected to server\n", .{}); -// _ = c.tcp_recv(pcb, tcp_recv_callback); -// send_http_request(pcb); -// return c.ERR_OK; -// } -// -// fn dns_callback(_: [*c]const u8, ipaddr: [*c]const c.struct_ip4_addr, _: ?*anyopaque) callconv(.C) void { -// if (ipaddr) |addr| { -// const pcb = c.tcp_new(); -// if (pcb == null) { -// return; -// } -// _ = c.tcp_connect(pcb, addr, 80, tcp_connected_callback); -// } -// } - -pub fn main2() !void { - // c.cyw43_arch_lwip_begin(); - // var cached_address = c.ip_addr_t{}; - // - // const result = c.dns_gethostbyname("ntfy.sh", &cached_address, dns_callback, null); - // - // if (result == c.ERR_OK) {} else if (result == c.ERR_INPROGRESS) {} else if (result == c.ERR_ARG) {} - // c.cyw43_arch_lwip_end(); - +pub fn send_doorbell_notification() !void { var store: [8192]u8 = undefined; var fba = std.heap.FixedBufferAllocator.init(&store); const allocator = fba.allocator(); @@ -129,5 +69,8 @@ pub fn main2() !void { const request = &httpClient.HttpRequest{ .method = .POST, .url = try std.Uri.parse("http://ntfy.sh/todo-channel-name"), .body = "Csengo", .headers = &[_]httpClient.HttpHeader{ httpClient.HttpHeader{ .name = "Title", .value = "Csengo" }, } }; - try client.sendRequest(request); + const response = try client.sendRequest(request); + if (response) |r| { + defer allocator.destroy(r); + } } diff --git a/src/platform.zig b/src/platform.zig index 1f966a1..9a4f173 100644 --- a/src/platform.zig +++ b/src/platform.zig @@ -30,6 +30,10 @@ pub fn connect_wifi(ssid: []const u8, password: []const u8) void { } } +pub fn disconnect_wifi() void { + p.cyw43_arch_disable_sta_mode(); +} + pub fn set_cyw43_led(input: bool) void { p.cyw43_arch_gpio_put(p.CYW43_WL_GPIO_LED_PIN, input); }