2020-06-19 05:03:38 +02:00
|
|
|
// viz1090, a vizualizer for dump1090 ADSB output
|
|
|
|
//
|
|
|
|
// Copyright (C) 2020, Nathan Matsuda <info@nathanmatsuda.com>
|
|
|
|
// Copyright (C) 2014, Malcolm Robb <Support@ATTAvionics.com>
|
|
|
|
// Copyright (C) 2012, Salvatore Sanfilippo <antirez at gmail dot com>
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are
|
|
|
|
// met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer.
|
|
|
|
//
|
|
|
|
// * Redistributions in binary form must reproduce the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
|
|
// documentation and/or other materials provided with the distribution.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
#include "Input.h"
|
|
|
|
|
2020-06-15 00:26:26 +02:00
|
|
|
static std::chrono::high_resolution_clock::time_point now() {
|
|
|
|
return std::chrono::high_resolution_clock::now();
|
2020-06-12 06:55:04 +02:00
|
|
|
}
|
|
|
|
|
2020-06-15 00:26:26 +02:00
|
|
|
// static uint64_t now() {
|
|
|
|
// return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch).count();
|
|
|
|
// }
|
|
|
|
|
|
|
|
static uint64_t elapsed(std::chrono::high_resolution_clock::time_point ref) {
|
|
|
|
return std::chrono::duration_cast<std::chrono::milliseconds>(now() - ref).count();
|
2020-02-17 06:54:46 +01:00
|
|
|
}
|
|
|
|
|
2020-03-12 20:46:26 +01:00
|
|
|
template <typename T> int sgn(T val) {
|
|
|
|
return (T(0) < val) - (val < T(0));
|
|
|
|
}
|
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
void Input::getInput()
|
2017-09-14 05:21:36 +02:00
|
|
|
{
|
|
|
|
SDL_Event event;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2017-09-14 05:21:36 +02:00
|
|
|
while (SDL_PollEvent(&event))
|
|
|
|
{
|
|
|
|
switch (event.type)
|
|
|
|
{
|
|
|
|
case SDL_QUIT:
|
|
|
|
exit(0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SDL_KEYDOWN:
|
|
|
|
switch (event.key.keysym.sym)
|
|
|
|
{
|
|
|
|
case SDLK_ESCAPE:
|
|
|
|
exit(0);
|
|
|
|
break;
|
2017-09-16 04:25:26 +02:00
|
|
|
|
2017-09-14 05:21:36 +02:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2019-09-08 01:11:20 +02:00
|
|
|
|
2017-09-14 05:21:36 +02:00
|
|
|
break;
|
2019-09-08 01:11:20 +02:00
|
|
|
|
|
|
|
case SDL_MOUSEWHEEL:
|
2020-03-19 06:22:59 +01:00
|
|
|
view->maxDist *= 1.0 + 0.5 * sgn(event.wheel.y);
|
|
|
|
if(view->maxDist < 0.001f) {
|
|
|
|
view->maxDist = 0.001f;
|
2020-03-12 20:46:26 +01:00
|
|
|
}
|
|
|
|
|
2020-03-19 06:22:59 +01:00
|
|
|
view->mapTargetMaxDist = 0;
|
|
|
|
view->mapMoved = 1;
|
2019-09-08 01:11:20 +02:00
|
|
|
break;
|
2019-09-08 08:09:14 +02:00
|
|
|
|
|
|
|
case SDL_MULTIGESTURE:
|
2020-03-19 06:22:59 +01:00
|
|
|
view->maxDist /=1.0 + 4.0*event.mgesture.dDist;
|
|
|
|
view->mapTargetMaxDist = 0;
|
|
|
|
view->mapMoved = 1;
|
2020-03-19 06:38:00 +01:00
|
|
|
|
2020-06-12 06:55:04 +02:00
|
|
|
if(elapsed(touchDownTime) > 100) {
|
2020-06-15 00:26:26 +02:00
|
|
|
//touchDownTime = 0;
|
2020-03-19 06:38:00 +01:00
|
|
|
}
|
2019-09-08 08:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2020-03-22 04:30:23 +01:00
|
|
|
case SDL_FINGERMOTION:;
|
2020-06-12 06:55:04 +02:00
|
|
|
if(elapsed(touchDownTime) > 150) {
|
2020-03-22 04:30:23 +01:00
|
|
|
tapCount = 0;
|
2020-06-15 00:26:26 +02:00
|
|
|
//touchDownTime = 0;
|
2020-03-22 04:30:23 +01:00
|
|
|
}
|
2020-03-19 06:22:59 +01:00
|
|
|
view->moveCenterRelative( view->screen_width * event.tfinger.dx, view->screen_height * event.tfinger.dy);
|
2020-03-12 06:07:57 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case SDL_FINGERDOWN:
|
2020-06-12 06:55:04 +02:00
|
|
|
if(elapsed(touchDownTime) > 500) {
|
2020-03-19 06:22:59 +01:00
|
|
|
tapCount = 0;
|
2020-03-22 04:30:23 +01:00
|
|
|
}
|
|
|
|
|
2020-06-12 06:55:04 +02:00
|
|
|
|
|
|
|
//this finger number is always 1 for down and 0 for up an rpi+hyperpixel??
|
2020-06-12 07:55:59 +02:00
|
|
|
if(SDL_GetNumTouchFingers(event.tfinger.touchId) <= 1) {
|
2020-06-12 06:55:04 +02:00
|
|
|
touchDownTime = now();
|
2020-03-07 00:44:45 +01:00
|
|
|
}
|
2020-02-17 06:54:46 +01:00
|
|
|
break;
|
|
|
|
|
2020-03-12 06:07:57 +01:00
|
|
|
case SDL_FINGERUP:
|
2020-06-12 06:55:04 +02:00
|
|
|
if(elapsed(touchDownTime) < 150 && SDL_GetNumTouchFingers(event.tfinger.touchId) == 0) {
|
2020-03-19 06:22:59 +01:00
|
|
|
touchx = view->screen_width * event.tfinger.x;
|
|
|
|
touchy = view->screen_height * event.tfinger.y;
|
|
|
|
tapCount++;
|
|
|
|
view->registerClick(tapCount, touchx, touchy);
|
2020-03-12 06:07:57 +01:00
|
|
|
} else {
|
2020-03-19 06:22:59 +01:00
|
|
|
touchx = 0;
|
|
|
|
touchy = 0;
|
|
|
|
tapCount = 0;
|
2020-03-12 06:07:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
|
|
if(event.button.which != SDL_TOUCH_MOUSEID) {
|
2020-06-12 06:55:04 +02:00
|
|
|
if(elapsed(touchDownTime) > 500) {
|
2020-03-19 06:22:59 +01:00
|
|
|
tapCount = 0;
|
2020-03-12 06:07:57 +01:00
|
|
|
}
|
2020-06-12 06:55:04 +02:00
|
|
|
touchDownTime = now();
|
2020-03-12 06:07:57 +01:00
|
|
|
}
|
|
|
|
break;
|
2020-03-07 00:44:45 +01:00
|
|
|
|
2020-03-12 06:07:57 +01:00
|
|
|
case SDL_MOUSEBUTTONUP:;
|
|
|
|
if(event.button.which != SDL_TOUCH_MOUSEID) {
|
2020-03-19 06:22:59 +01:00
|
|
|
touchx = event.motion.x;
|
|
|
|
touchy = event.motion.y;
|
|
|
|
tapCount = event.button.clicks;
|
2020-03-07 05:51:47 +01:00
|
|
|
|
2020-03-19 06:22:59 +01:00
|
|
|
view->registerClick(tapCount, touchx, touchy);
|
2020-03-12 06:07:57 +01:00
|
|
|
}
|
2020-03-06 00:02:40 +01:00
|
|
|
break;
|
2020-03-07 00:44:45 +01:00
|
|
|
|
2020-03-06 00:02:40 +01:00
|
|
|
case SDL_MOUSEMOTION:;
|
2020-03-12 06:07:57 +01:00
|
|
|
|
|
|
|
if(event.motion.which != SDL_TOUCH_MOUSEID) {
|
2020-03-19 06:22:59 +01:00
|
|
|
view->registerMouseMove(event.motion.x, event.motion.y);
|
2020-03-12 06:07:57 +01:00
|
|
|
|
|
|
|
if (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_LEFT)) {
|
|
|
|
view->moveCenterRelative(event.motion.xrel, event.motion.yrel);
|
|
|
|
}
|
2020-03-06 00:02:40 +01:00
|
|
|
}
|
|
|
|
break;
|
2017-09-14 05:21:36 +02:00
|
|
|
}
|
|
|
|
}
|
2017-09-05 11:41:46 +02:00
|
|
|
}
|
2020-03-08 02:22:20 +01:00
|
|
|
|
2020-03-19 06:22:59 +01:00
|
|
|
Input::Input(AppData *appData, View *view) {
|
2020-03-08 02:22:20 +01:00
|
|
|
this->view = view;
|
2020-03-19 06:22:59 +01:00
|
|
|
this->appData = appData;
|
2020-03-08 02:22:20 +01:00
|
|
|
}
|
2020-03-19 06:22:59 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|