diff --git a/Makefile b/Makefile index 7211819..3d172f9 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ DEBUG= else OPT=-O0 SANITIZE=undefined,address -DEBUG=-ggdb +DEBUG=-g endif NN_STD=gnu99 @@ -31,7 +31,8 @@ ifdef SANITIZE SANITIZE_FLAGS += -fsanitize=$(SANITIZE) endif -CFLAGS=-fPIC $(OPT) $(SANITIZE_FLAGS) $(DEBUG) $(NNFLAGS) $(WARN) +# no-omit-frame-pointer so if a crash does happen we can trace it +CFLAGS=-fPIC -fno-omit-frame-pointer $(OPT) $(SANITIZE_FLAGS) $(DEBUG) $(NNFLAGS) $(WARN) LDFLAGS=$(OPT) $(DEBUG) $(SANITIZE_FLAGS) diff --git a/TODO.md b/TODO.md index f3cf9d1..87f42e5 100644 --- a/TODO.md +++ b/TODO.md @@ -15,7 +15,6 @@ to be made more portable. Not everything OC has (as a few of them are really MC-centered) but most of it. - `computer` component -- `tunnel` component - `internet` component (note: NN does not handle internet requests, those are up to the emulator) - `relay` component (note: OCDoc still refers to it as `access_point`) - `geolyzer` component diff --git a/src/neonucleus.c b/src/neonucleus.c index 776b860..17043f1 100644 --- a/src/neonucleus.c +++ b/src/neonucleus.c @@ -3924,9 +3924,44 @@ nn_Exit nn_pushLClipboard(nn_Computer *computer, const char *keyboardAddress, co return nn_pushSignal(computer, 3); } -nn_Exit nn_pushRedstoneChanged(nn_Computer *computer, const char *redstoneAddress, int side, int oldValue, int newValue, int color); +nn_Exit nn_pushRedstoneChanged(nn_Computer *computer, const char *redstoneAddress, int side, int oldValue, int newValue, int color) { + nn_Exit err = nn_pushstring(computer, "redstone_changed"); + if(err) return err; + err = nn_pushstring(computer, redstoneAddress); + if(err) return err; + err = nn_pushinteger(computer, side); + if(err) return err; + err = nn_pushinteger(computer, oldValue); + if(err) return err; + err = nn_pushinteger(computer, newValue); + if(err) return err; + err = color < 0 ? nn_pushnull(computer) : nn_pushinteger(computer, newValue); + if(err) return err; + return nn_pushSignal(computer, 6); +} -nn_Exit nn_pushMotion(nn_Computer *computer, double relX, double relY, double relZ, const char *entityName); +nn_Exit nn_pushMotion(nn_Computer *computer, double relX, double relY, double relZ, const char *entityName) { + nn_Exit err = nn_pushstring(computer, "motion"); + if(err) return err; + err = nn_pushnumber(computer, relX); + if(err) return err; + err = nn_pushnumber(computer, relY); + if(err) return err; + err = nn_pushnumber(computer, relZ); + if(err) return err; + // remember: safe to push NULL to pushstring in which cases it pushes null. + err = nn_pushstring(computer, entityName); + if(err) return err; + return nn_pushSignal(computer, 5); +} + +nn_Exit nn_pushInternetReady(nn_Computer *computer, const char *id, size_t idlen) { + nn_Exit err = nn_pushstring(computer, "internet_ready"); + if(err) return err; + err = nn_pushlstring(computer, id, idlen); + if(err) return err; + return nn_pushSignal(computer, 2); +} typedef enum nn_NetworkValueTag { NN_NETVAL_NULL = 0x00, @@ -7365,3 +7400,8 @@ nn_Component *nn_createTunnel(nn_Universe *universe, const char *address, const nn_setComponentHandler(c, nn_tunnelHandler); return c; } + +nn_InternetCard nn_defaultInternetCard = { + .protocolsSupported = NN_INET_ALL, + .transmissionEnergyCost = 0, +}; diff --git a/src/neonucleus.h b/src/neonucleus.h index 2712297..561ebb8 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -1257,6 +1257,10 @@ nn_Exit nn_pushRedstoneChanged(nn_Computer *computer, const char *redstoneAddres // entityName can be NULL if the entity has no name. nn_Exit nn_pushMotion(nn_Computer *computer, double relX, double relY, double relZ, const char *entityName); +// Pushes an internet_ready signal. +// This signal is queued when an internet socket is ready for commmunication. +nn_Exit nn_pushInternetReady(nn_Computer *computer, const char *id, size_t idlen); + // A buffer with encoded values typedef struct nn_EncodedNetworkContents { nn_Context *ctx; @@ -2311,6 +2315,26 @@ typedef nn_Exit (nn_TunnelHandler)(nn_TunnelRequest *req); nn_Component *nn_createTunnel(nn_Universe *universe, const char *address, const nn_Tunnel *modem, void *state, nn_TunnelHandler *handler); +typedef enum nn_InternetProtocol { + NN_INET_NONE = 0, + NN_INET_HTTP = 1<<0, + NN_INET_TCP = 1<<1, + NN_INET_UDP = 1<<2, + NN_INET_WEBSOCKET = 1<<3, + NN_INET_TLS = 1<<4, + + NN_INET_ALL = NN_INET_HTTP | NN_INET_TCP | NN_INET_UDP | NN_INET_WEBSOCKET | NN_INET_TLS, +} nn_InternetProtocol; + +typedef struct nn_InternetCard { + // bitwise OR multiple of them + unsigned char protocolsSupported; + // per-byte cost of a write + double transmissionEnergyCost; +} nn_InternetCard; + +extern nn_InternetCard nn_defaultInternetCard; + // Colors and palettes. // Do note that the