sending own generated WX frames do host via KISS

pull/2/head DC00
Mateusz Lubecki 2019-05-05 14:25:48 +02:00
rodzic 77304473be
commit 8a5fa8a79a
11 zmienionych plików z 121 dodań i 21 usunięć

Wyświetl plik

@ -33,6 +33,7 @@
void kiss_reset_buffer(uint8_t* output, uint16_t output_len, uint16_t* current_len);
uint8_t kiss_put_char(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t* current_len, uint16_t* crc);
uint8_t kiss_put_char_nocheck(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t* current_len, uint16_t* crc);
void kiss_put_call(const AX25Call *addr, uint8_t is_last, uint8_t* output, uint16_t output_len, uint16_t* current_len, uint16_t* crc);
void kiss_finalize_buffer(uint8_t* output, uint16_t output_len, uint16_t* current_len);

Wyświetl plik

@ -3,8 +3,8 @@
#include "aprs/ax25.h"
#define SW_VER "DB07"
#define SW_DATE "03052019"
#define SW_VER "DC00"
#define SW_DATE "05052019"
#define SYSTICK_TICKS_PER_SECONDS 100
#define SYSTICK_TICKS_PERIOD 10

Wyświetl plik

@ -118,6 +118,7 @@ void kiss_reset_buffer(uint8_t* output, uint16_t output_len, uint16_t* current_l
uint8_t kiss_put_char(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t* current_len, uint16_t* crc) {
uint16_t new_crc = 0;
uint16_t curr_ln = *current_len;
if (*current_len >= output_len) {
return 1;
@ -125,23 +126,23 @@ uint8_t kiss_put_char(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t*
if (c == HDLC_FLAG || c == HDLC_RESET || c == AX25_ESC)
{
kiss_put_char(AX25_ESC, output, output_len, current_len, crc);
kiss_put_char_nocheck(AX25_ESC, output, output_len, current_len, crc);
}
if (c == FEND)
{
kiss_put_char(FESC, output, output_len, current_len, crc);
kiss_put_char(TFEND, output, output_len, current_len, crc);
kiss_put_char_nocheck(FESC, output, output_len, current_len, crc);
kiss_put_char_nocheck(TFEND, output, output_len, current_len, crc);
}
else if (c == FESC)
{
kiss_put_char(FESC, output, output_len, current_len, crc);
kiss_put_char(TFESC, output, output_len, current_len, crc);
kiss_put_char_nocheck(FESC, output, output_len, current_len, crc);
kiss_put_char_nocheck(TFESC, output, output_len, current_len, crc);
}
else {
output[*current_len++] = c;
output[curr_ln++] = c;
}
if (crc == NULL) {
@ -153,6 +154,32 @@ uint8_t kiss_put_char(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t*
*crc = new_crc;
}
*current_len = curr_ln;
return 0;
}
uint8_t kiss_put_char_nocheck(uint8_t c, uint8_t* output, uint16_t output_len, uint16_t* current_len, uint16_t* crc) {
uint16_t new_crc = 0;
uint16_t curr_ln = *current_len;
if (*current_len >= output_len) {
return 1;
}
output[curr_ln++] = c;
if (crc == NULL) {
;
}
else {
new_crc = updcrc_ccitt(c, *crc);
*crc = new_crc;
}
*current_len = curr_ln;
return 0;
}
@ -183,7 +210,16 @@ void kiss_put_call(const AX25Call *addr, uint8_t is_last, uint8_t* output, uint1
}
void kiss_finalize_buffer(uint8_t* output, uint16_t output_len, uint16_t* current_len) {
output[*current_len++] = FEND;
uint16_t ln = *current_len;
if (*current_len >= output_len) {
return;
}
output[ln++] = FEND;
*current_len = ln;
}
uint8_t* kiss_get_buff_ptr(void) {

Wyświetl plik

@ -144,7 +144,7 @@ main(int argc, char* argv[])
rte_main_boot_cycles = (uint8_t)(BKP->DR2 & 0xFF);
// read current number of hard faults
rte_main_hard_faults = (uint8_t)((BKP->DR2 & 0xFF00) >> 16);
rte_main_hard_faults = (uint8_t)((BKP->DR2 & 0xFF00) >> 8);
// increase boot cycles count
rte_main_boot_cycles++;

Wyświetl plik

@ -8,6 +8,7 @@
#include "./aprs/telemetry.h"
#include "./drivers/tx20.h"
#include "./drivers/serial.h"
#include "main.h"
@ -17,6 +18,9 @@ uint8_t packet_tx_beacon_counter = 0;
#ifdef _METEO
uint8_t packet_tx_meteo_interval = _WX_INTERVAL;
uint8_t packet_tx_meteo_counter = 0;
uint8_t packet_tx_meteo_kiss_interval = 2;
uint8_t packet_tx_meteo_kiss_counter = 0;
#endif
uint8_t packet_tx_telemetry_interval = 10;
@ -29,11 +33,14 @@ uint8_t packet_tx_telemetry_descr_counter = 35;
void packet_tx_handler(void) {
DallasQF dallas_qf = DALLAS_QF_UNKNOWN;
uint16_t ln = 0;
packet_tx_beacon_counter++;
packet_tx_telemetry_counter++;
packet_tx_telemetry_descr_counter++;
#ifdef _METEO
packet_tx_meteo_counter++;
packet_tx_meteo_kiss_counter++;
#endif
if (packet_tx_beacon_counter >= packet_tx_beacon_interval) {
@ -58,6 +65,18 @@ void packet_tx_handler(void) {
packet_tx_meteo_counter = 0;
}
if (packet_tx_meteo_kiss_counter >= packet_tx_meteo_kiss_interval) {
srl_wait_for_tx_completion();
SendWXFrameToBuffer(&VNAME, rte_wx_temperature_dallas_valid, rte_wx_pressure_valid, srl_tx_buffer, TX_BUFFER_LN, &ln);
srl_start_tx(ln);
packet_tx_meteo_kiss_counter = 0;
}
#endif
if (packet_tx_telemetry_counter >= packet_tx_telemetry_interval) {

Wyświetl plik

@ -9,8 +9,10 @@
#define INCLUDE_APRS_WX_H_
#include "drivers/tx20.h"
#include <stdint.h>
void SendWXFrame(Anemometer* input, float temperatura, unsigned cisnienie);
void SendWXFrameToBuffer(Anemometer* input, float temperatura, unsigned cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln);
#endif /* INCLUDE_APRS_WX_H_ */

Wyświetl plik

@ -45,6 +45,7 @@ extern "C" {
void srl_init(void);
uint8_t srl_send_data(uint8_t* data, uint8_t mode, uint16_t leng, uint8_t internal_external);
uint8_t srl_start_tx(short leng);
void srl_wait_for_tx_completion();
void srl_irq_handler(void);
uint8_t srl_receive_data(int num, char start, char stop, char echo, char len_addr, char len_modifier);
uint16_t srl_get_num_bytes_rxed();

Wyświetl plik

@ -266,7 +266,7 @@ uint16_t ax25_sendVia_toBuffer(const AX25Call *path, uint16_t path_len, const vo
uint16_t return_val = 0;
kiss_put_char(HDLC_FLAG, output_buf, output_size, &return_val, &crc);
kiss_reset_buffer(output_buf, output_size, &return_val);
for (i = 0; i < path_len; i++)
{
@ -281,12 +281,7 @@ uint16_t ax25_sendVia_toBuffer(const AX25Call *path, uint16_t path_len, const vo
kiss_put_char(*buf++, output_buf, output_size, &return_val, &crc);
}
crcl = (crc & 0xff) ^ 0xff;
crch = (crc >> 8) ^ 0xff;
kiss_put_char(crcl, output_buf, output_size, &return_val, &crc);
kiss_put_char(crch, output_buf, output_size, &return_val, &crc);
kiss_put_char(HDLC_FLAG, output_buf, output_size, &return_val, &crc);
kiss_finalize_buffer(output_buf, output_size, &return_val);
return return_val;
}

Wyświetl plik

@ -35,6 +35,12 @@ void SendWXFrame(Anemometer* input, float temperatura, unsigned cisnienie) {
wind_gusts_mph = (short)max_wind_speed + 1;
else
wind_gusts_mph = (short)max_wind_speed;
if (wind_speed_mph > wind_gusts_mph) {
return;
rte_main_reboot_req = 1;
}
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 */(short)(input->HistoryAVG[0].WindDirX), /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), cisnienie *10);
// 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;
@ -44,8 +50,42 @@ void SendWXFrame(Anemometer* input, float temperatura, unsigned cisnienie) {
while(main_ax25.dcd == true);
afsk_txStart(&main_afsk);
if (wind_speed_mph > wind_gusts_mph)
rte_main_reboot_req = 1;
}
void SendWXFrameToBuffer(Anemometer* input, float temperatura, unsigned cisnienie, uint8_t* buffer, uint16_t buffer_ln, uint16_t* output_ln) {
uint16_t output_frame_ln = 0;
float max_wind_speed = 0.0f, temp = 0.0f;
unsigned char wind_speed_mph = 0, wind_gusts_mph = 0, d = 0;
for(d = 1; d <= TX20_BUFF_LN - 1 ; d++)
if (VNAME.HistoryAVG[d].WindSpeed > max_wind_speed)
max_wind_speed = VNAME.HistoryAVG[d].WindSpeed * 0.1f; // Wyszukiwane najwiekszej wartosci
temp = input->HistoryAVG[0].WindSpeed;
temp /= 0.45; // Konwersja na mile na godzine
max_wind_speed /= 0.45;
if ((temp - (short)temp) >= 0.5) // Zaokraglanie wartosci
/* Odejmuje od wartosci zmiennoprzecinkowej w milach nad godzine wartosc
po zrzutowaniu na typ short czyli z odcienta czescia po przecinku.
Jezeli wynik jest wiekszy albo rowny 0.5 to trzeba zaokraglic w gore */
wind_speed_mph = (short)temp + 1;
else
/* A jezeli jest mniejsza niz 0.5 to zaokraglamy w dol */
wind_speed_mph = (short)temp;
if ((max_wind_speed - (short)max_wind_speed) >= 0.5)
/* Analogiczna procedura ma miejsce dla porywow wiatru*/
wind_gusts_mph = (short)max_wind_speed + 1;
else
wind_gusts_mph = (short)max_wind_speed;
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 */(short)(input->HistoryAVG[0].WindDirX), /* predkosc*/(int)wind_speed_mph, /* porywy */(short)(wind_gusts_mph), /*temperatura */(short)(temperatura*1.8+32), cisnienie *10);
// 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);
*output_ln = output_frame_ln;
return;
}

Wyświetl plik

@ -342,16 +342,18 @@ HardFault_Handler (void)
uint8_t hard_faults = 0;
void __attribute__ ((section(".after_vectors"),weak,used))
void __attribute__ ((section(".after_vectors"),weak,used,naked))
HardFault_Handler_C (ExceptionStackFrame* frame __attribute__((unused)),
uint32_t lr __attribute__((unused)))
{
hard_faults = 0;
// enable access to BKP registers
RCC->APB1ENR |= (RCC_APB1ENR_PWREN | RCC_APB1ENR_BKPEN);
PWR->CR |= PWR_CR_DBP;
// read current number of hard faults
hard_faults = (uint8_t)((BKP->DR2 & 0xFF00) >> 16);
hard_faults = (uint8_t)((BKP->DR2 & 0xFF00) >> 8);
// increase hard faults counter
hard_faults++;

Wyświetl plik

@ -230,6 +230,10 @@ uint8_t srl_start_tx(short leng) {
return SRL_OK;
}
void srl_wait_for_tx_completion() {
while(srl_tx_state != SRL_TX_IDLE && srl_tx_state != SRL_TX_ERROR);
}
uint8_t srl_receive_data(int num, char start, char stop, char echo, char len_addr, char len_modifier) {
if (srl_rx_state == SRL_RXING)
return SRL_BUSY;