Skip to content

Commit 6ad3b19

Browse files
committed
WIP porting picoruby-net
1 parent f3da364 commit 6ad3b19

File tree

10 files changed

+133
-135
lines changed

10 files changed

+133
-135
lines changed

mrbgems/picoruby-net/include/net.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,9 @@
44
#include <stdint.h>
55
#include <stdbool.h>
66

7-
//#define PICO_CYW43_ARCH_POLL 1
87
#include "lwipopts.h"
9-
//#define LWIP_DNS 1
108
#include "lwip/dns.h"
119
#include "lwip/pbuf.h"
12-
//#define LWIP_ALTCP 1
13-
//#define LWIP_ALTCP_TLS 1
1410
#include "lwip/altcp_tls.h"
1511
#include "lwip/udp.h"
1612

@@ -28,10 +24,11 @@ extern "C" {
2824
//#if !defined(sleep_ms)
2925
//int sleep_ms(long milliseconds);
3026
//#endif
31-
//void lwip_begin(void);
32-
//void lwip_end(void);
27+
void lwip_begin(void);
28+
void lwip_end(void);
29+
void Net_sleep_ms(int);
3330
//
34-
//err_t Net_get_ip(const char *name, ip_addr_t *ip);
31+
err_t Net_get_ip(const char *name, ip_addr_t *ip);
3532
//void TCPClient_send(void *mrb, const char *host, int port, const char *send_data, size_t send_data_len, bool is_tls, recv_data_t *recv_data);
3633
//void UDPClient_send(void *mrb, const char *host, int port, const char *send_data, size_t send_data_len, bool is_dtls, recv_data_t *recv_data);
3734

mrbgems/picoruby-net/ports/rp2040/common.c

Lines changed: 0 additions & 36 deletions
This file was deleted.

mrbgems/picoruby-net/ports/rp2040/include/common.h

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include "pico/stdlib.h"
2+
#include "pico/cyw43_arch.h"
3+
4+
void
5+
Net_sleep_ms(int ms)
6+
{
7+
cyw43_arch_poll();
8+
sleep_ms(ms);
9+
}
10+
11+
void
12+
lwip_begin(void)
13+
{
14+
cyw43_arch_lwip_begin();
15+
}
16+
17+
void
18+
lwip_end(void)
19+
{
20+
cyw43_arch_lwip_end();
21+
}

mrbgems/picoruby-net/src/mbedtls_debug.c

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
#include "../../include/net.h"
1+
#include "../include/net.h"
22
#include "lwipopts.h"
3-
#include "pico/cyw43_arch.h"
43
#include "lwip/pbuf.h"
54

6-
#include "include/common.h"
7-
85
#include "mruby.h"
96

107
mrb_value
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include "mruby.h"
2+
#include "mruby/presym.h"
3+
#include "mruby.h"
4+
#include "../include/net.h"
5+
6+
static mrb_value
7+
mrb_net_dns_s_resolve(mrb_state *mrb, mrb_value self)
8+
{
9+
const char *host;
10+
mrb_bool is_tls;
11+
mrb_get_args(mrb, "zb", &host, &is_tls);
12+
return DNS_resolve(mrb, host, is_tls);
13+
}
14+
15+
static mrb_value
16+
mrb_net_tcpclient_s__request_impl(mrb_state *mrb, mrb_value self)
17+
{
18+
const char *host;
19+
mrb_int port;
20+
mrb_value data;
21+
mrb_bool use_dtls;
22+
mrb_get_args(mrb, "ziob", &host, &port, &data, &use_dtls);
23+
return TCPClient_send(host, port, mrb, data, use_dtls);
24+
}
25+
26+
static mrb_value
27+
mrb_net_udpclient_s__send_impl(mrb_state *mrb, mrb_value self)
28+
{
29+
const char *host;
30+
mrb_int port;
31+
mrb_value data;
32+
mrb_bool use_dtls;
33+
mrb_get_args(mrb, "ziob", &host, &port, &data, &use_dtls);
34+
return UDPClient_send(host, port, mrb, data, use_dtls);
35+
}
36+
37+
void
38+
mrb_picoruby_net_gem_init(mrb_state* mrb)
39+
{
40+
struct RClass *class_Net = mrb_define_class_id(mrb, MRB_SYM(Net), mrb->object_class);
41+
42+
struct RClass *class_Net_DNS = mrb_define_class_under_id(mrb, class_Net, MRB_SYM(DNS), mrb->object_class);
43+
mrb_define_class_method_id(mrb, class_Net_DNS, MRB_SYM(resolve), mrb_net_dns_s_resolve, MRB_ARGS_REQ(2));
44+
45+
struct RClass *class_Net_TCPClient = mrb_define_class_under_id(mrb, class_Net, MRB_SYM(TCPClient), mrb->object_class);
46+
mrb_define_class_method_id(mrb, class_Net_TCPClient, MRB_SYM(_request_impl), mrb_net_tcpclient_s__request_impl, MRB_ARGS_REQ(4));
47+
48+
struct RClass *class_Net_UDPClient = mrb_define_class_under_id(mrb, class_Net, MRB_SYM(UDPClient), mrb->object_class);
49+
mrb_define_class_method_id(mrb, class_Net_UDPClient, MRB_SYM(_send_impl), mrb_net_udpclient_s__send_impl, MRB_ARGS_REQ(4));
50+
}
51+
void
52+
mrb_picoruby_net_gem_final(mrb_state* mrb)
53+
{
54+
}
Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
#include "../../include/net.h"
2-
#include "../../include/mbedtls_debug.h"
1+
#include "../include/net.h"
2+
#include "../include/mbedtls_debug.h"
33
#include "lwipopts.h"
4-
#include "pico/cyw43_arch.h"
54
#include "lwip/altcp_tls.h"
65

7-
#include "include/common.h"
8-
96
#include "mruby.h"
107
#include "mruby/string.h"
118

@@ -47,7 +44,7 @@ TCPClient_close(tcp_connection_state *cs)
4744
{
4845
err_t err = ERR_OK;
4946
if (!cs || !cs->pcb) return ERR_ARG;
50-
cyw43_arch_lwip_begin();
47+
lwip_begin();
5148
altcp_arg(cs->pcb, NULL);
5249
altcp_recv(cs->pcb, NULL);
5350
altcp_sent(cs->pcb, NULL);
@@ -59,7 +56,7 @@ TCPClient_close(tcp_connection_state *cs)
5956
altcp_abort(cs->pcb);
6057
err = ERR_ABRT;
6158
}
62-
cyw43_arch_lwip_end();
59+
lwip_end();
6360
TCPClient_free_tls_config(cs);
6461
mrb_free(cs->mrb, cs);
6562
return err;
@@ -186,15 +183,15 @@ TCPClient_connect_impl(ip_addr_t *ip, const char *host, int port, mrb_value send
186183
cs = TCPClient_new_connection(send_data, recv_data, mrb);
187184
}
188185
if (cs) {
189-
cyw43_arch_lwip_begin();
186+
lwip_begin();
190187
err = altcp_connect(cs->pcb, ip, port, TCPClient_connected_cb);
191188
if (err != ERR_OK) {
192189
mrb_warn(cs->mrb, "altcp_connect failed: %d\n", err);
193190
cs->state = NET_TCP_STATE_ERROR;
194-
cyw43_arch_lwip_end();
191+
lwip_end();
195192
return cs;
196193
}
197-
cyw43_arch_lwip_end();
194+
lwip_end();
198195
cs->state = NET_TCP_STATE_CONNECTION_STARTED;
199196
}
200197
return cs;
@@ -217,15 +214,15 @@ TCPClient_poll_impl(tcp_connection_state **pcs)
217214
break;
218215
case NET_TCP_STATE_CONNECTED:
219216
cs->state = NET_TCP_STATE_WAITING_PACKET;
220-
cyw43_arch_lwip_begin();
217+
lwip_begin();
221218
err = altcp_write(cs->pcb, RSTRING_PTR(cs->send_data), RSTRING_LEN(cs->send_data), 0);
222219
if (err != ERR_OK) {
223220
mrb_warn(cs->mrb, "altcp_write failed: %d\n", err);
224221
cs->state = NET_TCP_STATE_ERROR;
225222
return 1;
226223
}
227224
altcp_output(cs->pcb);
228-
cyw43_arch_lwip_end();
225+
lwip_end();
229226
break;
230227
case NET_TCP_STATE_PACKET_RECVED:
231228
cs->state = NET_TCP_STATE_WAITING_PACKET;
@@ -261,7 +258,7 @@ TCPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data,
261258
} else {
262259
while(TCPClient_poll_impl(&cs))
263260
{
264-
sleep_ms(200);
261+
Net_sleep_ms(200);
265262
}
266263
// recv_data is ready after connection is complete
267264
ret = recv_data;
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
#include "../../include/net.h"
1+
#include "../include/net.h"
22
#include "lwipopts.h"
3-
#include "pico/cyw43_arch.h"
43
#include "lwip/udp.h"
5-
#include "include/common.h"
64

75
#include "mruby.h"
86
#include "mruby/string.h"
@@ -82,9 +80,9 @@ UDPClient_send_impl(ip_addr_t *ip, int port, mrb_value send_data, mrb_value recv
8280
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, RSTRING_LEN(cs->send_data), PBUF_RAM);
8381
if (p != NULL) {
8482
memcpy(p->payload, RSTRING_PTR(cs->send_data), RSTRING_LEN(cs->send_data));
85-
cyw43_arch_lwip_begin();
83+
lwip_begin();
8684
err_t err = udp_sendto(cs->pcb, p, ip, port);
87-
cyw43_arch_lwip_end();
85+
lwip_end();
8886
pbuf_free(p);
8987

9088
if (err == ERR_OK) {
@@ -117,17 +115,17 @@ UDPClient_poll_impl(udp_connection_state **pcs)
117115
break;
118116
case NET_UDP_STATE_RECEIVED:
119117
cs->state = NET_UDP_STATE_NONE;
120-
cyw43_arch_lwip_begin();
118+
lwip_begin();
121119
udp_remove(cs->pcb);
122-
cyw43_arch_lwip_end();
120+
lwip_end();
123121
mrb_free(cs->mrb, cs);
124122
*pcs = NULL;
125123
return 0;
126124
case NET_UDP_STATE_ERROR:
127125
mrb_warn(cs->mrb, "Error occurred, cleaning up\n");
128-
cyw43_arch_lwip_begin();
126+
lwip_begin();
129127
udp_remove(cs->pcb);
130-
cyw43_arch_lwip_end();
128+
lwip_end();
131129
mrb_free(cs->mrb, cs);
132130
*pcs = NULL;
133131
return 0;
@@ -156,7 +154,7 @@ UDPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data,
156154
while(UDPClient_poll_impl(&cs))
157155
{
158156
poll_count++;
159-
sleep_ms(200);
157+
Net_sleep_ms(200);
160158
// Add a timeout mechanism to prevent infinite loop
161159
if (poll_count > 50) { // 10 seconds timeout (50 * 200ms)
162160
mrb_warn(cs->mrb, "Polling timeout reached\n");
@@ -165,9 +163,9 @@ UDPClient_send(const char *host, int port, mrb_state *mrb, mrb_value send_data,
165163
}
166164
if (cs != NULL) {
167165
mrb_warn(cs->mrb, "Connection state not NULL after polling, cleaning up\n");
168-
cyw43_arch_lwip_begin();
166+
lwip_begin();
169167
udp_remove(cs->pcb);
170-
cyw43_arch_lwip_end();
168+
lwip_end();
171169
mrb_free(cs->mrb, cs);
172170
}
173171
ret = recv_data;

0 commit comments

Comments
 (0)