Merge pull request #5332 from spycrab/wiimote_casts

Clean up Wiimote* code (comments, casts, underscore variable names)
This commit is contained in:
Léo Lam 2017-05-06 13:27:04 +02:00 committed by GitHub
commit a24ad85463
14 changed files with 91 additions and 178 deletions

View File

@ -74,9 +74,9 @@ ControllerEmu::ControlGroup* GetGuitarGroup(int number, WiimoteEmu::GuitarGroup
ControllerEmu::ControlGroup* GetDrumsGroup(int number, WiimoteEmu::DrumsGroup group); ControllerEmu::ControlGroup* GetDrumsGroup(int number, WiimoteEmu::DrumsGroup group);
ControllerEmu::ControlGroup* GetTurntableGroup(int number, WiimoteEmu::TurntableGroup group); ControllerEmu::ControlGroup* GetTurntableGroup(int number, WiimoteEmu::TurntableGroup group);
void ControlChannel(int _number, u16 _channelID, const void* _pData, u32 _Size); void ControlChannel(int number, u16 channel_id, const void* data, u32 size);
void InterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size); void InterruptChannel(int number, u16 channel_id, const void* data, u32 size);
void Update(int _number, bool _connected); void Update(int number, bool connected);
} }
namespace WiimoteReal namespace WiimoteReal

View File

@ -58,7 +58,7 @@ namespace ControllerEmu
{ {
void Extension::GetState(u8* const data) void Extension::GetState(u8* const data)
{ {
((WiimoteEmu::Attachment*)attachments[active_extension].get())->GetState(data); static_cast<WiimoteEmu::Attachment*>(attachments[active_extension].get())->GetState(data);
} }
bool Extension::IsButtonPressed() const bool Extension::IsButtonPressed() const
@ -69,9 +69,11 @@ bool Extension::IsButtonPressed() const
// Wiimotes (can? always?) have their active_extension set to -1, we also have to check the // Wiimotes (can? always?) have their active_extension set to -1, we also have to check the
// switch_extension // switch_extension
if (active_extension > 0) if (active_extension > 0)
return ((WiimoteEmu::Attachment*)attachments[active_extension].get())->IsButtonPressed(); return static_cast<WiimoteEmu::Attachment*>(attachments[active_extension].get())
->IsButtonPressed();
if (switch_extension > 0) if (switch_extension > 0)
return ((WiimoteEmu::Attachment*)attachments[switch_extension].get())->IsButtonPressed(); return static_cast<WiimoteEmu::Attachment*>(attachments[switch_extension].get())
->IsButtonPressed();
return false; return false;
} }
} // namespace ControllerEmu } // namespace ControllerEmu

View File

@ -89,7 +89,7 @@ Classic::Classic(ExtensionReg& reg) : Attachment(_trans("Classic"), reg)
void Classic::GetState(u8* const data) void Classic::GetState(u8* const data)
{ {
wm_classic_extension* const ccdata = (wm_classic_extension*)data; wm_classic_extension* const ccdata = reinterpret_cast<wm_classic_extension* const>(data);
ccdata->bt.hex = 0; ccdata->bt.hex = 0;
// not using calibration data, o well // not using calibration data, o well

View File

@ -55,7 +55,7 @@ Drums::Drums(ExtensionReg& reg) : Attachment(_trans("Drums"), reg)
void Drums::GetState(u8* const data) void Drums::GetState(u8* const data)
{ {
wm_drums_extension* const ddata = (wm_drums_extension*)data; wm_drums_extension* const ddata = reinterpret_cast<wm_drums_extension* const>(data);
ddata->bt = 0; ddata->bt = 0;
// calibration data not figured out yet? // calibration data not figured out yet?

View File

@ -69,7 +69,7 @@ Guitar::Guitar(ExtensionReg& reg) : Attachment(_trans("Guitar"), reg)
void Guitar::GetState(u8* const data) void Guitar::GetState(u8* const data)
{ {
wm_guitar_extension* const gdata = (wm_guitar_extension*)data; wm_guitar_extension* const gdata = reinterpret_cast<wm_guitar_extension* const>(data);
gdata->bt = 0; gdata->bt = 0;
// calibration data not figured out yet? // calibration data not figured out yet?

View File

@ -58,7 +58,7 @@ Nunchuk::Nunchuk(ExtensionReg& reg) : Attachment(_trans("Nunchuk"), reg)
void Nunchuk::GetState(u8* const data) void Nunchuk::GetState(u8* const data)
{ {
wm_nc* const ncdata = (wm_nc*)data; wm_nc* const ncdata = reinterpret_cast<wm_nc* const>(data);
ncdata->bt.hex = 0; ncdata->bt.hex = 0;
// stick // stick

View File

@ -63,7 +63,7 @@ Turntable::Turntable(ExtensionReg& reg) : Attachment(_trans("Turntable"), reg)
void Turntable::GetState(u8* const data) void Turntable::GetState(u8* const data)
{ {
wm_turntable_extension* const ttdata = (wm_turntable_extension*)data; wm_turntable_extension* const ttdata = reinterpret_cast<wm_turntable_extension*>(data);
ttdata->bt = 0; ttdata->bt = 0;
// stick // stick

View File

@ -92,7 +92,7 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
break; break;
case RT_REPORT_MODE: // 0x12 case RT_REPORT_MODE: // 0x12
ReportMode((wm_report_mode*)sr->data); ReportMode(reinterpret_cast<const wm_report_mode*>(sr->data));
break; break;
case RT_IR_PIXEL_CLOCK: // 0x13 case RT_IR_PIXEL_CLOCK: // 0x13
@ -112,35 +112,27 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
case RT_REQUEST_STATUS: // 0x15 case RT_REQUEST_STATUS: // 0x15
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index]) if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index])
RequestStatus((wm_request_status*)sr->data); RequestStatus(reinterpret_cast<const wm_request_status*>(sr->data));
return; // sends its own ack return; // sends its own ack
break; break;
case RT_WRITE_DATA: // 0x16 case RT_WRITE_DATA: // 0x16
WriteData((wm_write_data*)sr->data); WriteData(reinterpret_cast<const wm_write_data*>(sr->data));
break; break;
case RT_READ_DATA: // 0x17 case RT_READ_DATA: // 0x17
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index]) if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index])
ReadData((wm_read_data*)sr->data); ReadData(reinterpret_cast<const wm_read_data*>(sr->data));
return; // sends its own ack return; // sends its own ack
break; break;
case RT_WRITE_SPEAKER_DATA: // 0x18 case RT_WRITE_SPEAKER_DATA: // 0x18
// wm_speaker_data *spkz = (wm_speaker_data*)sr->data;
// ERROR_LOG(WIIMOTE, "RT_WRITE_SPEAKER_DATA len:%x %s", spkz->length,
// ArrayToString(spkz->data, spkz->length, 100, false).c_str());
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index] && !m_speaker_mute) if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index] && !m_speaker_mute)
Wiimote::SpeakerData((wm_speaker_data*)sr->data); Wiimote::SpeakerData(reinterpret_cast<const wm_speaker_data*>(sr->data));
return; // no ack return; // no ack
break; break;
case RT_SPEAKER_MUTE: // 0x19 case RT_SPEAKER_MUTE: // 0x19
// ERROR_LOG(WIIMOTE, "WM Speaker Mute: %02x", sr->enable);
// PanicAlert( "WM Speaker Mute: %d", sr->data[0] & 0x04 );
// testing
// if (sr->data[0] & 0x04)
// memset(&m_channel_status, 0, sizeof(m_channel_status));
m_speaker_mute = sr->enable; m_speaker_mute = sr->enable;
if (false == sr->ack) if (false == sr->ack)
return; return;
@ -150,7 +142,6 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
// comment from old plugin: // comment from old plugin:
// This enables or disables the IR lights, we update the global variable g_IR // This enables or disables the IR lights, we update the global variable g_IR
// so that WmRequestStatus() knows about it // so that WmRequestStatus() knows about it
// INFO_LOG(WIIMOTE, "WM IR Enable: 0x%02x", sr->data[0]);
m_status.ir = sr->enable; m_status.ir = sr->enable;
if (false == sr->ack) if (false == sr->ack)
return; return;
@ -172,17 +163,17 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
The first two bytes are the core buttons data, The first two bytes are the core buttons data,
00 00 means nothing is pressed. 00 00 means nothing is pressed.
The last byte is the success code 00. */ The last byte is the success code 00. */
void Wiimote::SendAck(u8 _reportID) void Wiimote::SendAck(u8 report_id)
{ {
u8 data[6]; u8 data[6];
data[0] = 0xA1; data[0] = 0xA1;
data[1] = RT_ACK_DATA; data[1] = RT_ACK_DATA;
wm_acknowledge* const ack = (wm_acknowledge*)(data + 2); wm_acknowledge* ack = reinterpret_cast<wm_acknowledge*>(data + 2);
ack->buttons = m_status.buttons; ack->buttons = m_status.buttons;
ack->reportID = _reportID; ack->reportID = report_id;
ack->errorID = 0; ack->errorID = 0;
Core::Callback_WiimoteInterruptChannel(m_index, m_reporting_channel, data, sizeof(data)); Core::Callback_WiimoteInterruptChannel(m_index, m_reporting_channel, data, sizeof(data));
@ -208,11 +199,6 @@ void Wiimote::HandleExtensionSwap()
} }
} }
// old comment
/* Here we produce a 0x20 status report to send to the Wii. We currently ignore
the status request rs and all its eventual instructions it may include (for
example turn off rumble or something else) and just send the status
report. */
void Wiimote::RequestStatus(const wm_request_status* const rs) void Wiimote::RequestStatus(const wm_request_status* const rs)
{ {
HandleExtensionSwap(); HandleExtensionSwap();
@ -226,7 +212,7 @@ void Wiimote::RequestStatus(const wm_request_status* const rs)
data[1] = RT_STATUS_REPORT; data[1] = RT_STATUS_REPORT;
// status values // status values
*(wm_status_report*)(data + 2) = m_status; *reinterpret_cast<wm_status_report*>(data + 2) = m_status;
// hybrid Wiimote stuff // hybrid Wiimote stuff
if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index] && (m_extension->switch_extension <= 0)) if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index] && (m_extension->switch_extension <= 0))
@ -277,10 +263,9 @@ void Wiimote::WriteData(const wm_write_data* const wd)
memcpy(m_eeprom + address, wd->data, wd->size); memcpy(m_eeprom + address, wd->data, wd->size);
// write mii data to file // write mii data to file
// i need to improve this greatly
if (address >= 0x0FCA && address < 0x12C0) if (address >= 0x0FCA && address < 0x12C0)
{ {
// writing the whole mii block each write :/ // TODO Only write parts of the Mii block
std::ofstream file; std::ofstream file;
OpenFStream(file, File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/mii.bin", OpenFStream(file, File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/mii.bin",
std::ios::binary | std::ios::out); std::ios::binary | std::ios::out);
@ -330,9 +315,6 @@ void Wiimote::WriteData(const wm_write_data* const wd)
case 0xB0: case 0xB0:
region_ptr = &m_reg_ir; region_ptr = &m_reg_ir;
region_size = WIIMOTE_REG_IR_SIZE; region_size = WIIMOTE_REG_IR_SIZE;
// if (5 == m_reg_ir->mode)
// PanicAlert("IR Full Mode is Unsupported!");
break; break;
} }
@ -343,14 +325,6 @@ void Wiimote::WriteData(const wm_write_data* const wd)
else else
return; // TODO: generate a writedata error reply return; // TODO: generate a writedata error reply
/* TODO?
if (region_ptr == &m_reg_speaker)
{
ERROR_LOG(WIIMOTE, "Write to speaker register %x %s", address,
ArrayToString(wd->data, wd->size, 100, false).c_str());
}
*/
if (&m_reg_ext == region_ptr) if (&m_reg_ext == region_ptr)
{ {
// Run the key generation on all writes in the key area, it doesn't matter // Run the key generation on all writes in the key area, it doesn't matter
@ -407,7 +381,6 @@ void Wiimote::ReadData(const wm_read_data* const rd)
{ {
case WS_EEPROM: case WS_EEPROM:
{ {
// PanicAlert("ReadData: reading from EEPROM: address: 0x%x size: 0x%x", address, size);
// Read from EEPROM // Read from EEPROM
if (address + size >= WIIMOTE_EEPROM_FREE_SIZE) if (address + size >= WIIMOTE_EEPROM_FREE_SIZE)
{ {
@ -422,10 +395,9 @@ void Wiimote::ReadData(const wm_read_data* const rd)
} }
// read mii data from file // read mii data from file
// i need to improve this greatly
if (address >= 0x0FCA && address < 0x12C0) if (address >= 0x0FCA && address < 0x12C0)
{ {
// reading the whole mii block :/ // TODO Only read the Mii block parts required
std::ifstream file; std::ifstream file;
file.open((File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/mii.bin").c_str(), file.open((File::GetUserPath(D_SESSION_WIIROOT_IDX) + "/mii.bin").c_str(),
std::ios::binary | std::ios::in); std::ios::binary | std::ios::in);
@ -521,23 +493,15 @@ void Wiimote::ReadData(const wm_read_data* const rd)
delete[] rr.data; delete[] rr.data;
} }
// old comment void Wiimote::SendReadDataReply(ReadRequest& request)
/* Here we produce the actual 0x21 Input report that we send to the Wii. The
message is divided into 16 bytes pieces and sent piece by piece. There will
be five formatting bytes at the begging of all reports. A common format is
00 00 f0 00 20, the 00 00 means that no buttons are pressed, the f means 16
bytes in the message, the 0 means no error, the 00 20 means that the message
is at the 00 20 offest in the registry that was read.
*/
void Wiimote::SendReadDataReply(ReadRequest& _request)
{ {
u8 data[23]; u8 data[23];
data[0] = 0xA1; data[0] = 0xA1;
data[1] = RT_READ_DATA_REPLY; data[1] = RT_READ_DATA_REPLY;
wm_read_data_reply* const reply = (wm_read_data_reply*)(data + 2); wm_read_data_reply* const reply = reinterpret_cast<wm_read_data_reply*>(data + 2);
reply->buttons = m_status.buttons; reply->buttons = m_status.buttons;
reply->address = Common::swap16(_request.address); reply->address = Common::swap16(request.address);
// generate a read error // generate a read error
// Out of bounds. The real Wiimote generate an error for the first // Out of bounds. The real Wiimote generate an error for the first
@ -545,7 +509,7 @@ void Wiimote::SendReadDataReply(ReadRequest& _request)
// read the calibration data at the beginning of Eeprom. I think this // read the calibration data at the beginning of Eeprom. I think this
// error is supposed to occur when we try to read above the freely // error is supposed to occur when we try to read above the freely
// usable space that ends at 0x16ff. // usable space that ends at 0x16ff.
if (0 == _request.size) if (0 == request.size)
{ {
reply->size = 0x0f; reply->size = 0x0f;
reply->error = 0x08; reply->error = 0x08;
@ -556,7 +520,7 @@ void Wiimote::SendReadDataReply(ReadRequest& _request)
{ {
// Limit the amt to 16 bytes // Limit the amt to 16 bytes
// AyuanX: the MTU is 640B though... what a waste! // AyuanX: the MTU is 640B though... what a waste!
const int amt = std::min((unsigned int)16, _request.size); const int amt = std::min((unsigned int)16, request.size);
// no error // no error
reply->error = 0; reply->error = 0;
@ -568,12 +532,12 @@ void Wiimote::SendReadDataReply(ReadRequest& _request)
memset(reply->data, 0, sizeof(reply->data)); memset(reply->data, 0, sizeof(reply->data));
// copy piece of mem // copy piece of mem
memcpy(reply->data, _request.data + _request.position, amt); memcpy(reply->data, request.data + request.position, amt);
// update request struct // update request struct
_request.size -= amt; request.size -= amt;
_request.position += amt; request.position += amt;
_request.address += amt; request.address += amt;
} }
// Send a piece // Send a piece

View File

@ -253,11 +253,6 @@ void WiimoteGenerateKey(wiimote_key* const key, const u8* const keydata)
for (int i = 0; i < 6; ++i) for (int i = 0; i < 6; ++i)
skey[5 - i] = keydata[i + 10]; skey[5 - i] = keydata[i + 10];
// DEBUG_LOG(WIIMOTE, "rand: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", rand[0], rand[1],
// rand[2], rand[3], rand[4], rand[5], rand[6], rand[7], rand[8], rand[9]);
// DEBUG_LOG(WIIMOTE, "key: %02x %02x %02x %02x %02x %02x", skey[0], skey[1], skey[2], skey[3],
// skey[4], skey[5]);
for (idx = 0; idx < 7; ++idx) for (idx = 0; idx < 7; ++idx)
{ {
GenerateKey(rand, idx, testkey); GenerateKey(rand, idx, testkey);
@ -265,15 +260,9 @@ void WiimoteGenerateKey(wiimote_key* const key, const u8* const keydata)
break; break;
} }
// default case is idx = 7 which is valid (homebrew uses it for the 0x17 case) // default case is idx = 7 which is valid (homebrew uses it for the 0x17 case)
// DEBUG_LOG(WIIMOTE, "idx: %d", idx);
GenerateTables(rand, skey, idx, key->ft, key->sb); GenerateTables(rand, skey, idx, key->ft, key->sb);
// DEBUG_LOG(WIIMOTE, "ft: %02x %02x %02x %02x %02x %02x %02x %02x", key->ft[0], key->ft[1],
// key->ft[2], key->ft[3], key->ft[4], key->ft[5], key->ft[6], key->ft[7]);
// DEBUG_LOG(WIIMOTE, "sb: %02x %02x %02x %02x %02x %02x %02x %02x", key->sb[0], key->sb[1],
// key->sb[2], key->sb[3], key->sb[4], key->sb[5], key->sb[6], key->sb[7]);
// for homebrew, ft and sb are all 0x97 which is equivalent to 0x17 // for homebrew, ft and sb are all 0x97 which is equivalent to 0x17
} }

View File

@ -68,7 +68,7 @@ void stopdamnwav()
} }
#endif #endif
void Wiimote::SpeakerData(wm_speaker_data* sd) void Wiimote::SpeakerData(const wm_speaker_data* sd)
{ {
if (!SConfig::GetInstance().m_WiimoteEnableSpeaker) if (!SConfig::GetInstance().m_WiimoteEnableSpeaker)
return; return;
@ -145,7 +145,7 @@ void Wiimote::SpeakerData(wm_speaker_data* sd)
File::Delete("rmtdump.bin"); File::Delete("rmtdump.bin");
atexit(stopdamnwav); atexit(stopdamnwav);
OpenFStream(ofile, "rmtdump.bin", ofile.binary | ofile.out); OpenFStream(ofile, "rmtdump.bin", ofile.binary | ofile.out);
wav.Start("rmtdump.wav", 6000 /*Common::swap16(m_reg_speaker.sample_rate)*/); wav.Start("rmtdump.wav", 6000);
} }
wav.AddMonoSamples(samples.get(), sd->length * 2); wav.AddMonoSamples(samples.get(), sd->length * 2);
if (ofile.good()) if (ofile.good())

View File

@ -393,7 +393,6 @@ ControllerEmu::ControlGroup* Wiimote::GetTurntableGroup(TurntableGroup group)
bool Wiimote::Step() bool Wiimote::Step()
{ {
// TODO: change this a bit
m_motion_plus_present = m_motion_plus_setting->GetValue(); m_motion_plus_present = m_motion_plus_setting->GetValue();
m_motor->control_ref->State(m_rumble_on); m_motor->control_ref->State(m_rumble_on);
@ -411,7 +410,6 @@ bool Wiimote::Step()
ReadRequest& rr = m_read_requests.front(); ReadRequest& rr = m_read_requests.front();
// send up to 16 bytes to the Wii // send up to 16 bytes to the Wii
SendReadDataReply(rr); SendReadDataReply(rr);
// SendReadDataReply(rr.channel, rr);
// if there is no more data, remove from queue // if there is no more data, remove from queue
if (0 == rr.size) if (0 == rr.size)
@ -464,7 +462,7 @@ void Wiimote::GetButtonData(u8* const data)
UpdateButtonsStatus(); UpdateButtonsStatus();
} }
((wm_buttons*)data)->hex |= m_status.buttons.hex; reinterpret_cast<wm_buttons*>(data)->hex |= m_status.buttons.hex;
} }
void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf) void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
@ -482,8 +480,8 @@ void Wiimote::GetAccelData(u8* const data, const ReportFeatures& rptf)
EmulateSwing(&m_accel, m_swing, is_sideways, is_upright); EmulateSwing(&m_accel, m_swing, is_sideways, is_upright);
EmulateShake(&m_accel, m_shake, m_shake_step); EmulateShake(&m_accel, m_shake, m_shake_step);
wm_accel& accel = *(wm_accel*)(data + rptf.accel); wm_accel& accel = *reinterpret_cast<wm_accel*>(data + rptf.accel);
wm_buttons& core = *(wm_buttons*)(data + rptf.core); wm_buttons& core = *reinterpret_cast<wm_buttons*>(data + rptf.core);
// We now use 2 bits more precision, so multiply by 4 before converting to int // We now use 2 bits more precision, so multiply by 4 before converting to int
s16 x = (s16)(4 * (m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G)); s16 x = (s16)(4 * (m_accel.x * ACCEL_RANGE + ACCEL_ZERO_G));
@ -538,14 +536,11 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
nsin = 0; nsin = 0;
ncos = 1; ncos = 1;
} }
// PanicAlert("%d %d %d\nx:%f\nz:%f\nsin:%f\ncos:%f",accel->x,accel->y,accel->z,ax,az,sin,cos);
// PanicAlert("%d %d %d\n%d %d %d\n%d %d
// %d",accel->x,accel->y,accel->z,calib->zero_g.x,calib->zero_g.y,calib->zero_g.z,
// calib->one_g.x,calib->one_g.y,calib->one_g.z);
} }
else else
{ {
nsin = 0; // m_tilt stuff here (can't figure it out yet....) // TODO m_tilt stuff
nsin = 0;
ncos = 1; ncos = 1;
} }
@ -587,9 +582,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
Matrix rot, tot; Matrix rot, tot;
static Matrix scale; static Matrix scale;
MatrixScale(scale, 1, camWidth / camHeight, 1); MatrixScale(scale, 1, camWidth / camHeight, 1);
// MatrixIdentity(scale);
MatrixRotationByZ(rot, ir_sin, ir_cos); MatrixRotationByZ(rot, ir_sin, ir_cos);
// MatrixIdentity(rot);
MatrixMultiply(tot, scale, rot); MatrixMultiply(tot, scale, rot);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
@ -600,10 +593,6 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
x[i] = (u16)lround((v[i].x + 1) / 2 * (camWidth - 1)); x[i] = (u16)lround((v[i].x + 1) / 2 * (camWidth - 1));
y[i] = (u16)lround((v[i].y + 1) / 2 * (camHeight - 1)); y[i] = (u16)lround((v[i].y + 1) / 2 * (camHeight - 1));
} }
// PanicAlert("%f %f\n%f %f\n%f %f\n%f %f\n%d %d\n%d %d\n%d %d\n%d %d",
// v[0].x,v[0].y,v[1].x,v[1].y,v[2].x,v[2].y,v[3].x,v[3].y,
// x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[38]);
// Fill report with valid data when full handshake was done // Fill report with valid data when full handshake was done
if (m_reg_ir.data[0x30]) if (m_reg_ir.data[0x30])
// ir mode // ir mode
@ -613,7 +602,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
case 1: case 1:
{ {
memset(data, 0xFF, 10); memset(data, 0xFF, 10);
wm_ir_basic* const irdata = (wm_ir_basic*)data; wm_ir_basic* const irdata = reinterpret_cast<wm_ir_basic*>(data);
for (unsigned int i = 0; i < 2; ++i) for (unsigned int i = 0; i < 2; ++i)
{ {
if (x[i * 2] < 1024 && y[i * 2] < 768) if (x[i * 2] < 1024 && y[i * 2] < 768)
@ -639,7 +628,7 @@ void Wiimote::GetIRData(u8* const data, bool use_accel)
case 3: case 3:
{ {
memset(data, 0xFF, 12); memset(data, 0xFF, 12);
wm_ir_extended* const irdata = (wm_ir_extended*)data; wm_ir_extended* const irdata = reinterpret_cast<wm_ir_extended*>(data);
for (unsigned int i = 0; i < 4; ++i) for (unsigned int i = 0; i < 4; ++i)
if (x[i] < 1024 && y[i] < 768) if (x[i] < 1024 && y[i] < 768)
{ {
@ -670,41 +659,11 @@ void Wiimote::GetExtData(u8* const data)
// i think it should be unencrpyted in the register, encrypted when read. // i think it should be unencrpyted in the register, encrypted when read.
memcpy(m_reg_ext.controller_data, data, sizeof(wm_nc)); // TODO: Should it be nc specific? memcpy(m_reg_ext.controller_data, data, sizeof(wm_nc)); // TODO: Should it be nc specific?
// motionplus pass-through modes
if (m_motion_plus_active) if (m_motion_plus_active)
{ {
switch (m_reg_motion_plus.ext_identifier[0x4]) reinterpret_cast<wm_motionplus_data*>(data)->is_mp_data = 0;
{ reinterpret_cast<wm_motionplus_data*>(data)->extension_connected =
// nunchuk pass-through mode m_extension->active_extension;
// Bit 7 of byte 5 is moved to bit 6 of byte 5, overwriting it
// Bit 0 of byte 4 is moved to bit 7 of byte 5
// Bit 3 of byte 5 is moved to bit 4 of byte 5, overwriting it
// Bit 1 of byte 5 is moved to bit 3 of byte 5
// Bit 0 of byte 5 is moved to bit 2 of byte 5, overwriting it
case 0x5:
// data[5] & (1 << 7)
// data[4] & (1 << 0)
// data[5] & (1 << 3)
// data[5] & (1 << 1)
// data[5] & (1 << 0)
break;
// classic controller/musical instrument pass-through mode
// Bit 0 of Byte 4 is overwritten
// Bits 0 and 1 of Byte 5 are moved to bit 0 of Bytes 0 and 1, overwriting
case 0x7:
// data[4] & (1 << 0)
// data[5] & (1 << 0)
// data[5] & (1 << 1)
break;
// unknown pass-through mode
default:
break;
}
((wm_motionplus_data*)data)->is_mp_data = 0;
((wm_motionplus_data*)data)->extension_connected = m_extension->active_extension;
} }
if (0xAA == m_reg_ext.encryption) if (0xAA == m_reg_ext.encryption)
@ -737,7 +696,7 @@ void Wiimote::Update()
Movie::PlayWiimote(m_index, data, rptf, m_extension->active_extension, m_ext_key)) Movie::PlayWiimote(m_index, data, rptf, m_extension->active_extension, m_ext_key))
{ {
if (rptf.core) if (rptf.core)
m_status.buttons = *(wm_buttons*)(data + rptf.core); m_status.buttons = *reinterpret_cast<wm_buttons*>(data + rptf.core);
} }
else else
{ {
@ -773,10 +732,10 @@ void Wiimote::Update()
std::lock_guard<std::mutex> lk(g_wiimotes_mutex); std::lock_guard<std::mutex> lk(g_wiimotes_mutex);
if (g_wiimotes[m_index]) if (g_wiimotes[m_index])
{ {
const Report& rpt = g_wiimotes[m_index]->ProcessReadQueue(); Report& rpt = g_wiimotes[m_index]->ProcessReadQueue();
if (!rpt.empty()) if (!rpt.empty())
{ {
const u8* real_data = rpt.data(); u8* real_data = rpt.data();
switch (real_data[1]) switch (real_data[1])
{ {
// use data reports // use data reports
@ -794,8 +753,9 @@ void Wiimote::Update()
// mix real-buttons with emu-buttons in the status struct, and in the report // mix real-buttons with emu-buttons in the status struct, and in the report
if (real_rptf.core && rptf.core) if (real_rptf.core && rptf.core)
{ {
m_status.buttons.hex |= ((wm_buttons*)(real_data + real_rptf.core))->hex; m_status.buttons.hex |=
*(wm_buttons*)(data + rptf.core) = m_status.buttons; reinterpret_cast<wm_buttons*>(real_data + real_rptf.core)->hex;
*reinterpret_cast<wm_buttons*>(data + rptf.core) = m_status.buttons;
} }
// accel // accel
@ -821,10 +781,8 @@ void Wiimote::Update()
// use all status reports, after modification of the extension bit // use all status reports, after modification of the extension bit
case RT_STATUS_REPORT: case RT_STATUS_REPORT:
// if (m_extension->switch_extension)
//((wm_status_report*)(real_data + 2))->extension = (m_extension->active_extension > 0);
if (m_extension->active_extension) if (m_extension->active_extension)
((wm_status_report*)(real_data + 2))->extension = 1; reinterpret_cast<wm_status_report*>(real_data + 2)->extension = 1;
rptf_size = -1; rptf_size = -1;
break; break;
@ -850,7 +808,7 @@ void Wiimote::Update()
{ {
NetPlay_GetWiimoteData(m_index, data, rptf.size, m_reporting_mode); NetPlay_GetWiimoteData(m_index, data, rptf.size, m_reporting_mode);
if (rptf.core) if (rptf.core)
m_status.buttons = *(wm_buttons*)(data + rptf.core); m_status.buttons = *reinterpret_cast<wm_buttons*>(data + rptf.core);
} }
Movie::CheckWiimoteStatus(m_index, data, rptf, m_extension->active_extension, m_ext_key); Movie::CheckWiimoteStatus(m_index, data, rptf, m_extension->active_extension, m_ext_key);
@ -866,23 +824,23 @@ void Wiimote::Update()
} }
} }
void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size) void Wiimote::ControlChannel(const u16 channel_id, const void* data, u32 size)
{ {
// Check for custom communication // Check for custom communication
if (99 == _channelID) if (99 == channel_id)
{ {
// Wii Remote disconnected // Wii Remote disconnected
// reset eeprom/register/reporting mode // reset eeprom/register/reporting mode
Reset(); Reset();
if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index]) if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index])
WiimoteReal::ControlChannel(m_index, _channelID, _pData, _Size); WiimoteReal::ControlChannel(m_index, channel_id, data, size);
return; return;
} }
// this all good? // this all good?
m_reporting_channel = _channelID; m_reporting_channel = channel_id;
const hid_packet* const hidp = (hid_packet*)_pData; const hid_packet* hidp = reinterpret_cast<const hid_packet*>(data);
DEBUG_LOG(WIIMOTE, "Emu ControlChannel (page: %i, type: 0x%02x, param: 0x%02x)", m_index, DEBUG_LOG(WIIMOTE, "Emu ControlChannel (page: %i, type: 0x%02x, param: 0x%02x)", m_index,
hidp->type, hidp->param); hidp->type, hidp->param);
@ -902,10 +860,10 @@ void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size
{ {
// AyuanX: My experiment shows Control Channel is never used // AyuanX: My experiment shows Control Channel is never used
// shuffle2: but lwbt uses this, so we'll do what we must :) // shuffle2: but lwbt uses this, so we'll do what we must :)
HidOutputReport((wm_report*)hidp->data); HidOutputReport(reinterpret_cast<const wm_report*>(hidp->data));
u8 handshake = HID_HANDSHAKE_SUCCESS; u8 handshake = HID_HANDSHAKE_SUCCESS;
Core::Callback_WiimoteInterruptChannel(m_index, _channelID, &handshake, 1); Core::Callback_WiimoteInterruptChannel(m_index, channel_id, &handshake, 1);
} }
break; break;
@ -919,12 +877,12 @@ void Wiimote::ControlChannel(const u16 _channelID, const void* _pData, u32 _Size
} }
} }
void Wiimote::InterruptChannel(const u16 _channelID, const void* _pData, u32 _Size) void Wiimote::InterruptChannel(const u16 channel_id, const void* data, u32 size)
{ {
// this all good? // this all good?
m_reporting_channel = _channelID; m_reporting_channel = channel_id;
const hid_packet* const hidp = (hid_packet*)_pData; const hid_packet* hidp = reinterpret_cast<const hid_packet*>(data);
switch (hidp->type) switch (hidp->type)
{ {
@ -933,7 +891,7 @@ void Wiimote::InterruptChannel(const u16 _channelID, const void* _pData, u32 _Si
{ {
case HID_PARAM_OUTPUT: case HID_PARAM_OUTPUT:
{ {
const wm_report* const sr = (wm_report*)hidp->data; const wm_report* sr = reinterpret_cast<const wm_report*>(hidp->data);
if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index]) if (WIIMOTE_SRC_REAL & g_wiimote_sources[m_index])
{ {
@ -943,11 +901,11 @@ void Wiimote::InterruptChannel(const u16 _channelID, const void* _pData, u32 _Si
case RT_REQUEST_STATUS: case RT_REQUEST_STATUS:
case RT_READ_DATA: case RT_READ_DATA:
if (WIIMOTE_SRC_REAL == g_wiimote_sources[m_index]) if (WIIMOTE_SRC_REAL == g_wiimote_sources[m_index])
WiimoteReal::InterruptChannel(m_index, _channelID, _pData, _Size); WiimoteReal::InterruptChannel(m_index, channel_id, data, size);
break; break;
default: default:
WiimoteReal::InterruptChannel(m_index, _channelID, _pData, _Size); WiimoteReal::InterruptChannel(m_index, channel_id, data, size);
break; break;
} }

View File

@ -198,8 +198,8 @@ public:
ControllerEmu::ControlGroup* GetTurntableGroup(TurntableGroup group); ControllerEmu::ControlGroup* GetTurntableGroup(TurntableGroup group);
void Update(); void Update();
void InterruptChannel(const u16 _channelID, const void* _pData, u32 _Size); void InterruptChannel(const u16 channel_id, const void* data, u32 size);
void ControlChannel(const u16 _channelID, const void* _pData, u32 _Size); void ControlChannel(const u16 channel_id, const void* data, u32 size);
void ConnectOnInput(); void ConnectOnInput();
void Reset(); void Reset();
@ -233,12 +233,12 @@ private:
}; };
void ReportMode(const wm_report_mode* const dr); void ReportMode(const wm_report_mode* const dr);
void SendAck(const u8 _reportID); void SendAck(const u8 report_id);
void RequestStatus(const wm_request_status* const rs = nullptr); void RequestStatus(const wm_request_status* const rs = nullptr);
void ReadData(const wm_read_data* const rd); void ReadData(const wm_read_data* const rd);
void WriteData(const wm_write_data* const wd); void WriteData(const wm_write_data* const wd);
void SendReadDataReply(ReadRequest& _request); void SendReadDataReply(ReadRequest& request);
void SpeakerData(wm_speaker_data* sd); void SpeakerData(const wm_speaker_data* sd);
bool NetPlay_GetWiimoteData(int wiimote, u8* data, u8 size, u8 reporting_mode); bool NetPlay_GetWiimoteData(int wiimote, u8* data, u8 size, u8 reporting_mode);
// control groups // control groups

View File

@ -81,14 +81,14 @@ void Wiimote::WriteReport(Report rpt)
} }
// to be called from CPU thread // to be called from CPU thread
void Wiimote::QueueReport(u8 rpt_id, const void* _data, unsigned int size) void Wiimote::QueueReport(u8 rpt_id, const void* data, unsigned int size)
{ {
auto const data = static_cast<const u8*>(_data); auto const queue_data = static_cast<const u8*>(data);
Report rpt(size + 2); Report rpt(size + 2);
rpt[0] = WR_SET_REPORT | BT_OUTPUT; rpt[0] = WR_SET_REPORT | BT_OUTPUT;
rpt[1] = rpt_id; rpt[1] = rpt_id;
std::copy_n(data, size, rpt.begin() + 2); std::copy_n(queue_data, size, rpt.begin() + 2);
WriteReport(std::move(rpt)); WriteReport(std::move(rpt));
} }
@ -142,7 +142,7 @@ void Wiimote::ControlChannel(const u16 channel, const void* const data, const u3
else else
{ {
InterruptChannel(channel, data, size); InterruptChannel(channel, data, size);
const hid_packet* const hidp = (hid_packet*)data; const hid_packet* const hidp = reinterpret_cast<const hid_packet* const>(data);
if (hidp->type == HID_TYPE_SET_REPORT) if (hidp->type == HID_TYPE_SET_REPORT)
{ {
u8 handshake_ok = HID_HANDSHAKE_SUCCESS; u8 handshake_ok = HID_HANDSHAKE_SUCCESS;
@ -151,7 +151,7 @@ void Wiimote::ControlChannel(const u16 channel, const void* const data, const u3
} }
} }
void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const u32 size) void Wiimote::InterruptChannel(const u16 channel, const void* const data, const u32 size)
{ {
// first interrupt/control channel sent // first interrupt/control channel sent
if (channel != m_channel) if (channel != m_channel)
@ -163,8 +163,8 @@ void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const
EmuStart(); EmuStart();
} }
auto const data = static_cast<const u8*>(_data); auto const report_data = static_cast<const u8*>(data);
Report rpt(data, data + size); Report rpt(report_data, report_data + size);
WiimoteEmu::Wiimote* const wm = WiimoteEmu::Wiimote* const wm =
static_cast<WiimoteEmu::Wiimote*>(::Wiimote::GetConfig()->GetController(m_index)); static_cast<WiimoteEmu::Wiimote*>(::Wiimote::GetConfig()->GetController(m_index));
@ -320,7 +320,7 @@ static bool IsDataReport(const Report& rpt)
} }
// Returns the next report that should be sent // Returns the next report that should be sent
const Report& Wiimote::ProcessReadQueue() Report& Wiimote::ProcessReadQueue()
{ {
// Pop through the queued reports // Pop through the queued reports
while (m_read_reports.Pop(m_last_input_report)) while (m_read_reports.Pop(m_last_input_report))
@ -692,7 +692,7 @@ void LoadSettings()
for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) for (unsigned int i = 0; i < MAX_WIIMOTES; ++i)
{ {
std::string secname("Wiimote"); std::string secname("Wiimote");
secname += (char)('1' + i); secname += static_cast<char>('1' + i);
IniFile::Section& sec = *inifile.GetOrCreateSection(secname); IniFile::Section& sec = *inifile.GetOrCreateSection(secname);
sec.Get("Source", &g_wiimote_sources[i], i ? WIIMOTE_SRC_NONE : WIIMOTE_SRC_EMU); sec.Get("Source", &g_wiimote_sources[i], i ? WIIMOTE_SRC_NONE : WIIMOTE_SRC_EMU);
@ -858,18 +858,18 @@ void Refresh()
g_wiimote_scanner.SetScanMode(WiimoteScanMode::SCAN_ONCE); g_wiimote_scanner.SetScanMode(WiimoteScanMode::SCAN_ONCE);
} }
void InterruptChannel(int _WiimoteNumber, u16 _channelID, const void* _pData, u32 _Size) void InterruptChannel(int wiimote_number, u16 channel_id, const void* data, u32 size)
{ {
std::lock_guard<std::mutex> lk(g_wiimotes_mutex); std::lock_guard<std::mutex> lk(g_wiimotes_mutex);
if (g_wiimotes[_WiimoteNumber]) if (g_wiimotes[wiimote_number])
g_wiimotes[_WiimoteNumber]->InterruptChannel(_channelID, _pData, _Size); g_wiimotes[wiimote_number]->InterruptChannel(channel_id, data, size);
} }
void ControlChannel(int _WiimoteNumber, u16 _channelID, const void* _pData, u32 _Size) void ControlChannel(int wiimote_number, u16 channel_id, const void* data, u32 size)
{ {
std::lock_guard<std::mutex> lk(g_wiimotes_mutex); std::lock_guard<std::mutex> lk(g_wiimotes_mutex);
if (g_wiimotes[_WiimoteNumber]) if (g_wiimotes[wiimote_number])
g_wiimotes[_WiimoteNumber]->ControlChannel(_channelID, _pData, _Size); g_wiimotes[wiimote_number]->ControlChannel(channel_id, data, size);
} }
// Read the Wiimote once // Read the Wiimote once

View File

@ -38,7 +38,7 @@ public:
void Update(); void Update();
void ConnectOnInput(); void ConnectOnInput();
const Report& ProcessReadQueue(); Report& ProcessReadQueue();
void Read(); void Read();
bool Write(); bool Write();
@ -156,10 +156,10 @@ extern std::mutex g_wiimotes_mutex;
extern WiimoteScanner g_wiimote_scanner; extern WiimoteScanner g_wiimote_scanner;
extern Wiimote* g_wiimotes[MAX_BBMOTES]; extern Wiimote* g_wiimotes[MAX_BBMOTES];
void InterruptChannel(int _WiimoteNumber, u16 _channelID, const void* _pData, u32 _Size); void InterruptChannel(int wiimote_number, u16 channel_id, const void* data, u32 size);
void ControlChannel(int _WiimoteNumber, u16 _channelID, const void* _pData, u32 _Size); void ControlChannel(int wiimote_number, u16 channel_id, const void* data, u32 size);
void Update(int _WiimoteNumber); void Update(int wiimote_number);
void ConnectOnInput(int _WiimoteNumber); void ConnectOnInput(int wiimote_number);
void StateChange(EMUSTATE_CHANGE newState); void StateChange(EMUSTATE_CHANGE newState);
void ChangeWiimoteSource(unsigned int index, int source); void ChangeWiimoteSource(unsigned int index, int source);