halx_driver
読み取り中…
検索中…
一致する文字列を見つけられません
ps3.hpp
[詳解]
1#pragma once
2
3#include <array>
4#include <cstddef>
5#include <cstdint>
6#include <utility>
7
8#include <halx/peripheral/uart.hpp>
9
10namespace halx::driver {
11
18
35
36class Ps3 {
37public:
38 Ps3(peripheral::UartBase &uart) : uart_{uart} {}
39
40 void update() {
41 keys_prev_ = keys_;
42
43 while (receive_message()) {
44 if (test_checksum(buf_)) {
45 keys_ = (buf_[1] << 8) | buf_[2];
46 if ((keys_ & 0x03) == 0x03) {
47 keys_ &= ~0x03;
48 keys_ |= 1 << 13;
49 }
50 if ((keys_ & 0x0C) == 0x0C) {
51 keys_ &= ~0x0C;
52 keys_ |= 1 << 14;
53 }
54 for (size_t i = 0; i < 4; ++i) {
55 axes_[i] = (static_cast<float>(buf_[i + 3]) - 64) / 64;
56 }
57 }
58 buf_.fill(0);
59 }
60 }
61
62 float get_axis(Ps3Axis axis) { return axes_[std::to_underlying(axis)]; }
63
64 bool get_key(Ps3Key key) {
65 return (keys_ & (1 << std::to_underlying(key))) != 0;
66 }
67
68 bool get_key_down(Ps3Key key) {
69 return ((keys_ ^ keys_prev_) & keys_ & (1 << std::to_underlying(key))) != 0;
70 }
71
72 bool get_key_up(Ps3Key key) {
73 return ((keys_ ^ keys_prev_) & keys_prev_ &
74 (1 << std::to_underlying(key))) != 0;
75 }
76
77private:
78 peripheral::UartBase &uart_;
79 std::array<uint8_t, 8> buf_{};
80 std::array<float, 4> axes_{};
81 uint16_t keys_ = 0;
82 uint16_t keys_prev_ = 0;
83
84 bool receive_message() {
85 // ヘッダ探す
86 for (size_t i = 0; i < 8; ++i) {
87 if (buf_[0] == 0x80) {
88 break;
89 }
90 if (!uart_.receive(&buf_[0], 1, 0)) {
91 return false;
92 }
93 }
94 if (buf_[0] != 0x80) {
95 return false;
96 }
97
98 // メッセージの残りの部分を受信
99 if (!uart_.receive(&buf_[1], 7, 0)) {
100 return false;
101 }
102 return true;
103 }
104
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) {
108 checksum += msg[i];
109 }
110 return (checksum & 0x7F) == msg[7];
111 }
112};
113
114} // namespace halx::driver
void update()
Definition ps3.hpp:40
bool get_key_down(Ps3Key key)
Definition ps3.hpp:68
float get_axis(Ps3Axis axis)
Definition ps3.hpp:62
bool get_key_up(Ps3Key key)
Definition ps3.hpp:72
bool get_key(Ps3Key key)
Definition ps3.hpp:64
Ps3(peripheral::UartBase &uart)
Definition ps3.hpp:38
Definition amt21.hpp:10
Ps3Axis
Definition ps3.hpp:12
@ RIGHT_Y
Definition ps3.hpp:16
@ LEFT_Y
Definition ps3.hpp:14
@ LEFT_X
Definition ps3.hpp:13
@ RIGHT_X
Definition ps3.hpp:15
Ps3Key
Definition ps3.hpp:19
@ CROSS
Definition ps3.hpp:25
@ CIRCLE
Definition ps3.hpp:26
@ SQUARE
Definition ps3.hpp:27
@ RIGHT
Definition ps3.hpp:22
@ SELECT
Definition ps3.hpp:33
@ LEFT
Definition ps3.hpp:23
@ L2
Definition ps3.hpp:29
@ R2
Definition ps3.hpp:31
@ TRIANGLE
Definition ps3.hpp:24
@ L1
Definition ps3.hpp:28
@ START
Definition ps3.hpp:32
@ DOWN
Definition ps3.hpp:21
@ R1
Definition ps3.hpp:30
@ UP
Definition ps3.hpp:20