summaryrefslogtreecommitdiff
path: root/loragw_hal/test
diff options
context:
space:
mode:
authorSylvain Miermont <smiermont@semtech.com>2013-09-19 15:46:06 +0200
committerSylvain Miermont <smiermont@semtech.com>2013-10-23 14:03:05 +0200
commitb922932d1c9869d82042b600db2382d8c15f63dc (patch)
treeb97b83a74f5b3faadb674867f6cc004b8426a8a9 /loragw_hal/test
parent68b8b7a70d9104888997174506fbbaa0abb12a4c (diff)
downloadlora_gateway-b922932d1c9869d82042b600db2382d8c15f63dc.tar.gz
lora_gateway-b922932d1c9869d82042b600db2382d8c15f63dc.tar.bz2
lora_gateway-b922932d1c9869d82042b600db2382d8c15f63dc.zip
Beta 7 (beta6 skipped)v1.b7
- API: change memory allocation for payload, they are now part of the struct for TX/RX, no need to malloc/free - reduced number of SPI transactions to fetch a packet (improved number a packets par second that can be downloaded from gateway) - streamlined build process, main target is now a static library: libloragw.a - All RX chains can use any of the two radios now - FSK is available and working in TX and RX (variable length mode) - Calibrated RSSI for FSK - lgw_connect now check the CHIP_ID - Added a license file and a changelog - Added a function returning a version string to allow identification of the version/options once compiled
Diffstat (limited to 'loragw_hal/test')
-rw-r--r--loragw_hal/test/test_loragw_hal.c266
-rw-r--r--loragw_hal/test/test_loragw_reg.c131
-rw-r--r--loragw_hal/test/test_loragw_spi.c81
3 files changed, 0 insertions, 478 deletions
diff --git a/loragw_hal/test/test_loragw_hal.c b/loragw_hal/test/test_loragw_hal.c
deleted file mode 100644
index f23f55c..0000000
--- a/loragw_hal/test/test_loragw_hal.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- / _____) _ | |
-( (____ _____ ____ _| |_ _____ ____| |__
- \____ \| ___ | (_ _) ___ |/ ___) _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
- ©2013 Semtech-Cycleo
-
-Description:
- Minimum test program for the loragw_hal 'library'
-*/
-
-
-/* -------------------------------------------------------------------------- */
-/* --- DEPENDANCIES --------------------------------------------------------- */
-
-/* fix an issue between POSIX and C99 */
-#if __STDC_VERSION__ >= 199901L
- #define _XOPEN_SOURCE 600
-#else
- #define _XOPEN_SOURCE 500
-#endif
-
-#include <stdint.h> /* C99 types */
-#include <stdlib.h> /* malloc & free */
-#include <stdbool.h> /* bool type */
-#include <stdio.h> /* printf */
-#include <string.h> /* memset */
-#include <signal.h> /* sigaction */
-
-#include "loragw_hal.h"
-#include "loragw_aux.h"
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE MACROS ------------------------------------------------------- */
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE VARIABLES ---------------------------------------------------- */
-
-static int exit_sig = 0; /* 1 -> application terminates cleanly (shut down hardware, close open files, etc) */
-static int quit_sig = 0; /* 1 -> application terminates without shutting down the hardware */
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE FUNCTIONS DECLARATION ---------------------------------------- */
-
-static void sig_handler(int sigio);
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */
-
-static void sig_handler(int sigio) {
- if (sigio == SIGQUIT) {
- quit_sig = 1;;
- } else if ((sigio == SIGINT) || (sigio == SIGTERM)) {
- exit_sig = 1;
- }
-}
-
-/* -------------------------------------------------------------------------- */
-/* --- MAIN FUNCTION -------------------------------------------------------- */
-
-int main(int argc, char **argv)
-{
- struct sigaction sigact; /* SIGQUIT&SIGINT&SIGTERM signal handling */
-
- struct lgw_conf_rxrf_s rfconf;
- struct lgw_conf_rxif_s ifconf;
-
- struct lgw_pkt_rx_s rxpkt[4]; /* array containing up to 4 inbound packets metadata */
- struct lgw_pkt_tx_s txpkt; /* configuration and metadata for an outbound packet */
- uint8_t txbuf[256]; /* buffer for the TX payload */
- struct lgw_pkt_rx_s *p; /* pointer on a RX packet */
-
- int i, j;
- int nb_pkt;
- uint8_t x;
-
- uint32_t tx_cnt = 0;
- unsigned long loop_cnt = 0;
- int tx_path = 0;
- struct lgw_pkt_tx_s txs;
- uint8_t status_var = 0;
-
- /* configure signal handling */
- sigemptyset(&sigact.sa_mask);
- sigact.sa_flags = 0;
- sigact.sa_handler = sig_handler;
- sigaction(SIGQUIT, &sigact, NULL);
- sigaction(SIGINT, &sigact, NULL);
- sigaction(SIGTERM, &sigact, NULL);
-
- /* beginning of Lora gateway-specific code */
- printf("Beginning of test for loragw_hal.c\n");
-
- /* set configuration for RF chains */
- memset(&rfconf, 0, sizeof(rfconf));
-
- rfconf.enable = true;
- rfconf.freq_hz = 866187500;
- lgw_rxrf_setconf(0, rfconf); /* radio A */
-
- rfconf.enable = true;
- rfconf.freq_hz = 866437500;
- lgw_rxrf_setconf(1, rfconf); /* radio B */
-
- /* set configuration for Lora multi-SF channels (bandwidth cannot be set) */
- memset(&ifconf, 0, sizeof(ifconf));
-
- ifconf.enable = true;
- ifconf.rf_chain = 0;
- ifconf.freq_hz = -187500;
- ifconf.bandwidth = BW_125KHZ;
- ifconf.datarate = DR_LORA_MULTI;
- lgw_rxif_setconf(0, ifconf); /* chain 0: 1st radio, bleeper channel 1, all SF */
-
- ifconf.enable = true;
- ifconf.rf_chain = 0;
- ifconf.freq_hz = -62500;
- ifconf.bandwidth = BW_125KHZ;
- ifconf.datarate = DR_LORA_SF8 | DR_LORA_SF10;
- lgw_rxif_setconf(1, ifconf); /* chain 1: 1st radio, bleeper channel 2, SF8 & SF10 only */
-
- ifconf.enable = false;
- ifconf.rf_chain = 0;
- ifconf.freq_hz = 0;
- ifconf.bandwidth = 0;
- ifconf.datarate = 0;
- lgw_rxif_setconf(2, ifconf); /* chain 2: 1st radio, disabled */
-
- ifconf.enable = true;
- ifconf.rf_chain = 1;
- ifconf.freq_hz = -187500;
- ifconf.bandwidth = BW_125KHZ;
- ifconf.datarate = DR_LORA_MULTI;
- lgw_rxif_setconf(3, ifconf); /* chain 3: 2nd radio, bleeper channel 3, all SF */
-
- /* set configuration for Lora 'stand alone' channel */
- ifconf.enable = true;
- ifconf.rf_chain = 0;
- ifconf.freq_hz = 187500;
- ifconf.bandwidth = BW_125KHZ;
- ifconf.datarate = DR_LORA_SF10;
- lgw_rxif_setconf(8, ifconf); /* chain 8: bleeper channel 4, SF10 only */
-
-
- /* load the TX payload */
- strcpy((char *)txbuf, "TX.TEST.LORA.GW.????" );
-
- /* set configuration for TX packet */
- memset(&txs, 0, sizeof(txs));
- txs.freq_hz = 866250000;
- txs.tx_mode = IMMEDIATE;
- txs.modulation = MOD_LORA;
- txs.bandwidth = BW_250KHZ;
- txs.datarate = DR_LORA_SF10;
- txs.coderate = CR_LORA_4_5;
- txs.payload = txbuf;
- txs.size = 20;
- txs.rf_chain = 1;
-
- /* connect, configure and start the Lora gateway */
- lgw_start();
-
- while ((quit_sig != 1) && (exit_sig != 1)) {
- loop_cnt++;
-
- /* fetch N packets */
- nb_pkt = lgw_receive(ARRAY_SIZE(rxpkt), rxpkt);
-
- if (nb_pkt == 0) {
- wait_ms(300);
- } else {
- printf("\nLora gateway, %d packets received:\n\n", nb_pkt);
- /* display received packets */
- for(i=0; i < nb_pkt; ++i) {
- p = &rxpkt[i];
- printf("---\nPkt #%d >>", i+1);
- if (p->status == STAT_CRC_OK) {
- printf(" if_chain:%2d", p->if_chain);
- printf(" tstamp:%010u", p->count_us);
- printf(" size:%3u", p->size);
- switch (p-> modulation) {
- case MOD_LORA: printf(" Lora"); break;
- case MOD_FSK: printf(" FSK"); break;
- case MOD_GFSK: printf(" GFSK"); break;
- default: printf(" modulation?");
- }
- switch (p->datarate) {
- case DR_LORA_SF7: printf(" SF7"); break;
- case DR_LORA_SF8: printf(" SF8"); break;
- case DR_LORA_SF9: printf(" SF9"); break;
- case DR_LORA_SF10: printf(" SF10"); break;
- case DR_LORA_SF11: printf(" SF11"); break;
- case DR_LORA_SF12: printf(" SF12"); break;
- default: printf(" datarate?");
- }
- switch (p->coderate) {
- case CR_LORA_4_5: printf(" CR1(4/5)"); break;
- case CR_LORA_4_6: printf(" CR2(2/3)"); break;
- case CR_LORA_4_7: printf(" CR3(4/7)"); break;
- case CR_LORA_4_8: printf(" CR4(1/2)"); break;
- default: printf(" coderate?");
- }
- printf("\n");
- printf(" RSSI:%+6.1f SNR:%+5.1f (min:%+5.1f, max:%+5.1f) payload:\n", p->rssi, p->snr, p->snr_min, p->snr_max);
- for (j = 0; j < p->size; ++j) {
- printf(" %02X", p->payload[j]);
- }
- printf(" #\n");
- } else if (p->status == STAT_CRC_BAD) {
- printf(" if_chain:%2d", p->if_chain);
- printf(" tstamp:%010u", p->count_us);
- printf(" size:%3u\n", p->size);
- printf(" CRC error, damaged packet\n\n");
- } else if (p->status == STAT_NO_CRC){
- printf(" if_chain:%2d", p->if_chain);
- printf(" tstamp:%010u", p->count_us);
- printf(" size:%3u\n", p->size);
- printf(" no CRC\n\n");
- } else {
- printf(" if_chain:%2d", p->if_chain);
- printf(" tstamp:%010u", p->count_us);
- printf(" size:%3u\n", p->size);
- printf(" invalid status ?!?\n\n");
- }
- }
-
- /* free the memory used for RX payload(s) */
- for(i=0; i < nb_pkt; ++i) {
- free(rxpkt[i].payload);
- }
- }
-
- /* send a packet every X loop */
- if (loop_cnt%16 == 0) {
- /* 32b counter in the payload, big endian */
- txbuf[16] = 0xff & (tx_cnt >> 24);
- txbuf[17] = 0xff & (tx_cnt >> 16);
- txbuf[18] = 0xff & (tx_cnt >> 8);
- txbuf[19] = 0xff & tx_cnt;
- i = lgw_send(txs); /* non-blocking scheduling of TX packet */
- j = 0;
- printf("Sending packet #%d, rf path %d, return %d\nstatus -> ", tx_cnt, txs.rf_chain, i);
- do {
- ++j;
- wait_ms(100);
- lgw_status(TX_STATUS, &status_var); /* get TX status */
- printf("%d:", status_var);
- } while ((status_var != TX_FREE) && (j < 100));
- ++tx_cnt;
- printf("\nTX finished\n");
- }
- }
-
- if (exit_sig == 1) {
- /* clean up before leaving */
- lgw_stop();
- }
-
- printf("\nEnd of test for loragw_hal.c\n");
- return 0;
-}
-
-/* --- EOF ------------------------------------------------------------------ */
diff --git a/loragw_hal/test/test_loragw_reg.c b/loragw_hal/test/test_loragw_reg.c
deleted file mode 100644
index 2b80109..0000000
--- a/loragw_hal/test/test_loragw_reg.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- / _____) _ | |
-( (____ _____ ____ _| |_ _____ ____| |__
- \____ \| ___ | (_ _) ___ |/ ___) _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
- ©2013 Semtech-Cycleo
-
-Description:
- Minimum test program for the loragw_spi 'library'
-*/
-
-
-/* -------------------------------------------------------------------------- */
-/* --- DEPENDANCIES --------------------------------------------------------- */
-
-#include <stdint.h>
-#include <stdio.h>
-
-#include "loragw_reg.h"
-
-/* -------------------------------------------------------------------------- */
-/* --- MAIN FUNCTION -------------------------------------------------------- */
-
-#define BURST_TEST_LENGTH 8192
-
-int main(int argc, char **argv)
-{
- int32_t read_value, test_value;
- uint16_t lfsr;
- uint8_t burst_buffout[BURST_TEST_LENGTH];
- uint8_t burst_buffin[BURST_TEST_LENGTH];
- int i;
-
- printf("Beginning of test for loragw_reg.c\n");
-
- lgw_connect();
- /* 2 SPI transactions:
- -> 0x80 0x00 <- 0x00 0x00 forcing page 0
- -> 0x01 0x00 <- 0x00 0x64 checking version
- */
-
- /* --- READ TEST --- */
-
- lgw_reg_w(LGW_SOFT_RESET, 1);
- lgw_reg_check(stdout);
-
- /* --- READ/WRITE COHERENCY TEST --- */
-
- /* 8b unsigned */
- test_value = 197; /* 11000101b */
- lgw_reg_w(LGW_IMPLICIT_PAYLOAD_LENGHT, test_value);
- lgw_reg_r(LGW_IMPLICIT_PAYLOAD_LENGHT, &read_value);
- printf("IMPLICIT_PAYLOAD_LENGHT = %d (should be %d)\n", read_value, test_value);
-
- /* 8b signed */
- /* NO SUCH REG AVAILABLE */
- // /* RADIO_SELECT is normally unsigned, modify it manually in loragw_reg.c */
- // test_value = -59; /* 11000101b */
- // lgw_reg_w(LGW_RADIO_SELECT, test_value);
- // lgw_reg_r(LGW_RADIO_SELECT, &read_value);
- // printf("RADIO_SELECT = %d (should be %d)\n", read_value, test_value);
-
- /* less than 8b, with offset, unsigned */
- test_value = 11; /* 1011b */
- lgw_reg_w(LGW_FRAME_SYNCH_PEAK2_POS, test_value);
- lgw_reg_r(LGW_FRAME_SYNCH_PEAK2_POS, &read_value);
- printf("FRAME_SYNCH_PEAK2_POS = %d (should be %d)\n", read_value, test_value);
-
- /* less than 8b, with offset, signed */
- /* NO SUCH REG AVAILABLE */
- // /* MBWSSF_FRAME_SYNCH_PEAK2_POS is normally unsigned, modify it manually in loragw_reg.c */
- // test_value = -5; /* 1011b */
- // lgw_reg_w(LGW_MBWSSF_FRAME_SYNCH_PEAK2_POS, test_value);
- // lgw_reg_r(LGW_MBWSSF_FRAME_SYNCH_PEAK2_POS, &read_value);
- // printf("MBWSSF_FRAME_SYNCH_PEAK2_POS = %d (should be %d)\n", read_value, test_value);
-
- /* 16b unsigned */
- test_value = 49253; /* 11000000 01100101b */
- lgw_reg_w(LGW_PREAMBLE_SYMB1_NB, test_value);
- lgw_reg_r(LGW_PREAMBLE_SYMB1_NB, &read_value);
- printf("PREAMBLE_SYMB1_NB = %d (should be %d)\n", read_value, test_value);
-
- /* 16b signed */
- /* NO SUCH REG AVAILABLE */
- // /* CAPTURE_PERIOD is normally unsigned, modify it manually in loragw_reg.c */
- // test_value = -16283; /* 11000000 01100101b */
- // lgw_reg_w(LGW_CAPTURE_PERIOD, test_value);
- // lgw_reg_r(LGW_CAPTURE_PERIOD, &read_value);
- // printf("CAPTURE_PERIOD = %d (should be %d)\n", read_value, test_value);
-
- /* between 8b and 16b, unsigned */
- test_value = 3173; /* 1100 01100101b */
- lgw_reg_w(LGW_ADJUST_MODEM_START_OFFSET_SF12_RDX4, test_value);
- lgw_reg_r(LGW_ADJUST_MODEM_START_OFFSET_SF12_RDX4, &read_value);
- printf("ADJUST_MODEM_START_OFFSET_SF12_RDX4 = %d (should be %d)\n", read_value, test_value);
-
- /* between 8b and 16b, signed */
- test_value = -1947; /* 11000 01100101b */
- lgw_reg_w(LGW_IF_FREQ_1, test_value);
- lgw_reg_r(LGW_IF_FREQ_1, &read_value);
- printf("IF_FREQ_1 = %d (should be %d)\n", read_value, test_value);
-
- /* --- BURST WRITE AND READ TEST --- */
-
- /* initialize data for SPI test */
- lfsr = 0xFFFF;
- for(i=0; i<BURST_TEST_LENGTH; ++i) {
- burst_buffout[i] = (uint8_t)(lfsr ^ (lfsr >> 4));
- /* printf("%05d # 0x%04x 0x%02x\n", i, lfsr, burst_buffout[i]); */
- lfsr = (lfsr & 1) ? ((lfsr >> 1) ^ 0x8679) : (lfsr >> 1);
- }
-
- lgw_reg_wb(LGW_TX_DATA_BUF_DATA, burst_buffout, 256);
- lgw_reg_rb(LGW_RX_DATA_BUF_DATA, burst_buffin, 256);
-
- /* impossible to check in software,
- RX_DATA_BUF_DATA is read-only,
- TX_DATA_BUF_DATA is write only,
- use a logic analyser */
-
- /* --- END OF TEST --- */
-
- lgw_disconnect();
- /* no SPI transaction */
-
- printf("End of test for loragw_reg.c\n");
- return 0;
-}
-
-/* --- EOF ------------------------------------------------------------------ */
diff --git a/loragw_hal/test/test_loragw_spi.c b/loragw_hal/test/test_loragw_spi.c
deleted file mode 100644
index 0eae55d..0000000
--- a/loragw_hal/test/test_loragw_spi.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- / _____) _ | |
-( (____ _____ ____ _| |_ _____ ____| |__
- \____ \| ___ | (_ _) ___ |/ ___) _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
- ©2013 Semtech-Cycleo
-
-Description:
- Minimum test program for the loragw_spi 'library'
- Use logic analyser to check the results.
-*/
-
-
-/* -------------------------------------------------------------------------- */
-/* --- DEPENDANCIES --------------------------------------------------------- */
-
-#include <stdint.h>
-#include <stdio.h>
-
-#include "loragw_spi.h"
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE MACROS ------------------------------------------------------- */
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
-/* -------------------------------------------------------------------------- */
-/* --- PRIVATE CONSTANTS ---------------------------------------------------- */
-
-#define BURST_TEST_SIZE 2500 /* >> LGW_BURST_CHUNK */
-#define TIMING_REPEAT 1 /* repeat transactions multiple times for timing characterisation */
-
-/* -------------------------------------------------------------------------- */
-/* --- MAIN FUNCTION -------------------------------------------------------- */
-
-int main(int argc, char **argv)
-{
- int i;
- void *spi_target = NULL;
- uint8_t data = 0;
- uint8_t dataout[BURST_TEST_SIZE];
- uint8_t datain[BURST_TEST_SIZE];
-
- for (i = 0; i < BURST_TEST_SIZE; ++i) {
- dataout[i] = 0x30 + (i % 10); /* ASCCI code for 0 -> 9 */
- datain[i] = 0x23; /* garbage data, to be overwritten by received data */
- }
-
- printf("Beginning of test for loragw_spi.c\n");
- lgw_spi_open(&spi_target);
-
- /* normal R/W test */
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_w(spi_target, 0xAA, 0x96);
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_r(spi_target, 0x55, &data);
-
- /* burst R/W test, small bursts << LGW_BURST_CHUNK */
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_wb(spi_target, 0x55, dataout, 16);
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_rb(spi_target, 0x55, datain, 16);
-
- /* burst R/W test, large bursts >> LGW_BURST_CHUNK */
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_wb(spi_target, 0x5A, dataout, ARRAY_SIZE(dataout));
- for (i = 0; i < TIMING_REPEAT; ++i)
- lgw_spi_rb(spi_target, 0x5A, datain, ARRAY_SIZE(datain));
-
- /* last read (blocking), just to be sure no to quit before the FTDI buffer is flushed */
- lgw_spi_r(spi_target, 0x55, &data);
- printf("data received (simple read): %d\n",data);
-
- lgw_spi_close(spi_target);
- printf("End of test for loragw_spi.c\n");
-
- return 0;
-}
-
-/* --- EOF ------------------------------------------------------------------ */