Implemented P-persistent CSMA in KISS mode
This commit is contained in:
parent
e0aa5f2f65
commit
b9200f1d6e
|
@ -6,9 +6,13 @@
|
||||||
#define PROTOCOL_SIMPLE_SERIAL 0x01
|
#define PROTOCOL_SIMPLE_SERIAL 0x01
|
||||||
#define PROTOCOL_KISS 0x02
|
#define PROTOCOL_KISS 0x02
|
||||||
|
|
||||||
|
// Which serial protocol we want the modem to use
|
||||||
#define SERIAL_PROTOCOL PROTOCOL_SIMPLE_SERIAL
|
#define SERIAL_PROTOCOL PROTOCOL_SIMPLE_SERIAL
|
||||||
//#define SERIAL_PROTOCOL PROTOCOL_KISS
|
//#define SERIAL_PROTOCOL PROTOCOL_KISS
|
||||||
|
|
||||||
|
// Enable P-persistent CSMA
|
||||||
|
#define CSMA_ENABLE true
|
||||||
|
|
||||||
// Debug & test options
|
// Debug & test options
|
||||||
#define SERIAL_DEBUG false
|
#define SERIAL_DEBUG false
|
||||||
#define PASSALL true
|
#define PASSALL true
|
||||||
|
|
|
@ -103,7 +103,7 @@ static void init(void)
|
||||||
|
|
||||||
#if SERIAL_PROTOCOL == PROTOCOL_KISS
|
#if SERIAL_PROTOCOL == PROTOCOL_KISS
|
||||||
// Init KISS
|
// Init KISS
|
||||||
kiss_init(&ax25, &ser);
|
kiss_init(&ax25, &afsk, &ser);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// That's all!
|
// That's all!
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
static uint8_t serialBuffer[CONFIG_AX25_FRAME_BUF_LEN+1]; // Buffer for holding incoming serial data
|
static uint8_t serialBuffer[CONFIG_AX25_FRAME_BUF_LEN+1]; // Buffer for holding incoming serial data
|
||||||
AX25Ctx *ax25ctx;
|
AX25Ctx *ax25ctx;
|
||||||
|
Afsk *channel;
|
||||||
Serial *serial;
|
Serial *serial;
|
||||||
size_t frame_len;
|
size_t frame_len;
|
||||||
bool IN_FRAME;
|
bool IN_FRAME;
|
||||||
|
@ -16,9 +17,13 @@ uint8_t command = CMD_UNKNOWN;
|
||||||
unsigned long custom_preamble = CONFIG_AFSK_PREAMBLE_LEN;
|
unsigned long custom_preamble = CONFIG_AFSK_PREAMBLE_LEN;
|
||||||
unsigned long custom_tail = CONFIG_AFSK_TRAILER_LEN;
|
unsigned long custom_tail = CONFIG_AFSK_TRAILER_LEN;
|
||||||
|
|
||||||
void kiss_init(AX25Ctx *ax25, Serial *ser) {
|
unsigned long slotTime = 200;
|
||||||
|
uint8_t p = 63;
|
||||||
|
|
||||||
|
void kiss_init(AX25Ctx *ax25, Afsk *afsk, Serial *ser) {
|
||||||
ax25ctx = ax25;
|
ax25ctx = ax25;
|
||||||
serial = ser;
|
serial = ser;
|
||||||
|
channel = afsk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kiss_messageCallback(AX25Ctx *ctx) {
|
void kiss_messageCallback(AX25Ctx *ctx) {
|
||||||
|
@ -44,11 +49,39 @@ void fon(void) {
|
||||||
while (ts--) PORTB |= BV(2);
|
while (ts--) PORTB |= BV(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kiss_csma(AX25Ctx *ctx, uint8_t *buf, size_t len) {
|
||||||
|
bool sent = false;
|
||||||
|
while (!sent) {
|
||||||
|
if(!channel->hdlc.receiving) {
|
||||||
|
uint8_t tp = rand() & 0xFF;
|
||||||
|
if (tp < p) {
|
||||||
|
ax25_sendRaw(ctx, buf, len);
|
||||||
|
sent = true;
|
||||||
|
} else {
|
||||||
|
ticks_t start = timer_clock();
|
||||||
|
while (timer_clock() - start < ms_to_ticks(slotTime)) {
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
while (channel->hdlc.receiving) {
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void kiss_serialCallback(uint8_t sbyte) {
|
void kiss_serialCallback(uint8_t sbyte) {
|
||||||
if (IN_FRAME && sbyte == FEND && command == CMD_DATA) {
|
if (IN_FRAME && sbyte == FEND && command == CMD_DATA) {
|
||||||
IN_FRAME = false;
|
IN_FRAME = false;
|
||||||
|
#if CSMA_ENABLE
|
||||||
|
kiss_csma(ax25ctx, serialBuffer, frame_len);
|
||||||
|
#else
|
||||||
ax25_sendRaw(ax25ctx, serialBuffer, frame_len);
|
ax25_sendRaw(ax25ctx, serialBuffer, frame_len);
|
||||||
|
#endif
|
||||||
} else if (sbyte == FEND) {
|
} else if (sbyte == FEND) {
|
||||||
IN_FRAME = true;
|
IN_FRAME = true;
|
||||||
command = CMD_UNKNOWN;
|
command = CMD_UNKNOWN;
|
||||||
|
@ -75,6 +108,10 @@ void kiss_serialCallback(uint8_t sbyte) {
|
||||||
custom_preamble = sbyte * 10UL;
|
custom_preamble = sbyte * 10UL;
|
||||||
} else if (command == CMD_TXTAIL) {
|
} else if (command == CMD_TXTAIL) {
|
||||||
custom_tail = sbyte * 10;
|
custom_tail = sbyte * 10;
|
||||||
|
} else if (command == CMD_SLOTTIME) {
|
||||||
|
slotTime = sbyte * 10;
|
||||||
|
} else if (command == CMD_P) {
|
||||||
|
p = sbyte;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,10 @@
|
||||||
|
|
||||||
#include <net/ax25.h>
|
#include <net/ax25.h>
|
||||||
#include <drv/ser.h>
|
#include <drv/ser.h>
|
||||||
|
#include "afsk.h"
|
||||||
|
|
||||||
void kiss_init(AX25Ctx *ax25, Serial *ser);
|
void kiss_init(AX25Ctx *ax25, Afsk *afsk, Serial *ser);
|
||||||
|
void kiss_csma(AX25Ctx *ctx, uint8_t *buf, size_t len);
|
||||||
void kiss_messageCallback(AX25Ctx *ctx);
|
void kiss_messageCallback(AX25Ctx *ctx);
|
||||||
void kiss_serialCallback(uint8_t sbyte);
|
void kiss_serialCallback(uint8_t sbyte);
|
||||||
void fon(void);
|
void fon(void);
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
#define VERS_BUILD 2367
|
#define VERS_BUILD 2400
|
||||||
#define VERS_HOST "shard"
|
#define VERS_HOST "shard"
|
||||||
|
|
BIN
images/Modem.elf
BIN
images/Modem.elf
Binary file not shown.
2731
images/Modem.hex
2731
images/Modem.hex
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue