mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-10-01 01:26:06 -04: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/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/baseband/*.img
|
||||
/firmware/application/application.bin
|
||||
/CMakeCache.txt
|
||||
/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_adc.cpp
|
||||
protocols/adsb.cpp
|
||||
protocols/aprs.cpp
|
||||
protocols/ax25.cpp
|
||||
protocols/bht.cpp
|
||||
protocols/dcs.cpp
|
||||
protocols/lcr.cpp
|
||||
@ -155,6 +157,7 @@ set(CPPSRC
|
||||
${COMMON}/ui_focus.cpp
|
||||
ui_about.cpp
|
||||
ui_adsbtx.cpp
|
||||
ui_aprstx.cpp
|
||||
ui_modemsetup.cpp
|
||||
ui_alphanum.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
|
||||
};
|
||||
|
||||
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[] = {
|
||||
0x00, 0x00,
|
||||
0xFF, 0xFF,
|
||||
|
@ -23,18 +23,22 @@
|
||||
// Color bitmaps generated with:
|
||||
// Gimp image > indexed colors (16), then "xxd -i *.bmp"
|
||||
|
||||
//TODO: Scanner multiple slices (buggy)
|
||||
//TODO: Use to_string_short_freq
|
||||
//TODO: Add auto-rounding to 12.5kHz channel option in scanner
|
||||
//TODO: Waveform widget as FFT view in scanner ?
|
||||
//BUG: Replay freezes when SD card not present
|
||||
//BUG: SCANNER Mirroring in proc_wideband...
|
||||
//BUG: SCANNER Lock on frequency, if frequency jump, still locked on first one
|
||||
//BUG: SCANNER Multiple slices
|
||||
//BUG: REPLAY freezes when SD card not present
|
||||
//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: Imperial in whipcalc
|
||||
|
||||
//TODO: Optimize (and group ?) CTCSS tone gen code
|
||||
//TODO: Morse use prosigns
|
||||
//TODO: Morse live keying mode ?
|
||||
/*
|
||||
Continuous (Fox-oring)
|
||||
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);
|
||||
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_rf_amp(true);
|
||||
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_adsbtx.hpp"
|
||||
#include "ui_aprstx.hpp"
|
||||
#include "ui_bht_tx.hpp"
|
||||
#include "ui_coasterp.hpp"
|
||||
#include "ui_cw.hpp"
|
||||
@ -357,7 +358,7 @@ void SystemMenuView::hackrf_mode(NavigationView& nav) {
|
||||
}
|
||||
|
||||
SystemMenuView::SystemMenuView(NavigationView& nav) {
|
||||
add_items<13>({ {
|
||||
add_items<14>({ {
|
||||
{ "Play dead", ui::Color::red(), &bitmap_icon_playdead, [&nav](){ nav.push<PlayDeadView>(); } },
|
||||
{ "Receivers", ui::Color::cyan(), &bitmap_icon_receivers, [&nav](){ nav.push<ReceiverMenuView>(); } },
|
||||
{ "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>(); } },
|
||||
{ "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>(); } },
|
||||
{ "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>(); } },
|
||||
{ "Utilities", ui::Color::purple(),&bitmap_icon_utilities, [&nav](){ nav.push<UtilitiesView>(); } },
|
||||
{ "Setup", ui::Color::white(), &bitmap_icon_setup, [&nav](){ nav.push<SetupMenuView>(); } },
|
||||
|
@ -20,9 +20,6 @@
|
||||
* 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 "baseband_api.hpp"
|
||||
|
@ -448,7 +448,7 @@ set(BASEBAND_IMAGES ${BASEBAND_IMAGES} terminator.img)
|
||||
#######################################################################
|
||||
|
||||
project(baseband)
|
||||
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${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++) {
|
||||
|
||||
if (!sample) {
|
||||
sample = 3;
|
||||
|
||||
if (active) {
|
||||
if (active) {
|
||||
if (!sample) {
|
||||
sample = 3;
|
||||
|
||||
if (preamble) {
|
||||
if (bit_pos >= 16) {
|
||||
preamble = false;
|
||||
@ -60,20 +60,20 @@ void ADSBTXProcessor::execute(const buffer_c8_t& buffer) {
|
||||
bit_pos++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//cur_bit = 0;
|
||||
if (bit_pos == 8192) { // ?
|
||||
configured = false;
|
||||
message.done = true;
|
||||
shared_memory.application_queue.push(message);
|
||||
}
|
||||
bit_pos++;
|
||||
} else
|
||||
sample--;
|
||||
|
||||
if (sample == 1)
|
||||
cur_bit ^= 1; // Invert
|
||||
} else {
|
||||
//cur_bit = 0;
|
||||
if (bit_pos == 8192) { // ?
|
||||
configured = false;
|
||||
message.done = true;
|
||||
shared_memory.application_queue.push(message);
|
||||
}
|
||||
} else
|
||||
sample--;
|
||||
|
||||
if (sample == 1)
|
||||
cur_bit ^= 1; // Invert
|
||||
bit_pos++;
|
||||
}
|
||||
|
||||
delta = tone_sample * fm_delta;
|
||||
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…
Reference in New Issue
Block a user