Skip to content

Commit aad88d0

Browse files
committed
Refactor SerialPABotBase connection stuff.
1 parent 4739e4d commit aad88d0

File tree

10 files changed

+253
-153
lines changed

10 files changed

+253
-153
lines changed

SerialPrograms/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,8 @@ file(GLOB MAIN_SOURCES
655655
Source/Controllers/SerialPABotBase/SerialPABotBase_Connection.h
656656
Source/Controllers/SerialPABotBase/SerialPABotBase_Descriptor.cpp
657657
Source/Controllers/SerialPABotBase/SerialPABotBase_Descriptor.h
658+
Source/Controllers/SerialPABotBase/SerialPABotBase_PostConnectActions.cpp
659+
Source/Controllers/SerialPABotBase/SerialPABotBase_PostConnectActions.h
658660
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_ESP32.cpp
659661
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_ESP32.h
660662
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_NS_Generic.cpp

SerialPrograms/SerialPrograms.pro

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ SOURCES += \
326326
Source/Controllers/SerialPABotBase/SerialPABotBase.cpp \
327327
Source/Controllers/SerialPABotBase/SerialPABotBase_Connection.cpp \
328328
Source/Controllers/SerialPABotBase/SerialPABotBase_Descriptor.cpp \
329+
Source/Controllers/SerialPABotBase/SerialPABotBase_PostConnectActions.cpp \
329330
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_ESP32.cpp \
330331
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_NS_Generic.cpp \
331332
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_Protocol.cpp \
@@ -1506,6 +1507,7 @@ HEADERS += \
15061507
Source/Controllers/SerialPABotBase/SerialPABotBase.h \
15071508
Source/Controllers/SerialPABotBase/SerialPABotBase_Connection.h \
15081509
Source/Controllers/SerialPABotBase/SerialPABotBase_Descriptor.h \
1510+
Source/Controllers/SerialPABotBase/SerialPABotBase_PostConnectActions.h \
15091511
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_ESP32.h \
15101512
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_NS_Generic.h \
15111513
Source/Controllers/SerialPABotBase/SerialPABotBase_Routines_Protocol.h \

SerialPrograms/Source/Controllers/ControllerTypeStrings.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ const EnumStringMap<ControllerType> CONTROLLER_TYPE_STRINGS{
2727

2828
const EnumStringMap<ControllerFeature> CONTROLLER_FEATURE_STRINGS{
2929
{ControllerFeature::TickPrecise, "TickPrecise"},
30-
{ControllerFeature::QueryTickSize, "QueryTickSize"},
31-
{ControllerFeature::QueryCommandQueueSize, "QueryCommandQueueSize"},
3230
{ControllerFeature::NintendoSwitch_ProController, "NintendoSwitch_ProController"},
3331
{ControllerFeature::NintendoSwitch_LeftJoycon, "NintendoSwitch_LeftJoycon"},
3432
{ControllerFeature::NintendoSwitch_RightJoycon, "NintendoSwitch_RightJoycon"},

SerialPrograms/Source/Controllers/ControllerTypes.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ enum class ControllerType{
3838
enum class ControllerFeature{
3939
TickPrecise,
4040
TimingFlexibleMilliseconds,
41-
QueryTickSize,
42-
QueryCommandQueueSize,
4341
NintendoSwitch_ProController,
4442
NintendoSwitch_LeftJoycon,
4543
NintendoSwitch_RightJoycon,

SerialPrograms/Source/Controllers/SerialPABotBase/SerialPABotBase.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,39 +89,34 @@ const std::map<
8989
{PABB_PID_PABOTBASE_ArduinoUnoR3, {
9090
{ControllerType::NintendoSwitch_WiredProController, {
9191
ControllerFeature::TickPrecise,
92-
ControllerFeature::QueryCommandQueueSize,
9392
ControllerFeature::NintendoSwitch_ProController,
9493
ControllerFeature::NintendoSwitch_DateSkip,
9594
}},
9695
}},
9796
{PABB_PID_PABOTBASE_ArduinoLeonardo, {
9897
{ControllerType::NintendoSwitch_WiredProController, {
9998
ControllerFeature::TickPrecise,
100-
ControllerFeature::QueryCommandQueueSize,
10199
ControllerFeature::NintendoSwitch_ProController,
102100
ControllerFeature::NintendoSwitch_DateSkip,
103101
}},
104102
}},
105103
{PABB_PID_PABOTBASE_ProMicro, {
106104
{ControllerType::NintendoSwitch_WiredProController, {
107105
ControllerFeature::TickPrecise,
108-
ControllerFeature::QueryCommandQueueSize,
109106
ControllerFeature::NintendoSwitch_ProController,
110107
ControllerFeature::NintendoSwitch_DateSkip,
111108
}},
112109
}},
113110
{PABB_PID_PABOTBASE_Teensy2, {
114111
{ControllerType::NintendoSwitch_WiredProController, {
115112
ControllerFeature::TickPrecise,
116-
ControllerFeature::QueryCommandQueueSize,
117113
ControllerFeature::NintendoSwitch_ProController,
118114
ControllerFeature::NintendoSwitch_DateSkip,
119115
}},
120116
}},
121117
{PABB_PID_PABOTBASE_TeensyPP2, {
122118
{ControllerType::NintendoSwitch_WiredProController, {
123119
ControllerFeature::TickPrecise,
124-
ControllerFeature::QueryCommandQueueSize,
125120
ControllerFeature::NintendoSwitch_ProController,
126121
ControllerFeature::NintendoSwitch_DateSkip,
127122
}},
@@ -132,7 +127,6 @@ const std::map<
132127
{ControllerType::NintendoSwitch_WiredProController, {
133128
ControllerFeature::TickPrecise,
134129
ControllerFeature::TimingFlexibleMilliseconds,
135-
ControllerFeature::QueryCommandQueueSize,
136130
ControllerFeature::NintendoSwitch_ProController,
137131
ControllerFeature::NintendoSwitch_DateSkip,
138132
}},
@@ -143,19 +137,16 @@ const std::map<
143137
{ControllerType::NintendoSwitch_WirelessProController, {
144138
ControllerFeature::TickPrecise,
145139
ControllerFeature::TimingFlexibleMilliseconds,
146-
ControllerFeature::QueryCommandQueueSize,
147140
ControllerFeature::NintendoSwitch_ProController,
148141
}},
149142
{ControllerType::NintendoSwitch_LeftJoycon, {
150143
ControllerFeature::TickPrecise,
151144
ControllerFeature::TimingFlexibleMilliseconds,
152-
ControllerFeature::QueryCommandQueueSize,
153145
ControllerFeature::NintendoSwitch_LeftJoycon,
154146
}},
155147
{ControllerType::NintendoSwitch_RightJoycon, {
156148
ControllerFeature::TickPrecise,
157149
ControllerFeature::TimingFlexibleMilliseconds,
158-
ControllerFeature::QueryCommandQueueSize,
159150
ControllerFeature::NintendoSwitch_RightJoycon,
160151
}},
161152
}},

SerialPrograms/Source/Controllers/SerialPABotBase/SerialPABotBase_Connection.cpp

Lines changed: 86 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
#include "CommonFramework/Options/Environment/ThemeSelectorOption.h"
1717
#include "Controllers/ControllerTypeStrings.h"
1818
#include "Controllers/SerialPABotBase/SerialPABotBase_Routines_Protocol.h"
19-
#include "Controllers/SerialPABotBase/SerialPABotBase_Routines_ESP32.h"
20-
#include "NintendoSwitch/NintendoSwitch_Settings.h"
2119
#include "SerialPABotBase.h"
20+
#include "SerialPABotBase_PostConnectActions.h"
2221
#include "SerialPABotBase_Connection.h"
2322

2423
//#include <iostream>
@@ -104,39 +103,6 @@ SerialPABotBase_Connection::~SerialPABotBase_Connection(){
104103
}
105104

106105

107-
void SerialPABotBase_Connection::update_with_capabilities(const ControllerFeatures& capabilities){
108-
Logger& logger = m_logger;
109-
110-
do{
111-
if (capabilities.contains(ControllerFeature::QueryCommandQueueSize)){
112-
break;
113-
}
114-
115-
// // Program Version
116-
// logger.log("Checking Firmware Version...");
117-
// uint32_t version = program_version(*m_botbase);
118-
// logger.log("Checking Firmware Version... Version = " + std::to_string(version));
119-
120-
// REMOVE: Temporary for migration.
121-
if (m_protocol / 100 == 20210526 && m_version == 2023121900){
122-
break;
123-
}
124-
125-
logger.log("Queue size not supported. Defaulting to size 4.", COLOR_RED);
126-
return;
127-
}while (false);
128-
129-
logger.log("Device supports queue size. Requesting queue size...", COLOR_BLUE);
130-
uint8_t queue_size = device_queue_size(*m_botbase);
131-
132-
// For now we don't need to use that much queue size.
133-
queue_size = std::min<uint8_t>(queue_size, 16);
134-
135-
logger.log("Setting queue size to: " + std::to_string(queue_size), COLOR_BLUE);
136-
m_botbase->set_queue_limit(queue_size);
137-
}
138-
139-
140106

141107
BotBaseController* SerialPABotBase_Connection::botbase(){
142108
BotBaseController* ret = m_botbase.get();
@@ -154,135 +120,119 @@ ControllerModeStatus SerialPABotBase_Connection::controller_mode_status() const{
154120
}
155121

156122

157-
ControllerModeStatus SerialPABotBase_Connection::read_device_specs(
158-
std::optional<ControllerType> change_controller
159-
){
160-
Logger& logger = m_logger;
161-
162-
163-
// Protocol
164-
logger.log("Checking device protocol compatibility...");
165-
m_protocol = protocol_version(*m_botbase);
166-
logger.log("Checking device protocol compatibility... Protocol = " + std::to_string(m_protocol));
167123

124+
const std::map<uint32_t, std::map<ControllerType, ControllerFeatures>>&
125+
SerialPABotBase_Connection::get_programs_for_protocol(uint32_t protocol){
168126
// (protocol_requested / 100) == (protocol_device / 100)
169127
// (protocol_requested % 100) <= (protocol_device / 100)
170-
auto protocol_iter = SUPPORTED_VERSIONS.upper_bound(m_protocol);
171-
if (protocol_iter == SUPPORTED_VERSIONS.begin()){
128+
auto iter = SUPPORTED_VERSIONS.upper_bound(protocol);
129+
if (iter == SUPPORTED_VERSIONS.begin()){
172130
throw SerialProtocolException(
173-
logger, PA_CURRENT_FUNCTION,
174-
"Incompatible protocol. Device: " + std::to_string(m_protocol) + "<br>"
131+
m_logger, PA_CURRENT_FUNCTION,
132+
"Incompatible protocol. Device: " + std::to_string(protocol) + "<br>"
175133
"Please install the firmware that came with this version of the program."
176134
);
177135
}
178-
--protocol_iter;
179-
if (protocol_iter->first < m_protocol / 100 * 100){
136+
--iter;
137+
if (iter->first < protocol / 100 * 100){
180138
throw SerialProtocolException(
181-
logger, PA_CURRENT_FUNCTION,
182-
"Incompatible protocol. Device: " + std::to_string(m_protocol) + "<br>"
139+
m_logger, PA_CURRENT_FUNCTION,
140+
"Incompatible protocol. Device: " + std::to_string(protocol) + "<br>"
183141
"Please install the firmware that came with this version of the program."
184142
);
185143
}
186144

145+
return iter->second;
146+
}
187147

188-
// Program ID
189-
logger.log("Checking Program ID...");
190-
m_program_id = program_id(*m_botbase);
191-
logger.log("Checking Program ID... Program ID = " + std::to_string(m_program_id));
192-
193-
const std::map<uint32_t, std::map<ControllerType, ControllerFeatures>>& PROGRAM_IDS = protocol_iter->second;
194-
auto program_iter = PROGRAM_IDS.find(m_program_id);
195-
if (program_iter == PROGRAM_IDS.end()){
148+
const std::map<ControllerType, ControllerFeatures>&
149+
SerialPABotBase_Connection::get_controllers_for_program(
150+
const std::map<uint32_t, std::map<ControllerType, ControllerFeatures>>& available_programs,
151+
uint32_t program_id
152+
){
153+
auto iter = available_programs.find(program_id);
154+
if (iter == available_programs.end()){
196155
throw SerialProtocolException(
197-
logger, PA_CURRENT_FUNCTION,
198-
"Unrecognized Program ID: " + std::to_string(m_program_id) + "<br>"
156+
m_logger, PA_CURRENT_FUNCTION,
157+
"Unrecognized Program ID: " + std::to_string(program_id) + "<br>"
199158
"Please install the firmware that came with this version of the program."
200159
);
201160
}
161+
return iter->second;
162+
}
202163

203-
logger.log("Checking Firmware Version...");
204-
m_version = program_version(*m_botbase);
205-
logger.log("Checking Firmware Version... Version = " + std::to_string(m_version));
164+
void SerialPABotBase_Connection::process_queue_size(){
165+
m_logger.log("Requesting queue size...");
166+
uint8_t queue_size = device_queue_size(*m_botbase);
167+
m_logger.Logger::log("Requesting queue size... Queue Size = " + std::to_string(queue_size));
206168

207-
// Controller Type
208-
logger.log("Reading Controller Mode...");
169+
// For now we don't need to use that much queue size.
170+
queue_size = std::min<uint8_t>(queue_size, 32);
171+
172+
m_logger.Logger::log("Setting queue size to: " + std::to_string(queue_size));
173+
m_botbase->set_queue_limit(queue_size);
174+
}
175+
ControllerType SerialPABotBase_Connection::get_controller_type(
176+
const std::map<ControllerType, ControllerFeatures>& available_controllers
177+
){
178+
m_logger.log("Reading Controller Mode...");
209179
ControllerType current_controller = ControllerType::None;
210-
if (program_iter->second.size() == 1){
211-
current_controller = program_iter->second.begin()->first;
212-
}else if (program_iter->second.size() > 1){
180+
if (available_controllers.size() == 1){
181+
current_controller = available_controllers.begin()->first;
182+
}else if (available_controllers.size() > 1){
213183
uint32_t type_id = read_controller_mode(*m_botbase);
214184
current_controller = id_to_controller_type(type_id);
215185
}
216-
logger.log("Reading Controller Mode... Mode = " + CONTROLLER_TYPE_STRINGS.get_string(current_controller));
217-
218-
219-
if (change_controller && program_iter->second.size() > 1){
220-
ControllerType desired_controller = change_controller.value();
221-
switch (desired_controller){
222-
case ControllerType::NintendoSwitch_WiredProController:
223-
case ControllerType::NintendoSwitch_WirelessProController:
224-
case ControllerType::NintendoSwitch_LeftJoycon:
225-
case ControllerType::NintendoSwitch_RightJoycon:{
226-
NintendoSwitch::ControllerProfile profile =
227-
PokemonAutomation::NintendoSwitch::ConsoleSettings::instance().CONTROLLER_SETTINGS.get_or_make_profile(
228-
m_device_name,
229-
desired_controller
230-
);
231-
232-
PABB_NintendoSwitch_ControllerColors colors;
233-
{
234-
Color color(profile.body_color);
235-
colors.body[0] = color.red();
236-
colors.body[1] = color.green();
237-
colors.body[2] = color.blue();
238-
}
239-
{
240-
Color color(profile.button_color);
241-
colors.buttons[0] = color.red();
242-
colors.buttons[1] = color.green();
243-
colors.buttons[2] = color.blue();
244-
}
245-
{
246-
Color color(profile.left_grip);
247-
colors.left_grip[0] = color.red();
248-
colors.left_grip[1] = color.green();
249-
colors.left_grip[2] = color.blue();
250-
}
251-
{
252-
Color color(profile.right_grip);
253-
colors.right_grip[0] = color.red();
254-
colors.right_grip[1] = color.green();
255-
colors.right_grip[2] = color.blue();
256-
}
257-
258-
m_botbase->issue_request_and_wait(
259-
MessageControllerWriteSpi(
260-
desired_controller,
261-
0x00006050, sizeof(PABB_NintendoSwitch_ControllerColors),
262-
&colors
263-
),
264-
// MessageControllerSetColors(desired_controller, colors),
265-
nullptr
266-
);
267-
}
268-
default:;
269-
}
186+
m_logger.Logger::log("Reading Controller Mode... Mode = " + CONTROLLER_TYPE_STRINGS.get_string(current_controller));
187+
return current_controller;
188+
}
270189

271190

272-
uint32_t native_controller_id = controller_type_to_id(desired_controller);
273-
m_botbase->issue_request_and_wait(
274-
DeviceRequest_change_controller_mode(native_controller_id),
275-
nullptr
276-
);
277191

278-
// Re-read the controller.
279-
logger.log("Reading Controller Mode...");
280-
uint32_t type_id = read_controller_mode(*m_botbase);
281-
current_controller = id_to_controller_type(type_id);
282-
logger.log("Reading Controller Mode... Mode = " + CONTROLLER_TYPE_STRINGS.get_string(current_controller));
192+
ControllerModeStatus SerialPABotBase_Connection::read_device_specs(
193+
std::optional<ControllerType> change_controller
194+
){
195+
// Protocol
196+
{
197+
m_logger.Logger::log("Checking Protocol Version...");
198+
m_protocol = protocol_version(*m_botbase);
199+
m_logger.Logger::log("Checking Protocol Version... Protocol = " + std::to_string(m_protocol));
200+
}
201+
const std::map<uint32_t, std::map<ControllerType, ControllerFeatures>>& PROGRAMS =
202+
get_programs_for_protocol(m_protocol);
203+
204+
205+
// Program ID
206+
{
207+
m_logger.Logger::log("Checking Program ID...");
208+
m_program_id = program_id(*m_botbase);
209+
m_logger.Logger::log("Checking Program ID... Program ID = " + std::to_string(m_program_id));
283210
}
211+
const std::map<ControllerType, ControllerFeatures>& CONTROLLERS =
212+
get_controllers_for_program(PROGRAMS, m_program_id);
284213

285-
return {current_controller, program_iter->second};
214+
// Firmware Version
215+
{
216+
m_logger.Logger::log("Checking Firmware Version...");
217+
m_version = program_version(*m_botbase);
218+
m_logger.Logger::log("Checking Firmware Version... Version = " + std::to_string(m_version));
219+
}
220+
221+
// Queue Size
222+
process_queue_size();
223+
224+
// Controller Type
225+
ControllerType current_controller = get_controller_type(CONTROLLERS);
226+
227+
// Run any post-connection actions specific to this program.
228+
ControllerModeStatus ret{current_controller, CONTROLLERS};
229+
run_post_connect_actions(
230+
ret,
231+
m_program_id, m_device_name,
232+
*m_botbase,
233+
change_controller
234+
);
235+
return ret;
286236
}
287237

288238

0 commit comments

Comments
 (0)