mouse_m908/include/m686/readers.cpp
2021-12-30 18:17:22 +01:00

122 lines
4.8 KiB
C++

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*/
#include "../rd_mouse.h"
//reader functions (get settings from mouse)
int mouse_m686::dump_settings( std::ostream& output ){
int ret = 0;
size_t rows = sizeof(_c_data_read) / sizeof(_c_data_read[0]);
uint8_t buffer_in[17];
for( size_t i = 0; i < rows; i++ ){
ret += libusb_control_transfer( _i_handle, 0x21, 0x09, 0x0308, 0x0001, _c_data_read[i], 17, 1000 );
ret += libusb_interrupt_transfer( _i_handle, 0x82, buffer_in, 17, NULL, 1000 );
for( size_t j = 0; j < 17; j++ )
output << std::hex << std::setw(2) << std::setfill('0') << (int)buffer_in[j] << " ";
output << "\n";
}
output << std::dec << std::setw(0) << std::setfill(' ');
return ret;
}
int mouse_m686::read_and_print_settings( std::ostream& output ){
int ret = 0;
// read settings
size_t rows = sizeof(_c_data_read) / sizeof(_c_data_read[0]);
uint8_t buffer_in[rows][17];
for( size_t i = 0; i < rows; i++ ){
ret += libusb_control_transfer( _i_handle, 0x21, 0x09, 0x0308, 0x0001, _c_data_read[i], 17, 1000 );
ret += libusb_interrupt_transfer( _i_handle, 0x82, buffer_in[i], 17, NULL, 1000 );
}
// decode and print the settings
output
<< "# Configuration created with mouse_m908 -R.\n"
<< "# This configuration can be send to the mouse with mouse_m908 -c.\n"
<< "# Note: this feature is incomplete for the m686.\n\n";
// battery level
output << "# Battery level: ";
if(buffer_in[68][6] <= 10)
output << (int)(buffer_in[68][6] * 10) << " %\n\n";
else
output << "unkown, please report as a bug (" << (int)buffer_in[68][6] << ")\n\n";
output
<< "# The m686 has two profiles that can be switched using the 'mode switch' button on the bottom of the mouse.\n"
<< "# Reading the settings can only be done for the active profile, therefore only profile1 is used in this config.\n"
<< "[profile1]\n\n";
output << "report_rate=";
switch(buffer_in[4][6]){
case 0x1: output << "1000\n"; break;
case 0x2: output << "500\n"; break;
case 0x4: output << "250\n"; break;
case 0x8: output << "125\n"; break;
default: output << "unknown\n"; break;
}
// DPI
output << "\n# DPI settings\n";
output << "# Currently active DPI level: " << (int)(buffer_in[2][6] + 1) << "\n";
std::string dpi = "";
_i_decode_dpi({buffer_in[5][8], buffer_in[5][9], buffer_in[5][11]}, dpi);
output << "dpi1=" << dpi << "\n";
_i_decode_dpi({buffer_in[5][12], buffer_in[5][13], buffer_in[5][15]}, dpi);
output << "dpi2=" << dpi << "\n";
_i_decode_dpi({buffer_in[6][6], buffer_in[6][7], buffer_in[6][9]}, dpi);
output << "dpi3=" << dpi << "\n";
_i_decode_dpi({buffer_in[6][10], buffer_in[6][11], buffer_in[6][13]}, dpi);
output << "dpi4=" << dpi << "\n";
_i_decode_dpi({buffer_in[6][14], buffer_in[6][15], buffer_in[7][7]}, dpi);
output << "dpi5=" << dpi << "\n";
// button mapping
output << "\n# Button mapping\n";
std::string mapping = "";
_i_decode_button_mapping({buffer_in[13][12], buffer_in[13][13], buffer_in[13][14], buffer_in[13][15]}, mapping);
output << "button_left=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[14][6], buffer_in[14][7], buffer_in[14][8], buffer_in[14][9]}, mapping);
output << "button_right=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[14][10], buffer_in[14][11], buffer_in[14][12], buffer_in[14][13]}, mapping);
output << "button_middle=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[15][8], buffer_in[15][9], buffer_in[15][10], buffer_in[15][11]}, mapping);
output << "button_side_1=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[16][14], buffer_in[16][15], buffer_in[17][6], buffer_in[17][7]}, mapping);
output << "button_side_2=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[15][12], buffer_in[15][13], buffer_in[15][14], buffer_in[15][15]}, mapping);
output << "button_side_3=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[17][12], buffer_in[17][13], buffer_in[17][14], buffer_in[17][15]}, mapping);
output << "button_dpi_up=" << mapping << "\n";
_i_decode_button_mapping({buffer_in[18][6], buffer_in[18][7], buffer_in[18][8], buffer_in[18][9]}, mapping);
output << "button_dpi_down=" << mapping << "\n";
return ret;
}
int mouse_m686::read_settings(){
// currently not implemented
return 1;
}