diff --git a/include/main.h b/include/main.h index f154185..7d5997d 100644 --- a/include/main.h +++ b/include/main.h @@ -3,8 +3,8 @@ #include "aprs/ax25.h" -#define SW_VER "DC03" -#define SW_DATE "07072019" +#define SW_VER "DE00" +#define SW_DATE "21082019" #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 diff --git a/include/sr9nci.config b/include/sr9nci.config new file mode 100644 index 0000000..c070aeb --- /dev/null +++ b/include/sr9nci.config @@ -0,0 +1,118 @@ +/* + * config.h + * + * Created on: 03.07.2017 + * Author: mateusz + */ + +#ifndef STATION_CONFIG_H_ +#define STATION_CONFIG_H_ + +// Only for debugging +//#define _DBG_TRACE + +// Uncomment to enable all meteo functionality. TX20 anemometer, dallas termometer, MS5611 pressure sens +//#define _METEO +#define _DIGI // Comment this do disable WIDE1-1 digipeating +#define _DIGI_ONLY_789 + +//#define _DALLAS_AS_TELEM +//#define _VICTRON + +//#define _MUTE_RF // TODO: Not yet implemented - This will make station RXonly and disable all data transmission +//#define _MUTE_OWN // TODO: Not yet implemented - This will disable all self-generated packets (wx, telemetry, beacon) + // and switch device to "pure" kiss TNC operation. Packets from PC will be transmitted normally. + +// Coordines should be in APRS decimal format DDDMM.SS for Longitude and DDMM.SS for latitude +#define _CALL "SR9NCI" +#define _SSID 0 +#define _LAT 4944.22 +#define _LATNS 'N' +#define _LON 01838.20 +#define _LONWE 'E' +#define _COMMENT "DigiW1 - SSID789 only - TXP 500mW @ Slask Ciesynski by SP8EBC" + +// 49°44.22' N 18°38.20' + +// You can use only one of these below defines to choose symbol. Meteo data are are always transmitted with blue WX symbol +//#define _SYMBOL_DIGI // uncomment if you want digi symbol(green star with D inside) +#define _SYMBOL_WIDE1_DIGI // uncomment if you want 'little' digi symbol (green star with digit 1 overlaid) +//#define _SYMBOL_HOUSE // uncomment if you want house symbol +//#define _SYMBOL_RXIGATE // uncomment if you want rxigate symbol (black diamond with R) +//#define _SYMBOL_IGATE // uncomment if you want igate symol (black diamond with I) + +// Or you can keep commented all symbol defines and choose custom one based on data from APRS symbols table +//#define _SYMBOL_F '/' +//#define _SYMBOL_S '#' + +// Uncomment one of these two defines to choose what path You want. If you uncommend both of them or +// if you keep both commended path will be completely disabled. CALL-S>AKLPRZ:data +//#define _WIDE1_PATH // CALL-S>AKLPRZ,WIDE1-1:data +#define _WIDE21_PATH // CALL-S>AKLPRZ,WIDE2-1:data + +// Comment this to disable beacon auto sending during startup (this can be risky if RF feedback occur) +#define _BCN_ON_STARTUP + +#define _WX_INTERVAL 4 // WX packet interval in minutes +#define _BCN_INTERVAL 15 // Own beacon interval in minutes + +//#define _PTT_PUSHPULL // Uncomment this if you want PTT line to work as Push-pull instead of Open Drain +#define _SERIAL_BAUDRATE 9600 + +// Transmitting delay +#define _DELAY_BASE 19 // * 50ms. For example setting 10 gives 500msec delay. Maximum value is 20 +//#define _RANDOM_DELAY // adds random delay TO fixed time set by _DELAY_BASE. This additional time can be + // from 100ms up to 1 sec in 100ms steps. Values are drawn from samples going from ADC + // so it is better to use Unsquelched output in radio to provide much more randomness +//After waiting time declared above ParaTNC will check DCD (Data Carrier Detect) flag, which works as some +//kind of semaphore. If radio channel is not occupied by any other transmission TX will be keyed up immediately, +//otherwise software will wait for clear conditions. + +// Few IMPORTANT hints about setting transmit delay properly. +// +// Transmit delay is key parameter to maintain RF network free from packet losses and collisions. If your station will be +// installed on tall object, without any other digi's close to it, you can set _DELAY_BASE to very low value and disable +// _RANDOM_DELAY. If you wanna rather auxiliary station, witch should only fill gap in RF coverage in small area, then +// _DELAY_BASE parameter should be not less than 12 (600msec), the smallest range the higher _DELAY_BASE should be. +// Additionally for gapfillers (auxiliary stations) _RANDOM_DELAY schould be enabled. +// +// This delay will ensure that while other station will be transmitting repeated packets from mobile, Yours will keep +// always quiet and won't jam RF network. This greatly improve DCD based access to channel. Various controllers uses +// various lenght of preamble, some of them produce signal which might be impossible to decode by ParaTNC, so DCD +// is only one part of effective multiaccess to medium. + + +// Do not touch this +#if defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '/' +#define _SYMBOL_S '#' +#elif !defined (_SYMBOL_DIGI) && defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '1' +#define _SYMBOL_S '#' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F '/' +#define _SYMBOL_S '-' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && defined (_SYMOL_RXIGATE) &&\ + !defined (_SYMBOL_IGATE) +#define _SYMBOL_F 'I' +#define _SYMBOL_S '&' +#elif !defined (_SYMBOL_DIGI) && !defined (_SYMBOL_WIDE1_DIGI) && !defined (_SYMBOL_HOUSE) && !defined (_SYMOL_RXIGATE) &&\ + defined (_SYMBOL_IGATE) +#define _SYMBOL_F 'R' +#define _SYMBOL_S '&' +#elif !defined (_SYMBOL_F) && !defined (_SYMBOL_S) +#error "Missing symbol configuration in station_config.h" +#elif defined (_SYMBOL_F) && defined (_SYMBOL_S) +#else +#error "Wrong symbol configuration in station_config.h" +#endif +#if defined (_METEO) && !defined (_DIGI) +#define _DIGI +#endif + + + +#endif /* STATION_CONFIG_H_ */ diff --git a/system/include/drivers/dallas.h b/system/include/drivers/dallas.h index c3d9c04..1dec9b8 100644 --- a/system/include/drivers/dallas.h +++ b/system/include/drivers/dallas.h @@ -14,6 +14,8 @@ extern "C" { #endif #include +#include "station_config.h" + extern volatile int delay_5us; @@ -22,6 +24,9 @@ extern volatile char timm; typedef struct DallasStruct { GPIO_TypeDef* GPIOx; /*!< GPIOx port to be used for I/O functions */ uint16_t GPIO_Pin; /*!< GPIO Pin to be used for I/O functions */ +#ifdef _DALLAS_SPLIT_PIN + uint16_t GPIO_Pin_input; +#endif uint32_t GPIO_Cnf; /*!< GPIO Pin to be used for I/O functions */ uint32_t GPIO_Mode; /*!< GPIO Pin to be used for I/O functions */ uint32_t input_term; diff --git a/system/src/drivers/dallas.c b/system/src/drivers/dallas.c index b7006a2..ec37c4f 100644 --- a/system/src/drivers/dallas.c +++ b/system/src/drivers/dallas.c @@ -28,6 +28,7 @@ void dallas_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint16_t GPIO_PinSource // GPIO_input.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOx, &GPIO_input); +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx = GPIOx; dallas.GPIO_Pin = GPIO_Pin; @@ -39,6 +40,25 @@ void dallas_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint16_t GPIO_PinSource dallas.input_term = 1 << dallas.shift; dallas.output_term = (1 << dallas.shift - 2) | (1 << dallas.shift); +#else + GPIO_InitTypeDef GPIO_input; + GPIO_InitTypeDef GPIO_output; + + GPIO_output.GPIO_Mode = GPIO_Mode_Out_OD; + GPIO_output.GPIO_Pin = GPIO_Pin; + GPIO_output.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_SetBits(GPIOx, GPIO_Pin); + + GPIO_input.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_input.GPIO_Pin = GPIO_Pin << 1; + GPIO_input.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOx, &GPIO_input); + + dallas.GPIOx = GPIOx; + dallas.GPIO_Pin = GPIO_Pin; + dallas.GPIO_Pin_input = GPIO_Pin << 1; +#endif + } void dallas_config_timer(void) { @@ -80,21 +100,25 @@ void dallas_deconfig_timer(void) { char dallas_reset(void) { // PULLING LINE LOW +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx->CRL &= dallas.clear_term; dallas.GPIOx->CRL |= dallas.output_term; +#endif dallas.GPIOx->BSRR |= (dallas.GPIO_Pin << 16); // line low delay_5us = 100; // delay 500us while (delay_5us != 0); // WAITING FOR SLAVE PRESENT PULSE dallas.GPIOx->BSRR |= (dallas.GPIO_Pin); // line high +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx->CRL &= dallas.clear_term; dallas.GPIOx->CRL |= dallas.input_term; +#endif delay_5us = 20; // delay 100us while (delay_5us != 0); // READING PIN STATE - if ((dallas.GPIOx->IDR & dallas.GPIO_Pin) == GPIO_Pin_6) { + if ((dallas.GPIOx->IDR & dallas.GPIO_Pin) == dallas.GPIO_Pin) { delay_5us = 100; // delay 500us while (delay_5us != 0); return -1; @@ -109,8 +133,10 @@ void __attribute__((optimize("O0"))) dallas_send_byte(char data) { char i; for (i = 0; i < 8; i++) { // PULLING LINE LOW +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx->CRL &= dallas.clear_term; dallas.GPIOx->CRL |= dallas.output_term; +#endif dallas.GPIOx->BSRR |= (dallas.GPIO_Pin << 16); // line low delay_5us = ((data >> i) & 0x01) ? 2 : 13; // delay 10us if sending logic "1", or 75us if "0" while (delay_5us != 0); @@ -129,17 +155,20 @@ char __attribute__((optimize("O0"))) dallas_receive_byte(void) { for (i = 0; i < 8; i++) { // PULLING LINE LOW +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx->CRL &= dallas.clear_term; dallas.GPIOx->CRL |= dallas.output_term; +#endif dallas.GPIOx->BSRR |= (dallas.GPIO_Pin << 16); // line low delay_5us = 2; // delay 10us while (delay_5us != 0); // PULLING LINE BACK HIGH dallas.GPIOx->BSRR |= (dallas.GPIO_Pin); // line high -// GPIO_Init(dallas.GPIOx, &GPIO_input); // przeroic!! +#ifndef _DALLAS_SPLIT_PIN dallas.GPIOx->CRL &= dallas.clear_term; dallas.GPIOx->CRL |= dallas.input_term; +#endif delay_5us = 1; // delay 10us while (delay_5us != 0);