mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-05-29 20:28:24 +00:00
Started work on APRS (AX25)
This commit is contained in:
parent
a35d9ee8a9
commit
8e99bccd41
21
.gitignore
vendored
21
.gitignore
vendored
@ -1,23 +1,4 @@
|
|||||||
/firmware/baseband/baseband_dtmf_tx.img
|
/firmware/baseband/*.img
|
||||||
/firmware/baseband/baseband.img
|
|
||||||
/firmware/baseband/baseband_afsk.img
|
|
||||||
/firmware/baseband/baseband_ais.img
|
|
||||||
/firmware/baseband/baseband_am_audio.img
|
|
||||||
/firmware/baseband/baseband_audio_tx.img
|
|
||||||
/firmware/baseband/baseband_capture.img
|
|
||||||
/firmware/baseband/baseband_epar.img
|
|
||||||
/firmware/baseband/baseband_ert.img
|
|
||||||
/firmware/baseband/baseband_jammer.img
|
|
||||||
/firmware/baseband/baseband_lcr.img
|
|
||||||
/firmware/baseband/baseband_nfm_audio.img
|
|
||||||
/firmware/baseband/baseband_ook.img
|
|
||||||
/firmware/baseband/baseband_play_audio.img
|
|
||||||
/firmware/baseband/baseband_pocsag.img
|
|
||||||
/firmware/baseband/baseband_rds.img
|
|
||||||
/firmware/baseband/baseband_tpms.img
|
|
||||||
/firmware/baseband/baseband_wfm_audio.img
|
|
||||||
/firmware/baseband/baseband_wideband_spectrum.img
|
|
||||||
/firmware/baseband/baseband_xylos.img
|
|
||||||
/firmware/application/application.bin
|
/firmware/application/application.bin
|
||||||
/CMakeCache.txt
|
/CMakeCache.txt
|
||||||
/Makefile
|
/Makefile
|
||||||
|
@ -1,182 +0,0 @@
|
|||||||
# CMAKE generated file: DO NOT EDIT!
|
|
||||||
# Generated by "Unix Makefiles" Generator, CMake Version 3.5
|
|
||||||
|
|
||||||
# Default target executed when no arguments are given to make.
|
|
||||||
default_target: all
|
|
||||||
|
|
||||||
.PHONY : default_target
|
|
||||||
|
|
||||||
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
|
|
||||||
.NOTPARALLEL:
|
|
||||||
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Special targets provided by cmake.
|
|
||||||
|
|
||||||
# Disable implicit rules so canonical targets will work.
|
|
||||||
.SUFFIXES:
|
|
||||||
|
|
||||||
|
|
||||||
# Remove some rules from gmake that .SUFFIXES does not remove.
|
|
||||||
SUFFIXES =
|
|
||||||
|
|
||||||
.SUFFIXES: .hpux_make_needs_suffix_list
|
|
||||||
|
|
||||||
|
|
||||||
# Suppress display of executed commands.
|
|
||||||
$(VERBOSE).SILENT:
|
|
||||||
|
|
||||||
|
|
||||||
# A target that is always out of date.
|
|
||||||
cmake_force:
|
|
||||||
|
|
||||||
.PHONY : cmake_force
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Set environment variables for the build.
|
|
||||||
|
|
||||||
# The shell in which to execute make rules.
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
# The CMake executable.
|
|
||||||
CMAKE_COMMAND = /usr/bin/cmake
|
|
||||||
|
|
||||||
# The command to remove a file.
|
|
||||||
RM = /usr/bin/cmake -E remove -f
|
|
||||||
|
|
||||||
# Escaping for special characters.
|
|
||||||
EQUALS = =
|
|
||||||
|
|
||||||
# The top-level source directory on which CMake was run.
|
|
||||||
CMAKE_SOURCE_DIR = /home/furrtek/portapack-hackrf
|
|
||||||
|
|
||||||
# The top-level build directory on which CMake was run.
|
|
||||||
CMAKE_BINARY_DIR = /home/furrtek/portapack-hackrf
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Targets provided globally by CMake.
|
|
||||||
|
|
||||||
# Special rule for the target edit_cache
|
|
||||||
edit_cache:
|
|
||||||
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
|
|
||||||
/usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
|
|
||||||
.PHONY : edit_cache
|
|
||||||
|
|
||||||
# Special rule for the target edit_cache
|
|
||||||
edit_cache/fast: edit_cache
|
|
||||||
|
|
||||||
.PHONY : edit_cache/fast
|
|
||||||
|
|
||||||
# Special rule for the target rebuild_cache
|
|
||||||
rebuild_cache:
|
|
||||||
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
|
|
||||||
/usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
|
|
||||||
.PHONY : rebuild_cache
|
|
||||||
|
|
||||||
# Special rule for the target rebuild_cache
|
|
||||||
rebuild_cache/fast: rebuild_cache
|
|
||||||
|
|
||||||
.PHONY : rebuild_cache/fast
|
|
||||||
|
|
||||||
# The main all target
|
|
||||||
all: cmake_check_build_system
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles /home/furrtek/portapack-hackrf/firmware/CMakeFiles/progress.marks
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/all
|
|
||||||
$(CMAKE_COMMAND) -E cmake_progress_start /home/furrtek/portapack-hackrf/CMakeFiles 0
|
|
||||||
.PHONY : all
|
|
||||||
|
|
||||||
# The main clean target
|
|
||||||
clean:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/clean
|
|
||||||
.PHONY : clean
|
|
||||||
|
|
||||||
# The main clean target
|
|
||||||
clean/fast: clean
|
|
||||||
|
|
||||||
.PHONY : clean/fast
|
|
||||||
|
|
||||||
# Prepare targets for installation.
|
|
||||||
preinstall: all
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/preinstall
|
|
||||||
.PHONY : preinstall
|
|
||||||
|
|
||||||
# Prepare targets for installation.
|
|
||||||
preinstall/fast:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/preinstall
|
|
||||||
.PHONY : preinstall/fast
|
|
||||||
|
|
||||||
# clear depends
|
|
||||||
depend:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
|
|
||||||
.PHONY : depend
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
firmware/CMakeFiles/firmware.dir/rule:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/firmware.dir/rule
|
|
||||||
.PHONY : firmware/CMakeFiles/firmware.dir/rule
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
firmware: firmware/CMakeFiles/firmware.dir/rule
|
|
||||||
|
|
||||||
.PHONY : firmware
|
|
||||||
|
|
||||||
# fast build rule for target.
|
|
||||||
firmware/fast:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/firmware.dir/build.make firmware/CMakeFiles/firmware.dir/build
|
|
||||||
.PHONY : firmware/fast
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
firmware/CMakeFiles/program.dir/rule:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/program.dir/rule
|
|
||||||
.PHONY : firmware/CMakeFiles/program.dir/rule
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
program: firmware/CMakeFiles/program.dir/rule
|
|
||||||
|
|
||||||
.PHONY : program
|
|
||||||
|
|
||||||
# fast build rule for target.
|
|
||||||
program/fast:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/program.dir/build.make firmware/CMakeFiles/program.dir/build
|
|
||||||
.PHONY : program/fast
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
firmware/CMakeFiles/release.dir/rule:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f CMakeFiles/Makefile2 firmware/CMakeFiles/release.dir/rule
|
|
||||||
.PHONY : firmware/CMakeFiles/release.dir/rule
|
|
||||||
|
|
||||||
# Convenience name for target.
|
|
||||||
release: firmware/CMakeFiles/release.dir/rule
|
|
||||||
|
|
||||||
.PHONY : release
|
|
||||||
|
|
||||||
# fast build rule for target.
|
|
||||||
release/fast:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/CMakeFiles/release.dir/build.make firmware/CMakeFiles/release.dir/build
|
|
||||||
.PHONY : release/fast
|
|
||||||
|
|
||||||
# Help Target
|
|
||||||
help:
|
|
||||||
@echo "The following are some of the valid targets for this Makefile:"
|
|
||||||
@echo "... all (the default if no target is provided)"
|
|
||||||
@echo "... clean"
|
|
||||||
@echo "... depend"
|
|
||||||
@echo "... edit_cache"
|
|
||||||
@echo "... firmware"
|
|
||||||
@echo "... program"
|
|
||||||
@echo "... release"
|
|
||||||
@echo "... rebuild_cache"
|
|
||||||
.PHONY : help
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Special targets to cleanup operation of make.
|
|
||||||
|
|
||||||
# Special rule to run CMake to check the build system integrity.
|
|
||||||
# No rule that depends on this can have commands that come from listfiles
|
|
||||||
# because they might be regenerated.
|
|
||||||
cmake_check_build_system:
|
|
||||||
cd /home/furrtek/portapack-hackrf && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
|
|
||||||
.PHONY : cmake_check_build_system
|
|
||||||
|
|
@ -136,6 +136,8 @@ set(CPPSRC
|
|||||||
touch.cpp
|
touch.cpp
|
||||||
touch_adc.cpp
|
touch_adc.cpp
|
||||||
protocols/adsb.cpp
|
protocols/adsb.cpp
|
||||||
|
protocols/aprs.cpp
|
||||||
|
protocols/ax25.cpp
|
||||||
protocols/bht.cpp
|
protocols/bht.cpp
|
||||||
protocols/dcs.cpp
|
protocols/dcs.cpp
|
||||||
protocols/lcr.cpp
|
protocols/lcr.cpp
|
||||||
@ -155,6 +157,7 @@ set(CPPSRC
|
|||||||
${COMMON}/ui_focus.cpp
|
${COMMON}/ui_focus.cpp
|
||||||
ui_about.cpp
|
ui_about.cpp
|
||||||
ui_adsbtx.cpp
|
ui_adsbtx.cpp
|
||||||
|
ui_aprstx.cpp
|
||||||
ui_modemsetup.cpp
|
ui_modemsetup.cpp
|
||||||
ui_alphanum.cpp
|
ui_alphanum.cpp
|
||||||
ui_audio.cpp
|
ui_audio.cpp
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1063,6 +1063,28 @@ static constexpr Bitmap bitmap_icon_replay {
|
|||||||
{ 16, 16 }, bitmap_icon_replay_data
|
{ 16, 16 }, bitmap_icon_replay_data
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr uint8_t bitmap_icon_aprs_data[] = {
|
||||||
|
0x00, 0x00,
|
||||||
|
0x00, 0x00,
|
||||||
|
0x00, 0x00,
|
||||||
|
0xF0, 0x0F,
|
||||||
|
0x4C, 0x32,
|
||||||
|
0xFE, 0x7F,
|
||||||
|
0x25, 0xA4,
|
||||||
|
0x25, 0xA4,
|
||||||
|
0xFF, 0xFF,
|
||||||
|
0x25, 0xA4,
|
||||||
|
0x25, 0xA4,
|
||||||
|
0xFE, 0x7F,
|
||||||
|
0x4C, 0x32,
|
||||||
|
0xF0, 0x0F,
|
||||||
|
0x00, 0x00,
|
||||||
|
0x00, 0x00,
|
||||||
|
};
|
||||||
|
static constexpr Bitmap bitmap_icon_aprs {
|
||||||
|
{ 16, 16 }, bitmap_icon_aprs_data
|
||||||
|
};
|
||||||
|
|
||||||
static constexpr uint8_t bitmap_icon_soundboard_data[] = {
|
static constexpr uint8_t bitmap_icon_soundboard_data[] = {
|
||||||
0x00, 0x00,
|
0x00, 0x00,
|
||||||
0xFF, 0xFF,
|
0xFF, 0xFF,
|
||||||
|
@ -23,18 +23,22 @@
|
|||||||
// Color bitmaps generated with:
|
// Color bitmaps generated with:
|
||||||
// Gimp image > indexed colors (16), then "xxd -i *.bmp"
|
// Gimp image > indexed colors (16), then "xxd -i *.bmp"
|
||||||
|
|
||||||
//TODO: Scanner multiple slices (buggy)
|
//BUG: SCANNER Mirroring in proc_wideband...
|
||||||
//TODO: Use to_string_short_freq
|
//BUG: SCANNER Lock on frequency, if frequency jump, still locked on first one
|
||||||
//TODO: Add auto-rounding to 12.5kHz channel option in scanner
|
//BUG: SCANNER Multiple slices
|
||||||
//TODO: Waveform widget as FFT view in scanner ?
|
//BUG: REPLAY freezes when SD card not present
|
||||||
//BUG: Replay freezes when SD card not present
|
|
||||||
//BUG: RDS doesn't stop baseband when stopping tx ?
|
//BUG: RDS doesn't stop baseband when stopping tx ?
|
||||||
|
|
||||||
|
//TODO: Merge AFSK and TONES procs ?
|
||||||
|
//TODO: NFM Squelch level setting
|
||||||
|
//TODO: NFM RX nav.pop on squelch
|
||||||
|
//TODO: MORSE use prosigns
|
||||||
|
//TODO: MORSE live keying mode
|
||||||
|
//TODO: Use to_string_short_freq wherever possible
|
||||||
|
//TODO: SCANNER Waveform widget as FFT view ?
|
||||||
//TEST: Check AFSK transmit end, skips last bits ?
|
//TEST: Check AFSK transmit end, skips last bits ?
|
||||||
//TEST: Imperial in whipcalc
|
//TEST: Imperial in whipcalc
|
||||||
|
|
||||||
//TODO: Optimize (and group ?) CTCSS tone gen code
|
//TODO: Optimize (and group ?) CTCSS tone gen code
|
||||||
//TODO: Morse use prosigns
|
|
||||||
//TODO: Morse live keying mode ?
|
|
||||||
/*
|
/*
|
||||||
Continuous (Fox-oring)
|
Continuous (Fox-oring)
|
||||||
12s transmit, 48s space (Sprint 1/5th)
|
12s transmit, 48s space (Sprint 1/5th)
|
||||||
|
44
firmware/application/protocols/aprs.cpp
Normal file
44
firmware/application/protocols/aprs.cpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "aprs.hpp"
|
||||||
|
#include "ax25.hpp"
|
||||||
|
|
||||||
|
#include "portapack_persistent_memory.hpp"
|
||||||
|
|
||||||
|
using namespace ax25;
|
||||||
|
|
||||||
|
namespace aprs {
|
||||||
|
|
||||||
|
void make_aprs_frame(char * address_dest, char * address_src) {
|
||||||
|
AX25Frame frame;
|
||||||
|
|
||||||
|
char address[14] = { 0 };
|
||||||
|
uint8_t info[7] = { 0 }; //{ 'F','U','R','R','T','E','K' };
|
||||||
|
|
||||||
|
memcpy(&address[0], address_dest, 6);
|
||||||
|
memcpy(&address[7], address_src, 6);
|
||||||
|
|
||||||
|
frame.make_ui_frame(address, 0x03, 0xF0, info, sizeof(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace aprs */
|
35
firmware/application/protocols/aprs.hpp
Normal file
35
firmware/application/protocols/aprs.hpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifndef __APRS_H__
|
||||||
|
#define __APRS_H__
|
||||||
|
|
||||||
|
namespace aprs {
|
||||||
|
|
||||||
|
void make_aprs_frame();
|
||||||
|
|
||||||
|
} /* namespace aprs */
|
||||||
|
|
||||||
|
#endif/*__APRS_H__*/
|
120
firmware/application/protocols/ax25.cpp
Normal file
120
firmware/application/protocols/ax25.cpp
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ax25.hpp"
|
||||||
|
|
||||||
|
#include "portapack_shared_memory.hpp"
|
||||||
|
|
||||||
|
namespace ax25 {
|
||||||
|
|
||||||
|
void AX25Frame::make_extended_field(char * const data, size_t length) {
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < length - 1; i++)
|
||||||
|
add_data(data[i] << 1);
|
||||||
|
|
||||||
|
add_data((data[i] << 1) | 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AX25Frame::add_byte(uint8_t byte, bool is_flag, bool is_data) {
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < 8; ) {
|
||||||
|
|
||||||
|
if (!(byte & 1)) {
|
||||||
|
current_bit ^= 1; // Zero: flip
|
||||||
|
ones_counter = 0;
|
||||||
|
byte >>= 1;
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
ones_counter++;
|
||||||
|
if ((ones_counter == 5) && (!is_flag)) {
|
||||||
|
current_bit ^= 1; // Stuff zero: flip
|
||||||
|
ones_counter = 0;
|
||||||
|
} else {
|
||||||
|
byte >>= 1;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AX25Frame::flush() {
|
||||||
|
if (bit_counter)
|
||||||
|
*bb_data_ptr = current_byte << (7 - bit_counter);
|
||||||
|
};
|
||||||
|
|
||||||
|
void AX25Frame::add_flag() {
|
||||||
|
add_byte(AX25_FLAG, true, false);
|
||||||
|
};
|
||||||
|
|
||||||
|
void AX25Frame::add_data(uint8_t byte) {
|
||||||
|
add_byte(byte, false, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
void AX25Frame::add_checksum() {
|
||||||
|
auto checksum = crc_ccitt.checksum();
|
||||||
|
add_byte(checksum >> 8, false, false);
|
||||||
|
add_byte(checksum, 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) {
|
||||||
|
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
bb_data_ptr = shared_memory.bb_data.data;
|
||||||
|
bit_counter = 0;
|
||||||
|
current_bit = 0;
|
||||||
|
current_byte = 0;
|
||||||
|
ones_counter = 0;
|
||||||
|
crc_ccitt.reset();
|
||||||
|
|
||||||
|
add_flag();
|
||||||
|
|
||||||
|
make_extended_field(address, 14);
|
||||||
|
add_data(control);
|
||||||
|
add_data(protocol);
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
add_data(info[i]);
|
||||||
|
|
||||||
|
add_checksum();
|
||||||
|
add_flag();
|
||||||
|
|
||||||
|
flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace ax25 */
|
68
firmware/application/protocols/ax25.hpp
Normal file
68
firmware/application/protocols/ax25.hpp
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "crc.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifndef __AX25_H__
|
||||||
|
#define __AX25_H__
|
||||||
|
|
||||||
|
#define AX25_FLAG 0x7E
|
||||||
|
|
||||||
|
namespace ax25 {
|
||||||
|
|
||||||
|
enum protocol_id_t {
|
||||||
|
X25_PLP = 0x01,
|
||||||
|
COMP_TCPIP = 0x06,
|
||||||
|
UNCOMP_TCPIP = 0x07,
|
||||||
|
SEG_FRAG = 0x08,
|
||||||
|
FLEXNET = 0xCE,
|
||||||
|
NO_LAYER3 = 0xF0
|
||||||
|
};
|
||||||
|
|
||||||
|
class AX25Frame {
|
||||||
|
public:
|
||||||
|
void make_ui_frame(char * const address, const uint8_t control, const uint8_t protocol,
|
||||||
|
uint8_t * const info, size_t length);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void make_extended_field(char * const data, size_t length);
|
||||||
|
void add_byte(uint8_t byte, bool is_flag, bool is_data);
|
||||||
|
void add_data(uint8_t byte);
|
||||||
|
void add_checksum();
|
||||||
|
void add_flag();
|
||||||
|
void flush();
|
||||||
|
|
||||||
|
uint8_t * bb_data_ptr { nullptr };
|
||||||
|
uint8_t current_bit { 0 };
|
||||||
|
uint8_t current_byte { 0 };
|
||||||
|
size_t bit_counter { 0 };
|
||||||
|
uint8_t ones_counter { 0 };
|
||||||
|
|
||||||
|
CRC<16> crc_ccitt { 0x1021, 0xFFFF };
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace ax25 */
|
||||||
|
|
||||||
|
#endif/*__AX25_H__*/
|
@ -79,7 +79,7 @@ bool ADSBTxView::start_tx() {
|
|||||||
memcpy(shared_memory.bb_data.data, adsb_bin, 112);
|
memcpy(shared_memory.bb_data.data, adsb_bin, 112);
|
||||||
baseband::set_adsb();
|
baseband::set_adsb();
|
||||||
|
|
||||||
transmitter_model.set_tuning_frequency(434000000); // FOR TESTING - DEBUG
|
transmitter_model.set_tuning_frequency(1090000000); // FOR TESTING - DEBUG
|
||||||
transmitter_model.set_sampling_rate(4000000U);
|
transmitter_model.set_sampling_rate(4000000U);
|
||||||
transmitter_model.set_rf_amp(true);
|
transmitter_model.set_rf_amp(true);
|
||||||
transmitter_model.set_vga(40);
|
transmitter_model.set_vga(40);
|
||||||
|
101
firmware/application/ui_aprstx.cpp
Normal file
101
firmware/application/ui_aprstx.cpp
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ui_aprstx.hpp"
|
||||||
|
#include "ui_alphanum.hpp"
|
||||||
|
|
||||||
|
#include "aprs.hpp"
|
||||||
|
#include "string_format.hpp"
|
||||||
|
#include "portapack.hpp"
|
||||||
|
#include "baseband_api.hpp"
|
||||||
|
#include "portapack_persistent_memory.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace aprs;
|
||||||
|
using namespace portapack;
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
void APRSTXView::focus() {
|
||||||
|
tx_view.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
APRSTXView::~APRSTXView() {
|
||||||
|
transmitter_model.disable();
|
||||||
|
baseband::shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
void APRSTXView::paint(Painter& painter) {
|
||||||
|
(void)painter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void APRSTXView::generate_frame() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void APRSTXView::start_tx() {
|
||||||
|
//generate_frame();
|
||||||
|
|
||||||
|
/*transmitter_model.set_tuning_frequency(144800000);
|
||||||
|
transmitter_model.set_rf_amp(true);
|
||||||
|
transmitter_model.set_baseband_bandwidth(2500000);
|
||||||
|
transmitter_model.enable();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void APRSTXView::on_txdone(const bool v) {
|
||||||
|
if (v) {
|
||||||
|
transmitter_model.disable();
|
||||||
|
tx_view.set_transmitting(false);
|
||||||
|
//progress.set_value(0);
|
||||||
|
} else {
|
||||||
|
//progress.set_value(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
APRSTXView::APRSTXView(NavigationView& nav) {
|
||||||
|
|
||||||
|
baseband::run_image(portapack::spi_flash::image_tag_afsk);
|
||||||
|
|
||||||
|
add_children({
|
||||||
|
&labels,
|
||||||
|
&text_frame_a,
|
||||||
|
&tx_view
|
||||||
|
});
|
||||||
|
|
||||||
|
tx_view.on_edit_frequency = [this, &nav]() {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_view.on_start = [this]() {
|
||||||
|
start_tx();
|
||||||
|
tx_view.set_transmitting(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_view.on_stop = [this]() {
|
||||||
|
tx_view.set_transmitting(false);
|
||||||
|
transmitter_model.disable();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace ui */
|
86
firmware/application/ui_aprstx.hpp
Normal file
86
firmware/application/ui_aprstx.hpp
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2017 Furrtek
|
||||||
|
*
|
||||||
|
* This file is part of PortaPack.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ui.hpp"
|
||||||
|
#include "ui_textentry.hpp"
|
||||||
|
#include "ui_widget.hpp"
|
||||||
|
#include "ui_navigation.hpp"
|
||||||
|
#include "ui_font_fixed_8x16.hpp"
|
||||||
|
#include "ui_transmitter.hpp"
|
||||||
|
|
||||||
|
#include "message.hpp"
|
||||||
|
#include "transmitter_model.hpp"
|
||||||
|
#include "portapack.hpp"
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
class APRSTXView : public View {
|
||||||
|
public:
|
||||||
|
APRSTXView(NavigationView& nav);
|
||||||
|
~APRSTXView();
|
||||||
|
|
||||||
|
void paint(Painter& painter) override;
|
||||||
|
|
||||||
|
void focus() override;
|
||||||
|
|
||||||
|
std::string title() const override { return "APRS TX (beta)"; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*enum tx_modes {
|
||||||
|
IDLE = 0,
|
||||||
|
SINGLE,
|
||||||
|
SEQUENCE
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_modes tx_mode = IDLE;*/
|
||||||
|
|
||||||
|
void start_tx();
|
||||||
|
void generate_frame();
|
||||||
|
void generate_frame_pos();
|
||||||
|
void on_txdone(const bool v);
|
||||||
|
|
||||||
|
Labels labels {
|
||||||
|
{ { 2 * 8, 2 * 8 }, "Work in progress...", Color::light_grey() }
|
||||||
|
};
|
||||||
|
|
||||||
|
Text text_frame_a {
|
||||||
|
{ 2 * 8, 13 * 16, 14 * 8, 16 },
|
||||||
|
"-"
|
||||||
|
};
|
||||||
|
|
||||||
|
TransmitterView tx_view {
|
||||||
|
16 * 16,
|
||||||
|
144800000,
|
||||||
|
2000000,
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
|
MessageHandlerRegistration message_handler_tx_done {
|
||||||
|
Message::ID::TXDone,
|
||||||
|
[this](const Message* const p) {
|
||||||
|
const auto message = *reinterpret_cast<const TXDoneMessage*>(p);
|
||||||
|
this->on_txdone(message.done);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace ui */
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "ui_about.hpp"
|
#include "ui_about.hpp"
|
||||||
#include "ui_adsbtx.hpp"
|
#include "ui_adsbtx.hpp"
|
||||||
|
#include "ui_aprstx.hpp"
|
||||||
#include "ui_bht_tx.hpp"
|
#include "ui_bht_tx.hpp"
|
||||||
#include "ui_coasterp.hpp"
|
#include "ui_coasterp.hpp"
|
||||||
#include "ui_cw.hpp"
|
#include "ui_cw.hpp"
|
||||||
@ -357,7 +358,7 @@ void SystemMenuView::hackrf_mode(NavigationView& nav) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SystemMenuView::SystemMenuView(NavigationView& nav) {
|
SystemMenuView::SystemMenuView(NavigationView& nav) {
|
||||||
add_items<13>({ {
|
add_items<14>({ {
|
||||||
{ "Play dead", ui::Color::red(), &bitmap_icon_playdead, [&nav](){ nav.push<PlayDeadView>(); } },
|
{ "Play dead", ui::Color::red(), &bitmap_icon_playdead, [&nav](){ nav.push<PlayDeadView>(); } },
|
||||||
{ "Receivers", ui::Color::cyan(), &bitmap_icon_receivers, [&nav](){ nav.push<ReceiverMenuView>(); } },
|
{ "Receivers", ui::Color::cyan(), &bitmap_icon_receivers, [&nav](){ nav.push<ReceiverMenuView>(); } },
|
||||||
{ "Capture", ui::Color::blue(), &bitmap_icon_capture, [&nav](){ nav.push<CaptureAppView>(); } },
|
{ "Capture", ui::Color::blue(), &bitmap_icon_capture, [&nav](){ nav.push<CaptureAppView>(); } },
|
||||||
@ -365,7 +366,8 @@ SystemMenuView::SystemMenuView(NavigationView& nav) {
|
|||||||
{ "Audio transmitters", ui::Color::green(), &bitmap_icon_audiotx, [&nav](){ nav.push<TransmitterAudioMenuView>(); } },
|
{ "Audio transmitters", ui::Color::green(), &bitmap_icon_audiotx, [&nav](){ nav.push<TransmitterAudioMenuView>(); } },
|
||||||
{ "Code transmitters", ui::Color::green(), &bitmap_icon_codetx, [&nav](){ nav.push<TransmitterCodedMenuView>(); } },
|
{ "Code transmitters", ui::Color::green(), &bitmap_icon_codetx, [&nav](){ nav.push<TransmitterCodedMenuView>(); } },
|
||||||
{ "SSTV transmitter", ui::Color::dark_green(), &bitmap_icon_sstv, [&nav](){ nav.push<SSTVTXView>(); } },
|
{ "SSTV transmitter", ui::Color::dark_green(), &bitmap_icon_sstv, [&nav](){ nav.push<SSTVTXView>(); } },
|
||||||
{ "Scanner/search", ui::Color::cyan(), &bitmap_icon_closecall, [&nav](){ nav.push<ScannerView>(); } },
|
{ "APRS transmitter", ui::Color::grey(), &bitmap_icon_aprs, [&nav](){ nav.push<APRSTXView>(); } },
|
||||||
|
{ "Scanner/search", ui::Color::blue(), &bitmap_icon_closecall, [&nav](){ nav.push<ScannerView>(); } },
|
||||||
{ "Jammer", ui::Color::orange(),&bitmap_icon_jammer, [&nav](){ nav.push<JammerView>(); } },
|
{ "Jammer", ui::Color::orange(),&bitmap_icon_jammer, [&nav](){ nav.push<JammerView>(); } },
|
||||||
{ "Utilities", ui::Color::purple(),&bitmap_icon_utilities, [&nav](){ nav.push<UtilitiesView>(); } },
|
{ "Utilities", ui::Color::purple(),&bitmap_icon_utilities, [&nav](){ nav.push<UtilitiesView>(); } },
|
||||||
{ "Setup", ui::Color::white(), &bitmap_icon_setup, [&nav](){ nav.push<SetupMenuView>(); } },
|
{ "Setup", ui::Color::white(), &bitmap_icon_setup, [&nav](){ nav.push<SetupMenuView>(); } },
|
||||||
|
@ -20,9 +20,6 @@
|
|||||||
* Boston, MA 02110-1301, USA.
|
* Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// BUG: Mirroring in proc_wideband...
|
|
||||||
// BUG: Lock on frequency, if frequency jump, still locked on first one
|
|
||||||
|
|
||||||
#include "ui_scanner.hpp"
|
#include "ui_scanner.hpp"
|
||||||
|
|
||||||
#include "baseband_api.hpp"
|
#include "baseband_api.hpp"
|
||||||
|
@ -448,7 +448,7 @@ set(BASEBAND_IMAGES ${BASEBAND_IMAGES} terminator.img)
|
|||||||
#######################################################################
|
#######################################################################
|
||||||
|
|
||||||
project(baseband)
|
project(baseband)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${PROJECT_NAME}.img
|
OUTPUT ${PROJECT_NAME}.img
|
||||||
COMMAND cat ${BASEBAND_IMAGES} > ${PROJECT_NAME}.img
|
COMMAND cat ${BASEBAND_IMAGES} > ${PROJECT_NAME}.img
|
||||||
|
Binary file not shown.
@ -37,10 +37,10 @@ void ADSBTXProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
|
|
||||||
for (size_t i = 0; i < buffer.count; i++) {
|
for (size_t i = 0; i < buffer.count; i++) {
|
||||||
|
|
||||||
if (!sample) {
|
if (active) {
|
||||||
sample = 3;
|
if (!sample) {
|
||||||
|
sample = 3;
|
||||||
if (active) {
|
|
||||||
if (preamble) {
|
if (preamble) {
|
||||||
if (bit_pos >= 16) {
|
if (bit_pos >= 16) {
|
||||||
preamble = false;
|
preamble = false;
|
||||||
@ -60,20 +60,20 @@ void ADSBTXProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
bit_pos++;
|
bit_pos++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
//cur_bit = 0;
|
sample--;
|
||||||
if (bit_pos == 8192) { // ?
|
|
||||||
configured = false;
|
if (sample == 1)
|
||||||
message.done = true;
|
cur_bit ^= 1; // Invert
|
||||||
shared_memory.application_queue.push(message);
|
} else {
|
||||||
}
|
//cur_bit = 0;
|
||||||
bit_pos++;
|
if (bit_pos == 8192) { // ?
|
||||||
|
configured = false;
|
||||||
|
message.done = true;
|
||||||
|
shared_memory.application_queue.push(message);
|
||||||
}
|
}
|
||||||
} else
|
bit_pos++;
|
||||||
sample--;
|
}
|
||||||
|
|
||||||
if (sample == 1)
|
|
||||||
cur_bit ^= 1; // Invert
|
|
||||||
|
|
||||||
delta = tone_sample * fm_delta;
|
delta = tone_sample * fm_delta;
|
||||||
tone_sample += 128;
|
tone_sample += 128;
|
||||||
|
Binary file not shown.
BIN
firmware/graphics/icon_aprs.png
Normal file
BIN
firmware/graphics/icon_aprs.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 119 B |
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user