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.
260 lines
7.3 KiB
260 lines
7.3 KiB
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include "../libsample/sample.h"
|
|
#include "../libdebug/debug.h"
|
|
#include "../nmt/nmt.h"
|
|
|
|
extern int dms_allow_loopback;
|
|
|
|
static void assert(int condition, char *why)
|
|
{
|
|
printf("%s = %s\n", why, (condition) ? "TRUE" : "FALSE");
|
|
|
|
if (!condition) {
|
|
printf("\n******************** FAILED ********************\n\n");
|
|
exit(-1);
|
|
}
|
|
}
|
|
|
|
void ok(void)
|
|
{
|
|
printf("\n OK ;->\n\n");
|
|
sleep(1);
|
|
}
|
|
|
|
static const char testsequence[] = "This is a test for DMS protocol layer. It will test the handing of transfer window. Also it will test what happens, if frames get dropped.";
|
|
static const char *check_sequence;
|
|
int check_length;
|
|
|
|
static const uint8_t test_null[][8] = {
|
|
{ 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x07, 7 },
|
|
{ 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x00, 6 },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 5 },
|
|
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1 },
|
|
};
|
|
|
|
static char ack_bits[77];
|
|
|
|
void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
|
|
{
|
|
printf("(getting %d digits from DMS layer)\n", length);
|
|
|
|
assert(!memcmp((const char *)data, check_sequence, length), "Expecting received data to match");
|
|
|
|
check_sequence += length;
|
|
check_length = length;
|
|
}
|
|
|
|
void dms_all_sent(nmt_t *nmt)
|
|
{
|
|
}
|
|
|
|
nmt_t *alloc_nmt(void)
|
|
{
|
|
nmt_t *nmt;
|
|
|
|
nmt = calloc(sizeof(*nmt), 1);
|
|
nmt->sender.samplerate = 40 * 1200;
|
|
dms_init_sender(nmt);
|
|
dms_reset(nmt);
|
|
|
|
return nmt;
|
|
}
|
|
|
|
void free_nmt(nmt_t *nmt)
|
|
{
|
|
dms_cleanup_sender(nmt);
|
|
free(nmt);
|
|
}
|
|
|
|
extern void main_mobile_loop();
|
|
|
|
int main(void)
|
|
{
|
|
nmt_t *nmt;
|
|
dms_t *dms;
|
|
int i, j;
|
|
|
|
/* this is never called, it forces the linker to add mobile functions */
|
|
if (debuglevel == -1000) main_mobile_loop();
|
|
|
|
debuglevel = DEBUG_DEBUG;
|
|
dms_allow_loopback = 1;
|
|
|
|
nmt = alloc_nmt();
|
|
dms = &nmt->dms;
|
|
|
|
/* test if frame cycles until we send RAND */
|
|
|
|
check_sequence = testsequence;
|
|
dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1);
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0 (cycles due to unacked RAND)");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
|
|
|
|
/* send back ID */
|
|
|
|
printf("Sending back ID\n");
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 77, "Expecting frame in queue with 77 bits");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0");
|
|
|
|
/* send back RAND */
|
|
printf("Sending back RAND\n");
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 77, "Expecting frame in queue with 77 bits");
|
|
memcpy(ack_bits, dms->tx_frame, 77);
|
|
|
|
/* check if DT frame will be sent now */
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 2, "Expecting next frame to have sequence number 2");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 3");
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0");
|
|
|
|
/* send back ack bitss */
|
|
printf("Sending back RR(2)\n");
|
|
memcpy(dms->tx_frame, ack_bits, 77);
|
|
dms->tx_frame_length = 77;
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
|
|
assert(dms->tx_frame_valid && dms->tx_frame_length == 127, "Expecting frame in queue with 127 bits");
|
|
assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 0");
|
|
|
|
ok();
|
|
|
|
/* loopback frames */
|
|
printf("pipe through all data\n");
|
|
while (check_sequence[0]) {
|
|
printf("Sending back last received frame\n");
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
}
|
|
|
|
ok();
|
|
|
|
debuglevel = DEBUG_INFO;
|
|
|
|
/* test again with pseudo random packet dropps */
|
|
srandom(0);
|
|
free_nmt(nmt);
|
|
nmt = alloc_nmt();
|
|
dms = &nmt->dms;
|
|
|
|
check_sequence = testsequence;
|
|
dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1);
|
|
|
|
/* loopback frames */
|
|
printf("pipe through all data\n");
|
|
while (check_sequence[0]) {
|
|
if ((random() & 1)) {
|
|
printf("Sending back last received frame\n");
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
}
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
}
|
|
|
|
ok();
|
|
|
|
free_nmt(nmt);
|
|
nmt = alloc_nmt();
|
|
dms = &nmt->dms;
|
|
|
|
/* test zero termination */
|
|
for (j = 0; j < 4; j++) {
|
|
dms->tx_frame_length = 0;
|
|
printf("zero-termination test: %d bytes in frame\n", test_null[j][7]);
|
|
dms_send(nmt, test_null[j], test_null[j][7], 1);
|
|
check_sequence = (char *)test_null[j];
|
|
|
|
while (dms->tx_frame_length) {
|
|
printf("Sending back last received frame\n");
|
|
for (i = 0; i < dms->tx_frame_length; i++)
|
|
fsk_receive_bit_dms(nmt, dms->tx_frame[i] & 1, 1.0, 1.0);
|
|
dms->tx_frame_length = 0;
|
|
printf("Pretend that frame has been sent\n");
|
|
dms->tx_frame_valid = 0;
|
|
trigger_frame_transmission(nmt);
|
|
}
|
|
assert(check_length == test_null[j][7], "Expecting received length to match transmitted length");
|
|
}
|
|
|
|
ok();
|
|
|
|
return 0;
|
|
}
|
|
|
|
void call_down_clock(void) {}
|
|
|
|
const char *aaimage[] = { NULL };
|
|
|