Skip to content

Commit 45099fb

Browse files
committed
tx interrupt works, removed buffer delay related to discussion in #6
1 parent 3f3663a commit 45099fb

File tree

4 files changed

+91
-59
lines changed

4 files changed

+91
-59
lines changed

node.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,12 @@ function Node(opts, radioOpts, routerOpts) {
163163
nodes[i]._rx(data);
164164
}
165165
this.transmitting = true;
166+
var meta_flag = 1;
167+
var metadata = "t1";
168+
var a = Buffer.concat([new Buffer([meta_flag]), new Buffer([metadata.length]), new Buffer(metadata)]);
169+
this.router.stdin.write(a);
166170
var time = this.radio.getPayloadTime(data);
167171
time = this.network.getSimulationTime(time);
168-
this.transmitting = false;
169172

170173
// Notify listeners that we're transmitting. The websocket server
171174
// listens for these events and forwards to connected viz clients.
@@ -181,6 +184,10 @@ function Node(opts, radioOpts, routerOpts) {
181184
if(this.opts.debug) {
182185
console.log('[node ' + this.id + '] transmission completed in ' + time + "ms");
183186
}
187+
var meta_flag = 1;
188+
var metadata = "t0";
189+
var a = Buffer.concat([new Buffer([meta_flag]), new Buffer([metadata.length]), new Buffer(metadata)]);
190+
this.router.stdin.write(a);
184191
cb();
185192
this.tx(); // send more packets if there are any queued
186193
}.bind(this), time);
@@ -228,7 +235,8 @@ function Node(opts, radioOpts, routerOpts) {
228235
return;
229236
}
230237

231-
var b = Buffer.concat([new Buffer([packet.length]), new Buffer(packet)]);
238+
var meta_flag = 0;
239+
var b = Buffer.concat([new Buffer([meta_flag]), new Buffer([packet.length]), new Buffer(packet)]);
232240
this.router.stdin.write(b);
233241
};
234242

routers/base.c

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,32 @@ int print_err(const char* format, ...) {
7272
return ret;
7373
}
7474

75+
int begin_packet(){
76+
if(transmitting == 1){
77+
// transmission in progress, do not begin packet
78+
return 0;
79+
}else{
80+
// transmission done, begin packet
81+
return 1;
82+
}
83+
}
84+
85+
int parse_metadata(char* data, uint8_t len){
86+
data[len] = '\0';
87+
switch(data[0]){
88+
case 't':
89+
if(data[1] == '0'){
90+
transmitting = 0;
91+
}else{
92+
transmitting = 1;
93+
}
94+
break;
95+
default:
96+
perror("invalid metadata");
97+
}
98+
return 0;
99+
}
100+
75101
int send_packet(char* data, uint8_t len) {
76102

77103
char packet[258];
@@ -111,6 +137,7 @@ int main(int argc, char **argv) {
111137
ssize_t ret;
112138
ssize_t len = 0;
113139
ssize_t got;
140+
ssize_t meta = 0;
114141

115142
nsleep(0, 0);
116143

@@ -158,14 +185,20 @@ int main(int argc, char **argv) {
158185
}
159186

160187
if(ret && FD_ISSET(STDIN, &fds)) {
188+
if(!meta){
189+
ret = read(STDIN, &meta, 1);
190+
if(ret < 0) {
191+
perror("failed to read metadata flag");
192+
return 1;
193+
}
194+
}
161195
if(!len) {
162196
// receive the length of the incoming packet
163197
ret = read(STDIN, &len, 1);
164198
if(ret < 0) {
165199
perror("receiving length of incoming packet failed");
166200
return 1;
167201
}
168-
169202
got = 0;
170203
}
171204

@@ -185,9 +218,15 @@ int main(int argc, char **argv) {
185218
continue;
186219
}
187220

188-
if(ret = packet_received(buffer, len)) {
221+
if(meta){
222+
if(ret = parse_metadata(buffer, len)){
223+
return ret;
224+
}
225+
}
226+
else if(ret = packet_received(buffer, len)) {
189227
return ret;
190228
}
229+
meta = 0;
191230
len = 0;
192231
}
193232

routers/base.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@ int print_err(const char* format, ...);
1616

1717
int debug_printf(const char* format, ...);
1818

19+
int begin_packet();
20+
1921
int send_packet(char* data, uint8_t len);
2022

2123
int nsleep(unsigned int secs, useconds_t usecs);
2224

25+
int transmitting;
26+
2327
// you must declare these in your router
2428
int setup(); // called once on startup
2529
int loop(); // called once per event loop iteration

routers/firmware.c

Lines changed: 36 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,9 @@ uint8_t messageCount = 0;
1818

1919
// mode switches
2020
int retransmitEnabled = 0;
21-
int pollingEnabled = 0;
22-
int beaconModeEnabled = 1;
2321
int hashingEnabled = 1;
24-
int beaconModeReached = 0;
2522

2623
// timeout intervals
27-
int bufferInterval = 3;
2824
int helloInterval = 10;
2925
int routeInterval = 10;
3026
int messageInterval = 5;
@@ -52,19 +48,13 @@ struct Packet {
5248
uint8_t data[240];
5349
};
5450

51+
struct Packet buffer[8];
52+
int bufferEntry = 0;
53+
5554
// table structures
5655
uint8_t hashTable[256][SHA1_LENGTH];
5756
uint8_t hashEntry = 0;
5857

59-
/*
60-
struct BufferEntry {
61-
uint8_t message[256];
62-
uint8_t length;
63-
};
64-
*/
65-
struct Packet buffer[8];
66-
int bufferEntry = 0;
67-
6858
struct NeighborTableEntry{
6959
uint8_t address[ADDR_LENGTH];
7060
uint8_t lastReceived;
@@ -154,21 +144,13 @@ struct Packet popFromBuffer(){
154144
return pop;
155145
}
156146

157-
long lastCheckTime = 0;
158147
void checkBuffer(){
159148

160-
if (time(NULL) - lastCheckTime > bufferInterval) {
161-
if (bufferEntry > 0){
162-
// Uncomment if you want race condition to determine a single beacon node
163-
if(!beaconModeReached){
164-
beaconModeEnabled = 0;
165-
}
166-
struct Packet packet = popFromBuffer();
167-
sendPacket(packet);
168-
}else{
169-
debug_printf("Buffer is empty\n");
170-
}
171-
lastCheckTime = time(NULL);
149+
if (bufferEntry > 0){
150+
struct Packet packet = popFromBuffer();
151+
sendPacket(packet);
152+
}else{
153+
debug_printf("Buffer is empty\n");
172154
}
173155
}
174156

@@ -267,12 +249,10 @@ uint8_t calculateMetric(int entry, uint8_t sequence, struct Metadata metadata){
267249
float weightedRSSI = ((float) metadata.rssi)*RSSIWeight;
268250
float weightedSNR = ((float) metadata.snr)*SNRWeight;
269251
uint8_t metric = weightedPacketSuccess+weightedRSSI+weightedSNR;
270-
/*
271-
Serial.printf("weighted packet success: %3f\n", weightedPacketSuccess);
272-
Serial.printf("weighted RSSI: %3f\n", weightedRSSI);
273-
Serial.printf("weighted SNR: %3f\n", weightedSNR);
274-
Serial.printf("metric calculated: %3d\n", metric);
275-
*/
252+
debug_printf("weighted packet success: %3f\n", weightedPacketSuccess);
253+
debug_printf("weighted RSSI: %3f\n", weightedRSSI);
254+
debug_printf("weighted SNR: %3f\n", weightedSNR);
255+
debug_printf("metric calculated: %3d\n", metric);
276256
return metric;
277257
}
278258

@@ -519,7 +499,6 @@ long lastHelloTime = 0;
519499
void transmitHello(){
520500

521501
if (time(NULL) - lastHelloTime > helloInterval) {
522-
beaconModeReached = 1;
523502
char data[240];
524503
char message[10] = "Hola from\0";
525504
sprintf(data, "%s %s", message, macaddr);
@@ -686,29 +665,31 @@ int setup() {
686665
int state = 0;
687666
int loop() {
688667

689-
// State machine for testing purposes
690-
if(state == 0){
691-
Serial.printf("learning... %d", time(NULL) - startTime);
692-
printNeighborTable();
693-
printRoutingTable();
694-
transmitHello();
695-
if (time(NULL) - startTime > discoveryTimeout) {
696-
state++;
697-
}
698-
}else if(state == 1){
699-
Serial.printf("learning... %d", time(NULL) - startTime);
700-
printNeighborTable();
701-
printRoutingTable();
702-
transmitRoutes();
703-
if (time(NULL) - startTime > learningTimeout) {
704-
state++;
705-
}
706-
}else if(state == 2){
707-
checkBuffer();
708-
if(chance == 3){
709-
transmitToRandomRoute();
668+
if(!begin_packet()){
669+
Serial.printf("transmit in progress please wait");
670+
}else{
671+
if(state == 0){
672+
Serial.printf("learning... %d", time(NULL) - startTime);
673+
printNeighborTable();
674+
printRoutingTable();
675+
transmitHello();
676+
if (time(NULL) - startTime > discoveryTimeout) {
677+
state++;
678+
}
679+
}else if(state == 1){
680+
Serial.printf("learning... %d", time(NULL) - startTime);
681+
printNeighborTable();
682+
printRoutingTable();
683+
transmitRoutes();
684+
if (time(NULL) - startTime > learningTimeout) {
685+
state++;
686+
}
687+
}else if(state == 2){
688+
checkBuffer();
689+
if(chance == 3){
690+
transmitToRandomRoute();
691+
}
710692
}
711693
}
712-
713694
nsleep(1, 0);
714695
}

0 commit comments

Comments
 (0)