kopia lustrzana https://github.com/SP8EBC/ParaTNC
some more refactoring inside tx20 driver
rodzic
a09532124b
commit
0ed71fceed
|
@ -1,3 +1,49 @@
|
|||
#define SW_VER "DE07"
|
||||
#define SW_DATE "23022020"
|
||||
|
||||
---
|
||||
|
||||
MEMORY USAGE METRICS:
|
||||
|
||||
Invoking: Cross ARM GNU Print Size
|
||||
arm-none-eabi-size --format=berkeley "ParaTNC.elf"
|
||||
text data bss dec hex filename
|
||||
51694 592 5732 58018 e2a2 ParaTNC.elf
|
||||
Finished building: ParaTNC.siz
|
||||
|
||||
---
|
||||
|
||||
CONFIGURATION USED DURING COMPILATION:
|
||||
|
||||
/* ------------------ */
|
||||
/* MODES OF OPERATION */
|
||||
|
||||
#define _METEO // Enable meteo station
|
||||
#define _DIGI // Enable WIDE1-1 digipeater
|
||||
//#define _DIGI_ONLY_789 // Limit digipeater to handle only -7, -8 and -9 SSIDs
|
||||
//#define _VICTRON // Enable support for Victron VE.Direct protocol
|
||||
//#define _UMB_MASTER
|
||||
|
||||
/* MODES OF OPERATION */
|
||||
/* ------------------ */
|
||||
|
||||
#define PARATNC_HWREV_A
|
||||
//#define PARATNC_HWREV_B
|
||||
|
||||
/* ---------------------------- */
|
||||
/* WEATHER/METEO CONFIGURATION */
|
||||
|
||||
//#define _DALLAS_AS_TELEM // Use Dallas one-wire thermometer as a 5th telemetry channel
|
||||
// May be used even if _METEO is not enabled
|
||||
#define _DALLAS_SPLIT_PIN
|
||||
#define _ANEMOMETER_TX20
|
||||
//#define _ANEMOMETER_ANALOGUE
|
||||
#define _ANEMOMETER_PULSES_IN_10SEC_PER_ONE_MS_OF_WINDSPEED 10
|
||||
#define _ANEMOMETER_DIRECTION_ASCENDING_WITH_VOLTAGE
|
||||
#define _ANEMOMETER_VOLTAGE_FOR_1DEG_DIRECTION
|
||||
#define _ANEMOMETER_VOLTAGE_FOR_359DEG_DIRECTION
|
||||
|
||||
======================================================================
|
||||
|
||||
#define SW_VER "DE06"
|
||||
#define SW_DATE "05012020"
|
||||
|
|
|
@ -234,7 +234,7 @@ main(int argc, char* argv[])
|
|||
#endif
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
TX20Init();
|
||||
tx20_init();
|
||||
#endif
|
||||
#ifdef _ANEMOMETER_ANALOGUE
|
||||
analog_anemometer_init(10, 10, 100, 1);
|
||||
|
|
|
@ -172,7 +172,8 @@ void wx_pool_analog_anemometer(void) {
|
|||
// this windspeed is scaled * 10. Example: 0.2 meters per second is stored as 2
|
||||
uint16_t scaled_windspeed = analog_anemometer_get_ms_from_pulse(rte_wx_windspeed_pulses);
|
||||
#else
|
||||
uint16_t scaled_windspeed = TX20GetScaledWindspeed();
|
||||
uint16_t scaled_windspeed = tx20_get_scaled_windspeed();
|
||||
rte_wx_winddirection_last = tx20_get_wind_direction();
|
||||
#endif
|
||||
|
||||
// check how many times before the pool function was called
|
||||
|
|
|
@ -52,7 +52,7 @@ typedef struct Anemometer {
|
|||
/* Indeks poprzednio zapisanych pomiarow*/
|
||||
unsigned char PrevMeasCounter;
|
||||
/* Historia odczytow i usredniona wartosc z ostatnich 15 pomiarow */
|
||||
DecodedData HistoryAVG[TX20_BUFF_LN];
|
||||
// DecodedData HistoryAVG[TX20_BUFF_LN];
|
||||
|
||||
unsigned char OddEven;
|
||||
} Anemometer;
|
||||
|
@ -64,11 +64,12 @@ extern "C"
|
|||
{
|
||||
#endif
|
||||
|
||||
void TX20Batch(void);
|
||||
void TX20Init(void);
|
||||
float TX20DataAverage(void);
|
||||
void TX20DataParse(void);
|
||||
uint16_t TX20GetScaledWindspeed(void);
|
||||
void tx20_batch(void);
|
||||
void tx20_init(void);
|
||||
float tx20_data_average(void);
|
||||
void tx20_data_parse(void);
|
||||
uint16_t tx20_get_scaled_windspeed(void);
|
||||
uint16_t tx20_get_wind_direction(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -17,20 +17,15 @@
|
|||
void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie) {
|
||||
|
||||
float max_wind_speed = 0.0f, temp = 0.0f;
|
||||
uint8_t wind_speed_mph = 0, wind_gusts_mph = 0, d = 0;
|
||||
uint8_t wind_speed_mph = 0, wind_gusts_mph = 0;
|
||||
uint32_t pressure = 0;
|
||||
|
||||
uint16_t direction = 0;
|
||||
uint16_t direction = winddirection;
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
// windspeed is stored as an increment of 0.1 meters per second in 16bit unsigned integer
|
||||
temp = (float) (windspeed * 10.0f);
|
||||
max_wind_speed = (float) (windgusts * 10.0f);
|
||||
|
||||
// for(d = 1; d <= TX20_BUFF_LN - 1 ; d++)
|
||||
// if (VNAME.HistoryAVG[d].WindSpeed > max_wind_speed)
|
||||
// max_wind_speed = VNAME.HistoryAVG[d].WindSpeed; // Wyszukiwane najwiekszej wartosci
|
||||
// temp = input->HistoryAVG[0].WindSpeed;
|
||||
#else
|
||||
|
||||
#endif
|
||||
temp /= 0.45; // Konwersja na mile na godzine
|
||||
max_wind_speed /= 0.45;
|
||||
if ((temp - (short)temp) >= 0.5) // Zaokraglanie wartosci
|
||||
|
@ -54,6 +49,8 @@ void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection,
|
|||
|
||||
pressure = (unsigned)(cisnienie * 10);
|
||||
|
||||
memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg));
|
||||
|
||||
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "!%07.2f%c%c%08.2f%c%c%03d/%03dg%03dt%03dr...p...P...b%05d", _LAT, _LATNS, '/', _LON, _LONWE, '_', /* kierunek */direction, /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), pressure);
|
||||
main_own_aprs_msg[main_own_aprs_msg_len] = 0;
|
||||
ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len);
|
||||
|
@ -70,20 +67,15 @@ void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddi
|
|||
uint16_t output_frame_ln = 0;
|
||||
|
||||
float max_wind_speed = 0.0f, temp = 0.0f;
|
||||
uint8_t wind_speed_mph = 0, wind_gusts_mph = 0, d = 0;
|
||||
uint8_t wind_speed_mph = 0, wind_gusts_mph = 0;
|
||||
uint32_t pressure = 0;
|
||||
|
||||
uint16_t direction = 0;
|
||||
uint16_t direction = winddirection;
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
// windspeed is stored as an increment of 0.1 meters per second in 16bit unsigned integer
|
||||
temp = (float) (windspeed * 10.0f);
|
||||
max_wind_speed = (float) (windgusts * 10.0f);
|
||||
|
||||
// for(d = 1; d <= TX20_BUFF_LN - 1 ; d++)
|
||||
// if (VNAME.HistoryAVG[d].WindSpeed > max_wind_speed)
|
||||
// max_wind_speed = VNAME.HistoryAVG[d].WindSpeed; // Wyszukiwane najwiekszej wartosci
|
||||
// temp = input->HistoryAVG[0].WindSpeed;
|
||||
#else
|
||||
|
||||
#endif
|
||||
temp /= 0.45; // Konwersja na mile na godzine
|
||||
max_wind_speed /= 0.45;
|
||||
if ((temp - (short)temp) >= 0.5) // Zaokraglanie wartosci
|
||||
|
@ -103,7 +95,6 @@ void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddi
|
|||
pressure = (unsigned)(cisnienie * 10);
|
||||
|
||||
main_own_aprs_msg_len = sprintf(main_own_aprs_msg, "!%07.2f%c%c%08.2f%c%c%03d/%03dg%03dt%03dr...p...P...b%05d", _LAT, _LATNS, '/', _LON, _LONWE, '_', /* kierunek */direction, /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), pressure);
|
||||
// aprs_msg_len = sprintf(aprs_msg, "%s%03d/%03dg%03dt%03dr%03dp%03dP%03db%04d ~", "!5001.45N/02159.66E_", /* kierunek */90, /* predkosc*/(int)(2.1 * 2.23698), /* porywy */(short)(5.7 * 2.23698), /*temperatura */(short)(23 * 1.8 + 32), 0, 0, 0, 10130);
|
||||
main_own_aprs_msg[main_own_aprs_msg_len] = 0;
|
||||
|
||||
output_frame_ln = ax25_sendVia_toBuffer(main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len, buffer, buffer_ln);
|
||||
|
|
|
@ -41,7 +41,7 @@ void inline TX20BlinkLed(void) {
|
|||
}
|
||||
#endif
|
||||
|
||||
void TX20Init(void) {
|
||||
void tx20_init(void) {
|
||||
int i;
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
@ -66,11 +66,11 @@ void TX20Init(void) {
|
|||
//// inicjalizacja p<>l struktury //
|
||||
////////////////////////////////////////
|
||||
BQ = 0, QL = 0, FC = 0, DCD = 0, RD = 0, MC = 1, OE = 0, PM = 1;
|
||||
for (i = 1; i <= TX20_BUFF_LN - 1; i++) {
|
||||
VNAME.HistoryAVG[i].WindSpeed = -1;
|
||||
VNAME.HistoryAVG[i].WindDirX = -1;
|
||||
VNAME.HistoryAVG[i].WindDirY = -1;
|
||||
}
|
||||
// for (i = 1; i <= TX20_BUFF_LN - 1; i++) {
|
||||
// VNAME.HistoryAVG[i].WindSpeed = -1;
|
||||
// VNAME.HistoryAVG[i].WindDirX = -1;
|
||||
// VNAME.HistoryAVG[i].WindDirY = -1;
|
||||
// }
|
||||
AFIO->EXTICR[(TX/4)] |= PORTNUM << (TX % 4) * 4;
|
||||
EXTI->RTSR |= 1 << TX;
|
||||
EXTI->IMR |= 1 << TX;
|
||||
|
@ -82,7 +82,7 @@ void TX20Init(void) {
|
|||
NVIC_EnableIRQ(EXTI15_10_IRQn);
|
||||
}
|
||||
|
||||
void TX20Batch(void) {
|
||||
void tx20_batch(void) {
|
||||
/* Funkcja wyzwalana w przerwaniu 1666 razy na sekund<6E> */
|
||||
if (BS++,BS %= 2,BS == 1) {
|
||||
BQ <<= 1; // przesuwanie zawarto<74>ci kolejki o jedn<64> pozycje
|
||||
|
@ -101,7 +101,7 @@ void TX20Batch(void) {
|
|||
TX20BlinkLed();
|
||||
#endif
|
||||
if (OE >= 3) {
|
||||
TX20DataParse();
|
||||
tx20_data_parse();
|
||||
OE = 0;
|
||||
}
|
||||
else
|
||||
|
@ -121,50 +121,50 @@ void TX20Batch(void) {
|
|||
}
|
||||
}
|
||||
|
||||
float TX20DataAverage(void) {
|
||||
float tx20_data_average(void) {
|
||||
int i;
|
||||
short x = 0,xx = 0,y = 0,yy = 0, out = 0;
|
||||
x = (short)(100.0f * cosf((float)TX20.Data.WindDirX * PI/180.0f));
|
||||
y = (short)(100.0f * sinf((float)TX20.Data.WindDirX * PI/180.0f));
|
||||
|
||||
if (
|
||||
PM != MC &&
|
||||
abs((int32_t)(TX20.HistoryAVG[PM].WindSpeed - TX20.Data.WindSpeed)) > 9
|
||||
|
||||
) {
|
||||
rte_wx_tx20_excessive_slew_rate = 1;
|
||||
return 0;
|
||||
}
|
||||
// if (
|
||||
// PM != MC &&
|
||||
// abs((int32_t)(TX20.HistoryAVG[PM].WindSpeed - TX20.Data.WindSpeed)) > 9
|
||||
//
|
||||
// ) {
|
||||
// rte_wx_tx20_excessive_slew_rate = 1;
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
tx20_current_windspeed = VNAME.Data.WindSpeed;
|
||||
tx20_current_direction = TX20.Data.WindDirX;
|
||||
|
||||
TX20.HistoryAVG[MC].WindSpeed = VNAME.Data.WindSpeed;
|
||||
TX20.HistoryAVG[MC].WindDirX = x;
|
||||
TX20.HistoryAVG[MC].WindDirY = y;
|
||||
TX20.HistoryAVG[0].WindDirX = 0;
|
||||
TX20.HistoryAVG[0].WindDirY = 0;
|
||||
TX20.HistoryAVG[0].WindSpeed = 0;
|
||||
x = 0, y = 0;
|
||||
for (i = 1; (i <= TX20_BUFF_LN - 1 && TX20.HistoryAVG[i].WindSpeed != -1); i++) {
|
||||
TX20.HistoryAVG[0].WindSpeed += TX20.HistoryAVG[i].WindSpeed;
|
||||
x += TX20.HistoryAVG[i].WindDirX;
|
||||
y += TX20.HistoryAVG[i].WindDirY;
|
||||
}
|
||||
TX20.HistoryAVG[0].WindSpeed /= (i - 1);
|
||||
xx = x / (i - 1);
|
||||
yy = y / (i - 1);
|
||||
out = (short)(atan2f(yy , xx) * 180.0f/PI);
|
||||
if (out < 0)
|
||||
out += 360;
|
||||
TX20.HistoryAVG[0].WindDirX = out;
|
||||
PM = MC;
|
||||
if ((MC++) == TX20_BUFF_LN)
|
||||
MC = 1;
|
||||
// TX20.HistoryAVG[MC].WindSpeed = VNAME.Data.WindSpeed;
|
||||
// TX20.HistoryAVG[MC].WindDirX = x;
|
||||
// TX20.HistoryAVG[MC].WindDirY = y;
|
||||
// TX20.HistoryAVG[0].WindDirX = 0;
|
||||
// TX20.HistoryAVG[0].WindDirY = 0;
|
||||
// TX20.HistoryAVG[0].WindSpeed = 0;
|
||||
// x = 0, y = 0;
|
||||
// for (i = 1; (i <= TX20_BUFF_LN - 1 && TX20.HistoryAVG[i].WindSpeed != -1); i++) {
|
||||
// TX20.HistoryAVG[0].WindSpeed += TX20.HistoryAVG[i].WindSpeed;
|
||||
// x += TX20.HistoryAVG[i].WindDirX;
|
||||
// y += TX20.HistoryAVG[i].WindDirY;
|
||||
// }
|
||||
// TX20.HistoryAVG[0].WindSpeed /= (i - 1);
|
||||
// xx = x / (i - 1);
|
||||
// yy = y / (i - 1);
|
||||
// out = (short)(atan2f(yy , xx) * 180.0f/PI);
|
||||
// if (out < 0)
|
||||
// out += 360;
|
||||
// TX20.HistoryAVG[0].WindDirX = out;
|
||||
// PM = MC;
|
||||
// if ((MC++) == TX20_BUFF_LN)
|
||||
// MC = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TX20DataParse(void) {
|
||||
void tx20_data_parse(void) {
|
||||
int temp;
|
||||
unsigned long long int raw_frame;
|
||||
raw_frame = BQ & 0x3FFFFFFFFFF;
|
||||
|
@ -191,18 +191,22 @@ void TX20DataParse(void) {
|
|||
temp = ((temp & 0x8) >> 3) | ((temp & 0x4) >> 1) | ((temp & 0x2) << 1) | ((temp & 0x1) << 3);
|
||||
TX20.Data.Checksum = temp;
|
||||
if (TX20.Data.Checksum == TX20.Data.CalcChecksum)
|
||||
TX20DataAverage();
|
||||
tx20_data_average();
|
||||
else;
|
||||
|
||||
wx_last_good_wind_time = master_time;
|
||||
}
|
||||
|
||||
uint16_t TX20GetScaledWindspeed(void) {
|
||||
uint16_t tx20_get_scaled_windspeed(void) {
|
||||
float out = tx20_current_windspeed;
|
||||
|
||||
return (uint16_t) (out * 10);
|
||||
}
|
||||
|
||||
uint16_t tx20_get_wind_direction(void) {
|
||||
return tx20_current_direction;
|
||||
}
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
// Przerwania EXTI do synchronizacji
|
||||
|
||||
|
@ -265,7 +269,7 @@ void EXTI15_10_IRQHandler(void) {
|
|||
void TIM1_UP_TIM16_IRQHandler( void ) {
|
||||
|
||||
TIM1->SR &= ~(1<<0);
|
||||
TX20Batch();
|
||||
tx20_batch();
|
||||
}
|
||||
#elif TIMNUMBER == 2
|
||||
void TIM2_IRQHandler( void ) {
|
||||
|
@ -278,7 +282,7 @@ void TIM2_IRQHandler( void ) {
|
|||
}
|
||||
|
||||
TIM2->SR &= ~(1<<0);
|
||||
TX20Batch();
|
||||
tx20_batch();
|
||||
}
|
||||
|
||||
#elif TIMNUMBER == 3
|
||||
|
@ -292,7 +296,7 @@ void TIM3_IRQHandler( void ) {
|
|||
}
|
||||
|
||||
TIM3->SR &= ~(1<<0);
|
||||
TX20Batch();
|
||||
tx20_batch();
|
||||
}
|
||||
|
||||
#elif TIMNUMBER == 4
|
||||
|
@ -306,7 +310,7 @@ void TIM4_IRQHandler( void ) {
|
|||
}
|
||||
|
||||
TIM3->SR &= ~(1<<0);
|
||||
TX20Batch();
|
||||
tx20_batch();
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
|
|
Ładowanie…
Reference in New Issue