Add initial support for actual DPI values for the M711

This commit is contained in:
dokutan 2021-06-01 22:58:16 +02:00
parent 3db937dba3
commit 74d64a2dc4
4 changed files with 147 additions and 0 deletions

View file

@ -39,6 +39,106 @@ std::map< int, std::string > mouse_m711::_c_button_names = {
{ 6, "scroll_up" },
{ 7, "scroll_down" } };
// Mapping of real DPI values to bytecode
std::map< unsigned int, std::array<uint8_t, 2> > mouse_m711::_c_dpi_codes = {
{ 100, {0x2, 0x00} },
{ 200, {0x4, 0x00} },
{ 300, {0x6, 0x00} },
{ 400, {0x9, 0x00} },
{ 500, {0xb, 0x00} },
// copied from the M908
/*
{ 600, {0xd, 0x00} },
{ 700, {0xf, 0x00} },
{ 800, {0x12, 0x00} },
{ 900, {0x14, 0x00} },
{ 1000, {0x16, 0x00} },
{ 1100, {0x18, 0x00} },
{ 1200, {0x1b, 0x00} },
{ 1300, {0x1d, 0x00} },
{ 1400, {0x1f, 0x00} },
{ 1500, {0x21, 0x00} },
{ 1600, {0x24, 0x00} },
{ 1700, {0x26, 0x00} },
{ 1800, {0x28, 0x00} },
{ 1900, {0x2b, 0x00} },
{ 2000, {0x2d, 0x00} },
{ 2100, {0x2f, 0x00} },
{ 2200, {0x31, 0x00} },
{ 2300, {0x34, 0x00} },
{ 2400, {0x36, 0x00} },
{ 2500, {0x38, 0x00} },
{ 2600, {0x3a, 0x00} },
{ 2700, {0x3d, 0x00} },
{ 2800, {0x3f, 0x00} },
{ 2900, {0x41, 0x00} },
{ 3000, {0x43, 0x00} },
{ 3100, {0x46, 0x00} },
{ 3200, {0x48, 0x00} },
{ 3300, {0x4a, 0x00} },
{ 3400, {0x4d, 0x00} },
{ 3500, {0x4f, 0x00} },
{ 3600, {0x51, 0x00} },
{ 3700, {0x53, 0x00} },
{ 3800, {0x56, 0x00} },
{ 3900, {0x58, 0x00} },
{ 4000, {0x5a, 0x00} },
{ 4100, {0x5c, 0x00} },
{ 4200, {0x5f, 0x00} },
{ 4300, {0x61, 0x00} },
{ 4400, {0x63, 0x00} },
{ 4500, {0x66, 0x00} },
{ 4600, {0x68, 0x00} },
{ 4700, {0x6a, 0x00} },
{ 4800, {0x6c, 0x00} },
{ 4900, {0x6f, 0x00} },
{ 5000, {0x71, 0x00} },
{ 5100, {0x73, 0x00} },
{ 5200, {0x75, 0x00} },
{ 5300, {0x78, 0x00} },
{ 5400, {0x7a, 0x00} },
{ 5500, {0x7c, 0x00} },
{ 5600, {0x7f, 0x00} },
{ 5700, {0x81, 0x00} },
{ 5800, {0x83, 0x00} },
{ 5900, {0x85, 0x00} },
{ 6000, {0x87, 0x00} },
{ 6100, {0x8a, 0x00} },
{ 6200, {0x8c, 0x00} },
{ 6400, {0x48, 0x01} },
{ 6600, {0x4a, 0x01} },
{ 6800, {0x4d, 0x01} },
{ 7000, {0x4f, 0x01} },
{ 7200, {0x51, 0x01} },
{ 7400, {0x53, 0x01} },
{ 7600, {0x56, 0x01} },
{ 7800, {0x58, 0x01} },
{ 8000, {0x5a, 0x01} },
{ 8200, {0x5c, 0x01} },
{ 8400, {0x5f, 0x01} },
{ 8600, {0x61, 0x01} },
{ 8800, {0x63, 0x01} },
{ 9000, {0x66, 0x01} },
{ 9200, {0x68, 0x01} },
{ 9400, {0x6a, 0x01} },
{ 9600, {0x6c, 0x01} },
{ 9800, {0x6f, 0x01} },
{ 10000, {0x71, 0x01} },
{ 10200, {0x73, 0x01} },
{ 10400, {0x75, 0x01} },
{ 10600, {0x78, 0x01} },
{ 10800, {0x7a, 0x01} },
{ 11000, {0x7c, 0x01} },
{ 11200, {0x7f, 0x01} },
{ 11400, {0x81, 0x01} },
{ 11600, {0x83, 0x01} },
{ 11800, {0x85, 0x01} },
{ 12000, {0x87, 0x01} },
{ 12200, {0x8a, 0x01} },
{ 12400, {0x8c, 0x01} }*/
};
//usb data packets
uint8_t mouse_m711::_c_data_s_profile[6][16] = {
{0x02, 0xf3, 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},

View file

@ -156,3 +156,28 @@ int mouse_m711::print_settings( std::ostream& output ){
return 0;
}
int mouse_m711::_i_decode_dpi( std::array<uint8_t, 2>& dpi_bytes, std::string& dpi_string ){
// is dpi value known?
for( auto dpi_value : _c_dpi_codes ){
if( dpi_value.second[0] == dpi_bytes[0] && dpi_value.second[1] == dpi_bytes[1] ){
dpi_string = std::to_string( dpi_value.first );
return 0;
}
}
// unknown dpi value
std::stringstream conversion_stream;
conversion_stream << std::setfill('0') << std::hex;
conversion_stream << "0x";
conversion_stream << std::setw(2) << (int)dpi_bytes[0] << std::setw(2) << (int)dpi_bytes[1];
conversion_stream << std::setfill(' ') << std::setw(0) << std::dec;
dpi_string = conversion_stream.str();
return 0;
}

View file

@ -258,6 +258,9 @@ class mouse_m711 : public rd_mouse{
/// Names of the physical buttons
static std::map< int, std::string > _c_button_names;
/// Mapping of real DPI values to bytecode
static std::map< unsigned int, std::array<uint8_t, 2> > _c_dpi_codes;
/// The model name
static const std::string _c_name;
@ -307,6 +310,12 @@ class mouse_m711 : public rd_mouse{
static uint8_t _c_data_read_2[85][64];
/// Used to read the settings, part 3/3
static uint8_t _c_data_read_3[46][16];
/** Convert raw dpi bytes to a string representation (doesn't validate dpi value)
* This function overloads the implementation from rd_mouse and supports actual DPI values.
* \return 0 if no error
*/
static int _i_decode_dpi( std::array<uint8_t, 2>& dpi_bytes, std::string& dpi_string );
};
#endif

View file

@ -117,6 +117,19 @@ int mouse_m711::set_dpi( rd_profile profile, int level, std::string dpi ){
return 0;
}
// check format: 1234 (real DPI)
else if( std::regex_match( dpi, std::regex("[[:digit:]]+") ) ){
if( _c_dpi_codes.find( std::stoi(dpi) ) != _c_dpi_codes.end() ){
_s_dpi_levels[profile][level][0] = _c_dpi_codes.at( std::stoi(dpi) )[0];
_s_dpi_levels[profile][level][1] = _c_dpi_codes.at( std::stoi(dpi) )[1];
return 0;
}
}
return 1;
}