From 4102d7495b44676177f6983bbd56cc1531fe0831 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sun, 18 Jun 2023 11:00:24 +0200 Subject: [PATCH] igate packet received from rf network. send status message after gsm module is registered to network and gprs is working --- STM32L476_ParaMETEO/src/subdir.mk | 3 -- include/main.h | 9 ++++- src/main.c | 6 ++++ src/packet_tx_handler.c | 33 +++++++++++++++++-- system/include/aprs/telemetry.h | 1 + {include => system/include}/float_to_string.h | 0 system/include/gsm/sim800c.h | 2 ++ system/include/gsm/sim800c_gprs.h | 2 ++ system/include/text.h | 7 ++++ system/src/aprs/telemetry.c | 25 ++++++++++++++ {src => system/src}/float_to_string.c | 0 system/src/gsm/sim800c.c | 29 +++++++++++++++- system/src/gsm/sim800c_gprs.c | 14 ++++++++ 13 files changed, 123 insertions(+), 8 deletions(-) rename {include => system/include}/float_to_string.h (100%) rename {src => system/src}/float_to_string.c (100%) diff --git a/STM32L476_ParaMETEO/src/subdir.mk b/STM32L476_ParaMETEO/src/subdir.mk index d5e76be..fde239d 100644 --- a/STM32L476_ParaMETEO/src/subdir.mk +++ b/STM32L476_ParaMETEO/src/subdir.mk @@ -17,7 +17,6 @@ C_SRCS += \ ../src/configuration_handler.c \ ../src/delay.c \ ../src/dummy.c \ -../src/float_to_string.c \ ../src/io.c \ ../src/it_handlers.c \ ../src/kiss_callback.c \ @@ -51,7 +50,6 @@ OBJS += \ ./src/configuration_handler.o \ ./src/delay.o \ ./src/dummy.o \ -./src/float_to_string.o \ ./src/io.o \ ./src/it_handlers.o \ ./src/kiss_callback.o \ @@ -85,7 +83,6 @@ C_DEPS += \ ./src/configuration_handler.d \ ./src/delay.d \ ./src/dummy.d \ -./src/float_to_string.d \ ./src/io.d \ ./src/it_handlers.d \ ./src/kiss_callback.d \ diff --git a/include/main.h b/include/main.h index 36c77d8..cd320f2 100644 --- a/include/main.h +++ b/include/main.h @@ -11,7 +11,7 @@ #include "gsm/sim800_state_t.h" #define SW_VER "EA22" -#define SW_DATE "15062023" +#define SW_DATE "17062023" #define SW_KISS_PROTO "A" #define SYSTICK_TICKS_PER_SECONDS 100 @@ -134,10 +134,17 @@ inline void main_set_monitor(int8_t bit) { #endif } +/** + * Block I/O function which waits for all transmission to end + */ inline void main_wait_for_tx_complete(void) { while(main_afsk.sending == 1); } +/** + * Reset pooling timers values after waking up from deep sleep, to be sure + * than + */ inline void main_reset_pooling_timers(void) { main_wx_sensors_pool_timer = 35000; diff --git a/src/main.c b/src/main.c index 58ae018..fac97dd 100644 --- a/src/main.c +++ b/src/main.c @@ -1178,6 +1178,12 @@ int main(int argc, char* argv[]){ rx10m++; #ifdef STM32L471xx rte_main_rx_total++; + + // if aprsis is logged + if (aprsis_connected == 1) { + aprsis_igate_to_aprsis(&ax25_rxed_frame, &main_callsign_with_ssid); + } + #endif } diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index fa86b24..14e0125 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -23,6 +23,8 @@ #include "api/api.h" #include "pwr_save.h" #include "nvm.h" + +#include "gsm/sim800c_gprs.h" #endif #include "main.h" @@ -62,6 +64,9 @@ uint8_t packet_tx_trigger_tcp = 0; #define RECONNECT_APRSIS (1 << 7) nvm_measurement_t packet_tx_nvm; + +//!< Flag set to one after the gsm status message is sent over radio. +uint8_t packet_tx_gsm_status_sent = 0; #endif void packet_tx_send_wx_frame(void) { @@ -305,6 +310,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con packet_tx_meteo_counter = 0; } + // if modus RTU client is enabled with debugging if ((main_config_data_mode->wx_modbus & WX_MODBUS_DEBUG) == WX_MODBUS_DEBUG) { // send the status packet with raw values of all requested modbus-RTU registers if (packet_tx_meteo_counter == (packet_tx_meteo_interval - 1) && @@ -340,6 +346,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con // wait if serial port is currently used srl_wait_for_tx_completion(main_kiss_srl_ctx_ptr); + // create wx data packet into specified buffer SendWXFrameToBuffer(rte_wx_average_windspeed, rte_wx_max_windspeed, rte_wx_average_winddirection, rte_wx_temperature_average_external_valid, rte_wx_pressure_valid, rte_wx_humidity_valid, main_kiss_srl_ctx_ptr->srl_tx_buf_pointer, main_kiss_srl_ctx_ptr->srl_tx_buf_ln, &ln); srl_start_tx(main_kiss_srl_ctx_ptr, ln); @@ -352,9 +359,6 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con packet_tx_multi_per_call_handler(); - // GET TEMPERATURE FOR TELEMETRY - HAS SIDE EFFECTS - //wx_get_temperature_measurement(main_config_data_wx_sources, main_config_data_mode, main_config_data_umb, main_config_data_rtu, &rte_wx_temperature_internal_valid); - // ASSEMBLY QUALITY FACTORS // if there weren't any erros related to the communication with DS12B20 from previous function call @@ -540,6 +544,29 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con packet_tx_telemetry_descr_counter = 0; } +#ifdef STM32L471xx + // if gsm modem is enabled + if (main_config_data_mode->gsm != 0) { + // if gprs is connected + if (gsm_sim800_gprs_ready == 1) { + // if no gsm status packet has been sent so far + if (packet_tx_gsm_status_sent == 0) { + + // send a status + telemetry_send_status_gsm(); + + // network parameters are not queries while APRS-IS connection is pending + // so no sense to send status more than once after the initialization + packet_tx_gsm_status_sent = 1; + } + } + else { + packet_tx_gsm_status_sent = 0; + } + } +#endif + + } void packet_tx_get_current_counters(packet_tx_counter_values_t * out) { diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index 2afefdf..7125909 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -97,6 +97,7 @@ void telemetry_send_status_raw_values_modbus(void); void telemetry_send_status_powersave_cutoff(uint16_t battery_voltage, int8_t vbatt_low, int8_t cutoff); void telemetry_send_status_powersave_registers(uint32_t register_last_sleep, uint32_t register_last_wakeup, uint32_t register_counters, uint32_t monitor, uint32_t last_sleep_time); +void telemetry_send_status_gsm(void); #ifdef __cplusplus } #endif diff --git a/include/float_to_string.h b/system/include/float_to_string.h similarity index 100% rename from include/float_to_string.h rename to system/include/float_to_string.h diff --git a/system/include/gsm/sim800c.h b/system/include/gsm/sim800c.h index b33d203..42acbfa 100644 --- a/system/include/gsm/sim800c.h +++ b/system/include/gsm/sim800c.h @@ -34,4 +34,6 @@ void gsm_sim800_reset(gsm_sim800_state_t * state); uint8_t gsm_sim800_get_waiting_for_command_response(void); uint16_t gsm_sim800_get_response_start_idx(void); +void gsm_sim800_create_status(char * buffer, int ln); + #endif /* INCLUDE_GSM_SIM800C_H_ */ diff --git a/system/include/gsm/sim800c_gprs.h b/system/include/gsm/sim800c_gprs.h index 3b187c0..e185023 100644 --- a/system/include/gsm/sim800c_gprs.h +++ b/system/include/gsm/sim800c_gprs.h @@ -29,4 +29,6 @@ void sim800_gprs_create_apn_config_str(char * buffer, uint16_t buffer_ln); void sim800_gprs_response_callback(srl_context_t * srl_context, gsm_sim800_state_t * state, uint16_t gsm_response_start_idx); void sim800_gprs_reset(void); +void sim800_gprs_create_status(char * buffer, int ln); + #endif /* INCLUDE_GSM_SIM800C_GPRS_H_ */ diff --git a/system/include/text.h b/system/include/text.h index 6a0a80a..b71c41c 100644 --- a/system/include/text.h +++ b/system/include/text.h @@ -35,6 +35,13 @@ inline static void text_replace_non_printable_with_space(char * str, uint16_t si } } +/** + * Goes from the end of the buffer and replace all spaces with null terminator. + * Stops on " (double quotation mark) which is also replaced with null, or + * at the begining of an string + * @param str + * @param size + */ inline static void text_replace_space_with_null(char * str, uint16_t size) { // it goes from the end of a buffer towards its begining diff --git a/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index 75e9d16..352db49 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -27,6 +27,8 @@ const char * telemetry_vbatt_low = "VBATT_LOW"; const char * telemetry_vbatt_cutoff = "VBATT_CUTOFF"; const char * telemetry_vbatt_unknown = "VBATT_UNKNOWN"; +#include "gsm/sim800c_gprs.h" +#include "gsm/sim800c.h" #endif void telemetry_send_chns_description_pv(const config_data_basic_t * const config_basic) { @@ -617,3 +619,26 @@ void telemetry_send_status_powersave_registers(uint32_t register_last_sleep, uin main_wait_for_tx_complete(); } +void telemetry_send_status_gsm(void){ + main_wait_for_tx_complete(); + + // clear buffer + memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); + + // append general status information about network connection + gsm_sim800_create_status(main_own_aprs_msg, OWN_APRS_MSG_LN); + + // measure a lenght of existing status string + const size_t size_so_far = strlen(main_own_aprs_msg); + + // append an ip address + sim800_gprs_create_status(main_own_aprs_msg + size_so_far, OWN_APRS_MSG_LN - size_so_far); + + // full lenght of status string + main_own_aprs_msg_len = strlen(main_own_aprs_msg); + + // send message on radio + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + afsk_txStart(&main_afsk); + +} diff --git a/src/float_to_string.c b/system/src/float_to_string.c similarity index 100% rename from src/float_to_string.c rename to system/src/float_to_string.c diff --git a/system/src/gsm/sim800c.c b/system/src/gsm/sim800c.c index 4e0cf61..88dd268 100644 --- a/system/src/gsm/sim800c.c +++ b/system/src/gsm/sim800c.c @@ -19,6 +19,7 @@ #include "io.h" #include "text.h" +#include "float_to_string.h" #include #include @@ -768,10 +769,13 @@ void gsm_sim800_rx_done_event_handler(srl_context_t * srl_context, gsm_sim800_st else { gsm_sim800_network_status = NETWORK_REGISTERED; - strncpy(gsm_sim800_registered_network, (const char *)(srl_context->srl_rx_buf_pointer + gsm_response_start_idx + 12), 16); + // copy network name from serial buffer into separate module, keep a room for null terminator + strncpy(gsm_sim800_registered_network, (const char *)(srl_context->srl_rx_buf_pointer + gsm_response_start_idx + 12), REGISTERED_NETWORK_LN - 1); + // replace all non printable characters with space text_replace_non_printable_with_space(gsm_sim800_registered_network, REGISTERED_NETWORK_LN); + // trim network name with excessive spaces text_replace_space_with_null(gsm_sim800_registered_network, REGISTERED_NETWORK_LN); } @@ -783,6 +787,7 @@ void gsm_sim800_rx_done_event_handler(srl_context_t * srl_context, gsm_sim800_st if (comparision_result == 0) { comparision_result = atoi((const char *)(srl_context->srl_rx_buf_pointer + gsm_response_start_idx + 6)); + // recalculate signal level from numeric value into decibels if (comparision_result > 1 && comparision_result < 32) { gsm_sim800_signal_level_dbm = (int8_t)(-110 + 2 * (comparision_result - 2)); } @@ -877,3 +882,25 @@ void gsm_sim800_reset(gsm_sim800_state_t * state) { gsm_sim800_tcpip_reset(); } + +void gsm_sim800_create_status(char * buffer, int ln) { + // buffer to assemble GSM control channel frequency xxx.xxMHz + char freq[9]; + + // clear the buffer + memset(freq, 0x0, 0x9); + + float_to_string(gsm_sim800_bcch_frequency, freq, 9, 2, 3); + + if (buffer != 0) { + snprintf( + buffer, + ln, + ">[GSM status][network: %s][signal: %ddBm][freq: %s][cellid: %s][lac: %s]", + gsm_sim800_registered_network, + gsm_sim800_signal_level_dbm, + freq, + gsm_sim800_cellid, + gsm_sim800_lac); + } +} diff --git a/system/src/gsm/sim800c_gprs.c b/system/src/gsm/sim800c_gprs.c index eb89aa4..cbbf90b 100644 --- a/system/src/gsm/sim800c_gprs.c +++ b/system/src/gsm/sim800c_gprs.c @@ -4,6 +4,8 @@ #include "drivers/serial.h" +#include "float_to_string.h" + #include #include @@ -193,3 +195,15 @@ void sim800_gprs_reset(void){ memset (gsm_sim800_ip_address, 0x00, 18); } + +/** + * Create a text status message + * @param buffer + * @param ln + */ +void sim800_gprs_create_status(char * buffer, int ln) { + // check if output buffer has been provided + if (buffer != 0) { + snprintf(buffer, ln, "[IP: %s]", gsm_sim800_ip_address); + } +}