kopia lustrzana https://github.com/SP8EBC/ParaTNC
moving data from TX20 to global wx sesnros handler, to have an universal implementation between tx20 and analogue anemometer
rodzic
aa26acbf03
commit
a09532124b
|
@ -360,13 +360,9 @@ main(int argc, char* argv[])
|
|||
//telemetry_send_values(rx10m, tx10m, digi10m, kiss10m, rte_wx_temperature_dallas_valid, rte_wx_dallas_qf, rte_wx_ms5611_qf, rte_wx_dht.qf);
|
||||
SendOwnBeacon();
|
||||
#else
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
SendWXFrame(&VNAME, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid);
|
||||
#else
|
||||
SendWXFrame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid);
|
||||
|
||||
#endif // #ifdef _ANEMOMETER_TX20
|
||||
#endif // #ifndef _METEO
|
||||
}
|
||||
|
||||
|
|
|
@ -59,12 +59,8 @@ void packet_tx_handler(void) {
|
|||
// _DALLAS_AS_TELEM wil be set during compilation wx packets will be filled by temperature from MS5611 sensor
|
||||
SendWXFrame(&VNAME, rte_wx_temperature_valid, rte_wx_pressure_valid);
|
||||
#else
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
SendWXFrame(&VNAME, rte_wx_temperature_average_dallas_valid, rte_wx_pressure_valid);
|
||||
#else
|
||||
SendWXFrame(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid);
|
||||
#endif // #ifdef _ANEMOMETER_TX20
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -77,11 +73,7 @@ void packet_tx_handler(void) {
|
|||
|
||||
srl_wait_for_tx_completion();
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
SendWXFrameToBuffer(&VNAME, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid, srl_tx_buffer, TX_BUFFER_LN, &ln);
|
||||
#else
|
||||
SendWXFrameToBuffer(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid, srl_tx_buffer, TX_BUFFER_LN, &ln);
|
||||
#endif
|
||||
|
||||
srl_start_tx(ln);
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "drivers/_dht22.h"
|
||||
#include "drivers/ms5611.h"
|
||||
#include "drivers/analog_anemometer.h"
|
||||
#include "drivers/tx20.h"
|
||||
|
||||
#include "station_config.h"
|
||||
|
||||
|
@ -171,7 +172,7 @@ 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 = 0;
|
||||
uint16_t scaled_windspeed = TX20GetScaledWindspeed();
|
||||
#endif
|
||||
|
||||
// check how many times before the pool function was called
|
||||
|
|
|
@ -12,15 +12,8 @@
|
|||
#include "station_config.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
void SendWXFrame(Anemometer* input, float temperatura, float cisnienie);
|
||||
void SendWXFrameToBuffer(Anemometer* input, float temperatura, float cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln);
|
||||
#else
|
||||
|
||||
void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie);
|
||||
void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* INCLUDE_APRS_WX_H_ */
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define __TX20_H
|
||||
|
||||
#include "station_config.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
|
@ -17,7 +18,7 @@ typedef struct {
|
|||
|
||||
#define TX20_BUFF_LN 20
|
||||
|
||||
typedef struct {
|
||||
typedef struct Anemometer {
|
||||
char BitSampler;
|
||||
/* Zmienna przechowuj<75>ca stan automatu sampluj<75>cego bity.
|
||||
Jest konieczna poniewa<EFBFBD> sa one samplowane 2x czesciej niz wynosi faktyczna
|
||||
|
@ -67,6 +68,7 @@ void TX20Batch(void);
|
|||
void TX20Init(void);
|
||||
float TX20DataAverage(void);
|
||||
void TX20DataParse(void);
|
||||
uint16_t TX20GetScaledWindspeed(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -13,11 +13,8 @@
|
|||
|
||||
#include "station_config.h"
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
void SendWXFrame(Anemometer* input, float temperatura, float cisnienie) {
|
||||
#else
|
||||
|
||||
void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie) {
|
||||
#endif
|
||||
|
||||
float max_wind_speed = 0.0f, temp = 0.0f;
|
||||
uint8_t wind_speed_mph = 0, wind_gusts_mph = 0, d = 0;
|
||||
|
@ -27,10 +24,10 @@ void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection,
|
|||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
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;
|
||||
// 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
|
||||
|
@ -67,11 +64,8 @@ void SendWXFrame(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection,
|
|||
|
||||
}
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
void SendWXFrameToBuffer(Anemometer* input, float temperatura, float cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln) {
|
||||
#else
|
||||
|
||||
void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddirection, float temperatura, float cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln) {
|
||||
#endif
|
||||
|
||||
uint16_t output_frame_ln = 0;
|
||||
|
||||
|
@ -83,10 +77,10 @@ void SendWXFrameToBuffer(uint16_t windspeed, uint16_t windgusts, uint16_t winddi
|
|||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
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;
|
||||
// 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
|
||||
|
|
|
@ -2,8 +2,9 @@
|
|||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
|
||||
#include "../drivers/tx20.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
//#define STM32F10X_MD_VL
|
||||
#include <stm32f10x.h>
|
||||
#include <math.h>
|
||||
#include "diag/Trace.h"
|
||||
|
@ -12,17 +13,19 @@
|
|||
#include "main.h"
|
||||
#include "wx_handler.h"
|
||||
|
||||
#define BS VNAME.BitSampler
|
||||
#define BQ VNAME.BitQueue
|
||||
#define QL VNAME.QueueLenght
|
||||
#define DCD VNAME.FrameRX
|
||||
#define FC VNAME.FrameBitCounter
|
||||
#define RD VNAME.ReceiveDone
|
||||
#define MC VNAME.MeasCounter
|
||||
#define PM VNAME.PrevMeasCounter
|
||||
#define OE VNAME.OddEven
|
||||
#define BS TX20.BitSampler
|
||||
#define BQ TX20.BitQueue
|
||||
#define QL TX20.QueueLenght
|
||||
#define DCD TX20.FrameRX
|
||||
#define FC TX20.FrameBitCounter
|
||||
#define RD TX20.ReceiveDone
|
||||
#define MC TX20.MeasCounter
|
||||
#define PM TX20.PrevMeasCounter
|
||||
#define OE TX20.OddEven
|
||||
|
||||
Anemometer VNAME; // Deklaracja zmiennej strukturalnej typu Anemometer
|
||||
Anemometer TX20; // Deklaracja zmiennej strukturalnej typu Anemometer
|
||||
float tx20_current_windspeed;
|
||||
uint16_t tx20_current_direction;
|
||||
|
||||
#define PI 3.14159265
|
||||
|
||||
|
@ -109,45 +112,52 @@ void TX20Batch(void) {
|
|||
}
|
||||
else
|
||||
FC++;
|
||||
else;
|
||||
else {
|
||||
;
|
||||
}
|
||||
}
|
||||
else {
|
||||
;
|
||||
}
|
||||
else;
|
||||
}
|
||||
|
||||
float TX20DataAverage(void) {
|
||||
char i;
|
||||
int i;
|
||||
short x = 0,xx = 0,y = 0,yy = 0, out = 0;
|
||||
x = (short)(100.0f * cosf((float)VNAME.Data.WindDirX * PI/180.0f));
|
||||
y = (short)(100.0f * sinf((float)VNAME.Data.WindDirX * PI/180.0f));
|
||||
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)(VNAME.HistoryAVG[PM].WindSpeed - VNAME.Data.WindSpeed)) > 9
|
||||
abs((int32_t)(TX20.HistoryAVG[PM].WindSpeed - TX20.Data.WindSpeed)) > 9
|
||||
|
||||
) {
|
||||
rte_wx_tx20_excessive_slew_rate = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
VNAME.HistoryAVG[MC].WindSpeed = VNAME.Data.WindSpeed;
|
||||
VNAME.HistoryAVG[MC].WindDirX = x;
|
||||
VNAME.HistoryAVG[MC].WindDirY = y;
|
||||
VNAME.HistoryAVG[0].WindDirX = 0;
|
||||
VNAME.HistoryAVG[0].WindDirY = 0;
|
||||
VNAME.HistoryAVG[0].WindSpeed = 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 && VNAME.HistoryAVG[i].WindSpeed != -1); i++) {
|
||||
VNAME.HistoryAVG[0].WindSpeed += VNAME.HistoryAVG[i].WindSpeed;
|
||||
x += VNAME.HistoryAVG[i].WindDirX;
|
||||
y += VNAME.HistoryAVG[i].WindDirY;
|
||||
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;
|
||||
}
|
||||
VNAME.HistoryAVG[0].WindSpeed /= (i - 1);
|
||||
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;
|
||||
VNAME.HistoryAVG[0].WindDirX = out;
|
||||
TX20.HistoryAVG[0].WindDirX = out;
|
||||
PM = MC;
|
||||
if ((MC++) == TX20_BUFF_LN)
|
||||
MC = 1;
|
||||
|
@ -163,30 +173,36 @@ void TX20DataParse(void) {
|
|||
temp = ~temp;
|
||||
temp &= 0xF;
|
||||
temp = ((temp & 0x8) >> 3) | ((temp & 0x4) >> 1) | ((temp & 0x2) << 1) | ((temp & 0x1) << 3);
|
||||
VNAME.Data.WindDirX = (short)(temp * 22.5);
|
||||
VNAME.Data.CalcChecksum = temp;
|
||||
TX20.Data.WindDirX = (short)(temp * 22.5);
|
||||
TX20.Data.CalcChecksum = temp;
|
||||
// predkosc wiatru
|
||||
temp = (raw_frame & 0xFFF00000) >> 20;
|
||||
temp = ~temp; // inwetsja bit<69>w
|
||||
temp &= 0xFFF;
|
||||
temp = ((temp & (1 << 11)) >> 11) | ((temp & (1 << 10)) >> 9) | ((temp & (1 << 9)) >> 7) | ((temp & (1 << 8)) >> 5) | ((temp & (1 << 7)) >> 3) | ((temp & (1 << 6)) >> 1) | ((temp & (1 << 5)) << 1) | ((temp & (1 << 4)) << 3) | ((temp & (1 << 3)) << 5) | ((temp & (1 << 2)) << 7) | ((temp & (1 << 1)) << 9) | ((temp & (1 << 1)) << 9) | ((temp & 1) << 11);
|
||||
VNAME.Data.CalcChecksum += ((temp & 0xF) + ((temp & 0xF0) >> 4) + ((temp & 0xF00) >> 8));
|
||||
VNAME.Data.CalcChecksum &= 0xF;
|
||||
TX20.Data.CalcChecksum += ((temp & 0xF) + ((temp & 0xF0) >> 4) + ((temp & 0xF00) >> 8));
|
||||
TX20.Data.CalcChecksum &= 0xF;
|
||||
// temp = __rev(temp); // endian-swapping
|
||||
VNAME.Data.WindSpeed = (float)temp*0.1;
|
||||
TX20.Data.WindSpeed = (float)temp*0.1;
|
||||
// suma kontrolna
|
||||
temp = (raw_frame & 0xF0000) >> 16;
|
||||
temp = ~temp;
|
||||
temp &= 0xF;
|
||||
temp = ((temp & 0x8) >> 3) | ((temp & 0x4) >> 1) | ((temp & 0x2) << 1) | ((temp & 0x1) << 3);
|
||||
VNAME.Data.Checksum = temp;
|
||||
if (VNAME.Data.Checksum == VNAME.Data.CalcChecksum)
|
||||
TX20.Data.Checksum = temp;
|
||||
if (TX20.Data.Checksum == TX20.Data.CalcChecksum)
|
||||
TX20DataAverage();
|
||||
else;
|
||||
|
||||
wx_last_good_wind_time = master_time;
|
||||
}
|
||||
|
||||
uint16_t TX20GetScaledWindspeed(void) {
|
||||
float out = tx20_current_windspeed;
|
||||
|
||||
return (uint16_t) (out * 10);
|
||||
}
|
||||
|
||||
#ifdef _ANEMOMETER_TX20
|
||||
// Przerwania EXTI do synchronizacji
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue