mirror of https://github.com/meshcore-dev/MeshCore
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.7 KiB
109 lines
2.7 KiB
#include "SimBus.h"
|
|
#include <cstdio>
|
|
|
|
// Scenario: N nodes in a full-mesh (all hear all), one node floods a packet,
|
|
// measure delivery rate and airtime across different network sizes.
|
|
|
|
static void runFullMesh(int num_nodes, int num_floods) {
|
|
sim::SimBus bus;
|
|
sim::FullMeshModel model(8.0f);
|
|
bus.channel_model = &model;
|
|
bus.tick_ms = 5;
|
|
|
|
char name[32];
|
|
for (int i = 0; i < num_nodes; i++) {
|
|
snprintf(name, sizeof(name), "node%d", i);
|
|
bus.addNode(name, (uint32_t)(i + 1) * 0xdeadbeef);
|
|
}
|
|
|
|
// Warm up: let nodes boot / advert
|
|
bus.run(2000);
|
|
bus.resetStats();
|
|
|
|
// Inject floods
|
|
for (int i = 0; i < num_floods; i++) {
|
|
bus.sendFloodText(0, "hello mesh");
|
|
bus.run(3000); // 3s per flood to propagate
|
|
}
|
|
|
|
char label[64];
|
|
snprintf(label, sizeof(label), "FullMesh N=%d floods=%d", num_nodes, num_floods);
|
|
bus.printReport(label);
|
|
bus.metrics.printReport(label, num_floods);
|
|
}
|
|
|
|
static void runChain(int num_nodes, int num_floods) {
|
|
sim::SimBus bus;
|
|
sim::ChainModel model(8.0f);
|
|
bus.channel_model = &model;
|
|
bus.tick_ms = 5;
|
|
|
|
char name[32];
|
|
for (int i = 0; i < num_nodes; i++) {
|
|
snprintf(name, sizeof(name), "node%d", i);
|
|
bus.addNode(name, (uint32_t)(i + 1) * 0xcafebabe);
|
|
}
|
|
|
|
bus.run(2000);
|
|
bus.resetStats();
|
|
|
|
for (int i = 0; i < num_floods; i++) {
|
|
bus.sendFloodText(0, "hello chain");
|
|
bus.run(5000); // chains need more time
|
|
}
|
|
|
|
char label[64];
|
|
snprintf(label, sizeof(label), "Chain N=%d floods=%d", num_nodes, num_floods);
|
|
bus.printReport(label);
|
|
bus.metrics.printReport(label, num_floods);
|
|
}
|
|
|
|
static void runGrid(int rows, int cols, int num_floods) {
|
|
sim::SimBus bus;
|
|
sim::PositionalModel model(1.5f, 12.0f, 3.0f);
|
|
bus.channel_model = &model;
|
|
bus.tick_ms = 5;
|
|
|
|
int num_nodes = rows * cols;
|
|
char name[32];
|
|
for (int r = 0; r < rows; r++) {
|
|
for (int c = 0; c < cols; c++) {
|
|
snprintf(name, sizeof(name), "n%d_%d", r, c);
|
|
bus.addNode(name, (uint32_t)(r * cols + c + 1) * 0x1337cafe);
|
|
model.addNode((float)c, (float)r);
|
|
}
|
|
}
|
|
|
|
bus.run(2000);
|
|
bus.resetStats();
|
|
|
|
for (int i = 0; i < num_floods; i++) {
|
|
bus.sendFloodText(0, "hello grid");
|
|
bus.run(8000);
|
|
}
|
|
|
|
char label[64];
|
|
snprintf(label, sizeof(label), "Grid %dx%d floods=%d", rows, cols, num_floods);
|
|
bus.printReport(label);
|
|
bus.metrics.printReport(label, num_floods);
|
|
}
|
|
|
|
int main() {
|
|
printf("MeshCore Simulation Harness\n");
|
|
printf("===========================\n\n");
|
|
|
|
// Scale test: full mesh at increasing sizes
|
|
runFullMesh(5, 10);
|
|
runFullMesh(10, 10);
|
|
runFullMesh(20, 5);
|
|
|
|
// Topology tests
|
|
runChain(5, 10);
|
|
runChain(10, 5);
|
|
|
|
// Grid topology (realistic urban/suburban deployment)
|
|
runGrid(3, 3, 10);
|
|
runGrid(4, 4, 5);
|
|
|
|
return 0;
|
|
}
|
|
|