some more refactoring inside tx20 driver

pull/2/head
Mateusz Lubecki 2020-03-03 22:12:15 +01:00
rodzic a09532124b
commit 0ed71fceed
6 zmienionych plików z 118 dodań i 75 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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