10#if defined(__cplusplus) && __cplusplus >= 201703L && defined(__has_include)
13#if !__has_include("NimBLEDevice.h")
14#error "NimBLEDevice.h not found. CodexPad requires the NimBLE-Arduino library."
15#error "Please install the latest version of NimBLE-Arduino via Arduino Library Manager or PlatformIO's lib_deps."
17#error "未找到 NimBLEDevice.h 文件。CodexPad 依赖于 NimBLE-Arduino 库。"
18#error "请通过 Arduino 库管理器或 PlatformIO 的 lib_deps 安装最新版本的 NimBLE-Arduino 库。"
27#warning "CodexPad depends on NimBLE-Arduino. Ensure 'NimBLEDevice.h' is in your include path."
28#warning "If you encounter errors about missing 'NimBLEDevice.h', please install the latest NimBLE-Arduino library."
30#warning "CodexPad 依赖于 NimBLE-Arduino 库。请确保 'NimBLEDevice.h' 在您的头文件包含路径中。"
31#warning "如果遇到找不到 'NimBLEDevice.h' 的错误,请安装最新版本的 NimBLE-Arduino 库。"
34#include "NimBLEDevice.h"
444#if __cplusplus < 201402L
445 static constexpr uint32_t ButtonMask() {
return 0; }
492 template <
typename FirstButton,
typename... RestButtons>
493 static constexpr uint32_t
ButtonMask(FirstButton first, RestButtons... rest) {
494 return static_cast<uint32_t
>(first) | ButtonMask(rest...);
543 template <
typename...
Button>
544 static constexpr uint32_t ButtonMask(
Button... button) {
545 return (
static_cast<uint32_t
>(button) | ... | uint32_t{0});
596 bool Connect(
const std::string& bluetooth_device_address,
const uint32_t timeout_ms = 5000);
871 std::array<uint8_t, kAxisValueNum>
axis_values()
const;
906 static constexpr size_t kButtonNum = 32;
907 static constexpr size_t kInputsQueueMax = 10;
908 static constexpr size_t kInputsBytes = 8;
910 uint32_t button_states = 0;
914 static_assert(
sizeof(Inputs) == kInputsBytes);
916 bool Connect(
const NimBLEAddress& address,
bool async_connect,
const uint32_t timeout_ms);
917 void OnNotify(
const NimBLERemoteCharacteristic* remote_characteristic,
const uint8_t* data,
const size_t length,
const bool is_notify);
920 mutable std::mutex mutex_;
921 NimBLEClient* ble_client_ =
nullptr;
922 std::string remote_device_name_;
923 std::string remote_model_number_;
924 std::array<uint8_t, 3> remote_firmware_version_ = {0, 0, 0};
926 Inputs current_inputs_;
927 std::queue<Inputs> inputs_queue_;
const std::array< uint8_t, 3 > remote_firmware_version() const
获取CodexPad的固件版本
uint32_t button_states() const
以位掩码形式获取所有按键的当前状态
const std::string & remote_model_number() const
获取CodexPad的型号
bool ScanAndConnect(const uint32_t button_mask)
扫描附近的 CodexPad 设备,并自动连接到一个按键状态与指定掩码匹配的设备。
bool pressed(const Button button) const
查询按键是否被按下
static constexpr size_t kAxisValueNum
轴值数量
bool Connect(const std::string &bluetooth_device_address, const uint32_t timeout_ms=5000)
连接
const std::string & remote_device_name() const
获取CodexPad的型号
NimBLEClient * ble_client() const
获取 BLE 客户端对象
static constexpr uint32_t ButtonMask(FirstButton first, RestButtons... rest)
将多个按键标识符组合成一个32位的按钮掩码。
uint8_t axis_value(const Axis axis) const
获取轴值
bool HasAxisValueChanged(const Axis axis, const uint8_t threshold) const
查询轴值是否发生变化
static constexpr uint8_t kAxisCenter
轴中心值
bool set_remote_tx_power(const TxPower power)
设置发射功率,连接状态下调用,立即生效于当前连接,下次连接生效
bool is_connected() const
是否连接
bool released(const Button button) const
查询按键是否被释放
std::array< uint8_t, kAxisValueNum > axis_values() const
获取所有模拟轴的当前值
void Update()
更新,需要在Loop中不断调用
bool button_state(const Button button) const
查询按键是否被按下或持续按下
bool holding(const Button button) const
查询按键是否被持续按下