RS41ng/src/template.c

126 wiersze
4.9 KiB
C
Czysty Zwykły widok Historia

#include <stdio.h>
#include <stdlib.h>
#include "utils.h"
#include "config.h"
#include "strlcpy.h"
#include "template.h"
size_t template_replace(char *dest, size_t dest_len, char *src, telemetry_data *data)
{
char *temp = malloc(dest_len);
if (temp == NULL) {
return 0;
}
char replacement[32];
strlcpy(replacement, CALLSIGN, sizeof(replacement));
strlcpy(temp, src, dest_len);
str_replace(dest, dest_len, temp, "$cs", replacement);
strlcpy(replacement, data->locator, 4 + 1);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$loc4", replacement);
strlcpy(replacement, data->locator, 6 + 1);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$loc6", replacement);
strlcpy(replacement, data->locator, 8 + 1);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$loc8", replacement);
strlcpy(replacement, data->locator, 12 + 1);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$loc12", replacement);
snprintf(replacement, sizeof(replacement), "%d", data->battery_voltage_millivolts);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$bv", replacement);
snprintf(replacement, sizeof(replacement), "%d", data->button_adc_value);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$bu", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->temperature_celsius_100 / 100);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$te", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->internal_temperature_celsius_100 / 100);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$ti", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->humidity_percentage_100 / 100);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$hu", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->pressure_mbar_100 / 100);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$pr", replacement);
snprintf(replacement, sizeof(replacement), "%u", (unsigned int) data->gps.time_of_week_millis);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$tow", replacement);
snprintf(replacement, sizeof(replacement), "%02d", data->gps.hours);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$hh", replacement);
snprintf(replacement, sizeof(replacement), "%02d", data->gps.minutes);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$mm", replacement);
snprintf(replacement, sizeof(replacement), "%02d", data->gps.seconds);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$ss", replacement);
snprintf(replacement, sizeof(replacement), "%d", data->gps.satellites_visible);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$sv", replacement);
snprintf(replacement, sizeof(replacement), "%05d", (int) data->gps.latitude_degrees_1000000 / 10000);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$lat", replacement);
snprintf(replacement, sizeof(replacement), "%05d", (int) data->gps.longitude_degrees_1000000 / 10000);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$lon", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->gps.altitude_mm / 1000);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$alt", replacement);
snprintf(replacement, sizeof(replacement), "%d",
(int) ((float) data->gps.ground_speed_cm_per_second * 3.6f / 100.0f));
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$gs", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->gps.climb_cm_per_second / 100);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$cl", replacement);
snprintf(replacement, sizeof(replacement), "%03d", (int) data->gps.heading_degrees_100000 / 100000);
strlcpy(temp, dest, dest_len);
size_t len = str_replace(dest, dest_len, temp, "$he", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->pulse_count);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$pc", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->radiation_intensity_uR_h);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$ri", replacement);
Graw DFM-17 radiosonde support (#61) * Initial plumbing for DFM17 (#54) * Implementing Si4063 radio chip support for DFM17 sonde. Work in progress. * Add an error to indicate that the code does not work yet * Removed copyrighted docs from documentation and provided links instead (#55) * Fix SPI bus initialization for DFM17. Trying to make Si4063 SPI communication work (in progress). Fix LED bit polarity. * Set DFM17 clocks correctly to 24 MHz * Still trying to fix Si4063 SPI communication, no luck * Add clearing of SPI overrun status flag to make Si4063 comm work properly in DFM17. Not sure about the reason this is required. * Fix bug when setting Si4063 frequency. Remove unnecessary GPS debug and delays. Add Si4063 debug printout. Find a suitable frequency offset multiplier to achieve 270 Hz tone spacing for Horus 4FSK. * Add some known good Si4063 configuration values. Implement direct GPIO-based modulation for Si4063 that allows support for CW now. * DFM-17 APRS work (#60) * Modify for APRS on DFM17 * Clean up Si4063 APRS work and make APRS deviation configurable * Add documentation for DFM-17 * Add a note about the DFM-17 connector * More work on docs and config for DFM-17 * Docs * Mor work on config * Fix RS41 URL * Added info about high-altitude balloon flights * Fix typo * More code cleanup * Update authors * Improve DFM-17 docs * Added a timepulse routine for DFM17 and also a millis() routine. Working toward clock calibration. * More refinements to the HCI calibration * Cleaned up clock calibration code and integrated into the main radio loop. Also added APRS telemetry for calibration. * Added logic to (hopefully) avoid over-calibration if there is an errant timepulse. * Clean up DFM-17 clock calibration implementation and make RS41 compile properly * Adjust README * Add notes about DFM-17 clock calibration * Fix typo * Add DFM-17 note about clock calibration to the top of the README * Text style * Working on README * Working on README * Move datasheet links to main README * Markdown styling * Improve config file structure * Remove unnecessary comments --------- Co-authored-by: Mike Hojnowski <kd2eat@gmail.com>
2023-10-15 09:38:05 +00:00
snprintf(replacement, sizeof(replacement), "%d", (int) data->clock_calibration_trim);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$ct", replacement);
snprintf(replacement, sizeof(replacement), "%d", (int) data->clock_calibration_count);
strlcpy(temp, dest, dest_len);
str_replace(dest, dest_len, temp, "$cc", replacement);
free(temp);
return len;
}