Touch events & rotary events to host
This commit is contained in:
parent
f9f1244807
commit
ee632664e6
|
@ -10,8 +10,9 @@ MAGIC_TOKEN_FW_TO_HOST = 0x10c65631
|
||||||
|
|
||||||
class MessageFwToHost(Enum):
|
class MessageFwToHost(Enum):
|
||||||
RFID_TOKEN_READ = 0
|
RFID_TOKEN_READ = 0
|
||||||
BUTTON_NORMAL_PRESS = 1
|
ROTARY_ENCODER = 1
|
||||||
ROTARY_ENCODER = 2
|
TOUCH_BUTTON_PRESS = 2
|
||||||
|
TOUCH_BUTTON_RELEASE = 3
|
||||||
|
|
||||||
|
|
||||||
class MessageHostToFw(Enum):
|
class MessageHostToFw(Enum):
|
||||||
|
@ -21,6 +22,13 @@ class MessageHostToFw(Enum):
|
||||||
LED_WHEEL_EFFECT_RANDOM_TWO_COLOR_INTERPOLATION = 3
|
LED_WHEEL_EFFECT_RANDOM_TWO_COLOR_INTERPOLATION = 3
|
||||||
|
|
||||||
|
|
||||||
|
class TouchButton(Enum):
|
||||||
|
LEFT_FOOT = 0
|
||||||
|
RIGHT_FOOT = 1
|
||||||
|
LEFT_EAR = 2
|
||||||
|
RIGHT_EAR = 3
|
||||||
|
|
||||||
|
|
||||||
outgoing_msg_map = {
|
outgoing_msg_map = {
|
||||||
EffectStaticConfig: 0,
|
EffectStaticConfig: 0,
|
||||||
EffectAlexaSwipeConfig: 1,
|
EffectAlexaSwipeConfig: 1,
|
||||||
|
@ -38,7 +46,38 @@ class RfidTokenRead:
|
||||||
return "RFID Token (" + " ".join(f"{v:02x}" for v in self.id) + ")"
|
return "RFID Token (" + " ".join(f"{v:02x}" for v in self.id) + ")"
|
||||||
|
|
||||||
|
|
||||||
incomingMsgMap = {0: RfidTokenRead}
|
class RotaryEncoderEvent:
|
||||||
|
def __init__(self, msg_content: bytes):
|
||||||
|
self.position, self.direction = struct.unpack("<iB", msg_content)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return f"Rotary event: pos {self.position}, dir {self.direction}"
|
||||||
|
|
||||||
|
|
||||||
|
class TouchButtonPress:
|
||||||
|
def __init__(self, msg_content: bytes):
|
||||||
|
val = int(msg_content[0])
|
||||||
|
self.touch_button = TouchButton(val)
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return "Pressed " + repr(self.touch_button)
|
||||||
|
|
||||||
|
|
||||||
|
class TouchButtonRelease:
|
||||||
|
def __init__(self, msg_content: bytes):
|
||||||
|
val = int(msg_content[0])
|
||||||
|
self.touch_button = TouchButton(val)
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return "Released " + repr(self.touch_button)
|
||||||
|
|
||||||
|
|
||||||
|
incomingMsgMap = {
|
||||||
|
0: RfidTokenRead,
|
||||||
|
1: RotaryEncoderEvent,
|
||||||
|
2: TouchButtonPress,
|
||||||
|
3: TouchButtonRelease,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class MusicMouseProtocol(asyncio.Protocol):
|
class MusicMouseProtocol(asyncio.Protocol):
|
||||||
|
|
|
@ -44,9 +44,11 @@ class ColorHSV:
|
||||||
@dataclass
|
@dataclass
|
||||||
class EffectStaticConfig:
|
class EffectStaticConfig:
|
||||||
color: ColorRGBW
|
color: ColorRGBW
|
||||||
|
begin: int = 0
|
||||||
|
end: int = 0
|
||||||
|
|
||||||
def as_bytes(self) -> bytes:
|
def as_bytes(self) -> bytes:
|
||||||
return self.color.as_bytes()
|
return self.color.as_bytes() + struct.pack("<HH", self.begin, self.end)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
@ -13,30 +13,59 @@ MUSIC_FOLDER = "/home/martin/code/musicmouse/espmusicmouse/host_driver/music"
|
||||||
audio_player = AudioPlayer()
|
audio_player = AudioPlayer()
|
||||||
|
|
||||||
rfid_token_map = {
|
rfid_token_map = {
|
||||||
bytes.fromhex("0000000000"): "None",
|
|
||||||
bytes.fromhex("88041174e9"): "elefant",
|
bytes.fromhex("88041174e9"): "elefant",
|
||||||
bytes.fromhex("8804ce7230"): "fuchs",
|
bytes.fromhex("8804ce7230"): "fuchs",
|
||||||
bytes.fromhex("88040d71f0"): "eule",
|
bytes.fromhex("88040d71f0"): "eule",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
playlists = {
|
||||||
|
fig: audio_player.create_playlist(glob(os.path.join(MUSIC_FOLDER, fig, "*.mp3")))
|
||||||
|
for fig in rfid_token_map.values()
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse_leds = {
|
||||||
|
'right_foot': (0, 6),
|
||||||
|
'left_foot': (6, 6 + 6),
|
||||||
|
'left_ear': (6 + 6, 6 + 6 + 16),
|
||||||
|
'right_ear': (6 + 6 + 16, 6 + 6 + 16 + 17),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def set_mouse_leds(protocol, position: str, color: ColorRGBW):
|
||||||
|
start, end = mouse_leds[position]
|
||||||
|
protocol.send_message(EffectStaticConfig(color, start, end))
|
||||||
|
|
||||||
|
|
||||||
|
def on_music_end_callback(protocol):
|
||||||
|
eff = EffectAlexaSwipeConfig()
|
||||||
|
eff.forward = False
|
||||||
|
protocol.send_message(eff)
|
||||||
|
|
||||||
|
|
||||||
def on_firmware_msg(protocol, message):
|
def on_firmware_msg(protocol, message):
|
||||||
print("Got message", message)
|
print("Got message", message)
|
||||||
if isinstance(message, RfidTokenRead) and message.id in rfid_token_map:
|
if isinstance(message, RfidTokenRead) and message.id == bytes.fromhex("0000000000"):
|
||||||
if rfid_token_map[message.id] == "None":
|
if audio_player.is_playing():
|
||||||
eff = EffectAlexaSwipeConfig()
|
eff = EffectAlexaSwipeConfig()
|
||||||
eff.forward = False
|
eff.forward = False
|
||||||
print("Nothing")
|
|
||||||
protocol.send_message(eff)
|
|
||||||
audio_player.pause()
|
|
||||||
else:
|
else:
|
||||||
eff = EffectSwipeAndChange()
|
eff = EffectStaticConfig(ColorRGBW(0, 0, 0, 0))
|
||||||
eff.swipe.primary_color = ColorRGBW(1, 1, 0, 0)
|
protocol.send_message(eff)
|
||||||
protocol.send_message(eff)
|
audio_player.pause()
|
||||||
figure = rfid_token_map[message.id]
|
if isinstance(message, RfidTokenRead) and message.id in rfid_token_map:
|
||||||
glob_result = glob(os.path.join(MUSIC_FOLDER, figure, "*.mp3"))
|
eff = EffectSwipeAndChange()
|
||||||
audio_player.set_file(glob_result[0])
|
eff.swipe.primary_color = ColorRGBW(1, 1, 0, 0)
|
||||||
audio_player.play()
|
figure = rfid_token_map[message.id]
|
||||||
|
|
||||||
|
if figure == "eule":
|
||||||
|
eff.swipe.primary_color = ColorRGBW(0.96, 0.7, 0, 0)
|
||||||
|
eff.swipe.secondary_color = ColorRGBW(0.96, 0.7, 0, 0)
|
||||||
|
eff.swipe.swipe_speed = 180
|
||||||
|
eff.swipe.bell_curve_width_in_leds = 6
|
||||||
|
|
||||||
|
protocol.send_message(eff)
|
||||||
|
audio_player.set_playlist(playlists[figure])
|
||||||
|
audio_player.play_from_start()
|
||||||
|
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
|
@ -46,5 +75,8 @@ coro = serial_asyncio.create_serial_connection(loop,
|
||||||
baudrate=115200)
|
baudrate=115200)
|
||||||
transport, protocol = loop.run_until_complete(coro)
|
transport, protocol = loop.run_until_complete(coro)
|
||||||
protocol.register_message_callback(on_firmware_msg)
|
protocol.register_message_callback(on_firmware_msg)
|
||||||
|
|
||||||
|
audio_player.on_playlist_end_callback = lambda: on_music_end_callback(protocol)
|
||||||
|
|
||||||
loop.run_forever()
|
loop.run_forever()
|
||||||
loop.close()
|
loop.close()
|
|
@ -1,17 +1,115 @@
|
||||||
import vlc
|
import vlc
|
||||||
|
|
||||||
|
all_events = (
|
||||||
|
vlc.EventType.MediaDiscovererEnded,
|
||||||
|
vlc.EventType.MediaDiscovererStarted,
|
||||||
|
vlc.EventType.MediaDurationChanged,
|
||||||
|
vlc.EventType.MediaFreed,
|
||||||
|
vlc.EventType.MediaListEndReached,
|
||||||
|
vlc.EventType.MediaListItemAdded,
|
||||||
|
vlc.EventType.MediaListItemDeleted,
|
||||||
|
vlc.EventType.MediaListPlayerNextItemSet,
|
||||||
|
vlc.EventType.MediaListPlayerPlayed,
|
||||||
|
vlc.EventType.MediaListPlayerStopped,
|
||||||
|
vlc.EventType.MediaListViewItemAdded,
|
||||||
|
vlc.EventType.MediaListViewItemDeleted,
|
||||||
|
vlc.EventType.MediaListViewWillAddItem,
|
||||||
|
vlc.EventType.MediaListViewWillDeleteItem,
|
||||||
|
vlc.EventType.MediaListWillAddItem,
|
||||||
|
vlc.EventType.MediaListWillDeleteItem,
|
||||||
|
vlc.EventType.MediaMetaChanged,
|
||||||
|
vlc.EventType.MediaParsedChanged,
|
||||||
|
vlc.EventType.MediaPlayerAudioDevice,
|
||||||
|
vlc.EventType.MediaPlayerAudioVolume,
|
||||||
|
vlc.EventType.MediaPlayerBackward,
|
||||||
|
vlc.EventType.MediaPlayerBuffering,
|
||||||
|
vlc.EventType.MediaPlayerChapterChanged,
|
||||||
|
vlc.EventType.MediaPlayerCorked,
|
||||||
|
vlc.EventType.MediaPlayerESAdded,
|
||||||
|
vlc.EventType.MediaPlayerESDeleted,
|
||||||
|
vlc.EventType.MediaPlayerESSelected,
|
||||||
|
vlc.EventType.MediaPlayerEncounteredError,
|
||||||
|
vlc.EventType.MediaPlayerEndReached,
|
||||||
|
vlc.EventType.MediaPlayerForward,
|
||||||
|
#vlc.EventType.MediaPlayerLengthChanged,
|
||||||
|
vlc.EventType.MediaPlayerMediaChanged,
|
||||||
|
vlc.EventType.MediaPlayerMuted,
|
||||||
|
vlc.EventType.MediaPlayerNothingSpecial,
|
||||||
|
vlc.EventType.MediaPlayerOpening,
|
||||||
|
vlc.EventType.MediaPlayerPausableChanged,
|
||||||
|
vlc.EventType.MediaPlayerPaused,
|
||||||
|
vlc.EventType.MediaPlayerPlaying,
|
||||||
|
#vlc.EventType.MediaPlayerPositionChanged,
|
||||||
|
vlc.EventType.MediaPlayerScrambledChanged,
|
||||||
|
vlc.EventType.MediaPlayerSeekableChanged,
|
||||||
|
vlc.EventType.MediaPlayerSnapshotTaken,
|
||||||
|
vlc.EventType.MediaPlayerStopped,
|
||||||
|
#vlc.EventType.MediaPlayerTimeChanged,
|
||||||
|
vlc.EventType.MediaPlayerTitleChanged,
|
||||||
|
vlc.EventType.MediaPlayerUncorked,
|
||||||
|
vlc.EventType.MediaPlayerUnmuted,
|
||||||
|
vlc.EventType.MediaPlayerVout,
|
||||||
|
vlc.EventType.MediaStateChanged,
|
||||||
|
vlc.EventType.MediaSubItemAdded,
|
||||||
|
vlc.EventType.MediaSubItemTreeAdded,
|
||||||
|
vlc.EventType.RendererDiscovererItemAdded,
|
||||||
|
vlc.EventType.RendererDiscovererItemDeleted,
|
||||||
|
vlc.EventType.VlmMediaAdded,
|
||||||
|
vlc.EventType.VlmMediaChanged,
|
||||||
|
vlc.EventType.VlmMediaInstanceStarted,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusEnd,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusError,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusInit,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusOpening,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusPause,
|
||||||
|
vlc.EventType.VlmMediaInstanceStatusPlaying,
|
||||||
|
vlc.EventType.VlmMediaInstanceStopped,
|
||||||
|
vlc.EventType.VlmMediaRemoved,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class AudioPlayer:
|
class AudioPlayer:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.instance = vlc.Instance()
|
self.instance = vlc.Instance()
|
||||||
self.mediaplayer = self.instance.media_player_new()
|
self.media_list_player = self.instance.media_list_player_new()
|
||||||
|
self.media_player = self.media_list_player.get_media_player()
|
||||||
|
|
||||||
def set_file(self, filename):
|
evm = self.media_player.event_manager()
|
||||||
media = self.instance.media_new(filename)
|
evm.event_attach(vlc.EventType.MediaPlayerEndReached, self._callback)
|
||||||
self.mediaplayer.set_media(media)
|
|
||||||
|
self.on_playlist_end_callback = None
|
||||||
|
|
||||||
|
def create_playlist(self, files):
|
||||||
|
result = vlc.MediaList()
|
||||||
|
for e in files:
|
||||||
|
result.add_media(self.instance.media_new(e))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def set_playlist(self, media_list):
|
||||||
|
self.media_list_player.set_media_list(media_list)
|
||||||
|
|
||||||
|
def next(self):
|
||||||
|
self.media_list_player.next()
|
||||||
|
|
||||||
|
def previous(self):
|
||||||
|
self.media_list_player.previous()
|
||||||
|
|
||||||
def play(self):
|
def play(self):
|
||||||
self.mediaplayer.play()
|
self.media_list_player.play()
|
||||||
|
|
||||||
|
def play_from_start(self):
|
||||||
|
self.media_list_player.play_item_at_index(0)
|
||||||
|
|
||||||
|
def is_playing(self):
|
||||||
|
return self.media_list_player.is_playing()
|
||||||
|
|
||||||
def pause(self):
|
def pause(self):
|
||||||
self.mediaplayer.pause()
|
self.media_list_player.pause()
|
||||||
|
|
||||||
|
def _callback(self, event, *args, **kwargs):
|
||||||
|
if event.type == vlc.EventType.MediaPlayerEndReached:
|
||||||
|
print("End reached")
|
||||||
|
if self.on_playlist_end_callback:
|
||||||
|
self.on_playlist_end_callback()
|
||||||
|
#print("Callback from VLC", event, args, kwargs)
|
||||||
|
#print(event.meta_type, event.obj, event.type)
|
||||||
|
|
|
@ -5,7 +5,12 @@
|
||||||
|
|
||||||
struct EffectStaticConfig
|
struct EffectStaticConfig
|
||||||
{
|
{
|
||||||
|
EffectStaticConfig(const ColorRGBW &c = ColorRGBW{0, 0, 0, 0}, uint16_t beg = 0, uint16_t en = 0)
|
||||||
|
: color(c), begin(beg), end(en) {}
|
||||||
|
|
||||||
ColorRGBW color;
|
ColorRGBW color;
|
||||||
|
uint16_t begin = 0;
|
||||||
|
uint16_t end = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename TLedStrip>
|
template <typename TLedStrip>
|
||||||
|
@ -22,7 +27,11 @@ public:
|
||||||
|
|
||||||
int operator()()
|
int operator()()
|
||||||
{
|
{
|
||||||
setLedRGBW(ledStrip_, 0, NUM_LEDS, config_.color);
|
if (config_.begin == config_.end)
|
||||||
|
setLedRGBW(ledStrip_, 0, NUM_LEDS, config_.color);
|
||||||
|
else
|
||||||
|
setLedRGBW(ledStrip_, config_.begin, config_.end, config_.color);
|
||||||
|
|
||||||
return 10000; // nothing changing, return some large time to sleep
|
return 10000; // nothing changing, return some large time to sleep
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,21 +18,67 @@ struct ClassToMessageType
|
||||||
enum class MessageFwToHost : uint8_t
|
enum class MessageFwToHost : uint8_t
|
||||||
{
|
{
|
||||||
RFID_TOKEN_READ = 0,
|
RFID_TOKEN_READ = 0,
|
||||||
BUTTON_NORMAL_PRESS = 1,
|
ROTARY_ENCODER = 1,
|
||||||
ROTARY_ENCODER = 2,
|
TOUCH_BUTTON_PRESS = 2,
|
||||||
|
TOUCH_BUTTON_RELEASE = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class TouchButton : uint8_t
|
||||||
|
{
|
||||||
|
LEFT_FOOT = 0,
|
||||||
|
RIGHT_FOOT = 1,
|
||||||
|
LEFT_EAR = 2,
|
||||||
|
RIGHT_EAR = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(push, 1)
|
||||||
struct MsgRfidTokenRead
|
struct MsgRfidTokenRead
|
||||||
{
|
{
|
||||||
uint8_t tagId[5];
|
uint8_t tagId[5];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MsgRotaryEncoder
|
||||||
|
{
|
||||||
|
int32_t position;
|
||||||
|
uint8_t direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MsgTouchButtonPress
|
||||||
|
{
|
||||||
|
TouchButton button;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MsgTouchButtonRelease
|
||||||
|
{
|
||||||
|
TouchButton button;
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct ClassToMessageType<MsgRfidTokenRead>
|
struct ClassToMessageType<MsgRfidTokenRead>
|
||||||
{
|
{
|
||||||
static constexpr auto msgType = MessageFwToHost::RFID_TOKEN_READ;
|
static constexpr auto msgType = MessageFwToHost::RFID_TOKEN_READ;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct ClassToMessageType<MsgRotaryEncoder>
|
||||||
|
{
|
||||||
|
static constexpr auto msgType = MessageFwToHost::ROTARY_ENCODER;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct ClassToMessageType<MsgTouchButtonPress>
|
||||||
|
{
|
||||||
|
static constexpr auto msgType = MessageFwToHost::TOUCH_BUTTON_PRESS;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct ClassToMessageType<MsgTouchButtonRelease>
|
||||||
|
{
|
||||||
|
static constexpr auto msgType = MessageFwToHost::TOUCH_BUTTON_RELEASE;
|
||||||
|
};
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
enum class MessageHostToFw : uint8_t
|
enum class MessageHostToFw : uint8_t
|
||||||
|
|
|
@ -58,6 +58,13 @@ void setupRotaryEncoder()
|
||||||
ESP_ERROR_CHECK(rotary_encoder_set_queue(&info, eventQueueRotaryEncoder));
|
ESP_ERROR_CHECK(rotary_encoder_set_queue(&info, eventQueueRotaryEncoder));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleRotaryEncoder()
|
||||||
|
{
|
||||||
|
rotary_encoder_event_t event = {0};
|
||||||
|
if (xQueueReceive(eventQueueRotaryEncoder, &event, 0) == pdTRUE)
|
||||||
|
sendMessageToHost(MsgRotaryEncoder{event.state.position, (uint8_t)(event.state.direction)});
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------- Buttons ----------------------------------------
|
// -------------------------------------------------- Buttons ----------------------------------------
|
||||||
|
|
||||||
constexpr int BUTTON1_PIN = 25;
|
constexpr int BUTTON1_PIN = 25;
|
||||||
|
@ -79,7 +86,8 @@ void setupButtons()
|
||||||
digitalWrite(BUTTON2_LED_PIN, 1);
|
digitalWrite(BUTTON2_LED_PIN, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------- Led circle ----------------------------------------
|
// -------------------------------------------------- Led circle ------------------------------------------
|
||||||
|
|
||||||
LedStripRGBW<51> ledStripCircle;
|
LedStripRGBW<51> ledStripCircle;
|
||||||
Esp32DriverRGBW ledDriverCircle;
|
Esp32DriverRGBW ledDriverCircle;
|
||||||
LedTask<decltype(ledStripCircle)> ledTaskCircle;
|
LedTask<decltype(ledStripCircle)> ledTaskCircle;
|
||||||
|
@ -88,7 +96,20 @@ void setupLedCircle()
|
||||||
{
|
{
|
||||||
ledDriverCircle.begin(23, 0);
|
ledDriverCircle.begin(23, 0);
|
||||||
ledTaskCircle.begin(ledStripCircle, ledDriverCircle);
|
ledTaskCircle.begin(ledStripCircle, ledDriverCircle);
|
||||||
ledTaskCircle.startEffect(EffectStaticConfig{ColorRGBW{0, 0, 0, 0}});
|
ledTaskCircle.startEffect(EffectStaticConfig(ColorRGBW{0, 0, 0, 0}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------- Mouse Leds -- ----------------------------------------
|
||||||
|
|
||||||
|
LedStripRGBW<12 + 16 + 17> ledStripMouse;
|
||||||
|
Esp32DriverRGBW ledDriverMouse;
|
||||||
|
LedTask<decltype(ledStripMouse)> ledTaskMouse;
|
||||||
|
|
||||||
|
void setupMouseLeds()
|
||||||
|
{
|
||||||
|
ledDriverMouse.begin(16, 1);
|
||||||
|
ledTaskMouse.begin(ledStripMouse, ledDriverMouse);
|
||||||
|
ledTaskMouse.startEffect(EffectStaticConfig{ColorRGBW{0, 0, 0, 0}, 0, 0});
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------------- Touch Buttons ----------------------------------------
|
// -------------------------------------------------- Touch Buttons ----------------------------------------
|
||||||
|
@ -107,10 +128,37 @@ void setupTouchButtons()
|
||||||
touch_pad_filter_start(2);
|
touch_pad_filter_start(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------------
|
void handleTouchInputs()
|
||||||
|
{
|
||||||
|
static bool previousState[4];
|
||||||
|
|
||||||
LedStripRGBW<12 + 16 + 17> ledStripMouse;
|
uint16_t touchLeftEar = 0;
|
||||||
Esp32DriverRGBW ledDriverMouse;
|
uint16_t touchRightEar = 0;
|
||||||
|
uint16_t touchLeftFoot = 0;
|
||||||
|
uint16_t touchRightFoot = 0;
|
||||||
|
|
||||||
|
touch_pad_read(TOUCH_PAD_LEFT_FOOT, &touchLeftFoot);
|
||||||
|
touch_pad_read(TOUCH_PAD_RIGHT_FOOT, &touchRightFoot);
|
||||||
|
touch_pad_read(TOUCH_PAD_LEFT_EAR, &touchLeftEar);
|
||||||
|
touch_pad_read(TOUCH_PAD_RIGHT_EAR, &touchRightEar);
|
||||||
|
|
||||||
|
bool currentState[4];
|
||||||
|
currentState[int(TouchButton::LEFT_FOOT)] = touchLeftFoot < 380;
|
||||||
|
currentState[int(TouchButton::RIGHT_FOOT)] = touchRightFoot < 380;
|
||||||
|
currentState[int(TouchButton::LEFT_EAR)] = touchLeftEar < 430;
|
||||||
|
currentState[int(TouchButton::RIGHT_EAR)] = touchRightEar < 430;
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
if (previousState[i] == false && currentState[i] == true)
|
||||||
|
sendMessageToHost(MsgTouchButtonPress{TouchButton(i)});
|
||||||
|
else if (previousState[i] == true && currentState[i] == false)
|
||||||
|
sendMessageToHost(MsgTouchButtonRelease{TouchButton(i)});
|
||||||
|
previousState[i] = currentState[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
@ -120,61 +168,11 @@ void setup()
|
||||||
setupLedCircle();
|
setupLedCircle();
|
||||||
setupButtons();
|
setupButtons();
|
||||||
setupTouchButtons();
|
setupTouchButtons();
|
||||||
|
|
||||||
ledDriverMouse.begin(16, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleTouchInputs()
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
handleIncomingMessagesFromHost(&ledTaskCircle);
|
handleIncomingMessagesFromHost(&ledTaskCircle);
|
||||||
|
handleTouchInputs();
|
||||||
int btn1 = !digitalRead(BUTTON1_PIN);
|
handleRotaryEncoder();
|
||||||
int btn2 = !digitalRead(BUTTON2_PIN);
|
|
||||||
int rotaryBtn = !digitalRead(ROTARY_PRESS_PIN);
|
|
||||||
|
|
||||||
uint16_t touchLeftEar = 1, touchRightEar = 1, touchLeftFoot = 1, touchRightFoot = 1;
|
|
||||||
|
|
||||||
touch_pad_read(TOUCH_PAD_LEFT_FOOT, &touchLeftFoot);
|
|
||||||
touch_pad_read(TOUCH_PAD_RIGHT_FOOT, &touchRightFoot);
|
|
||||||
touch_pad_read(TOUCH_PAD_LEFT_EAR, &touchLeftEar); // 430
|
|
||||||
touch_pad_read(TOUCH_PAD_RIGHT_EAR, &touchRightEar); // 430
|
|
||||||
|
|
||||||
//Serial.printf("%d, %d, %d | re %d, le %d, rf %d, lf %d\n", btn1, btn2, rotaryBtn, touchRightEar, touchLeftEar, touchRightFoot, touchLeftFoot);
|
|
||||||
|
|
||||||
for (int i = 0; i < ledStripMouse.numLeds(); ++i)
|
|
||||||
ledStripMouse.set(i, 0, 0, 30, 0);
|
|
||||||
|
|
||||||
bool rightFootPressed = touchRightFoot < 380;
|
|
||||||
bool leftFootPressed = touchLeftFoot < 380;
|
|
||||||
bool leftEarPressed = touchLeftEar < 430;
|
|
||||||
bool rightEarPressed = touchRightEar < 430;
|
|
||||||
|
|
||||||
if (btn1 || rightFootPressed)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 6; ++i)
|
|
||||||
ledStripMouse.set(i, 180, 0, 255, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (btn2 || leftFootPressed)
|
|
||||||
{
|
|
||||||
for (int i = 6; i < 12; ++i)
|
|
||||||
ledStripMouse.set(i, 180, 0, 255, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (leftEarPressed)
|
|
||||||
for (int i = 12; i < 12 + 16; ++i)
|
|
||||||
ledStripMouse.set(i, 28, 241, 234, 0);
|
|
||||||
|
|
||||||
if (rightEarPressed)
|
|
||||||
for (int i = 12 + 16; i < ledStripMouse.numLeds(); ++i)
|
|
||||||
ledStripMouse.set(i, 28, 241, 234, 0);
|
|
||||||
|
|
||||||
ledDriverMouse.writeSync(ledStripMouse.rawData(), ledStripMouse.numLeds());
|
|
||||||
delay(50);
|
|
||||||
|
|
||||||
//delay(150);
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue