Added basic APRS transmit

Added goertzel algo
Updated binary
This commit is contained in:
furrtek 2018-02-23 20:21:24 +00:00
parent 7fd987a2b4
commit 8573f760be
17 changed files with 376 additions and 76 deletions

View file

@ -35,39 +35,42 @@ void AX25Frame::make_extended_field(char * const data, size_t length) {
add_data((data[i] << 1) | 1);
}
void AX25Frame::add_byte(uint8_t byte, bool is_flag, bool is_data) {
size_t i;
void AX25Frame::NRZI_add_bit(const uint32_t bit) {
if (!bit)
current_bit ^= 1; // Zero: flip
for (i = 0; i < 8; ) {
current_byte <<= 1;
current_byte |= current_bit;
bit_counter++;
if (bit_counter == 8) {
bit_counter = 0;
*bb_data_ptr = current_byte;
bb_data_ptr++;
}
}
void AX25Frame::add_byte(uint8_t byte, bool is_flag, bool is_data) {
uint32_t bit;
if (is_data)
crc_ccitt.process_byte(byte);
for (uint32_t i = 0; i < 8; i++) {
bit = (byte >> i) & 1;
if (!(byte & 1)) {
current_bit ^= 1; // Zero: flip
ones_counter = 0;
byte >>= 1;
i++;
} else {
if (bit)
ones_counter++;
if ((ones_counter == 5) && (!is_flag)) {
current_bit ^= 1; // Stuff zero: flip
ones_counter = 0;
} else {
byte >>= 1;
i++;
}
else
ones_counter = 0;
if ((ones_counter == 6) && (!is_flag)) {
NRZI_add_bit(0);
ones_counter = 0;
}
if (is_data)
crc_ccitt.process_bit(current_bit);
current_byte <<= 1;
current_byte |= current_bit;
if (bit_counter == 7) {
bit_counter = 0;
*bb_data_ptr = current_byte;
bb_data_ptr++;
} else {
bit_counter++;
}
NRZI_add_bit(bit);
}
}
@ -86,32 +89,38 @@ void AX25Frame::add_data(uint8_t byte) {
void AX25Frame::add_checksum() {
auto checksum = crc_ccitt.checksum();
add_byte(checksum >> 8, false, false);
add_byte(checksum, false, false);
add_byte(checksum >> 8, false, false);
}
void AX25Frame::make_ui_frame(char * const address, const uint8_t control,
const uint8_t protocol, uint8_t * const info, size_t length) {
const uint8_t protocol, const std::string& info) {
size_t i;
bb_data_ptr = shared_memory.bb_data.data;
bb_data_ptr = (uint16_t*)shared_memory.bb_data.data;
memset(bb_data_ptr, 0, sizeof(shared_memory.bb_data.data));
bit_counter = 0;
current_bit = 0;
current_byte = 0;
ones_counter = 0;
crc_ccitt.reset();
add_flag();
add_flag();
add_flag();
add_flag();
make_extended_field(address, 14);
add_data(control);
add_data(protocol);
for (i = 0; i < length; i++)
for (i = 0; i < info.size(); i++)
add_data(info[i]);
add_checksum();
add_flag();
add_flag();
flush();