additional whiskers

pull/86/head
Stephen D 2024-03-07 19:25:27 -04:00
rodzic 9e1fba05f8
commit f71ef21f53
4 zmienionych plików z 88 dodań i 0 usunięć

Wyświetl plik

@ -3,6 +3,48 @@
#include "whisker.h"
#ifdef RS41
#define HARDWARE_ID 0x7d00
#endif
#ifdef DFM17
#define HARDWARE_ID 0x7d01
#endif
#define SOFTWARE_ID 0x00
static inline void cats_push_f16(cats_packet *p, float val)
{
union {
float f;
uint32_t u;
} fu = { .f = val };
assert(sizeof fu.f == sizeof fu.u);
uint32_t f32 = fu.u;
uint32_t sign = (f32 >> 16) & 0x8000;
uint32_t exponent = ((f32 >> 23) - 127 + 15) & 0x1F;
uint32_t mantissa = f32 & 0x007FFFFF;
uint32_t f16 = sign | (exponent << 10) | (mantissa >> 13);
p->data[p->len++] = f16;
p->data[p->len++] = f16 >> 8;
}
static inline void cats_push_u16(cats_packet *p, uint16_t val)
{
for(int i = 0; i < 2; i++) {
p->data[p->len++] = val >> (i * 8);
}
}
static inline void cats_push_i32(cats_packet *p, int32_t val)
{
for(int i = 0; i < 4; i++) {
p->data[p->len++] = val >> (i * 8);
}
}
void cats_append_identification_whisker(cats_packet *packet, char *callsign, uint8_t ssid, uint16_t icon)
{
packet->data[packet->len++] = 0x00; // type = identidication
@ -15,6 +57,18 @@ void cats_append_identification_whisker(cats_packet *packet, char *callsign, uin
packet->data[packet->len++] = ssid; // ssid
}
void cats_append_gps_whisker(cats_packet *packet, gps_data gps)
{
packet->data[packet->len++] = 0x02; // type = gps
packet->data[packet->len++] = 14; // len
cats_push_i32(packet, gps.latitude_degrees_1000000 / 90 * ((1<<31) / 1000000)); // lat
cats_push_i32(packet, gps.longitude_degrees_1000000 / 180 * ((1<<31) / 1000000)); // lon
cats_push_f16(packet, gps.altitude_mm / 100.0); // alt
packet->data[packet->len++] = 0; // max error = 0m
packet->data[packet->len++] = gps.heading_degrees_100000 * 128 / 180 / 100000; // heading
cats_push_f16(packet, gps.ground_speed_cm_per_second / 100.0); // horizontal speed
}
void cats_append_comment_whisker(cats_packet *packet, char *comment)
{
packet->data[packet->len++] = 0x03; // type = comment
@ -24,3 +78,23 @@ void cats_append_comment_whisker(cats_packet *packet, char *comment)
memcpy(packet->data + packet->len, comment, comment_len);
packet->len += comment_len;
}
void cats_append_node_info_whisker(cats_packet *packet, telemetry_data *data)
{
uint8_t *d = packet->data;
size_t *l = &packet->len;
d[(*l)++] = 0x09; // type = node info
d[(*l)++] = 10; // len
// bitmask
d[(*l)++] = 0;
d[(*l)++] = 0;
d[(*l)++] = 0b11110011;
cats_push_u16(packet, HARDWARE_ID);
d[(*l)++] = SOFTWARE_ID;
d[(*l)++] = 21; // vertical antenna -> ~5.25 dBi gain
d[(*l)++] = CATS_REPORTED_TX_POWER_DBM * 4.0; // TX power
d[(*l)++] = data->battery_voltage_millivolts / 100; // voltage
d[(*l)++] = data->internal_temperature_celsius_100 / 100; // transmitter temperature
}

Wyświetl plik

@ -4,8 +4,12 @@
#include <stdint.h>
#include "cats.h"
#include "../../gps.h"
#include "../../telemetry.h"
void cats_append_identification_whisker(cats_packet *packet, char *callsign, uint8_t ssid, uint16_t icon);
void cats_append_gps_whisker(cats_packet *packet, gps_data gps);
void cats_append_comment_whisker(cats_packet *packet, char *message);
void cats_append_node_info_whisker(cats_packet *packet, telemetry_data *data);
#endif

Wyświetl plik

@ -345,6 +345,7 @@
#define CATS_SSID 24
#define CATS_ICON 8237
#define CATS_COMMENT "I am a radiosonde. Hear me meow!"
#define CATS_REPORTED_TX_POWER_DBM 20
// Schedule transmission every N seconds, counting from beginning of an hour (based on GPS time). Set to zero to disable time sync.
// See the README file for more detailed documentation about time sync and its offset setting

Wyświetl plik

@ -31,6 +31,15 @@ uint16_t radio_cats_encode(uint8_t *payload, uint16_t length, telemetry_data *te
cats_packet packet = cats_create(data);
cats_append_identification_whisker(&packet, CATS_CALLSIGN, CATS_SSID, CATS_ICON);
cats_append_comment_whisker(&packet, message);
if(GPS_HAS_FIX(telemetry_data->gps) &&
(telemetry_data->gps.latitude_degrees_1000000 != 0 ||
telemetry_data->gps.longitude_degrees_1000000 != 0)) {
cats_append_gps_whisker(&packet, telemetry_data->gps);
}
cats_append_node_info_whisker(&packet, telemetry_data);
int len = cats_fully_encode(packet, cur);
free(data);