38 Ps3(peripheral::UartBase &uart) : uart_{uart} {}
43 while (receive_message()) {
44 if (test_checksum(buf_)) {
45 keys_ = (buf_[1] << 8) | buf_[2];
46 if ((keys_ & 0x03) == 0x03) {
50 if ((keys_ & 0x0C) == 0x0C) {
54 for (
size_t i = 0; i < 4; ++i) {
55 axes_[i] = (
static_cast<float>(buf_[i + 3]) - 64) / 64;
65 return (keys_ & (1 << std::to_underlying(key))) != 0;
69 return ((keys_ ^ keys_prev_) & keys_ & (1 << std::to_underlying(key))) != 0;
73 return ((keys_ ^ keys_prev_) & keys_prev_ &
74 (1 << std::to_underlying(key))) != 0;
78 peripheral::UartBase &uart_;
79 std::array<uint8_t, 8> buf_{};
80 std::array<float, 4> axes_{};
82 uint16_t keys_prev_ = 0;
84 bool receive_message() {
86 for (
size_t i = 0; i < 8; ++i) {
87 if (buf_[0] == 0x80) {
90 if (!uart_.receive(&buf_[0], 1, 0)) {
94 if (buf_[0] != 0x80) {
99 if (!uart_.receive(&buf_[1], 7, 0)) {
105 static inline bool test_checksum(
const std::array<uint8_t, 8> &msg) {
106 uint8_t checksum = 0;
107 for (
size_t i = 1; i < 7; ++i) {
110 return (checksum & 0x7F) == msg[7];