diff --git a/src/components/volatileFilesystem.c b/src/components/volatileFilesystem.c index 53b0641..946cb19 100644 --- a/src/components/volatileFilesystem.c +++ b/src/components/volatileFilesystem.c @@ -1,5 +1,7 @@ #include "../neonucleus.h" +// TODO: finish + // Data structures typedef struct nn_vfnode { diff --git a/src/computer.c b/src/computer.c index d12dd4b..a7b150b 100644 --- a/src/computer.c +++ b/src/computer.c @@ -523,3 +523,19 @@ nn_value nn_return_table(nn_computer *computer, nn_size_t len) { nn_return(computer, val); return val; } + +const char *nn_pushNetworkMessage(nn_computer *computer, nn_address receiver, nn_address sender, nn_size_t port, double distance, nn_value *values, nn_size_t valueLen) { + nn_Alloc *alloc = &computer->universe->ctx.allocator; + + nn_value buffer[valueLen + 5]; + buffer[0] = nn_values_cstring("modem_message"); + buffer[1] = nn_values_string(alloc, receiver, nn_strlen(receiver)); + buffer[2] = nn_values_string(alloc, sender, nn_strlen(sender)); + buffer[3] = nn_values_integer(port); + buffer[4] = nn_values_number(distance); + for(nn_size_t i = 0; i < valueLen; i++) { + buffer[i + 5] = nn_values_retain(values[i]); + } + + return nn_pushSignal(computer, buffer, valueLen + 5); +} diff --git a/src/neonucleus.h b/src/neonucleus.h index 6474918..e7fb8ec 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -118,6 +118,9 @@ extern "C" { #define NN_MAX_OPEN_FILES 128 #define NN_MAX_SCREEN_KEYBOARDS 64 #define NN_MAX_PATH 256 +#define NN_PORT_MAX 65535 +#define NN_MAX_WAKEUPMSG 2048 +#define NN_TUNNEL_PORT 0 #define NN_OVERHEAT_MIN 100 #define NN_CALL_HEAT 0.05 @@ -549,6 +552,7 @@ nn_value nn_return_table(nn_computer *computer, nn_size_t len); nn_size_t nn_values_getType(nn_value val); nn_value nn_values_retain(nn_value val); void nn_values_drop(nn_value val); +void nn_values_dropAll(nn_value *values, nn_size_t len); void nn_values_set(nn_value arr, nn_size_t idx, nn_value val); nn_value nn_values_get(nn_value arr, nn_size_t idx); @@ -859,6 +863,56 @@ typedef struct nn_gpuControl { // the control is COPIED. nn_component *nn_addGPU(nn_computer *computer, nn_address address, int slot, nn_gpuControl *control); +typedef struct nn_networkControl { + double packetBytesPerTick; + double heatPerFullPacket; + double energyPerFullPacket; +} nn_networkControl; + +// NULL on success, error string on failure +const char *nn_pushNetworkMessage(nn_computer *computer, nn_address receiver, nn_address sender, nn_size_t port, double distance, nn_value *values, nn_size_t valueLen); + +typedef struct nn_modemTable { + void *userdata; + void (*deinit)(void *userdata); + + nn_networkControl control; + + // basic limits + + nn_bool_t wireless; + nn_size_t maxValues; + nn_size_t maxPacketSize; + + // ports + + nn_bool_t (*isOpen)(void *userdata, nn_size_t port); + nn_bool_t (*open)(void *userdata, nn_size_t port); + // port 0 means close all + nn_bool_t (*close)(void *userdata, nn_size_t port); + + // messages + + // Address is NULL if broadcasting + nn_bool_t (*send)(void *userdata, nn_address address, nn_size_t port, nn_value *values, nn_size_t valueCount); + + // signal strength + nn_size_t maxStrength; + nn_size_t (*getStrength)(void *userdata); + nn_bool_t (*setStrength)(void *userdata, nn_size_t strength); + + // wake message + void (*getWakeMessage)(void *userdata, char *buf, nn_size_t *buflen); + nn_size_t (*setWakeMessage)(void *userdata, const char *buf, nn_size_t buflen, nn_bool_t fuzzy); +} nn_modemTable; + +typedef struct nn_tunnelTable { + void *userdata; + void (*deinit)(void *userdata); + + nn_networkControl control; +} nn_tunnelTable; + #ifdef __cplusplus } #endif diff --git a/src/value.c b/src/value.c index 166a97e..4d4877e 100644 --- a/src/value.c +++ b/src/value.c @@ -129,6 +129,12 @@ void nn_values_drop(nn_value val) { } } +void nn_values_dropAll(nn_value *values, nn_size_t len) { + for(nn_size_t i = 0; i < len; i++) { + nn_values_drop(values[i]); + } +} + void nn_values_set(nn_value arr, nn_size_t idx, nn_value val) { if(arr.tag != NN_VALUE_ARRAY) return; if(idx >= arr.array->len) return;