diff options
author | Sylvain Miermont <smiermont@semtech.com> | 2013-09-19 15:46:06 +0200 |
---|---|---|
committer | Sylvain Miermont <smiermont@semtech.com> | 2013-10-23 14:03:05 +0200 |
commit | b922932d1c9869d82042b600db2382d8c15f63dc (patch) | |
tree | b97b83a74f5b3faadb674867f6cc004b8426a8a9 /loragw_hal/test | |
parent | 68b8b7a70d9104888997174506fbbaa0abb12a4c (diff) | |
download | lora_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.c | 266 | ||||
-rw-r--r-- | loragw_hal/test/test_loragw_reg.c | 131 | ||||
-rw-r--r-- | loragw_hal/test/test_loragw_spi.c | 81 |
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 ------------------------------------------------------------------ */ |