mirror of
https://github.com/eried/portapack-mayhem.git
synced 2024-10-01 01:26:06 -04:00
parent
49e719ded8
commit
831dbeaab5
@ -318,6 +318,17 @@ bool ADSBRxDetailsView::add_map_marker(const AircraftRecentEntry& entry) {
|
|||||||
return markerStored == MARKER_STORED;
|
return markerStored == MARKER_STORED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ADSBRxDetailsView::on_gps(const GPSPosDataMessage* msg) {
|
||||||
|
if (!geomap_view_)
|
||||||
|
return;
|
||||||
|
geomap_view_->update_my_position(msg->lat, msg->lon, msg->altitude);
|
||||||
|
}
|
||||||
|
void ADSBRxDetailsView::on_orientation(const OrientationDataMessage* msg) {
|
||||||
|
if (!geomap_view_)
|
||||||
|
return;
|
||||||
|
geomap_view_->update_my_orientation(msg->angle);
|
||||||
|
}
|
||||||
|
|
||||||
void ADSBRxDetailsView::refresh_ui() {
|
void ADSBRxDetailsView::refresh_ui() {
|
||||||
auto age = entry_.age;
|
auto age = entry_.age;
|
||||||
if (age < 60)
|
if (age < 60)
|
||||||
|
@ -271,6 +271,8 @@ class ADSBRxDetailsView : public View {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void refresh_ui();
|
void refresh_ui();
|
||||||
|
void on_gps(const GPSPosDataMessage* msg);
|
||||||
|
void on_orientation(const OrientationDataMessage* msg);
|
||||||
|
|
||||||
GeoMapView* geomap_view_{nullptr};
|
GeoMapView* geomap_view_{nullptr};
|
||||||
ADSBRxAircraftDetailsView* aircraft_details_view_{nullptr};
|
ADSBRxAircraftDetailsView* aircraft_details_view_{nullptr};
|
||||||
@ -330,6 +332,19 @@ class ADSBRxDetailsView : public View {
|
|||||||
Button button_see_map{
|
Button button_see_map{
|
||||||
{16 * 8, 9 * 16, 12 * 8, 3 * 16},
|
{16 * 8, 9 * 16, 12 * 8, 3 * 16},
|
||||||
"See on map"};
|
"See on map"};
|
||||||
|
|
||||||
|
MessageHandlerRegistration message_handler_gps{
|
||||||
|
Message::ID::GPSPosData,
|
||||||
|
[this](Message* const p) {
|
||||||
|
const auto message = static_cast<const GPSPosDataMessage*>(p);
|
||||||
|
this->on_gps(message);
|
||||||
|
}};
|
||||||
|
MessageHandlerRegistration message_handler_orientation{
|
||||||
|
Message::ID::OrientationData,
|
||||||
|
[this](Message* const p) {
|
||||||
|
const auto message = static_cast<const OrientationDataMessage*>(p);
|
||||||
|
this->on_orientation(message);
|
||||||
|
}};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Main ADSB application view and message dispatch. */
|
/* Main ADSB application view and message dispatch. */
|
||||||
|
@ -305,6 +305,7 @@ void GeoMap::paint(Painter& painter) {
|
|||||||
// Draw the other markers
|
// Draw the other markers
|
||||||
draw_markers(painter);
|
draw_markers(painter);
|
||||||
draw_scale(painter);
|
draw_scale(painter);
|
||||||
|
draw_mypos();
|
||||||
markerListUpdated = false;
|
markerListUpdated = false;
|
||||||
set_clean();
|
set_clean();
|
||||||
}
|
}
|
||||||
@ -447,6 +448,41 @@ void GeoMap::draw_marker(Painter& painter, const ui::Point itemPoint, const uint
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GeoMap::draw_mypos() {
|
||||||
|
const auto r = screen_rect();
|
||||||
|
if (my_lat >= 200 || my_lon >= 200) return; // invalid
|
||||||
|
int x = (map_width * (my_lon + 180) / 360) - x_pos;
|
||||||
|
double lat_rad = sin(my_lat * pi / 180);
|
||||||
|
int y = (map_height - ((map_world_lon / 2 * log((1 + lat_rad) / (1 - lat_rad))) - map_offset)) - y_pos; // Offset added for the GUI
|
||||||
|
auto color = Color::yellow();
|
||||||
|
|
||||||
|
if (map_zoom > 1) {
|
||||||
|
x = ((x - (r.width() / 2)) * map_zoom) + (r.width() / 2);
|
||||||
|
y = ((y - (r.height() / 2)) * map_zoom) + (r.height() / 2);
|
||||||
|
} else if (map_zoom < 0) {
|
||||||
|
x = ((x - (r.width() / 2)) / (-map_zoom)) + (r.width() / 2);
|
||||||
|
y = ((y - (r.height() / 2)) / (-map_zoom)) + (r.height() / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((x >= 0) && (x < r.width()) &&
|
||||||
|
(y > 10) && (y < r.height())) // Dont draw within symbol size of top
|
||||||
|
{
|
||||||
|
ui::Point itemPoint(x, y + r.top());
|
||||||
|
if (mode_ == PROMPT) {
|
||||||
|
// Cross
|
||||||
|
display.fill_rectangle({itemPoint - Point(16, 1), {32, 2}}, color);
|
||||||
|
display.fill_rectangle({itemPoint - Point(1, 16), {2, 32}}, color);
|
||||||
|
} else if (my_angle < 360) {
|
||||||
|
// if we have a valid angle draw bearing
|
||||||
|
draw_bearing(itemPoint, my_angle, 10, color);
|
||||||
|
} else {
|
||||||
|
// draw a small cross
|
||||||
|
display.fill_rectangle({itemPoint - Point(8, 1), {16, 2}}, color);
|
||||||
|
display.fill_rectangle({itemPoint - Point(1, 8), {2, 16}}, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GeoMap::clear_markers() {
|
void GeoMap::clear_markers() {
|
||||||
markerListLen = 0;
|
markerListLen = 0;
|
||||||
}
|
}
|
||||||
@ -473,6 +509,17 @@ MapMarkerStored GeoMap::store_marker(GeoMarker& marker) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GeoMap::update_my_position(float lat, float lon, int32_t altitude) {
|
||||||
|
my_lat = lat;
|
||||||
|
my_lon = lon;
|
||||||
|
my_altitude = altitude;
|
||||||
|
markerListUpdated = true;
|
||||||
|
set_dirty();
|
||||||
|
}
|
||||||
|
void GeoMap::update_my_orientation(uint16_t angle) {
|
||||||
|
my_angle = angle;
|
||||||
|
}
|
||||||
|
|
||||||
void GeoMapView::focus() {
|
void GeoMapView::focus() {
|
||||||
geopos.focus();
|
geopos.focus();
|
||||||
|
|
||||||
@ -480,6 +527,13 @@ void GeoMapView::focus() {
|
|||||||
nav_.display_modal("No map", "No world_map.bin file in\n/ADSB/ directory", ABORT);
|
nav_.display_modal("No map", "No world_map.bin file in\n/ADSB/ directory", ABORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GeoMapView::update_my_position(float lat, float lon, int32_t altitude) {
|
||||||
|
geomap.update_my_position(lat, lon, altitude);
|
||||||
|
}
|
||||||
|
void GeoMapView::update_my_orientation(uint16_t angle) {
|
||||||
|
geomap.update_my_orientation(angle);
|
||||||
|
}
|
||||||
|
|
||||||
void GeoMapView::update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed) {
|
void GeoMapView::update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed) {
|
||||||
if (geomap.manual_panning()) {
|
if (geomap.manual_panning()) {
|
||||||
geomap.set_dirty();
|
geomap.set_dirty();
|
||||||
|
@ -185,6 +185,9 @@ class GeoMap : public Widget {
|
|||||||
bool on_encoder(const EncoderEvent delta) override;
|
bool on_encoder(const EncoderEvent delta) override;
|
||||||
bool on_keyboard(const KeyboardEvent event) override;
|
bool on_keyboard(const KeyboardEvent event) override;
|
||||||
|
|
||||||
|
void update_my_position(float lat, float lon, int32_t altitude);
|
||||||
|
void update_my_orientation(uint16_t angle);
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
void set_mode(GeoMapMode mode);
|
void set_mode(GeoMapMode mode);
|
||||||
void set_manual_panning(bool v);
|
void set_manual_panning(bool v);
|
||||||
@ -212,6 +215,7 @@ class GeoMap : public Widget {
|
|||||||
void draw_bearing(const Point origin, const uint16_t angle, uint32_t size, const Color color);
|
void draw_bearing(const Point origin, const uint16_t angle, uint32_t size, const Color color);
|
||||||
void draw_marker(Painter& painter, const ui::Point itemPoint, const uint16_t itemAngle, const std::string itemTag, const Color color = Color::red(), const Color fontColor = Color::white(), const Color backColor = Color::black());
|
void draw_marker(Painter& painter, const ui::Point itemPoint, const uint16_t itemAngle, const std::string itemTag, const Color color = Color::red(), const Color fontColor = Color::white(), const Color backColor = Color::black());
|
||||||
void draw_markers(Painter& painter);
|
void draw_markers(Painter& painter);
|
||||||
|
void draw_mypos();
|
||||||
void map_read_line(ui::Color* buffer, uint16_t pixels);
|
void map_read_line(ui::Color* buffer, uint16_t pixels);
|
||||||
|
|
||||||
bool manual_panning_{false};
|
bool manual_panning_{false};
|
||||||
@ -233,6 +237,12 @@ class GeoMap : public Widget {
|
|||||||
uint16_t angle_{};
|
uint16_t angle_{};
|
||||||
std::string tag_{};
|
std::string tag_{};
|
||||||
|
|
||||||
|
// the portapack's position data ( for example injected from serial )
|
||||||
|
float my_lat{200};
|
||||||
|
float my_lon{200};
|
||||||
|
int32_t my_altitude{0};
|
||||||
|
uint16_t my_angle{400};
|
||||||
|
|
||||||
int markerListLen{0};
|
int markerListLen{0};
|
||||||
GeoMarker markerList[NumMarkerListElements];
|
GeoMarker markerList[NumMarkerListElements];
|
||||||
bool markerListUpdated{false};
|
bool markerListUpdated{false};
|
||||||
@ -267,6 +277,8 @@ class GeoMapView : public View {
|
|||||||
void focus() override;
|
void focus() override;
|
||||||
|
|
||||||
void update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed = 0);
|
void update_position(float lat, float lon, uint16_t angle, int32_t altitude, int32_t speed = 0);
|
||||||
|
void update_my_position(float lat, float lon, int32_t altitude);
|
||||||
|
void update_my_orientation(uint16_t angle);
|
||||||
|
|
||||||
std::string title() const override { return "Map view"; };
|
std::string title() const override { return "Map view"; };
|
||||||
|
|
||||||
|
@ -877,6 +877,35 @@ static void cmd_cpld_read(BaseSequentialStream* chp, int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cmd_gotgps(BaseSequentialStream* chp, int argc, char* argv[]) {
|
||||||
|
const char* usage = "usage: gotgps <lat> <lon> [altitude] [speed]\r\n";
|
||||||
|
if (argc < 2 || argc > 4) {
|
||||||
|
chprintf(chp, usage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
float lat = atof(argv[0]);
|
||||||
|
float lon = atof(argv[1]);
|
||||||
|
int32_t altitude = 0;
|
||||||
|
int32_t speed = 0;
|
||||||
|
if (argc >= 3) altitude = strtol(argv[2], NULL, 10);
|
||||||
|
if (argc >= 4) speed = strtol(argv[3], NULL, 10);
|
||||||
|
GPSPosDataMessage msg{lat, lon, altitude, speed};
|
||||||
|
EventDispatcher::send_message(msg);
|
||||||
|
chprintf(chp, "ok\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cmd_gotorientation(BaseSequentialStream* chp, int argc, char* argv[]) {
|
||||||
|
const char* usage = "usage: gotorientation <angle>\r\n";
|
||||||
|
if (argc != 1) {
|
||||||
|
chprintf(chp, usage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint16_t angle = strtol(argv[0], NULL, 10);
|
||||||
|
OrientationDataMessage msg{angle};
|
||||||
|
EventDispatcher::send_message(msg);
|
||||||
|
chprintf(chp, "ok\r\n");
|
||||||
|
}
|
||||||
|
|
||||||
static const ShellCommand commands[] = {
|
static const ShellCommand commands[] = {
|
||||||
{"reboot", cmd_reboot},
|
{"reboot", cmd_reboot},
|
||||||
{"dfu", cmd_dfu},
|
{"dfu", cmd_dfu},
|
||||||
@ -900,6 +929,8 @@ static const ShellCommand commands[] = {
|
|||||||
{"accessibility_readcurr", cmd_accessibility_readcurr},
|
{"accessibility_readcurr", cmd_accessibility_readcurr},
|
||||||
{"applist", cmd_applist},
|
{"applist", cmd_applist},
|
||||||
{"appstart", cmd_appstart},
|
{"appstart", cmd_appstart},
|
||||||
|
{"gotgps", cmd_gotgps},
|
||||||
|
{"gotorientation", cmd_gotorientation},
|
||||||
{NULL, NULL}};
|
{NULL, NULL}};
|
||||||
|
|
||||||
static const ShellConfig shell_cfg1 = {
|
static const ShellConfig shell_cfg1 = {
|
||||||
|
@ -118,6 +118,8 @@ class Message {
|
|||||||
SubGhzFPRxConfigure = 60,
|
SubGhzFPRxConfigure = 60,
|
||||||
WeatherData = 61,
|
WeatherData = 61,
|
||||||
SubGhzDData = 62,
|
SubGhzDData = 62,
|
||||||
|
GPSPosData = 63,
|
||||||
|
OrientationData = 64,
|
||||||
MAX
|
MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1301,4 +1303,33 @@ class SubGhzDDataMessage : public Message {
|
|||||||
uint64_t data = 0;
|
uint64_t data = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GPSPosDataMessage : public Message {
|
||||||
|
public:
|
||||||
|
constexpr GPSPosDataMessage(
|
||||||
|
float lat = 200.0,
|
||||||
|
float lon = 200.0,
|
||||||
|
int32_t altitude = 0,
|
||||||
|
int32_t speed = 0)
|
||||||
|
: Message{ID::GPSPosData},
|
||||||
|
lat{lat},
|
||||||
|
lon{lon},
|
||||||
|
altitude{altitude},
|
||||||
|
speed{speed} {
|
||||||
|
}
|
||||||
|
float lat = 200.0;
|
||||||
|
float lon = 200.0;
|
||||||
|
int32_t altitude = 0;
|
||||||
|
int32_t speed = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class OrientationDataMessage : public Message {
|
||||||
|
public:
|
||||||
|
constexpr OrientationDataMessage(
|
||||||
|
uint16_t angle = 400)
|
||||||
|
: Message{ID::OrientationData},
|
||||||
|
angle{angle} {
|
||||||
|
}
|
||||||
|
uint16_t angle = 400; //>360 -> no orientation set
|
||||||
|
};
|
||||||
|
|
||||||
#endif /*__MESSAGE_H__*/
|
#endif /*__MESSAGE_H__*/
|
||||||
|
Loading…
Reference in New Issue
Block a user