diff --git a/memory_metrics.txt b/memory_metrics.txt index 95e55d7..a67b922 100644 --- a/memory_metrics.txt +++ b/memory_metrics.txt @@ -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" diff --git a/src/main.c b/src/main.c index ebe824e..0aa455c 100644 --- a/src/main.c +++ b/src/main.c @@ -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); diff --git a/src/wx_handler.c b/src/wx_handler.c index cfc592c..eb8ec09 100644 --- a/src/wx_handler.c +++ b/src/wx_handler.c @@ -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 diff --git a/system/include/drivers/tx20.h b/system/include/drivers/tx20.h index dbe0a58..66c0e57 100644 --- a/system/include/drivers/tx20.h +++ b/system/include/drivers/tx20.h @@ -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 } diff --git a/system/src/aprs/wx.c b/system/src/aprs/wx.c index 1c309fb..ad3fe7f 100644 --- a/system/src/aprs/wx.c +++ b/system/src/aprs/wx.c @@ -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); diff --git a/system/src/drivers/tx20.c b/system/src/drivers/tx20.c index 6a8ac4e..e7240d6 100644 --- a/system/src/drivers/tx20.c +++ b/system/src/drivers/tx20.c @@ -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� */ if (BS++,BS %= 2,BS == 1) { BQ <<= 1; // przesuwanie zawarto�ci kolejki o jedn� 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