moving data from TX20 to global wx sesnros handler, to have an universal implementation between tx20 and analogue anemometer

pull/2/head
Mateusz Lubecki 2020-03-02 22:05:43 +01:00
rodzic aa26acbf03
commit a09532124b
7 zmienionych plików z 68 dodań i 74 usunięć

Wyświetl plik

@ -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
}

Wyświetl plik

@ -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);

Wyświetl plik

@ -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

Wyświetl plik

@ -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_ */

Wyświetl plik

@ -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
}

Wyświetl plik

@ -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

Wyświetl plik

@ -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