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
141107BotBaseController* 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