2015-11-12 19:19:05 -05:00
/*
* Copyright ( C ) 2015 Jared Boone , ShareBrained Technology , Inc .
2016-12-01 00:58:47 -05:00
* Copyright ( C ) 2016 Furrtek
2015-11-12 19:19:05 -05:00
*
* 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"
2023-12-26 01:16:54 -05:00
# include "ui_language.hpp"
2015-11-12 19:19:05 -05:00
# include "ui_widget.hpp"
2016-12-01 00:58:47 -05:00
# include "ui_navigation.hpp"
2017-08-11 19:27:05 -04:00
# include "ui_tabview.hpp"
2016-12-01 00:58:47 -05:00
# include "transmitter_model.hpp"
2017-02-13 00:35:13 -05:00
# include "message.hpp"
# include "jammer.hpp"
2021-01-08 09:54:21 -05:00
# include "lfsr_random.hpp"
2023-06-14 03:57:20 -04:00
# include "radio_state.hpp"
2015-11-12 19:19:05 -05:00
2017-08-11 19:27:05 -04:00
using namespace jammer ;
2023-12-15 14:18:21 -05:00
namespace ui : : external_app : : jammer {
2015-11-12 19:19:05 -05:00
2017-08-11 19:27:05 -04:00
class RangeView : public View {
2023-05-18 16:16:05 -04:00
public :
RangeView ( NavigationView & nav ) ;
void focus ( ) override ;
void paint ( Painter & ) override ;
jammer_range_t frequency_range { false , 0 , 0 } ;
private :
void update_start ( rf : : Frequency f ) ;
void update_stop ( rf : : Frequency f ) ;
void update_center ( rf : : Frequency f ) ;
void update_width ( uint32_t w ) ;
uint32_t width { } ;
rf : : Frequency center { } ;
2024-05-27 15:02:52 -04:00
const Style & style_info = * Theme : : getInstance ( ) - > fg_medium ;
2023-05-18 16:16:05 -04:00
Labels labels {
2024-05-27 15:02:52 -04:00
{ { 2 * 8 , 8 * 8 + 4 } , LanguageHelper : : currentMessages [ LANG_START ] , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 23 * 8 , 8 * 8 + 4 } , LanguageHelper : : currentMessages [ LANG_STOP ] , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 12 * 8 , 5 * 8 - 4 } , " Center " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 12 * 8 + 4 , 13 * 8 } , " Width " , Theme : : getInstance ( ) - > fg_light - > foreground } } ;
2023-05-18 16:16:05 -04:00
Checkbox check_enabled {
{ 1 * 8 , 4 } ,
12 ,
" Enable range " } ;
Button button_load_range {
{ 18 * 8 , 4 , 12 * 8 , 24 } ,
" Load range " } ;
Button button_start {
{ 0 * 8 , 11 * 8 , 11 * 8 , 28 } ,
" " } ;
Button button_stop {
{ 19 * 8 , 11 * 8 , 11 * 8 , 28 } ,
" " } ;
Button button_center {
{ 76 , 4 * 15 - 4 , 11 * 8 , 28 } ,
" " } ;
Button button_width {
{ 76 , 8 * 15 , 11 * 8 , 28 } ,
" " } ;
2017-08-11 19:27:05 -04:00
} ;
class JammerView : public View {
2023-05-18 16:16:05 -04:00
public :
JammerView ( NavigationView & nav ) ;
~ JammerView ( ) ;
JammerView ( const JammerView & ) = delete ;
JammerView ( JammerView & & ) = delete ;
JammerView & operator = ( const JammerView & ) = delete ;
JammerView & operator = ( JammerView & & ) = delete ;
void focus ( ) override ;
std : : string title ( ) const override { return " Jammer TX " ; } ;
private :
NavigationView & nav_ ;
2023-06-14 03:57:20 -04:00
TxRadioState radio_state_ {
2023-10-14 12:33:52 -04:00
0 /* frequency */ ,
2023-06-14 03:57:20 -04:00
3500000 /* bandwidth */ ,
3072000 /* sampling rate */
} ;
2023-05-18 16:16:05 -04:00
void start_tx ( ) ;
void on_timer ( ) ;
void stop_tx ( ) ;
void set_jammer_channel ( uint32_t i , uint32_t width , uint64_t center , uint32_t duration ) ;
void on_retune ( const rf : : Frequency freq , const uint32_t range ) ;
JammerChannel * jammer_channels = ( JammerChannel * ) shared_memory . bb_data . data ;
bool jamming { false } ;
bool cooling { false } ; // euquiq: Indicates jammer in cooldown
uint16_t seconds = 0 ; // euquiq: seconds counter for toggling tx / cooldown
int16_t mscounter = 0 ; // euquiq: Internal ms counter for do_timer()
lfsr_word_t lfsr_v = 1 ; // euquiq: Used to generate "random" Jitter
2024-05-27 15:02:52 -04:00
const Style & style_val = * Theme : : getInstance ( ) - > fg_green ;
const Style & style_cancel = * Theme : : getInstance ( ) - > fg_red ;
2023-05-18 16:16:05 -04:00
RangeView view_range_a { nav_ } ;
RangeView view_range_b { nav_ } ;
RangeView view_range_c { nav_ } ;
std : : array < RangeView * , 3 > range_views { { & view_range_a , & view_range_b , & view_range_c } } ;
TabView tab_view {
2024-05-27 15:02:52 -04:00
{ " Range 1 " , Theme : : getInstance ( ) - > bg_darkest - > foreground , range_views [ 0 ] } ,
{ " Range 2 " , Theme : : getInstance ( ) - > bg_darkest - > foreground , range_views [ 1 ] } ,
{ " Range 3 " , Theme : : getInstance ( ) - > bg_darkest - > foreground , range_views [ 2 ] } ,
2023-05-18 16:16:05 -04:00
} ;
Labels labels {
2024-05-27 15:02:52 -04:00
{ { 2 * 8 , 23 * 8 } , " Type: " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 1 * 8 , 25 * 8 } , " Speed: " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 3 * 8 , 27 * 8 } , " Hop: " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 4 * 8 , 29 * 8 } , " TX: " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 1 * 8 , 31 * 8 } , " Sle3p: " , Theme : : getInstance ( ) - > fg_light - > foreground } , // euquiq: Token of appreciation to TheSle3p, which made this ehnancement a reality with his bounty.
{ { 0 * 8 , 33 * 8 } , " Jitter: " , Theme : : getInstance ( ) - > fg_light - > foreground } , // Maybe the repository curator can keep the "mystype" for some versions.
{ { 11 * 8 , 29 * 8 } , " Secs. " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 11 * 8 , 31 * 8 } , " Secs. " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 11 * 8 , 33 * 8 } , " /60 " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 2 * 8 , 35 * 8 } , " Gain: " , Theme : : getInstance ( ) - > fg_light - > foreground } ,
{ { 11 * 8 , 35 * 8 } , " A: " , Theme : : getInstance ( ) - > fg_light - > foreground } } ;
2023-05-18 16:16:05 -04:00
OptionsField options_type {
{ 7 * 8 , 23 * 8 } ,
8 ,
{
{ " Rand FSK " , 0 } ,
{ " FM tone " , 1 } ,
{ " CW sweep " , 2 } ,
{ " Rand CW " , 3 } ,
} } ;
Text text_range_number {
{ 16 * 8 , 23 * 8 , 2 * 8 , 16 } ,
" -- " } ;
Text text_range_total {
{ 18 * 8 , 23 * 8 , 3 * 8 , 16 } ,
" /-- " } ;
OptionsField options_speed {
{ 7 * 8 , 25 * 8 } ,
6 ,
{ { " 10Hz " , 10 } ,
{ " 100Hz " , 100 } ,
{ " 1kHz " , 1000 } ,
{ " 10kHz " , 10000 } ,
{ " 100kHz " , 100000 } } } ;
OptionsField options_hop {
{ 7 * 8 , 27 * 8 } ,
5 ,
{ { " 10ms " , 1 } ,
{ " 50ms " , 5 } ,
{ " 100ms " , 10 } ,
{ " 1s " , 100 } ,
{ " 2s " , 200 } ,
{ " 5s " , 500 } ,
{ " 10s " , 1000 } } } ;
NumberField field_timetx {
{ 7 * 8 , 29 * 8 } ,
3 ,
{ 1 , 180 } ,
1 ,
' ' ,
} ;
NumberField field_timepause {
{ 8 * 8 , 31 * 8 } ,
2 ,
{ 1 , 60 } ,
1 ,
' ' ,
} ;
NumberField field_jitter {
{ 8 * 8 , 33 * 8 } ,
2 ,
{ 1 , 60 } ,
1 ,
' ' ,
} ;
NumberField field_gain {
{ 8 * 8 , 35 * 8 } ,
2 ,
{ 0 , 47 } ,
1 ,
' ' ,
} ;
NumberField field_amp {
{ 13 * 8 , 35 * 8 } ,
1 ,
{ 0 , 1 } ,
1 ,
' ' ,
} ;
Button button_transmit {
{ 148 , 216 , 80 , 80 } ,
2023-12-26 01:16:54 -05:00
LanguageHelper : : currentMessages [ LANG_START ] } ;
2023-05-18 16:16:05 -04:00
MessageHandlerRegistration message_handler_retune {
Message : : ID : : Retune ,
[ this ] ( Message * const p ) {
const auto message = static_cast < const RetuneMessage * > ( p ) ;
this - > on_retune ( message - > freq , message - > range ) ;
} } ;
MessageHandlerRegistration message_handler_frame_sync {
Message : : ID : : DisplayFrameSync ,
[ this ] ( const Message * const ) {
this - > on_timer ( ) ;
} } ;
2015-11-12 19:19:05 -05:00
} ;
2023-12-15 14:18:21 -05:00
} // namespace ui::external_app::jammer