21 #ifndef INCLUDE_SATNOGS_AX25_H_ 22 #define INCLUDE_SATNOGS_AX25_H_ 41 { -1, 1, 1, 1, 1, 1, 1, -1 };
43 { 0, 1, 1, 1, 1, 1, 1, 0 };
79 static inline uint16_t
95 uint8_t dest_ssid, std::string src_addr,
100 for (i = 0; i < dest_addr.length(); i++) {
101 *out++ = dest_addr[
i] << 1;
112 *out++ = ((0b1111 & dest_ssid) << 1) | 0b01100000;
114 for (i = 0; i < src_addr.length(); i++) {
115 *out++ = src_addr[
i] << 1;
124 *out++ = ((0b1111 & src_ssid) << 1) | 0b01100001;
133 static inline uint8_t
138 return (ret >> 1) & 0b1111;
143 ax25_frame_type_t type, uint8_t *addr,
size_t addr_len,
144 uint16_t ctrl,
size_t ctrl_len,
size_t preamble_len,
145 size_t postamble_len)
149 if (info_len > AX25_MAX_FRAME_LEN) {
153 memset(out, AX25_SYNC_FLAG, preamble_len);
157 if (addr_len == AX25_MIN_ADDR_LEN || addr_len == AX25_MAX_ADDR_LEN) {
158 memcpy(out + i, addr, addr_len);
165 if (ctrl_len == AX25_MIN_CTRL_LEN || ctrl_len == AX25_MAX_CTRL_LEN) {
166 memcpy(out + i, &ctrl, ctrl_len);
181 memcpy(out + i, info, info_len);
185 fcs =
ax25_fcs(out + preamble_len, i - preamble_len);
187 out[i++] = fcs & 0xFF;
188 out[i++] = (fcs >> 8) & 0xFF;
189 memset(out + i, AX25_SYNC_FLAG, postamble_len);
190 for (
size_t j = preamble_len;
j <
i;
j++) {
191 printf(
"0x%02x ", out[
j]);
194 return i + postamble_len;
221 static inline ax25_encode_status_t
223 size_t buffer_len,
size_t preamble_len,
224 size_t postamble_len)
227 uint8_t prev_bit = 0;
231 size_t total_cont_1 = 0;
235 for (i = 0; i < preamble_len; i++) {
236 memcpy(out + out_idx, AX25_SYNC_FLAG_MAP, 8 *
sizeof(
float));
241 buffer += preamble_len;
242 for (i = 0; i < 8 * (buffer_len - preamble_len - postamble_len); i++) {
243 bit = (buffer[i / 8] >> (i % 8)) & 0x1;
244 out[out_idx++] = bit ? 1.0 : -1.0;
247 if (bit & prev_bit) {
251 out[out_idx++] = -1.0;
256 cont_1 = total_cont_1 = 0;
264 if (total_cont_1 >= 14) {
270 for (i = 0; i < postamble_len; i++) {
271 memcpy(out + out_idx, AX25_SYNC_FLAG_MAP, 8 *
sizeof(
float));
303 static inline ax25_encode_status_t
305 const size_t buffer_len,
size_t preamble_len,
306 size_t postamble_len)
315 for (i = 0; i < preamble_len; i++) {
316 memcpy(out + out_idx, AX25_SYNC_FLAG_MAP_BIN, 8 *
sizeof(uint8_t));
321 buffer += preamble_len;
322 for (i = 0; i < 8 * (buffer_len - preamble_len - postamble_len); i++) {
323 bit = (buffer[i / 8] >> (i % 8)) & 0x1;
324 shift_reg = (shift_reg << 1) | bit;
325 out[out_idx++] = bit;
328 if ((shift_reg & 0x1F) == 0x1F) {
329 out[out_idx++] = 0x0;
335 for (i = 0; i < postamble_len; i++) {
336 memcpy(out + out_idx, AX25_SYNC_FLAG_MAP_BIN, 8 *
sizeof(uint8_t));
344 static inline ax25_decode_status_t
345 ax25_decode(uint8_t *out,
size_t *out_len,
const uint8_t *ax25_frame,
349 size_t frame_start = UINT_MAX;
350 size_t frame_stop = UINT_MAX;
353 size_t received_bytes = 0;
355 uint8_t decoded_byte = 0x0;
361 res = (AX25_SYNC_FLAG_MAP_BIN[0] ^ ax25_frame[
i])
362 | (AX25_SYNC_FLAG_MAP_BIN[1] ^ ax25_frame[i + 1])
363 | (AX25_SYNC_FLAG_MAP_BIN[2] ^ ax25_frame[i + 2])
364 | (AX25_SYNC_FLAG_MAP_BIN[3] ^ ax25_frame[i + 3])
365 | (AX25_SYNC_FLAG_MAP_BIN[4] ^ ax25_frame[i + 4])
366 | (AX25_SYNC_FLAG_MAP_BIN[5] ^ ax25_frame[i + 5])
367 | (AX25_SYNC_FLAG_MAP_BIN[6] ^ ax25_frame[i + 6])
368 | (AX25_SYNC_FLAG_MAP_BIN[7] ^ ax25_frame[i + 7]);
377 if (frame_start == UINT_MAX) {
381 for (i = frame_start +
sizeof(AX25_SYNC_FLAG_MAP_BIN);
384 res = (AX25_SYNC_FLAG_MAP_BIN[0] ^ ax25_frame[
i])
385 | (AX25_SYNC_FLAG_MAP_BIN[1] ^ ax25_frame[i + 1])
386 | (AX25_SYNC_FLAG_MAP_BIN[2] ^ ax25_frame[i + 2])
387 | (AX25_SYNC_FLAG_MAP_BIN[3] ^ ax25_frame[i + 3])
388 | (AX25_SYNC_FLAG_MAP_BIN[4] ^ ax25_frame[i + 4])
389 | (AX25_SYNC_FLAG_MAP_BIN[5] ^ ax25_frame[i + 5])
390 | (AX25_SYNC_FLAG_MAP_BIN[6] ^ ax25_frame[i + 6])
391 | (AX25_SYNC_FLAG_MAP_BIN[7] ^ ax25_frame[i + 7]);
400 decoded_byte |= 1 << bit_cnt;
416 out[received_bytes++] = decoded_byte;
422 if (frame_stop == UINT_MAX || received_bytes < AX25_MIN_ADDR_LEN) {
427 fcs =
ax25_fcs(out, received_bytes -
sizeof(uint16_t));
428 recv_fcs = (((uint16_t) out[received_bytes - 2]) << 8)
429 | out[received_bytes - 1];
431 if (fcs != recv_fcs) {
436 *out_len = received_bytes -
sizeof(uint16_t);
static uint8_t ax25_get_dest_ssid(const uint8_t *in)
Definition: ax25.h:134
int i
Definition: decode_rs.h:71
static ax25_decode_status_t ax25_decode(uint8_t *out, size_t *out_len, const uint8_t *ax25_frame, size_t len)
Definition: ax25.h:345
const size_t AX25_MAX_FRAME_LEN
Definition: ax25.h:37
int j
Definition: decode_rs.h:71
uint8_t pid
Definition: ax25.h:67
ax25_decode_status_t
Definition: ax25.h:58
ax25_frame_type_t
Definition: ax25.h:47
const uint8_t AX25_CALLSIGN_MAX_LEN
Definition: ax25.h:39
memset(parity, 0, NROOTS *sizeof(data_t))
static size_t ax25_prepare_frame(uint8_t *out, const uint8_t *info, size_t info_len, ax25_frame_type_t type, uint8_t *addr, size_t addr_len, uint16_t ctrl, size_t ctrl_len, size_t preamble_len, size_t postamble_len)
Definition: ax25.h:142
const uint8_t AX25_SYNC_FLAG
Definition: ax25.h:38
uint8_t * info
Definition: ax25.h:68
AX25_U_FRAME Unnumbered frame.
Definition: ax25.h:50
Implements a bit shift register.
Definition: shift_reg.h:35
ax25_encode_status_t
Definition: ax25.h:54
static size_t ax25_create_addr_field(uint8_t *out, std::string dest_addr, uint8_t dest_ssid, std::string src_addr, uint8_t src_ssid)
Definition: ax25.h:94
const float AX25_SYNC_FLAG_MAP[8]
Definition: ax25.h:40
size_t address_len
Definition: ax25.h:64
const size_t AX25_MIN_CTRL_LEN
Definition: ax25.h:35
const size_t AX25_MAX_ADDR_LEN
Definition: ax25.h:34
AX25_I_FRAME Information frame.
Definition: ax25.h:48
ax25_frame_type_t type
Definition: ax25.h:70
Definition: amsat_duv_decoder.h:29
AX25_S_FRAME Supervisory frame.
Definition: ax25.h:49
const uint8_t AX25_SYNC_FLAG_MAP_BIN[8]
Definition: ax25.h:42
const size_t AX25_MIN_ADDR_LEN
Definition: ax25.h:33
size_t ctrl_len
Definition: ax25.h:66
static uint16_t crc16_ax25(const uint8_t *data, size_t len)
uint16_t ctrl
Definition: ax25.h:65
const size_t AX25_MAX_CTRL_LEN
Definition: ax25.h:36
#define LOG_WARN(M,...)
Definition: log.h:43
static ax25_encode_status_t ax25_nrz_bit_stuffing(float *out, size_t *out_len, const uint8_t *buffer, size_t buffer_len, size_t preamble_len, size_t postamble_len)
Definition: ax25.h:222
static uint16_t ax25_fcs(uint8_t *buffer, size_t len)
Definition: ax25.h:80
size_t info_len
Definition: ax25.h:69
static ax25_encode_status_t ax25_bit_stuffing(uint8_t *out, size_t *out_len, const uint8_t *buffer, const size_t buffer_len, size_t preamble_len, size_t postamble_len)
Definition: ax25.h:304