From 7ece13496d4e3bcabeac2c37d9db67ae3492d51d Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Sat, 22 Jul 2023 10:27:49 +0200 Subject: [PATCH] - KISS DID: distinguish size_byte value for integer and float types - KISS DID: returning did value as first two bytes, before size_byte - KISS diagnostics: bugfix in NRC service identifier - APRS-IS comm: better way to close tcp connection in case of connecting failure - functions to send status via radio channel moved to separate files and refactored. --- STM32L476_ParaMETEO/system/src/aprs/subdir.mk | 3 + include/aprsis.h | 3 +- include/etc/aprsis_config.h | 16 +++ include/etc/kiss_configuation.h | 2 +- .../kiss_communication_nrc_t.h | 2 +- include/main.h | 6 +- include/rte_main.h | 2 + src/main.c | 2 +- src/packet_tx_handler.c | 8 +- src/pwr_save.c | 2 +- system/include/aprs/status.h | 23 +++ system/include/aprs/telemetry.h | 7 - system/include/gsm/sim800c.h | 1 + system/src/aprs/status.c | 133 ++++++++++++++++++ system/src/aprs/telemetry.c | 118 ---------------- system/src/gsm/sim800c.c | 22 ++- 16 files changed, 212 insertions(+), 138 deletions(-) create mode 100644 include/etc/aprsis_config.h create mode 100644 system/include/aprs/status.h create mode 100644 system/src/aprs/status.c diff --git a/STM32L476_ParaMETEO/system/src/aprs/subdir.mk b/STM32L476_ParaMETEO/system/src/aprs/subdir.mk index fe59758..3560b39 100644 --- a/STM32L476_ParaMETEO/system/src/aprs/subdir.mk +++ b/STM32L476_ParaMETEO/system/src/aprs/subdir.mk @@ -12,6 +12,7 @@ C_SRCS += \ ../system/src/aprs/crc.c \ ../system/src/aprs/dac.c \ ../system/src/aprs/digi.c \ +../system/src/aprs/status.c \ ../system/src/aprs/telemetry.c \ ../system/src/aprs/wx.c @@ -24,6 +25,7 @@ OBJS += \ ./system/src/aprs/crc.o \ ./system/src/aprs/dac.o \ ./system/src/aprs/digi.o \ +./system/src/aprs/status.o \ ./system/src/aprs/telemetry.o \ ./system/src/aprs/wx.o @@ -36,6 +38,7 @@ C_DEPS += \ ./system/src/aprs/crc.d \ ./system/src/aprs/dac.d \ ./system/src/aprs/digi.d \ +./system/src/aprs/status.d \ ./system/src/aprs/telemetry.d \ ./system/src/aprs/wx.d diff --git a/include/aprsis.h b/include/aprsis.h index 4a51bde..e147dda 100644 --- a/include/aprsis.h +++ b/include/aprsis.h @@ -48,7 +48,7 @@ void aprsis_init( const char * callsign_with_ssid); aprsis_return_t aprsis_connect_and_login(const char * address, uint8_t address_ln, uint16_t port, uint8_t auto_send_beacon); aprsis_return_t aprsis_connect_and_login_default(uint8_t auto_send_beacon); -void aprsis_disconnect(void); +sim800_return_t aprsis_disconnect(void); void aprsis_receive_callback(srl_context_t* srl_context); void aprsis_check_alive(void); @@ -72,5 +72,6 @@ void aprsis_send_beacon(uint8_t async, void aprsis_igate_to_aprsis(AX25Msg *msg, const char * callsign_with_ssid); char * aprsis_get_tx_buffer(void); +uint8_t aprsis_get_aprsis_logged(void); #endif /* APRSIS_H_ */ diff --git a/include/etc/aprsis_config.h b/include/etc/aprsis_config.h new file mode 100644 index 0000000..e339095 --- /dev/null +++ b/include/etc/aprsis_config.h @@ -0,0 +1,16 @@ +/* + * aprsis_config.h + * + * Created on: Jul 22, 2023 + * Author: mateusz + */ + +#ifndef ETC_APRSIS_CONFIG_H_ +#define ETC_APRSIS_CONFIG_H_ + + +//!< How many times connection to APRS-IS should fail before reseting GSM modem +#define APRSIS_FAILED_CONN_ATTEMPTS_TO_RESET_GSM 16u + + +#endif /* ETC_APRSIS_CONFIG_H_ */ diff --git a/include/etc/kiss_configuation.h b/include/etc/kiss_configuation.h index 16afcef..e7d51fc 100644 --- a/include/etc/kiss_configuation.h +++ b/include/etc/kiss_configuation.h @@ -13,7 +13,7 @@ //!< Size of a buffer used for diagnostic communication over KISS protocol //! Simply maximum size of a response to a request -#define KISS_CONFIG_DIAGNOSTIC_BUFFER_LN 20 +#define KISS_CONFIG_DIAGNOSTIC_BUFFER_LN 24 diff --git a/include/kiss_communication/kiss_communication_nrc_t.h b/include/kiss_communication/kiss_communication_nrc_t.h index 86642ff..c7dfc90 100644 --- a/include/kiss_communication/kiss_communication_nrc_t.h +++ b/include/kiss_communication/kiss_communication_nrc_t.h @@ -10,7 +10,7 @@ #ifndef KISS_COMMUNICATION_KISS_COMMUNICATION_NRC_T_H_ #define KISS_COMMUNICATION_KISS_COMMUNICATION_NRC_T_H_ -#define KISS_COMMUNICATION_NRC_SERVICE 0x74U +//#define KISS_COMMUNICATION_NRC_SERVICE KISS_NEGATIVE_RESPONSE_SERVICE typedef enum kiss_communication_nrc_t { NRC_POSITIVE = 0x00, diff --git a/include/main.h b/include/main.h index 3590740..c6c49b7 100644 --- a/include/main.h +++ b/include/main.h @@ -10,9 +10,9 @@ #include "drivers/serial.h" #include "gsm/sim800_state_t.h" -#define SW_VER "EA23" -#define SW_DATE "28062023" -#define SW_KISS_PROTO "A" +#define SW_VER "EA24" +#define SW_DATE "21072023" +#define SW_KISS_PROTO "B" #define SYSTICK_TICKS_PER_SECONDS 100 #define SYSTICK_TICKS_PERIOD 10 diff --git a/include/rte_main.h b/include/rte_main.h index b57286f..a32f5f3 100644 --- a/include/rte_main.h +++ b/include/rte_main.h @@ -23,4 +23,6 @@ extern uint16_t rte_main_going_sleep_count; extern uint32_t rte_main_last_sleep_master_time; +extern uint8_t rte_main_reset_gsm_modem; + #endif diff --git a/src/main.c b/src/main.c index e8ffb75..ce3bc41 100644 --- a/src/main.c +++ b/src/main.c @@ -1100,7 +1100,7 @@ int main(int argc, char* argv[]){ #endif #if defined(PARAMETEO) - telemetry_send_status_powersave_registers(REGISTER_LAST_SLEEP, REGISTER_LAST_WKUP, REGISTER_COUNTERS, REGISTER_MONITOR, REGISTER_LAST_SLTIM); + status_send_powersave_registers(REGISTER_LAST_SLEEP, REGISTER_LAST_WKUP, REGISTER_COUNTERS, REGISTER_MONITOR, REGISTER_LAST_SLTIM); #endif } diff --git a/src/packet_tx_handler.c b/src/packet_tx_handler.c index 1cb65e0..1ac1eea 100644 --- a/src/packet_tx_handler.c +++ b/src/packet_tx_handler.c @@ -321,7 +321,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con packet_tx_multi_per_call_handler(); - telemetry_send_status_raw_values_modbus(); + status_send_raw_values_modbus(); } } @@ -497,7 +497,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con if (packet_tx_telemetry_descr_counter >= packet_tx_telemetry_descr_interval) { #ifdef PARAMETEO - telemetry_send_status_powersave_registers(REGISTER_LAST_SLEEP, REGISTER_LAST_WKUP, REGISTER_COUNTERS, REGISTER_MONITOR, REGISTER_LAST_SLTIM); + status_send_powersave_registers(REGISTER_LAST_SLEEP, REGISTER_LAST_WKUP, REGISTER_COUNTERS, REGISTER_MONITOR, REGISTER_LAST_SLTIM); #endif packet_tx_multi_per_call_handler(); @@ -520,7 +520,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con //telemetry_send_status(); } - telemetry_send_status(); + status_send(); if (config_mode->wx_umb == 1) { @@ -554,7 +554,7 @@ void packet_tx_handler(const config_data_basic_t * const config_basic, const con if (packet_tx_gsm_status_sent == 0) { // send a status - telemetry_send_status_gsm(); + status_send_gsm(); // network parameters are not queries while APRS-IS connection is pending // so no sense to send status more than once after the initialization diff --git a/src/pwr_save.c b/src/pwr_save.c index 83a2f40..a7b158d 100644 --- a/src/pwr_save.c +++ b/src/pwr_save.c @@ -751,7 +751,7 @@ void pwr_save_pooling_handler(const config_data_mode_t * config, const config_da // check if cutoff status has changed if (pwr_save_currently_cutoff != pwr_save_previously_cutoff) { - telemetry_send_status_powersave_cutoff(vbatt, pwr_save_previously_cutoff, pwr_save_currently_cutoff); + status_send_powersave_cutoff(vbatt, pwr_save_previously_cutoff, pwr_save_currently_cutoff); } diff --git a/system/include/aprs/status.h b/system/include/aprs/status.h new file mode 100644 index 0000000..944cb75 --- /dev/null +++ b/system/include/aprs/status.h @@ -0,0 +1,23 @@ +/* + * status.h + * + * Created on: Jul 22, 2023 + * Author: mateusz + */ + +#ifndef INCLUDE_APRS_STATUS_H_ +#define INCLUDE_APRS_STATUS_H_ + +#include + +void status_send(void); + +void status_send_raw_values_modbus(void); + +void status_send_powersave_cutoff(uint16_t battery_voltage, int8_t vbatt_low, int8_t cutoff); +void status_send_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 status_send_gsm(void); + + +#endif /* INCLUDE_APRS_STATUS_H_ */ diff --git a/system/include/aprs/telemetry.h b/system/include/aprs/telemetry.h index b54cc27..9ea8e4e 100644 --- a/system/include/aprs/telemetry.h +++ b/system/include/aprs/telemetry.h @@ -89,14 +89,7 @@ void telemetry_send_values( uint8_t rx_pkts, const config_data_mode_t * const config_mode); #endif void telemetry_send_chns_description(const config_data_basic_t * const config_basic, const config_data_mode_t * const config_mode); -void telemetry_send_status(void); -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/system/include/gsm/sim800c.h b/system/include/gsm/sim800c.h index 14d8844..a1f626c 100644 --- a/system/include/gsm/sim800c.h +++ b/system/include/gsm/sim800c.h @@ -37,5 +37,6 @@ uint16_t gsm_sim800_get_response_start_idx(void); void gsm_sim800_create_status(char * buffer, int ln); void gsm_sim800_decrease_counter(void); +void gsm_sim800_inhibit(uint8_t _inhibit); #endif /* INCLUDE_GSM_SIM800C_H_ */ diff --git a/system/src/aprs/status.c b/system/src/aprs/status.c new file mode 100644 index 0000000..c73112f --- /dev/null +++ b/system/src/aprs/status.c @@ -0,0 +1,133 @@ +/* + * status.c + * + * Created on: Jul 22, 2023 + * Author: mateusz + */ + +#include "status.h" + +#include "main.h" + +#include +#include + +#include "ax25.h" + +#ifdef PARAMETEO +#include "pwr_save.h" + +const char * telemetry_vbatt_normal = "VBATT_GOOD"; +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 status_send(void) { + memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); +#ifdef STM32L471xx + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">ParaMETEO firmware %s-%s by SP8EBC - PV powered, fully outdoor, 3in1 APRS device", SW_VER, SW_DATE); +#else + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">ParaTNC firmware %s-%s by SP8EBC", SW_VER, SW_DATE); +#endif + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + WAIT_FOR_CHANNEL_FREE(); + afsk_txStart(&main_afsk); + +} + + +void status_send_raw_values_modbus(void) { +#ifdef _MODBUS_RTU + uint8_t status_ln = 0; + + rtu_get_raw_values_string(main_own_aprs_msg, OWN_APRS_MSG_LN, &status_ln); + + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, status_ln); + WAIT_FOR_CHANNEL_FREE(); + afsk_txStart(&main_afsk); + main_wait_for_tx_complete(); +#endif +} + + +void status_send_powersave_cutoff(uint16_t battery_voltage, int8_t previous_cutoff, int8_t current_cutoff) { +#ifdef PARAMETEO + const char *p, *c; + + // telemetry_vbatt_unknown + + if ((previous_cutoff & CURRENTLY_CUTOFF) != 0) { + p = telemetry_vbatt_cutoff; + } + else if ((previous_cutoff & CURRENTLY_VBATT_LOW) != 0) { + p = telemetry_vbatt_low; + } + else if (((previous_cutoff & CURRENTLY_CUTOFF) == 0) && (previous_cutoff & CURRENTLY_VBATT_LOW) == 0){ + p = telemetry_vbatt_normal; + } + else { + p = telemetry_vbatt_unknown; + } + + if ((current_cutoff & CURRENTLY_CUTOFF) != 0) { + c = telemetry_vbatt_cutoff; + } + else if ((current_cutoff & CURRENTLY_VBATT_LOW) != 0) { + c = telemetry_vbatt_low; + } + else if (((current_cutoff & CURRENTLY_CUTOFF) == 0) && (current_cutoff & CURRENTLY_VBATT_LOW) == 0){ + c = telemetry_vbatt_normal; + } + else { + c = telemetry_vbatt_unknown; + } + + main_wait_for_tx_complete(); + + memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">[powersave cutoff change][Vbatt: %dV][previous: %d - %s][currently: %d - %s]", battery_voltage, previous_cutoff, p, current_cutoff, c); + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + //while (main_ax25.dcd == 1); + afsk_txStart(&main_afsk); + main_wait_for_tx_complete(); +#endif +} + +void status_send_powersave_registers(uint32_t register_last_sleep, uint32_t register_last_wakeup, uint32_t register_counters, uint32_t monitor, uint32_t last_sleep_time) { + main_wait_for_tx_complete(); + + memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); + main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">[powersave registers][last_sleep_ts: 0x%lX][last_wakeup_ts: 0x%lX][sleep_wakeup_cntrs: 0x%lX][monitor: 0x%lX][last_sleep_time: 0x%lX]",register_last_sleep, register_last_wakeup, register_counters, monitor, last_sleep_time); + ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); + //while (main_ax25.dcd == 1); + afsk_txStart(&main_afsk); + main_wait_for_tx_complete(); +} + +void status_send_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/system/src/aprs/telemetry.c b/system/src/aprs/telemetry.c index 352db49..dcc5010 100644 --- a/system/src/aprs/telemetry.c +++ b/system/src/aprs/telemetry.c @@ -19,18 +19,6 @@ uint16_t telemetry_counter = 0; -#ifdef PARAMETEO -#include "pwr_save.h" - -const char * telemetry_vbatt_normal = "VBATT_GOOD"; -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) { // a buffer to assembly the 'call-ssid' string at the begining of the frame @@ -536,109 +524,3 @@ void telemetry_send_values( uint8_t rx_pkts, afsk_txStart(&main_afsk); } - -void telemetry_send_status(void) { - memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); -#ifdef STM32L471xx - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">ParaMETEO firmware %s-%s by SP8EBC - PV powered, fully outdoor, 3in1 APRS device", SW_VER, SW_DATE); -#else - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">ParaTNC firmware %s-%s by SP8EBC", SW_VER, SW_DATE); -#endif - ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); - WAIT_FOR_CHANNEL_FREE(); - afsk_txStart(&main_afsk); - -} - - -void telemetry_send_status_raw_values_modbus(void) { -#ifdef _MODBUS_RTU - uint8_t status_ln = 0; - - rtu_get_raw_values_string(main_own_aprs_msg, OWN_APRS_MSG_LN, &status_ln); - - ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, status_ln); - WAIT_FOR_CHANNEL_FREE(); - afsk_txStart(&main_afsk); - main_wait_for_tx_complete(); -#endif -} - - -void telemetry_send_status_powersave_cutoff(uint16_t battery_voltage, int8_t previous_cutoff, int8_t current_cutoff) { -#ifdef PARAMETEO - const char *p, *c; - - // telemetry_vbatt_unknown - - if ((previous_cutoff & CURRENTLY_CUTOFF) != 0) { - p = telemetry_vbatt_cutoff; - } - else if ((previous_cutoff & CURRENTLY_VBATT_LOW) != 0) { - p = telemetry_vbatt_low; - } - else if (((previous_cutoff & CURRENTLY_CUTOFF) == 0) && (previous_cutoff & CURRENTLY_VBATT_LOW) == 0){ - p = telemetry_vbatt_normal; - } - else { - p = telemetry_vbatt_unknown; - } - - if ((current_cutoff & CURRENTLY_CUTOFF) != 0) { - c = telemetry_vbatt_cutoff; - } - else if ((current_cutoff & CURRENTLY_VBATT_LOW) != 0) { - c = telemetry_vbatt_low; - } - else if (((current_cutoff & CURRENTLY_CUTOFF) == 0) && (current_cutoff & CURRENTLY_VBATT_LOW) == 0){ - c = telemetry_vbatt_normal; - } - else { - c = telemetry_vbatt_unknown; - } - - main_wait_for_tx_complete(); - - memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">[powersave cutoff change][Vbatt: %dV][previous: %d - %s][currently: %d - %s]", battery_voltage, previous_cutoff, p, current_cutoff, c); - ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); - //while (main_ax25.dcd == 1); - afsk_txStart(&main_afsk); - main_wait_for_tx_complete(); -#endif -} - -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) { - main_wait_for_tx_complete(); - - memset(main_own_aprs_msg, 0x00, sizeof(main_own_aprs_msg)); - main_own_aprs_msg_len = sprintf(main_own_aprs_msg, ">[powersave registers][last_sleep_ts: 0x%lX][last_wakeup_ts: 0x%lX][sleep_wakeup_cntrs: 0x%lX][monitor: 0x%lX][last_sleep_time: 0x%lX]",register_last_sleep, register_last_wakeup, register_counters, monitor, last_sleep_time); - ax25_sendVia(&main_ax25, main_own_path, main_own_path_ln, main_own_aprs_msg, main_own_aprs_msg_len); - //while (main_ax25.dcd == 1); - afsk_txStart(&main_afsk); - 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/system/src/gsm/sim800c.c b/system/src/gsm/sim800c.c index d0fe070..448e825 100644 --- a/system/src/gsm/sim800c.c +++ b/system/src/gsm/sim800c.c @@ -111,6 +111,9 @@ char gsm_sim800_cellid[5] = {0, 0, 0, 0, 0}; char gsm_sim800_lac[5] = {0, 0, 0, 0, 0}; +//! Inhibit GSM modem completely while controller is in apropriate power saving state +int8_t gsm_sim800_keep_shutdown = 0; + inline static void gsm_sim800_power_off(void) { io___cntrl_vbat_g_disable(); } @@ -289,6 +292,10 @@ void gsm_sim800_init(gsm_sim800_state_t * state, uint8_t enable_echo) { void gsm_sim800_initialization_pool(srl_context_t * srl_context, gsm_sim800_state_t * state) { + if (gsm_sim800_keep_shutdown == 1) { + *state = SIM800_INHIBITED; + } + if (*state == SIM800_UNKNOWN) { // turn power off gsm_sim800_power_off(); @@ -876,10 +883,19 @@ void gsm_sim800_tx_done_event_handler(srl_context_t * srl_context, gsm_sim800_st } /** - * Power cycle GSM modem + * Power cycle GSM modem and reinitialize everything related to initial state. * @param state */ void gsm_sim800_reset(gsm_sim800_state_t * state) { + + // do nothing if gsm modem must be kept in shutdown + if (gsm_sim800_keep_shutdown == 1) { + + *state = SIM800_INHIBITED; + + return; + } + // turn power off gsm_sim800_power_off(); @@ -938,3 +954,7 @@ void gsm_sim800_decrease_counter(void) { gsm_reset_counter = 0; } } + +void gsm_sim800_inhibit(uint8_t _inhibit) { + gsm_sim800_keep_shutdown = _inhibit; +}