Initial version.
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
|
||||
PMD_HOME ?= /home/gatsby/Software/pmd-bin-6.0.1
|
||||
OCLINT_HOME ?= /home/gatsby/Software/oclint-0.13.1
|
||||
|
||||
# Source files
|
||||
COMMON_SRC := ../src/error.h ../src/common.h ../src/common.c
|
||||
TEST_FRAME := ../../unit_test_framework.h
|
||||
UTIL_SRC := $(wildcard ../src/util/*.c ../src/util/*.h)
|
||||
TMC_SRC := $(wildcard ../src/time_ctrl/*.c ../src/time_ctrl/*.h)
|
||||
PHY_SRC := $(wildcard ../src/phy_ctrl/*.c ../src/phy_ctrl/*.h)
|
||||
GEOMETRY_SRC := $(wildcard ../src/linklayer/geometry/*.c ../src/linklayer/geometry/*.h)
|
||||
LINK_SRC := $(wildcard ../src/linklayer/*.c ../src/linklayer/*.h)
|
||||
BIARRAY_SRC := $(wildcard ../src/bit_array/*.c ../src/bit_array/*.h)
|
||||
|
||||
# Compiler
|
||||
CC ?= gcc
|
||||
|
||||
# Compiler flags
|
||||
CFLAGS ?= --std=c11 -O0 -I../src -Wall -Werror -pedantic -g -Wno-sign-compare -Wno-comment
|
||||
|
||||
# Add sanitizer flags for identifying undefined behavior. The flags are
|
||||
# different on macOS (AKA Darwin) and Windows/WSL/Linux.
|
||||
UNAME := $(shell uname -s)
|
||||
ifeq "$(UNAME)" "Darwin"
|
||||
CFLAGS += -fsanitize=address -fsanitize=undefined
|
||||
else
|
||||
CFLAGS += -m32 -fsanitize=address -fsanitize=undefined -D_GLIBCC_DEBUG
|
||||
endif
|
||||
|
||||
tmc_board_unit_test: tmc_board_unit_test.c $(TMC_SRC) $(UTIL_SRC) $(COMMON_SRC) $(TEST_FRAME)
|
||||
$(CC) $(CFLAGS) $(filter %.c, $^) -o $@
|
||||
|
||||
tmc_emulate_unit_test: tmc_emulate_unit_test.c $(TMC_SRC) $(UTIL_SRC) $(COMMON_SRC) $(TEST_FRAME)
|
||||
$(CC) $(CFLAGS) -DEMULATION $(filter %.c, $^) -o $@
|
||||
|
||||
linklayer_emulate_unit_test: linklayer_emulate_unit_test.c \
|
||||
$(LINK_SRC) \
|
||||
$(BIARRAY_SRC) \
|
||||
$(GEOMETRY_SRC) \
|
||||
$(PHY_SRC) \
|
||||
$(TMC_SRC) \
|
||||
$(UTIL_SRC) \
|
||||
$(COMMON_SRC) \
|
||||
$(TEST_FRAME)
|
||||
$(CC) $(CFLAGS) -lm -DEMULATION $(filter %.c, $^) -o $@
|
||||
clean:
|
||||
rm -f *_unit_test
|
||||
|
||||
# Style check
|
||||
CPD ?= $(PMD_HOME)/bin/run.sh cpd
|
||||
OCLINT ?= $(OCLINT_HOME)/bin/oclint
|
||||
FILES := $(SRCS)
|
||||
CPD_FILES := $(SRCS)
|
||||
style :
|
||||
$(OCLINT) \
|
||||
-no-analytics \
|
||||
-rule=LongLine \
|
||||
-rule=HighNcssMethod \
|
||||
-rule=DeepNestedBlock \
|
||||
-rule=TooManyParameters \
|
||||
-rc=LONG_LINE=80 \
|
||||
-rc=NCSS_METHOD=1000 \
|
||||
-rc=NESTED_BLOCK_DEPTH=4 \
|
||||
-rc=TOO_MANY_PARAMETERS=4 \
|
||||
-max-priority-1 0 \
|
||||
-max-priority-2 0 \
|
||||
-max-priority-3 0 \
|
||||
$(FILES) \
|
||||
-- -xc++ --std=c99
|
||||
$(CPD) \
|
||||
--minimum-tokens 100 \
|
||||
--language c \
|
||||
--failOnViolation true \
|
||||
--files $(CPD_FILES)
|
||||
@echo "########################################"
|
||||
@echo "Style checks PASS"
|
||||
|
||||
.PHONY: clean test
|
||||
BIN
Binary file not shown.
@@ -0,0 +1,369 @@
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include "error.h"
|
||||
#include "unit_test_framework.h"
|
||||
#include "time_ctrl/time_ctrl.h"
|
||||
#include "phy_ctrl/phy_ctrl.h"
|
||||
#include "linklayer/linklayer814.h"
|
||||
#include "linklayer/msg_def.h"
|
||||
|
||||
#define TIME_INT_REG (0x00000008>>2)
|
||||
#define TIME_FRAC_REG (0x0000000C>>2)
|
||||
#define TIME_ADJ_INT (0x0000001C>>2)
|
||||
#define TIME_ADJ_FRAC (0x00000020>>2)
|
||||
#define TIME_ADJ_TRIG (0x00000024>>2)
|
||||
#define CNTSTEP_OPT (0x00000028>>2)
|
||||
|
||||
TIMECTRL_INST* tmcInstPtr = NULL;
|
||||
PHY_INST* phyInstPtr = NULL;
|
||||
L2_INST* linkInstPtr = NULL;
|
||||
|
||||
uint32_t tmcReg[32] = {0};
|
||||
uint32_t phycReg[512] = {0};
|
||||
|
||||
uint8_t bmTemplate[INTRA_BM_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0x08, 0x21, 0x04, 0x06, 0x00, 0xF3, 0xA8, 0xCB,
|
||||
0x00, 0xA0, 0x49, 0x00, 0x9A, 0x04, 0x13, 0x1E,
|
||||
0x45, 0xE7, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA
|
||||
};
|
||||
uint8_t w2acqTemplate[INTRA_W2ACQ_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0xCC, 0x71, 0x21, 0xA8, 0x0A, 0x00, 0x00, 0x00,
|
||||
0x00, 0x1A, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00,
|
||||
0xF0, 0xF0, 0x2A, 0x0F, 0x0F, 0xF0, 0x0F, 0x00,
|
||||
0xFF, 0x00, 0xAA, 0x3A, 0xFF, 0x00, 0xFF, 0x00,
|
||||
0x00, 0xFF, 0x00, 0xFF, 0x4A, 0xB2, 0xBA, 0xF0,
|
||||
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x5A, 0x0F, 0x0F,
|
||||
0x0F, 0x0F, 0x0F, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
|
||||
};
|
||||
uint8_t mgmtTemplate[INTRA_MGMT_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0xCC, 0xC3, 0x99, 0x99, 0x83, 0x99, 0x99, 0x99,
|
||||
0x99, 0xA5, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xBA,
|
||||
0xBB, 0x9B, 0x19, 0xCC, 0xCC, 0xDD, 0xDD, 0xEE,
|
||||
0xEE, 0xEE, 0x99, 0x29, 0xAA, 0xAA, 0xAA, 0xAA,
|
||||
0xBB, 0xBB, 0xBB, 0xBB, 0x39, 0x21, 0x98, 0xBB,
|
||||
0xBB, 0xCC, 0xCC, 0xDD, 0xDD, 0x99, 0x99, 0x99,
|
||||
0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
uint8_t rttReqTemplate[INTRA_RTT_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0xDC, 0xA3, 0x10, 0x44, 0x98, 0x99, 0x99, 0x99,
|
||||
0x99, 0x05, 0x00, 0x00, 0x00, 0x50, 0x32, 0x01,
|
||||
0x00, 0x90, 0x99, 0xFF, 0xFF, 0xFF, 0x99, 0x99,
|
||||
0x99, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
uint8_t rttRspTemplate[INTRA_RTT_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0
|
||||
};
|
||||
uint8_t svcTemplate[INTRA_SVC_FRAME_LENGTH_MAX] __attribute__ ((aligned (8))) = {
|
||||
0xF0, 0xFF, 0x00, 0x21, 0x88, 0x00, 0x00, 0xF0,
|
||||
0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x56, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x21, 0xE6, 0x00, 0x21, 0x88, 0x00, 0x00,
|
||||
0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
|
||||
L2_CONFIG l2Config = {
|
||||
.myType = HEAD_NODE,
|
||||
.isInterHead = false,
|
||||
.myId = 1,
|
||||
.clustId = 1,
|
||||
.headId = 1,
|
||||
.bkpHeadId = 1,
|
||||
.netScale = 2,
|
||||
.phyInstPtr = NULL,
|
||||
.tmcInstPtr = NULL
|
||||
};
|
||||
|
||||
PHY_CONFIG l1Config = {
|
||||
.devId = 0,
|
||||
.txBramId = 0,
|
||||
.rxBramId = 0,
|
||||
.antBramId = 0,
|
||||
.baseAddr = (uintptr_t)phycReg
|
||||
};
|
||||
|
||||
TIMECTRL_CONFIG tmcConfig = {
|
||||
.baseAddr = (uintptr_t)tmcReg,
|
||||
.reset = 10
|
||||
};
|
||||
|
||||
void linklayer_setup(void){
|
||||
int32_t Status;
|
||||
Status = TimeCtrl_Init(&tmcInstPtr, &tmcConfig);
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
Status = Phy_InstInit(&phyInstPtr, &l1Config);
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
|
||||
// Update l2 config
|
||||
l2Config.phyInstPtr = phyInstPtr;
|
||||
l2Config.tmcInstPtr = tmcInstPtr;
|
||||
|
||||
Status = Linklayer_Init(&linkInstPtr, &l2Config);
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
}
|
||||
|
||||
void linklayer_teardown(void){
|
||||
Linklayer_Destroy(linkInstPtr);
|
||||
Phy_Destroy(phyInstPtr);
|
||||
TimeCtrl_Destroy(tmcInstPtr);
|
||||
}
|
||||
|
||||
void forge_bm_frame(uint16_t nodeId, uint16_t clustId, uint16_t headId, uint64_t time) {
|
||||
BIT_ARRAY bitarr = {
|
||||
.words = (uint64_t*)bmTemplate,
|
||||
.num_of_bits = INTRA_BM_FRAME_LENGTH_MAX*8,
|
||||
.num_of_words = roundup_bits2words64(INTRA_BM_FRAME_LENGTH_MAX*8),
|
||||
.capacity_in_words = roundup_bits2words64(INTRA_BM_FRAME_LENGTH_MAX*8),
|
||||
};
|
||||
uint64_t dataChunk;
|
||||
dataChunk = (nodeId & 0x001F) | ((clustId & 0x001F) << 5);
|
||||
FrameInsertChunk(&bitarr, BM_MSG_SRC_ADDR_OFFSET, BM_MSG_SRC_ADDR_LEN, dataChunk);
|
||||
|
||||
/* net management node id */
|
||||
dataChunk = (headId & 0x001F) | ((clustId & 0x001F) << 5);
|
||||
FrameInsertChunk(&bitarr, BM_MSG_NETMG_ADDR_OFFSET, BM_MSG_NETMG_ADDR_LEN, dataChunk);
|
||||
|
||||
/* time unit number */
|
||||
dataChunk = time / L2_SLOTS_PER_FRAME;
|
||||
FrameInsertChunk(&bitarr, BM_MSG_TUNIT_NUM_OFFSET, BM_MSG_TUNIT_NUM_LEN, dataChunk);
|
||||
|
||||
/* frame number */
|
||||
dataChunk = (time % L2_SLOTS_PER_FRAME) / L2_SLOTS_PER_SUBFRAME;
|
||||
FrameInsertChunk(&bitarr, BM_MSG_TFRAME_NUM_OFFSET, BM_MSG_TFRAME_NUM_LEN, dataChunk);
|
||||
|
||||
/* mini slot number, 20 mini slots per frame. */
|
||||
dataChunk = time % L2_SLOTS_PER_SUBFRAME;
|
||||
FrameInsertChunk(&bitarr, BM_MSG_TSLOT_NUM_OFFSET, BM_MSG_TSLOT_NUM_LEN, dataChunk);
|
||||
|
||||
// Append CRC
|
||||
L2_CrcAppend(bmTemplate, BM_MSG_CRC_OFFSET / 8, BM_MSG_CRC_OFFSET / 8, L2_CRC8_31);
|
||||
}
|
||||
|
||||
void forge_w2acq_frame(L2_NODE_TYPE nodeType, uint16_t srcId, uint16_t destId,
|
||||
uint16_t clustId, uint32_t netStartTime, L2_NODE_STATE state) {
|
||||
BIT_ARRAY bitarr = {
|
||||
.words = (uint64_t*)w2acqTemplate,
|
||||
.num_of_bits = INTRA_W2ACQ_FRAME_LENGTH_MAX*8,
|
||||
.num_of_words = roundup_bits2words64(INTRA_W2ACQ_FRAME_LENGTH_MAX*8),
|
||||
.capacity_in_words = roundup_bits2words64(INTRA_W2ACQ_FRAME_LENGTH_MAX*8),
|
||||
};
|
||||
uint64_t dataChunk;
|
||||
/* message type */
|
||||
dataChunk = (nodeType == HEAD_NODE) ? 0 : 1;
|
||||
FrameInsertChunk(&bitarr, NS_MSG_INI_TYPE_OFFSET, NS_MSG_INI_TYPE_LEN, dataChunk);
|
||||
|
||||
/* source node id */
|
||||
dataChunk = (srcId & 0x001F) | ((clustId & 0x001F) << 5);
|
||||
FrameInsertChunk(&bitarr, NS_MSG_INI_SRC_ADDR_OFFSET, NS_MSG_INI_SRC_ADDR_LEN, dataChunk);
|
||||
|
||||
/* destination node id */
|
||||
dataChunk = (destId & 0x001F) | ((clustId & 0x001F) << 5);
|
||||
FrameInsertChunk(&bitarr, NS_MSG_INI_LEN_OFFSET, NS_MSG_INI_LEN_LEN, dataChunk);
|
||||
/* current net stage */
|
||||
switch (state) {
|
||||
case INIT_STATE:
|
||||
dataChunk = NET_INI_STAGE;
|
||||
break;
|
||||
case SEEK_STATE:
|
||||
dataChunk = NET_INTER_SEEK_STAGE;
|
||||
break;
|
||||
case NORMAL_STATE:
|
||||
dataChunk = NET_NORMAL_STAGE;
|
||||
break;
|
||||
default:
|
||||
dataChunk = NET_ERROR_STAGE;
|
||||
break;
|
||||
}
|
||||
FrameInsertChunk(&bitarr, NS_MSG_INI_NET_STAGE_OFFSET, NS_MSG_INI_NET_STAGE_LEN, dataChunk);
|
||||
|
||||
// Begin Scan Time Word
|
||||
dataChunk = netStartTime;
|
||||
FrameInsertChunk(&bitarr, NS_MSG_INI_SCAN_TIME_OFFSET, NS_MSG_INI_SCAN_TIME_LEN, dataChunk);
|
||||
|
||||
// Update CRC
|
||||
L2_CrcAppend(w2acqTemplate, W2ACQ_FRAME_CRC_DLEN, W2ACQ_FRAME_CRC_POS, L2_CRC16_8005);
|
||||
}
|
||||
|
||||
void forge_mgmt_frame(L2_NODE_STATE state) {
|
||||
BIT_ARRAY bitarr = {
|
||||
.words = (uint64_t*)mgmtTemplate,
|
||||
.num_of_bits = INTRA_MGMT_FRAME_LENGTH_MAX*8,
|
||||
.num_of_words = roundup_bits2words64(INTRA_MGMT_FRAME_LENGTH_MAX*8),
|
||||
.capacity_in_words = roundup_bits2words64(INTRA_MGMT_FRAME_LENGTH_MAX*8),
|
||||
};
|
||||
uint64_t dataChunk;
|
||||
switch (state) {
|
||||
case INIT_STATE:
|
||||
dataChunk = NET_INI_STAGE;
|
||||
break;
|
||||
case NORMAL_STATE:
|
||||
dataChunk = NET_NORMAL_STAGE;
|
||||
break;
|
||||
case INTRA_SEEK_STATE:
|
||||
dataChunk = NET_INTRA_SEEK_STAGE;
|
||||
break;
|
||||
case INTER_SEEK_STATE:
|
||||
dataChunk = NET_INTER_SEEK_STAGE;
|
||||
break;
|
||||
case SEEK_STATE:
|
||||
dataChunk = NET_SEEK_STAGE;
|
||||
break;
|
||||
default:
|
||||
dataChunk = NET_ERROR_STAGE;
|
||||
break;
|
||||
FrameInsertChunk(&bitarr, TK_MSG_INI_NET_STATE_OFFSET, TK_MSG_INI_NET_STATE_LEN, dataChunk);
|
||||
}
|
||||
}
|
||||
|
||||
void forge_rtt_frame(L2_INST* instPtr) {
|
||||
return;
|
||||
}
|
||||
|
||||
TEST(linklayer_master_routine) {
|
||||
int32_t Status;
|
||||
Linklayer_Start(linkInstPtr);
|
||||
// 30 seconds
|
||||
for(int i = 0; i < 200*30; i++) {
|
||||
tmcReg[TIME_INT_REG]++;
|
||||
|
||||
if(phyInstPtr->TOR.last == PHY_TOR_RX && linkInstPtr->frame.last == L2_INTRA_W2_ACQ_FRAME)
|
||||
|
||||
Phy_UpdateState(phyInstPtr);
|
||||
|
||||
Status = Linklayer_Proc(linkInstPtr);
|
||||
|
||||
if(tmcReg[TIME_INT_REG]/200 < linkInstPtr->netStartTime) {
|
||||
ASSERT_EQUAL(EIGNORE, Status);
|
||||
}
|
||||
else{
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TEST(linklayer_reconfig) {
|
||||
int32_t Status;
|
||||
Status = Linklayer_Reconfig(linkInstPtr, &l2Config);
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
}
|
||||
|
||||
TEST_SUITE(linklayer_unit_test) {
|
||||
TEST_SUITE_CONFIGURE(linklayer_setup, linklayer_teardown);
|
||||
RUN_TEST(linklayer_master_routine);
|
||||
RUN_TEST(linklayer_reconfig);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
RUN_TEST_SUITE(linklayer_unit_test);
|
||||
TEST_REPORT();
|
||||
return TEST_EXIT_CODE;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include "error.h"
|
||||
#include "unit_test_framework.h"
|
||||
#include "time_ctrl/time_ctrl.h"
|
||||
|
||||
#define HARDWARE_VERSION 0x00000001
|
||||
#define MAX_OPT_DELAY 100 // 1us = 100*10ns
|
||||
|
||||
|
||||
TIMECTRL_CONFIG tmcConfig = {
|
||||
.baseAddr = 0/*TODO: fill withe real base address*/,
|
||||
.reset = 10
|
||||
};
|
||||
|
||||
TIMECTRL_INST* tmcInstPtr = NULL;
|
||||
|
||||
void tmc_setup(void){
|
||||
int32_t Status;
|
||||
Status = TimeCtrl_Init(&tmcInstPtr, &tmcConfig);
|
||||
ASSERT_TRUE(SUCCESS == Status);
|
||||
}
|
||||
|
||||
void tmc_teardown(void){
|
||||
TimeCtrl_Destroy(tmcInstPtr);
|
||||
}
|
||||
|
||||
TEST(tmc_version) {
|
||||
ASSERT_EQUAL(HARDWARE_VERSION, TimeCtrl_GetVersion(tmcInstPtr));
|
||||
return;
|
||||
}
|
||||
|
||||
TEST(tmc_read_time) {
|
||||
TIME_WORD timeStamp;
|
||||
TIME_INT timeH;
|
||||
TIME_FRAC timeL;
|
||||
|
||||
// Test time stamp read operation
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStamp);
|
||||
timeH = TimeCtrl_GetIntCnt(tmcInstPtr);
|
||||
timeL = TimeCtrl_GetFracCnt(tmcInstPtr);
|
||||
if(timeL >= timeStamp.frac_part) {
|
||||
ASSERT_EQUAL(timeH, timeStamp.int_part);
|
||||
ASSERT_TRUE(timeL - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
else {
|
||||
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
||||
ASSERT_TRUE(timeL + COUNTE_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(tmc_reset) {
|
||||
TIME_WORD timeStamp;
|
||||
|
||||
TimeCtrl_Reset(tmcInstPtr);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStamp);
|
||||
ASSERT_EQUAL(0, timeStamp.int_part);
|
||||
ASSERT_TRUE(timeStamp.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
|
||||
TEST(tmc_adjustment) {
|
||||
TIME_WORD timeStampPre, timeStampPost, timeAdj;
|
||||
|
||||
// Adjustment -- set
|
||||
timeAdj.frac_part = 0;
|
||||
timeAdj.int_part = 0x00000203;
|
||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part);
|
||||
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
||||
|
||||
timeAdj.frac_part = COUNTE_FRAC_MAX;
|
||||
timeAdj.int_part = 0x00000203;
|
||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||
ASSERT_EQUAL(timeAdj.int_part, timeStampPost.int_part+1);
|
||||
ASSERT_TRUE(timeStampPost.frac_part < MAX_OPT_DELAY);
|
||||
|
||||
timeAdj.frac_part = COUNTE_FRAC_MAX*2;
|
||||
timeAdj.int_part = 0x00000203;
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_SET);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||
if(timeStampPost.frac_part >= timeStampPre.frac_part) {
|
||||
ASSERT_EQUAL(timeStampPost.int_part, timeStampPre.int_part);
|
||||
ASSERT_TRUE(timeStampPost.frac_part - timeStampPre.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
else {
|
||||
ASSERT_EQUAL(timeStampPost.int_part, timeStampPre.int_part + 1);
|
||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
|
||||
// Adjustment -- add
|
||||
timeAdj.frac_part = 253;
|
||||
timeAdj.int_part = 253;
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||
if(timeStampPre.frac_part + timeAdj.frac_part > COUNTE_FRAC_MAX) {
|
||||
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part
|
||||
< MAX_OPT_DELAY + timeAdj.frac_part);
|
||||
}
|
||||
|
||||
timeAdj.frac_part = -253;
|
||||
timeAdj.int_part = -253;
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPre);
|
||||
TimeCtrl_TimeAdjust(tmcInstPtr, &timeAdj, TM_ADJ_ADD);
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStampPost);
|
||||
if(timeStampPre.frac_part + timeAdj.frac_part > COUNTE_FRAC_MAX) {
|
||||
ASSERT_TRUE(timeStampPost.int_part <= timeStampPre.int_part + timeAdj.int_part + 2);
|
||||
ASSERT_TRUE(timeStampPost.frac_part + COUNTE_FRAC_MAX - timeStampPre.frac_part
|
||||
< MAX_OPT_DELAY + timeAdj.frac_part);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(tmc_setopt) {
|
||||
// TODO:
|
||||
return;
|
||||
}
|
||||
|
||||
TEST_SUITE(tmc_unit_test) {
|
||||
TEST_SUITE_CONFIGURE(tmc_setup, tmc_teardown);
|
||||
RUN_TEST(tmc_version);
|
||||
RUN_TEST(tmc_read_time);
|
||||
RUN_TEST(tmc_reset);
|
||||
RUN_TEST(tmc_adjustment);
|
||||
RUN_TEST(tmc_setopt);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
RUN_TEST_SUITE(tmc_unit_test);
|
||||
TEST_REPORT();
|
||||
return TEST_EXIT_CODE;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
#include <stdint.h>
|
||||
#include <math.h>
|
||||
#include "error.h"
|
||||
#include "unit_test_framework.h"
|
||||
#include "time_ctrl/time_ctrl.h"
|
||||
|
||||
#define HARDWARE_VERSION 0x00000001
|
||||
#define TIMER_H 0x00253253
|
||||
#define TIMER_L 0x00225533
|
||||
#define MAX_OPT_DELAY 100 // 1us = 100*10ns
|
||||
|
||||
uint32_t tmcReg[32] = {0};
|
||||
|
||||
TIMECTRL_CONFIG tmcConfig = {
|
||||
.baseAddr = 0,
|
||||
.reset = 10
|
||||
};
|
||||
|
||||
TIMECTRL_INST* tmcInstPtr = NULL;
|
||||
|
||||
void tmc_setup(void){
|
||||
int32_t Status;
|
||||
tmcReg[1] = HARDWARE_VERSION; // Version
|
||||
tmcReg[2] = 253; // Int
|
||||
tmcReg[3] = 253; // Frac
|
||||
tmcReg[4] = 0; // Reset
|
||||
tmcReg[5] = 0; // Preset H
|
||||
tmcReg[6] = 0; // Preset L
|
||||
tmcReg[7] = 0; // Adjustment H
|
||||
tmcReg[8] = 0; // Adjustment L
|
||||
tmcReg[9] = 0; // Adjustment Trigger
|
||||
tmcReg[10] = 0; // step opt
|
||||
tmcConfig.baseAddr = (uintptr_t)tmcReg;
|
||||
Status = TimeCtrl_Init(&tmcInstPtr, &tmcConfig);
|
||||
ASSERT_EQUAL(SUCCESS, Status);
|
||||
}
|
||||
|
||||
void tmc_teardown(void){
|
||||
TimeCtrl_Destroy(tmcInstPtr);
|
||||
}
|
||||
|
||||
TEST(tmc_version) {
|
||||
ASSERT_EQUAL(HARDWARE_VERSION, TimeCtrl_GetVersion(tmcInstPtr));
|
||||
return;
|
||||
}
|
||||
|
||||
TEST(tmc_basic_operations) {
|
||||
TIME_WORD timeStamp;
|
||||
TIME_INT timeH;
|
||||
TIME_FRAC timeL;
|
||||
TimeCtrl_GetCurrentTime(tmcInstPtr, &timeStamp);
|
||||
timeH = TimeCtrl_GetIntCnt(tmcInstPtr);
|
||||
timeL = TimeCtrl_GetFracCnt(tmcInstPtr);
|
||||
if(timeL >= timeStamp.frac_part) {
|
||||
ASSERT_EQUAL(timeH, timeStamp.int_part);
|
||||
ASSERT_TRUE(timeL - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
else {
|
||||
ASSERT_EQUAL(timeH, timeStamp.int_part+1);
|
||||
ASSERT_TRUE(timeL + COUNTE_FRAC_MAX - timeStamp.frac_part < MAX_OPT_DELAY);
|
||||
}
|
||||
|
||||
TIME_FRAC stepOpt;
|
||||
stepOpt = 0x00000253;
|
||||
TimeCtrl_SetOptimizeStep(tmcInstPtr, &stepOpt);
|
||||
TimeCtrl_GetCurrentStep(tmcInstPtr, &stepOpt);
|
||||
ASSERT_EQUAL(0x00000253, stepOpt);
|
||||
TimeCtrl_Reset(tmcInstPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
TEST_SUITE(tmc_unit_test) {
|
||||
TEST_SUITE_CONFIGURE(tmc_setup, tmc_teardown);
|
||||
RUN_TEST(tmc_version);
|
||||
RUN_TEST(tmc_basic_operations);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
RUN_TEST_SUITE(tmc_unit_test);
|
||||
TEST_REPORT();
|
||||
return TEST_EXIT_CODE;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
../../unit_test_framework.h
|
||||
Reference in New Issue
Block a user