quack/main/wii.h
2024-08-14 23:19:39 +02:00

99 lines
2.7 KiB
C

/*
* wii.h
* quack
*
* Created by Michel DEPEIGE on 11/08/2024.
* Copyright (c) 2024 Michel DEPEIGE.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the Apache License, Version 2.0 (the "License");
* You may obtain a copy of the License at:
*
* http://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.
*
*/
#ifndef WII_H
#define WII_H
/* prototypes */
uint8_t *wii_generate_pin(esp_bt_pin_code_t pin);
void wii_init(void);
void wii_input(esp_hidh_dev_t *dev, uint16_t id, uint8_t *data, uint16_t length);
bool wii_is_nintendo_bda(esp_bd_addr_t bda);
bool wii_is_wiimote(uint16_t vid, uint16_t pid);
void wii_open(const esp_bd_addr_t bda);
void wii_show_calibration(uint8_t *data);
/* defines */
#define WII_VID 0x057e
#define WII_PID_OLD 0x0306
#define WII_PID_NEW 0x0330
#define WII_PIN_STR "0x%02x%02x%02x%02x%02x%02x"
#define WII_PIN_HEX(pin) pin[0], pin[1], pin[2], pin[3], pin[4], pin[5]
#define WII_THRESHOLD 0.1f
#define WII_ACCELERATION -10.0f /* coonvert gravity to pixels */
#define WII_INTERVAL (1000 / 60) /* pad update interval, about 60 Hz */
#define WII_THROTTLE 20
/* core buttons. LX6 is wrong endian */
#define WII_BUTTON_NONE 0x0000
#define WII_BUTTON_LEFT 0x0001
#define WII_BUTTON_RIGHT 0x0002
#define WII_BUTTON_DOWN 0x0004
#define WII_BUTTON_UP 0x0008
#define WII_BUTTON_PLUS 0x0010
#define WII_BUTTON_TWO 0x0100
#define WII_BUTTON_ONE 0x0200
#define WII_BUTTON_B 0x0400
#define WII_BUTTON_A 0x0800
#define WII_BUTTON_MINUS 0x1000
#define WII_BUTTON_HOME 0x8000
/* LEDs + Rumble */
#define WII_LED1 0x10
#define WII_LED2 0x20
#define WII_LED3 0x40
#define WII_LED4 0x80
/* for quadrature speed feedback */
#define WII_SPEED_NONE 0x00
#define WII_SPEED_LOW WII_LED1
#define WII_SPEED_MEDIUM WII_LED2
#define WII_SPEED_HIGH WII_LED3
/* handled reports */
#define WII_REPORT_RUMBLE 0x10
#define WII_REPORT_LEDS 0x11
#define WII_REPORT_MODE 0x12
#define WII_REPORT_SPEAKER_E 0x14
#define WII_REPORT_REQUEST 0x15
#define WII_REPORT_WRITE_REG 0x16
#define WII_REPORT_READ_REG 0x17
#define WII_REPORT_SPEAKER_D 0x18
#define WII_REPORT_SPEAKER_M 0x19
#define WII_REPORT_STATUS 0x20
#define WII_REPORT_READ_INPUT 0x21
#define WII_REPORT_ACK 0x22
#define WII_REPORT_CORE_ONLY 0x30
#define WII_REPORT_CORE_ACCEL 0x31
#define WII_REPORT_INPUT WII_REPORT_ACK|WII_REPORT_CORE_ONLY
/* structures */
typedef struct wii_accel_s {
uint16_t x;
uint16_t y;
uint16_t z;
} wii_accel_t;
#endif