mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-01-13 01:33:43 +00:00
Transmitter config widget
Frequency manager duplicate alert Tone sets
This commit is contained in:
parent
0642d633c3
commit
688a012443
@ -175,6 +175,7 @@ set(CPPSRC
|
|||||||
ui_record_view.cpp
|
ui_record_view.cpp
|
||||||
ui_replay_view.cpp
|
ui_replay_view.cpp
|
||||||
ui_rssi.cpp
|
ui_rssi.cpp
|
||||||
|
ui_script.cpp
|
||||||
ui_sd_card_status_view.cpp
|
ui_sd_card_status_view.cpp
|
||||||
ui_sd_wipe.cpp
|
ui_sd_wipe.cpp
|
||||||
# ui_sd_card_debug.cpp
|
# ui_sd_card_debug.cpp
|
||||||
@ -183,6 +184,7 @@ set(CPPSRC
|
|||||||
ui_spectrum.cpp
|
ui_spectrum.cpp
|
||||||
ui_textentry.cpp
|
ui_textentry.cpp
|
||||||
ui_touch_calibration.cpp
|
ui_touch_calibration.cpp
|
||||||
|
ui_transmitter.cpp
|
||||||
ui_whipcalc.cpp
|
ui_whipcalc.cpp
|
||||||
ui_whistle.cpp
|
ui_whistle.cpp
|
||||||
# ui_loadmodule.cpp
|
# ui_loadmodule.cpp
|
||||||
|
@ -5000,6 +5000,33 @@ ui_rssi.cpp.s:
|
|||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.s
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_rssi.cpp.s
|
||||||
.PHONY : ui_rssi.cpp.s
|
.PHONY : ui_rssi.cpp.s
|
||||||
|
|
||||||
|
ui_script.obj: ui_script.cpp.obj
|
||||||
|
|
||||||
|
.PHONY : ui_script.obj
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
ui_script.cpp.obj:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_script.cpp.obj
|
||||||
|
.PHONY : ui_script.cpp.obj
|
||||||
|
|
||||||
|
ui_script.i: ui_script.cpp.i
|
||||||
|
|
||||||
|
.PHONY : ui_script.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
ui_script.cpp.i:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_script.cpp.i
|
||||||
|
.PHONY : ui_script.cpp.i
|
||||||
|
|
||||||
|
ui_script.s: ui_script.cpp.s
|
||||||
|
|
||||||
|
.PHONY : ui_script.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
ui_script.cpp.s:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_script.cpp.s
|
||||||
|
.PHONY : ui_script.cpp.s
|
||||||
|
|
||||||
ui_sd_card_status_view.obj: ui_sd_card_status_view.cpp.obj
|
ui_sd_card_status_view.obj: ui_sd_card_status_view.cpp.obj
|
||||||
|
|
||||||
.PHONY : ui_sd_card_status_view.obj
|
.PHONY : ui_sd_card_status_view.obj
|
||||||
@ -5189,6 +5216,33 @@ ui_touch_calibration.cpp.s:
|
|||||||
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_touch_calibration.cpp.s
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_touch_calibration.cpp.s
|
||||||
.PHONY : ui_touch_calibration.cpp.s
|
.PHONY : ui_touch_calibration.cpp.s
|
||||||
|
|
||||||
|
ui_transmitter.obj: ui_transmitter.cpp.obj
|
||||||
|
|
||||||
|
.PHONY : ui_transmitter.obj
|
||||||
|
|
||||||
|
# target to build an object file
|
||||||
|
ui_transmitter.cpp.obj:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_transmitter.cpp.obj
|
||||||
|
.PHONY : ui_transmitter.cpp.obj
|
||||||
|
|
||||||
|
ui_transmitter.i: ui_transmitter.cpp.i
|
||||||
|
|
||||||
|
.PHONY : ui_transmitter.i
|
||||||
|
|
||||||
|
# target to preprocess a source file
|
||||||
|
ui_transmitter.cpp.i:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_transmitter.cpp.i
|
||||||
|
.PHONY : ui_transmitter.cpp.i
|
||||||
|
|
||||||
|
ui_transmitter.s: ui_transmitter.cpp.s
|
||||||
|
|
||||||
|
.PHONY : ui_transmitter.s
|
||||||
|
|
||||||
|
# target to generate assembly for a file
|
||||||
|
ui_transmitter.cpp.s:
|
||||||
|
cd /home/furrtek/portapack-hackrf && $(MAKE) -f firmware/application/CMakeFiles/application.elf.dir/build.make firmware/application/CMakeFiles/application.elf.dir/ui_transmitter.cpp.s
|
||||||
|
.PHONY : ui_transmitter.cpp.s
|
||||||
|
|
||||||
ui_whipcalc.obj: ui_whipcalc.cpp.obj
|
ui_whipcalc.obj: ui_whipcalc.cpp.obj
|
||||||
|
|
||||||
.PHONY : ui_whipcalc.obj
|
.PHONY : ui_whipcalc.obj
|
||||||
@ -5793,6 +5847,9 @@ help:
|
|||||||
@echo "... ui_rssi.obj"
|
@echo "... ui_rssi.obj"
|
||||||
@echo "... ui_rssi.i"
|
@echo "... ui_rssi.i"
|
||||||
@echo "... ui_rssi.s"
|
@echo "... ui_rssi.s"
|
||||||
|
@echo "... ui_script.obj"
|
||||||
|
@echo "... ui_script.i"
|
||||||
|
@echo "... ui_script.s"
|
||||||
@echo "... ui_sd_card_status_view.obj"
|
@echo "... ui_sd_card_status_view.obj"
|
||||||
@echo "... ui_sd_card_status_view.i"
|
@echo "... ui_sd_card_status_view.i"
|
||||||
@echo "... ui_sd_card_status_view.s"
|
@echo "... ui_sd_card_status_view.s"
|
||||||
@ -5814,6 +5871,9 @@ help:
|
|||||||
@echo "... ui_touch_calibration.obj"
|
@echo "... ui_touch_calibration.obj"
|
||||||
@echo "... ui_touch_calibration.i"
|
@echo "... ui_touch_calibration.i"
|
||||||
@echo "... ui_touch_calibration.s"
|
@echo "... ui_touch_calibration.s"
|
||||||
|
@echo "... ui_transmitter.obj"
|
||||||
|
@echo "... ui_transmitter.i"
|
||||||
|
@echo "... ui_transmitter.s"
|
||||||
@echo "... ui_whipcalc.obj"
|
@echo "... ui_whipcalc.obj"
|
||||||
@echo "... ui_whipcalc.i"
|
@echo "... ui_whipcalc.i"
|
||||||
@echo "... ui_whipcalc.s"
|
@echo "... ui_whipcalc.s"
|
||||||
|
@ -79,7 +79,7 @@ void WFMConfig::apply() const {
|
|||||||
audio::set_rate(audio::Rate::Hz_48000);
|
audio::set_rate(audio::Rate::Hz_48000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_tones_data(const uint64_t bw, const uint32_t pre_silence, const uint16_t tone_count,
|
void set_tones_data(const uint32_t bw, const uint32_t pre_silence, const uint16_t tone_count,
|
||||||
const bool dual_tone, const bool audio_out) {
|
const bool dual_tone, const bool audio_out) {
|
||||||
const TonesConfigureMessage message {
|
const TonesConfigureMessage message {
|
||||||
(uint32_t)(262144 * bw) / 1536000,
|
(uint32_t)(262144 * bw) / 1536000,
|
||||||
|
@ -54,7 +54,7 @@ struct WFMConfig {
|
|||||||
void apply() const;
|
void apply() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
void set_tones_data(const uint64_t bw, const uint32_t pre_silence, const uint16_t tone_count,
|
void set_tones_data(const uint32_t bw, const uint32_t pre_silence, const uint16_t tone_count,
|
||||||
const bool dual_tone, const bool audio_out);
|
const bool dual_tone, const bool audio_out);
|
||||||
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const bool ctcss_enabled, const uint32_t ctcss_phase_inc);
|
void set_audiotx_data(const uint32_t divider, const uint32_t bw, const bool ctcss_enabled, const uint32_t ctcss_phase_inc);
|
||||||
void set_fifo_data(const int8_t * data);
|
void set_fifo_data(const int8_t * data);
|
||||||
|
@ -24,14 +24,14 @@
|
|||||||
#include "ui_widget.hpp"
|
#include "ui_widget.hpp"
|
||||||
#include "ui_navigation.hpp"
|
#include "ui_navigation.hpp"
|
||||||
|
|
||||||
|
#include "tonesets.hpp"
|
||||||
#include "encoders.hpp"
|
#include "encoders.hpp"
|
||||||
#include "portapack.hpp"
|
#include "portapack.hpp"
|
||||||
|
|
||||||
using namespace encoders;
|
using namespace encoders;
|
||||||
|
|
||||||
#define CCIR_TONE_LENGTH (153600-1) // 1536000*0.1
|
#define XY_TONE_LENGTH ((TONES_SAMPLERATE * 0.1) - 1) // 100ms
|
||||||
#define CCIR_DELTA_COEF (43.691) // (65536*1024)/1536000
|
#define XY_SILENCE (TONES_SAMPLERATE * 0.4) // 400ms
|
||||||
#define CCIR_SILENCE (614400-1) // 400ms
|
|
||||||
|
|
||||||
struct bht_city {
|
struct bht_city {
|
||||||
std::string name;
|
std::string name;
|
||||||
@ -39,25 +39,6 @@ struct bht_city {
|
|||||||
bool recent;
|
bool recent;
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint32_t ccir_deltas[16] = {
|
|
||||||
(uint32_t)(1981 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1124 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1197 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1275 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1358 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1446 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1540 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1640 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1747 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1860 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(2400 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(930 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(2247 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(991 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(2110 * CCIR_DELTA_COEF),
|
|
||||||
(uint32_t)(1055 * CCIR_DELTA_COEF)
|
|
||||||
};
|
|
||||||
|
|
||||||
const rf::Frequency bht_freqs[7] = { 31325000, 31387500, 31437500, 31475000, 31687500, 31975000, 88000000 };
|
const rf::Frequency bht_freqs[7] = { 31325000, 31387500, 31437500, 31475000, 31687500, 31975000, 88000000 };
|
||||||
|
|
||||||
std::string gen_message_ep(uint8_t city_code, size_t family_code_ep, uint32_t relay_state_A, uint32_t relay_state_B);
|
std::string gen_message_ep(uint8_t city_code, size_t family_code_ep, uint32_t relay_state_A, uint32_t relay_state_B);
|
||||||
|
@ -104,7 +104,7 @@ std::string freqman_item_string(freqman_entry &entry) {
|
|||||||
to_string_dec_int((value / 100) % 10000, 4, '0');
|
to_string_dec_int((value / 100) % 10000, 4, '0');
|
||||||
|
|
||||||
if (entry.description.size() <= 19) {
|
if (entry.description.size() <= 19) {
|
||||||
item_string = entry.frequency_str + ":" + entry.description;
|
item_string = entry.frequency_str + "M: " + entry.description;
|
||||||
} else {
|
} else {
|
||||||
memcpy(temp_buffer, entry.description.c_str(), 16);
|
memcpy(temp_buffer, entry.description.c_str(), 16);
|
||||||
temp_buffer[16] = (char)0;
|
temp_buffer[16] = (char)0;
|
||||||
|
@ -34,7 +34,8 @@ using namespace ui;
|
|||||||
enum freqman_error {
|
enum freqman_error {
|
||||||
NO_ERROR = 0,
|
NO_ERROR = 0,
|
||||||
ERROR_ACCESS,
|
ERROR_ACCESS,
|
||||||
ERROR_EMPTY
|
ERROR_EMPTY,
|
||||||
|
ERROR_DUPLICATE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct freqman_entry {
|
struct freqman_entry {
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
// 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"
|
||||||
|
|
||||||
|
//BUG: Set description in frequency save makes everything go crazy
|
||||||
//BUG: Distorted audio in WFM receiver
|
//BUG: Distorted audio in WFM receiver
|
||||||
//BUG: (fixed ?) Bad console scroll init
|
//BUG: (fixed ?) Bad console scroll init
|
||||||
//BUG: POCSAG misses alphanum messages, cuts them off sometimes
|
//BUG: POCSAG misses alphanum messages, cuts them off sometimes
|
||||||
@ -33,8 +34,7 @@
|
|||||||
//TEST: Numbers
|
//TEST: Numbers
|
||||||
//TEST: Jammer
|
//TEST: Jammer
|
||||||
|
|
||||||
//TODO: Frequency manager auto-remove duplicates
|
//TODO: Script engine ?
|
||||||
//TODO: "TX box" view or composite widget with frequency and bw settings, simple and advanced setup TX buttons...
|
|
||||||
//TODO: Morse coder for foxhunts
|
//TODO: Morse coder for foxhunts
|
||||||
//TODO: Finish EPAR tx
|
//TODO: Finish EPAR tx
|
||||||
//TODO: IQ replay
|
//TODO: IQ replay
|
||||||
|
@ -68,7 +68,7 @@ private:
|
|||||||
static constexpr uint32_t sampling_rate = 1536000;
|
static constexpr uint32_t sampling_rate = 1536000;
|
||||||
static constexpr uint32_t baseband_bandwidth = 1750000;
|
static constexpr uint32_t baseband_bandwidth = 1750000;
|
||||||
|
|
||||||
bool logging { true };
|
bool logging { false };
|
||||||
uint32_t batch_cnt = 0;
|
uint32_t batch_cnt = 0;
|
||||||
uint32_t address { 0 };
|
uint32_t address { 0 };
|
||||||
uint32_t function { 0 };
|
uint32_t function { 0 };
|
||||||
|
119
firmware/application/tonesets.hpp
Normal file
119
firmware/application/tonesets.hpp
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2016 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TONESETS_H__
|
||||||
|
#define __TONESETS_H__
|
||||||
|
|
||||||
|
#include "portapack.hpp"
|
||||||
|
|
||||||
|
#define TONES_SAMPLERATE 1536000
|
||||||
|
#define TONES_DELTA_COEF ((1ULL << 32) / 1536000)
|
||||||
|
|
||||||
|
#define TONES_F2D(f) (uint32_t)(f * TONES_DELTA_COEF)
|
||||||
|
|
||||||
|
#define DTMF_C0 TONES_F2D(1209)
|
||||||
|
#define DTMF_C1 TONES_F2D(1336)
|
||||||
|
#define DTMF_C2 TONES_F2D(1477)
|
||||||
|
#define DTMF_C3 TONES_F2D(1633)
|
||||||
|
#define DTMF_R0 TONES_F2D(697)
|
||||||
|
#define DTMF_R1 TONES_F2D(770)
|
||||||
|
#define DTMF_R2 TONES_F2D(852)
|
||||||
|
#define DTMF_R3 TONES_F2D(941)
|
||||||
|
|
||||||
|
const uint32_t ccir_deltas[16] = {
|
||||||
|
TONES_F2D(1981),
|
||||||
|
TONES_F2D(1124),
|
||||||
|
TONES_F2D(1197),
|
||||||
|
TONES_F2D(1275),
|
||||||
|
TONES_F2D(1358),
|
||||||
|
TONES_F2D(1446),
|
||||||
|
TONES_F2D(1540),
|
||||||
|
TONES_F2D(1640),
|
||||||
|
TONES_F2D(1747),
|
||||||
|
TONES_F2D(1860),
|
||||||
|
TONES_F2D(2400),
|
||||||
|
TONES_F2D(930),
|
||||||
|
TONES_F2D(2247),
|
||||||
|
TONES_F2D(991),
|
||||||
|
TONES_F2D(2110),
|
||||||
|
TONES_F2D(1055)
|
||||||
|
};
|
||||||
|
|
||||||
|
// 0123456789ABCD#*
|
||||||
|
const uint32_t dtmf_deltas[16][2] = {
|
||||||
|
{ DTMF_C1, DTMF_R3 },
|
||||||
|
{ DTMF_C0, DTMF_R0 },
|
||||||
|
{ DTMF_C1, DTMF_R0 },
|
||||||
|
{ DTMF_C2, DTMF_R0 },
|
||||||
|
{ DTMF_C0, DTMF_R1 },
|
||||||
|
{ DTMF_C1, DTMF_R1 },
|
||||||
|
{ DTMF_C2, DTMF_R1 },
|
||||||
|
{ DTMF_C0, DTMF_R2 },
|
||||||
|
{ DTMF_C1, DTMF_R2 },
|
||||||
|
{ DTMF_C2, DTMF_R2 },
|
||||||
|
{ DTMF_C3, DTMF_R0 },
|
||||||
|
{ DTMF_C3, DTMF_R1 },
|
||||||
|
{ DTMF_C3, DTMF_R2 },
|
||||||
|
{ DTMF_C3, DTMF_R3 },
|
||||||
|
{ DTMF_C2, DTMF_R3 },
|
||||||
|
{ DTMF_C0, DTMF_R3 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint32_t eia_deltas[16] = {
|
||||||
|
TONES_F2D(600),
|
||||||
|
TONES_F2D(741),
|
||||||
|
TONES_F2D(882),
|
||||||
|
TONES_F2D(1023),
|
||||||
|
TONES_F2D(1164),
|
||||||
|
TONES_F2D(1305),
|
||||||
|
TONES_F2D(1446),
|
||||||
|
TONES_F2D(1587),
|
||||||
|
TONES_F2D(1728),
|
||||||
|
TONES_F2D(1869),
|
||||||
|
TONES_F2D(2151),
|
||||||
|
TONES_F2D(2433),
|
||||||
|
TONES_F2D(2010),
|
||||||
|
TONES_F2D(2292),
|
||||||
|
TONES_F2D(459),
|
||||||
|
TONES_F2D(1091)
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint32_t zvei_deltas[16] = {
|
||||||
|
TONES_F2D(2400),
|
||||||
|
TONES_F2D(1060),
|
||||||
|
TONES_F2D(1160),
|
||||||
|
TONES_F2D(1270),
|
||||||
|
TONES_F2D(1400),
|
||||||
|
TONES_F2D(1530),
|
||||||
|
TONES_F2D(1670),
|
||||||
|
TONES_F2D(1830),
|
||||||
|
TONES_F2D(2000),
|
||||||
|
TONES_F2D(2200),
|
||||||
|
TONES_F2D(2800),
|
||||||
|
TONES_F2D(810),
|
||||||
|
TONES_F2D(970),
|
||||||
|
TONES_F2D(885),
|
||||||
|
TONES_F2D(2600),
|
||||||
|
TONES_F2D(680)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif/*__TONESETS_H__*/
|
@ -79,6 +79,14 @@ void TransmitterModel::set_vga(int32_t v_db) {
|
|||||||
update_vga();
|
update_vga();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t TransmitterModel::bandwidth() const {
|
||||||
|
return bandwidth_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TransmitterModel::set_bandwidth(uint32_t v) {
|
||||||
|
bandwidth_ = v;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t TransmitterModel::sampling_rate() const {
|
uint32_t TransmitterModel::sampling_rate() const {
|
||||||
return sampling_rate_;
|
return sampling_rate_;
|
||||||
}
|
}
|
||||||
@ -88,6 +96,10 @@ void TransmitterModel::set_sampling_rate(uint32_t v) {
|
|||||||
update_sampling_rate();
|
update_sampling_rate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t TransmitterModel::tx_gain() const {
|
||||||
|
return tx_gain_db_;
|
||||||
|
}
|
||||||
|
|
||||||
void TransmitterModel::set_tx_gain(int32_t v_db) {
|
void TransmitterModel::set_tx_gain(int32_t v_db) {
|
||||||
tx_gain_db_ = v_db;
|
tx_gain_db_ = v_db;
|
||||||
update_tx_gain();
|
update_tx_gain();
|
||||||
|
@ -52,6 +52,9 @@ public:
|
|||||||
|
|
||||||
int32_t tx_gain() const;
|
int32_t tx_gain() const;
|
||||||
void set_tx_gain(int32_t v_db);
|
void set_tx_gain(int32_t v_db);
|
||||||
|
|
||||||
|
uint32_t bandwidth() const;
|
||||||
|
void set_bandwidth(uint32_t v);
|
||||||
|
|
||||||
uint32_t sampling_rate() const;
|
uint32_t sampling_rate() const;
|
||||||
void set_sampling_rate(uint32_t v);
|
void set_sampling_rate(uint32_t v);
|
||||||
@ -63,6 +66,7 @@ private:
|
|||||||
bool enabled_ { false };
|
bool enabled_ { false };
|
||||||
bool rf_amp_ { true };
|
bool rf_amp_ { true };
|
||||||
int32_t lna_gain_db_ { 0 };
|
int32_t lna_gain_db_ { 0 };
|
||||||
|
uint32_t bandwidth_ { 1 };
|
||||||
uint32_t baseband_bandwidth_ { max2837::filter::bandwidth_minimum };
|
uint32_t baseband_bandwidth_ { max2837::filter::bandwidth_minimum };
|
||||||
int32_t vga_gain_db_ { 8 };
|
int32_t vga_gain_db_ { 8 };
|
||||||
int32_t tx_gain_db_ { 47 };
|
int32_t tx_gain_db_ { 47 };
|
||||||
|
@ -63,7 +63,7 @@ void BHTView::start_tx() {
|
|||||||
|
|
||||||
generate_message();
|
generate_message();
|
||||||
|
|
||||||
transmitter_model.set_tuning_frequency(bht_freqs[options_freq.selected_index()]);
|
//transmitter_model.set_tuning_frequency(bht_freqs[options_freq.selected_index()]);
|
||||||
transmitter_model.set_sampling_rate(1536000);
|
transmitter_model.set_sampling_rate(1536000);
|
||||||
transmitter_model.set_rf_amp(true);
|
transmitter_model.set_rf_amp(true);
|
||||||
transmitter_model.set_lna(40);
|
transmitter_model.set_lna(40);
|
||||||
@ -74,11 +74,11 @@ void BHTView::start_tx() {
|
|||||||
// Setup for Xy
|
// Setup for Xy
|
||||||
for (uint8_t c = 0; c < 16; c++) {
|
for (uint8_t c = 0; c < 16; c++) {
|
||||||
shared_memory.bb_data.tones_data.tone_defs[c].delta = ccir_deltas[c];
|
shared_memory.bb_data.tones_data.tone_defs[c].delta = ccir_deltas[c];
|
||||||
shared_memory.bb_data.tones_data.tone_defs[c].duration = CCIR_TONE_LENGTH;
|
shared_memory.bb_data.tones_data.tone_defs[c].duration = XY_TONE_LENGTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
audio::set_rate(audio::Rate::Hz_24000);
|
audio::set_rate(audio::Rate::Hz_24000);
|
||||||
baseband::set_tones_data(field_bw.value(), CCIR_SILENCE, 20, false, checkbox_speaker.value());
|
baseband::set_tones_data(transmitter_model.bandwidth(), XY_SILENCE, 20, false, checkbox_speaker.value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BHTView::on_tx_progress(const int progress, const bool done) {
|
void BHTView::on_tx_progress(const int progress, const bool done) {
|
||||||
@ -94,8 +94,7 @@ void BHTView::on_tx_progress(const int progress, const bool done) {
|
|||||||
|
|
||||||
if (!checkbox_cligno.value()) {
|
if (!checkbox_cligno.value()) {
|
||||||
tx_mode = IDLE;
|
tx_mode = IDLE;
|
||||||
button_transmit.set_style(&style_val);
|
tx_view.set_transmitting(false);
|
||||||
button_transmit.set_text("START");
|
|
||||||
} else {
|
} else {
|
||||||
chThdSleepMilliseconds(tempo_cligno.value() * 1000); // Dirty :(
|
chThdSleepMilliseconds(tempo_cligno.value() * 1000); // Dirty :(
|
||||||
|
|
||||||
@ -115,12 +114,11 @@ void BHTView::on_tx_progress(const int progress, const bool done) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BHTView::BHTView(NavigationView& nav) {
|
BHTView::BHTView(NavigationView& nav) {
|
||||||
(void)nav;
|
|
||||||
size_t n;
|
size_t n;
|
||||||
|
|
||||||
baseband::run_image(portapack::spi_flash::image_tag_tones);
|
baseband::run_image(portapack::spi_flash::image_tag_tones);
|
||||||
//baseband::run_image(portapack::spi_flash::image_tag_encoders);
|
//baseband::run_image(portapack::spi_flash::image_tag_encoders);
|
||||||
|
|
||||||
add_children({
|
add_children({
|
||||||
&options_mode,
|
&options_mode,
|
||||||
&text_header,
|
&text_header,
|
||||||
@ -138,16 +136,17 @@ BHTView::BHTView(NavigationView& nav) {
|
|||||||
&text_receiver,
|
&text_receiver,
|
||||||
&receiver_code,
|
&receiver_code,
|
||||||
&checkbox_wcid,
|
&checkbox_wcid,
|
||||||
&text_freq,
|
//&text_freq,
|
||||||
&options_freq,
|
//&options_freq,
|
||||||
&field_bw,
|
//&field_bw,
|
||||||
&text_relais,
|
&text_relais,
|
||||||
&progressbar,
|
&progressbar,
|
||||||
&text_message,
|
&text_message,
|
||||||
&button_transmit,
|
//&button_transmit,
|
||||||
&checkbox_cligno,
|
&checkbox_cligno,
|
||||||
&tempo_cligno,
|
&tempo_cligno,
|
||||||
&text_cligno
|
&text_cligno,
|
||||||
|
&tx_view
|
||||||
});
|
});
|
||||||
|
|
||||||
options_mode.set_selected_index(0); // Start up in Xy mode
|
options_mode.set_selected_index(0); // Start up in Xy mode
|
||||||
@ -159,12 +158,12 @@ BHTView::BHTView(NavigationView& nav) {
|
|||||||
family_code_ep.set_selected_index(2);
|
family_code_ep.set_selected_index(2);
|
||||||
subfamily_code.set_value(1);
|
subfamily_code.set_value(1);
|
||||||
receiver_code.set_value(1);
|
receiver_code.set_value(1);
|
||||||
options_freq.set_selected_index(0);
|
//options_freq.set_selected_index(0);
|
||||||
tempo_cligno.set_value(1);
|
tempo_cligno.set_value(1);
|
||||||
progressbar.set_max(20);
|
progressbar.set_max(20);
|
||||||
relay_states[0].set_selected_index(1); // R1 OFF
|
relay_states[0].set_selected_index(1); // R1 OFF
|
||||||
|
|
||||||
field_bw.set_value(10);
|
//field_bw.set_value(20);
|
||||||
|
|
||||||
options_mode.on_change = [this](size_t mode, OptionsField::value_t) {
|
options_mode.on_change = [this](size_t mode, OptionsField::value_t) {
|
||||||
_mode = mode;
|
_mode = mode;
|
||||||
@ -281,8 +280,8 @@ BHTView::BHTView(NavigationView& nav) {
|
|||||||
for (auto& relay_state : relay_states) {
|
for (auto& relay_state : relay_states) {
|
||||||
relay_state.on_change = relay_state_fn;
|
relay_state.on_change = relay_state_fn;
|
||||||
relay_state.set_parent_rect({
|
relay_state.set_parent_rect({
|
||||||
static_cast<Coord>(26 + (n * 53)),
|
static_cast<Coord>(4 + (n * 36)),
|
||||||
174,
|
158,
|
||||||
24, 24
|
24, 24
|
||||||
});
|
});
|
||||||
relay_state.set_options(relay_options);
|
relay_state.set_options(relay_options);
|
||||||
@ -290,22 +289,33 @@ BHTView::BHTView(NavigationView& nav) {
|
|||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
button_transmit.set_style(&style_val);
|
//button_transmit.set_style(&style_val);
|
||||||
|
|
||||||
generate_message();
|
generate_message();
|
||||||
|
|
||||||
button_transmit.on_select = [this, &nav](Button&) {
|
tx_view.on_edit_frequency = [this, &nav]() {
|
||||||
|
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
|
||||||
|
new_view->on_changed = [this](rf::Frequency f) {
|
||||||
|
receiver_model.set_tuning_frequency(f);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
tx_view.on_start = [this]() {
|
||||||
if ((tx_mode == IDLE) && (!_mode)) { // DEBUG
|
if ((tx_mode == IDLE) && (!_mode)) { // DEBUG
|
||||||
if (speaker_enabled)
|
if (speaker_enabled)
|
||||||
chThdSleepMilliseconds(40 * 1000); // DEBUG 40s
|
chThdSleepMilliseconds(40 * 1000); // DEBUG 40s
|
||||||
//if (speaker_enabled && _mode)
|
//if (speaker_enabled && _mode)
|
||||||
// audio::headphone::set_volume(volume_t::decibel(90 - 99) + audio::headphone::volume_range().max);
|
// audio::headphone::set_volume(volume_t::decibel(90 - 99) + audio::headphone::volume_range().max);
|
||||||
tx_mode = SINGLE;
|
tx_mode = SINGLE;
|
||||||
button_transmit.set_style(&style_cancel);
|
tx_view.set_transmitting(true);
|
||||||
button_transmit.set_text("Wait");
|
|
||||||
start_tx();
|
start_tx();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tx_view.on_stop = [this]() {
|
||||||
|
tx_view.set_transmitting(false);
|
||||||
|
tx_mode = IDLE;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace ui */
|
} /* namespace ui */
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "ui.hpp"
|
#include "ui.hpp"
|
||||||
#include "ui_widget.hpp"
|
#include "ui_widget.hpp"
|
||||||
#include "ui_navigation.hpp"
|
#include "ui_navigation.hpp"
|
||||||
|
#include "ui_transmitter.hpp"
|
||||||
#include "ui_font_fixed_8x16.hpp"
|
#include "ui_font_fixed_8x16.hpp"
|
||||||
|
|
||||||
#include "bmp_bulb_on.hpp"
|
#include "bmp_bulb_on.hpp"
|
||||||
@ -196,7 +197,7 @@ private:
|
|||||||
"Tous"
|
"Tous"
|
||||||
};
|
};
|
||||||
|
|
||||||
Text text_freq {
|
/*Text text_freq {
|
||||||
{ 1 * 8, 8 * 16, 10 * 8, 16 },
|
{ 1 * 8, 8 * 16, 10 * 8, 16 },
|
||||||
"Frequence:"
|
"Frequence:"
|
||||||
};
|
};
|
||||||
@ -220,14 +221,14 @@ private:
|
|||||||
{ 0, 99 },
|
{ 0, 99 },
|
||||||
1,
|
1,
|
||||||
' '
|
' '
|
||||||
};
|
};*/
|
||||||
|
|
||||||
Text text_relais {
|
Text text_relais {
|
||||||
{ 8, 19 * 8, 13 * 8, 16 },
|
{ 1 * 8, 8 * 16 + 8, 7 * 8, 16 },
|
||||||
"Etats relais:"
|
"Relais:"
|
||||||
};
|
};
|
||||||
|
|
||||||
std::array<ImageOptionsField, 4> relay_states;
|
std::array<ImageOptionsField, 4> relay_states { };
|
||||||
|
|
||||||
ImageOptionsField::options_t relay_options = {
|
ImageOptionsField::options_t relay_options = {
|
||||||
{ &bulb_ignore_bmp[0], 0 },
|
{ &bulb_ignore_bmp[0], 0 },
|
||||||
@ -236,35 +237,41 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
ProgressBar progressbar {
|
ProgressBar progressbar {
|
||||||
{ 5 * 8, 27 * 8, 20 * 8, 16 },
|
{ 5 * 8, 13 * 16, 20 * 8, 16 },
|
||||||
};
|
};
|
||||||
Text text_message {
|
Text text_message {
|
||||||
{ 5 * 8, 29 * 8, 20 * 8, 16 },
|
{ 5 * 8, 14 * 16, 20 * 8, 16 },
|
||||||
""
|
""
|
||||||
};
|
};
|
||||||
|
|
||||||
Button button_transmit {
|
/*Button button_transmit {
|
||||||
{ 2 * 8, 16 * 16, 12 * 8, 32 },
|
{ 2 * 8, 16 * 16, 12 * 8, 32 },
|
||||||
"START"
|
"START"
|
||||||
};
|
};*/
|
||||||
|
|
||||||
Checkbox checkbox_cligno {
|
Checkbox checkbox_cligno {
|
||||||
{ 16 * 8, 16 * 16 + 4},
|
{ 18 * 8 + 4, 10 * 16},
|
||||||
3,
|
3,
|
||||||
"J/N"
|
"J/N"
|
||||||
};
|
};
|
||||||
NumberField tempo_cligno {
|
NumberField tempo_cligno {
|
||||||
{ 24 * 8, 16 * 16 + 8},
|
{ 25 * 8 + 4, 10 * 16 + 4},
|
||||||
2,
|
2,
|
||||||
{ 1, 99 },
|
{ 1, 99 },
|
||||||
1,
|
1,
|
||||||
' '
|
' '
|
||||||
};
|
};
|
||||||
Text text_cligno {
|
Text text_cligno {
|
||||||
{ 26 * 8, 16 * 16 + 8, 2 * 8, 16 },
|
{ 27 * 8 + 4, 10 * 16 + 4, 2 * 8, 16 },
|
||||||
"s."
|
"s."
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TransmitterView tx_view {
|
||||||
|
16 * 16,
|
||||||
|
10000,
|
||||||
|
12
|
||||||
|
};
|
||||||
|
|
||||||
MessageHandlerRegistration message_handler_tx_done {
|
MessageHandlerRegistration message_handler_tx_done {
|
||||||
Message::ID::TXDone,
|
Message::ID::TXDone,
|
||||||
[this](const Message* const p) {
|
[this](const Message* const p) {
|
||||||
|
@ -43,10 +43,13 @@ void FrequencySaveView::on_save_timestamp(NavigationView& nav) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FrequencySaveView::focus() {
|
void FrequencySaveView::focus() {
|
||||||
if (error == ERROR_ACCESS)
|
if (error == ERROR_ACCESS) {
|
||||||
nav_.display_modal("Error", "File acces error", ABORT, nullptr);
|
nav_.display_modal("Error", "File acces error", ABORT, nullptr);
|
||||||
else
|
} else {
|
||||||
|
if (error == ERROR_DUPLICATE)
|
||||||
|
nav_.display_modal("Error", "Frequency already saved", INFO, nullptr);
|
||||||
button_save_timestamp.focus();
|
button_save_timestamp.focus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrequencySaveView::on_tick_second() {
|
void FrequencySaveView::on_tick_second() {
|
||||||
@ -68,6 +71,7 @@ FrequencySaveView::FrequencySaveView(
|
|||||||
value_ (value)
|
value_ (value)
|
||||||
{
|
{
|
||||||
File freqs_file;
|
File freqs_file;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
if (!load_freqman_file(frequencies)) {
|
if (!load_freqman_file(frequencies)) {
|
||||||
if (!create_freqman_file(freqs_file)) {
|
if (!create_freqman_file(freqs_file)) {
|
||||||
@ -76,6 +80,13 @@ FrequencySaveView::FrequencySaveView(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (n = 0; n < frequencies.size(); n++) {
|
||||||
|
if (frequencies[n].value == value_) {
|
||||||
|
error = ERROR_DUPLICATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
signal_token_tick_second = rtc_time::signal_tick_second += [this]() {
|
||||||
this->on_tick_second();
|
this->on_tick_second();
|
||||||
};
|
};
|
||||||
@ -223,6 +234,7 @@ FreqManView::FreqManView(
|
|||||||
|
|
||||||
add_children({
|
add_children({
|
||||||
&menu_view,
|
&menu_view,
|
||||||
|
&text_edit,
|
||||||
&button_edit_freq,
|
&button_edit_freq,
|
||||||
&button_edit_desc,
|
&button_edit_desc,
|
||||||
&button_del,
|
&button_del,
|
||||||
|
@ -136,21 +136,25 @@ private:
|
|||||||
|
|
||||||
MenuView menu_view { true };
|
MenuView menu_view { true };
|
||||||
|
|
||||||
|
Text text_edit {
|
||||||
|
{ 16, 194, 5 * 8, 16 },
|
||||||
|
"Edit:"
|
||||||
|
};
|
||||||
Button button_edit_freq {
|
Button button_edit_freq {
|
||||||
{ 52, 194, 106, 30 },
|
{ 16, 194 + 16, 104, 32 },
|
||||||
"Edit freq."
|
"Frequency"
|
||||||
};
|
};
|
||||||
Button button_edit_desc {
|
Button button_edit_desc {
|
||||||
{ 52, 192 + 32, 106, 30 },
|
{ 16, 194 + 16 + 34, 104, 32 },
|
||||||
"Edit desc."
|
"Description"
|
||||||
};
|
};
|
||||||
Button button_del {
|
Button button_del {
|
||||||
{ 168, 192, 64, 64 },
|
{ 160, 192, 72, 64 },
|
||||||
"Del"
|
"Delete"
|
||||||
};
|
};
|
||||||
|
|
||||||
Button button_exit {
|
Button button_exit {
|
||||||
{ 168, 264, 64, 32 },
|
{ 160, 264, 72, 32 },
|
||||||
"Exit"
|
"Exit"
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -44,6 +44,8 @@ void MenuItemView::unhighlight() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MenuItemView::paint(Painter& painter) {
|
void MenuItemView::paint(Painter& painter) {
|
||||||
|
Coord offset_x;
|
||||||
|
|
||||||
const auto r = screen_rect();
|
const auto r = screen_rect();
|
||||||
|
|
||||||
const auto paint_style = (highlighted() && (parent()->has_focus() || keep_highlight_)) ? style().invert() : style();
|
const auto paint_style = (highlighted() && (parent()->has_focus() || keep_highlight_)) ? style().invert() : style();
|
||||||
@ -67,7 +69,9 @@ void MenuItemView::paint(Painter& painter) {
|
|||||||
final_item_color,
|
final_item_color,
|
||||||
final_bg_color
|
final_bg_color
|
||||||
);
|
);
|
||||||
}
|
offset_x = 26;
|
||||||
|
} else
|
||||||
|
offset_x = 8;
|
||||||
|
|
||||||
Style text_style {
|
Style text_style {
|
||||||
.font = paint_style.font,
|
.font = paint_style.font,
|
||||||
@ -76,7 +80,7 @@ void MenuItemView::paint(Painter& painter) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
painter.draw_string(
|
painter.draw_string(
|
||||||
{ r.location().x() + 26, r.location().y() + (r.size().height() - font_height) / 2 },
|
{ r.location().x() + offset_x, r.location().y() + (r.size().height() - font_height) / 2 },
|
||||||
text_style,
|
text_style,
|
||||||
item.text
|
item.text
|
||||||
);
|
);
|
||||||
|
@ -69,7 +69,7 @@ private:
|
|||||||
|
|
||||||
class MenuView : public View {
|
class MenuView : public View {
|
||||||
public:
|
public:
|
||||||
std::function<void(void)> on_left;
|
std::function<void(void)> on_left { };
|
||||||
|
|
||||||
MenuView(bool keep_highlight = false);
|
MenuView(bool keep_highlight = false);
|
||||||
|
|
||||||
@ -102,9 +102,9 @@ private:
|
|||||||
void update_items();
|
void update_items();
|
||||||
void on_tick_second();
|
void on_tick_second();
|
||||||
|
|
||||||
bool keep_highlight_ = false;
|
bool keep_highlight_ { false };
|
||||||
|
|
||||||
SignalToken signal_token_tick_second;
|
SignalToken signal_token_tick_second { };
|
||||||
|
|
||||||
Image arrow_more {
|
Image arrow_more {
|
||||||
{ 228, 320 - 8, 8, 8 },
|
{ 228, 320 - 8, 8, 8 },
|
||||||
|
@ -71,7 +71,7 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
ImageButton button_back {
|
ImageButton button_back {
|
||||||
{ 0 * 8, 0 * 16, 16, 16 },
|
{ 2, 0 * 16, 16, 16 },
|
||||||
&bitmap_previous,
|
&bitmap_previous,
|
||||||
Color::white(),
|
Color::white(),
|
||||||
Color::dark_grey()
|
Color::dark_grey()
|
||||||
|
@ -37,7 +37,7 @@ using namespace portapack;
|
|||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
void NuoptixView::focus() {
|
void NuoptixView::focus() {
|
||||||
button_tx.focus();
|
number_timecode.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
NuoptixView::~NuoptixView() {
|
NuoptixView::~NuoptixView() {
|
||||||
@ -45,10 +45,6 @@ NuoptixView::~NuoptixView() {
|
|||||||
baseband::shutdown();
|
baseband::shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NuoptixView::on_tuning_frequency_changed(rf::Frequency f) {
|
|
||||||
transmitter_model.set_tuning_frequency(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NuoptixView::transmit(bool setup) {
|
void NuoptixView::transmit(bool setup) {
|
||||||
uint8_t mod, tone_code;
|
uint8_t mod, tone_code;
|
||||||
uint8_t c;
|
uint8_t c;
|
||||||
@ -137,7 +133,7 @@ void NuoptixView::transmit(bool setup) {
|
|||||||
shared_memory.bb_data.tones_data.silence = NUOPTIX_TONE_LENGTH; // 49ms tone, 49ms space
|
shared_memory.bb_data.tones_data.silence = NUOPTIX_TONE_LENGTH; // 49ms tone, 49ms space
|
||||||
|
|
||||||
audio::set_rate(audio::Rate::Hz_24000);
|
audio::set_rate(audio::Rate::Hz_24000);
|
||||||
baseband::set_tones_data(number_bw.value(), 0, 6 * 2, true, true);
|
baseband::set_tones_data(transmitter_model.bandwidth(), 0, 6 * 2, true, true);
|
||||||
|
|
||||||
timecode++;
|
timecode++;
|
||||||
}
|
}
|
||||||
@ -147,49 +143,37 @@ NuoptixView::NuoptixView(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
baseband::run_image(portapack::spi_flash::image_tag_tones);
|
baseband::run_image(portapack::spi_flash::image_tag_tones);
|
||||||
|
|
||||||
add_children({
|
add_children({
|
||||||
&field_frequency,
|
&tx_view,
|
||||||
&number_bw,
|
|
||||||
&text_kHz,
|
|
||||||
&number_timecode,
|
&number_timecode,
|
||||||
&text_timecode,
|
&text_timecode,
|
||||||
&text_mod,
|
&text_mod,
|
||||||
&pbar,
|
&pbar,
|
||||||
&button_tx,
|
|
||||||
&button_impro,
|
|
||||||
&button_exit
|
&button_exit
|
||||||
});
|
});
|
||||||
|
|
||||||
number_bw.set_value(15);
|
|
||||||
number_timecode.set_value(1);
|
number_timecode.set_value(1);
|
||||||
|
|
||||||
field_frequency.set_value(transmitter_model.tuning_frequency());
|
tx_view.on_edit_frequency = [this, &nav]() {
|
||||||
field_frequency.set_step(10000);
|
auto new_view = nav.push<FrequencyKeypadView>(receiver_model.tuning_frequency());
|
||||||
field_frequency.on_change = [this](rf::Frequency f) {
|
|
||||||
this->on_tuning_frequency_changed(f);
|
|
||||||
};
|
|
||||||
field_frequency.on_edit = [this, &nav]() {
|
|
||||||
// TODO: Provide separate modal method/scheme?
|
|
||||||
auto new_view = nav.push<FrequencyKeypadView>(transmitter_model.tuning_frequency());
|
|
||||||
new_view->on_changed = [this](rf::Frequency f) {
|
new_view->on_changed = [this](rf::Frequency f) {
|
||||||
this->on_tuning_frequency_changed(f);
|
receiver_model.set_tuning_frequency(f);
|
||||||
this->field_frequency.set_value(f);
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
button_tx.on_select = [this](Button&){
|
tx_view.on_start = [this]() {
|
||||||
if (tx_mode == NORMAL) {
|
tx_view.set_transmitting(true);
|
||||||
tx_mode = IDLE;
|
tx_mode = NORMAL;
|
||||||
button_tx.set_text("TX");
|
transmit(true);
|
||||||
} else if (tx_mode == IDLE) {
|
|
||||||
tx_mode = NORMAL;
|
|
||||||
button_tx.set_text("STOP");
|
|
||||||
transmit(true);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
button_impro.on_select = [this](Button&){
|
tx_view.on_stop = [this]() {
|
||||||
|
tx_view.set_transmitting(false);
|
||||||
|
tx_mode = IDLE;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*button_impro.on_select = [this](Button&){
|
||||||
if (tx_mode == IMPROVISE) {
|
if (tx_mode == IMPROVISE) {
|
||||||
tx_mode = IDLE;
|
tx_mode = IDLE;
|
||||||
button_impro.set_text("IMPROVISE");
|
button_impro.set_text("IMPROVISE");
|
||||||
@ -198,7 +182,7 @@ NuoptixView::NuoptixView(
|
|||||||
button_impro.set_text("STOP");
|
button_impro.set_text("STOP");
|
||||||
transmit(true);
|
transmit(true);
|
||||||
}
|
}
|
||||||
};
|
};*/
|
||||||
|
|
||||||
button_exit.on_select = [&nav](Button&){
|
button_exit.on_select = [&nav](Button&){
|
||||||
nav.pop();
|
nav.pop();
|
||||||
|
@ -28,23 +28,14 @@
|
|||||||
#include "ui_font_fixed_8x16.hpp"
|
#include "ui_font_fixed_8x16.hpp"
|
||||||
#include "baseband_api.hpp"
|
#include "baseband_api.hpp"
|
||||||
#include "ui_navigation.hpp"
|
#include "ui_navigation.hpp"
|
||||||
#include "ui_receiver.hpp"
|
#include "ui_transmitter.hpp"
|
||||||
#include "rtc_time.hpp"
|
#include "rtc_time.hpp"
|
||||||
|
#include "tonesets.hpp"
|
||||||
#include "message.hpp"
|
#include "message.hpp"
|
||||||
#include "volume.hpp"
|
#include "volume.hpp"
|
||||||
#include "audio.hpp"
|
#include "audio.hpp"
|
||||||
|
|
||||||
#define DTMF_DELTA_COEF (43.691) // (65536*1024)/1536000
|
#define NUOPTIX_TONE_LENGTH ((TONES_SAMPLERATE * 0.049) - 1) // 49ms
|
||||||
#define DTMF_C0 (uint32_t)(1209 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_C1 (uint32_t)(1336 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_C2 (uint32_t)(1477 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_C3 (uint32_t)(1633 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_R0 (uint32_t)(697 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_R1 (uint32_t)(770 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_R2 (uint32_t)(852 * DTMF_DELTA_COEF)
|
|
||||||
#define DTMF_R3 (uint32_t)(941 * DTMF_DELTA_COEF)
|
|
||||||
|
|
||||||
#define NUOPTIX_TONE_LENGTH 75264 // 1536000*0.049s
|
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
@ -64,48 +55,17 @@ private:
|
|||||||
IMPROVISE
|
IMPROVISE
|
||||||
};
|
};
|
||||||
|
|
||||||
tx_modes tx_mode = IDLE;
|
tx_modes tx_mode { IDLE };
|
||||||
|
|
||||||
// 0123456789ABCD#*
|
|
||||||
const uint32_t dtmf_deltas[16][2] = {
|
|
||||||
{ DTMF_C1, DTMF_R3 },
|
|
||||||
{ DTMF_C0, DTMF_R0 },
|
|
||||||
{ DTMF_C1, DTMF_R0 },
|
|
||||||
{ DTMF_C2, DTMF_R0 },
|
|
||||||
{ DTMF_C0, DTMF_R1 },
|
|
||||||
{ DTMF_C1, DTMF_R1 },
|
|
||||||
{ DTMF_C2, DTMF_R1 },
|
|
||||||
{ DTMF_C0, DTMF_R2 },
|
|
||||||
{ DTMF_C1, DTMF_R2 },
|
|
||||||
{ DTMF_C2, DTMF_R2 },
|
|
||||||
{ DTMF_C3, DTMF_R0 },
|
|
||||||
{ DTMF_C3, DTMF_R1 },
|
|
||||||
{ DTMF_C3, DTMF_R2 },
|
|
||||||
{ DTMF_C3, DTMF_R3 },
|
|
||||||
{ DTMF_C2, DTMF_R3 },
|
|
||||||
{ DTMF_C0, DTMF_R3 }
|
|
||||||
};
|
|
||||||
|
|
||||||
void on_tuning_frequency_changed(rf::Frequency f);
|
void on_tuning_frequency_changed(rf::Frequency f);
|
||||||
void transmit(bool setup);
|
void transmit(bool setup);
|
||||||
|
|
||||||
uint32_t timecode { 0 };
|
uint32_t timecode { 0 };
|
||||||
|
|
||||||
FrequencyField field_frequency {
|
TransmitterView tx_view {
|
||||||
{ 1 * 8, 4 },
|
11 * 16,
|
||||||
};
|
10000,
|
||||||
|
15
|
||||||
NumberField number_bw {
|
|
||||||
{ 13 * 8, 4 },
|
|
||||||
2,
|
|
||||||
{1, 99},
|
|
||||||
1,
|
|
||||||
' '
|
|
||||||
};
|
|
||||||
|
|
||||||
Text text_kHz {
|
|
||||||
{ 15 * 8, 4, 3 * 8, 16 },
|
|
||||||
"kHz"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Text text_timecode {
|
Text text_timecode {
|
||||||
@ -130,15 +90,10 @@ private:
|
|||||||
{ 16, 236, 208, 16 }
|
{ 16, 236, 208, 16 }
|
||||||
};
|
};
|
||||||
|
|
||||||
Button button_tx {
|
/*Button button_impro {
|
||||||
{ 64, 128, 112, 40 },
|
|
||||||
"TX"
|
|
||||||
};
|
|
||||||
|
|
||||||
Button button_impro {
|
|
||||||
{ 64, 184, 112, 40 },
|
{ 64, 184, 112, 40 },
|
||||||
"IMPROVISE"
|
"IMPROVISE"
|
||||||
};
|
};*/
|
||||||
|
|
||||||
Button button_exit {
|
Button button_exit {
|
||||||
{ 88, 270, 64, 32 },
|
{ 88, 270, 64, 32 },
|
||||||
|
@ -370,29 +370,4 @@ void VGAGainField::on_focus() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TXGainField **********************************************************/
|
|
||||||
|
|
||||||
TXGainField::TXGainField(
|
|
||||||
Point parent_pos
|
|
||||||
) : NumberField {
|
|
||||||
parent_pos, 2,
|
|
||||||
{ max2837::tx::gain_db_range.minimum, max2837::tx::gain_db_range.maximum },
|
|
||||||
max2837::tx::gain_db_step,
|
|
||||||
' ',
|
|
||||||
}
|
|
||||||
{
|
|
||||||
set_value(receiver_model.tx_gain());
|
|
||||||
|
|
||||||
on_change = [](int32_t v) {
|
|
||||||
receiver_model.set_tx_gain(v);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void TXGainField::on_focus() {
|
|
||||||
//Widget::on_focus();
|
|
||||||
if( on_show_options ) {
|
|
||||||
on_show_options();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* namespace ui */
|
} /* namespace ui */
|
||||||
|
@ -338,15 +338,6 @@ public:
|
|||||||
void on_focus() override;
|
void on_focus() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TXGainField : public NumberField {
|
|
||||||
public:
|
|
||||||
std::function<void(void)> on_show_options { };
|
|
||||||
|
|
||||||
TXGainField(Point parent_pos);
|
|
||||||
|
|
||||||
void on_focus() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace ui */
|
} /* namespace ui */
|
||||||
|
|
||||||
#endif/*__UI_RECEIVER_H__*/
|
#endif/*__UI_RECEIVER_H__*/
|
||||||
|
110
firmware/application/ui_script.cpp
Normal file
110
firmware/application/ui_script.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2016 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_script.hpp"
|
||||||
|
|
||||||
|
#include "portapack.hpp"
|
||||||
|
#include "event_m0.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
using namespace portapack;
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
void ScriptView::on_frequency_select() {
|
||||||
|
//button_edit_freq.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptView::on_edit_freq(rf::Frequency f) {
|
||||||
|
//frequencies[menu_view.highlighted()].value = f;
|
||||||
|
setup_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptView::on_edit_desc(NavigationView& nav) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptView::on_delete() {
|
||||||
|
//frequencies.erase(frequencies.begin() + menu_view.highlighted());
|
||||||
|
setup_list();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptView::setup_list() {
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
menu_view.clear();
|
||||||
|
|
||||||
|
/*for (n = 0; n < frequencies.size(); n++) {
|
||||||
|
menu_view.add_item({ freqman_item_string(frequencies[n]), ui::Color::white(), nullptr, [this](){ on_frequency_select(); } });
|
||||||
|
}*/
|
||||||
|
|
||||||
|
menu_view.set_parent_rect({ 0, 0, 240, 168 });
|
||||||
|
menu_view.set_highlighted(menu_view.highlighted()); // Refresh
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScriptView::focus() {
|
||||||
|
menu_view.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
ScriptView::ScriptView(
|
||||||
|
NavigationView& nav
|
||||||
|
) {
|
||||||
|
|
||||||
|
add_children({
|
||||||
|
&menu_view,
|
||||||
|
&text_edit,
|
||||||
|
&button_edit_freq,
|
||||||
|
&button_edit_desc,
|
||||||
|
&button_del,
|
||||||
|
&button_exit
|
||||||
|
});
|
||||||
|
|
||||||
|
setup_list();
|
||||||
|
|
||||||
|
button_edit_freq.on_select = [this, &nav](Button&) {
|
||||||
|
/*auto new_view = nav.push<FrequencyKeypadView>(frequencies[menu_view.highlighted()].value);
|
||||||
|
new_view->on_changed = [this](rf::Frequency f) {
|
||||||
|
on_edit_freq(f);
|
||||||
|
};*/
|
||||||
|
};
|
||||||
|
|
||||||
|
button_edit_desc.on_select = [this, &nav](Button&) {
|
||||||
|
on_edit_desc(nav);
|
||||||
|
};
|
||||||
|
|
||||||
|
button_del.on_select = [this, &nav](Button&) {
|
||||||
|
nav.push<ModalMessageView>("Confirm", "Are you sure ?", YESNO,
|
||||||
|
[this](bool choice) {
|
||||||
|
if (choice) {
|
||||||
|
on_delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
button_exit.on_select = [this, &nav](Button&) {
|
||||||
|
nav.pop();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
91
firmware/application/ui_script.hpp
Normal file
91
firmware/application/ui_script.hpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2016 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_widget.hpp"
|
||||||
|
#include "ui_painter.hpp"
|
||||||
|
#include "ui_menu.hpp"
|
||||||
|
#include "ui_navigation.hpp"
|
||||||
|
#include "ui_receiver.hpp"
|
||||||
|
#include "ui_textentry.hpp"
|
||||||
|
#include "rtc_time.hpp"
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
enum script_keyword {
|
||||||
|
STOP = 0,
|
||||||
|
WAIT_N,
|
||||||
|
WAIT_RTC,
|
||||||
|
IF,
|
||||||
|
LOOP,
|
||||||
|
END,
|
||||||
|
TX,
|
||||||
|
RX
|
||||||
|
};
|
||||||
|
|
||||||
|
struct script_line {
|
||||||
|
script_keyword keyword;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ScriptView : public View {
|
||||||
|
public:
|
||||||
|
ScriptView(NavigationView& nav);
|
||||||
|
|
||||||
|
void focus() override;
|
||||||
|
|
||||||
|
std::string title() const override { return "Script editor"; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
void on_frequency_select();
|
||||||
|
void on_edit_freq(rf::Frequency f);
|
||||||
|
void on_edit_desc(NavigationView& nav);
|
||||||
|
void on_delete();
|
||||||
|
void setup_list();
|
||||||
|
|
||||||
|
std::vector<script_line> script { };
|
||||||
|
|
||||||
|
MenuView menu_view { true };
|
||||||
|
|
||||||
|
Text text_edit {
|
||||||
|
{ 16, 194, 5 * 8, 16 },
|
||||||
|
"Edit:"
|
||||||
|
};
|
||||||
|
Button button_edit_freq {
|
||||||
|
{ 16, 194 + 16, 88, 32 },
|
||||||
|
"Frequency"
|
||||||
|
};
|
||||||
|
Button button_edit_desc {
|
||||||
|
{ 16, 194 + 16 + 34, 88, 32 },
|
||||||
|
"Description"
|
||||||
|
};
|
||||||
|
Button button_del {
|
||||||
|
{ 160, 192, 72, 64 },
|
||||||
|
"Delete"
|
||||||
|
};
|
||||||
|
|
||||||
|
Button button_exit {
|
||||||
|
{ 160, 264, 72, 32 },
|
||||||
|
"Exit"
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace ui */
|
127
firmware/application/ui_transmitter.cpp
Normal file
127
firmware/application/ui_transmitter.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2016 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_transmitter.hpp"
|
||||||
|
|
||||||
|
#include "portapack.hpp"
|
||||||
|
using namespace portapack;
|
||||||
|
|
||||||
|
#include "string_format.hpp"
|
||||||
|
|
||||||
|
#include "max2837.hpp"
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
/* TXGainField **********************************************************/
|
||||||
|
|
||||||
|
TXGainField::TXGainField(
|
||||||
|
Point parent_pos
|
||||||
|
) : NumberField {
|
||||||
|
parent_pos, 2,
|
||||||
|
{ max2837::tx::gain_db_range.minimum, max2837::tx::gain_db_range.maximum },
|
||||||
|
max2837::tx::gain_db_step,
|
||||||
|
' ',
|
||||||
|
}
|
||||||
|
{
|
||||||
|
set_value(transmitter_model.tx_gain());
|
||||||
|
|
||||||
|
on_change = [](int32_t v) {
|
||||||
|
transmitter_model.set_tx_gain(v);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TransmitterView *******************************************************/
|
||||||
|
|
||||||
|
void TransmitterView::on_tuning_frequency_changed(rf::Frequency f) {
|
||||||
|
receiver_model.set_tuning_frequency(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TransmitterView::on_bandwidth_changed(uint32_t bandwidth) {
|
||||||
|
transmitter_model.set_bandwidth(bandwidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TransmitterView::set_transmitting(const bool transmitting) {
|
||||||
|
if (transmitting) {
|
||||||
|
button_start.set_text("STOP");
|
||||||
|
button_start.set_style(&style_stop);
|
||||||
|
} else {
|
||||||
|
button_start.set_text("START");
|
||||||
|
button_start.set_style(&style_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
transmitting_ = transmitting;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TransmitterView::on_show() {
|
||||||
|
field_frequency.set_value(receiver_model.tuning_frequency());
|
||||||
|
}
|
||||||
|
|
||||||
|
TransmitterView::TransmitterView(
|
||||||
|
const Coord y, const uint32_t frequency_step, const uint32_t bandwidth
|
||||||
|
) {
|
||||||
|
set_parent_rect({ 0 * 8, y, 30 * 8, 2 * 16 });
|
||||||
|
|
||||||
|
add_children({
|
||||||
|
&field_frequency,
|
||||||
|
&field_gain,
|
||||||
|
&field_bw,
|
||||||
|
&text_kHz,
|
||||||
|
&button_start
|
||||||
|
});
|
||||||
|
|
||||||
|
set_transmitting(false);
|
||||||
|
|
||||||
|
field_frequency.set_value(receiver_model.tuning_frequency());
|
||||||
|
field_frequency.set_step(frequency_step);
|
||||||
|
field_frequency.on_change = [this](rf::Frequency f) {
|
||||||
|
this->on_tuning_frequency_changed(f);
|
||||||
|
};
|
||||||
|
field_frequency.on_edit = [this]() {
|
||||||
|
if (on_edit_frequency)
|
||||||
|
on_edit_frequency();
|
||||||
|
};
|
||||||
|
|
||||||
|
field_bw.on_change = [this](int32_t bandwidth) {
|
||||||
|
transmitter_model.set_bandwidth(bandwidth);
|
||||||
|
};
|
||||||
|
field_bw.set_value(bandwidth);
|
||||||
|
|
||||||
|
button_start.on_select = [this](Button&){
|
||||||
|
if (transmitting_) {
|
||||||
|
if (on_stop)
|
||||||
|
on_stop();
|
||||||
|
} else {
|
||||||
|
if (on_start)
|
||||||
|
on_start();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
TransmitterView::~TransmitterView() {
|
||||||
|
/*audio::output::stop();
|
||||||
|
|
||||||
|
transmitter_model.disable();
|
||||||
|
|
||||||
|
baseband::shutdown();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace ui */
|
107
firmware/application/ui_transmitter.hpp
Normal file
107
firmware/application/ui_transmitter.hpp
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc.
|
||||||
|
* Copyright (C) 2016 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __UI_TRANSMITTER_H__
|
||||||
|
#define __UI_TRANSMITTER_H__
|
||||||
|
|
||||||
|
#include "ui.hpp"
|
||||||
|
#include "ui_navigation.hpp"
|
||||||
|
#include "ui_painter.hpp"
|
||||||
|
#include "ui_widget.hpp"
|
||||||
|
#include "ui_receiver.hpp"
|
||||||
|
#include "ui_font_fixed_8x16.hpp"
|
||||||
|
|
||||||
|
#include "rf_path.hpp"
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
class TXGainField : public NumberField {
|
||||||
|
public:
|
||||||
|
std::function<void(void)> on_show_options { };
|
||||||
|
|
||||||
|
TXGainField(Point parent_pos);
|
||||||
|
};
|
||||||
|
|
||||||
|
class TransmitterView : public View {
|
||||||
|
public:
|
||||||
|
std::function<void(void)> on_edit_frequency { };
|
||||||
|
std::function<void(void)> on_start { };
|
||||||
|
std::function<void(void)> on_stop { };
|
||||||
|
|
||||||
|
TransmitterView(const Coord y, const uint32_t frequency_step, const uint32_t bandwidth);
|
||||||
|
~TransmitterView();
|
||||||
|
|
||||||
|
void on_show() override;
|
||||||
|
|
||||||
|
void set_transmitting(const bool transmitting);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const Style style_start {
|
||||||
|
.font = font::fixed_8x16,
|
||||||
|
.background = Color::black(),
|
||||||
|
.foreground = Color::green(),
|
||||||
|
};
|
||||||
|
const Style style_stop {
|
||||||
|
.font = font::fixed_8x16,
|
||||||
|
.background = Color::black(),
|
||||||
|
.foreground = Color::red(),
|
||||||
|
};
|
||||||
|
|
||||||
|
bool transmitting_ { false };
|
||||||
|
|
||||||
|
FrequencyField field_frequency {
|
||||||
|
{ 0 * 8, 0 * 16 }
|
||||||
|
};
|
||||||
|
|
||||||
|
TXGainField field_gain {
|
||||||
|
{ 11 * 8, 0 * 16 }
|
||||||
|
};
|
||||||
|
|
||||||
|
NumberField field_bw {
|
||||||
|
{ 14 * 8, 0 * 16 },
|
||||||
|
2,
|
||||||
|
{ 1, 99 },
|
||||||
|
1,
|
||||||
|
' '
|
||||||
|
};
|
||||||
|
Text text_kHz {
|
||||||
|
{ 16 * 8, 0 * 16, 3 * 8, 1 * 16 },
|
||||||
|
"kHz"
|
||||||
|
};
|
||||||
|
|
||||||
|
Button button_start {
|
||||||
|
{ 20 * 8, 0 * 16, 9 * 8, 32 },
|
||||||
|
"START"
|
||||||
|
};
|
||||||
|
|
||||||
|
void on_tuning_frequency_changed(rf::Frequency f);
|
||||||
|
void on_bandwidth_changed(uint32_t bandwidth);
|
||||||
|
};
|
||||||
|
|
||||||
|
} /* namespace ui */
|
||||||
|
|
||||||
|
#endif/*__UI_TRANSMITTER_H__*/
|
@ -82,11 +82,11 @@ void TonesProcessor::execute(const buffer_c8_t& buffer) {
|
|||||||
tone_sample = 0;
|
tone_sample = 0;
|
||||||
} else {
|
} else {
|
||||||
if (!dual_tone) {
|
if (!dual_tone) {
|
||||||
tone_sample = (sine_table_i8[(tone_a_phase & 0x03FC0000U) >> 18]);
|
tone_sample = (sine_table_i8[(tone_a_phase & 0xFF000000U) >> 24]);
|
||||||
tone_a_phase += tone_a_delta;
|
tone_a_phase += tone_a_delta;
|
||||||
} else {
|
} else {
|
||||||
tone_sample = sine_table_i8[(tone_a_phase & 0x03FC0000U) >> 18] >> 1;
|
tone_sample = sine_table_i8[(tone_a_phase & 0xFF000000U) >> 24] >> 1;
|
||||||
tone_sample += sine_table_i8[(tone_b_phase & 0x03FC0000U) >> 18] >> 1;
|
tone_sample += sine_table_i8[(tone_b_phase & 0xFF000000U) >> 24] >> 1;
|
||||||
|
|
||||||
tone_a_phase += tone_a_delta;
|
tone_a_phase += tone_a_delta;
|
||||||
tone_b_phase += tone_b_delta;
|
tone_b_phase += tone_b_delta;
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user