- 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.
master
Mateusz Lubecki 2023-07-22 10:27:49 +02:00
rodzic b4cd12017c
commit 7ece13496d
16 zmienionych plików z 212 dodań i 138 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -0,0 +1,23 @@
/*
* status.h
*
* Created on: Jul 22, 2023
* Author: mateusz
*/
#ifndef INCLUDE_APRS_STATUS_H_
#define INCLUDE_APRS_STATUS_H_
#include <stdint.h>
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_ */

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -0,0 +1,133 @@
/*
* status.c
*
* Created on: Jul 22, 2023
* Author: mateusz
*/
#include "status.h"
#include "main.h"
#include <stdio.h>
#include <string.h>
#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);
}

Wyświetl plik

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

Wyświetl plik

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