blob: ea74a5dd5d5b8fea31aa7ce0d23cdb68f4a6a5f3 [file] [log] [blame]
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "pw_touchscreen/buttons.h"
#include <cstdint>
#include "pw_log/log.h"
#include "pw_touchscreen/touchscreen.h"
namespace pw::touchscreen {
namespace {
const char* kPressedText = "pressed";
const char* kReleasedText = "released";
} // namespace
DirectionTouchButtonsThread::DirectionTouchButtonsThread(
DirectionButtonListener& button_listener,
Touchscreen& touchscreen,
int32_t display_width,
int32_t display_height)
: button_listener_(button_listener),
touchscreen_(touchscreen),
up_button_(display_width / 2, display_height / 4, display_width / 4, 0),
down_button_(display_width / 2,
display_height / 4,
display_width / 4,
display_height - display_height / 4),
left_button_(
display_width / 4, display_height / 2, 0, display_height / 4),
right_button_(display_width / 4,
display_height / 2,
display_width - display_width / 4,
display_height / 4) {}
void DirectionTouchButtonsThread::Run() {
while (true) {
// TODO(b/306403638): Make the polling configurable and set it at a low
// rate no higher than the frame rate.
TouchEvent touch_event = touchscreen_.GetTouchPoint();
if (touch_event.type == TouchEventType::Start ||
touch_event.type == TouchEventType::Stop) {
const bool pressed = touch_event.type == TouchEventType::Start;
PW_LOG_DEBUG(
"Touch at: %d, %d", touch_event.point.x, touch_event.point.y);
if (up_button_.contains(touch_event.point.x, touch_event.point.y)) {
PW_LOG_DEBUG("Up button %s", pressed ? kPressedText : kReleasedText);
button_listener_.OnButtonUp(pressed);
} else if (down_button_.contains(touch_event.point.x,
touch_event.point.y)) {
PW_LOG_DEBUG("Down button %s", pressed ? kPressedText : kReleasedText);
button_listener_.OnButtonDown(pressed);
} else if (left_button_.contains(touch_event.point.x,
touch_event.point.y)) {
PW_LOG_DEBUG("Left button %s", pressed ? kPressedText : kReleasedText);
button_listener_.OnButtonLeft(pressed);
} else if (right_button_.contains(touch_event.point.x,
touch_event.point.y)) {
PW_LOG_DEBUG("Right button %s", pressed ? kPressedText : kReleasedText);
button_listener_.OnButtonRight(pressed);
}
}
}
}
} // namespace pw::touchscreen