2016-11-30 07:41:55 +01:00
/*
* 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"
2017-07-18 01:07:46 +01:00
# include "adsb.hpp"
2016-11-30 07:41:55 +01:00
# include "ui_textentry.hpp"
2017-08-03 19:06:59 +01:00
# include "ui_geomap.hpp"
2017-07-30 09:39:01 +01:00
# include "ui_tabview.hpp"
2017-02-12 04:05:21 +00:00
# include "ui_transmitter.hpp"
2016-11-30 07:41:55 +01:00
# include "message.hpp"
# include "transmitter_model.hpp"
2022-05-13 08:38:04 -04:00
# include "app_settings.hpp"
2016-11-30 07:41:55 +01:00
# include "portapack.hpp"
2017-07-18 01:07:46 +01:00
using namespace adsb ;
2016-11-30 07:41:55 +01:00
namespace ui {
2017-07-25 08:30:12 +01:00
class Compass : public Widget {
public :
Compass ( const Point parent_pos ) ;
void set_value ( uint32_t new_value ) ;
void paint ( Painter & ) override ;
private :
const range_t < uint32_t > range { 0 , 359 } ;
uint32_t value_ { 0 } ;
2017-07-30 14:46:42 +01:00
} ;
2017-07-25 08:30:12 +01:00
2017-08-16 10:02:57 +01:00
class ADSBPositionView : public OptionTabView {
2017-07-30 14:46:42 +01:00
public :
2017-08-16 10:02:57 +01:00
ADSBPositionView ( NavigationView & nav , Rect parent_rect ) ;
2017-07-30 14:46:42 +01:00
void collect_frames ( const uint32_t ICAO_address , std : : vector < ADSBFrame > & frame_list ) ;
private :
2017-08-03 19:06:59 +01:00
GeoPos geopos {
2017-10-28 20:22:55 +02:00
{ 0 , 2 * 16 } ,
GeoPos : : FEET
2017-07-30 14:46:42 +01:00
} ;
Button button_set_map {
2017-08-12 07:07:21 +01:00
{ 8 * 8 , 6 * 16 , 14 * 8 , 2 * 16 } ,
2017-07-30 14:46:42 +01:00
" Set from map "
} ;
} ;
2017-08-16 10:02:57 +01:00
class ADSBCallsignView : public OptionTabView {
2017-07-30 14:46:42 +01:00
public :
2017-08-16 10:02:57 +01:00
ADSBCallsignView ( NavigationView & nav , Rect parent_rect ) ;
2017-07-30 14:46:42 +01:00
void collect_frames ( const uint32_t ICAO_address , std : : vector < ADSBFrame > & frame_list ) ;
private :
std : : string callsign = " TEST1234 " ;
Labels labels_callsign {
{ { 2 * 8 , 5 * 8 } , " Callsign: " , Color : : light_grey ( ) }
} ;
Button button_callsign {
{ 12 * 8 , 2 * 16 , 10 * 8 , 2 * 16 } ,
" "
} ;
} ;
2017-08-16 10:02:57 +01:00
class ADSBSpeedView : public OptionTabView {
2017-07-30 14:46:42 +01:00
public :
2017-08-16 10:02:57 +01:00
ADSBSpeedView ( Rect parent_rect ) ;
2017-07-30 14:46:42 +01:00
void collect_frames ( const uint32_t ICAO_address , std : : vector < ADSBFrame > & frame_list ) ;
private :
Labels labels_speed {
{ { 1 * 8 , 6 * 16 } , " Speed: kn Bearing: * " , Color : : light_grey ( ) }
} ;
2023-01-05 00:14:11 +01:00
Labels labels_vert_rate {
{ { 1 * 8 , 8 * 16 } , " Vert. rate: ft/min, (+/-) " , Color : : light_grey ( ) }
} ;
2017-07-30 14:46:42 +01:00
Compass compass {
{ 21 * 8 , 2 * 16 }
} ;
NumberField field_angle {
{ 21 * 8 + 20 , 6 * 16 } , 3 , { 0 , 359 } , 1 , ' ' , true
} ;
NumberField field_speed {
{ 8 * 8 , 6 * 16 } , 3 , { 0 , 999 } , 5 , ' '
} ;
2023-01-05 00:14:11 +01:00
NumberField field_vert_rate {
{ 11 * 8 , 8 * 16 } , 5 , { - 4096 , 4096 } , 64 , ' ' // Let's limit to +/-5k aprox , Ex. max safe descent vertical rate aprox -1000 ft/min on an instrument approach. , std step is 64
} ;
2017-07-30 14:46:42 +01:00
} ;
2017-08-16 10:02:57 +01:00
class ADSBSquawkView : public OptionTabView {
2017-07-30 14:46:42 +01:00
public :
2017-08-16 10:02:57 +01:00
ADSBSquawkView ( Rect parent_rect ) ;
2017-07-30 14:46:42 +01:00
void collect_frames ( const uint32_t ICAO_address , std : : vector < ADSBFrame > & frame_list ) ;
private :
Labels labels_squawk {
{ { 2 * 8 , 2 * 16 } , " Squawk: " , Color : : light_grey ( ) }
} ;
SymField field_squawk {
{ 10 * 8 , 2 * 16 } ,
4 ,
SymField : : SYMFIELD_OCT
} ;
2017-07-25 08:30:12 +01:00
} ;
2017-08-12 09:54:58 +01:00
class ADSBTXThread {
public :
ADSBTXThread ( std : : vector < ADSBFrame > frames ) ;
~ ADSBTXThread ( ) ;
ADSBTXThread ( const ADSBTXThread & ) = delete ;
ADSBTXThread ( ADSBTXThread & & ) = delete ;
ADSBTXThread & operator = ( const ADSBTXThread & ) = delete ;
ADSBTXThread & operator = ( ADSBTXThread & & ) = delete ;
private :
std : : vector < ADSBFrame > frames_ { } ;
Thread * thread { nullptr } ;
static msg_t static_fn ( void * arg ) ;
void run ( ) ;
} ;
2016-11-30 07:41:55 +01:00
class ADSBTxView : public View {
public :
ADSBTxView ( NavigationView & nav ) ;
~ ADSBTxView ( ) ;
void focus ( ) override ;
2022-04-26 23:09:24 +02:00
std : : string title ( ) const override { return " ADS-B TX " ; } ;
2016-11-30 07:41:55 +01:00
private :
2017-08-03 19:06:59 +01:00
/*enum tx_modes {
2016-11-30 07:41:55 +01:00
IDLE = 0 ,
SINGLE ,
SEQUENCE
2017-08-03 19:06:59 +01:00
} ; */
2016-11-30 07:41:55 +01:00
2017-08-03 19:06:59 +01:00
/*const float plane_lats[12] = {
2017-07-23 12:20:32 +01:00
0 ,
- 1 ,
- 2 ,
- 3 ,
- 4 ,
- 5 ,
- 4.5 ,
- 5 ,
- 4 ,
- 3 ,
- 2 ,
- 1
} ;
const float plane_lons [ 12 ] = {
0 ,
1 ,
1 ,
1 ,
2 ,
1 ,
0 ,
- 1 ,
- 2 ,
- 1 ,
- 1 ,
- 1
2017-08-03 19:06:59 +01:00
} ; */
2022-05-13 08:38:04 -04:00
// app save settings
std : : app_settings settings { } ;
std : : app_settings : : AppSettings app_settings { } ;
2017-07-23 12:20:32 +01:00
2017-08-03 19:06:59 +01:00
//tx_modes tx_mode = IDLE;
2017-07-30 14:46:42 +01:00
NavigationView & nav_ ;
std : : vector < ADSBFrame > frames { } ;
2016-11-30 07:41:55 +01:00
2017-07-25 08:30:12 +01:00
void start_tx ( ) ;
void generate_frames ( ) ;
2016-11-30 07:41:55 +01:00
2017-08-16 10:02:57 +01:00
Rect view_rect = { 0 , 7 * 8 , 240 , 192 } ;
ADSBPositionView view_position { nav_ , view_rect } ;
ADSBCallsignView view_callsign { nav_ , view_rect } ;
ADSBSpeedView view_speed { view_rect } ;
ADSBSquawkView view_squawk { view_rect } ;
2016-11-30 07:41:55 +01:00
2017-07-30 09:39:01 +01:00
TabView tab_view {
2017-07-30 14:46:42 +01:00
{ " Position " , Color : : cyan ( ) , & view_position } ,
{ " Callsign " , Color : : green ( ) , & view_callsign } ,
{ " Speed " , Color : : yellow ( ) , & view_speed } ,
{ " Squawk " , Color : : orange ( ) , & view_squawk }
} ;
Labels labels {
{ { 2 * 8 , 4 * 8 } , " ICAO24: " , Color : : light_grey ( ) }
2017-07-30 09:39:01 +01:00
} ;
2016-12-05 12:56:41 +01:00
SymField sym_icao {
2017-07-30 14:46:42 +01:00
{ 10 * 8 , 4 * 8 } ,
2016-12-05 12:56:41 +01:00
6 ,
2017-02-01 00:21:13 +00:00
SymField : : SYMFIELD_HEX
2016-11-30 07:41:55 +01:00
} ;
2017-02-01 00:21:13 +00:00
2017-07-25 08:30:12 +01:00
Text text_frame {
{ 1 * 8 , 29 * 8 , 14 * 8 , 16 } ,
2016-12-01 06:58:47 +01:00
" - "
} ;
2017-02-12 04:05:21 +00:00
TransmitterView tx_view {
16 * 16 ,
2017-07-30 09:39:01 +01:00
1000000 ,
0
2016-11-30 07:41:55 +01:00
} ;
2017-08-12 09:54:58 +01:00
std : : unique_ptr < ADSBTXThread > tx_thread { } ;
2016-11-30 07:41:55 +01:00
} ;
} /* namespace ui */