diff --git a/.gitignore b/.gitignore index 4be2070d8..97662e157 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,9 @@ CMakeFiles/ # Host OS leftovers .DS_Store /firmware/CMakeCache.txt + +# Python env +env/ + +# Other *.bak diff --git a/firmware/application/apps/ui_about_simple.cpp b/firmware/application/apps/ui_about_simple.cpp index f74947e11..e6cce9e20 100644 --- a/firmware/application/apps/ui_about_simple.cpp +++ b/firmware/application/apps/ui_about_simple.cpp @@ -6,7 +6,8 @@ namespace ui { add_children({&console, &button_ok}); - button_ok.on_select = [&nav](Button &) { + button_ok.on_select = [&nav](Button &) + { nav.pop(); }; @@ -34,6 +35,7 @@ namespace ui console.writeln("zhang00963,RedFox-Fr,aldude999"); console.writeln("East2West,fossum,ArjanOnwezen"); console.writeln("vXxOinvizioNxX,teixeluis"); + console.writeln("Brumi-2021,texasyojimbo"); console.writeln("heurist1,intoxsick"); console.writeln(""); break; @@ -41,7 +43,7 @@ namespace ui case 2: // https://github.com/eried/portapack-mayhem/graphs/contributors?to=2020-04-12&from=2015-07-31&type=c console.writeln("\x1B\x06Havoc:\x1B\x10"); - console.writeln("furrtek,mrmookie,notpike"); + console.writeln("furrtek,mrmookie,NotPike"); console.writeln("mjwaxios,ImDroided,Giorgiofox"); console.writeln("F4GEV,z4ziggy,xmycroftx"); console.writeln("troussos,silascutler"); diff --git a/firmware/application/apps/ui_touchtunes.cpp b/firmware/application/apps/ui_touchtunes.cpp index 63e5e6f05..8d2cc0571 100644 --- a/firmware/application/apps/ui_touchtunes.cpp +++ b/firmware/application/apps/ui_touchtunes.cpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek - * Copyright (C) 2017 NotPike + * Copyright (C) 2022 NotPike * * This file is part of PortaPack. * @@ -27,6 +27,7 @@ #include "baseband_api.hpp" #include "string_format.hpp" + using namespace portapack; using namespace encoders; @@ -45,7 +46,13 @@ void TouchTunesView::stop_tx() { transmitter_model.disable(); tx_mode = IDLE; progressbar.set_value(0); - text_status.set("Ready"); + + // EW Mode Check + if(check_ew.value()) { + start_ew(); + } else { + text_status.set("Ready"); + } } void TouchTunesView::on_tx_progress(const uint32_t progress, const bool done) { @@ -72,7 +79,43 @@ void TouchTunesView::on_tx_progress(const uint32_t progress, const bool done) { } } +// EW (Electronic Warfare) Mode will jam the receiving jukebox +// while still alowing you (the hacker) to send commands +// to the target jukebox. +// EW Mode works by transmitting a CW on 433.92MHz inbetween +// transmission events. +void TouchTunesView::start_ew() { + // Radio + transmitter_model.set_tuning_frequency(433920000); + transmitter_model.set_sampling_rate(3072000U); + transmitter_model.set_rf_amp(true); + transmitter_model.set_baseband_bandwidth(3500000U); + transmitter_model.set_tx_gain(47); + transmitter_model.enable(); + + //UI + text_status.set("Jamming..."); + progressbar.set_max(1); + progressbar.set_value(1); + +} + +void TouchTunesView::stop_ew() { + // Radio + transmitter_model.disable(); + + // UI + text_status.set("Ready"); + progressbar.set_value(0); +} + void TouchTunesView::start_tx(const uint32_t button_index) { + + // Check EW Mode + if(check_ew.value()) { + stop_ew(); + } + std::string fragments = { "" }; size_t bit; uint64_t frame_data; @@ -136,6 +179,7 @@ TouchTunesView::TouchTunesView( &labels, &field_pin, &check_scan, + &check_ew, &text_status, &progressbar }); @@ -145,6 +189,15 @@ TouchTunesView::TouchTunesView( field_pin.on_change = [this](int32_t v) { pin = v; }; + + // EW Mode + check_ew.on_select = [this](Checkbox&, bool v) { + if(v){ + start_ew(); + } else { + stop_ew(); + } + }; const auto button_fn = [this](Button& button) { start_tx(button.id); diff --git a/firmware/application/apps/ui_touchtunes.hpp b/firmware/application/apps/ui_touchtunes.hpp index f4b986c6e..b7fb5a752 100644 --- a/firmware/application/apps/ui_touchtunes.hpp +++ b/firmware/application/apps/ui_touchtunes.hpp @@ -1,7 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek - * Copyright (C) 2018 NotPike + * Copyright (C) 2022 NotPike * * This file is part of PortaPack. * @@ -127,6 +127,8 @@ private: void start_tx(const uint32_t button_index); void stop_tx(); void on_tx_progress(const uint32_t progress, const bool done); + void start_ew(); + void stop_ew(); struct remote_layout_t { Point position; @@ -191,11 +193,17 @@ private: }; Checkbox check_scan { - { 2 * 8, 27 * 8 }, + { 2 * 8, 25 * 8 }, 4, "Scan" }; + Checkbox check_ew { + { 2 * 8, 29 * 8 }, + 4, + "EW Mode" + }; + Text text_status { { 2 * 8, 33 * 8, 128, 16 }, "Ready" diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 3ecb9a150..6eb6f9ea6 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -45,255 +45,252 @@ using namespace sd_card; -namespace ui { +namespace ui +{ -enum modal_t { - INFO = 0, - YESNO, - YESCANCEL, - ABORT -}; - -class NavigationView : public View { -public: - std::function on_view_changed { }; - - NavigationView() = default; - - NavigationView(const NavigationView&) = delete; - NavigationView(NavigationView&&) = delete; - NavigationView& operator=(const NavigationView&) = delete; - NavigationView& operator=(NavigationView&&) = delete; - - bool is_top() const; - - template - T* push(Args&&... args) { - return reinterpret_cast(push_view(std::unique_ptr(new T(*this, std::forward(args)...)))); - } - template - T* replace(Args&&... args) { - pop(); - return reinterpret_cast(push_view(std::unique_ptr(new T(*this, std::forward(args)...)))); - } - - void push(View* v); - void replace(View* v); - - void pop(); - void pop_modal(); - - void display_modal(const std::string& title, const std::string& message); - void display_modal(const std::string& title, const std::string& message, const modal_t type, const std::function on_choice = nullptr); - - void focus() override; - -private: - std::vector> view_stack { }; - Widget* modal_view { nullptr }; - - Widget* view() const; - - void free_view(); - void update_view(); - View* push_view(std::unique_ptr new_view); -}; - -class SystemStatusView : public View { -public: - std::function on_back { }; - - SystemStatusView(NavigationView& nav); - - void set_back_enabled(bool new_value); - void set_title_image_enabled(bool new_value); - void set_title(const std::string new_value); - -private: - static constexpr auto default_title = ""; - - NavigationView& nav_; - - Rectangle backdrop { - { 0 * 8, 0 * 16, 240, 16 }, - Color::dark_grey() + enum modal_t + { + INFO = 0, + YESNO, + YESCANCEL, + ABORT }; - ImageButton button_back { - { 2, 0 * 16, 16, 16 }, - &bitmap_icon_previous, - Color::white(), - Color::dark_grey() + class NavigationView : public View + { + public: + std::function on_view_changed{}; + + NavigationView() = default; + + NavigationView(const NavigationView &) = delete; + NavigationView(NavigationView &&) = delete; + NavigationView &operator=(const NavigationView &) = delete; + NavigationView &operator=(NavigationView &&) = delete; + + bool is_top() const; + + template + T *push(Args &&...args) + { + return reinterpret_cast(push_view(std::unique_ptr(new T(*this, std::forward(args)...)))); + } + template + T *replace(Args &&...args) + { + pop(); + return reinterpret_cast(push_view(std::unique_ptr(new T(*this, std::forward(args)...)))); + } + + void push(View *v); + void replace(View *v); + + void pop(); + void pop_modal(); + + void display_modal(const std::string &title, const std::string &message); + void display_modal(const std::string &title, const std::string &message, const modal_t type, const std::function on_choice = nullptr); + + void focus() override; + + private: + std::vector> view_stack{}; + Widget *modal_view{nullptr}; + + Widget *view() const; + + void free_view(); + void update_view(); + View *push_view(std::unique_ptr new_view); }; - Text title { - { 20, 0, 14 * 8, 1 * 16 }, - default_title, - }; + class SystemStatusView : public View + { + public: + std::function on_back{}; - ImageButton button_title { - {2, 0, 80, 16}, - &bitmap_titlebar_image, - Color::white(), - Color::dark_grey() - }; + SystemStatusView(NavigationView &nav); - ImageButton button_speaker { - { 17 * 8, 0, 2 * 8, 1 * 16 }, - &bitmap_icon_speaker_mute, - Color::light_grey(), - Color::dark_grey() - }; - - ImageButton button_stealth { - { 19 * 8, 0, 2 * 8, 1 * 16 }, - &bitmap_icon_stealth, - Color::light_grey(), - Color::dark_grey() - }; - - /*ImageButton button_textentry { + void set_back_enabled(bool new_value); + void set_title_image_enabled(bool new_value); + void set_title(const std::string new_value); + + private: + static constexpr auto default_title = ""; + + NavigationView &nav_; + + Rectangle backdrop{ + {0 * 8, 0 * 16, 240, 16}, + Color::dark_grey()}; + + ImageButton button_back{ + {2, 0 * 16, 16, 16}, + &bitmap_icon_previous, + Color::white(), + Color::dark_grey()}; + + Text title{ + {20, 0, 14 * 8, 1 * 16}, + default_title, + }; + + ImageButton button_title{ + {2, 0, 80, 16}, + &bitmap_titlebar_image, + Color::white(), + Color::dark_grey()}; + + ImageButton button_speaker{ + {17 * 8, 0, 2 * 8, 1 * 16}, + &bitmap_icon_speaker_mute, + Color::light_grey(), + Color::dark_grey()}; + + ImageButton button_stealth{ + {19 * 8, 0, 2 * 8, 1 * 16}, + &bitmap_icon_stealth, + Color::light_grey(), + Color::dark_grey()}; + + /*ImageButton button_textentry { { 170, 0, 2 * 8, 1 * 16 }, &bitmap_icon_unistroke, Color::white(), Color::dark_grey() };*/ - ImageButton button_camera { - { 21 * 8, 0, 2 * 8, 1 * 16 }, - &bitmap_icon_camera, - Color::white(), - Color::dark_grey() + ImageButton button_camera{ + {21 * 8, 0, 2 * 8, 1 * 16}, + &bitmap_icon_camera, + Color::white(), + Color::dark_grey()}; + + ImageButton button_sleep{ + {23 * 8, 0, 2 * 8, 1 * 16}, + &bitmap_icon_sleep, + Color::white(), + Color::dark_grey()}; + + ImageButton button_bias_tee{ + {25 * 8, 0, 12, 1 * 16}, + &bitmap_icon_biast_off, + Color::light_grey(), + Color::dark_grey()}; + + ImageButton button_clock_status{ + {27 * 8, 0 * 16, 2 * 8, 1 * 16}, + &bitmap_icon_clk_int, + Color::light_grey(), + Color::dark_grey()}; + + SDCardStatusView sd_card_status_view{ + {28 * 8, 0 * 16, 2 * 8, 1 * 16}}; + + void on_speaker(); + void on_stealth(); + void on_bias_tee(); + //void on_textentry(); + void on_camera(); + void on_title(); + void refresh(); + void on_clk(); + + MessageHandlerRegistration message_handler_refresh{ + Message::ID::StatusRefresh, + [this](const Message *const p) + { + (void)p; + this->refresh(); + }}; }; - ImageButton button_sleep { - { 23 * 8, 0, 2 * 8, 1 * 16 }, - &bitmap_icon_sleep, - Color::white(), - Color::dark_grey() - }; - - ImageButton button_bias_tee { - { 25 * 8, 0, 12, 1 * 16 }, - &bitmap_icon_biast_off, - Color::light_grey(), - Color::dark_grey() - }; - - ImageButton button_clock_status { - { 27 * 8, 0 * 16, 2 * 8, 1 * 16 }, - &bitmap_icon_clk_int, - Color::light_grey(), - Color::dark_grey() - }; - - SDCardStatusView sd_card_status_view { - { 28 * 8, 0 * 16, 2 * 8, 1 * 16 } + class InformationView : public View + { + public: + InformationView(NavigationView &nav); + void refresh(); + + private: + static constexpr auto version_string = "v1.4.2"; + NavigationView &nav_; + + Rectangle backdrop{ + {0, 0 * 16, 240, 16}, + {33, 33, 33}}; + + Text version{ + {2, 0, 11 * 8, 16}, + version_string}; + + LiveDateTime ltime{ + {86, 0, 19 * 8, 16}}; }; - void on_speaker(); - void on_stealth(); - void on_bias_tee(); - //void on_textentry(); - void on_camera(); - void on_title(); - void refresh(); - void on_clk(); - - MessageHandlerRegistration message_handler_refresh { - Message::ID::StatusRefresh, - [this](const Message* const p) { - (void)p; - this->refresh(); - } - }; -}; + class BMPView : public View + { + public: + BMPView(NavigationView &nav); + void paint(Painter &) override; + void focus() override; -class InformationView : public View { -public: - InformationView(NavigationView& nav); - void refresh(); -private: - static constexpr auto version_string = "v1.4.2"; - NavigationView& nav_; + private: + Text text_info{ + {4 * 8, 284, 20 * 8, 16}, + "Version " VERSION_STRING}; - Rectangle backdrop { - { 0, 0 * 16, 240, 16 }, - {33, 33, 33} + Button button_done{ + {240, 0, 1, 1}, + ""}; }; - Text version { - {2, 0, 11 * 8, 16}, - version_string + class ReceiversMenuView : public BtnGridView + { + public: + ReceiversMenuView(NavigationView &nav); + std::string title() const override { return "Receivers"; }; }; - - LiveDateTime ltime { - {86, 0, 19 * 8, 16} + + class TransmittersMenuView : public BtnGridView + { + public: + TransmittersMenuView(NavigationView &nav); + std::string title() const override { return "Transmitters"; }; }; - -}; - -class BMPView : public View { -public: - BMPView(NavigationView& nav); - void paint(Painter&) override; - void focus() override; - -private: - Text text_info { - { 4*8, 284, 20 * 8, 16 }, - "Version " VERSION_STRING + class UtilitiesMenuView : public BtnGridView + { + public: + UtilitiesMenuView(NavigationView &nav); + std::string title() const override { return "Utilities"; }; }; - - Button button_done { - { 240, 0, 1, 1 }, - "" + + class SystemMenuView : public BtnGridView + { + public: + SystemMenuView(NavigationView &nav); + + private: + void hackrf_mode(NavigationView &nav); }; -}; -class ReceiversMenuView : public BtnGridView { -public: - ReceiversMenuView(NavigationView& nav); - std::string title() const override { return "Receivers"; }; -}; + class SystemView : public View + { + public: + SystemView( + Context &context, + const Rect parent_rect); -class TransmittersMenuView : public BtnGridView { -public: - TransmittersMenuView(NavigationView& nav); - std::string title() const override { return "Transmitters"; }; -}; + Context &context() const override; -class UtilitiesMenuView : public BtnGridView { -public: - UtilitiesMenuView(NavigationView& nav); - std::string title() const override { return "Utilities"; }; -}; + private: + SystemStatusView status_view{navigation_view}; + InformationView info_view{navigation_view}; + NavigationView navigation_view{}; + Context &context_; + }; -class SystemMenuView : public BtnGridView { -public: - SystemMenuView(NavigationView& nav); -private: - void hackrf_mode(NavigationView& nav); -}; - -class SystemView : public View { -public: - SystemView( - Context& context, - const Rect parent_rect - ); - - Context& context() const override; - -private: - SystemStatusView status_view { navigation_view }; - InformationView info_view { navigation_view }; - NavigationView navigation_view { }; - Context& context_; -}; - -/*class NotImplementedView : public View { + /*class NotImplementedView : public View { public: NotImplementedView(NavigationView& nav); @@ -311,43 +308,43 @@ private: }; };*/ -class ModalMessageView : public View { -public: - ModalMessageView( - NavigationView& nav, - const std::string& title, - const std::string& message, - const modal_t type, - const std::function on_choice - ); - - void paint(Painter& painter) override; - void focus() override; + class ModalMessageView : public View + { + public: + ModalMessageView( + NavigationView &nav, + const std::string &title, + const std::string &message, + const modal_t type, + const std::function on_choice); - std::string title() const override { return title_; }; + void paint(Painter &painter) override; + void focus() override; -private: - const std::string title_; - const std::string message_; - const modal_t type_; - const std::function on_choice_; + std::string title() const override { return title_; }; - Button button_ok { - { 10 * 8, 14 * 16, 10 * 8, 48 }, - "OK", + private: + const std::string title_; + const std::string message_; + const modal_t type_; + const std::function on_choice_; + + Button button_ok{ + {10 * 8, 14 * 16, 10 * 8, 48}, + "OK", + }; + + Button button_yes{ + {5 * 8, 14 * 16, 8 * 8, 48}, + "YES", + }; + + Button button_no{ + {17 * 8, 14 * 16, 8 * 8, 48}, + "NO", + }; }; - - Button button_yes { - { 5 * 8, 14 * 16, 8 * 8, 48 }, - "YES", - }; - - Button button_no { - { 17 * 8, 14 * 16, 8 * 8, 48 }, - "NO", - }; -}; } /* namespace ui */ -#endif/*__UI_NAVIGATION_H__*/ +#endif /*__UI_NAVIGATION_H__*/ diff --git a/hardware/portapack_h2/3d_printed/README.md b/hardware/portapack_h2/3d_printed/README.md new file mode 100644 index 000000000..7e1566ac6 --- /dev/null +++ b/hardware/portapack_h2/3d_printed/README.md @@ -0,0 +1,7 @@ +Enclosure + +https://www.thingiverse.com/thing:4260973 + +Cover + +https://www.thingiverse.com/thing:4278961 \ No newline at end of file diff --git a/hardware/portapack_h2/3d_printed/cover/revisited_cover.stl b/hardware/portapack_h2/3d_printed/cover/revisited_cover.stl new file mode 100644 index 000000000..d49287433 Binary files /dev/null and b/hardware/portapack_h2/3d_printed/cover/revisited_cover.stl differ diff --git a/hardware/portapack_h2/3d_printed/enclosure/revisited_down.stl b/hardware/portapack_h2/3d_printed/enclosure/revisited_down.stl new file mode 100644 index 000000000..6782e2b46 Binary files /dev/null and b/hardware/portapack_h2/3d_printed/enclosure/revisited_down.stl differ diff --git a/hardware/portapack_h2/3d_printed/enclosure/revisited_support.stl b/hardware/portapack_h2/3d_printed/enclosure/revisited_support.stl new file mode 100644 index 000000000..84b494765 Binary files /dev/null and b/hardware/portapack_h2/3d_printed/enclosure/revisited_support.stl differ diff --git a/hardware/portapack_h2/3d_printed/enclosure/revisited_up.stl b/hardware/portapack_h2/3d_printed/enclosure/revisited_up.stl new file mode 100644 index 000000000..1e1129034 Binary files /dev/null and b/hardware/portapack_h2/3d_printed/enclosure/revisited_up.stl differ